ZGlmZiAtLWdpdCBhLy5jbGFuZy1mb3JtYXQgYi8uY2xhbmctZm9ybWF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDA0YzEKLS0tIC9kZXYvbnVsbAorKysgYi8uY2xhbmctZm9ybWF0CkBAIC0wLDAgKzEsMTYgQEAKK0Jhc2VkT25TdHlsZTogQ2hyb21pdW0KK0FsaWduQWZ0ZXJPcGVuQnJhY2tldDogQWxpZ24KK0FsaWduQ29uc2VjdXRpdmVBc3NpZ25tZW50czogdHJ1ZQorQWxpZ25Db25zZWN1dGl2ZURlY2xhcmF0aW9uczogdHJ1ZQorQWxpZ25Db25zZWN1dGl2ZU1hY3JvczogdHJ1ZQorQWxpZ25Fc2NhcGVkTmV3bGluZXM6IHRydWUKKyMgQWxpZ25PcGVyYW5kczogQWxpZ24KK0FsaWduVHJhaWxpbmdDb21tZW50czogdHJ1ZQorQWx3YXlzQnJlYWtBZnRlclJldHVyblR5cGU6IEFsbERlZmluaXRpb25zCitCcmVha0JlZm9yZUJyYWNlczogQWxsbWFuCitDb2x1bW5MaW1pdDogODAKK0Rlcml2ZVBvaW50ZXJBbGlnbm1lbnQ6IGZhbHNlCitJbmRlbnRDYXNlTGFiZWxzOiBmYWxzZQorUG9pbnRlckFsaWdubWVudDogTGVmdAorU3BhY2VCZWZvcmVQYXJlbnM6IENvbnRyb2xTdGF0ZW1lbnRzCitTcGFjZXNJblBhcmVudGhlc2VzOiB0cnVlCmRpZmYgLS1naXQgYS8ubWFpbG1hcCBiLy5tYWlsbWFwCmluZGV4IGM0MDZlMjMuLjUyZDA1MDYgMTAwNjQ0Ci0tLSBhLy5tYWlsbWFwCisrKyBiLy5tYWlsbWFwCkBAIC03LDMgKzcsNCBAQAogU3V6dWtpLCBUb3NoaXlhICjpiLTmnKjkv4rlk4kpIDxtcHN1enVraUBoaXJvc2hpbWEtdS5hYy5qcD4gc3V6dWtpIHRvc2hpeWEgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgogQmVuIFdhZ25lciA8YnVuZ2VtYW5AZ21haWwuY29tPiBCdW5nZW1hbiA8YnVuZ2VtYW5AZ21haWwuY29tPgogRXdhbGQgSGV3IChIZXcgWWloIFNoaXVhbiDkuJjmr4XlrqMpIDxld2FsZGhld0BnbWFpbC5jb20+CitOaWtoaWwgUmFtYWtyaXNobmFuICjgpKjgpL/gpJbgpL/gpLIg4KSw4KS+4KSu4KSV4KWD4KS34KWN4KSj4KSoKSA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CmRpZmYgLS1naXQgYS9CVUlMRC5nbiBiL0JVSUxELmduCmluZGV4IGNiZGUyMjIuLjM0ZGVlYjggMTAwNjQ0Ci0tLSBhL0JVSUxELmduCisrKyBiL0JVSUxELmduCkBAIC0zNSw2ICszNSw3IEBACiAgICAgICAiLVduby1jb252ZXJzaW9uIiwKICAgICAgICItV25vLXVudXNlZC1mdW5jdGlvbiIsCiAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAorICAgICAgIi1Xbm8tbWFjcm8tcmVkZWZpbmVkIiwKICAgICBdCiAgIH0KIH0KQEAgLTYzLDYgKzY0LDcgQEAKICAgICAgICJzcmMvYmFzZS9mdGJib3guYyIsCiAgICAgICAic3JjL2Jhc2UvZnRiZGYuYyIsCiAgICAgICAic3JjL2Jhc2UvZnRiaXRtYXAuYyIsCisgICAgICAic3JjL2Jhc2UvZnRkZWJ1Zy5jIiwKICAgICAgICJzcmMvYmFzZS9mdGZzdHlwZS5jIiwKICAgICAgICJzcmMvYmFzZS9mdGdhc3AuYyIsCiAgICAgICAic3JjL2Jhc2UvZnRnbHlwaC5jIiwKZGlmZiAtLWdpdCBhL0NNYWtlTGlzdHMudHh0IGIvQ01ha2VMaXN0cy50eHQKaW5kZXggYWQ4ZGVkMC4uM2VkNTVhYSAxMDA2NDQKLS0tIGEvQ01ha2VMaXN0cy50eHQKKysrIGIvQ01ha2VMaXN0cy50eHQKQEAgLTEsNiArMSw2IEBACiAjIENNYWtlTGlzdHMudHh0CiAjCi0jIENvcHlyaWdodCAyMDEzLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBXcml0dGVuIG9yaWdpbmFsbHkgYnkgSm9obiBDYXJ5IDxjYXJ5QHR4Y29ycC5jb20+CkBAIC0xNCwxNCArMTQsMTQgQEAKICMKICMgVGhlIGZvbGxvd2luZyB3aWxsIDEuIGNyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeSBhbmQgMi4gY2hhbmdlIGludG8gaXQgYW5kCiAjIGNhbGwgY21ha2UgdG8gY29uZmlndXJlIHRoZSBidWlsZCB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyBhcyBhIHN0YXRpYwotIyBsaWJyYXJ5LgorIyBsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9jbWFrZS5vcmcvY21ha2UvaGVscC9sYXRlc3QvdmFyaWFibGUvQ01BS0VfQlVJTERfVFlQRS5odG1sCisjIGZvciBpbmZvcm1hdGlvbiBhYm91dCBEZWJ1ZywgUmVsZWFzZSwgZXRjLiBidWlsZHMuCiAjCi0jICAgY21ha2UgLUUgbWFrZV9kaXJlY3RvcnkgYnVpbGQKLSMgICBjbWFrZSAtRSBjaGRpciBidWlsZCBjbWFrZSAuLgorIyAgIGNtYWtlIC1CIGJ1aWxkIC1EIENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZQogIwogIyBGb3IgYSBkeW5hbWljIGxpYnJhcnksIHVzZQogIwotIyAgIGNtYWtlIC1FIGNoZGlyIGJ1aWxkIGNtYWtlIC1EIEJVSUxEX1NIQVJFRF9MSUJTOkJPT0w9dHJ1ZSAuLgorIyAgIGNtYWtlIC1CIGJ1aWxkIC1EIEJVSUxEX1NIQVJFRF9MSUJTPXRydWUgLUQgQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlCiAjCiAjIEZvciBhIGZyYW1ld29yayBvbiBPUyBYLCB1c2UKICMKQEAgLTM1LDYgKzM1LDEwIEBACiAjCiAjICAgY21ha2UgLUUgY2hkaXIgYnVpbGQgY21ha2UgLUcgWGNvZGUgLUQgSU9TX1BMQVRGT1JNPVNJTVVMQVRPUiAuLgogIworIyBvcgorIworIyAgIGNtYWtlIC1FIGNoZGlyIGJ1aWxkIGNtYWtlIC1HIFhjb2RlIC1EIElPU19QTEFURk9STT1TSU1VTEFUT1I2NCAuLgorIwogIyBGaW5hbGx5LCBidWlsZCB0aGUgcHJvamVjdCB3aXRoOgogIwogIyAgIGNtYWtlIC0tYnVpbGQgYnVpbGQKQEAgLTY0LDE0ICs2OCwyNiBAQAogIyAuIGBDTWFrZUxpc3RzLnR4dCcgaXMgcHJvdmlkZWQgYXMtaXMgc2luY2UgaXQgaXMgbm9ybWFsbHkgbm90IHVzZWQgYnkgdGhlCiAjICAgZGV2ZWxvcGVyIHRlYW0uCiAjCi0jIC4gU2V0IHRoZSBgRlRfV0lUSF9aTElCJywgYEZUX1dJVEhfQlpJUDInLCBgRlRfV0lUSF9QTkcnLCBhbmQKLSMgICBgRlRfV0lUSF9IQVJGQlVaWicgQ01ha2UgdmFyaWFibGVzIHRvIGBPTicgdG8gZm9yY2UgdXNpbmcgYSBkZXBlbmRlbmN5LgotIyAgIExlYXZlIGEgdmFyaWFibGUgdW5kZWZpbmVkICh3aGljaCBpcyB0aGUgZGVmYXVsdCkgdG8gdXNlIHRoZSBkZXBlbmRlbmN5Ci0jICAgb25seSBpZiBpdCBpcyBhdmFpbGFibGUuICBTZXQgYENNQUtFX0RJU0FCTEVfRklORF9QQUNLQUdFX0hhcmZCdXp6PVRSVUUnIHRvCi0jICAgZGlzYWJsZSBhIGRlcGVuZGVuY3kgY29tcGxldGVseSAoQ01ha2UgcGFja2FnZSBuYW1lLCBzbyBgQlppcDInIGluc3RlYWQgb2YKLSMgICBgQlpJUDInKS4gRXhhbXBsZToKKyMgLiBTZXQgdGhlIGBGVF9XSVRIX1pMSUInLCBgRlRfV0lUSF9CWklQMicsIGBGVF9XSVRIX1BORycsCisjICAgYEZUX1dJVEhfSEFSRkJVWlonLCBhbmQgYEZUX1dJVEhfQlJPVExJJyBDTWFrZSB2YXJpYWJsZXMgdG8gYE9OJyB0bworIyAgIGZvcmNlIHVzaW5nIGEgZGVwZW5kZW5jeS4gIExlYXZlIGEgdmFyaWFibGUgdW5kZWZpbmVkICh3aGljaCBpcyB0aGUKKyMgICBkZWZhdWx0KSB0byB1c2UgdGhlIGRlcGVuZGVuY3kgb25seSBpZiBpdCBpcyBhdmFpbGFibGUuIEV4YW1wbGU6CiAjCi0jICAgICBjbWFrZSAtREZUX1dJVEhfWkxJQj1PTiAtRENNQUtFX0RJU0FCTEVfRklORF9QQUNLQUdFX0hhcmZCdXp6PVRSVUUgWy4uLl0KKyMgICAgIGNtYWtlIC1CIGJ1aWxkIC1EIEZUX1dJVEhfWkxJQj1PTiBcCisjICAgICAgICAgICAgICAgICAgICAtRCBGVF9XSVRIX0JaSVAyPU9OIFwKKyMgICAgICAgICAgICAgICAgICAgIC1EIEZUX1dJVEhfUE5HPU9OIFwKKyMgICAgICAgICAgICAgICAgICAgIC1EIEZUX1dJVEhfSEFSRkJVWlo9T04gXAorIyAgICAgICAgICAgICAgICAgICAgLUQgRlRfV0lUSF9CUk9UTEk9T04gWy4uLl0KKyMKKyMgICBTZXQgYENNQUtFX0RJU0FCTEVfRklORF9QQUNLQUdFX1hYWD1UUlVFJyB0byBkaXNhYmxlIGEgZGVwZW5kZW5jeSBjb21wbGV0ZWx5CisjICAgKHdoZXJlIGBYWFgnIGlzIGEgQ01ha2UgcGFja2FnZSBuYW1lIGxpa2UgYEJaaXAyJykuICBFeGFtcGxlIGZvciBkaXNhYmxpbmcgYWxsCisjICAgZGVwZW5kZW5jaWVzOgorIworIyAgICAgY21ha2UgLUIgYnVpbGQgLUQgQ01BS0VfRElTQUJMRV9GSU5EX1BBQ0tBR0VfWkxJQj1UUlVFIFwKKyMgICAgICAgICAgICAgICAgICAgIC1EIENNQUtFX0RJU0FCTEVfRklORF9QQUNLQUdFX0JaaXAyPVRSVUUgXAorIyAgICAgICAgICAgICAgICAgICAgLUQgQ01BS0VfRElTQUJMRV9GSU5EX1BBQ0tBR0VfUE5HPVRSVUUgXAorIyAgICAgICAgICAgICAgICAgICAgLUQgQ01BS0VfRElTQUJMRV9GSU5EX1BBQ0tBR0VfSGFyZkJ1eno9VFJVRSBcCisjICAgICAgICAgICAgICAgICAgICAtRCBDTUFLRV9ESVNBQkxFX0ZJTkRfUEFDS0FHRV9Ccm90bGlEZWM9VFJVRSBbLi4uXQogIwogIyAuIEluc3RhbGxhdGlvbiBvZiBGcmVlVHlwZSBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSBDTWFrZSB2YXJpYWJsZXMKICMgICBgU0tJUF9JTlNUQUxMX0hFQURFUlMnLCBgU0tJUF9JTlNUQUxMX0xJQlJBUklFUycsIGFuZCBgU0tJUF9JTlNUQUxMX0FMTCcKQEAgLTg1LDcgKzEwMSw3IEBACiAKIGlmIChOT1QgQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4zKQogICAjIEFsbG93IHN5bWJvbCB2aXNpYmlsaXR5IHNldHRpbmdzIGFsc28gb24gc3RhdGljIGxpYnJhcmllcy4gQ01ha2UgPCAzLjMKLSAgIyBvbmx5IHNldHMgdGhlIHByb3Blcnkgb24gYSBzaGFyZWQgbGlicmFyeSBidWlsZC4KKyAgIyBvbmx5IHNldHMgdGhlIHByb3BlcnR5IG9uIGEgc2hhcmVkIGxpYnJhcnkgYnVpbGQuCiAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDA2MyBORVcpCiBlbmRpZiAoKQogCkBAIC05Niw5ICsxMTIsMTAgQEAKIGlmIChBUFBMRSkKICAgaWYgKERFRklORUQgSU9TX1BMQVRGT1JNKQogICAgIGlmIChOT1QgIiR7SU9TX1BMQVRGT1JNfSIgU1RSRVFVQUwgIk9TIgotICAgICAgICBBTkQgTk9UICIke0lPU19QTEFURk9STX0iIFNUUkVRVUFMICJTSU1VTEFUT1IiKQorICAgICAgICBBTkQgTk9UICIke0lPU19QTEFURk9STX0iIFNUUkVRVUFMICJTSU1VTEFUT1IiCisgICAgICAgIEFORCBOT1QgIiR7SU9TX1BMQVRGT1JNfSIgU1RSRVFVQUwgIlNJTVVMQVRPUjY0IikKICAgICAgIG1lc3NhZ2UoRkFUQUxfRVJST1IKLSAgICAgICAgIklPU19QTEFURk9STSBtdXN0IGJlIHNldCB0byBlaXRoZXIgT1Mgb3IgU0lNVUxBVE9SIikKKyAgICAgICAgIklPU19QTEFURk9STSBtdXN0IGJlIHNldCB0byBlaXRoZXIgT1MsIFNJTVVMQVRPUiwgb3IgU0lNVUxBVE9SNjQiKQogICAgIGVuZGlmICgpCiAgICAgaWYgKE5PVCAiJHtDTUFLRV9HRU5FUkFUT1J9IiBTVFJFUVVBTCAiWGNvZGUiKQogICAgICAgbWVzc2FnZShBVVRIT1JfV0FSTklORwpAQCAtMTI5LDMxICsxNDYsMzkgQEAKIHByb2plY3QoZnJlZXR5cGUgQykKIAogc2V0KFZFUlNJT05fTUFKT1IgIjIiKQotc2V0KFZFUlNJT05fTUlOT1IgIjkiKQotc2V0KFZFUlNJT05fUEFUQ0ggIjEiKQorc2V0KFZFUlNJT05fTUlOT1IgIjEwIikKK3NldChWRVJTSU9OX1BBVENIICI0IikKIAotIyBTT1ZFUlNJT04gc2NoZW1lOiBDVVJSRU5ULkFHRS5SRVZJU0lPTgotIyAgIElmIHRoZXJlIHdhcyBhbiBpbmNvbXBhdGlibGUgaW50ZXJmYWNlIGNoYW5nZToKLSMgICAgIEluY3JlbWVudCBDVVJSRU5ULiBTZXQgQUdFIGFuZCBSRVZJU0lPTiB0byAwCi0jICAgSWYgdGhlcmUgd2FzIGEgY29tcGF0aWJsZSBpbnRlcmZhY2UgY2hhbmdlOgotIyAgICAgSW5jcmVtZW50IEFHRS4gU2V0IFJFVklTSU9OIHRvIDAKLSMgICBJZiB0aGUgc291cmNlIGNvZGUgd2FzIGNoYW5nZWQsIGJ1dCB0aGVyZSB3ZXJlIG5vIGludGVyZmFjZSBjaGFuZ2VzOgotIyAgICAgSW5jcmVtZW50IFJFVklTSU9OLgotc2V0KExJQlJBUllfVkVSU0lPTiAiNi4xNi4wIikKLXNldChMSUJSQVJZX1NPVkVSU0lPTiAiNiIpCisjIEdlbmVyYXRlIExJQlJBUllfVkVSU0lPTiBhbmQgTElCUkFSWV9TT1ZFUlNJT04uCitzZXQoTElCVE9PTF9SRUdFWCAidmVyc2lvbl9pbmZvPScoWzAtOV0rKTooWzAtOV0rKTooWzAtOV0rKSciKQorZmlsZShTVFJJTkdTICIke1BST0pFQ1RfU09VUkNFX0RJUn0vYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyIKKyAgVkVSU0lPTl9JTkZPCisgIFJFR0VYICR7TElCVE9PTF9SRUdFWH0pCitzdHJpbmcoUkVHRVggUkVQTEFDRQorICAke0xJQlRPT0xfUkVHRVh9ICJcXDEiCisgIExJQlRPT0xfQ1VSUkVOVCAiJHtWRVJTSU9OX0lORk99IikKK3N0cmluZyhSRUdFWCBSRVBMQUNFCisgICR7TElCVE9PTF9SRUdFWH0gIlxcMiIKKyAgTElCVE9PTF9SRVZJU0lPTiAiJHtWRVJTSU9OX0lORk99IikKK3N0cmluZyhSRUdFWCBSRVBMQUNFCisgICR7TElCVE9PTF9SRUdFWH0gIlxcMyIKKyAgTElCVE9PTF9BR0UgIiR7VkVSU0lPTl9JTkZPfSIpCiAKLSMgVGhlc2Ugb3B0aW9ucyBtZWFuICJyZXF1aXJlIHggYW5kIGNvbXBsYWluIGlmIG5vdCBmb3VuZCIuIFRoZXknbGwgZ2V0Ci0jIG9wdGlvbmFsbHkgZm91bmQgYW55d2F5LiBVc2UgYC1EQ01BS0VfRElTQUJMRV9GSU5EX1BBQ0tBR0VfeD1UUlVFYCB0byBkaXNhYmxlCi0jIHNlYXJjaGluZyBmb3IgYSBwYWNrZ2UgZW50aXJlbHkgKHggaXMgdGhlIENNYWtlIHBhY2thZ2UgbmFtZSwgc28gIkJaaXAyIgotIyBpbnN0ZWFkIG9mICJCWklQMiIpLgorIyBUaGlzIGlzIHdoYXQgbGlidG9vbCBkb2VzIGludGVybmFsbHkgb24gVW5peCBwbGF0Zm9ybXMuCittYXRoKEVYUFIgTElCUkFSWV9TT1ZFUlNJT04gIiR7TElCVE9PTF9DVVJSRU5UfSAtICR7TElCVE9PTF9BR0V9IikKK3NldChMSUJSQVJZX1ZFUlNJT04gIiR7TElCUkFSWV9TT1ZFUlNJT059LiR7TElCVE9PTF9BR0V9LiR7TElCVE9PTF9SRVZJU0lPTn0iKQorCisjIEV4dGVybmFsIGRlcGVuZGVuY3kgbGlicmFyeSBkZXRlY3Rpb24gaXMgYXV0b21hdGljLiBTZWUgdGhlIG5vdGVzIGF0IHRoZSB0b3AKKyMgb2YgdGhpcyBmaWxlLCBmb3IgaG93IHRvIGZvcmNlIG9yIGRpc2FibGUgZGVwZW5kZW5jaWVzIGNvbXBsZXRlbHkuCiBvcHRpb24oRlRfV0lUSF9aTElCICJVc2Ugc3lzdGVtIHpsaWIgaW5zdGVhZCBvZiBpbnRlcm5hbCBsaWJyYXJ5LiIgT0ZGKQogb3B0aW9uKEZUX1dJVEhfQlpJUDIgIlN1cHBvcnQgYnppcDIgY29tcHJlc3NlZCBmb250cy4iIE9GRikKIG9wdGlvbihGVF9XSVRIX1BORyAiU3VwcG9ydCBQTkcgY29tcHJlc3NlZCBPcGVuVHlwZSBlbWJlZGRlZCBiaXRtYXBzLiIgT0ZGKQogb3B0aW9uKEZUX1dJVEhfSEFSRkJVWlogIkltcHJvdmUgYXV0by1oaW50aW5nIG9mIE9wZW5UeXBlIGZvbnRzLiIgT0ZGKQorb3B0aW9uKEZUX1dJVEhfQlJPVExJICJTdXBwb3J0IGNvbXByZXNzZWQgV09GRjIgZm9udHMuIiBPRkYpCiAKIAogIyBEaXNhbGxvdyBpbi1zb3VyY2UgYnVpbGRzCi1pZiAoIiR7UFJPSkVDVF9CSU5BUllfRElSfSIgU1RSRVFVQUwgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfSIpCitpZiAoIiR7Q01BS0VfQklOQVJZX0RJUn0iIFNUUkVRVUFMICIke0NNQUtFX1NPVVJDRV9ESVJ9IikKICAgbWVzc2FnZShGQVRBTF9FUlJPUgogICAgICJJbi1zb3VyY2UgYnVpbGRzIGFyZSBub3QgcGVybWl0dGVkISAgTWFrZSBhIHNlcGFyYXRlIGZvbGRlciBmb3IiCiAgICAgIiBidWlsZGluZywgZS5nLixcbiIKQEAgLTE4MCwxMCArMjA1LDExIEBACiAKIAogIyBGaW5kIGRlcGVuZGVuY2llcworc2V0KEhBUkZCVVpaX01JTl9WRVJTSU9OICIxLjguMCIpCiBpZiAoRlRfV0lUSF9IQVJGQlVaWikKLSAgZmluZF9wYWNrYWdlKEhhcmZCdXp6IDEuMy4wIFJFUVVJUkVEKQorICBmaW5kX3BhY2thZ2UoSGFyZkJ1enogJHtIQVJGQlVaWl9NSU5fVkVSU0lPTn0gUkVRVUlSRUQpCiBlbHNlICgpCi0gIGZpbmRfcGFja2FnZShIYXJmQnV6eiAxLjMuMCkKKyAgZmluZF9wYWNrYWdlKEhhcmZCdXp6ICR7SEFSRkJVWlpfTUlOX1ZFUlNJT059KQogZW5kaWYgKCkKIAogaWYgKEZUX1dJVEhfUE5HKQpAQCAtMjA0LDEzICsyMzAsMTggQEAKICAgZmluZF9wYWNrYWdlKEJaaXAyKQogZW5kaWYgKCkKIAoraWYgKEZUX1dJVEhfQlJPVExJKQorICBmaW5kX3BhY2thZ2UoQnJvdGxpRGVjIFJFUVVJUkVEKQorZWxzZSAoKQorICBmaW5kX3BhY2thZ2UoQnJvdGxpRGVjKQorZW5kaWYgKCkKKwogIyBDcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQogaWYgKFVOSVgpCiAgIGNoZWNrX2luY2x1ZGVfZmlsZSgidW5pc3RkLmgiIEhBVkVfVU5JU1REX0gpCiAgIGNoZWNrX2luY2x1ZGVfZmlsZSgiZmNudGwuaCIgSEFWRV9GQ05UTF9IKQotICBjaGVja19pbmNsdWRlX2ZpbGUoInN0ZGludC5oIiBIQVZFX1NURElOVF9IKQogCi0gIGZpbGUoUkVBRCAiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2J1aWxkcy91bml4L2Z0Y29uZmlnLmluIgorICBmaWxlKFJFQUQgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9idWlsZHMvdW5peC9mdGNvbmZpZy5oLmluIgogICAgIEZUQ09ORklHX0gpCiAgIGlmIChIQVZFX1VOSVNURF9IKQogICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFCkBAIC0yMjIsMTUgKzI1MywxOSBAQAogICAgICAgIiN1bmRlZiArKEhBVkVfRkNOVExfSCkiICIjZGVmaW5lIFxcMSAxIgogICAgICAgRlRDT05GSUdfSCAiJHtGVENPTkZJR19IfSIpCiAgIGVuZGlmICgpCi0gIGlmIChIQVZFX1NURElOVF9IKQotICAgIHN0cmluZyhSRUdFWCBSRVBMQUNFCi0gICAgICAiI3VuZGVmICsoSEFWRV9TVERJTlRfSCkiICIjZGVmaW5lIFxcMSAxIgotICAgICAgRlRDT05GSUdfSCAiJHtGVENPTkZJR19IfSIpCi0gIGVuZGlmICgpCi0gIHN0cmluZyhSRVBMQUNFICIvdW5kZWYgIiAiI3VuZGVmICIKLSAgICBGVENPTkZJR19IICIke0ZUQ09ORklHX0h9IikKLSAgZmlsZShXUklURSAiJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgiCi0gICAgIiR7RlRDT05GSUdfSH0iKQorZWxzZSAoKQorICBmaWxlKFJFQUQgIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIgorICAgIEZUQ09ORklHX0gpCitlbmRpZiAoKQorCitzZXQoRlRDT05GSUdfSF9OQU1FICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCIpCitpZiAoRVhJU1RTICIke0ZUQ09ORklHX0hfTkFNRX0iKQorICBmaWxlKFJFQUQgIiR7RlRDT05GSUdfSF9OQU1FfSIgT1JJR0lOQUxfRlRDT05GSUdfSCkKK2Vsc2UgKCkKKyAgc2V0KE9SSUdJTkFMX0ZUQ09ORklHX0ggIiIpCitlbmRpZiAoKQoraWYgKE5PVCAoT1JJR0lOQUxfRlRDT05GSUdfSCBTVFJFUVVBTCBGVENPTkZJR19IKSkKKyAgZmlsZShXUklURSAiJHtGVENPTkZJR19IX05BTUV9IiAiJHtGVENPTkZJR19IfSIpCiBlbmRpZiAoKQogCiAKQEAgLTI1Nyw4ICsyOTIsMjEgQEAKICAgICAiL1xcKiArKCNkZWZpbmUgK0ZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaKSArXFwqLyIgIlxcMSIKICAgICBGVE9QVElPTl9IICIke0ZUT1BUSU9OX0h9IikKIGVuZGlmICgpCi1maWxlKFdSSVRFICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCIKLSAgIiR7RlRPUFRJT05fSH0iKQoraWYgKEJST1RMSURFQ19GT1VORCkKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UKKyAgICAiL1xcKiArKCNkZWZpbmUgK0ZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSSkgK1xcKi8iICJcXDEiCisgICAgRlRPUFRJT05fSCAiJHtGVE9QVElPTl9IfSIpCitlbmRpZiAoKQorCitzZXQoRlRPUFRJT05fSF9OQU1FICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCIpCitpZiAoRVhJU1RTICIke0ZUT1BUSU9OX0hfTkFNRX0iKQorICBmaWxlKFJFQUQgIiR7RlRPUFRJT05fSF9OQU1FfSIgT1JJR0lOQUxfRlRPUFRJT05fSCkKK2Vsc2UgKCkKKyAgc2V0KE9SSUdJTkFMX0ZUT1BUSU9OX0ggIiIpCitlbmRpZiAoKQoraWYgKE5PVCAoT1JJR0lOQUxfRlRPUFRJT05fSCBTVFJFUVVBTCBGVE9QVElPTl9IKSkKKyAgZmlsZShXUklURSAiJHtGVE9QVElPTl9IX05BTUV9IiAiJHtGVE9QVElPTl9IfSIpCitlbmRpZiAoKQogCiAKIGZpbGUoR0xPQiBQVUJMSUNfSEVBREVSUyAiaW5jbHVkZS9mdDJidWlsZC5oIiAiaW5jbHVkZS9mcmVldHlwZS8qLmgiKQpAQCAtMjg0LDcgKzMzMiw2IEBACiAgIHNyYy9iYXNlL2Z0cGZyLmMKICAgc3JjL2Jhc2UvZnRzdHJva2UuYwogICBzcmMvYmFzZS9mdHN5bnRoLmMKLSAgc3JjL2Jhc2UvZnRzeXN0ZW0uYwogICBzcmMvYmFzZS9mdHR5cGUxLmMKICAgc3JjL2Jhc2UvZnR3aW5mbnQuYwogICBzcmMvYmRmL2JkZi5jCkBAIC0zMDgsNiArMzU1LDEyIEBACiAgIHNyYy93aW5mb250cy93aW5mbnQuYwogKQogCitpZiAoVU5JWCkKKyAgbGlzdChBUFBFTkQgQkFTRV9TUkNTICJidWlsZHMvdW5peC9mdHN5c3RlbS5jIikKK2Vsc2UgKCkKKyAgbGlzdChBUFBFTkQgQkFTRV9TUkNTICJzcmMvYmFzZS9mdHN5c3RlbS5jIikKK2VuZGlmICgpCisKIGlmIChXSU4zMikKICAgZW5hYmxlX2xhbmd1YWdlKFJDKQogICBsaXN0KEFQUEVORCBCQVNFX1NSQ1MgYnVpbGRzL3dpbmRvd3MvZnRkZWJ1Zy5jCkBAIC0zMjUsNyArMzc4LDcgQEAKIAogaWYgKE5PVCBESVNBQkxFX0ZPUkNFX0RFQlVHX1BPU1RGSVgpCiAgIHNldChDTUFLRV9ERUJVR19QT1NURklYIGQpCi1lbmRpZigpCitlbmRpZiAoKQogCiAKIGFkZF9saWJyYXJ5KGZyZWV0eXBlCkBAIC0zNDUsNiArMzk4LDEwIEBACiBpZiAoV0lOMzIpCiAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKAogICAgIGZyZWV0eXBlIFBSSVZBVEUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgX0NSVF9OT05TVERDX05PX1dBUk5JTkdTKQorICBpZiAoQlVJTERfU0hBUkVEX0xJQlMpCisgICAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoCisgICAgICBmcmVldHlwZSBQUklWQVRFIERMTF9FWFBPUlQpCisgIGVuZGlmICgpCiBlbmRpZiAoKQogCiBpZiAoQlVJTERfU0hBUkVEX0xJQlMpCkBAIC0zNTMsMTcgKzQxMCwyMSBAQAogICAgIFNPVkVSU0lPTiAke0xJQlJBUllfU09WRVJTSU9OfSkKIGVuZGlmICgpCiAKLXRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKAotICBmcmVldHlwZSBCRUZPUkUgICMgUGljayB1cCBmdGNvbmZpZy5oIGFuZCBmdG9wdGlvbi5oIGdlbmVyYXRlZCBhYm92ZS4KLSAgICBQUklWQVRFICIke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZSIpCi0KKyMgUGljayB1cCBmdGNvbmZpZy5oIGFuZCBmdG9wdGlvbi5oIGdlbmVyYXRlZCBhYm92ZSwgZmlyc3QuCiB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcygKICAgZnJlZXR5cGUKLSAgICBQUklWQVRFICIke1BST0pFQ1RfU09VUkNFX0RJUn0vaW5jbHVkZSIpCisgICAgUFVCTElDCisgICAgICAkPElOU1RBTExfSU5URVJGQUNFOmluY2x1ZGUvZnJlZXR5cGUyPgorICAgICAgJDxCVUlMRF9JTlRFUkZBQ0U6JHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2luY2x1ZGU+CisgICAgICAkPEJVSUxEX0lOVEVSRkFDRToke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZT4KKyAgICBQUklWQVRFCisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZQorICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2luY2x1ZGUKKyAgICAgIAorICAgICAgIyBNYWtlIDxmdGNvbmZpZy5oPiBhdmFpbGFibGUgZm9yIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMuCisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9mcmVldHlwZS9jb25maWcKKykKIAotdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoCi0gIGZyZWV0eXBlCi0gICAgUFVCTElDICQ8SU5TVEFMTF9JTlRFUkZBQ0U6aW5jbHVkZS9mcmVldHlwZTI+KQogCiBpZiAoQlVJTERfRlJBTUVXT1JLKQogICBzZXRfcHJvcGVydHkoU09VUkNFICR7UFVCTElDX0NPTkZJR19IRUFERVJTfQpAQCAtMzgzLDIzICs0NDQsMjkgQEAKIGlmIChaTElCX0ZPVU5EKQogICB0YXJnZXRfbGlua19saWJyYXJpZXMoZnJlZXR5cGUgUFJJVkFURSAke1pMSUJfTElCUkFSSUVTfSkKICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoZnJlZXR5cGUgUFJJVkFURSAke1pMSUJfSU5DTFVERV9ESVJTfSkKLSAgbGlzdChBUFBFTkQgUEtHX0NPTkZJR19SRVFVSVJFRF9QUklWQVRFIHpsaWIpCisgIGxpc3QoQVBQRU5EIFBLR19DT05GSUdfUkVRVUlSRURfUFJJVkFURSAiemxpYiIpCiBlbmRpZiAoKQogaWYgKEJaSVAyX0ZPVU5EKQogICB0YXJnZXRfbGlua19saWJyYXJpZXMoZnJlZXR5cGUgUFJJVkFURSAke0JaSVAyX0xJQlJBUklFU30pCiAgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGZyZWV0eXBlIFBSSVZBVEUgJHtCWklQMl9JTkNMVURFX0RJUn0pICMgbm90IEJaSVAyX0lOQ0xVREVfRElSUwotICBsaXN0KEFQUEVORCBQS0dfQ09ORklHX1JFUVVJUkVEX1BSSVZBVEUgYnppcDIpCisgIGxpc3QoQVBQRU5EIFBLR19DT05GSUdfUkVRVUlSRURfUFJJVkFURSAiYnppcDIiKQogZW5kaWYgKCkKIGlmIChQTkdfRk9VTkQpCiAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhmcmVldHlwZSBQUklWQVRFICR7UE5HX0xJQlJBUklFU30pCiAgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKGZyZWV0eXBlIFBSSVZBVEUgJHtQTkdfREVGSU5JVElPTlN9KQogICB0YXJnZXRfaW5jbHVkZV9kaXJlY3RvcmllcyhmcmVldHlwZSBQUklWQVRFICR7UE5HX0lOQ0xVREVfRElSU30pCi0gIGxpc3QoQVBQRU5EIFBLR19DT05GSUdfUkVRVUlSRURfUFJJVkFURSBsaWJwbmcpCisgIGxpc3QoQVBQRU5EIFBLR19DT05GSUdfUkVRVUlSRURfUFJJVkFURSAibGlicG5nIikKIGVuZGlmICgpCiBpZiAoSEFSRkJVWlpfRk9VTkQpCiAgIHRhcmdldF9saW5rX2xpYnJhcmllcyhmcmVldHlwZSBQUklWQVRFICR7SEFSRkJVWlpfTElCUkFSSUVTfSkKICAgdGFyZ2V0X2luY2x1ZGVfZGlyZWN0b3JpZXMoZnJlZXR5cGUgUFJJVkFURSAke0hBUkZCVVpaX0lOQ0xVREVfRElSU30pCi0gIGxpc3QoQVBQRU5EIFBLR19DT05GSUdfUkVRVUlSRURfUFJJVkFURSBoYXJmYnV6eikKKyAgbGlzdChBUFBFTkQgUEtHX0NPTkZJR19SRVFVSVJFRF9QUklWQVRFICJoYXJmYnV6eiA+PSAke0hBUkZCVVpaX01JTl9WRVJTSU9OfSIpCitlbmRpZiAoKQoraWYgKEJST1RMSURFQ19GT1VORCkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGZyZWV0eXBlIFBSSVZBVEUgJHtCUk9UTElERUNfTElCUkFSSUVTfSkKKyAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMoZnJlZXR5cGUgUFJJVkFURSAke0JST1RMSURFQ19ERUZJTklUSU9OU30pCisgIHRhcmdldF9pbmNsdWRlX2RpcmVjdG9yaWVzKGZyZWV0eXBlIFBSSVZBVEUgJHtCUk9UTElERUNfSU5DTFVERV9ESVJTfSkKKyAgbGlzdChBUFBFTkQgUEtHX0NPTkZJR19SRVFVSVJFRF9QUklWQVRFICJsaWJicm90bGlkZWMiKQogZW5kaWYgKCkKIAogCkBAIC00MjUsNyArNDkyLDcgQEAKIGlmIChOT1QgU0tJUF9JTlNUQUxMX0xJQlJBUklFUyBBTkQgTk9UIFNLSVBfSU5TVEFMTF9BTEwpCiAgICMgR2VuZXJhdGUgdGhlIHBrZy1jb25maWcgZmlsZQogICBpZiAoVU5JWCkKLSAgICBmaWxlKFJFQUQgJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L2J1aWxkcy91bml4L2ZyZWV0eXBlMi5pbiBGUkVFVFlQRTJfUENfSU4pCisgICAgZmlsZShSRUFEICIke1BST0pFQ1RfU09VUkNFX0RJUn0vYnVpbGRzL3VuaXgvZnJlZXR5cGUyLmluIiBGUkVFVFlQRTJfUENfSU4pCiAKICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiwgIiBQS0dfQ09ORklHX1JFUVVJUkVEX1BSSVZBVEUgIiR7UEtHX0NPTkZJR19SRVFVSVJFRF9QUklWQVRFfSIpCiAKQEAgLTQzNywxNCArNTA0LDIyIEBACiAgICAgICAgICAgIEZSRUVUWVBFMl9QQ19JTiAke0ZSRUVUWVBFMl9QQ19JTn0pCiAgICAgc3RyaW5nKFJFUExBQ0UgIiVpbmNsdWRlZGlyJSIgIlwke3ByZWZpeH0vJHtDTUFLRV9JTlNUQUxMX0lOQ0xVREVESVJ9IgogICAgICAgICAgICBGUkVFVFlQRTJfUENfSU4gJHtGUkVFVFlQRTJfUENfSU59KQotICAgIHN0cmluZyhSRVBMQUNFICIlZnRfdmVyc2lvbiUiICIke1ZFUlNJT05fTUFKT1J9LiR7VkVSU0lPTl9NSU5PUn0uJHtWRVJTSU9OX1BBVENIfSIKKyAgICBzdHJpbmcoUkVQTEFDRSAiJWZ0X3ZlcnNpb24lIiAiJHtMSUJUT09MX0NVUlJFTlR9LiR7TElCVE9PTF9SRVZJU0lPTn0uJHtMSUJUT09MX0FHRX0iCiAgICAgICAgICAgIEZSRUVUWVBFMl9QQ19JTiAke0ZSRUVUWVBFMl9QQ19JTn0pCiAgICAgc3RyaW5nKFJFUExBQ0UgIiVSRVFVSVJFU19QUklWQVRFJSIgIiR7UEtHX0NPTkZJR19SRVFVSVJFRF9QUklWQVRFfSIKICAgICAgICAgICAgRlJFRVRZUEUyX1BDX0lOICR7RlJFRVRZUEUyX1BDX0lOfSkKICAgICBzdHJpbmcoUkVQTEFDRSAiJUxJQlNfUFJJVkFURSUiICIiICAjIEFsbCBsaWJzIHN1cHBvcnQgcGtnLWNvbmZpZwogICAgICAgICAgICBGUkVFVFlQRTJfUENfSU4gJHtGUkVFVFlQRTJfUENfSU59KQogCi0gICAgZmlsZShXUklURSAke1BST0pFQ1RfQklOQVJZX0RJUn0vZnJlZXR5cGUyLnBjICR7RlJFRVRZUEUyX1BDX0lOfSkKKyAgICBzZXQoRlJFRVRZUEUyX1BDX0lOX05BTUUgIiR7UFJPSkVDVF9CSU5BUllfRElSfS9mcmVldHlwZTIucGMiKQorICAgIGlmIChFWElTVFMgIiR7RlJFRVRZUEUyX1BDX0lOX05BTUV9IikKKyAgICAgIGZpbGUoUkVBRCAiJHtGUkVFVFlQRTJfUENfSU5fTkFNRX0iIE9SSUdJTkFMX0ZSRUVUWVBFMl9QQ19JTikKKyAgICBlbHNlICgpCisgICAgICBzZXQoT1JJR0lOQUxfRlJFRVRZUEUyX1BDX0lOICIiKQorICAgIGVuZGlmICgpCisgICAgaWYgKE5PVCAoT1JJR0lOQUxfRlJFRVRZUEUyX1BDX0lOIFNUUkVRVUFMIEZSRUVUWVBFMl9QQ19JTikpCisgICAgICBmaWxlKFdSSVRFICIke0ZSRUVUWVBFMl9QQ19JTl9OQU1FfSIgJHtGUkVFVFlQRTJfUENfSU59KQorICAgIGVuZGlmICgpCiAKICAgICBpbnN0YWxsKAogICAgICAgRklMRVMgJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2ZyZWV0eXBlMi5wYwpAQCAtNDUyLDExICs1MjcsMTggQEAKICAgICAgIENPTVBPTkVOVCBwa2djb25maWcpCiAgIGVuZGlmICgpCiAKKyAgaW5jbHVkZShDTWFrZVBhY2thZ2VDb25maWdIZWxwZXJzKQorICB3cml0ZV9iYXNpY19wYWNrYWdlX3ZlcnNpb25fZmlsZSgKKyAgICAke1BST0pFQ1RfQklOQVJZX0RJUn0vZnJlZXR5cGUtY29uZmlnLXZlcnNpb24uY21ha2UKKyAgICBWRVJTSU9OICR7VkVSU0lPTl9NQUpPUn0uJHtWRVJTSU9OX01JTk9SfS4ke1ZFUlNJT05fUEFUQ0h9CisgICAgQ09NUEFUSUJJTElUWSBTYW1lTWFqb3JWZXJzaW9uKQorCiAgIGluc3RhbGwoCiAgICAgVEFSR0VUUyBmcmVldHlwZQogICAgICAgRVhQT1JUIGZyZWV0eXBlLXRhcmdldHMKICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0xJQkRJUn0KKyAgICAgIFJVTlRJTUUgREVTVElOQVRJT04gJHtDTUFLRV9JTlNUQUxMX0JJTkRJUn0KICAgICAgIEZSQU1FV09SSyBERVNUSU5BVElPTiBMaWJyYXJ5L0ZyYW1ld29ya3MKICAgICAgIENPTVBPTkVOVCBsaWJyYXJpZXMpCiAgIGluc3RhbGwoCkBAIC00NjQsNiArNTQ2LDEwIEBACiAgICAgICBERVNUSU5BVElPTiAke0NNQUtFX0lOU1RBTExfTElCRElSfS9jbWFrZS9mcmVldHlwZQogICAgICAgRklMRSBmcmVldHlwZS1jb25maWcuY21ha2UKICAgICAgIENPTVBPTkVOVCBoZWFkZXJzKQorICBpbnN0YWxsKAorICAgIEZJTEVTICR7UFJPSkVDVF9CSU5BUllfRElSfS9mcmVldHlwZS1jb25maWctdmVyc2lvbi5jbWFrZQorICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9MSUJESVJ9L2NtYWtlL2ZyZWV0eXBlCisgICAgQ09NUE9ORU5UIGhlYWRlcnMpCiBlbmRpZiAoKQogCiAKQEAgLTQ4MCw5ICs1NjYsOSBAQAogCiBpZiAoV0lOMzIpCiAgIHNldChDUEFDS19HRU5FUkFUT1IgWklQKQotZWxzZSgpCitlbHNlICgpCiAgIHNldChDUEFDS19HRU5FUkFUT1IgVEdaKQotZW5kaWYoKQorZW5kaWYgKCkKIAogc2V0KENQQUNLX0NPTVBPTkVOVF9MSUJSQVJJRVNfRElTUExBWV9OQU1FICJMaWJyYXJpZXMiKQogc2V0KENQQUNLX0NPTVBPTkVOVF9IRUFERVJTX0RJU1BMQVlfTkFNRSAiQy9DKysgSGVhZGVycyIpCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggODA2YjgzNS4uNDJmN2MzNCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw1NDQgKzEsMTk2MCBAQAotMjAxOC0wNS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAyMC0xMC0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBWZXJzaW9uIDIuOS4xIHJlbGVhc2VkLgotCT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkqIFZlcnNpb24gMi4xMC40IHJlbGVhc2VkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTktMScuCisJVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMTAtNCcuCiAKLQkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjkuMS4KKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjEwLjQuCiAJKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCiAKLQkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwKLQlzcmMvYmFzZS9mdHZlci5yYywgYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKKwkqIFJFQURNRSwgc3JjL2Jhc2UvZnR2ZXIucmMsIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAogCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAogCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCi0JYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCiAJYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjkvMi45LjEvLCBzLzI5LzI5MS8uCisJYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sLCBkb2NzL2ZyZWV0eXBlLWNvbmZpZy4xOgorCXMvMi4xMC4zLzIuMTAuNC8sIHMvMjEwMy8yMTA0Ly4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgorCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byA0LgogCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMjI6MToxNi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDEuCisJKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMjM6NDoxNy4KKwkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDQuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmg6IFVzZSBGVF9CRUdJTl9IRUFERVIgYW5kIEZUX0VORF9IRUFERVIuCisyMDIwLTEwLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTgtMDQtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKwlbc2ZudF0gRml4IGhlYXAgYnVmZmVyIG92ZXJmbG93ICgjNTkzMDgpLgogCi0JQW5vdGhlciBmaXggZm9yIGhhbmRsaW5nIGludmFsaWQgZm9ybWF0IDIgY21hcHMuCisJVGhpcyBpcyBDVkUtMjAyMC0xNTk5OS4KIAotCVNpZ2guCisJKiBzcmMvc2ZudC9wbmdzaGltLmMgKExvYWRfU0JpdF9QbmcpOiBUZXN0IGJpdG1hcCBzaXplIGVhcmxpZXIuCiAKLQlSZXBvcnRlZCBhcworMjAyMC0xMC0xNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD04MDAzCisJKiBzcmMvc2ZudC90dHtjb2xyLGNwYWx9LmM6IEZpeCBzaWduZWRuZXNzIHdhcm5pbmdzIGZyb20gVkMrKy4KIAotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEFkanVzdCBjb25kaXRpb24gdG8gYXZvaWQKLQlhbiBlbmRsZXNzIGxvb3AuCisyMDIwLTEwLTE3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLTIwMTgtMDQtMjQgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChSZWFkMjU1VVNob3J0KTogVHdlYWsgdHlwZXMgdG8gcGxlYXNlIFZDKysuCiAKLQlbYmFzZV0gQXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciBpbiBsY2QgZmlsdGVyaW5nIGNvZGUgKCM1MzcyNykuCisyMDIwLTEwLTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKGZ0X2xjZF9maWx0ZXJfZmlyLCBfZnRfbGNkX2ZpbHRlcl9sZWdhY3kpOgotCUVuc3VyZSBgaGVpZ2h0ID4gMCcuCisJKiBWZXJzaW9uIDIuMTAuMyByZWxlYXNlZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0yMDE4LTA0LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9EZWNvbXBvc2UpOiBJbXByb3ZlIGVycm9yIHRyYWNpbmcuCisJVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMTAtMycuCiAKLTIwMTgtMDQtMjIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjEwLjMuCiAKLQlbYmFzZV0gRml4IGJpdG1hcCBlbWJvbGRlbmluZy4KKwkqIFJFQURNRSwgc3JjL2Jhc2UvZnR2ZXIucmMsIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWwsIGRvY3MvZnJlZXR5cGUtY29uZmlnLjE6CisJcy8yLjEwLjIvMi4xMC4zLywgcy8yMTAyLzIxMDMvLgogCi0JQnVnIGludHJvZHVjZWQgYWZ0ZXIgcmVsZWFzZSAyLjguCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDMuCiAKLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogV2UgdXNlCi0JYEZUX1FBTExPQ19NVUxUJywgd2hpY2ggZG9lc24ndCB6ZXJvIG91dCB0aGUgYnVmZmVyLiAgQWRqdXN0IHRoZQotCWJpdG1hcCBjb3B5aW5nIGNvZGUgdG8gdGFrZSBjYXJlIG9mIHRoaXMgZmFjdC4KKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAyMzozOjE3LgorCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMy4KIAotMjAxOC0wNC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAyMC0wOS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JQW5vdGhlciBmaXggZm9yIGhhbmRsaW5nIGludmFsaWQgZm9ybWF0IDIgY21hcHMuCisJW2F1dG9maXRdIFN5bmNocm9uaXplIHdpdGggdHRmYXV0b2hpbnQuCiAKLQlUaGUgcHJldmlvdXMgY29tbWl0IHdhcyBpbmNvbXBsZXRlLgorCVRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGZvbGxvd2luZyBjb21taXRzIGluIHRoZSB0dGZhdXRvaGludCBnaXQKKwlyZXBvc2l0b3J5OgogCi0JUmVwb3J0ZWQgYXMKKwkgIGJiNjg0MmJkM2JkNDM3YjdiNGE3OTIxYjAzNzZjODYwZjVlNzNkMTggIFR5cG8sIGZvcm1hdHRpbmcuCisJICBkNWM5MWRkYjFjYjMxMDI1N2EzZGZlOWE4ZTIwZTFmYzUxMzM1ZmFhICBBZGQgTWVkZWZhaWRyaW4gc2NyaXB0LgogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD03OTI4Ci0KLQkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwMl9jaGFyX25leHQpOiBBZGp1c3QgY29uZGl0aW9uIHRvIGF2b2lkCi0JYW4gZW5kbGVzcyBsb29wLgotCi0yMDE4LTA0LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmcKLQotCVthdXRvZml0XSBBZGQgc3VwcG9ydCBmb3IgR2VvcmdpYW4gTXRhdnJ1bGkgY2hhcmFjdGVycy4KLQotCVRoaXMgd2lsbCBiZSBwYXJ0IG9mIHRoZSBmb3J0aGNvbWluZyBVbmljb2RlIDExLjAuCi0KLQkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgTXRhdnJ1bGkuCisJKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE1lZGVmYWlkcmluLgogCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KIAotCSogc3JjL2F1dG9maXQvYWZzY3JpcHQuaDogQWRkIE10YXZydWxpIHN0YW5kYXJkIGNoYXJhY3Rlci4KKwkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBNZWRlZmFpZHJpbiBzdGFuZGFyZCBjaGFyYWN0ZXJzLgogCi0yMDE4LTA0LTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgTWVkZWZhaWRyaW4KKwlkYXRhLgogCi0JRml4IGhhbmRsaW5nIG9mIGludmFsaWQgZm9ybWF0IDIgY21hcHMuCisyMDIwLTA5LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlUaGUgcHJvYmxlbSB3YXMgaW50cm9kdWNlZCBhZnRlciB0aGUgbGFzdCByZWxlYXNlLgorCU1vdmUgYHNjcmlwdHMvbWFrZV9kaXN0cmlidXRpb25fYXJjaGl2ZXMucHlgIHRvIGBzcmMvdG9vbHNgLgorCisJKiBzY3IvdG9vbHMvc2NyaXB0cy9tYWtlX2Rpc3RyaWJ1dGlvbl9hcmNoaXZlcy5weTogKF9UT1BfRElSLAorCV9TQ1JJUFRfRElSKTogVXBkYXRlZCB0byBuZXcgbG9jYXRpb24uCisJKG1haW4pOiBzL3NodXRpbHMuY29weWZpbGUvc2h1dGlscy5jb3B5LyB0byBwcmVzZXJ2ZSBmaWxlCisJcGVybWlzc2lvbnMuCisJKG1haW4pOiBQcmVmaXggc291cmNlIGZpbGUgcGF0aHMgd2l0aCBgZ2l0X2RpcmAgd2hpbGUgY29weWluZyBmaWxlcworCXRvIGFsbG93IGNhbGxzIG9mIHRoZSBzY3JpcHQgZnJvbSBvdGhlciBwbGFjZXMgdGhhbiB0aGUgdG9wLWxldmVsCisJZGlyZWN0b3J5LgorCisyMDIwLTA5LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX3Nsb3RfbG9hZCk6IFNjYWxlIGB2ZXJ0QmVhcmluZ1lgLgorCisJVG93YXJkcyB0aGUgZW5kIG9mIHRoZSB0aGUgZnVuY3Rpb24gdGhlcmUgaXMgYSBjYWxsIHRvCisJYEZUX091dGxpbmVfR2V0X0NCb3hgIHRoYXQgcmV0cmlldmVzIHRoZSBnbHlwaCBiYm94IGluIHNjYWxlZCB1bml0cy4KKwlUaGF0IHNldHMgYGhvcmlCZWFyaW5ne1gsWX1gIGFuZCBgdmVydEJlYXJpbmdYYCBidXQgYHZlcnRCZWFyaW5nWWAKKwlpcyBsZWZ0IGFsb25lLCBhbmQgaXMgbm90IHNjYWxlZC4KKworCVBhdGNoIGZyb20gRXJpYyBNdWxsZXIgPGVtdWxsZXJAYW1hem9uLmNvbT4uCisKKzIwMjAtMDktMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBUcmFjZSBnbHlwaCBtZXRyaWNzLgorCisyMDIwLTA5LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbbWVzb25dIE1vdmUgYXV4aWxpYXJ5IHNjcmlwdHMgdG8gYGJ1aWxkcy9tZXNvbmAuCisKKwlTdWdnZXN0ZWQgYnkgQWxleGVpLgorCisJKiBzY3JpcHRzLyoucHk6IE1vdmUgbWVzb24gc2NyaXB0cyB0by4uLgorCSogYnVpbGRzL21lc29uLyoucHk6IC4uLiB0aGlzIG5ldyBsb2NhdGlvbi4KKworCSogbWVzb24uYnVpbGQ6IFVwZGF0ZWQuCisKKzIwMjAtMDktMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KKworCUFkZCBweXRob24gc2NyaXB0IGZvciBidWlsZGluZyB0YXJiYWxscy4KKworCSogc2NyaXB0cy9tYWtlX2Rpc3RyaWJ1dGlvbl9hcmNoaXZlcy5weTogTmV3IGZpbGUuCisKKwlUaGlzIHN0YW5kYWxvbmUgUHl0aG9uIHNjcmlwdCBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBydW5uaW5nIGBtYWtlCisJZGlzdGAgd2l0aCB0aGUgTWFrZS1iYXNlZCBidWlsZCBzeXN0ZW0sIHdpdGggdGhlIGZvbGxvd2luZyBtaW5vcgorCWRpZmZlcmVuY2VzOgorCisJLSBTaW5jZSBgbWFrZSBkaXN0Y2xlYW5gIGRvZXNuJ3QgYWx3YXlzIGNsZWFuIHVwIGBvYmpzL2AgcHJvcGVybHksCisJICBgbWFrZSBkaXN0YCBhcmNoaXZlcyBtYXkgY29udGFpbiBzb21lIHN0YWxlIGJpbmFyaWVzIGxpa2UKKwkgIGBvYmpzLy5saWJzL2xpYmZyZWV0eXBlLnNvLjZgIG9yIG90aGVycy4KKworCS0gYGNvbmZpZy5ndWVzc2AgYW5kIGBjb25maWcuc3ViYCBhcmUgbm90IHVwZGF0ZWQgdW5sZXNzIG9wdGlvbgorCSAgYC0tZ251LWNvbmZpZy1kaXI9RElSYCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZXNlCisJICBmaWxlcy4KKworCS0gU29tZSBiaXRzIG9mIHRoZSBhdXRvLWdlbmVyYXRlZCByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbiBtYXkKKwkgIGFwcGVhciBpbiBzbGlnaHRseSBkaWZmZXJlbnQgb3JkZXIsIHByb2JhYmx5IGR1ZSB0byBpc3N1ZXMgcmVsYXRlZAorCSAgdG8gbWtkb2NzIGFuZCBkb2N3cml0ZXIuCisKKwlBcyBhbiBleGFtcGxlLCB0aGUgY2FsbAorCisJICBzY3JpcHRzL21ha2VfZGlzdHJpYnV0aW9uX2FyY2hpdmVzLnB5IC90bXAvZnJlZXR5cGUyLWRpc3QKKworCWNyZWF0ZXMgdGhlIGZvbGxvd2luZyBmaWxlcyB1bmRlciBgL3RtcC9mcmVldHlwZTItZGlzdGA6CisKKwkgIGZyZWV0eXBlLTx2ZXJzaW9uPi50YXIuZ3oKKwkgIGZyZWV0eXBlLTx2ZXJzaW9uPi50YXIueHoKKwkgIGZ0PHdpbnZlcnNpb24+LnppcAorCisyMDIwLTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNjcmlwdHMvZXh0cmFjdF9mcmVldHlwZV92ZXJzaW9uLnB5OiBGaXggcmVnZXggdHlwb3MuCisKKzIwMjAtMDktMjEgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KKworCUFkZCBNZXNvbiBidWlsZCBwcm9qZWN0IGZpbGUuCisKKwlFeGFtcGxlIHVzYWdlOgorCisJICAjIENvbmZpZ3VyZSBNZXNvbiBidWlsZCBpbiBkaXJlY3RvcnkgYGJ1aWxkLW1lc29uYCB0byBnZW5lcmF0ZQorCSAgIyByZWxlYXNlIGJpbmFyaWVzIGNvbXBhcmFibGUgdG8gdG8gdGhlIG9uZXMgZnJvbSB0aGUKKwkgICMgYXV0b3Rvb2xzL21ha2UgYnVpbGQgc3lzdGVtLgorCSAgbWVzb24gc2V0dXAgYnVpbGQtbWVzb24gXAorCSAgICAgICAgLS1wcmVmaXg9L3Vzci9sb2NhbCBcCisJICAgICAgICAtLWJ1aWxkdHlwZT1kZWJ1Z29wdGltaXplZCBcCisJICAgICAgICAtLXN0cmlwIFwKKwkgICAgICAgIC1EYl9uZGVidWc9dHJ1ZQorCisJICAjIEFmdGVyIGNvbmZpZ3VyaW5nIHRoZSBNZXNvbiBidWlsZCB3aXRoIHRoZSBhYm92ZSBjb21tYW5kLAorCSAgIyBjb21waWxlIGFuZCBpbnN0YWxsIHRvIGAvdXNyL2xvY2FsL2A7IHRoaXMgaW5jbHVkZXMgYSBwa2ctY29uZmlnCisJICAjIGZpbGUuCisJICBuaW5qYSAtQyBidWlsZC1tZXNvbiBpbnN0YWxsCisKKwkgICMgQWx0ZXJuYXRpdmVseSwgY29tcGlsZSBhbmQgaW5zdGFsbCB0byBgL3RtcC9hYS91c3IvbG9jYWwvLi4uYAorCSAgIyBmb3IgcGFja2FnaW5nLgorCSAgREVTVERJUj0vdG1wL2FhIG5pbmphIC1DIGJ1aWxkLW1lc29uIGluc3RhbGwKKworCSAgIyBHZW5lcmF0ZSBkb2N1bWVudGF0aW9uIHVuZGVyIGBidWlsZC1tZXNvbi9kb2NzYC4KKwkgIG5pbmphIC1DIGJ1aWxkLW1lc29uIGRvY3MKKworCUxpYnJhcnkgc2l6ZSBjb21wYXJpc29uIGZvciBzdHJpcHBlZCBgbGliZnJlZXR5cGUuc29gIGdlbmVyYXRlZCBieQorCWFsbCB0aHJlZSBidWlsZCBzeXN0ZW1zOgorCisJICAtIERlZmF1bHQgYnVpbGQgKGF1dG90b29scyArIGxpYnRvb2wpOiA3MTIgS2lCCisJICAtIENNYWtlIGJ1aWxkIChSZWxXaXRoRGViSW5mbyk6ICAgICAgICA3MTIgS2lCCisJICAtIE1lc29uIGJ1aWxkOiAgICAgICAgICAgICAgICAgICAgICAgICA3MTIgS2lCCisKKworCSogbWVzb24uYnVpbGQ6IE5ldyB0b3AtbGV2ZWwgTWVzb24gYnVpbGQgZmlsZSBmb3IgdGhlIGxpYnJhcnkuCisKKwkqIG1lc29uX29wdGlvbnMudHh0OiBOZXcgZmlsZS4gIEl0IGhvbGRzIHVzZXItc2VsZWN0YWJsZSBvcHRpb25zIGZvcgorCXRoZSBidWlsZCwgd2hpY2ggY2FuIGJlIHByaW50ZWQgd2l0aCBgbWVzb24gY29uZmlndXJlYCwgYW5kIHNlbGVjdGVkCisJYXQgYG1lc29uIHNldHVwYCBvciBgbWVzb24gLS1yZWNvbmZpZ3VyZWAgdGltZSB3aXRoCisJYC1EPG9wdGlvbj49PHZhbHVlPmAuCisKKwkqIHNjcmlwdHMvcGFyc2VfbW9kdWxlc19jZmcucHk6IEEgc2NyaXB0IGludm9rZWQgYnkgYG1lc29uLmJ1aWxkYCB0bworCXBhcnNlIGBtb2R1bGVzLmNmZ2AgYW5kIGV4dHJhY3QgaW1wb3J0YW50IGluZm9ybWF0aW9uIG91dCBvZiBpdAorCShpLmUuLCB0aGUgbGlzdCBvZiBtb2R1bGVzKS4KKworCSogc2NyaXB0cy9wcm9jZXNzX2Z0b3B0aW9uX2gucHk6IE5ldyBzY3JpcHQgaW52b2tlZCBieSBgbWVzb24uYnVpbGRgCisJdG8gcHJvY2VzcyB0aGUgb3JpZ2luYWwgYGZ0b3B0aW9uLmhgIGZpbGUuICBJdCBlbmFibGVzIG9yIGRpc2FibGVzCisJY29uZmlndXJhdGlvbiBtYWNybyB2YXJpYWJsZXMgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBkZXBlbmRlbmNpZXMuCisJVGhpcyBpcyBzaW1pbGFyIHRvIHdoYXQgb3RoZXIgYnVpbGQgc3lzdGVtcyBhcmUgdXNpbmcgKGkuZS4sIE1lc29uJ3MKKwlgY29uZmlndXJlX2ZpbGUoKWAgY29tbWFuZCBpcyBub3QgdXNlZCBoZXJlKS4KKworCSogc2NyaXB0cy9leHRyYWN0X2ZyZWV0eXBlX3ZlcnNpb24ucHk6IE5ldyBzY3JpcHQgaW52b2tlZCBieQorCWBtZXNvbi5idWlsZGAgdG8gZXh0cmFjdCB0aGUgRnJlZVR5cGUgdmVyc2lvbiBudW1iZXIgZnJvbQorCWA8ZnJlZXR5cGUvZnJlZXR5cGUuaD5gLgorCisJKiBzY3JpcHRzL2V4dHJhY3RfbGlidG9vbF92ZXJzaW9uLnB5OiBOZXcgc2NyaXB0IGludm9rZWQgYnkKKwlgbWVzb24uYnVpbGRgIHRvIGV4dHJhY3QgdGhlIGxpYnRvb2wgYHJldmlzaW9uX2luZm9gIGRhdGEgZnJvbQorCWBidWlsZHMvdW5peC9jb25maWd1cmUucmF3YCwgYW5kIHRvIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nCisJc2hhcmVkIGxpYnJhcnkgc3VmZml4LgorCisJKiBzY3JpcHRzL2dlbmVyYXRlX3JlZmVyZW5jZV9kb2NzLnB5OiBOZXcgc2NyaXB0IGludm9rZWQgYnkKKwlgbWVzb24uYnVpbGRgIHRvIGdlbmVyYXRlIHRoZSBGcmVlVHlwZSAyIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uCisJKHVzaW5nIHRoZSBgZG9jd3JpdGVyYCBhbmQgYG1rZG9jc2AgcGFja2FnZXMsIHdoaWNoIG11c3QgYmUgYWxyZWFkeQorCWluc3RhbGxlZCkuCisKKzIwMjAtMDktMTEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtyYXN0ZXJdIEltcHJvdmUgdGhlIHNlY29uZCBwYXNzICgjNTgzNzMpLgorCisJQmVzaWRlcyBkcm9wb3V0IGNvbnRyb2wgdGhlIHNlY29uZCBob3Jpem9udGFsIHN3ZWVwIGlzIHN1cHBvc2VkIHRvCisJY2xlYW4gdXAgc3RyYWlnaHQgaG9yaXpvbnRhbCBlZGdlcyB0aGF0IGFyZSBtaXNoYW5kbGVkIGJ5IHRoZSBmaXJzdAorCXZlcnRpY2FsIHN3ZWVwIHdoZW4gYSBsaW5lIHBhc3NlcyB0aHJvdWdoIHBpeGVsIGNlbnRlcnMuICBUaGlzIGxpbmUKKwl3b3VsZCBwcmVzZW50IGFzIHBlcmZlY3RseSBhbGlnbmVkIHNwYW4gZWRnZXMgaW4gdGhlIHNlY29uZCBzd2VlcC4KKworCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChIb3Jpem9udGFsX1N3ZWVwX1NwYW4pOiBSZXBsYWNlIHRoZSBvbGQKKwlpbXBsZW1lbnRhdGlvbiB3aXRoIGEgYmV0dGVyIG9uZSBmb2N1c2luZyBvbiBhbGlnbmVkIHNwYW4gZWRnZXMgb25seS4KKworMjAyMC0wOS0wOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Jhc3Rlcl0gVHVuZSBTTUFSVCBtYWNybyAoIzU4MzUyKS4KKworCVdpbmRvd3Mgc2VlbXMgdG8gcGVyZm9ybSBzbWFydCBkcm9wb3V0IGNvbnRyb2wgYXQgMjYuNiBwcmVjaXNpb24uCisJVG8gbWltaWNrIFdpbmRvd3MgaW5kZXBlbmRlbnQgb2YgaW5jcmVhc2VkIHByZWNpc2lvbiwgd2UgbmVlZCB0byB0d2VhaworCXRoZSBtYWNybyBzbyB0aGF0IHNvbWUgY2xvc2UgY2FsbHMgYnJlYWsgZG93biByYXRoZXIgdGhhbiB1cC4KKworCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChTTUFSVCk6IFR3ZWFrIHRoZSBtYWNyby4KKworMjAyMC0wOS0wOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Jhc3Rlcl0gSW50cm9kdWNlIFNNQVJUIG1hY3JvLgorCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFNNQVJUKTogTmV3IG1hY3JvIGZvciBzbWFydCBkcm9wb3V0IHJvdW5kaW5nLgorCShWZXJzdGljYWxfU3dlZXBfRHJvcCwgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wKTogVXNlIGl0LgorCisyMDIwLTA5LTAzICBCb3JpcyBEYWxzdGVpbiAgPGRhbGJvcmlzQGdtYWlsLmNvbT4KKworCVtidWlsZF0gTWFrZSBDTWFrZSBpbnN0YWxsIGJhc2ljIHZlcnNpb24gaW5mb3JtYXRpb24uCisKKwkqIENNYWtlTGlzdHMudHh0OiBEbyBpdC4KKworMjAyMC0wOS0wMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3RydWV0eXBlXSBSZWR1Y2UgSW5maW5hbGl0eSBmb290cHJpbnQgKGNvbnQnZCkuCisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfREVMVEFQKTogU2hyaW5rIHZhcmlhYmxlIHNjb3BlLgorCShJbnNfU0hQSVgsIEluc19NSVJQKTogUmV2aXNlIGlmLWxvZ2ljLgorCisyMDIwLTA5LTAyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbdHJ1ZXR5cGVdIFJlZHVjZSBJbmZpbmFsaXR5IGZvb3RwcmludC4KKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TSFBJWCwgSW5zX01TSVJQLCBJbnNfTUlBUCwgSW5zX01EUlAsCisJSW5zX01JUlApOiBTaHJpbmsgdmFyaWFibGUgc2NvcGVzIGFuZCBjb25zb2xpZGF0ZSBpZmRlZnMuCisKKzIwMjAtMDktMDEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVt0cnVldHlwZV0gUmVmYWN0b3IgY29tcGVuc2F0aW9uIGNvbG9yLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaCAoVFRfUm91bmRfRnVuYyk6IENoYW5nZSB0aGUgbGFzdCBhcmd1bWVudC4KKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfUk9VTkQsIEluc19OUk9VTkQsIEluc19NREFQLCBJbnNfTUlBUCwKKwlJbnNfTURSUCwgSW5zX01JUlApOiBNb3ZlIGNvbXBlbnNhdGlvbiByZXRyaWV2YWwgZnJvbSBoZXJlLi4uCisJKFJvdW5kXyopOiAuLi4gdG8gaGVyZS4KKwkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9pbml0X2J5dGVjb2RlKTogUmVzZXJ2ZSB6ZXJvCisJY29tcGVuc2F0aW9uIGF0IGNvbG9yIGluZGV4IDMuCisKKzIwMjAtMDgtMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIERvbid0IHNldCB0YXJnZXQgaW4gZGlyZWN0IG1vZGUuCisKKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3Jhc3Rlcl9vdmVybGFwKTogUmVtb3ZlIGFzc2lnbm1lbnQuCisJKGZ0X3Ntb290aF9yYXN0ZXJfbGNkKSBbIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HXTogRGl0dG8uCisKKzIwMjAtMDgtMjUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmFzdGVyX292ZXJsYXApOiBMaW1pdCB3aWR0aC4KKworCVNlZ21lbnRhdGlvbiBmYXVsdCByZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0yNDcyOQorCisyMDIwLTA4LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0dldF9WTWV0cmljcyk6IEFkZCB0cmFjaW5nIG1lc3NhZ2UuCisKKzIwMjAtMDgtMDUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVt0cnVldHlwZV0gUmV0YWluIE9WRVJMQVBfU0lNUExFIGFuZCBPVkVSTEFQX0NPTVBPVU5ELgorCisJRm9yIGdseXBocyB3aXRoIE9WRVJMQVBfU0lNUExFIG9yIE9WRVJMQVBfQ09NUE9VTkQsIHNldAorCUZUX09VVExJTkVfT1ZFUkxBUCB0byByZW5kZXIgdGhlbSB3aXRoIGRpcmVjdCBvdmVyc2FtcGxpbmcsIHdoaWNoCisJbWl0aWdhdGVzIGFydGlmYWN0cyAoc2VlIDNiYjUxMmJjOWY2MikuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIChGVF9PVVRMSU5FX09WRVJMQVApOiBSZWRlZmluZSB0byByaHltZQorCXdpdGggT1ZFUkxBUF9TSU1QTEUuCisJKiBzcmMvYmFzZS9mdGdsb2Fkci5jIChGVF9HbHlwaExvYWRlcl9SZXdpbmQpOiBSZXNldCBvdXRsaW5lIGZsYWdzLgorCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYworCShUVF9Mb2FkX1NpbXBsZV9HbHlwaCk6IFJldGFpbiBPVkVSTEFQX1NJTVBMRS4KKwkobG9hZF90cnVldHlwZV9nbHlwaCk6IFJldGFpbiBPVkVSTEFQX0NPTVBPVU5ELgorCisyMDIwLTA4LTA0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX0xvYWRfR2x5cGgpOiBNb3JlIHRyYWNpbmcuCisKKzIwMjAtMDctMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCUhpZGUgaW50ZXJuYWwgZnVuY3Rpb25zIHdpdGggU3VuUHJvLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oCisJKEZUX0lOVEVSTkFMX0ZVTkNUSU9OX0FUVFJJQlVURSkgPF9fU1VOUFJPX0M+OiBEZWZpbmUgYXMgX19oaWRkZW4uCisKKzIwMjAtMDctMjggIEFudWogVmVybWEgIDxhbnVqdkBpaXRiaGlsYWkuYWMuaW4+CisKKwlGaXggc3RhdGljIGNvbXBpbGF0aW9uIHdpdGggVmlzdWFsIEMuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY29tcGlsZXItbWFjcm9zLmgKKwkoRlRfSU5URVJOQUxfRlVOQ1RJT05fQVRUUklCVVRFKSA8X1dJTjMyPjogRGVmaW5lIGFzIGVtcHR5LgorCisyMDIwLTA3LTI4ICBQcml5ZXNoIEt1bWFyICA8cHJpeWVzaGtrdW1hckBnbWFpbC5jb20+CisKKwlGaXggYC1XZm9ybWF0JyBjb21waWxlciB3YXJuaW5ncy4KKworCSogc3JjLyo6IEZpeCBmb3JtYXQgc3BlY2lmaWVycy4KKworCSogYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyAoRlRfU3RyZWFtX09wZW4pOiBEaXR0by4KKworMjAyMC0wNy0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IGAtV2Zvcm1hdCcgY29tcGlsZXIgd2FybmluZ3MuCisKKwlQcm9ibGVtIHJlcG9ydGVkIGJ5IFByaXllc2gga3VtYXIgPHByaXllc2hra3VtYXJAZ21haWwuY29tPgorCisJKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRGVjb21wb3NlKTogRml4IG51bWJlciBvZiBhcmd1bWVudHMKKwl0byB0cmFjaW5nIG1hY3JvLgorCisJKiBzcmMvYmRmL2JkZmRyaXZyLmMgKGJkZl9jbWFwX2NoYXJfbmV4dCwgYmRmX2dldF9iZGZfcHJvcGVydHkpOgorCURpdHRvLgorCisJKiBzcmMvY2FjaGUvZnRjYmFzaWMuYyAoZnRjX2Jhc2ljX2ZhbWlseV9nZXRfY291bnQpOiBEaXR0by4KKwlSZWZvcm11bGF0ZSBtZXNzYWdlLgorCisJKiBzcmMvcGNmL3BjZmRyaXZyLmMgKHBjZl9nZXRfYmRmX3Byb3BlcnR5KTogRGl0dG8uCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogRGl0dG8uCisJVHJhY2UgdGFibGUgb2Zmc2V0LCB0b28uCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9hcHBseV90dXBsZSk6IERpdHRvLgorCisyMDIwLTA3LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfZGVjb21wcmVzcyk6IEZpeCBjb21waWxlciB3YXJuaW5nLgorCisJUmVwb3J0ZWQgYnkgSGluLVRhay4KKworMjAyMC0wNy0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBGaXggaW5jbHVzaW9uIG9mIGBmdG9wdGlvbi5oJy4KKworMjAyMC0wNy0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IGNsYW5nIHdhcm5pbmdzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgKKwkoRlRfREVDTEFSRV9BVVRPSElOVEVSX0lOVEVSRkFDRSk6IE5ldyBtYWNyby4KKwkqIHNyYy9hdXRvZml0L2FmbW9kdWxlLmg6IFVzZSBpdCB0byBkZWNsYXJlCisJYGFmX2F1dG9maXR0ZXJfaW50ZXJmYWNlJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfREVDTEFSRV9HTFlQSCk6IE5ldyBtYWNyby4KKwkqIHNyYy9iYXNlL2Z0YmFzZS5oOiBVc2UgaXQgdG8gZGVjbGFyZSBgZnRfYml0bWFwX2dseXBoX2NsYXNzJyBhbmQKKwlgZnRfb3V0bGluZV9nbHlwaF9jbGFzcycuCisKKwkqIHNyYy9iYXNlL2Z0Z2x5cGguYzogSW5jbHVkZSBgZnRiYXNlLmgnLgorCisJKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfcnVuKTogRml4IHR5cGUgb2YgYHQyX3NpemUnLgorCisJKiBzcmMvcGNmL3BjZmRyaXZyLmMgKHBjZl9jbWFwX2NoYXJfbmV4dCk6IEZpeCB0eXBlIG9mIGByZXN1bHQnLgorCisJKiBzcmMvcHNhdXgvcHNhdXhtb2QuYyAocHNhdXhfbW9kdWxlX2NsYXNzKTogVXNlIGBGVF9ERUZJTkVfTU9EVUxFJy4KKwkqIHNyYy9wc2F1eC9wc2F1eG1vZC5oOiBEZWNsYXJlIGBhZm1fcGFyc2VyX2Z1bmNzJywKKwlgdDFfY21hcF9jbGFzc2VzJywgYGNmZl9kZWNvZGVyX2Z1bmNzJywgYW5kIGBwc2F1eF9tb2R1bGVfY2xhc3MnLgorCisJKiBzcmMvcHNoaW50ZXIvcHNobW9kLmM6IEluY2x1ZGUgYHBzaG1vZC5oJy4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChST1VORDQsIFdSSVRFX1NIT1JUKTogRml4IGltcGxpY2l0IHNpZ24KKwljb252ZXJzaW9uLgorCShjb21wdXRlX1VMb25nX3N1bSk6IEZpeCByZXR1cm4gdHlwZS4KKwlGaXggaW1wbGljaXQgc2lnbiBjb252ZXJzaW9uLgorCShzdG9yZV9wb2ludHMpOiBGaXggdHlwZSBvZiBgbGFzdF9mbGFnJywgYHJlcGVhdF9jb3VudCcsIGFuZCBgZmxhZycuCisJVXNlIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgorCShyZWNvbnN0cnVjdF9nbHlmKTogRml4IGltcGxpY2l0IHNpZ24gY29udmVyc2lvbi4KKwlVc2UgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgorCShnZXRfeF9taW5zKTogRml4IGltcGxpY2l0IHNpZ24gY29udmVyc2lvbi4KKwkqIHNyYy9zZm50L3R0Y21hcC5jOiBVbmRlZiBgVFRDTUFQQ0lURU0nLgorCSogc3JjL3NmbnQvdHRjbWFwLmg6IERlZmluZSBgVFRDTUFQQ0lURU0nIGFuZCBpbmNsdWRlIGB0dGNtYXBjLmgnIHRvCisJZGVjbGFyZSBjbWFwIGNsYXNzZXMuCisKKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX292ZXJsYXBfc3BhbnMpOiBVc2UgY2FzdC4KKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NSUFQKTogRml4IHR5cG8uCisKKzIwMjAtMDctMDcgIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KKworCVtidWlsZF0gUmVhbGx5IGZpeCBtdWx0aSBhbmQgQysrIGJ1aWxkcy4KKworCVRoZSBmb2xsb3dpbmcgYnVpbGRzIHdlcmUgc3RpbGwgZmFpbGluZyBkdWUgdG8gcHJldmlvdXMgY2hhbmdlczoKKworCSAgbWFrZSBtdWx0aQorCSAgbWFrZSBtdWx0aSBDQz0iYysrIgorCSAgbWFrZSBDQz0iYysrIgorCisJVGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWVzLCB3aGljaCB3ZXJlIG1pc3NpbmcgaW5jbHVkZXMgdG8gZ2V0IHRoZQorCXJpZ2h0IG1hY3JvIGRlZmluaXRpb25zIGluIG11bHRpLWJ1aWxkIG1vZGUuCisKKwlBbHNvLCBgRlRfVU5VU0VEJyBpcyBhY3R1YWxseSB1c2VkIGJ5IHRoaXJkLXBhcnR5IGNvZGUsIHNvIG1vdmUgaXQKKwliYWNrIHRvIGBwdWJsaWMtbWFjcm9zLmgnIHRvIGF2b2lkIGJyZWFraW5nIGl0LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9wdWJsaWMtbWFjcm9zLmggKEZUX0VYUE9SVCk6IFJlbW92ZQorCXNwZWNpYWwgZGVmaW5pdGlvbiBmb3IgQysrLgorCShGVF9VTlVTRUQpOiBEZWZpbmUgaGVyZSBpbnN0ZWFkIG9mLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9jb21waWxlci1tYWNyb3MuaDogLi4uIGhlcmUuCisJKEZUX0ZVTkNUSU9OX0RFQ0xBUkFUSU9OKTogUmVtb3ZlIHNwZWNpYWwgZGVmaW5pdGlvbiBmb3IgQysrLgorCShGVF9MT0NBTF9BUlJBWV9ERUYpOiBGaXggZGVmaW5pdGlvbi4KKworCSogc3JjL2NhY2hlL2Z0Y2NiYWNrLmgsIHNyYy9sencvZnR6b3Blbi5oLCBzcmMvZ3h2YWxpZC9neHZtb3J0LmgsCisJc3JjL2d4dmFsaWQvZ3h2bW9yeC5oOiBBZGQgYEZUX0JFR0lOX0hFQURFUicgYW5kIGBGVF9FTkRfSEVBREVSJy4KKworMjAyMC0wNy0wNiAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgorCisJW2J1aWxkXSBGaXggbXVsdGkgYW5kIEMrKyBidWlsZHMuCisKKwlUaGUgZm9sbG93aW5nIGJ1aWxkcyB3ZXJlIGZhaWxpbmcgZHVlIHRvIHByZXZpb3VzIGNoYW5nZXM6CisKKwkgIG1ha2UgbXVsdGkKKwkgIG1ha2UgbXVsdGkgQ0M9ImMrKyIKKworCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogUmVtb3ZlIGBGVF9FTkRfSEVBREVSJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfQkVHSU5fSEVBREVSLAorCUZUX0VORF9IRUFERVIpOiBQcm90ZWN0IGFnYWluc3QgcmVkZWZpbml0aW9uLgorCisJKiBzcmMvY2FjaGUvZnRjY2FjaGUuaCwgc3JjL2NhY2hlL2Z0Y21ydS5oLCBzcmMvcGNmL3BjZnV0aWwuaCwKKwlzcmMvcHNhdXgvcHNlcnJvci5oLCBzcmMvcHNhdXgvcHNmdC5oLCBzcmMvcHNhdXgvcHNzdGFjay5oLAorCXNyYy9zZm50L3dvZmYydGFncy5oOiBJbmNsdWRlIGBjb21waWxlci1tYWNyb3MuaCcuCisKKwkqIHNyYy9zZm50L3dvZmYydGFncy5jOiBJbmNsdWRlIGB3b2ZmMnRhZ3MuaCcuCisKKzIwMjAtMDctMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtwc2F1eF0gSW1wcm92ZSBgdDFfZGVjb2Rlcl9wYXJzZV9tZXRyaWNzJyAoIzU4NjQ2KS4KKworCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfbWV0cmljcyk6IENvcHkKKwljb3JyZXNwb25kaW5nIGNvZGUgZnJvbSBvbGQgZW5naW5lJ3MgYHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MnCisJZnVuY3Rpb24gdG8gaGFuZGxlIGBvcF9jYWxsc3VicicgYW5kIGBvcF9yZXR1cm4nLgorCisyMDIwLTA3LTA1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+CisKKwlbYnVpbGRdIEltcHJvdmUgdmlzaWJpbGl0eSBzdXBwb3J0IG9mIGxpYnJhcnkgZnVuY3Rpb24gbmFtZXMuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaAorCShGVF9QVUJMSUNfRlVOQ1RJT05fQVRUUklCVVRFKTogTmV3IG1hY3JvIHRvIHRhZyBmdW5jdGlvbnMgYXMKKwlwdWJsaWMgKGFuZCB0aHVzIGV4cG9ydGFibGUpLgorCShGVF9FWFBPUlQpOiBVc2UgaXQuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2NvbXBpbGVyLW1hY3Jvcy5oCisJKEZUX0lOVEVSTkFMX0ZVTkNUSU9OX0FUVFJJQlVURSk6IE5ldyBtYWNybyB0byB0YWcgZnVuY3Rpb25zIGFzCisJaW50ZXJuYWwgdG8gdGhlIGxpYnJhcnkgKGFuZCB0aHVzIGhpZGRlbikuICBOb3RlIHRoYXQgb24gRUxGCisJc3lzdGVtcywgYWxsIGludGVybmFsIGZ1bmN0aW9ucyBoYXZlIGhpZGRlbiB2aXNpYmlsaXR5LCB3aGljaCBhdm9pZHMKKwl0aGUgbmVlZCB0byBlbmZvcmNlIHRoaXMgd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIgKGUuZy4sIHdpdGggYW4KKwlvcHRpb24gbGlrZSBgLWZ2aXNpYmlsaXR5PWhpZGRlbicpLgorCisJKEZUX0ZVTkNUSU9OX0RFQ0xBUkFUSU9OLCBGVF9GVU5DVElPTl9ERUZJTklUSU9OKTogTmV3IGJhc2UgbWFjcm9zCisJdG8gZGVhbCB3aXRoIEMgYW5kIEMrKyBsaW5rYWdlIGlzc3VlcyBhdCB0aGUgc2FtZSB0aW1lLgorCisJKEZUX0xPQ0FMLCBGVF9MT0NBTF9ERUYsIEZUX0xPQ0FMX0FSUkFZLCBGVF9MT0NBTF9BUlJBWV9ERUYsCisJRlRfQkFTRSwgRlRfQkFTRV9ERUYsIEZUX0VYUE9SVF9WQVIsIEZUX0JBU0VfQ0FMTEJBQ0ssCisJRlRfQkFTRV9DQUxMQkFDS19ERUYpOiBSZWRlZmluZWQgdXNpbmcgbmV3IG1hY3Jvcy4KKworMjAyMC0wNy0wNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgorCisJW2J1aWxkXSBTcGxpdCBvZmYgbW9yZSBzdHVmZiBmcm9tIGBmdGNvbmZpZy5oJy4KKworCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaC5pbiwgYnVpbGRzL3Ztcy9mdGNvbmZpZy5oLAorCWluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFNwbGl0IG9mZiBtYWNybyBkZWZpbml0aW9ucworCXJlcXVpcmVkIGJ5IHRoZSBGcmVlVHlwZSBBUEkgaGVhZGVycyB0by4uLgorCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvcHVibGljLW1hY3Jvcy5oOiAuLi50aGlzIG5ldyBmaWxlLgorCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5oLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCisJaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogU3BsaXQgb2ZmIG1hY3JvIGRlZmluaXRpb25zIHVzZWQKKwlieSB0aGUgbGlicmFyeSBidXQgbm90IHRvIGJlIGV4cG9zZWQgdG8gY2xpZW50cyB0by4uLgorCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvY29tcGlsZXItbWFjcm9zLmg6IC4uLnRoaXMgbmV3IGZpbGUuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvKi5oLCBzcmMvcmFzdGVyL2Z0cmFzdGVyLmg6IEluY2x1ZGUKKwlgY29tcGlsZXItbWFjcm9zLmgnIHdoZXJlIG5lZWRlZC4KKworMjAyMC0wNy0wNSAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgorCisJW2J1aWxkXSBNb3ZlIG1hYyBzdXBwb3J0IGNvZGUgdG8gYG1hYy1zdXBwb3J0LmgnLgorCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5oLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCisJaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogU3BsaXQgb2ZmIG1hYy1zcGVjaWZpYyBzdHVmZgorCXRvLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9tYWMtc3VwcG9ydC5oOiAuLi50aGlzIG5ldyBmaWxlLgorCisJKiBDTWFrZUxpc3RzLnR4dCwgYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogUmVtb3ZlIGAvdW5kZWYgLT4KKwkjdW5kZWYnIHN0cmluZyByZXBsYWNlbWVudDsgdGhlIGFmZmVjdGVkIGNvZGUgaXMgbm8gbG9uZ2VyIHBhcnQgb2YKKwl0aGUgYGZ0Y29uZmlnLmgnIHRlbXBsYXRlLgorCisyMDIwLTA3LTA1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+CisKKwlbYnVpbGRdIFB1dCBpbnRlZ2VyIHR5cGUgZGVmaW5pdGlvbnMgaW50byBgaW50ZWdlci10eXBlcy5oJy4KKworCVJlZmFjdG9yIHNvbWUgb2YgdGhlIGBmdGNvbmZpZy5oJyBoZWFkZXJzIGFuZCB0ZW1wbGF0ZSB0byBtb3ZlIHRoZQorCWRlZmluaXRpb24gb2YgdGhlIEZyZWVUeXBlIGludGVnZXIgdHlwZXMgKGUuZy4sIGBGVF9JbnQxNicpIHRvIGEKKwljb21tb24gaGVhZGVyIGZpbGUgYGZyZWV0eXBlL2NvbmZpZy9pbnRlZ2VyLXR5cGVzLmgnLgorCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5oLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCisJaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogU3BsaXQgb2ZmIGludGVnZXIgdHlwZQorCWRlZmluaXRpb24gc3R1ZmYgdG8uLi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2ludGVnZXItdHlwZXMuaDogLi4udGhpcyBuZXcgZmlsZS4KKworCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaC5pbjogQ29udHJvbCB0aGUgZGVmaW5pdGlvbiBvZgorCWBGVF9TSVpFT0ZfSU5UJyBhbmQgYEZUX1NJWkVPRl9MT05HJyB3aXRoIG1hY3JvCisJYEZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMnLiAgSWYgdGhlc2UgYXJlIG5vdCBkZWZpbmVkLCBhdXRvCisJZGV0ZWN0aW9uIGhhcHBlbnMgaW4gYGludGVnZXItdHlwZXMuaCcgYXMgdXN1YWwgYmFzZWQgb24gYElOVFhYX01BWCcKKwl2YWx1ZXMuICBPdGhlcndpc2UgdGhlIGF1dG9jb25mLWRldGVjdGVkIHZhbHVlcyBhcmUgdXNlZC4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAoQ1BQRkxBR1MpOiBEb24ndCBpbmNsdWRlIHBhdGggdG8KKwlgY29uZmlnJyBkaXJlY3RvcnkuICBJbnN0ZWFkLCAuLi4KKwkoRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCk6IFVzZSBjb21wbGV0ZSBwYXRoLgorCisyMDIwLTA3LTA1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+CisKKwlbYnVpbGRdIFJlbmFtZSBgYnVpbGQvdW5peC9mdGNvbmZpZy5pbicgdG8gYGZ0Y29uZmlnLmguaW4nLgorCisJU2luY2Ugd2UgYXJlIG5vIGxvbmdlciBsaW1pdGVkIHRvIDguMyBmaWxlIG5hbWVzLCBpdCBpcyBzaW1wbGVyIHRvCisJZm9sbG93IHRoZSB1c3VhbCBjb252ZW50aW9ucyBmb3IgdGVtcGxhdGUgZmlsZXMuCisKKwkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBSZW5hbWVkIHRvLi4uCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5oLmluOiAuLi50aGlzLgorCisJKiBDTWFrZUxpc3RzLnR4dCwgYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogVXBkYXRlZC4KKworMjAyMC0wNy0wMyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Ntb290aF0gSW50cm9kdWNlIGRpcmVjdCBvdmVyc2FtcGxpbmcgZm9yIG92ZXJsYXBzLgorCisJVGhpcyBpbXBsZW1lbnRzIG92ZXJzYW1wbGluZyB0byBtaXRpZ2F0ZSBhcnRpZmFjdHMgaW4gcGl4ZWxzIHBhcnRpYWxseQorCWNvdmVyZWQgYnkgb3ZlcmxhcHBpbmcgY29udG91cnMuICBJdCB0dXJucyBvdXQgdGhhdCB0aGUgNHg0CisJb3ZlcnNhbXBsaW5nIGlzIHN1ZmZpY2llbnQgYnV0LCBhdCBsZWFzdCwgcXVhZHJ1cGxlcyB0aGUgcmVuZGVyaW5nCisJdGltZS4gIFRoZSBvdXRsaW5lIGhhcyB0byBzZXQgRlRfT1VUTElORV9PVkVSTEFQIHRvIHVzZSB0aGlzIG1ldGhvZC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmggKEZUX09VVExJTkVfT1ZFUkxBUCk6IE5ldyBmbGFnLgorCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyKTogQ2hlY2sgaXQgdG8uLi4KKwkoZnRfc21vb3RoX3Jhc3Rlcl9vdmVybGFwKTogLi4uIGluZmxhdGUgb3V0bGluZSBhbmQgc2V0IHVwIGRpcmVjdAorCXJlbmRlcmluZyBmb3Igb3ZlcnNhbXBsaW5nIHdpdGguLi4KKwkoZnRfc21vb3RoX292ZXJsYXBfc3BhbnMpOiAuLi4gbmV3IHNwYW4gZnVuY3Rpb24gdGhhdCBpbnRlZ3JhdGVzIHRoZW0uCisKKzIwMjAtMDctMDMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIFVzZSBkaXJlY3QgcmVuZGVyaW5nIG1vZGUgaW4gSGFybW9ueS4KKworCUluc3RlYWQgb2YgcmVuZGVyaW5nIDMgYml0bWFwcyBzaWRlIGJ5IHNpZGUgYW5kIHJlc2h1ZmZsaW5nLCB3ZSB1c2UKKwlkaXJlY3QgcmVuZGVyaW5nIHRvIGRlbGl2ZXIgdGhlIGJpdG1hcHMgb24gZWFjaCB0aGlyZCBieXRlLgorCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yYXN0ZXJfbGNkKQorCVshRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkddOiBTZXQgdXAgZGlyZWN0IG1vZGUgd2l0aC4uLgorCShmdF9zbW9vdGhfbGNkX3NwYW5zKTogLi4uIG5ldyBzcGFuIGZ1bmN0aW9uLgorCisyMDIwLTA3LTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbc21vb3RoXSBTZXBhcmF0ZSBMQ0QgcGF0aHMgZnJvbSBncmF5IHJlbmRlcmluZy4KKworCVRoaXMgbWFrZXMgYGZ0X3Ntb290aF9yZW5kZXInIGEgbG90IHNtYWxsZXIgYW5kIGVhc2llciB0byBmb2xsb3cuIEl0CisJYWxzbyBjbGVhbmx5IHNlcGFyYXRlcyBIYXJtb255IGFuZCBDbGVhclR5cGUtc3R5bGUgTENEIHJlbmRlcmluZworCWFsZ29yaXRobXMuIE5vdyBJIG9ubHkgd2lzaCB0byBtb3ZlIExDRCBmaWx0ZXJpbmcgYW5kIGdlb21ldHJ5IGZyb20KKwlGVF9MaWJyYXJ5IHRvIEZUX1JlbmRlcmVyLgorCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXIpOiBNb3ZlIExDRCBjb2RlIGZyb20gaGVyZS4uLgorCShmdF9zbW9vdGhfcmFzdGVyX2xjZCwgZnRfc21vb3RoX3Jhc3Rlcl9sY2R2KTogLi4uIHRvIGhlcmUuCisJW0ZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HXTogUmVvcmdhbml6ZSAjaWZkZWYncy4KKworMjAyMC0wNi0yMCAgU2ViYXN0aWFuIFJhc211c3NlbiAgPHNlYnJhc0BnbWFpbC5jb20+CisKKwlbY2ZmXSBGaXggaGFuZGxpbmcgb2YgYHN0eWxlX25hbWUgPT0gTlVMTCcgKCM1ODYzMCkuCisKKwkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogSWYgYSBjYWxsIHRvIGBjZmZfc3RyY3B5JyBmYWlscworCWJ5IHJldHVybmluZyBOVUxMIGluIGBjZmZfZmFjZV9pbml0JywgYHJlbW92ZV9zdHlsZScgaXMgc3RpbGwKKwljYWxsZWQuICBUaGlzIG1lYW5zIHRoYXQgdGhlIE5VTEwgcG9pbnRlciBpcyBkZXJlZmVyZW5jZWQsIGNhdXNpbmcgYQorCWNyYXNoLgorCisyMDIwLTA2LTE5ICBTZWJhc3RpYW4gUmFzbXVzc2VuICA8c2VicmFzQGdtYWlsLmNvbT4KKworCVtjZmZdIEZpeCBhbm90aGVyIHR3byBtZW1vcnkgbGVha3MgKCM1ODYyOSkuCisKKwkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfc2l6ZV9pbml0KTogSWYgYSBjYWxsIHRvIGBmdW5jcy0+Y3JlYXRlJworCWZhaWxzIHRvIGFsbG9jYXRlIG9uZSBvZiB0aGUgYGludGVybmFsLT5zdWJmb250JyB2YXJpYWJsZXMsIG1ha2UKKwlzdXJlIHRvIGZyZWUgYGludGVybmFsLT50b3Bmb250JyBhbmQgYW55IHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQKKwlzdWJmb250cy4KKworMjAyMC0wNi0xOSAgU2ViYXN0aWFuIFJhc211c3NlbiAgPHNlYnJhc0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEZpeCBtZW1vcnkgbGVhayAoIzU4NjI2KS4KKworCSogc3JjL3BzYXV4L3Bzc3RhY2suYyAoY2YyX3N0YWNrX2luaXQpOiBJZiBgY2YyX3N0YWNrX2luaXQnIGZhaWxzIHRvCisJYWxsb2NhdGUgdGhlIHN0YWNrLCByZXR1cm4gZXJyb3IgZWFybHkuCisKKzIwMjAtMDYtMTkgIFNlYmFzdGlhbiBSYXNtdXNzZW4gIDxzZWJyYXNAZ21haWwuY29tPgorCisJW2Jhc2VdIEZpeCBtZW1vcnkgbGVhayAoIzU4NjI0KS4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX05ld19TaXplKTogQXZvaWQgdHJ5aW5nIHRvIGZyZWUKKwlgc2l6ZS0+aW50ZXJuYWwnIHVubGVzcyBgc2l6ZScgaGFzIGJlZW4gYWxsb2NhdGVkLiAgVGhpcyBtaXN0YWtlCisJYXBwZWFyZWQgaW4gdGhlIGZpeCBmb3IgaXNzdWUgIzU4NjExLgorCisyMDIwLTA2LTE5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmFzZV0gUmV3b3JrIGQxMTgwYjVmOTU5OCB1bnRpbCBmdXJ0aGVyIG5vdGljZS4KKworCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IFJlamVjdCBsYXJnZQorCW91dGxpbmVzLgorCisyMDIwLTA2LTE5ICBTZWJhc3RpYW4gUmFzbXVzc2VuICA8c2VicmFzQGdtYWlsLmNvbT4KKworCVtjZmYsIGNpZF0gRml4IHNlZ2ZhdWx0cyBpbiBjYXNlIG9mIGVycm9yICgjNTg2MjEpLgorCisJKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3Nsb3RfZG9uZSksIHNyYy9jaWQvY2lkb2Jqcy5jCisJKGNpZF9zbG90X2RvbmUpOiBJZiBgZnRfZ2x5cGhzbG90X2luaXQnIGZhaWxzIHRvIGFsbG9jYXRlCisJYGludGVybmFsJywgdGhlbiB0aGUgY2xhc3MnIGBkb25lX3Nsb3QnIGNhbGxiYWNrIChjYWxsZWQgYnkKKwlgZnRfZ2x5cGhzbG90X2RvbmUnKSBtdXN0IG5vdCBkZXJlZmVyZW5jZSB0aGUgcG9pbnRlciB0byBgaW50ZXJuYWwnLgorCisyMDIwLTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbYmFzZV0gRml4IFVCU0FOIGVycm9yLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzgyOAorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjMxNjYKIAotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEF2b2lkIGVuZGxlc3MgbG9vcC4KKwkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24pOiBBdm9pZCB2YWx1ZXMKKwlsYXJnZXIgdGhhbiAzMiBiaXRzLgogCi0yMDE4LTA0LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisyMDIwLTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3cgaXNzdWVzLgorCVt3b2ZmMl0gRml4IHNlZ2ZhdWx0LgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzczOQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjM0MDIKIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19DRUlMSU5HKTogVXNlIEZUX1BJWF9DRUlMX0xPTkcuCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKGdldF94X21pbnMpOiBDaGVjayB3aGV0aGVyIGBsb2NhJyB0YWJsZQorCWV4aXN0cy4KIAotMjAxOC0wNC0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAyMC0wNi0xOSAgU3RlcGhlbiBNY0Rvd2VsbCAgPHN2ZW5ldnMuZGV2QGdtYWlsLmNvbT4KIAotCVt0cnVldHlwZV0gSW50ZWdlciBvdmVyZmxvdyBpc3N1ZXMuCisJW3NmbnRdIFN1cHBvcnQgSW50ZWwgY29tcGlsZXJzLgogCi0JUmVwb3J0ZWQgYXMKKwkqIHNyYy9zZm50L3BuZ3NoaW0uYyAocHJlbXVsdGlwbHlfZGF0YSk6IEludGVsIGNvbXBpbGVycyBkbyBub3QKKwljdXJyZW50bHkgc3VwcG9ydCBgX19idWlsdGluX3NodWZmbGUnLgogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD03NzE4CisyMDIwLTA2LTE5ICBTZWJhc3RpYW4gUmFzbXVzc2VuICA8c2VicmFzQGdtYWlsLmNvbT4KIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NSVJQKTogVXNlIEFERF9MT05HLgorCVtiYXNlXSBGaXggbWVtb3J5IGxlYWsgKCM1ODYxMSkuCiAKLTIwMTgtMDQtMTUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9OZXdfU2l6ZSk6IFdoZW4gdGhlIGNhbGwgdG8gYGNsYXp6LT5pbml0X3NpemUnCisJZmFpbHMsIG1ha2Ugc3VyZSB0byBmcmVlIGBzaXplLT5pbnRlcm5hbCcuCiAKLQlbYnVpbGRdIFVzZSBgaW5mbycgZnVuY3Rpb24gb2YgbWFrZSAzLjgxLgorMjAyMC0wNi0xOSAgU2ViYXN0aWFuIFJhc211c3NlbiAgPHNlYnJhc0BnbWFpbC5jb20+CiAKLQkqIGNvbmZpZ3VyZSwgZG9jcy9JTlNUQUxMLCBkb2NzL0lOU1RBTEwuQ1JPU1MsIGRvY3MvSU5TVEFMTC5HTlUsCi0JZG9jcy9JTlNUQUxMLlVOSVgsIGRvY3MvTUFLRVBQOiBCdW1wIG1ha2UgdmVyc2lvbiByZXF1aXJlbWVudHMuCisJW2NmZl0gRml4IG1lbW9yeSBsZWFrICgjNTg2MTApLgogCi0JKiBidWlsZHMvZGV0ZWN0Lm1rIChzdGRfc2V0dXApOiBSZXBsYWNlIGBlY2hvJyB3aXRoIGBpbmZvJy4KLQkoZG9zX3NldHVwKTogUmVtb3ZlZC4KLQkqIGJ1aWxkcy91bml4L2luc3RhbGwubWssIGJ1aWxkcy9tb2R1bGVzLm1rLCBidWlsZHMvZG9zL2RldGVjdC5taywKLQlidWlsZHMvd2luZG93cy9kZXRlY3QubWssIGJ1aWxkcy9vczIvZGV0ZWN0Lm1rOiBVcGRhdGVkLgotCSogYnVpbGRzL25ld2xpbmU6IE5vIGxvbmdlciBuZWVkZWQuCisJKiBzcmMvY2ZmL2NmZm9ianMuYyAoY2ZmX3NpemVfaW5pdCk6IFdoZW4gdGhlIGNhbGwgdG8KKwlgZnVuY3MtPmNyZWF0ZScgZmFpbHMsIG1ha2Ugc3VyZSB0byBmcmVlIGBpbnRlcm5hbCcuCiAKLTIwMTgtMDQtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMjAtMDYtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVt0cnVldHlwZV06IExpbWl0IGBTTE9PUCcgYnl0ZWNvZGUgYXJndW1lbnQgdG8gMTYgYml0cy4KKwkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKTogUmVuYW1lIGB0JyB0byBgdGJsJy4KIAotCVRoaXMgZml4ZXMKKzIwMjAtMDYtMTkgIFNlYmFzdGlhbiBSYXNtdXNzZW4gIDxzZWJyYXNAZ21haWwuY29tPgogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD03NzA3CisJW2NmZl0gRnJlZSB0YWJsZSB1cG9uIGVycm9yIGFsbG9jYXRpbmcgb3RoZXIgZGF0YSAoIzU4NjA5KS4KIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TTE9PUCk6IERvIGl0LgorCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9pbmRleF9nZXRfcG9pbnRlcnMpOiBXaGVuIG5ld19ieXRlcyBmYWlscworCXRvIGFsbG9jYXRlLCBtYWtlIHN1cmUgdG8gZnJlZSB0aGUgdGFibGUuICBEbyB0aGUgc2FtZSBmb3IgYm90aAorCWFsbG9jYXRpb25zIGlmIHRoZXJlIGlzIGEgbGF0ZXIgZXJyb3IuCiAKLTIwMTgtMDQtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMjAtMDYtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVt0cnVldHlwZV0gSW50ZWdlciBvdmVyZmxvdyBpc3N1ZXMuCisJUmVtb3ZlIHJlZHVuZGFudCBpbmNsdXNpb24gb2YgYGZ0MmJ1aWxkLmgnLgogCi0JUmVwb3J0ZWQgYXMKKwkqICovKjogUmVtb3ZlIGAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4nIHdoZXJlIHBvc3NpYmxlLgogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD03NjUyCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IFJlbW92ZSBjcHAgZXJyb3IgYWJvdXQgbWlzc2luZworCWluY2x1c2lvbiBvZiBgZnQyYnVpbGQuaCcuCiAKLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTURBUCk6IFVzZSBTVUJfTE9ORy4KKzIwMjAtMDYtMDggIERhdmlkIFR1cm5lciAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KIAotMjAxOC0wNC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCU1ha2UgbWFjcm9zIGZvciBoZWFkZXIgZmlsZSBuYW1lcyBvcHRpb25hbC4KIAotCVthdXRvZml0XSBVcGRhdGUgdG8gVW5pY29kZSAxMS4wLjAuCisJV2Ugbm8gbG9uZ2VyIGhhdmUgdG8gdGFrZSBjYXJlIG9mIHRoZSA4LjMgZmlsZSBuYW1lIGxpbWl0OyB0aGlzCisJYWxsb3dzIHVzIChhKSB0byBpbnRyb2R1Y2UgbG9uZ2VyLCBtZWFuaW5nZnVsIGZpbGUgbmFtZXMsIGFuZCAoYikgdG8KKwlhdm9pZCBtYWNybyBuYW1lcyBpbiBgI2luY2x1ZGUnIGxpbmVzIGFsdG9nZXRoZXIgc2luY2Ugc29tZQorCWNvbXBpbGVycyAobW9zdCBub3RhYmx5IFZpc3VhbCBDKyspIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIHByb3Blcmx5LgogCi0JQnV0IG5vIHN1cHBvcnQgbmV3IHNjcmlwdHMgKHZvbHVudGVlcnMgd2VsY29tZWQpLgorCSovKjogUmVwbGFjZQogCi0JKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jIChhZl9hcmFiX25vbmJhc2VfdW5pcmFuZ2VzLAotCWFmX2Jlbmdfbm9uYmFzZV91bmlyYW5nZXMsIGFmX2Nha21fbm9uYmFzZV91bmlyYW5nZXMsCi0JYWZfZGV2YV9ub25iYXNlX3VuaXJhbmdlcywgYWZfZ2Vvcl91bmlyYW5nZXMsCi0JYWZfZ3Vqcl9ub25iYXNlX3VuaXJhbmdlcywgYWZfbWx5bV9ub25iYXNlX3VuaXJhbmdlcywKLQlhZl9ua29vX25vbmJhc2VfdW5pcmFuZ2VzLCBhZl90ZWx1X25vbmJhc2VfdW5pcmFuZ2VzLAotCWFmX2hhbmlfdW5pcmFuZ2VzKTogQWRkIG5ldyBkYXRhLgorCSAgICNpbmNsdWRlIEZPT19ICiAKLTIwMTgtMDQtMTAgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KKwl3aXRoCiAKLQkqIENNYWtlTGlzdHMudHh0LCBidWlsZHMvY21ha2UvRmluZEhhcmZCdXp6LmNtYWtlOiBFeHRlbnNpdmUKLQltb2Rlcm5pemF0aW9uIG1lYXN1cmVzLgorCSAgICNpbmNsdWRlIDxmcmVldHlwZS9mb28uaD4KIAotCVRoaXMgYnJpbmdzIHVwIHRoZSBtaW5pbXVtIHJlcXVpcmVkIENNYWtlIHZlcnNpb24gdG8gMi44LjEyLgorCW9yIHNvbWV0aGluZyBzaW1pbGFyLiAgQWxzbyB1cGRhdGUgdGhlIGRvY3VtZW50YXRpb24uCiAKLQlUaGUgaW5zdGFsbGF0aW9uIHBhdGhzIGZvbGxvdyB0aGUgR05VIGRlZmF1bHRzIG5vdywgZS5nLiBpbnN0YWxsaW5nIG9uIGEKLQk2NCBiaXQgaG9zdCB3aWxsIHBsYWNlIGJpbmFyaWVzIGludG8gdGhlIGxpYjY0LyBmb2xkZXIgb24gZS5nLiBGZWRvcmEuCisyMDIwLTA2LTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlTeW1ib2xzIGFyZSBoaWRkZW4gYnkgZGVmYXVsdCAoZS5nLiBgLWZ2aXNpYmlsaXR5PWhpZGRlbicgb24gR0NDKS4KKwkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9mYWNlX2J1aWxkX2NtYXBzKTogVHJhY2UgbnVtYmVyIG9mIGNtYXBzLgogCi0JQ01ha2Ugd2lsbCBubyBsb25nZXIgbG9vayBmb3IgYSBDKysgY29tcGlsZXIuCisyMDIwLTA1LTE4ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+CiAKLQlMaWJyYXJ5IGFuZCAuc28gdmVyc2lvbiBub3cgbWF0Y2ggdGhlIEF1dG90b29scyBidWlsZC4KKwlSZW1vdmUgb2Jzb2xldGUgSEFWRV9TVERJTlRfSCBwcm9iaW5nIG1hY3JvLgogCi0JQ29tbWVudHMgaW4gdGhlIGJ1aWxkIGZpbGUgYW5kIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgbm93IHVzZSBwbGF0Zm9ybQotCWFnbm9zdGljIGV4YW1wbGUgY29tbWFuZHMuCisJVGhpcyBtYWNybyB3YXMgdXBkYXRlZCBieSB0aGUgdW5peCBjb25maWd1cmUgc2NyaXB0IGFuZCB0aGUKKwlgQ01ha2VMaXN0cy50eHQnIG9uZSwgYnV0IGlzIG5ldmVyIHVzZWQgaW4gdGhlIHNvdXJjZSB0cmVlIChub3IgaXMKKwk8c3RkaW50Lmg+IGluY2x1ZGVkIGFueXdoZXJlKS4KIAotCWZ0b3B0aW9uLmggYW5kIGZ0Y29uZmlnLmggYXJlIHdyaXR0ZW4gZGlyZWN0bHkgd2l0aG91dCBhIHJlZHVuZGFudCBgLW5ldycKLQljb3B5LgorCSogQ01ha2VMaXN0cy50eHQsIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluOiBEb24ndCBoYW5kbGUKKwlgSEFWRV9TVERJTlRfSCcuCiAKLQlFeHRlcm5hbCBkZXBlbmRlbmNpZXMgYXJlIGV4cHJlc3NlZCBhcyBvcHRpb24oKXMgYW5kIHdpbGwgdHVybiB1cCBhcyBzdWNoCi0JaW4gY21ha2UtZ3VpLgorMjAyMC0wNS0xOCAgRGF2aWQgVHVybmVyICA8ZGF2aWRAZnJlZXR5cGUub3JnPgogCi0JSW50ZXJuYWw6IFByb3BlcnRpZXMgc3VjaCBhcyBkZXBlbmRlbmNpZXMgYW5kIGluY2x1ZGUgZGlyZWN0b3JpZXMgYXJlIG5vdwotCXByaXZhdGVseSBzZXQgb24gdGhlIGZyZWV0eXBlIGxpYnJhcnkgaW5zdGVhZCBvZiBnbG9iYWxseS4KKwlSZW1vdmUgSmFtZmlsZSBmaWxlcyBmcm9tIHRoZSB0cmVlLgogCi0JVGhlIENQYWNrIGRlZmluaXRpb25zIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB0aGUgYG1ha2UgZGlzdCcgaGFzIGJlZW4KLQlyZW1vdmVkLiBTb3VyY2UgcGFja2FnZXMgZ2VuZXJhdGVkIHdpdGggQ1BhY2sgZG9uJ3QgY29udGFpbiBBdXRvdG9vbHMKLQlmaWxlcyBhbmQgYXJlbid0IHVzZWQgYnkgdGhlIG1haW50YWludGVycyBhbnl3YXkuCisJVGhlc2UgaGF2ZSBub3QgYmVlbiB1c2VkIGluIGEgdmVyeSwgdmVyeSBsb25nIHRpbWUsIHNvIGJldHRlciByZW1vdmUKKwl0aGVtLiAgQSBjb3JyZXNwb25kaW5nIHBhdGNoIHdpbGwgYmUgc3VibWl0dGVkIHRvIHRoZQorCWBmcmVldHlwZTItZGVtb3MnIHJlcG9zaXRvcnkuCiAKLQlPbiBXaW5kb3dzLCBzcmMvYmFzZS9mdHZlci5yYyBpcyBjb21waWxlZCB0byBkZWNvcmF0ZSB0aGUgbGlicmFyeSB3aXRoCi0JdmVyc2lvbiBhbmQgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCSogc3JjL0phbWZpbGUsIHNyYy8qL0phbWZpbGUsIEphbXJ1bGVzOiBEZWxldGUuCiAKLQlBIHBrZy1jb25maWcgZmlsZSBpcyBub3cgZ2VuZXJhdGVkIGFuZCBpbnN0YWxsZWQuCisyMDIwLTA1LTEyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLTIwMTgtMDQtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKwlbc21vb3RoXSBUdXJuIG9uIExDRCBmaWx0ZXJpbmcgZHVyaW5nIEZyZWVUeXBlIGluaXRpYWxpemF0aW9uLgogCi0JW3RydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93IGlzc3Vlcy4KKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX2luaXQpOiBFbmFibGUgTENEIGZpbHRlcmluZy4KIAotCVJlcG9ydGVkIGFzCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmg6IERvY3VtZW50IGl0LCByZW1vdmUgcGF0ZW50IHdhcm5pbmdzLgorCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9SZW5kZXJfTW9kZSk6IFVwZGF0ZWQuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oLCBkZXZlbC9mdG9wdGlvbi5oCisJW0ZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HXTogRG8gbm90IG1lbnRpb24gcGF0ZW50cy4KIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzQ1MworMjAyMC0wNS0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUm91bmRfU3VwZXIsIFJvdW5kX1N1cGVyXzQ1KTogVXNlCi0JQUREX0xPTkcgYW5kIFNVQl9MT05HLgorCVtzbW9vdGhdIFN0b3AgdXNpbmcgZGVkaWNhdGVkIExDRCBtb2R1bGVzIGFuZCBjbGFzc2VzLgogCi0yMDE4LTA0LTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJVGhlIExDRCBtb2R1bGVzIHdlcmUgbmV2ZXIgdHJ1bHkgaW5kZXBlbmRlbnQuIFRoZXkgbW9zdGx5IHNlcnZlZCBhcworCWEgd2F5IHRvIGRpc2FibGUgcGF0ZW50ZWQgTENEIHJlbmRlcmluZywgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4KKwlUaGUgYHNtb290aCcgbW9kdWxlIG5vdyBoYW5kbGVzIExDRCBtb2RlcyBhcyB3ZWxsLgogCi0JW3dpbmRvd3MsIHdpbmNlXSBDbGVhbiB1cCBsZWdhY3kgcHJvamVjdCBmaWxlcy4KKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcy4KKwlmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyk6IERlbGV0ZWQuCisJKGZ0X3JlbmRlcl9zbW9vdGgpOiBSZXdvcmtlZCBmcm9tIGBmdF9yZW5kZXJfc21vb3RoX2dlbmVyaWMnLgorCSogc3JjL3Ntb290aC9mdHNtb290aC5oOiBSZW1vdmUgZGVkaWNhdGVkIExDRCBjbGFzc2VzLgorCSogc3JjL3Ntb290aC9tb2R1bGUubWs6IFJlbW92ZSBkZWRpY2F0ZWQgTENEIG1vZHVsZXMuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oOiBEaXR0by4KKwkqIGJ1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oOiBEaXR0by4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaDogRG8gbm90IG1lbnRpb24gTENEIG1vZHVsZXMuCisKKzIwMjAtMDUtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogVmVyc2lvbiAyLjEwLjIgcmVsZWFzZWQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisJVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMTAtMicuCisKKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjEwLjIuCisKKwkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgc3JjL2Jhc2UvZnR2ZXIucmMsCisJYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsIGJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWwsIGRvY3MvZnJlZXR5cGUtY29uZmlnLjE6CisJcy8yLjEwLjEvMi4xMC4yLywgcy8yMTAxLzIxMDIvLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX1BBVENIKTogU2V0IHRvIDIuCisKKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKHZlcnNpb25faW5mbyk6IFNldCB0byAyMzoyOjE3LgorCSogQ01ha2VMaXN0cy50eHQgKFZFUlNJT05fUEFUQ0gpOiBTZXQgdG8gMi4KKworCSogZG9jcy9DSEFOR0VTOiBVcGRhdGVkLgorCisyMDIwLTA1LTA4ICBKYWt1YiBBbGJhICA8amFsYmFAdmV3ZC5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChUVF9SdW5JbnMpOiBBZGp1c3QgbG9vcCBjb3VudGVyICgjNTgzMTkpLgorCisJVGhlIGZvbnQgdGhhdCBleGNlZWRzIHRoZSBvbGQgbGltaXQgaXMgSWNvbm8gUmVndWxhciwgdmVyc2lvbgorCTEuMDAwMDAuCisKKzIwMjAtMDUtMDMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiBSZWZhY3RvciBmb3IgcmVhZGFiaWxpdHkuCisKKzIwMjAtMDUtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtidWlsZHNdIENsZWFuIHVwIFdpbmRvd3MgQ0UgcHJvamVjdCBmaWxlcy4KKworCVJlbW92ZSB2ZXJzaW9uIGZyb20gZmlsZW5hbWVzIHRoYXQgY2F1c2VkIGEgbG90IG9mIHBvbHV0aW9uIGluIHRoZQorCXJlbGVhc2UgcHJvY2Vzcy4gVXNlIFZFUlNJT05JTkZPIHJlc291cmNlIGluc3RlYWQuCiAKIAkqIGJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAogCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKIAlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwOiBSZW1vdmUgcGVyLWZpbGUgY29tcGlsZSBmbGFncy4KKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3A6IHMvMjEwMS8vZywgYnV0IGFkZCBgZnR2ZXIucmMnLgorCSogYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sOiBzLzIxMDEvL2cuCiAKLTIwMTgtMDQtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMjAtMDUtMDEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCVtjZmYsIHR5cGUxXSBTYW5pdGl6ZSBgQmx1ZUZ1enonIGFuZCBgQmx1ZVNoaWZ0Jy4KKwkqIGRldmVsL2Z0MmJ1aWxkLmg6IE92ZXJyaWRlIEZUX0NPTkZJR19NT0RVTEVTX0ggaGVyZSBhcyB3ZWxsLgorCisyMDIwLTA1LTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYnVpbGRzL3VuaXhdIENvbnNvbGlkYXRlIG1hcmNvIG92ZXJyaWRlcyAoZm9yIHRoZSBkZW1vcyB0byBzZWUgdGhlbSkuCisKKwkqIGJ1aWxkcy91bml4L3VuaXgtY2MuaW4gKEZUX0NPTkZJR19NT0RVTEVTX0gsIEZUX0NPTkZJR19PUFRJT05TX0gpOgorCU92ZXJyaWRlIHRoZW0gaGVyZS4uLgorCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiAuLi4gaW5zdGVhZCBvZiBoZXJlLgorCisyMDIwLTA0LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBbGxvdyBzZXR0aW5nIGBDQycgaW4gVW5peCBidWlsZCAoIzU4MDUxKS4KKworCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbiAoQ0MpOiBVc2UgYG92ZXJyaWRlJy4gIFRoZSBjb21tYW5kIGxpbmUKKwkgIHZhbHVlIG9mIGBDQycgKGlmIGFueSkgaXMgc3RvcmVkIGFscmVhZHkgaW4gYENDcmF3Jy4KKworMjAyMC0wNC0wNCAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBSZXR1cm4gaWYgc2luZ2xlIHN0cmVhbSBvcGVyYXRpb24gZmFpbHMuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoZ2V0X3hfbWlucyk6IERvIGl0LgorCisJKiBzcmMvc2ZudC93b2ZmMnRhZ3MuYzogUmVtb3ZlIHVudXNlZCBpbmNsdWRlLgorCisyMDIwLTAzLTIyICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbZG9jc10gRml4IGJ1aWxkaW5nIGRvY3MgaWYgYHNyY2RpcicgIT0gYGJ1aWxkZGlyJy4KKworCWBkb2NzL3JlZmVyZW5jZS8qJyB3YXMgbW92ZWQgb25lIGRpcmVjdG9yeSB1cCBpbiBjb21taXQgMjM3ZmVkNi4KKworCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKFBJUCk6IFJlbW92ZSB2YXJpYWJsZS4KKworCSogY29uZmlndXJlOiBDcmVhdGUgYGRvY3MnIGRpcmVjdG9yeSBhbmQgY29weSBhc3NldHMgZnJvbQorCWBkb2NzL21hcmtkb3duJy4KKworCSogZG9jcy9SRUFETUU6IE91dHB1dCBkaXJlY3RvcnkgaXMgYHJlZmVyZW5jZScuCisKKzIwMjAtMDMtMjEgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVtkb2N3cml0ZXJdIERyb3Agc3VwcG9ydCBmb3IgUHl0aG9uIDwgMy41LgorCisJUHl0aG9uIHZlcnNpb25zIDwgMy41IGhhdmUgcmVhY2hlZCBlbmQtb2YtbGlmZSBhbmQgYXMgc3VjaCwgbm8KKwlzZWN1cml0eSBvciBidWcgZml4ZXMgd2lsbCBiZSBwcm92aWRlZCBmb3IgdGhvc2UgdmVyc2lvbnMuICBTZWUKKworCSAgaHR0cHM6Ly9kZXZndWlkZS5weXRob24ub3JnLyNzdGF0dXMtb2YtcHl0aG9uLWJyYW5jaGVzCisJCisJZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKwkqIEphbWZpbGUgKFJlZkRvYyk6IEFkZCBgc2l0ZScgcGFyYW1ldGVyLgorCisJKiBidWlsZHMvZGV0ZWN0Lm1rIChzdGRfc2V0dXApOiBVcGRhdGUgUHl0aG9uIHZlcnNpb24gcmVxdWlyZW1lbnQuCisKKwkqIGJ1aWxkcy9mcmVldHlwZS5tayAocmVmZG9jLXZlbnYpOiBVc2UgcGlwIGFzIGBweXRob24gLW0gcGlwJy4KKworCSogYnVpbGRzL3VuaXgvYXhfY29tcGFyZV92ZXJzaW9uLm00LAorCWJ1aWxkcy91bml4L2F4X3Byb2dfcHl0aG9uX3ZlcnNpb24ubTQ6IE1hY3JvcyB0byBkZXRlY3QgUHl0aG9uCisJdmVyc2lvbi4gIE5ldyBmaWxlcy4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQ2hlY2sgZm9yIFB5dGhvbiA+PSAzLjUgYW5kIHJlbW92ZQorCWNoZWNrIGZvciBgcGlwJy4KKworCSogZG9jcy9DSEFOR0VTLCBkb2NzL0lOU1RBTEwuR05VLCBkb2NzL1JFQURNRTogVXBkYXRlZC4KKworMjAyMC0wMy0wMiAgTW9hemluIEtoYXR0aSAgPG1vYXppbmtoYXRyaUBnbWFpbC5jb20+CisKKwlbZ3ppcF0gU3VwcG9ydCBgZ3ppcCcgZW5jb2RlZCBoZWFkZXIgY29uZGl0aW9uYWxseS4KKworCUluIG9yZGVyIHRvIHN1cHBvcnQgYGd6aXAnIGVuY29kZWQgaGVhZGVyIHRoZSBjYWxsIHRvCisJYGluZmxhdGVJbml0Micgd2FzIG1vZGlmaWVkIGluIGNvbW1pdCA2YTkyYjFmYWRkZTI2NDc3YTkxNzkuCisJSG93ZXZlciwgdGhpcyBjb2RlIGJyZWFrcyB3aXRoIHRoZSBvdXRkYXRlZCBpbnRlcm5hbCB2ZXJzaW9uCisJb2YgemxpYi4gIFRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IHRvIGNvbmRpdGlvbmFsbHkgc3VwcG9ydAorCWBnemlwJyBlbmNvZGVkIGhlYWRlciB3aGVuZXZlciBhIHN5c3RlbSBpbnN0YWxsYXRpb24gb2YgemxpYgorCWlzIGJlaW5nIHVzZWQuCisKKwlQcm9ibGVtIHJlcG9ydCBpbgorCisJICBodHRwczovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMjAtMDIvbXNnMDAwMjMuaHRtbAorCisJKiBzcmMvZ3ppcC9mdGd6aXAuYyAoRlRfR3ppcF9VbmNvbXByZXNzKTogQ2hhbmdlIHRoZSB0aGUgY2FsbCB0bworCWBpbmZsYXRlSW5pdDInIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzeXN0ZW0gaW5zdGFsbGF0aW9uIGlzCisJYmVpbmcgdXNlZCBvciB0aGUgaW50ZXJuYWwgY29weS4KKworMjAyMC0wMi0yOSAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbdHJ1ZXR5cGVdIEZpeCBzdGF0ZSBvZiBgRlRfRmFjZScgZm9yIGJ1Z2d5IGBndmFyJyB0YWJsZXMgKCM1NzkyMykuCisKKwlCeSByZXNldHRpbmcgdGhlIGJsZW5kIGFzIGltcGxlbWVudGVkIHdpdGggdGhpcyBjb21taXQgZm9udHMgd2l0aAorCWludmFsaWQgYGd2YXInIHRhYmxlcyBtYXkga2VlcCBjYWxsaW5nIGludG8gYGZ0X3Zhcl9sb2FkX2d2YXInIGZyb20KKwlgdHRfc2V0X21tX2JsZW5kJyBhbmQgZmFpbGluZywgYnV0IHRoZSBmb250IHdhcyBpbnZhbGlkIGFueXdheSBhbmQKKwl3ZSB3YW50IHRvIGtlZXAgc2VlaW5nIHRoZSBmYWlsdXJlIGluIGB0dF9zZXRfbW1fYmxlbmQnLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9ndmFyKTogQ2FsY3VsYXRlIGxlbmd0aCBvZgorCW9mZnNldCBhcnJheSBvbmNlLgorCUFsbG9jYXRlIGFycmF5cyBhZnRlciBgRlRfRlJBTUVfRU5URVInIChleHRyYSBjaGVjayBiZWZvcmUKKwlhbGxvY2F0aW5nIGFuZCBhdm9pZCBuZWVkaW5nIHRvIGZyZWUgYXJyYXkgbGF0ZXIgaWYgZXJyb3IgZW50ZXJpbmcKKwlmcmFtZSkuCisJQWx3YXlzIGNhbGwgYEZUX0ZSQU1FX0VYSVQnLgorCUNvbnNpc3RlbnRseSBzZXQgY291bnRzIGltbWVkaWF0ZWx5IGFmdGVyIGFycmF5IGluaXRpYWxpemVkLgorCVJlc2V0IHRoZSBibGVuZCAocGFydGljdWxhcmx5IGBibGVuZC0+Z2x5cGhvZmZzZXRzJykgb24gZmFpbHVyZS4KKworMjAyMC0wMy0wMSAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW2RvY3NdIFVwZGF0ZSBkb2N3cml0ZXIgc3R5bGVzaGVldC4KKworCVRoaXMgY2hhbmdlIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgZG9jd3JpdGVyIDEuMi4xLgorCisJU2VlCisKKwkgIGh0dHBzOi8vZ2l0aHViLmNvbS9mcmVldHlwZS9kb2N3cml0ZXIvaXNzdWVzLzM2CisKKwlmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCSogZG9jcy9tYXJrZG93bi9zdHlsZXNoZWV0cy9leHRyYS5jc3M6CisJKC5tZC10eXBlc2V0IGNvZGUpIC0+ICgubWQtdHlwZXNldCBwcmU+Y29kZSkKKwkocHJlKSAtPiAocHJlPmNvZGUpCisJKHAsIC5tZC10eXBlc2V0IHAsIGg0KTogUmVtb3ZlIGNvbW1lbnRlZCBzdHlsZXMuCisJKHRhYmxlLmluZGV4KTogUmVtb3ZlIHVudXNlZCBzdHlsZXMuCisKKzIwMjAtMDItMjggIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCisJW3RydWV0eXBlXSBBZGQgYmV0dGVyIGNoZWNrcyBmb3IgbG9hZGluZyBgZ3ZhcicgdGFibGUgKCM1NzkwNSkuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9sb2FkX2d2YXIpOiBEZWxheSBzZXR0aW5ncyBvZiBhbnkKKwlgYmxlbmQtPnh4eGNvdW50JyB2YWx1ZXMgdW50aWwgdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBoYXMgYmVlbgorCWNoZWNrZWQuCisJQWxzbyBkbyBzb21lIHNhbml0aXppbmcgdG8gYXZvaWQgYSB0b28gZWFybHkgZXhpdC4KKworCShUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEltcHJvdmUgdHJhY2luZyBtZXNzYWdlLgorCisyMDIwLTAyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlNYWtlIGBGVF9IQVNfKicgYW5kIGBGVF9JU18qJyByZWFsbHkgcmV0dXJuIHRydWUgKCM1NzkwNikuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfSEFTXyosIEZUX0lTXyopOiBJbXBsZW1lbnQgaXQuCisKKzIwMjAtMDItMjUgIERvbWluaWsgUsO2dHRzY2hlcyAgPGRyb3R0QGNocm9taXVtLm9yZz4KKworCUZpeCBmb3IgQ0ZGIHNwYWNlIGdseXBoIHJlZ3Jlc3Npb24gKCM1NzU0MSkuCisKKwkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9kZWNvZGVyX3BhcnNlX3N1YnN0cmluZ3MpOiBSZXBsYWNlIGVhcmx5LW91dAorCSAgd2l0aCBGVF9PRkZTRVQuCisKKzIwMjAtMDItMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt3b2ZmMl0gRml4IGZvbnQgdGFibGUgYWNjZXNzLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzM3MQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MjA3NzgKIAotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9sb2FkX3ByaXZhdGVfZGljdCk6IFNhbml0aXplCi0JYHByaXYtPmJsdWVfc2hpZnQnIGFuZCBgcHJpdi0+Ymx1ZV9mdXp6JyB0byBhdm9pZCBvdmVyZmxvd3MgbGF0ZXIKLQlvbi4KKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoZ2V0X3hfbWlucyk6IEV4cGxpY2l0bHkgY2hlY2sgZm9yIHByZXNlbmNlIG9mCisJYGhlYWQnIHRhYmxlLCB3aGljaCBtaWdodCBub3QgaGF2ZSBiZWVuIHByb2Nlc3NlZCB5ZXQuCiAKLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfT3Blbl9GYWNlKTogRGl0dG8uCisyMDIwLTAyLTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTgtMDQtMDQgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCVtwc2F1eF0gTWFrZSBgdDFfZGVjb2Rlcl9wYXJzZV9tZXRyaWNzJyBoYW5kbGUgYG9wX2RpdicgKCM1NzUxOSkuCiAKLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHJpY2tfbmFtZXMpOiBBZGQgMyB0cmlja3kgZm9udHMgKCM1MzU1NCksCi0JYERGSGVpLU1kLUhLLUJGJywgYERGS2FpU2h1LU1kLUhLLUJGJyBhbmQgYERGTWluZy1CZC1ISy1CRicuCi0JKHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMpOiBBZGQgY2hlY2tzdW1zIGZvciAzIHRyaWNreSBmb250cwotCWluIGFib3ZlLgorCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfcGFyc2VfbWV0cmljcyk6IENvcHkKKwljb3JyZXNwb25kaW5nIGNvZGUgZnJvbSBvbGQgZW5naW5lJ3MgYHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MnCisJZnVuY3Rpb24uCiAKLTIwMTgtMDQtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMjAtMDItMTkgIE5pa29sYXVzIFdheHdlaWxlciAgPG5pa29sYXVzLndheHdlaWxlckBkYWx0b25tYWFnLmNvbT4KIAotCSogYnVpbGRzL3RvcGxldmVsLm1rICh3b3JrKTogVXNlICQoU0VQKS4KKwlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIEhhbmlmaSBSb2hpbmd5YSBzY3JpcHQuCiAKLQlUaGlzIGZpeGVzIHRoZSBgbWFrZSByZWZkb2MnIHVzaW5nIEN5Z3dpbjogJChDQVQpIGlzIGB0eXBlJyBvbiB0aGlzCi0JcGxhdGZvcm0sIGFuZCB0aGlzIHByb2dyYW0gb25seSB1bmRlcnN0YW5kcyBiYWNrc2xhc2hlcyBpbiBwYXRocy4KKwkqIHNyYy9hdXRvZml0L2FmYmx1ZS5kYXQ6IEFkZCBibHVlIHpvbmUgZGF0YSBmb3IgSGFuaWZpIFJvaGluZ3lhLgorCSogc3JjL2F1dG9maXQvYWZibHVlLmMsIHNyYy9hdXRvZml0L2FmYmx1ZS5oOiBSZWdlbmVyYXRlZC4KIAotCVJlcG9ydGVkIGJ5IE5pa2hpbCBSYW1ha3Jpc2huYW4gPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPi4KKwkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBIYW5pZmkgUm9oaW5neWEgc3RhbmRhcmQgY2hhcmFjdGVyLgogCi0yMDE4LTAzLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYXV0b2ZpdC9hZnJhbmdlcy5jLCBzcmMvYXV0b2ZpdC9hZnN0eWxlcy5oOiBBZGQgSGFuaWZpCisJICBSb2hpbmd5YSBkYXRhLgogCi0JW3RydWV0eXBlXSBGaXggbWVtb3J5IGxlYWsgKG9ubHkgaWYgdHJhY2luZyBpcyBvbikuCisyMDIwLTAyLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpIFtGVF9ERUJVR19MRVZFTF9UUkFDRX06IEZpeAotCWl0LgorCVJlcXVpcmUgSGFyZkJ1enogMS44LgogCi0yMDE4LTAzLTIzICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ29vZ2xlLmNvbT4KKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcsIENNYWtlTGlzdHMudHh0OiBSZXF1ZXN0IEhhcmZCdXp6IDEuOC4wCisJb3IgbmV3ZXIuCiAKLQlbc2ZudF0gQ29ycmVjdGx5IGhhbmRsZSBtaXNzaW5nIGJpdG1hcHMgaW4gc2JpeCBmb3JtYXQgKCM1MzQwNCkuCisJV2UgYXJlIGdvaW5nIHRvIGFkZCBhdXRvLWhpbnRlciBzdXBwb3J0IGZvciBIYW5pZmkgUm9oaW5neWEsIHdoaWNoCisJd2FzIGludHJvZHVjZWQgaW4gVW5pY29kZSAxMS4wLgogCi0JKiBzcmMvc2ZudC90dGZzYml0LmMgKHR0X2ZhY2VfbG9hZF9zYml4X2ltYWdlKTogRml4IHJldHVybiB2YWx1ZS4KKzIwMjAtMDItMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxOC0wMy0yMyAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisJKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IElnbm9yZSB2ZXJzaW9uICgjNTc3MDgpLgogCi0JW3RydWV0eXBlXSBGaXggYWR2YW5jZSBvZiBlbXB0eSBnbHlwaHMgaW4gYml0bWFwIGZvbnRzICgjNTMzOTMpLgorMjAyMC0wMi0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogQXBwbHkgc2NhbGluZyB0byBtZXRyaWNzCi0JZm9yIGVtcHR5IGJpdG1hcHMuCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogQWRqdXN0IGxvb3AgY291bnRlciAoIzU3NzMyKS4KIAotMjAxOC0wMy0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCVRoZSBmb250IHRoYXQgZXhjZWVkcyB0aGUgb2xkIGxpbWl0IGlzIENvbnN0YW50aW5lLCB2ZXJzaW9uIDEuMDAxLgogCi0JUmVtb3ZlIGBmdGxjZGZpbC5jJyBhbmQgYGZ0Zm50Zm10LmMnIGZyb20gYnVpbGQgZmlsZXMgKCM1MzQxNSkuCisyMDIwLTAxLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlidWlsZHMvYW1pZ2EvbWFrZWZpbGUsIGJ1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQsCi0JYnVpbGRzL2FtaWdhL3NtYWtlZmlsZSwgYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2NmbS5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLm02OGtfZmFyLm1ha2UudHh0LAotCWJ1aWxkcy9tYWMvRnJlZVR5cGUucHBjX2NhcmJvbi5tYWtlLnR4dCwKLQlidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jbGFzc2ljLm1ha2UudHh0LAotCWJ1aWxkcy9zeW1iaWFuL2ZyZWV0eXBlLm1tcCwgYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwKLQlidWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLmZpbHRlcnMsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwLAotCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvaiwgdm1zX21ha2UuY29tOiBEbyBpdC4KKwlbYmFzZV0gRml4IGBGUkVFVFlQRV9QUk9QRVJUSUVTPXR5cGUxOmhpbnRpbmctZW5naW5lPWFkb2JlYC4KIAotMjAxOC0wMy0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCSogc3JjL2Jhc2UvZnRwc3Byb3AuYyAocHNfcHJvcGVydHlfc2V0KSBbaGludGluZy1lbmdpbmVdOiBBdm9pZCBhbgorCWluY29ycmVjdCByZXR1cm4gdmFsdWUgdGhhdCBjYXVzZWQgYSB3YXJuaW5nLiAgVGhlIGZ1bmN0aW9uIGRpZCB0aGUKKwlyaWdodCB0aGluZywgdGhvdWdoLgogCi0JKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDJfdmFsaWRhdGUpOiBGaXggcG90ZW50aWFsIG51bWVyaWMKLQlvdmVyZmxvdy4KKzIwMjAtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxOC0wMy0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGNtYXAgZm9ybWF0IDIgaGFuZGxpbmcgKCM1MzMyMCkuCi0KLQlUaGUgcGF0Y2ggaW50cm9kdWNlZCBmb3IgIzUyNjQ2IHdhcyBub3QgY29ycmVjdC4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEFkanVzdCBjb25kaXRpb24uCi0KLTIwMTgtMDMtMTAgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KLQotCSogQ01ha2VMaXN0cy50eHQgKEJBU0VfU1JDUyk6IFVwZGF0ZSB0byBjaGFuZ2VzIGZyb20gMjAxOC0wMy0wNS4KLQotMjAxOC0wMy0wOSAgQ2h1bi13ZWkgRmFuICA8ZmFuYzk5OUB5YWhvby5jb20udHc+Ci0KLQkqIENNYWtlTGlzdHMudHh0IFt3aW4zMl06IEFsbG93IE1TVkMgRExMIGJ1aWxkcyAoIzUzMjg3KS4KLQotCURvIG5vdCBsaW1pdCBETEwgYnVpbGRzIHRvIE1pbkdXLCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUKLQlgX19kZWNsc3BlYyhkbGxleHBvcnQpJyBkaXJlY3RpdmVzIGluIGBmdGNvbmZpZy5oJy4KLQlBbHNvIHN1cHByZXNzIG1vcmUgd2FybmluZ3MgZm9yIFBPU0lYIGZ1bmN0aW9ucy4KLQotMjAxOC0wMy0wOCAgSHVnaCBNY01hc3RlciAgPGh1Z2gubWNtYXN0ZXJAb3V0bG9vay5jb20+Ci0KLQlNYWtlIGluc3RhbGxhdGlvbiBvZiBgZnJlZXR5cGUtY29uZmlnJyBvcHRpb25hbCAoIzUzMDkzKS4KLQotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQWRkIG9wdGlvbiBgLS1lbmFibGUtZnJlZXR5cGUtY29uZmlnJwotCWFuZCBzZXQgYElOU1RBTExfRlQyX0NPTkZJRycuCi0JKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoSU5TVEFMTF9GVDJfQ09ORklHKTogRGVmaW5lLgotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoaW5zdGFsbCk6IEhhbmRsZSBpdC4KLQotMjAxOC0wMy0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBgZnRsY2RmaWwuYycgcGFydCBvZiB0aGUgYGJhc2UnIG1vZHVsZS4KLQotCWBmdG9ianMuYycgbmVlZHMgYGZ0X2xjZF9wYWRkaW5nJy4KLQotCVByb2JsZW0gcmVwb3J0ZWQgYnkgZHVodWFucGVuZyA8NTQ4NzA4ODgwQHFxLmNvbT4uCi0KLQkqIG1vZHVsZXMuY2ZnIChCQVNFX0VYVEVOU0lPTlMpOiBEb24ndCBpbmNsdWRlIGBmdGxjZGZpbC5jJy4KLQotCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEluY2x1ZGUgYGZ0bGNkZmlsLmMnLgotCSogc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfU1JDKTogQWRkIGBmdGxjZGZpbC5jJy4KLQkqIHNyYy9iYXNlL0phbWZpbGUgKF9zb3VyY2VzKTogQWRqdXN0ZWQuCi0KLQkqIGRvY3MvSU5TVEFMTC5BTlk6IFVwZGF0ZWQuCi0KLTIwMTgtMDMtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgYGZ0Zm50Zm10LmMnIHBhcnQgb2YgdGhlIGBiYXNlJyBtb2R1bGUuCi0KLQlgZnRvYmpzLmMnIG5lZWRzIGBGVF9HZXRfRm9udF9Gb3JtYXQnLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBkdWh1YW5wZW5nIDw1NDg3MDg4ODBAcXEuY29tPi4KLQotCSogbW9kdWxlcy5jZmcgKEJBU0VfRVhURU5TSU9OUyk6IERvbid0IGluY2x1ZGUgYGZ0Zm50Zm10LmMnLgotCi0JKiBzcmMvYmFzZS9mdGJhc2UuYzogSW5jbHVkZSBgZnRmbnRmbXQuYycuCi0JKiBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpOiBBZGQgYGZ0Zm50Zm10LmMnLgotCSogc3JjL2Jhc2UvSmFtZmlsZSAoX3NvdXJjZXMpOiBBZGp1c3RlZC4KLQotCSogZG9jcy9JTlNUQUxMLkFOWTogVXBkYXRlZC4KLQotMjAxOC0wMy0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogRml4IHRyYWNpbmcgYXJndW1lbnRzLgotCi0yMDE4LTAyLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IE5lZWQgSGFyZkJ1enogMS4zLjAgb3IgbmV3ZXIuCi0KLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEFsYW4gQ29vcGVyc21pdGggPGFsYW4uY29vcGVyc21pdGhAb3JhY2xlLmNvbT4uCi0KLTIwMTgtMDItMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVtzZm50XSBQcmVmZXIgYENCRFQnL2BDQkxDJyBvdmVyIGBnbHlmJyB0YWJsZSAoIzUzMTU0KS4KLQotMjAxOC0wMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93IGlzc3Vlcy4KKwlbd29mZjJdIEZpeCBtZW1vcnkgbGVha3MgYW5kIGEgcnVudGltZSB3YXJuaW5nLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NjAyNworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTk3NzMKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE4MTAxCiAKLQkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTVNJUlAsIEluc19NSUFQLCBJbnNfTUlSUCk6IFVzZQotCVNVQl9MT05HOyBhdm9pZCBGVF9BQlMuCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKGNvbXB1dGVfVUxvbmdfc3VtKTogQWRkIG1pc3NpbmcgY2FzdC4KKwkocmVjb25zdHJ1Y3RfaG10eCk6IEFkZCBtaXNzaW5nIGRlYWxsb2NhdGlvbiBjYWxscy4KIAotMjAxOC0wMi0wNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorMjAyMC0wMS0wMiAgRG9taW5payBSw7Z0dHNjaGVzICA8ZHJvdHRAY2hyb21pdW0ub3JnPgogCi0JW3VuaXhdIFVzZSAtZnZpc2liaWxpdHk9aGlkZGVuLgorCVt0cnVldHlwZV0gRml4IFVCU2FuIHdhcm5pbmcgb24gb2Zmc2V0IHRvIG51bGxwdHIgKCM1NzUwMSkuCiAKLQlJdCBpcyBub3cgd2lkZWx5IHJlY29tbWVuZGVkIHRoYXQgRUxGIHNoYXJlZCBsaWJyYXJpZXMgaGlkZSBzeW1ib2xzCi0JZXhjZXB0IHRob3NlIHdpdGggZXhwbGljaXQgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkuCi0JVGhpcyBpcyBzdXBwb3J0ZWQgYnkgYWxsIG1ham9yIGNvbXBpbGVycyBhbmQgc2hvdWxkIHJhdGhlciBiZSBhbgotCW9wdGlvbiBpbiBsaWJ0b29sLgorCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19DQUxMKTogRmFpbCBpZiBgZXhjLT5GRGVmcycgaXMgbnVsbC4KIAotCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQWRkIC1mdmlzaWJpbGl0eT1oaWRkZW4gdG8gQ0ZMQUdTLgotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW4sIGJ1aWxkcy92bXMvZnRjb25maWcuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9FWFBPUlQpOiBVc2UgdmlzaWJpbGl0eQotCWF0dHJpYnV0ZS4KKzIwMTktMTItMzEgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KIAotMjAxOC0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCVt3b2ZmMl0gQWxsb3cgYml0bWFwLW9ubHkgZm9udHMgKCM1NzM5NCkuCiAKLQlbdHJ1ZXR5cGVdIEJldHRlciBwcm90ZWN0aW9uIGFnYWluc3QgaW52YWxpZCBWRiBkYXRhLgorCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChyZWNvbnN0cnVjdF9mb250KTogRml4IHRlc3QgZm9yIGBnbHlmJyBhbmQKKwlgbG9jYScgdGFibGVzLgorCisyMDE5LTEyLTIxICBIdWdoIE1jTWFzdGVyICA8aHVnaC5tY21hc3RlckBvdXRsb29rLmNvbT4KKworCVtkb2NzXSAoMi8yKSBGaXggZ2VuZXJhdGlvbiBvZiBBUEkgZG9jdW1lbnRhdGlvbiAoIzU2NzQ1KS4KKworCUNyZWF0aW5nIHRoZSBBUEkgUmVmZXJlbmNlIGluIHRoZSAobmV3KSBgcmVmZXJlbmNlJyBzdWItZGlyZWN0b3J5IGlzCisJY29uc2lzdGVudCB3aXRoIG90aGVyIGRvY3VtZW50YXRpb24gc3ViLXRvcGljcywgc3VjaCBhcyBgZGVzaWduJywKKwlgZ2x5cGhzJyBhbmQgYHR1dG9yaWFsJy4KKworCVRoaXMgcGF0Y2ggZml4ZXMgYnJva2VuIGh5cGVybGlua3MgaW4gdGhlIGRvY3VtZW50YXRpb24gcG9pbnRpbmcgdG8KKwlhbmQgZnJvbSB0aGUgQVBJIFJlZmVyZW5jZS4gIEl0IGFsc28gYWxsb3dzIHdlYiBhc3NldHMgdG8gbG9hZCBmcm9tCisJdGhlaXIgcmVsYXRpdmUgcGF0aHMuCisKKwkqIGJ1aWxkcy9mcmVldHlwZS5tayAoRE9DX0RJUik6IEFkanVzdC4KKwkocmVmZG9jLCByZWZkb2MtdmVudik6IEFkZCBgLS1zaXRlJyBhcmd1bWVudC4KKworCSogYnVpbGRzL3RvcGxldmVsLm1rIChkby1kaXN0KTogVXBkYXRlZC4KKworMjAxOS0xMi0yMSAgSHVnaCBNY01hc3RlciAgPGh1Z2gubWNtYXN0ZXJAb3V0bG9vay5jb20+CisKKwlbZG9jc10gKDEvMikgTW92ZSBzdGF0aWMgd2ViIGFzc2V0cyAoIzU2NzQ1KS4KKworCSogZG9jcy9yZWZlcmVuY2UvKjogTW92ZSAuLi4KKwkqIGRvY3M6IC4uLiBvbmUgZGlyZWN0b3J5IHVwLgorCisyMDE5LTEyLTIxICBEb21pbmlrIFLDtnR0c2NoZXMgIDxkcm90dEBjaHJvbWl1bS5vcmc+CisKKwlGaXggbW9yZSBVQlNhbiB3YXJuaW5ncyBvbiBhZGRpbmcgb2Zmc2V0IHRvIG51bGxwdHIgKCM1NzQzMikuCisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTE9PUENBTEwpLCBzcmMvcHNhdXgvcHNmdC5jCisJKGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIpOiBVc2UgYEZUX09GRlNFVCcuCisKKzIwMTktMTItMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gRml4IFVCU2FuIHdhcm5pbmdzIG9uIGFkZGluZyBvZmZzZXRzIHRvIG51bGxwdHIuCiAKIAlSZXBvcnRlZCBhcwogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD01NzM5CisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDMyMTUyCiAKLQlCdWcgaW50cm9kdWNlZCBpbiBjb21taXQgMDhjZDYyZGVlZGVmZTIxN2YyZWE1MGUzOTI5MjNjZThiNWJjN2FjNy4KKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfRkRFRiwgSW5zX0lERUYpOiBVc2UgYEZUX09GRlNFVCcuCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9WYXJfRGVzaWduKTogQWx3YXlzIGluaXRpYWxpemUKLQlgbm9ybWFsaXplZGNvb3JkcycuCisyMDE5LTEyLTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTgtMDEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19HRVRWQVJJQVRJT04pOiBBdm9pZCBOVUxMIHJlZmVyZW5jZS4KKwlbdHJ1ZXR5cGVdIEZpeCBpbnRlZ2VyIG92ZXJmbG93LgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NTczNgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTkzMDUKIAotMjAxOC0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NSVJQKTogVXNlIGBBRERfTE9ORycuCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X3NldF9tbV9ibGVuZCk6IE1pbm9yLgorMjAxOS0xMi0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0yMDE4LTAxLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJQW5vdGhlciBidW5jaCBvZiBVQlNhbiB3YXJuaW5ncyBvbiBhZGRpbmcgb2Zmc2V0cyB0byBudWxscHRyLgogCi0JW3RydWV0eXBlXSBCZXR0ZXIgdHJhY2UgVkYgaW5zdGFuY2VzLgorCVJlcG9ydGVkIGFzCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl90b19ub3JtYWxpemVkKTogRG9uJ3QgZW1pdCBudW1iZXIKLQlvZiBjb29yZGluYXRlcy4KLQkoVFRfR2V0X01NX1Zhcik6IFRyYWNlIGluc3RhbmNlIGluZGljZXMgbmFtZXMuCi0JKFRUX1NldF9WYXJfRGVzaWduKTogVXBkYXRlZC4KKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE5NDI3CisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xOTQzMworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTk0NDEKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE5NDUxCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xOTQ1MgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTk0NTcKIAotMjAxOC0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9oaW50c19jb21wdXRlX3NlZ21lbnRzLAorCWFmX2xhdGluX2hpbnRzX2NvbXB1dGVfZWRnZXMpOiBVc2UgYEZUX09GRlNFVCcuCiAKLQlbdHJ1ZXR5cGVdIEJlYXV0aWZ5IHRyYWNpbmcgb2YgVkYgYXhpcyByZWNvcmRzLgorCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX0VudGVyRnJhbWUpOiBVc2UgYEZUX09GRlNFVCcuCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBTaG93IGF4aXMgcmVjb3JkcyBpbiBhCi0JdGFibGUtbGlrZSBtYW5uZXIuCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogRXhpdCBlYXJseQorCWlmIHRoZXJlIGlzIG5vIGNoYXJzdHJpbmcuCiAKLTIwMTgtMDEtMjYgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCSogc3JjL3BzYXV4L3Bzb2Jqcy5jICh0MV9kZWNyeXB0KTogVXNlIGBGVF9PRkZTRVQnLgogCi0JW3RydWV0eXBlXSBGaXggbXVsdGlwbGUgY2FsbHMgb2YgYEZUX0dldF9NTV9WYXInICgjNTI5NTUpLgorCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBFeGl0IGVhcmx5IGZvcgorCXplcm8gYml0bWFwIGRpbWVuc2lvbnMuCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBTZXQKLQlgZmFjZS0+YmxlbmQtPm51bV9heGlzJyBpbiBjYXNlIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUKLQlgZmFjZS0+YmxlbmQnLgorMjAxOS0xMi0wOSAgRG9taW5payBSw7Z0dHNjaGVzICA8ZHJvdHRAY2hyb21pdW0ub3JnPgogCi0yMDE4LTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJRml4IG1vcmUgVUJTYW4gd2FybmluZ3Mgb24gYWRkaW5nIG9mZnNldCB0byBudWxscHRyICgjNTczODQpLgogCi0JW2FwaW5hbWVzXSBBbm9ueW1vdXMgdmVyc2lvbiBtYXAgZm9yIEdOVSBsaW5rZXIuCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyksCisJc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc190YWJsZV9hZGQpOiBVc2UgYEZUX09GRlNFVCcuCiAKLQkqIHNyYy90b29scy9hcGluYW1lcy5jIChQUk9HUkFNX1ZFUlNJT04pOiBTZXQgdG8gMC4zLgotCShPdXRwdXRGb3JtYXQpOiBBZGQgYE9VVFBVVF9HTlVfVkVSTUFQJy4KLQkobmFtZXNfZHVtcCk6IEhhbmRsZSBpdC4KLQkodXNhZ2UpOiBVcGRhdGVkLgotCShtYWluKTogSGFuZGxlIG5ldyBjb21tYW5kIGxpbmUgZmxhZyBgLXdMJy4KKzIwMTktMTItMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxOC0wMS0yMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucyk6IFVzZSBgRlRfT0ZGU0VUJy4KIAotCVt1bml4XSBDYWxsIGxpYnRvb2wgdG8gY2xlYW4gdXAuCisJUmVwb3J0ZWQgYXMKIAotCSogYnVpbGRzL3VuaXgvaW5zdGFsbC5tayAoY2xlYW5fcHJvamVjdF91bml4LCBkaXN0Y2xlYW5fcHJvamVjdF91bml4KToKLQlVc2UgbGlidG9vbC4KLQkqIGJ1aWxkcy9mcmVldHlwZS5tazogTWlub3IuCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMDMwNjE0CiAKLTIwMTgtMDEtMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKzIwMTktMTItMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogc3JjL2Jhc2UvZnR2ZXIucmM6IEZpeCBtaW5ndy13NjQgY29tcGlsYXRpb24uCisJTW9yZSBudWxscHRyIG9mZnNldCBVQlNhbiB3YXJuaW5ncyAoIzU3MzMxLCAjNTczNDcpLgogCi0yMDE4LTAxLTE4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfaGludHNfY29tcHV0ZV9zZWdtZW50cyksCisJc3JjL3BzYXV4L3BzZnQuYyAoY2YyX2dldFNlYWNDb21wb25lbnQpLCBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYworCShJbnNfVU5LTk9XTik6IFVzZSBgRlRfT0ZGU0VUJy4KIAotCVtidWlsZF0gRW5hYmxlIFZFUlNJT05JTkZPIHJlc291cmNlIGZvciBDeWd3aW4vTWluR1cuCisyMDE5LTExLTI5ICBEb21pbmlrIFLDtnR0c2NoZXMgIDxkcm90dEBjaHJvbWl1bS5vcmc+CiAKLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENoZWNrIGZvciByZXNvdXJjZSBjb21waWxlci4KLQkqIGJ1aWxkcy91bml4L3VuaXgtY2MuaW46IENvbmRpdGlvbmFsbHkgc2V0IHVwIHJlc291cmNlIGNvbXBpbGVyLgotCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiBBZGQgY29uZGl0aW9uYWwgcnVsZSBmb3IgYGZ0dmVyLnJjJy4KLQkqIHNyYy9iYXNlL2Z0dmVyLnJjOiBDb3B5cmlnaHQgbm90aWNlIGFuZCB5ZWFyIHVwZGF0ZS4KKwlBdm9pZCBtb3JlIG51bGxwdHIgb2Zmc2V0IFVCU2FuIHdhcm5pbmdzICgjNTczMTYpLgogCi0yMDE4LTAxLTE4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfVHJhbnNmb3JtKTogQmFpbCBvbiBlbXB0eSBwb2ludHMuCisJKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX3N1YmZvbnRfbG9hZCk6IFVzZSBgRlRfT0ZGU0VUJy4KKwkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9kZWNvZGVyX3BhcnNlX3N1YnN0cmluZ3MpOiBFYXJseSBvdXQgaWYKKwlgY2hhcnN0cmluZ19iYXNlJyBvciBgY2hhcnN0cmluZ19sZW4nIGFyZSBudWxsLgorCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9uYW1lKTogVXNlIGBGVF9PRkZTRVQnLgogCi0JW2J1aWxkXSBNb3ZlIFZFUlNJT05JTkZPIHJlc291cmNlLgorMjAxOS0xMS0yMyAgSm9obiBTdHJhY2tlICA8anN0cmFja2VAR29vZ2xlLmNvbT4KIAotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFVwZGF0ZWQuCi0JKiBidWlsZHMvd2luZG93cy9mdHZlci5yYzogTW92ZSBmaWxlIGZyb20gaGVyZS4uLgotCSogc3JjL2Jhc2UvZnR2ZXIucmM6IC4uLiB0byBoZXJlLgorCVtiYXNlXSBSZWFsbHkgZml4ICM1NzE5NC4KIAotMjAxOC0wMS0xMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCUFwcGx5IGFjY2lkZW50YWxseSBtaXNzZWQgc2Vjb25kIHBhcnQgb2YgcGF0Y2guCiAKLQlbYnVpbGRdIEV4cGFuZCBkbGxleHBvcnQvZGxsaW1wb3J0IHRvIEN5Z3dpbi9NaW5HVy4KKwkqIHNyYy9iYXNlL2Z0Z2xvYWRyLmMgKEZUX0dseXBoTG9hZGVyX0NoZWNrUG9pbnRzKTogQ2FsbAorCWBGVF9HbHlwaExvYWRlcl9DcmVhdGVFeHRyYScuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFJlc3BlY3QgRExMX0VYUE9SVCwKLQlzL19NU0NfVkVSL19XSU4zMi8uCi0JKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogUmVwbGljYXRlIGhlcmUuCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IFJlcGxpY2F0ZSBoZXJlLgorMjAxOS0xMS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0yMDE4LTAxLTEyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJW3RydWV0eXBlXSBBdm9pZCBzYW5pdGl6ZXIgd2FybmluZyAoIzU3Mjg5KS4KIAotCVtidWlsZF0gSW1wcm92ZSBhbmQgZG9jdW1lbnQgTVNWQyBidWlsZC4KKwkqIHNyYy90cnVldHlwZS90dHBsb2FkLmMgKHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKTogVXNlCisJYEZUX09GRlNFVCcuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IEd1YXJkIGRsbGV4cG9ydC9kbGxpbXBvcnQKLQlhdHRyaWJ1dGVzIHdpdGggX0RMTCBhbmQgRlQyX0RMTElNUE9SVC4KLQkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKzIwMTktMTEtMjMgIEFybWluIEhhc2l0emthICA8cHJpbmNlLmNoZXJ1c2tlckBnbWFpbC5jb20+CiAKLTIwMTgtMDEtMTAgIFN0ZXZlIFJvYmluc29uICA8c3Nyb2JpbnNAZ21haWwuY29tPgorCVt0cnVldHlwZV0gRml4IGludGVnZXIgb3ZlcmZsb3cgKCM1NzI4NykuCiAKLQkqIENNYWtlTGlzdHMudHh0IFt3aW4zMl06IFN1cHByZXNzIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMuCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChjb21wdXRlX2dseXBoX21ldHJpY3MpOiBVc2UgYFNVQl9MT05HJy4KIAotMjAxOC0wMS0xMCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOS0xMS0yMyAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CiAKLQlbcHNhdXhdIENvcnJlY3RseSBoYW5kbGUgRmxleCBmZWF0dXJlcyAoIzUyODQ2KS4KKwlbc2ZudF0gQXZvaWQgc2FuaXRpemVyIHdhcm5pbmcgKCM1NzI4NikuCiAKLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kVk1PVkVUTywKLQljZjJfY21kSE1PVkVUTz46IERvIG5vdCBtb3ZlIGlmIGRvaW5nIEZsZXguCisJKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZmFjZV9idWlsZF9jbWFwcyk6IEF2b2lkIHBvc3NpYmxlIGBOVUxMICsKKwlvZmZzZXQnIGNvbXB1dGF0aW9uLgorCVRhZyBgdGFibGUnIGFzIGBjb25zdCcuCiAKLTIwMTgtMDEtMDkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKzIwMTktMTEtMjMgIEpvaG4gU3RyYWNrZSAgPGpzdHJhY2tlQEdvb2dsZS5jb20+CisgICAgICAgICAgICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS5zbG46IFN5bmNocm9uaXplIHdpdGggdGhlIHByb2plY3QuCisJW2Jhc2VdIEZpeCBgTlVMTCArIG9mZnNldCcgc2FuaXRpemVyIHdhcm5pbmdzICgjNTcxOTQpLgogCi0yMDE4LTAxLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYmFzZS9mdGdsb2Fkci5jIChGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzLAorCUZUX0dseXBoTG9hZGVyX0FkanVzdF9TdWJnbHlwaHMpOiBVc2UgYEZUX09GRlNFVCcuCisJKEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKTogQWRkIHNob3J0IGN1dCBpZiBzb21lIHZhbHVlcyBhcmUgemVyby4KIAotCSogVmVyc2lvbiAyLjkgcmVsZWFzZWQuCi0JPT09PT09PT09PT09PT09PT09PT09PT0KKzIwMTktMTEtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oIChGVF9PRkZTRVQpOiBOZXcgbWFjcm8uCisKKwlVc2UgdGhpcyBmb3IgYGJhc2UgKyBvZmZzZXQnIHBvaW50ZXIgY2FsY3VsYXRpb25zIHdoZXJlIGBiYXNlJyBjYW4KKwliZSBOVUxMICh0cmlnZ2VyaW5nIGEgc2FuaXRpemVyIHdhcm5pbmcgZXZlbiBpZiB0aGUgcmVzdWx0aW5nCisJcG9pbnRlciBnZXRzIG5ldmVyIGRlcmVmZXJlbmNlZCBzaW5jZSBpdCBpcyB1bmRlZmluZWQgYmVoYXZpb3VyCisJaW4gQykuCisKKwlTdWdnZXN0ZWQgYnkgQmVuIFdhZ25lci4KKworMjAxOS0xMS0yMyAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbc2ZudF0gRW5zdXJlIE9UVE8gZm9udHMgaGF2ZSB0YWJsZXMgKCM1NzI4NSkuCisKKwkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfZm9udF9kaXIpOiBBZGQgdGVzdC4KKworMjAxOS0xMS0yMyAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+CisKKwlNaW5vciBmaXhlcyBmb3IgcmVjZW50IGNvbXBpbGVycy4KKworCSogc3JjL2d6aXAvaW5mdXRpbC5oIChpbmZsYXRlX21hc2spOiBBZGQgYGNvbnN0Jy4KKworCSogc3JjL2F1dG9maXQvYWZsYXRpbjIuYzogSW5jbHVkZSBgZnQyYnVpbGQuaCcuCisKKzIwMTktMTEtMDcgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KKworCSogQ01ha2VMaXN0cy50eHQ6IE1pbm9yIGFkZGl0aW9ucyB0byB0aGUgbm90ZXMsIGNvbXBpbGUKKwkgIGJ1aWxkcy91bml4L2Z0c3lzdGVtLmMgaW5zdGVhZCBvZiBzcmMvYmFzZS9mdHN5c3RlbS5jIG9uIFVOSVguCisKKwlUaGUgbGF0dGVyIGNoYW5nZSBpcyBiYXNlZCBvbiB0aGUgY29kZSBwcm9wb3NlZCBieSByaW0gaW4gIzU1MjM1LgorCisyMDE5LTEwLTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogQ2hlY2sgYG51bV9mb250cycgZm9yIFRUQ3MuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xODQ5NAorCisyMDE5LTEwLTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogQXZvaWQgdW5kZWZpbmVkIHNoaWZ0LgorCisJQWxzbyBpbXByb3ZlIHRyYWNpbmcuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xODM5MAorCisyMDE5LTEwLTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9zZm50L3BuZ3NoaW0uYyAocHJlbXVsdGlwbHlfZGF0YSk6IE9wdGltaXplIGZvciBfX1NTRV9fIG9ubHkuCisKKzIwMTktMTAtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChyZWNvbnN0cnVjdF9nbHlmKTogQ2hlY2sgYHRyaXBsZXRfc2l6ZScuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xODEwOAorCisyMDE5LTEwLTA5ICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgorCisJW2NmZl0gRml4IEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyBmb3IgQ0ZGMiBiYXNlZCBmb250cyAoIzU3MDIzKS4KKworCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBEb24ndCBzZXQKKwlGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgZm9yIENGRjIgYmFzZWQgZm9udHMuCisKKzIwMTktMTAtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt3b2ZmMl0gRml4IFNGTlQgdGFibGUgY2hlY2tzLgorCisJQWxzbyByZWR1Y2UgbnVtYmVyIG9mIFNGTlQgdGFibGUgbG9va3Vwcy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE4MDY1CisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvd29mZnR5cGVzLmggKFdPRkYyX0luZm9SZWMpOiBBZGQgZmllbGRzCisJYGdseWZfdGFibGUnLCBgbG9jYV90YWJsZScsIGFuZCBgaGVhZF90YWJsZScuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAocmVjb25zdHJ1Y3RfZ2x5Zik6IFVwZGF0ZSBzaWduYXR1cmUuCisJVXNlIHRhYmxlIHBvaW50ZXJzIGluIGBpbmZvJyBwYXJhbWV0ZXIuCisJKGdldF94X21pbnMpOiBDaGVjayBgbWF4cF90YWJsZScKKwlVc2UgdGFibGUgcG9pbnRlcnMgaW4gYGluZm8nIHBhcmFtZXRlci4KKwkocmVjb25zdHJ1Y3RfZm9udCk6ICBVc2UgYW5kIHNldCB0YWJsZSBwb2ludGVycyBpbiBgaW5mbycgcGFyYW1ldGVyLgorCUZpeCBjaGVjayBmb3IgYGdseWYnIGFuZCBgbG9jYScgdGFibGVzLgorCVVwZGF0ZSBjYWxsIHRvIGByZWNvbnN0cnVjdF9nbHlmJy4KKwkod29mZjJfb3Blbl9mb250KTogVXBkYXRlZC4KKworMjAxOS0xMC0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHJlY29uc3RydWN0X2dseWYpOiBGaXggcmVhbGxvY2F0aW9uLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTgwNDYKKworMjAxOS0xMC0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJSW1wcm92ZSBtZW1vcnkgZGVidWdnaW5nLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggKEZUX01FTV9GUkVFKTogVXNlCisJYEZUX0RFQlVHX0lOTkVSJyB0byBzZXQgc291cmNlIGNvZGUgZmlsZSBuYW1lIGFuZCBsaW5lLgorCisJKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChmdF9tZW1fdGFibGVfcmVtb3ZlKTogQmV0dGVyIGZvcm1hdHRpbmcgb2YKKwl0cmFjaW5nIG1lc3NhZ2UuCisKKzIwMTktMTAtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMiAocmVjb25zdHJ1Y3RfZm9udCk6IEZpeCByZWFsbG9jYXRpb24uCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xNzk2NgorCisyMDE5LTEwLTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X3N0cm9rZXJfaW5zaWRlKTogU3BlZWQgdXAuCisKKzIwMTktMTAtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMiAod29mZjJfb3Blbl9mb250KTogSW5pdGlhbGl6ZSBgd29mZjIudHRjX2ZvbnRzJy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE3ODA0CisKKzIwMTktMDktMzAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChyZWNvbnN0cnVjdF9mb250KTogRml4IG1lbW9yeSBsZWFrLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTc4MTIKKworMjAxOS0wOS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3dvZmYyXSBSZWplY3QgZm9udHMgd2l0aG91dCBgaGVhZCcgdGFibGUuCisKKwlBbHNvIGZpeCBtZW1vcnkgZGVhbGxvY2F0aW9uIGluIGNhc2Ugb2YgZXJyb3IuCisKKwlgaGVhZCcgcHJvYmxlbSByZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xNzgyMAorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHJlY29uc3RydWN0X2dseWYpOiBEb24ndCB1c2UgYHN0cmVhbV9jbG9zZScuCisJQWJvcnQgaWYgYGhlYWRfdGFibGUnIGlzIE5VTEwuCisJRG9uJ3QgZnJlZSBgdHJhbnNmb3JtZWRfYnVmJyBpbiBjYXNlIG9mIGVycm9yLgorCSh3b2ZmMl9vcGVuX2ZvbnQpOiBEb24ndCBzZXQgYHVuY29tcHJlc3NlZF9idWYnIHRvIE5VTEwuCisKKzIwMTktMDktMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt3b2ZmMl0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCisJUHJvYmxlbSByZXBvcnRlZCBieSBBbGV4ZWkuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAocmVjb25zdHJ1Y3RfZ2x5Zik6IEluaXRpYWxpemUgYHhfbWluJy4KKwkocmVjb25zdHJ1Y3RfZm9udCk6IEluaXRpYWxpemUgYG51bV9obWV0cmljcycuCisJKHdvZmYyX29wZW5fZm9udCk6IEluaXRpYWxpemUgYGluZm8nLgorCisyMDE5LTA5LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogRml4IHNhbml0eSBjaGVjay4KKworCUNvcnJlY3QgdGhpbmtvcyBpbiBwYXRjaCBmcm9tIDIwMTktMDktMDEuCisKKzIwMTktMDktMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt3b2ZmMl0gRml4IG1lbW9yeSBsZWFrcy4KKworCU9uZSBvZiB0aGVtIHJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE3NzY2CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogRnJlZSBgaW5mby0+eF9taW5zJyBhbmQKKwlgd29mZjItPnR0Y19mb250cycuCisKKwkocmVjb25zdHJ1Y3RfZ2x5Zik6IEluaXRpYWxpemUgYGluZm8tPnhfbWlucycuCisKKzIwMTktMDktMjcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Ryb2tlcl9jYXApOiBTcGVlZCB1cCBjYXBzLgorCisyMDE5LTA5LTI1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X3N0cm9rZXJfb3V0c2lkZSk6IFNwZWVkIHVwIGNsaXBwZWQgbWl0ZXIuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmg6IFdvcmRzbWl0aCBtaXRlciBkb2NzLgorCisyMDE5LTA5LTI1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogQ2hlY2sgKHN1bSBvZikgdGFibGUgc2l6ZXMuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xNzY4NAorCisyMDE5LTA5LTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X3N0cm9rZV9ib3JkZXJfYXJjdG8pOiBTcGVlZCB1cCBjYWxjdWxhdGlvbnMuCisKKzIwMTktMDktMjAgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVt3b2ZmMl0gRml4IG1lbW9yeSBsZWFrcy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE2ODk2CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogRml4IGVycm9yIGhhbmRsaW5nLgorCUZyZWUgYHVuY29tcHJlc3NlZF9idWYnLgorCShyZWNvbnN0cnVjdF9mb250KTogRnJlZSBgdHJhbnNmb3JtZWRfYnVmJy4KKworMjAxOS0wOS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvb3R2YWxpZC9vdHZjb21tb24uYyAob3R2X0NvdmVyYWdlX2dldF9sYXN0KTogR3VhcmQgYGNvdW50Jy4KKworCVByb2JsZW0gcmVwb3J0ZWQgYnkgTWFyYyBTY2jDtm5lZmVsZCA8bWFyYy5zY2hvZW5lZmVsZEBnbXgub3JnPi4KKworMjAxOS0wOS0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHdvZmYyX29wZW5fZm9udCk6IENoZWNrIHRhYmxlIGluZGV4LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTcxMDAKKworMjAxOS0wOS0xNSAgQXZpIEhhbGFjaG1pICg6YXZpaCkgIDxhdmlocGl0QHlhaG9vLmNvbT4KKworCVtjbWFrZV0gRG9uJ3QgZmFpbCBpZiBicm90bGkgaXMgbWlzc2luZyAoIzU2ODk0KS4KKworCVRoZSBsaWJzIHdoaWNoIGNtYWtlIGNvbnRyb2xzIGFyZSBjb21tZW50ZWQgb3V0IGF0CisKKwkgIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKKworCWFuZCBjbWFrZSB1bi1jb21tZW50IGVhY2ggZW5hYmxlZCBsaWJyYXJ5LCBidXQgdGhlIGJyb3RsaSBvcHRpb24gd2FzCisJbm90IGNvbW1lbnRlZCBvdXQsIHRoZXJlZm9yZSBgRlRfQ09ORklHX09QVElPTl9VU0VfQlJPVExJJyByZW1haW5lZAorCWRlZmluZWQgZXZlbiBpZiBicm90bGkgd2FzIG1pc3NpbmcvZGlzYWJsZWQvZXRjLgorCisJQ29tbWVudCBpdCBzdWNoIHRoYXQgY21ha2UgY2FuIGNvbnRyb2wgaXQsIHdoaWNoIG1lYW5zIGxlYXZpbmcgaXQKKwl1bmRlZmluZWQgaWYgYnJvdGxpIGlzIG1pc3NpbmcuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmg6IEZpeCB0eXBvLgorCisyMDE5LTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbY21ha2VdIEFkZCBicm90bGkgc3VwcG9ydC4KKworCSogQ01ha2VMaXN0cy50eHQgKEZUX1dJVEhfQlJPVExJKTogTmV3IG9wdGlvbi4KKworCSogYnVpbGRzL2NtYWtlL0ZpbmRCcm90bGlEZWMuY21ha2U6IE5ldyBmaWxlLgorCisyMDE5LTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXggaGFuZGxpbmcgb2YgYEFGX0NPTkZJR19PUFRJT05fSU5ESUMnLgorCisJKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oOgorCWBBRl9DT05GSUdfT1BUSU9OX0lORElDJyBuZWVkcyBgQUZfQ09ORklHX09QVElPTl9DSksnLgorCisyMDE5LTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlDTWFrZUxpc3RzLnR4dDogRml4IGdlbmVyYXRpb24gb2YgRExMIHJlbGF0ZWQgc3R1ZmYgKCM1Njg1MikuCisKKwlFeHRyYWN0IGB2ZXJzaW9uX2luZm8nIHZhcmlhYmxlIGZyb20gYGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcnIGFuZAorCXVzZSB0aGUgZGF0YSB0byBjb3JyZWN0bHkgc2V0IGBMSUJSQVJZX1ZFUlNJT04nIGFuZAorCWBMSUJSQVJZX1NPVkVSU0lPTicuCisKKwlBbHNvIHVzZSB0aGUgZGF0YSB0byBzZXQgYGZ0X3ZlcnNpb24nIGZpZWxkIGluIGBmcmVldHlwZTIucGMnLgorCUFsc28gZml4IHRoZSBuZWVkZWQgbWluaW11bSB2ZXJzaW9uIG9mIEhhcmZCdXp6IGluIGBmcmVldHlwZTIucGMnLgorCisyMDE5LTA5LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoY29tcHV0ZV9VTG9uZ19zdW0pOiBGaXggdW5kZWZpbmVkIHNoaWZ0LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTY5MzMKKworMjAxOS0wOS0wMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHdvZmYyX29wZW5fZm9udCk6IEFkZCBzYW5pdHkgY2hlY2suCisKKwlEb24ndCB0cnVzdCBgdG90YWxTZm50U2l6ZScgdW5jb25kaXRpb25hbGx5LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTY4OTMKKworMjAxOS0wOC0yNyAgRG9taW5payBSw7Z0dHNjaGVzICA8ZHJvdHRAY2hyb21pdW0ub3JnPgorCisJW3dvZmYyXSBEb24ndCB1c2UgYEZUX1VJbnQ2NCcgKCM1NjgxNSkuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogVXNlIGBGVF9VSW50MzInIGZvcgorCWBmaWxlX29mZnNldCcuICBUaGlzIGZpeGVzIGJ1aWxkcyBvbiBwbGF0Zm9ybXMgd2hlcmUgYEZUX0xPTkc2NCcgaXMKKwlub3QgZGVmaW5lZCB3aGlsZSBzdGlsbCBiZWluZyBzdWZmaWNpZW50IHRvIHN0b3JlIGEgZmlsZSBvZmZzZXQuCisKKzIwMTktMDgtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gUHJldmVudCBjcmFzaCBpbiBgVFRfU2V0X05hbWVkX0luc3RhbmNlJyAoIzU2ODEzKS4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfU2V0X05hbWVkX0luc3RhbmNlKTogRml4IGVycm9yCisJaGFuZGxpbmcuCisKKzIwMTktMDgtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt3b2ZmMl0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHJlYWRfbnVtX2htZXRyaWNzKTogUmVtb3ZlIHVudXNlZCBhcmd1bWVudAorCWB0YWJsZV9sZW4nLgorCVVwZGF0ZSBjYWxsZXIuCisJKHRyaXBsZXRfZGVjb2RlLCBjb21wdXRlX2Jib3gsIHN0b3JlX2xvY2EsIHJlY29uc3RydWN0X2dseWYpOiBNYWtlCisJYGknIHZhcmlhYmxlIHVuc2lnbmVkLgorCShyZWNvbnN0cnVjdF9nbHlwaCk6IFJlbW92ZSBjb25kaXRpb24gd2hpY2ggaXMgYWx3YXlzIGZhbHNlLgorCShyZWNvbnN0cnVjdF9odG1sKTogUmVtb3ZlZCB1bnVzZWQgYXJndW1lbnQgYHRyYW5zZm9ybWVkX3NpemUnLgorCVVwZGF0ZSBjYWxsZXIuCisKKwkqIHNyYy9zZm50L3dvZmYydGFncy5jICh3b2ZmMl9rbm93bl90YWdzKTogUmVtb3ZlIGNvbmRpdGlvbiB3aGljaCBpcworCWFsd2F5cyBmYWxzZS4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBDaGVjayB3aGV0aGVyIGtub3duIHRhZyBpcyBpbiBhcnJheSBib3VuZHMuCisKKwlJZiB0YWJsZSB0YWcgaXMgbm90IDB4M2YsIHdlIGV4cGVjdCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgNjIuICBJZgorCXRoaXMgaXMgbm90IHRoZSBjYXNlLCBleGl0IHdpdGggZXJyb3JzLgorCisJKiBzcmMvc2ZudC9zZndvZmYyL2M6IENoZWNrIHdoZXRoZXIgdGFibGUgdGFnIG1ha2VzIHNlbnNlLgorCisJKiBzcmMvc2ZudC93b2ZmMnRhZ3MuYzogUmV0dXJuIDAgaWYgdGFnIGlzIG91dCBvZiBib3VuZHMuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jOiBJbXByb3ZlIHRyYWNlIGNvbW1lbnRzLgorCisJQWRqdXN0IHRyYWNpbmcgbGV2ZWxzIGZvciBjb21tZW50cywgYW5kIG1vcmUgZm9ybWF0dGluZy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBTdXBwb3J0IGBobXR4JyByZWNvbnN0cnVjdGlvbiB3aGVuIGBnbHlmJyBpcyB1bnRyYW5zZm9ybWVkLgorCisJYHJlY29uc3RydWN0X2htdHgnIHJlcXVpcmVzIGBpbmZvLT54X21pbnMnIGFuZCBgaW5mby0+bnVtX2dseXBocycgdG8KKwlyZWNvbnN0cnVjdCB0aGUgaG10eCB0YWJsZS4gIEluIGNhc2UgZ2x5ZiBpcyBub3QgdHJhbnNmb3JtZWQsIHdlCisJY2FsbCBgZ2V0X3hfbWlucycgd2hpY2ggZG9lcyB0aGUgbmVjZXNzYXJ5IHdvcmsuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoZ2V0X3hfbWlucyk6IE5ldyBmdW5jdGlvbi4KKwkocmVjb25zdHJ1Y3RfZm9udCk6IENhbGwgZ2V0X3hfbWlucy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3NmbnRdIFN1cHBvcnQgYGZhY2UtPm51bV9mYWNlcycgZm9yIFdPRkYyIGZvbnRzLgorCisJU2V0IGNvcnJlY3QgdmFsdWUgb2YgYGZhY2UtPm51bV9mYWNlcycgZm9yIFdPRkYyIGZvbnRzLiAgVGhpcyBpcworCWJlaW5nIGhhbmRsZWQgc2VwYXJhdGVseSBiZWNhdXNlIHdlIG9ubHkgbG9hZCB0aGUgdGFibGVzIGZvciB0aGUKKwlyZXF1ZXN0ZWQgZm9udCBmYWNlIGluIGB3b2ZmMl9vcGVuX2ZvbnQnIGFuZCBjcmVhdGUgYSBzaW5nbGUtZmFjZQorCXNmbnQgc3RyZWFtLgorCisJVGhlIGZ1bGwgZGlzY3Vzc2lvbiBpcyBhdDoKKworCSAgaHR0cHM6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDE5LTA4L21zZzAwMDAwLmh0bWwKKworCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfb3Blbl9mb250KTogQWRkIHBhcmFtZXRlcgorCWB3b2ZmMl9udW1fZmFjZXMnLgorCShzZm50X2luaXRfZmFjZSk6IEludHJvZHVjZSB2YXJpYWJsZSBgd29mZjJfbnVtX2ZhY2VzJywgYW5kIGNoYW5nZQorCWBmYWNlLT5yb290Lm51bV9mYWNlcycgaWYgYHdvZmYyX251bV9mYWNlcycgaXMgc2V0LgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHdvZmYyX29wZW5fZm9udCk6IFZhbGlkYXRlIHJlcXVlc3RlZCBmYWNlCisJaW5kZXggYW5kIGhhbmRsZSBuZWdhdGl2ZSBmYWNlIGluZGljZXMuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuaCAod29mZjJfb3Blbl9mb250KTogQWRkIHBhcmFtZXRlciBgbnVtX2ZhY2VzJyB0bworCWRlY2xhcmF0aW9uLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbd29mZjJdIEltcHJvdmUgbWVtb3J5IGFuZCBlcnJvciBoYW5kbGluZy4KKworCUZyZWUgdXAgbWVtb3J5IGFmdGVyIHVzZSwgYW5kIGltcHJvdmUgZXJyb3IgaGFuZGxpbmcuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAocmVjb25zdHJ1Y3RfZm9udCwgd29mZjJfb3Blbl9mb250KTogSW1wbGVtZW50CisJY2hhbmdlcy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBBdm9pZCB0b28gbWFueSBjYWxscyB0byBgRlRfUkVBTExPQycuCisKKwlXZSBkbyB0aGlzIGJ5IHVzaW5nIGB0b3RhbFNmbnRTaXplJyBhcyBhbiBpbml0aWFsIHJlZmVyZW5jZSwgYW5kCisJZXh0ZW5kaW5nIHRoZSBidWZmZXIgd2hlbiByZXF1aXJlZC4gIFRoaXMgcmVkdWNlcyByZW5kZXJpbmcgdGltZQorCWNvbnNpZGVyYWJseS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC93b2ZmdHlwZXMuaCAoV09GRjJfSGVhZGVyUmVjKTogQWRkCisJYHRvdGFsU2ZudFNpemUnLCByZW5hbWUgYHRvdGFsX3NmbnRfc2l6ZScgdG8gYGFjdHVhbF9zZm50X3NpemUnLgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHdyaXRlX2J1Zik6IEFkZCBwYXJhbWV0ZXIgYGRzdF9zaXplJyB0byBrZWVwCisJdHJhY2sgb2YgYW5kIHVwZGF0ZSB0b3RhbCBzaXplIG9mIHN0cmVhbS4KKworCShXUklURV9TRk5UX0JVRiwgV1JJVEVfU0ZOVF9CVUZfQVQpOiBNb2RpZnkgbWFjcm9zIGFjY29yZGluZ2x5LgorCisJKHBhZDQsIHN0b3JlX2xvY2EsIHJlY29uc3RydWN0X2dseWYsIHJlY29uc3RydWN0X2htdHgsCisJcmVjb25zdHJ1Y3RfZm9udCk6IFVwZGF0ZSBwYXJhbWV0ZXJzIHRvIGFjY2VwdCBgc2ZudF9zaXplJy4KKworCSh3b2ZmMl9vcGVuX2ZvbnQpOiBBZGQgdmFyaWFibGUgYHNmbnRfc2l6ZScuICBVc2UgV09GRjIgaGVhZGVyIGZpZWxkCisJYHRvdGFsU2ZudFNpemUnIGFzIGluaXRpYWwgcmVmZXJlbmNlIChpZiB2YWx1ZSBtYWtlcyBzZW5zZSkgYW5kCisJYWxsb2NhdGUgYHRvdGFsU2ZudFNpemUnIGJ5dGVzIGZvciB0aGUgc2ZudCBzdHJlYW0uICBgd3JpdGVfYnVmJworCWhhbmRsZXMgcmVhbGxvY2F0aW9uIGlmIGFuZCB3aGVuIHJlcXVpcmVkLiAgQWxzbyByZXNpemUgdGhlIHN0cmVhbQorCXRvIGBhY3R1YWxfc2ZudF9zaXplJyBhZnRlciByZWNvbnN0cnVjdGlvbi4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBSZWNvbnN0cnVjdCBgbG9jYScsIGBobXR4JywgYW5kIHN3YXAgb3V0IHN0cmVhbS4KKworCUFkZCBuZWNlc3NhcnkgZnVuY3Rpb25zIHRvIHJlY29uc3RydWN0IGxvY2EgYW5kIGhtdHggdGFibGVzICh0aGUgdHdvCisJcmVtYWluaW5nIHRhYmxlcyB0aGF0IGNhbiBoYXZlIGEgdHJhbnNmb3JtKS4gIGB3b2ZmMl9vcGVuX2ZvbnQnIGlzCisJbm93IGNhcGFibGUgb2YgbG9hZGluZyBhIHdvZmYyIGZvbnQgZmFjZS4gIFRoaXMgY29kZSBtYXkgc3RpbGwgbmVlZAorCW1vcmUgcmVmaW5pbmcgYW5kIGJldHRlciBtZW1vcnkgbWFuYWdlbWVudC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC93b2ZmdHlwZXMuaCAoV09GRjJfSGVhZGVyUmVjKTogQWRkIHRvdGFsCisJKGZpbmFsKSBzaXplIG9mIHNmbnQgc3RyZWFtLgorCisJKFdPRkYyX0luZm9SZWMpOiBBZGQgaGVhZGVyIGNoZWNrc3VtIHZhbHVlLgorCisJKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9vcGVuX2ZvbnQpOiBDaGFuZ2UgYGZhY2VfaW5zdGFuY2VfaW5kZXgnCisJcGFyYW1ldGVyIHRvIGl0cyBwb2ludGVyIHNvIGl0cyB2YWx1ZSBjYW4gYmUgbW9kaWZpZWQgYnkKKwlgd29mZjJfb3Blbl9mb250Jy4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jOiAoV1JJVEVfU0ZOVF9CVUZfQVQpOiBOZXcgbWFjcm8gdG8gd3JpdGUgaW50bworCXNmbnQgYnVmZmVyIGF0IGdpdmVuIHBvc2l0aW9uLgorCisJKHdyaXRlX2J1Zik6IEFkZCBwYXJhbWV0ZXIgYGV4dGVuZF9idWYnIHdoaWNoIGFsbG93cyBjYWxsZXIgdG8KKwlzcGVjaWZ5IHdoZXRoZXIgYnVmZmVyIHNob3VsZCBiZSByZWFsbG9jYXRlZCBiZWZvcmUgY29weWluZyBkYXRhLgorCisJKFdSSVRFX1NGTlRfQlVGKTogVXBkYXRlZC4KKworCShwYWQ0LCBzdG9yZV9sb2NhLCByZWNvbnN0cnVjdF9odG14KTogTmV3IGZ1bmN0aW9ucy4KKworCShyZWNvbnN0cnVjdF9nbHlmKTogQ2FsY3VsYXRlIGxvY2EgdmFsdWVzIGFuZCBzdG9yZSB0aGVtLgorCisJKHJlY29uc3RydWN0X2ZvbnQpOiBDYWxsIGByZWNvbnN0cnVjdF9obXR4Jywgd3JpdGUgdGFibGUgcmVjb3JkCisJZW50cmllcywgYW5kIGNhbGN1bGF0ZSB0YWJsZSBjaGVja3N1bXMuICBBbHNvIGNhbGN1bGF0ZSBmb250CisJY2hlY2tzdW0gYW5kIHVwZGF0ZSBgY2hlY2tzdW1BZGp1c3RtZW50JyBlbnRyeSBpbiBoZWFkIHRhYmxlLgorCisJKHdvZmYyX29wZW5fZm9udCk6IE9wZW4gc3RyZWFtIGZvciBzZm50IGJ1ZmZlciwgc3dhcCBvdXQgaW5wdXQKKwlzdHJlYW0gYW5kIHJldHVybi4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5oICh3b2ZmMl9vcGVuX2ZvbnQpOiBNb2RpZnkgcGFyYW1ldGVyIHRvIGFjY2VwdAorCXBvaW50ZXIgdG8gYGZhY2VfaW5kZXgnLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbd29mZjJdIFJlY29uc3RydWN0IHRyYW5zZm9ybWVkIGBnbHlmJyB0YWJsZS4KKworCVJlY29uc3RydWN0IGBnbHlmJyB0YWJsZSBpZiBpdCBpcyB0cmFuc2Zvcm1lZCBpbiB0aGUgdW5jb21wcmVzc2VkCisJdGFibGUgc3RyZWFtLiAgQWxzbyBhZGQgbmVjZXNzYXJ5IHN0cnVjdHVyZXMsIG1hY3JvcyBhbmQgZnVuY3Rpb25zLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3dvZmZ0eXBlcy5oIChXT0ZGMl9JbmZvUmVjLAorCVdPRkYyX1N1YnN0cmVhbVJlYywgV09GRjJfUG9pbnRSZWMpOiBOZXcgc3RydWN0dXJlcy4KKwkoV09GRjJfVGFibGVSZWMpOiBzL09yaWdMZW5ndGgvZHN0X2xlbmd0aC8uCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoUkVBRF8yNTVVU0hPUlQsIFJFQURfQkFTRTEyOCk6IFVzZQorCWBGVF9TRVRfRVJST1InIHRvIHNldCBpbXBsaWNpdCBgZXJyb3InIHZhcmlhYmxlLgorCisJKFdSSVRFX1NIT1JUKTogTmV3IG1hY3JvLgorCisJKE5fQ09OVE9VUl9TVFJFQU0sIE5fUE9JTlRTX1NUUkVBTSwgRkxBR19TVFJFQU0sIEdMWVBIX1NUUkVBTSwKKwlDT01QT1NJVEVfU1RSRUFNLCBCQk9YX1NUUkVBTSwgSU5TVFJVQ1RJT05fU1RSRUFNKTogTmV3IG1hY3JvcyB0bworCXJlZmVyIHRvIHN1YnN0cmVhbXMgb2YgdGhlIHRyYW5zZm9ybWVkIGBnbHlmJyB0YWJsZXMuCisKKwkoUmVhZDI1NVVTaG9ydCwgUmVhZEJhc2UxMjgpOiBSZXR1cm4gZXJyb3JzIHNldCBieSBgRlRfUkVBRF9YWFgnCisJbWFjcm9zLgorCisJKHdpdGhfc2lnbiwgc2FmZV9pbnRfYWRkaXRpb24pOiBOZXcgZnVuY3Rpb25zIHRvIGFkZCBzaWduIHRvIHZhbHVlcworCWJhc2VkIG9uIGEgZmxhZyBhbmQgcGVyZm9ybSBzYWZlIGFkZGl0aW9uIHJlc3BlY3RpdmVseS4KKworCSh0cmlwbGV0X2RlY29kZSk6IERlY29kZSB2YXJpYWJsZS1sZW5ndGggKGZsYWcsIHhDb29yZGluYXRlLAorCXlDb29yZGluYXRlKSB0cmlwbGV0IGZvciBhIHNpbXBsZSBnbHlwaC4gICBTZWUKKworCSAgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dPRkYyLyN0cmlwbGV0X2RlY29kaW5nCisKKwkoc3RvcmVfcG9pbnRzLCBjb21wdXRlX2Jib3gsIGNvbXBvc3RlR2x5cGhfc2l6ZSwgcmVjb25zdHJ1Y3RfZ2x5Zik6CisJTmV3IGZ1bmN0aW9ucy4KKworCShyZWNvbnN0cnVjdF9mb250KTogQ2FsbCBgcmVjb25zdHJ1Y3RfZ2x5ZicuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuaDogQWRkIHJlcXVpcmVkIGNvbnN0YW50cy4KKworCSogc3JjL3NmbnQvd29mZjJ0YWdzLmg6IE1vdmUgb3V0IGNvbnN0YW50cyB0byBgc2Z3b2ZmMi5oJy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBDb3B5IHVuLXRyYW5zZm9ybWVkIHRhYmxlcyB0byBzZm50IHN0cmVhbS4KKworCUNvcHkgdW4tdHJhbnNmb3JtZWQgdGFibGVzIHRvIHRoZSBzZm50IHN0cmVhbS4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jOiAoV1JJVEVfU0ZOVF9CVUYpOiBOZXcgbWFjcm8uCisJKHdyaXRlX2J1Zik6IE5ldyBmdW5jdGlvbi4gIEV4dGVuZCBtZW1vcnkgb2YgYGRzdCcgYnVmZmVyIGFuZCBjb3B5CisJYnl0ZXMgZnJvbSBgc3JjJy4KKwkoY29tcHV0ZV9VTG9uZ19zdW0pOiBOZXcgZnVuY3Rpb24uICBDYWxjdWxhdGUgY2hlY2tzdW0gb2YgdGFibGUuCisJKHJlY29uc3RydWN0X2ZvbnQpOiBDaGFuZ2UgYEZUX0J5dGUqIHNmbnQnIHRvIGBGVF9CeXRlKioKKwlzZm50X2J5dGVzJy4gIFRoaXMgaGFzIGJlZW4gZG9uZSBiZWNhdXNlIHdlIHJlYWxsb2NhdGUgbWVtb3J5IHRvCisJYHNmbnQnIG11bHRpcGxlIHRpbWVzLCB3aGljaCBtYXkgY2hhbmdlIHRoZSBwb2ludGVyIHZhbHVlIG9mIGBzZm50Jy4KKwlUaGlzIG5ldyBwb2ludGVyIG11c3QgYmUgcHJvcG9nYXRlZCBiYWNrIHRvIHRoZSBjYWxsZXIuICBTYW1lIHJlYXNvbgorCWZvciB1c2luZyBhIGRvdWJsZSBwb2ludGVyIGluIGB3cml0ZV9idWYnLgorCisJKiBzcmMvc2ZudC93b2ZmMnRhZ3MuaCAoV09GRjJfREVGQVVMVF9NQVhfU0laRSk6IE5ldyBtYWNybyB1c2VkIGZvcgorCW92ZXJmbG93IGNoZWNraW5nLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbd29mZjJdIENyZWF0ZSBzdHJlYW0gZm9yIHVuY29tcHJlc3NlZCBidWZmZXIuCisKKwlVbmNvbXByZXNzZWQgYnVmZmVyIGlzIG5vdyBhbiBgRlRfU3RyZWFtJy4KKworCVBlcmZvcm0gYmFzaWMgY2hlY2tzIGFuZCBzdGFydCBpdGVyYXRpbmcgb3ZlciB0YWJsZXMuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoc3RyZWFtX2Nsb3NlLCBmaW5kX3RhYmxlLCByZWFkX251bV9obWV0cmljcyk6CisJTmV3IGZ1bmN0aW9ucy4KKwkocmVjb25zdHJ1Y3RfZm9udCk6IE1vZGlmeSBwYXJhbWV0ZXJzIGFuZCBpdGVyYXRlIG92ZXIgdGFibGVzLgorCSh3b2ZmMl9vcGVuX2ZvbnQpOiBVcGRhdGVkLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbd29mZjJdIEhhbmRsZSBUVENzIGFuZCBzdGFydCByZWNvbnN0cnVjdGluZyBmb250LgorCisJV2UgYGhhbmRsZScgVFRDcyBieSBtb2RpZnlpbmcgdGhlIGBpbmRpY2VzJyBhcnJheSB0byBwb2ludCB0byBvbmx5CisJdGhvc2UgdGFibGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHJlcXVlc3RlZCBgZmFjZV9pbmRleCcuCisKKwlTZXQgYW5kIHVzZSBgbnVtX3RhYmxlcycgaW4gYFdPRkYyX1R0Y0ZvbnQnLgorCisJKiBzcmMvc2ZudC9zZndvZmYyLmMgKHJlY29uc3RydWN0X2ZvbnQpOiBOZXcgZnVuY3Rpb24uCisJKHdvZmYyX29wZW5fZm9udCk6IFN0YXJ0IHJlY29uc3RydWN0aW9uIG9mIGZvbnQuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVt3b2ZmMl0gR2V0IGtub3duIHRhZ3MgZnJvbSBmdW5jdGlvbi4KKworCUNoYW5nZSBgS25vd25UYWdzJyB0byBhIGZ1bmN0aW9uIChgd29mZjJfa25vd25fdGFncycpLiAgVGhpcyBhdm9pZHMKKwlpbnRyb2R1Y2luZyBhIGdsb2JhbCBjb25zdGFudCBhcnJheS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKwlzcGVjaWZpZWQgaW5kZXggd2l0aG91dCAqYW55KiBjaGVja3MuICBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQKKwlgaW5kZXgnIGlzIHdpdGhpbiBhcnJheSBsaW1pdHMuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAod29mZjJfb3Blbl9mb250KTogQ2hhbmdlIGBLbm93blRhZ3NbLi4uXScKKwlub3RhdGlvbiB0byBgd29mZjJfa25vd25fdGFncyggLi4uICApJy4KKworCSogc3JjL3NmbnQvd29mZjJ0YWdzLmM6IFBlcmZvcm0gY2hhbmdlcy4KKworCSogc3JjL3NmbnQvd29mZjJ0YWdzLmg6IFVwZGF0ZSBkZWZpbml0aW9ucy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBNaW5vci4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jICh3b2ZmMl91bmNvbXByZXNzKTogQWRkIGVycm9yIG1lc3NhZ2UKKwkod29mZjJfb3Blbl9mb250KTogRnJlZSBgdW5jb21wcmVzc2VkX2J1ZicuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVt3b2ZmMl0gVW5jb21wcmVzcyBCcm90bGkgc3RyZWFtcyBhbmQgYGZhY2VfaW5kZXgnIHN1cHBvcnQuCisKKwlXT0ZGMiBjb21wcmVzc2VkIHN0cmVhbSBpcyBub3cgdW5jb21wcmVzc2VkIGlmIEJyb3RsaSBpcyBhdmFpbGFibGUuCisJVGhpcyBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIGJ1ZmZlciAodW5jb21wcmVzc2VkX2J1ZikgYmVjYXVzZQorCWl0IGRvZXMgbm90IGNvbnRhaW4gZGlyZWN0IHRhYmxlIGRhdGEuICBDZXJ0YWluIHRhYmxlcyBoYXZlCisJdHJhbnNmb3JtYXRpb25zIGFwcGxpZWQgdG8gdGhlbSwgYW5kIHRoZXkgbXVzdCBiZSByZWNvbnN0cnVjdGVkCisJYmVmb3JlIHdlIGNhbiB3cml0ZSB0aG9zZSB0YWJsZXMgdG8gdGhlIFNGTlQgc3RyZWFtLgorCisJYGZhY2VfaW5kZXgnIGlzIG5vdyBiZWluZyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8KKwlgd29mZjJfb3Blbl9mb250Jy4KKworCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfb3Blbl9mb250KTogQWRkIHBhcmFtZXRlcgorCWBmYWNlX2luc3RhbmNlX2luZGV4Jy4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jICh3b2ZmMl91bmNvbXByZXNzKTogTmV3IGZ1bmN0aW9uLgorCSh3b2ZmMl9vcGVuX2ZvbnQpOiBDYWxsIGB3b2ZmMl91bmNvbXByZXNzJy4KKwkoY29tcHV0ZV9maXJzdF90YWJsZV9vZmZzZXQpOiBGaXggcmV0dXJuIHR5cGUuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuaCAod29mZjJfb3Blbl9mb250KTogTW9kaWZ5IGRlY2xhcmF0aW9uLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENoYW5nZSBhcmd1bWVudCBuYW1lIHRvIGBicm90bGknLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlBZGQgQnJvdGxpIGRlcGVuZGVuY3kgYW5kIHJlcXVpcmVkIGNoZWNrcy4KKworCUJyb3RsaSBpcyByZXF1aXJlZCBmb3IgZGVjb21wcmVzc2luZyBXT0ZGMiBmb250IGRpcmVjdG9yeSBzdHJlYW1zLgorCVRoZSBsaWJyYXJ5IGlzIHRodXMgYmVpbmcgYWRkZWQgYXMgYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBmb3IKKwlGcmVlVHlwZS4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQWRkIGNoZWNrcyBmb3IgYGxpYmJyb3RsaWRlYycuCisJKFJFUVVJUkVTX1BSSVZBVEUsIExJQlNfUFJJVkFURSwgTElCU1NUQVRJQ19DT05GSUcpOiBVcGRhdGVkLgorCisJKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCisJKEZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSSk6IE5ldyBtYWNyby4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJW3dvZmYyXSBXcml0ZSBTRk5UIE9mZnNldCB0YWJsZS4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jIChXUklURV9VU0hPUlQsIFdSSVRFX1VMT05HKTogTmV3IG1hY3Jvcy4KKwkoY29tcGFyZV90YWdzKTogTmV3IGZ1bmN0aW9uLgorCSh3b2ZmMl9vcGVuX2ZvbnQpOiBJbXBsZW1lbnQgaXQuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jOiAjdW5kZWYgbWFjcm9zLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbd29mZjJdIFJlYWQgdGFibGUgYW5kIGNvbGxlY3Rpb24gZGlyZWN0b3J5LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3dvZmZ0eXBlcy5oIChXT0ZGMl9UdGNGb250UmVjKTogTmV3CisJc3RydWN0dXJlLgorCShXT0ZGMl9IZWFkZXJSZWMpOiBBZGQgbW9yZSBmaWVsZHMuCisKKwkqIHNyYy9zZm50L3Nmd29mZjIuYyAoUkVBRF8yNTVVU0hPUlQsIFJFQURfQkFTRTEyOCwgUk9VTkQ0KTogTmV3CisJbWFjcm9zLgorCShSZWFkMjU1VVNob3J0LCBDb2xsZWN0aW9uSGVhZGVyU2l6ZSwgY29tcHV0ZV9maXJzdF90YWJsZV9vZmZzZXQpOgorCU5ldyBmdW5jdGlvbnMuCisJKFJlYWRCYXNlMTI4KTogVXNlIGBGVF9SRUFEX0JZVEUnLgorCSh3b2ZmMl9vcGVuX2ZvbnQpOiBBZGQgZnVuY3Rpb25hbGl0eSB0byByZWFkIHRhYmxlIGRpcmVjdG9yeSBhbmQKKwljb2xsZWN0aW9uIGRpcmVjdG9yeSAoaWYgcHJlc2VudCkuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVtzZm50XSBJbmNsdWRlIGB3b2ZmMnRhZ3MuYycgZm9yIGJ1aWxkaW5nLgorCisJKiBzcmMvc2ZudC9ydWxlcy5tayAoU0ZOVF9EUlZfU1JDKTogQWRkIGB3b2ZmMnRhZ3MuYycuCisKKwkqIHNyYy9zZm50L3NmbnQuYzogSW5jbHVkZSBgd29mZjJ0YWdzLmMnLgorCisyMDE5LTA4LTI3ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbc2ZudF0gQWRkIFdPRkYyIGNvbnN0YW50cy4KKworCUFkZCBjb25zdGFudHMgcmVxdWlyZWQgZm9yIFdPRkYyLCBhbmQga25vd24gdGFibGUgdGFncyBhcyBkZWZpbmVkIGluCisJdGhlIHNwZWNpZmljYXRpb24uICBTZWUKKworCSAgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dPRkYyLyN0YWJsZV9kaXJfZm9ybWF0CisKKwlmb3IgZGV0YWlscy4KKworCSogc3JjL3NmbnQvd29mZjJ0YWdzLmMsIHNyYy9zZm50L3dvZmYydGFncy5oOiBOZXcgZmlsZXMuCisKKzIwMTktMDgtMjcgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVtzZm50XSBSZWFkIFdPRkYgMiBoZWFkZXIuCisKKwlDaGVjayBmb3IgV09GRjIgdGFnLCBjYWxsIGB3b2ZmMl9vcGVuX2ZvbnQnLCBhbmQgaW1wbGVtZW50IGl0IHRvIHJlYWQKKwloZWFkZXIgYWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgYHNmd29mZjIuYycuCisKKwkqIHNyYy9zZm50L3J1bGVzLm1rIChTRk5UX0RSVl9TUkMpOiBBZGQgYHNmd29mZjIuYycuCisKKwkqIHNyYy9zZm50L3NmbnQuYzogSW5jbHVkZSBgc2Z3b2ZmMi5jJy4KKworCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfb3Blbl9mb250KTogQ2hlY2sgZm9yIGB3T0YyJyB0YWcgYW5kIGNhbGwKKwlgd29mZjJfb3Blbl9mb250Jy4KKworCSogc3JjL3NmbnQvc2Z3b2ZmMi5jLCBzcmMvc2ZudC9zZndvZmYyLmg6IE5ldyBmaWxlcy4KKworMjAxOS0wOC0yNyAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJQWRkIHN0cnVjdHVyZXMgZm9yIFdPRkYyLgorCisJQWRkIHN0cnVjdHVyZXMgYW5kIG1hY3JvIGZvciBXT0ZGIDIgaGVhZGVyIGFuZCB0YWJsZSBkaXJlY3RvcnkuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvd29mZnR5cGVzLmggKFdPRkYyX0hlYWRlclJlYywKKwlXT0ZGMl9UYWJsZVJlY18pOiBOZXcgc3RydWN0dXJlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaCAoVFRBR193T0YyKTogTmV3IG1hY3JvLgorCisyMDE5LTA4LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYyAoY2ZmX29wZXJhdG9yX3NlYWMpOiBGaXggbnVtZXJpYyBvdmVyZmxvdy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE2NDcwCisKKzIwMTktMDgtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0eXBlMV0gRml4IGBGVF9HZXRfVmFyX0F4aXNfRmxhZ3MnICgjNTY4MDQpLgorCisJKiBzcmMvdHlwZTEvdDFsb2FkLmMgKFQxX0dldF9NTV9WYXIpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYXhpcyBmbGFncy4KKwlBbHNvIHJlbW92ZSByZWR1bmRhbnQgYXNzaWdubWVudC4KKworMjAxOS0wNy0yNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvYmFzZS9mdGJib3guYyAoY3ViaWNfcGVhayk6IFNhbml0aXplIGxlZnQgc2hpZnQgKCM1NjU4NikuCisKKzIwMTktMDctMjIgIFdlaXlpIFd1ICA8dzF3MnkzQGdtYWlsLmNvbT4KKworCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9oZXhfdG9fYmluYXJ5KTogRml4IHR5cG8gKCM1NjY1MykuCisKKzIwMTktMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50LCB3aW5mb250c10gQXZvaWQgbWVtb3J5IGxlYWtzIGluIGNhc2Ugb2YgZXJyb3IgKCM1NjU4NykuCisKKwkqIHNyYy9zZm50L3Nmd29mZi5jICh3b2ZmX29wZW5fZm9udCk6IENhbGwgYEZUX0ZSQU1FX0VYSVQnIGluIGNhc2UKKwlvZiBlcnJvci4KKworCSogc3JjL3dpbmZvbnRzL3dpbmZudC5jIChmbnRfZmFjZV9nZXRfZGxsX2ZvbnQpOiBEaXR0by4KKworMjAxOS0wNy0xMiAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlQcm9wZXJseSBoYW5kbGUgcGhhbnRvbSBwb2ludHMgZm9yIHZhcmlhdGlvbiBmb250cyAoIzU2NjAxKS4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBTY2FsZSBwaGFudG9tCisJcG9pbnRzIGlmIEhWQVIgYW5kL29yIFZWQVIgaXMgcHJlc2VudC4KKworMjAxOS0wNy0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3BzYXV4XSAoMi8yKSBIYW5kbGUgZm9udHMgdGhhdCB1c2UgU0VBQyBmb3IgbGlnYXR1cmVzICgjNTY1ODApLgorCisJVGhlIHNhbWUgYXMgcHJldmlvdXMgY29tbWl0IGJ1dCBmb3IgdGhlIG9sZCBlbmdpbmUuCisKKwkqIHNyYy9wc2F1eC90MWRlY29kZS5jICh0MW9wZXJhdG9yX3NlYWMpOiBJbXBsZW1lbnQgaXQuCisKKzIwMTktMDctMDQgIENocmlzIExpZGRlbGwgPGNocmlzLmxpZGRlbGxAYXJ0aWZleC5jb20+CisKKwlbcHNhdXhdICgxLzIpIEhhbmRsZSBmb250cyB0aGF0IHVzZSBTRUFDIGZvciBsaWdhdHVyZXMgKCM1NjU4MCkuCisKKwlBcyBvcmlnaW5hbGx5IGludGVuZGVkLCBhIFR5cGUgMSBTRUFDIGNoYXJzdHJpbmcgd291bGQgYmUgdXNlZCBmb3IKKwlhbiBhY2NlbnRlZCBnbHlwaCAobGlrZSBgYWNhcm9uJyBvciBgdXVtbGF1dCcpLCB3aGVyZSB0aGUgYWR2YW5jZQorCXdpZHRoIG9mIHRoZSBTRUFDIGdseXBoIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIGBiYXNlJyBnbHlwaAorCShsaWtlIGBhJyBvciBgdScpLiAgSW4gdGhpcyBjYXNlIGl0IGlzIG5vdCB1bmNvbW1vbiBmb3IgdGhlIFNFQUMKKwlnbHlwaCB0byBub3QgdXNlIGFuIChIKVNCVyBvcGNvZGUgb2YgaXRzIG93biBidXQgdG8gcmVseSBvbiB0aGUKKwl2YWx1ZSBmcm9tIHRoZSBiYXNlIGdseXBoLgorCisJSG93ZXZlciwgb3V0LW9mLXNwZWMgZm9udHMgYWxzbyB1c2UgU0VBQyBnbHlwaHMgZm9yIGxpZ2F0dXJlcyAobGlrZQorCWBvZScgb3IgYGZpJyksIGFuZCBpbiB0aG9zZSBjYXNlcyB0aGUgb3ZlcmFsbCBhZHZhbmNlIHdpZHRoIGlzCisJZ3JlYXRlciB0aGFuIHRoYXQgb2YgdGhlIGBiYXNlJyBnbHlwaC4gIEZvciB0aGlzIHJlYXNvbiB3ZSBoYXZlIHRvCisJYWxsb3cgdGhhdCB0aGUgU0VBQyBnbHlwaCBjYW4gaGF2ZSBhbiAoSClTQlcgdmFsdWUgb2YgaXRzIG93biwgYW5kCisJaWYgaXQgaGFzLCByZXRhaW4gdGhpcyB2YWx1ZSwgcmF0aGVyIHRoYW4gdGhlIG9uZSBmcm9tIHRoZSBiYXNlCisJZ2x5cGguCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfZXNjU0VBQz46CisJSW1wbGVtZW50IGl0LgorCisyMDE5LTA3LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIFZlcnNpb24gMi4xMC4xIHJlbGVhc2VkLgorCT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIAotCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTknLgorCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTEwLTEnLgogCi0JKiBkb2NzL1ZFUlNJT04uVFhUOiBBZGQgZW50cnkgZm9yIHZlcnNpb24gMi45LgorCSogZG9jcy9WRVJTSU9OLlRYVDogQWRkIGVudHJ5IGZvciB2ZXJzaW9uIDIuMTAuMS4KIAotCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9pbmRleC5odG1sLAotCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwsCisJKiBSRUFETUUsIEphbWZpbGUgKFJlZkRvYyksIHNyYy9iYXNlL2Z0dmVyLnJjLAogCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLAogCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAogCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLApAQCAtNTQ3LDE3OTYgKzE5NjMsMzA5NCBAQAogCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKIAlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCiAJYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKLQlidWlsZHMvd2luZG93cy9mdHZlci5yYywKIAlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKIAlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCiAJYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCi0JYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuOC4xLzIuOS8sIHMvMjgxLzI5Ly4KKwlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWw6IHMvMi4xMC4wLzIuMTAuMS8sIHMvMjEwMC8yMTAxLy4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9NSU5PUik6IFNldCB0byA5LgotCShGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAwLgorCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAxLgogCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMjI6MDoxNi4KLQkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDAuCisJKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMjM6MToxNy4KKwkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX1BBVENIKTogU2V0IHRvIDEuCiAKLTIwMTgtMDEtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaCAoRlRfRXJyb3JfU3RyaW5nKTogRml4IEMrKyBjb21waWxhdGlvbi4KIAotCUFkZCBjaGVjayBmb3IgbGlicnQsIG5lZWRlZCBmb3IgYGZ0YmVuY2gnICgjNTI4MjQpLgorMjAxOS0wNi0yNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3IChMSUJfQ0xPQ0tfR0VUVElNRSk6IERlZmluZTsgdGhpcyB3aWxsCi0JaG9sZCBgLWxydCcgaWYgbmVjZXNzYXJ5LgorCSogc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfY21hcF9jaGFyX3tpbmRleCxuZXh0fSk6IEZpeCBpbmVxdWFsaXR5LgogCi0JKiBidWlsZHMvdW5peC91bml4LWNjLmluIChMSUJfQ0xPQ0tfR0VUVElNRSk6IE5ldyB2YXJpYWJsZS4KKwlSZXBvcnRlZCBieSBBcm1pbiBIYXNpdHprYS4KIAotMjAxOC0wMS0wNyAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOS0wNi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JW3BzYXV4XSBGaXggVHlwZSAxIGdseXBocyB3aXRoIHRvbyBtYW55IHN0ZW0gaGludHMuCisJKiBzcmMvdG9vbHMvYXBpbmFtZXMuYzogRm9ybWF0dGluZywgbWlub3IgZWRpdHMuCiAKLQlBY2NvcmRpbmcgdG8gdGhlIENGRiBzcGVjaWZpY2F0aW9uLCBjaGFyc3RyaW5ncyBjYW4gaGF2ZSB1cCB0byA5NiBzdGVtCi0JaGludHMuIER1ZSB0byBoaW50IHJlcGxhY2VtZW50IHJvdXRpbmVzIGluIFR5cGUgMSBjaGFyc3RyaW5ncywgc29tZQotCWdseXBocyBhcmUgcmVqZWN0ZWQgYnkgdGhlIEFkb2JlIGVuZ2luZSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgYWJvdmUKLQlsaW1pdC4gVGhpcyBmaXggdHVybnMgb2ZmIGhpbnRpbmcgZm9yIHN1Y2ggZ2x5cGhzLgorMjAxOS0wNi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvcHNhdXgvcHNoaW50cy5jIChjZjJfaGludG1hcF9idWlsZCk6IFJlc2V0IHRoZSBlcnJvciBmcm9tIGNhbGxpbmcKLQlgY2YyX2hpbnRtYXNrX3NldEFsbCcgb24gYSBwcm9ibGVtYXRpYyBUeXBlIDEgY2hhcnN0cmluZyBhbmQgdHVybiBvZmYKLQloaW50aW5nLgorCVthdXRvZml0XSBEaXNhYmxlIGhpbnRpbmcgaWYgbm8gYmx1ZSB6b25lcyBhcmUgYXZhaWxhYmxlICgjNTY0NTApLgogCi0yMDE4LTAxLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYXV0b2ZpdC9hZmdsb2JhbC5jIChhZl9mYWNlX2dsb2JhbF9nZXRfbWV0cmljcyk6IFN0YXJ0IGFnYWluCisJKHdpdGggZHVtbXkgaGludGVyIG1vZHVsZSkgaWYgbm8gYmx1ZSB6b25lcyBhcmUgcHJlc2VudC4KIAotCUFkZCBgRlRfRG9uZV9NTV9WYXInLgorCSogc3JjL2F1dG9maXQvYWZsYXRpbi5jIChhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMpOiBDaGFuZ2UKKwlzaWduYXR1cmUgdG8gcmV0dXJuIGVycm9yIGNvZGUuCisJSWYgbm8gYmx1ZSB6b25lcyBhcmUgZm91bmQsIHVwZGF0ZSBgZ2x5cGhfc3R5bGVzJyBhcnJheSB0byBob2xkCisJQUZfU1RZTEVfTk9ORV9ERkxUIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgc3R5bGUuCisJKGFmX2xhdGluX21ldHJpY3NfaW5pdCk6IFJldHVybiBpbnRlcm5hbCBlcnJvciBjb2RlIGlmIG5vIGJsdWUgem9uZXMKKwlhcmUgZm91bmQuCiAKLQlUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbidzIG1lbW9yeSByb3V0aW5lcyBkaWZmZXIKLQlmcm9tIEZyZWVUeXBlLiAgQSB0eXBpY2FsIGV4YW1wbGUgaXMgYSBQeXRob24gYXBwbGljYXRpb24gb24gV2luZG93cwotCXRoYXQgY2FsbHMgRnJlZVR5cGUgY29tcGlsZWQgYXMgYSBETEwgdmlhIHRoZSBgY3R5cGVzJyBpbnRlcmZhY2UuCisyMDE5LTA2LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oLCBzcmMvYmFzZS9mdG1tLmMgKEZUX0RvbmVfTU1fVmFyKTogRGVjbGFyZQotCWFuZCBkZWZpbmUuCisJVG93YXJkcyBiZXR0ZXIgVk1TIHN1cHBvcnQuCisKKwlNb3JlIHRvIGNvbWUuCisKKwkqIGJ1aWxkcy92bXMvTElCUy5PUFRfSUE2NCwgYnVpbGRzL3Ztcy9fTElOSy5PUFRfSUE2NCwKKwlidWlsZHMvdm1zL3Ztc2xpYi5kYXQ6IE5ldyBmaWxlcyBwcm92aWRlZCBieSBKb3VrIEphbnNlbgorCTxqb3VrakBocmVtLm5hbm8udHVkZWxmdC5ubD4uCisKKwkqIGJ1aWxkcy92bXMvZnRjb25maWcuaDogVXBkYXRlLCBhbHNvIGZyb20gSm91ay4KKworMjAxOS0wNi0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYXV0b2ZpdC9hZmxhdGluLmMgKGFmX2xhdGluX21ldHJpY3NfaW5pdF93aWR0aHMpOiBNaW5vci4KKworMjAxOS0wNi0xMyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Ntb290aF0gUmVzdG9yZSB0aGUgc3BhbiBidWZmZXJpbmcgZm9yIGRpcmVjdCBtb2RlIG9ubHkuCisKKwlUaGUgYnVmZmVyIHNpemUgRlRfTUFYX0dSQVlfU1BBTlMgaXMgc2V0IHRvIDEwIHNwYW5zLCB3aGljaCBzaG91bGQgYmUKKwllbm91Z2ggdG8gY292ZXIgdGhlIGVudGlyZSBzY2FubGluZSBmb3Igc2ltcGxlIGdseXBocyBpbiBtb3N0IGNhc2VzOgorCWVhY2ggc2xpZ2h0bHkgc2xhbnRlZCBlZGdlIG5lZWRzIHVwIHRvIHR3byBzcGFucywgcGx1cyBhIGZpbGxpbmcgc3BhbgorCWluLWJldHdlZW4uICBUaGlzIGlzIG5vdCBuZXcsIHdlIHVzZWQgdG8gZG8gaXQgYmVmb3JlIGNiNDM4ODc4M2NlY2MuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X1RXb3JrZXIpOiBBZGQgYHNwYW5zJyBhbmQgYG51bV9zcGFucycuCisJKGdyYXlfaGxpbmUsIGdyYXlfc3dlZXApOiBJbXBsZW1lbnQgdGhlIHNwYW4gYnVmZmVyaW5nLgorCShncmF5X3Jhc3Rlcl9yZW5kZXIpOiBVc2UgbmVnYXRpdmUgYG51bV9zcGFucycgdG8gYXZvaWQgdGhlIGRpcmVjdAorCW1vZGUuCisKKzIwMTktMDYtMTIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIChGVF9EZWJ1Z0hvb2tfRnVuYyk6IFJldHVybiBlcnJvci4KKworCUZpeCBhIHdhcm5pbmcgYnkgYWRkaW5nIGEgcmV0dXJuIHZhbHVlIGFzIGluIGBUVF9SdW5JbnMnLAorCXdoaWNoIHNob3VsZCBub3QgYmUgYSBjb21wYXRpYmlsaXR5IGlzc3VlLgorCisyMDE5LTA2LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfY2hlY2tfdHJpY2t5bmVzc19mYW1pbHkpOiBBZGQgYGNvbnN0Jy4KKworMjAxOS0wNi0xMSAgTW9hemluIEtoYXR0aSAgPG1vYXppbmtoYXRyaUBnbWFpbC5jb20+CisKKwlbZ3ppcF0gQWRkIHN1cHBvcnQgZm9yIGBnemlwJyBlbmNvZGVkIGhlYWRlci4KKworCSogc3JjL2d6aXAvZnRnemlwLmMgKEZUX0d6aXBfVW5jb21wcmVzcyk6IE1vZGlmeSB0aGUgdGhlIGNhbGwgdG8KKwlgaW5mbGF0ZUluaXQyJyB0byBlbmFibGUgc3VwcG9ydCBmb3IgYGd6aXAnIGVuY29kZWQgaGVhZGVycy4KKworMjAxOS0wNi0xMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3R5cGUxLHR5cGU0Ml0gVXNlIGBjb25zdCcgZm9yIHN0cmluZyBsaXRlcmFscy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChQU19UYWJsZV9GdW5jc1JlYyk6IFVwZGF0ZWQuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCAoVDFfRW5jb2RpbmdSZWMpOiBVcGRhdGVkLgorCSogc3JjL3BzYXV4L3Bzb2Jqcy5bY2hdIChwc190YWJsZV9hZGQpOiBVcGRhdGVkLgorCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9PcGVuX0ZhY2UsIHBhcnNlX2VuY29kaW5nKTogVXBkYXRlZC4KKwkqIHNyYy90eXBlNDIvdDQyb2Jqcy5jIChUNDJfT3Blbl9GYWNlKTogVXBkYXRlZC4KKwkqIHNyYy90eXBlNDIvdDQycGFyc2UuYyAodDQyX3BhcnNlX2VuY29kaW5nKTogVXBkYXRlZC4KKworCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpOiBNaW5vci4KKworMjAxOS0wNi0xMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2JkZixwY2ZdIFVzZSBgY29uc3QnIGZvciBzdHJpbmcgbGl0ZXJhbHMuCisKKwkqIHNyYy9iZGYvYmRmLmggKGJkZl9wcm9wZXJ0eV90KTogVXBkYXRlZCBgbmFtZScuCisJKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX2xpc3Rfc3BsaXQsYmRmX2NyZWF0ZV9wcm9wZXJ0eSwKKwlfYmRmX2FkZF9wcm9wZXJ0eSxfYmRmX2F0byopOiBVcGRhdGVkLgorCSogc3JjL2JkZi9iZGZkcml2ci5jIChiZGZfaW50ZXJwcmV0X3N0eWxlKTogVXBkYXRlZC4KKwkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfaW50cnByZXRfc3R5bGUpOiBEaXR0by4KKworMjAxOS0wNi0wNyAgUGhpbGlwIFJhY2UgIDxwaGlsaXAucmFjZUBvcmFjbGUuY29tPgorCisJKiBzcmMvYmFzZS9mdGluaXQuYyAoRlRfU2V0X0RlZmF1bHRfUHJvcGVydGllcyk6IEZpeCBjcmFzaC4KKworCVRlcm1pbmF0ZSBsb29wIGF0IGVuZCBvZiBlbnZpcm9ubWVudC4KKworMjAxOS0wNS0zMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJU29saWRpZnkgVkMyMDA1IGJ1aWxkcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoRlRfTVNCKSBbX01TQ19WRVJdOiBFeHBsaWNpdGx5CisJZGVjbGFyZSBgX0JpdFNjYW5SZXZlcnNlJyBpbnRyaW5zaWMuCisJKiBidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiBbRGVidWddOiBEaXNhYmxlIGludHJpbnNpY3MuCisKKzIwMTktMDUtMzAgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCVtzZm50XSBTZXBhcmF0ZSBXT0ZGIHNvdXJjZXMgYW5kIGhlYWRlcnMuCisKKwlNb3ZlIFdPRkYgc291cmNlcyBhbmQgaGVhZGVycyB0byBzZXBhcmF0ZSBmaWxlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC93b2ZmdHlwZXMuaCwgc3JjL3NmbnQvc2Z3b2ZmLmMsCisJc3JjL3NmbnQvc2Z3b2ZmLmg6IE5ldyBmaWxlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IFJlZ2lzdGVyIGBzZndvZmYuYycuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaDogRGVmaW5lCisJRlRfSU5URVJOQUxfV09GRl9UWVBFU19ILgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaDogSW5jbHVkZSBGVF9JTlRFUk5BTF9XT0ZGX1RZUEVTX0guCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oOiBNb3ZlIG91dCBXT0ZGIHN0cnVjdHVyZXMuCisKKwkqIHNyYy9zZm50L3J1bGVzLm1rOiBBZGQgYHNmd29mZi5jJy4KKworCSogc3JjL3NmbnQvc2ZudC5jOiBJbmNsdWRlIGBzZndvZmYuYycuCisKKwkqIHNyYy9zZm50L3Nmb2Jqcy5jOiBJbmNsdWRlIGBzZndvZmYuaCcsIG1vdmUgb3V0IFdPRkYgc291cmNlcy4KKworMjAxOS0wNS0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2Jhc2VdIEZpeCBgbWFrZSBtdWx0aScuCisKKwlSZXBvcnRlZCBieSBOaWtoaWwuCisKKwkqIHNyYy9iYXNlL2Z0ZXJyb3JzLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSC4KKworMjAxOS0wNS0yOSAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbdHJ1ZXR5cGVdIEZpeCBjb3B5LWFuZC1wYXN0ZSBlcnJvciAoIzU2NDA5KS4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAobG9hZF90cnVldHlwZV9nbHlwaCk6IFVzZSBjb3JyZWN0IGluZGljZXMKKwlpbnRvIGB1bnJvdW5kZWQnIGFycmF5IGZvciBwaGFudG9tIHBvaW50cy4KKworMjAxOS0wNS0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBGaXggMzJiaXQgYnVpbGRzICgjNTY0MDQpLgorCisJUGF0Y2ggc3VnZ2VzdGVkIGJ5IEJlbiBXYWduZXIgPGJ1bmdlbWFuQGdvb2dsZS5jb20+LgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChGVF9maXhlZFRvSW50LCBGVF9maXhlZFRvRmRvdDYpOiBSZW1vdmUKKwloYXJtZnVsIGNhc3QgdG8gdW5zaWduZWQgdHlwZS4KKworMjAxOS0wNS0yNiAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogSW1wcm92ZSBhY2N1cmFjeS4KKworMjAxOS0wNS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBEcmF3IGdseXBocyB3aXRob3V0IGRlbHRhcyBpbiB2YXJpYXRpb24gZm9udCAoIzU2Mzc0KS4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBBbHdheXMgZmlsbAorCWB1bnJvdW5kZWQnIGFycmF5LgorCisyMDE5LTA1LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChvcGNvZGVfbmFtZSk6IEltcHJvdmUgbW5lbW9uaWNzLgorCisyMDE5LTA1LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEFjdHVhbGx5IHNjYWxlIHZhcmllZCBDVlQgdmFsdWVzLgorCisJVXAgdG8gbm93LCBvbmx5IHRoZSB1bnNjYWxlZCBDVlQgdmFsdWVzIHdlcmUgdmFyaWVkOyBpbiBvdGhlciB3b3JkcywKKwl0aGUgYENWQVInIGRhdGEgd2FzIG5ldmVyIHVzZWQgZm9yIGJ5dGVjb2RlIGhpbnRpbmcuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2N2dF9yZWFkeV9pdGVyYXRvcik6IE5ldyBhdXhpbGlhcnkKKwlmdW5jdGlvbi4KKwkodHRfZmFjZV92YXJ5X2N2dCk6IFVzZSBpdCB0byB0cmlnZ2VyIHJlc2NhbGluZyBvZiBDVlQgdmFsdWVzLgorCisyMDE5LTA1LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIFVzZSAyNi42IGZvcm1hdCBmb3Igc3RvcmluZyB1bnNjYWxlZCBDVlQgdmFsdWVzLgorCisJSWYgYENWQVInIGRhdGEgaXMgYXBwbGllZCB0byB2YXJpYXRpb24gZm9udHMsIGZyYWN0aW9uYWwgdmFsdWVzIGFyZQorCXBvc3NpYmxlLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCAoVFRfRmFjZVJlYyk6IENoYW5nZSB0eXBlIG9mCisJYGN2dCcgZnJvbSBgRlRfU2hvcnQnIHRvIGBGVF9JbnQzMicuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEZUX2Zkb3Q2VG9GaXhlZCk6IE5ldyBtYWNyby4KKwkodHRfZmFjZV92YXJ5X2N2dCk6IFVzZSBpdCB0byB1cGRhdGUgY29kZSB0byAyNi42IGZvcm1hdC4KKworCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9zaXplX3J1bl9wcmVwKTogVXBkYXRlIGNvZGUgdG8gMjYuNgorCWZvcm1hdC4KKworCSogc3JjL3RydWV0eXBlL3R0cGxvYWQuYyAodHRfZmFjZV9sb2FkX2N2dCk6IFN0b3JhIGRhdGEgaW4gMjYuNgorCWZvcm1hdC4KKworMjAxOS0wNS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogSW5pdCBgdW5yb3VuZGVkJy4KKworCVRoaXMgZml4ZXMgbGluZWFyIGFkdmFuY2Ugd2lkdGggdmFsdWVzIGZvciBzcGFjaW5nIGdseXBocy4gIEJ1ZworCWludHJvZHVjZWQgMjAxOS0wNS0wOS4KKworMjAxOS0wNS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBBdm9pZCBjb2RlIGR1cGxpY2F0aW9uLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHR0X3NpemVfcnVuX3ByZXApOiBTY2FsZSBDVlQgdmFsdWVzIGluIHRoaXMKKwlmdW5jdGlvbi4KKwkodHRfc2l6ZV9yZWFkeV9ieXRlY29kZSk6IFVwZGF0ZWQuCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jICh0dF9sb2FkZXJfaW5pdCk6IFVwZGF0ZWQuCisKKzIwMTktMDUtMTMgIEpvdWsgSmFuc2VuICA8am91a2pAaHJlbS5uYW5vLnR1ZGVsZnQubmw+CisKKwkqIHZtc19tYWtlLmNvbTogVXBkYXRlZC4gIEhhbmRsZSBgYnppcDInIGRpcmVjdG9yeSwgdG9vLgorCisyMDE5LTA1LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9wc2F1eC9wc2ZvbnQuYyAoY2YyX2ZvbnRfc2V0dXApOiBGaXggY29tcGlsZXIgd2FybmluZy4KKworMjAxOS0wNS0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBEb2guICBGaXggbGFzdCBjb21taXQgdG8gbWFrZSBpdCB3b3JrLgorCisJVmVyeSBlbWJhcmFzc2luZyA6LSkKKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTE0NzAxCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xNDcwNQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTQ3MTAKKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoSVNfREVGQVVMVF9JTlNUQU5DRSk6IE1vdmUgdXAgYW5kIGFkZAorCWFyZ3VtZW50OyB1cGRhdGUgYWxsIGNhbGxlcnMuCisJKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogVXNlIGl0LiAgVGhlIGB1bnJvdW5kZWQnIGFycmF5IGlzIGFjdGl2ZQorCWZvciB2YXJpYXRpb24gZm9udHMgb25seSwgdGh1cyBhbHNvIGVuY2xvc2UgcmVsYXRlZCBjb2RlIHdpdGgKKwlgI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgLi4uICAjZW5kaWYnIHdoZXJlCisJbmVjZXNzYXJ5LgorCVJldmVydCBjb21taXQgYTExM2U1ZCBmcm9tIDIwMTktMDUtMDksIGFuZCBkb24ndCB1c2UgYGV4dHJhX3BvaW50czInCisJYnV0IGFsbG9jYXRlIGEgdGVtcG9yYXJ5IGFycmF5LgorCVNwZWVkIHVwIHRoZSBzY2FsaW5nIG9mIHRoZSBgdW5yb3VuZGVkJyBhcnJheS4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoRlRfZml4ZWRUb0ludCwgRlRfRml4ZWRUb0Zkb3Q2KTogRml4IHR5cGUKKwljb252ZXJzaW9ucyBhbmQgcm91bmRpbmcuICBUaGUgdW5zaWduZWQgdHlwZSBtdXN0IGhhdmUgbW9yZSBvciBlcXVhbAorCWJpdHMgdG8gdGhlIHNpZ25lZCB0eXBlLgorCisyMDE5LTA1LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEluY3JlYXNlIHByZWNpc2lvbiBvZiBmb250IHZhcmlhdGlvbiAoIzU0MzcxKS4KKworCVRoaXMgcGF0Y2ggbWFrZXMgRnJlZVR5cGUgdXNlIGZvbnQgdW5pdHMgaW4gMjYuNiBmb3JtYXQgaW50ZXJuYWxseQorCWluc3RlYWQgb2YgaW50ZWdlcnMuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKEZUX2ZpeGVkVG9GZG90Nik6IE5ldyBtYWNyby4KKwkoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBBZGQgYXJndW1lbnQgdG8gb3V0cHV0IHVucm91bmRlZCBmb250CisJY29vcmRpbmF0ZXMuCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5oOiBVcGRhdGVkLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IFVzZQorCWBleHRyYV9wb2ludHMyJyBhcnJheSB0byB0ZW1wb3JhcmlseSBob2xkIHVucm91bmRlZCBwb2ludAorCWNvb3JkaW5hdGVzOyB1c2UgdGhlbSB0byBjb21wdXRlIHNjYWxlZCBjb29yZGluYXRlcyBhbmQgbGluZWFyCisJYWR2YW5jZSB3aWR0aCBhbmQgaGVpZ2h0LgorCShsb2FkX3RydWV0eXBlX2NvZGUpOiBBZGp1c3Qgc2ltaWxhcmx5LgorCisyMDE5LTA1LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogTWlub3IuCisKKzIwMTktMDUtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIEZhc3RlciBmcmFjdGlvbnMuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChTVUJQSVhFTFMpOiBSZXBsYWNlIHdpdGguLi4KKwkoRlJBQ1QpOiBBIGZyYWN0aW9uYWwgY29vcmRpbmF0ZSBtYWNybyB0byB1c2UgaW4uLi4KKwkoZ3JheV9yZW5kZXJfbGluZSwgZ3JheV9yZW5kZXJfc2NhbmxpbmUpOiAuLi4gaGVyZS4KKworMjAxOS0wNS0wNyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKERyYXdfU3dlZXApOiBVbmJyZWFrLgorCisyMDE5LTA1LTA1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYzogQ2xlYW4tdXBzLgorCisyMDE5LTA1LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmM6IE1vcmUgdXNlIG9mIGBGVF9mZG90MTRUb0ZpeGVkJy4KKworMjAxOS0wNS0wNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZW5kZXJfbGluZSk6IFNtYWxsIHNob3J0Y3V0LgorCisyMDE5LTA1LTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlWYXJpb3VzIGNsYW5nIDguMCBzdGF0aWMgYW5hbHl6ZXIgZml4ZXMuCisKKwlSZXBvcnRlZCBieSBTZW5kZXIgR2hvc3QgPGxpZ2h0c2lkZUBnbXguY29tPi4KKworCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2hpbnRzX2NvbXB1dGVfZWRnZXMpOiBDYXRjaCBhIGNvcm5lcgorCWNhc2Ugd2hlcmUgYGVkZ2UtPmZpcnN0JyBjb3VsZCBiZSBOVUxMLgorCisJKiBzcmMvcGZyL3Bmcm9ianMuYyAocGZyX3Nsb3RfbG9hZCk6IFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0IG9mCisJYHNpemUnLgorCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKERyYXdfU3dlZXApOiBDYXRjaCBhIGNvcm5lciBjYXNlIHdoZXJlCisJYGRyYXdfcmlnaHQnIG1pZ2h0IGJlIE5VTEwuCisKKwkqIHNyYy9zZm50L3R0bXR4LmMgKHR0X2ZhY2VfZ2V0X21ldHJpY3MpOiBGaXggbGltaXQgdGVzdCBmb3IKKwlgYWFkdmFuY2UnLgorCUVuc3VyZSBgYWJlYXJpbmcnIGFsd2F5cyBob2xkIGEgbWVhbmluZ2Z1bCByZXN1bHQuCisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBFbnN1cmUgYHN1YmdseXBoJyBpcworCW5vdCBOVUxMIGJlZm9yZSBhY2Nlc3NpbmcgaXQuCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9TZXRfTmFtZWRfSW5zdGFuY2UpOiBSZW1vdmUgdW5uZWNlc3NhcnkKKwl0ZXN0IG9mIGBuYW1lZHN0eWxlJy4KKworCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VyX2RvbmUpOiBFbnN1cmUKKwlgcGFyc2VyLT5yb290LmZ1bmNzLmRvbmUnIGlzIG5vdCBOVUxMIGJlZm9yZSBhY2Nlc3NpbmcgaXQuCisKKzIwMTktMDUtMDMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCU1pc2NlbGxhbmVvdXMgbWFjcm8gdXBkYXRlcy4KKworCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChTQ0FMRUQpOiBVcGRhdGVkLgorCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKFNDQUxFRCk6IERpdHRvLgorCShGTE9PUiwgUk9VTkQsIENFSUxJTkcpOiBSZW1vdmVkLgorCSogc3JjL3BzYXV4L3BzZml4ZWQuaCAoY2YyX2ZyYWNUb0ZpeGVkKTogVXBkYXRlZC4KKworMjAxOS0wNS0wMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJVHdlYWsgTENEIGZpbHRlcmluZy4KKworCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoZnRfbGNkX2ZpbHRlcl9maXIsIF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSk6CisJQ2hvb3NlIGRpcmVjdGlvbiBmcm9tIGJpdG1hcCdzIHBpeGVsX21vZGUuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5jIChGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYyk6CisJVXBkYXRlZC4KKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogVXBkYXRlZC4KKworMjAxOS0wNS0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiB2bXNfbWFrZS5jb206IFVwZGF0ZWQgKCM1NjI1MykuCisKKwlSZW1vdmUgbm8gbG9uZ2VyIGV4aXN0aW5nIGRpcmVjdG9yaWVzIChgYXV0b2hpbnQnLCBgb3RsYXlvdXQnKS4KKwlVcGRhdGUgdXNlZCBiYXNlIGV4dGVuc2lvbnMuCisJQWN0aXZhdGUgYGF1dG9maXQnIG1vZHVsZS4KKwlBZGQgYGd4dmFsaWQnIG1vZHVsZS4KKwlVcGRhdGUgY29weXJpZ2h0IG5vdGljZXMuCisKKzIwMTktMDQtMjkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIFNpbXBsaWZ5IGN1YmljIELDqXppZXIgZmxhdHRlbmluZy4KKworCVRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBpcyBjb3JyZWN0IGJ1dCBpdCBpcyB0b28gY29tcGxleC4KKwlUaGUgcmV2aXNlZCBhbGdvcml0aG0gaXMgYmFzZWQgb24gdGhlIGZhY3QgdGhhdCBlYWNoIHNwbGl0IG1vdmVzCisJdGhlIGNvbnRyb2wgcG9pbnRzIGNsb3NlciB0byB0aGUgdHJpc2VjdGlvbiBwb2ludHMgb24gdGhlIGNob3JkLgorCVRoZSBjb3JyZXNwb25kaW5nIGRpc3RhbmNlcyBhcmUgZ29vZCBzdXJyb2dhdGVzIGZvciB0aGUgY3VydmUKKwlkZXZpYXRpb24gZnJvbSB0aGUgc3RyYWlnaHQgbGluZS4KKworCVRoaXMgY3ViaWMgZmxhdHRlbmluZyBhbGdvcml0aG0gaXMgc29tZXdoYXQgc2ltaWxhciB0byB0aGUgY29uaWMKKwlhbGdvcml0aG0gYmFzZWQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNvbnRyb2wgcG9pbnQgdG8gdGhlIG1pZGRsZSBvZgorCXRoZSBjaG9yZC4gIFRoZSBjdWJpYyBkaXN0YW5jZXMsIGhvd2V2ZXIsIGRlY3JlYXNlIGxlc3MgcHJlZGljdGFibHkKKwlidXQgYXJlIGVhc3kgZW5vdWdoIHRvIGNhbGN1bGF0ZSBvbiBlYWNoIHN0ZXAuCisKKwlUaGUgbmV3IGFsZ29yaXRobSBwcm9kdWNlcyBzbGlnaHRseSBsYXJnZXIgbnVtYmVyIG9mIHNwbGl0cywgd2hpY2ggaXMKKwljb21wZW5zYXRlZCBieSBpdHMgc2ltcGxpY2l0eS4gIFRoZSBvdmVyYWxsIHJlbmRlcmluZyBwZXJmb3JtYW5jZSBpcworCWltcHJvdmVkIGJ5IDEtMiUuICBUaGUgbGFyZ2VyIG51bWJlciBvZiBzcGxpdHMgZG9lcyBub3QgbmVjZXNzYXJpbHkKKwlyZXN1bHQgaW4gaGlnaGVyIHF1YWxpdHksIHdoaWNoIHN0YXlzIGNvbXBhcmFibGUuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3JlbmRlcl9jdWJpYyk6IFJlcGxhY2UgdGhlIHNwbGl0CisJY29uZGl0aW9uLgorCisyMDE5LTA0LTI2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbc21vb3RoXSBCaXRoYWNrcyBhbmQgY29zbWV0aWNzLgorCisJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9yZWNvcmRfY2VsbCwgZ3JheV9zZXRfY2VsbCwgZ3JheV9obGluZSwKKwlncmF5X3JlbmRlcl9jb25pYywgZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKTogVXBkYXRlZC4KKworMjAxOS0wNC0yNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJT3B0aW1pemUgQsOpemllciBiaXNlY3Rpb25zLgorCisJVGhpcyBjaGFuZ2UgbWFrZXMgYmlzZWN0aW9ucyBmYXN0ZXIgYnkgMjAtMzAlLiBXaGVuIGlubGluZWQgaW50bworCWBncmF5X3JlbmRlcl9jdWJpYycsIHRoaXMgbWFrZXMgdGhlIGZ1bmN0aW9uIGZhc3RlciBieSAxMCUgYW5kIGlzCisJbm90aWNlYWJsZSBpbiB0aGUgb3ZlcmFsbCByZW5kZXJpbmcgcGVyZm9ybWFuY2UuCisKKwkqIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYyAoU3BsaXRfQ29uaWMsIFNwbGl0X0N1YmljKTogVXNlIHNoaWZ0cyBhbmQKKwlyZWZhY3Rvci4KKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3NwbGl0X2NvbmljLCBncmF5X3NwbGl0X2N1YmljKTogRGl0dG8uCisJKiBzcmMvYmFzZS9mdHN0cm9rZS5jIChmdF9jb25pY19zcGxpdCwgZnRfY3ViaWNfc3BsaXQpOiBEaXR0by4KKwkqIHNyYy9iYXNlL2Z0YmJveC5jIChjdWJpY19wZWFrKTogVXNlIHNoaWZ0cy4KKworMjAxOS0wNC0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDEyX25leHQpOiBSZW1vdmUgZGVhZCBjb2RlLgorCisJRm91bmQgYnkgY2xhbmcgOC4wJ3Mgc3RhdGljIGFuYWx5emVyIGFuZCByZXBvcnRlZCBieSBTZW5kZXIgR2hvc3QKKwk8bGlnaHRzaWRlQGdteC5jb20+LgorCisyMDE5LTA0LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbYmFzZV0gRml4IHRoaW5rbyBpbiBwcmV2aW91cyBjb21taXQuCisKKwkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9CbGVuZCk6IENoZWNrIGZpbmFsIHdpZHRoLCBub3QKKwl0YXJnZXQgcGl0Y2guCisKKwlQcm9ibGVtIHJlcG9ydGVkIGJ5IFNlbmRlciBHaG9zdCA8bGlnaHRzaWRlQGdteC5jb20+LgorCisyMDE5LTA0LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9CbGVuZCk6IENoZWNrIHRhcmdldCBwaXRjaC4KKworCVByb2JsZW0gcmVwb3J0ZWQgYnkgU2VuZGVyIEdob3N0IDxsaWdodHNpZGVAZ214LmNvbT4uCisKKzIwMTktMDQtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCByZXR1cm4gdmFsdWUgb2YgYEZUX1NldF9OYW1lZF9JbnN0YW5jZScgKCM1NjE4NikuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9OYW1lZF9JbnN0YW5jZSk6IENvcnJlY3RseSBoYW5kbGUKKwlpbnRlcm5hbCByZXR1cm4gdmFsdWUgLTEgb2YgYFRUX1NldF9WYXJfRGVzaWduJy4KKworMjAxOS0wNC0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3BjZl0gRml4IGhhbmRsaW5nIG9mIHVuZGVmaW5lZCBnbHlwaCAoIzU2MDY3KS4KKworCVRoaXMgY29tbWl0IGZpeGVzIHRoZSBjaGFuZ2VzIGZyb20gMjAxOC0wNy0yMSwgd2hpY2ggYnJva2UgY2hhcm1hcAorCWl0ZXJhdGlvbi4gIFdlIG5vdyBhZGQgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGFzIGEgbmV3IGdseXBoIHdpdGgKKwlpbmRleCAwLCB0aHVzIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBnbHlwaHMgYnkgb25lIChhcyBiZWZvcmUpLgorCisJKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9tZXRyaWNzKTogQWRqdXN0IHRvIG5ldyBhcnRpZmljaWFsCisJZ2x5cGggd2l0aCBpbmRleCAwLgorCUxpbWl0IG51bWJlciBvZiBlbGVtZW50cyB0byA2NTUzNC4KKwkocGNmX2dldF9iaXRtYXBzKTogRGl0dG8uCisJVW5pZnkgdHdvIGxvb3BzIGludG8gb25lOyB0aGlzIGF2b2lkcyBhbGxvY2F0aW9uIG9mIGFuIGludGVybWVkaWF0ZQorCWFycmF5LgorCShwY2ZfZ2V0X2VuY29kaW5ncyk6IERvbid0IGZsaXAgaW5kaWNlcyBidXQgY29weSBnbHlwaCBtZXRyaWNzIG9mCisJZGVmYXVsdCBjaGFyYWN0ZXIgdG8gaW5kZXggMC4KKwlBbHNvIGhhbmRsZSBpbnZhbGlkIGRlZmF1bHQgY2hhcmFjdGVyLgogCiAJKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCiAKLTIwMTgtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMTktMDQtMTUgIE1pbm1pbiBHb25nICA8Z29uZ21pbm1pbkBtc24uY29tPgogCi0JW3RydWV0eXBlXSBSb3VuZCBvZmZzZXRzIG9mIGdseXBoIGNvbXBvbmVudHMgb25seSBpZiBoaW50aW5nIGlzIG9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQpOiBJbXBsZW1lbnQKLQlpdC4KLQotMjAxOC0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfdG9fZGVzaWduKTogUmVtb3ZlIGRlYWQgY29kZS4KLQotCVRoaXMgaXMgYSBiZXR0ZXIgZml4IHRoYW4gdGhlIHByZXZpb3VzIGNvbW1pdCwgd2hpY2ggaXMgbm93Ci0JcmV2ZXJ0ZWQuCi0KLTIwMTgtMDEtMDMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCU1vdmUgaW50ZXJuYWwgTENELXJlbGF0ZWQgZGVjbGFyYXRpb25zLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmggKGZ0X2xjZF9wYWRkaW5nLCBmdF9sY2RfZmlsdGVyX2Zpcik6Ci0JTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IC4uLiB0byBoZXJlLgotCi0yMDE4LTAxLTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX0VYUE9SVCwgRlRfRVhQT1JUX0RFRikKLQlbX01TQ19WRVJdOiBMaW1pdCBWaXN1YWwgQysrIGF0dHJpYnV0ZXMuCi0KLTIwMTgtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gTWFrZSBibGVuZC9kZXNpZ24gY29vcmRpbmF0ZSByb3VuZC10cmlwcGluZyB3b3JrLgotCi0JQmVoZGFkIHJlcG9ydGVkIHRoYXQgc2V0dGluZyBibGVuZCBjb29yZGluYXRlcywgdGhlbiBnZXR0aW5nIGRlc2lnbgotCWNvb3JkaW5hdGVzIGRpZCBpbmNvcnJlY3RseSByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UncwotCWNvb3JkaW5hdGVzLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9zZXRfbW1fYmxlbmQpOiBGaXggaXQuCi0KLTIwMTctMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEZpeCBlbmRsZXNzIGxvb3AuCisJKiBDTWFrZUxpc3RzLnR4dDogQXZvaWQgcmV3cml0aW5nIG9mIHVuY2hhbmdlZCBjb25maWd1cmF0aW9uIGZpbGVzLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NDgzOAorCSAgaHR0cHM6Ly9zYXZhbm5haC5ub25nbnUub3JnL3BhdGNoL2luZGV4LnBocD85NzU1CiAKLTIwMTctMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMTktMDQtMTUgIEpERyAgPEpvbmF0aGFuR0BpUW1ldHJpeC5jb20+CiAKLQlTeW5jaHJvbml6ZSBvdGhlciBXaW5kb3dzIHByb2plY3QgZmlsZXMuCi0KLQkqIGJ1aWxkcy93aW5kb3dzLyo6IEFkZCBtaXNzaW5nIGZpbGVzLgotCi0yMDE3LTEyLTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlVcGRhdGUgVmlzdWFsIEMgMjAxMCBwcm9qZWN0IGZpbGVzLgotCi0JUHJvYmxlbSByZXBvcnRlZCBieSBIaW4tVGFrLgotCi0JKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogQWRkIGZpbGVzIGBmdGJkZi5jJyBhbmQKLQlgZnRjaWQuYycuCi0JU29ydCBlbnRyaWVzLgotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2ouZmlsdGVyOiBEaXR0by4KLQlGaXggbWVtYmVycyBvZiBgRlRfTU9EVUxFJyBncm91cC4KLQotMjAxNy0xMi0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IFN5bmNocm9uaXplIHdpdGggdW5peCBgZnRjb25maWcuaW4nIGZpbGUuCi0KLTIwMTctMTItMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3VuaXgvZnRjb25maWcuaW46IFN5bmNocm9uaXplIHdpdGggbWFpbiBgZnRjb25maWcuaCcgZmlsZS4KLQotCVJlcG9ydGVkIGJ5IE5pa29sYXVzLgotCi0yMDE3LTEyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCi0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogTWFrZSBgcGl0Y2gnIGFuZAotCWBuZXdfcGl0Y2gnIHVuc2lnbmVkLgotCi0JKiBzcmMvYmFzZS9mdHBzcHJvcC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfUFJPUFNfSC4KLQotMjAxNy0xMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4ZXMgZm9yIGBtYWtlIG11bHRpJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oOiBVc2UgYEZUX0JBU0VfQ0FMTEJBQ0snLgotCShwc19wcm9wZXJ0eV9nZXQpOiBIYXJtb25pemUgZGVjbGFyYXRpb24gd2l0aCBjb3JyZXNwb25kaW5nCi0JZnVuY3Rpb24gdHlwZWRlZi4KLQotCSogaW5jbHVkZS9mcmVldHlbZS9pbnRlcm5hbC9mdHRyYWNlLmg6IEFkZCBgdHJhY2VfcHNwcm9wcycuCi0KLQkqIHNyYy9iYXNlL2Z0cHNwcm9wLmM6IEluY2x1ZGUgbmVjZXNzYXJ5IGhlYWRlciBmaWxlcy4KLQkoRlRfQ09NUE9ORU5UKTogRGVmaW5lLgotCShwc19wcm9wZXJ0eV9zZXQpOiBUYWcgd2l0aCBgRlRfQkFTRV9DQUxMQkFDS19ERUYnLgotCShwc19wcm9wZXJ0eV9nZXQpOiBUYWcgd2l0aCBgRlRfQkFTRV9DQUxMQkFDS19ERUYnLgotCUhhcm1vbml6ZSBkZWNsYXJhdGlvbiB3aXRoIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24gdHlwZWRlZi4KLQotMjAxNy0xMi0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JUHJvdmlkZSBzdXBwb3J0IGZvciBpbnRyYS1tb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb25zLgotCi0JVGhpcyBpcyBuZWVkZWQgZXNwZWNpYWxseSBmb3IgYG1ha2UgbXVsdGknIHdpdGggQysrLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIChGVF9CQVNFX0NBTExCQUNLLAotCUZUX0JBU0VfQ0FMTEJBQ0tfREVGKTogTmV3IG1hY3Jvcy4KLQotMjAxNy0xMi0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgotCi0JTW92ZSBQb3N0U2NyaXB0IGRyaXZlcnMnIHByb3BlcnR5IGhhbmRsZXJzIHRvIGBiYXNlJy4KLQotCVRoaXMgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGR1cGxpY2F0ZWQgY29kZSBhY3Jvc3MgUG9zdFNjcmlwdAotCWRyaXZlcnMuCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvdHlwZTEvdDFkcml2ZXIuYwotCSh7Y2ZmLGNpZCx0MX1fcHJvcGVydHlfe2dldCxzZXR9KTogTW92ZWQgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwc3Byb3AuaDogLi4udGhpcyBuZXcgZmlsZS4KLQkocHNfcHJvcGVydHlfe2dldCxzZXR9KTogTmV3IGZ1bmN0aW9ucyB0byByZXBsYWNlIG1vdmVkIG9uZXMuCi0KLQkqIHNyYy9iYXNlL2Z0cHNwcm9wLmM6IE5ldyBmaWxlIHRoYXQgaW1wbGVtZW50cyBhYm92ZSBmdW5jdGlvbnMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaAotCShGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX1BST1BTX0gpOiBOZXcgbWFjcm8uCi0KLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NpZC9jaWRyaXZlci5jLCBzcmMvdHlwZTEvdDFkcml2ZXIuYzoKLQlVcGRhdGVkLgotCi0JKiBzcmMvYmFzZS9KYW1maWxlLCBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpLCBzcmMvYmFzZS9mdGJhc2UuYzoKLQlVcGRhdGVkLgotCi0yMDE3LTEyLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlTcGVlZCB1cCBGVF9TZXRfVmFyX3tEZXNpZ24sQmxlbmR9X0Nvb3JkaW5hdGVzIGlmIGN1cnIgPT0gbmV3LgotCi0JV2UgZXhpdCBlYXJseSBpZiB0aGUgY3VycmVudCBkZXNpZ24gb3IgYmxlbmQgY29vcmRpbmF0ZXMgYXJlCi0JaWRlbnRpY2FsIHRvIHRoZSBuZXcgb25lcy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfc2V0X21tX2JsZW5kLCBUVF9TZXRfVmFyX0Rlc2lnbik6Ci0JSW1wbGVtZW50IGl0LCByZXR1cm5pbmcgaW50ZXJuYWwgZXJyb3IgY29kZSAtMSBpZiB0aGVyZSB3aWxsIGJlIG5vCi0JdmFyaWF0aW9uIGNoYW5nZS4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jICh0MV9zZXRfbW1fYmxlbmQpOiBEaXR0by4KLQotCSogc3JjL2Jhc2UvZnRtbS5jIChGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcywKLQlGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMsIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMpOiBVcGRhdGVkLgotCi0yMDE3LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbc2ZudF0gRml4IGNoYXJtYXAgdHlwZSAyIGl0ZXJhdG9yICgjNTI2NDYpLgotCi0JVGhlIHN1YnNldHRlZCBkZW1vIGZvbnQgb2YgdGhlIHJlcG9ydCB0aGF0IGV4aGliaXRzIHRoZSBidWcgaGFzIGEKLQl2ZXJ5IHVudXN1YWwgdHlwZSAyIGNtYXAgZm9yIFVuaWNvZGUoISk6IEl0IGNvbnRhaW5zIG9ubHkgdHdvCi0Jc3ViLWhlYWRlcnMsIG9uZSBmb3Igb25lLWJ5dGUgY2hhcmFjdGVycyAoY292ZXJpbmcgdGhlIHJhbmdlIDB4MjAgdG8KLQkweEZBKSwgYW5kIGEgc2Vjb25kIG9uZSBmb3IgaGlnaGVyIGJ5dGUgMHgwMSAoanVzdCBmb3IgY2hhcmFjdGVyCi0JY29kZSBVKzAxMzEpLgotCi0JQmVmb3JlIHRoaXMgY29tbWl0LCB0aGUgaXRlcmF0b3Igd2Fzbid0IGFibGUgdG8gY29ycmVjdGx5IGhhbmRsZSBhCi0Jc3ViLWhlYWRlciBmb3IgaGlnaGVyIGJ5dGUgMHgwMS4KLQotCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEZpeCBjaGFyYWN0ZXIgaW5jcmVtZW50Ci0JZm9yIG91dGVyIGxvb3AuCi0KLTIwMTctMTItMTggIE1hdHRoaWFzIENsYXNlbiAgPG1hdHRoaWFzLmNsYXNlbkBnbWFpbC5jb20+Ci0KLQlbdHJ1ZXR5cGVdIEZpeCBjbGFtcGluZywgbWlub3IgdHJhY2luZyBjb2RlIGJlYXV0aWZpY2F0aW9uLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfdG9fbm9ybWFsaXplZCk6IFRyYWNlIG51bWJlciBvZgotCWRlc2lnbiBjb29yZGluYXRlcy4KLQlVc2UgY2xhbXBlZCB2YWx1ZS4KLQotMjAxNy0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBzcmMvKi8qOiBPbmx5IHVzZSBgZnRfJyBhbmQgYEZUXycgdmFyaWFudHMgb2Ygc3RkYyBsaWJyYXJ5IHN0dWZmLgotCi0yMDE3LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2ZhY2VfdmFyeV9jdnQpOiBBZGQgc2l6ZSBndWFyZCAoIzUyNjg4KS4KLQotMjAxNy0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW3RydWV0eXBlXSBGaXggcHJldmlvdXMgY29tbWl0LgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCk6IENvcnJlY3RseSBoYW5kbGUKLQl1bmhpbnRlZCBwaGFudG9tIHBvaW50cywgd2hpY2ggbXVzdCBiZSBwcm9wZXJseSBzY2FsZWQuCi0KLTIwMTctMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gRG9uJ3QgYXBwbHkgSFZBUiBhbmQgVlZBUiBkZWx0YXMgdHdpY2UgKCM1MjY4MykuCi0KLQkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogQWx3YXlzIGFkanVzdAotCWBwcDEnIHRvIGBwcDQnLCBleGNlcHQgaWYgd2UgaGF2ZSBhbiBIVkFSIGFuZC9vciBWVkFSIHRhYmxlLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEhhbmRsZQotCWFsdGVybmF0aXZlIGNvZGUgYnJhbmNoIGlkZW50aWNhbGx5IHcuci50LiBwcmVzZW5jZSBvZiBhbiBIVkFSCi0JYW5kL29yIFZWQVIgdGFibGUuCi0KLTIwMTctMTItMTcgIEpvbmF0aGFuIEtldyAgPGpma3RoYW1lQGdtYWlsLmNvbT4KLQotCVt0cnVldHlwZV0gQ29ycmVjdGx5IGhhbmRsZSB2YXJpYXRpb24gZm9udCBwaGFudG9tIHBvaW50cyAoIzUyNjgzKS4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBGaXggcGhhbnRvbQotCXBvaW50IGluZGljZXMuCi0KLTIwMTctMTItMTcgIEpvbmF0aGFuIEtldyAgPGpma3RoYW1lQGdtYWlsLmNvbT4KLQotCUZpeCBpbmNvcnJlY3QgYWR2YW5jZSB3aWR0aCBzY2FsaW5nICgjNTI2ODMpLgotCi0JKiBzcmMvYmFzZS9mdGFkdmFuY2UuYyAoRlRfR2V0X0FkdmFuY2VzKTogQWx3YXlzIHJlc3BlY3QgdGhlCi0JRlRfTE9BRF9OT19TQ0FMRSBmbGFnIGlmIHByZXNlbnQuCi0KLTIwMTctMTItMTYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IEFmdGVyQnVpbGQgY29weS4KLQkqIG9ianMvLmdpdGlnbm9yZTogSWdub3JlIGFsbW9zdCBldmVyeXRoaW5nLgotCi0yMDE3LTEyLTExICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggY29tcGlsZXIgd2FybmluZyAoIzUyNjQwKS4KLQotCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIpOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUuCi0KLTIwMTctMTItMDggIEF6enVybyAgPGF6enVyb0B0ZWFtLW1lZGlhcG9ydGFsLmNvbT4KLQotCSogYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IEFkanVzdCBvdXRwdXQgZGlyZWN0b3J5LgotCi0JVGhpcyBhbGxvd3MgYnVpbGRzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGluIHBhcmFsbGVsLgotCi0yMDE3LTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggYG1ha2Ugc2V0dXAgZG9zJywgc2Vjb25kIHRyeSAoIzUyNjIyKS4KLQotCSogYnVpbGRzL2RldGVjdC5tayAoZG9zX3NldHVwKTogRG9uJ3QgdXNlIGxpdGVyYWwgYD4nIGNoYXJhY3RlciBhdAotCWFsbC4gIE1peGluZyB0aGUgZGlmZmVyZW50IGVzY2FwaW5nIHJ1bGVzIGZyb20gbWFrZSwgZG9zLCBhbmQKLQl3aW5kb3dzIGlzIHRvbyBmcmFnaWxlLgotCi0yMDE3LTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbZG9jbWFrZXJdIEZpeCBjb2RlIHNlY3Rpb24gcGFyc2luZy4KLQotCVN0dWZmIGxpa2UKLQotCSAgewotCSAgICA8YmxhPgotCSAgfQotCi0JY29uZnVzZWQgdGhlIHBhcnNlciwgd2hpY2ggaW5jb3JyZWN0bHkgdHJlYXRlZCBgPGJsYT4nIGFzIGEgbWFya3VwCi0JdGFnLgotCi0JKiBzcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSAoQ29udGVudFByb2Nlc3Nvcjo6cHJvY2Vzc19jb250ZW50KToKLQlBcHBseSBgcmVfbWFya3VwX3RhZ3MnIG9ubHkgb3V0c2lkZSBvZiBjb2RlIHNlY3Rpb25zLgotCi0yMDE3LTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlOZXcgYGZ0ZHJpdmVyLmgnIGZpbGUsIGNvdmVyaW5nIGFsbCBkcml2ZXIgbW9kdWxlcy4KLQotCVRoaXMgcmVkdWNlcyByZWR1bmRhbmN5IGFuZCBpbmNyZWFzZXMgc3luZXJneTsgaXQgYWxzbyByZWR1Y2VzIHRoZQotCW51bWJlciBvZiBoZWFkZXIgZmlsZXMuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggKEZUX0RSSVZFUl9IKTogTmV3IG1hY3JvLgotCShGVF9BVVRPSElOVEVSX0gsIEZUX0NGRl9EUklWRVJfSCwgRlRfVFJVRVRZUEVfRFJJVkVSX0gsCi0JRlRfUENGX0RSSVZFUl9ILCBGVF9UWVBFMV9EUklWRVJfSCk6IE1ha2UgdGhlbSBhbGlhc2VzIHRvCi0JRlRfRFJJVkVSX0guCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmgsCi0JaW5jbHVkZS9mcmVldHlwZS9mdHBjZmRydi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0dDFkcnYuaCwKLQlpbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaDogUmVwbGFjZWQgd2l0aC4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdGRyaXZlci5oOiAuLi50aGlzIG5ldyBmaWxlLgotCShGVF9DRkZfSElOVElOR19BRE9CRSwgRlRfVDFfSElOVElOR19BRE9CRSk6IFJlbmFtZWQgdG8uLi4KLQkoRlRfSElOVElOR19BRE9CRSk6IC4uLiB0aGlzIG5ldyBtYWNyby4KLQkoRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUsIEZUX1QxX0hJTlRJTkdfRlJFRVRZUEUpOiBSZW5hbWVkIHRvLi4uCi0JKEZUX0hJTlRJTkdfRlJFRVRZUEUpOiAuLi4gdGhpcyBuZXcgbWFjcm8uCi0KLQkqIHNyYy8qLyo6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLTIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1vdmUgYGZ0ZHJpdmVyLmgnIHRvIGBmdGRydi5oJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oOiBSZW5hbWVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2Lmg6IC4uLiB0aGlzIG5hbWUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvaW50ZXJuYWwuaCAoRlRfSU5URVJOQUxfRFJJVkVSX0gpOgotCVVwZGF0ZWQuCi0KLTIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUZpeCBhY2Nlc3MgdG8gdW5pbml0YWxpemVkIG1lbW9yeSAoIzUyNjEzKS4KLQotCUFsc28gcmVwb3J0ZWQgYXMKLQotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzkxMzE3Ci0KLQkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKTogSWYgaW5jcmVhc2luZyB0aGUKLQliaXRtYXAgc2l6ZSBuZWVkcyBhIGxhcmdlciBiaXRtYXAgYnVmZmVyLCBhc3N1cmUgdGhhdCB0aGUgbmV3IG1lbW9yeQotCWFyZWFzIGFyZSBpbml0aWFsaXplZCBhbHNvLgotCi0yMDE3LTEyLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggYG1ha2Ugc2V0dXAgZG9zJyAoIzUyNjIyKS4KLQotCSogYnVpbGRzL2RldGVjdC5tayAoZG9zX3NldHVwKTogUHJvcGVybHkgZXNjYXBlIGxpdGVyYWwgYD4nCi0JY2hhcmFjdGVyLgotCi0yMDE3LTEyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlGaXggQysrIGNvbXBpbGF0aW9uLgotCi0JKiBzcmMvcHNhdXgvcHNhdXhtb2QuaDogVXNlIEZUX0NBTExCQUNLX1RBQkxFIG1hY3JvIHdoZXJlIG5lY2Vzc2FyeS4KLQotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBGaXggd2FybmluZy4KLQotMjAxNy0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JRml4IGBtYWtlIG11bHRpJy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg6IFJlbW92ZSB1bnVzZWQgdHJhY2luZyBtYWNyb3MuCi0Jcy9wc2hhbGdvMi9wc2hhbGdvLy4KLQlBZGQgYHRyYWNlX2NmZmRlY29kZScuCi0JKiBzcmMvcHNoaW50ZXIvcHNoYWxnby5jIChGVF9DT01QT05FTlQpOiBVcGRhdGVkLgotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ILgotCSogc3JjL2NmZi9jZmZvYmpzLmM6IEluY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSCBhbmQKLQlGVF9TRVJWSUNFX0NGRl9UQUJMRV9MT0FEX0guCi0KLQkqIHNyYy9jaWQvY2lkcml2ZXIuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ILgotCi0JKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmM6IEluY2x1ZGUgRlRfRlJFRVRZUEVfSCBhbmQKLQlGVF9JTlRFUk5BTF9ERUJVR19ILgotCShGVF9DT01QT05FTlQpOiBEZWZpbmUuCi0JKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSC4KLQkqIHNyYy9wc2F1eC9wc2F1eG1vZC5oOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0guCi0JRGVjbGFyZSBgY2ZmX2J1aWxkZXJfZnVuY3MnIGFuZCBgcHNfYnVpbGRlcl9mdW5jcycuCi0JKiBzcmMvcHNhdXgvcHNmdC5jOiBJbmNsdWRlIGBwc29ianMuaCcgYW5kIGBjZmZkZWNvZGUuaCcuCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMgOiBJbmNsdWRlIGBwc2F1eG1vZC5oJy4KLQotMjAxNy0xMi0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oOiBTb21lIGNsZWFuLXVwLgotCi0JVGhpcyBjb21taXQgcmVtb3ZlcyBkb2N1bWVudGF0aW9uIG9mIGRlcHJlY2F0ZWQgbWFjcm9zIGFuZCBkb2VzIHNvbWUKLQltaW5vciBzdHJlYW1saW5pbmcuCi0KLTIwMTctMTItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogYnVpbGRzL3N5bWJpYW4vYmxkLmluZjogVXBkYXRlZC4KLQotMjAxNy0xMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTmV3IGhlYWRlciBmaWxlIGBmdHBhcmFtcy5oJyB0aGF0IGNvbGxlY3RzIGFsbCBwYXJhbWV0ZXIgdGFncy4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfUEFSQU1FVEVSX1RBR1NfSCk6IE5ldwotCW1hY3JvLgotCShGVF9UUlVFVFlQRV9VTlBBVEVOVEVEX0gsIEZUX1VOUEFURU5URURfSElOVElOR19IKTogRGVmaW5lIGl0IHRvCi0JYGZ0cGFyYW1zLmgnLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0YXV0b2guaCwgaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaCwgaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oLAotCWluY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaCwgaW5jbHVkZS9mcmVldHlwZS9mdHQxZHJ2Lmg6IEluY2x1ZGUKLQlGVF9QQVJBTUVURVJfVEFHU19ILgotCU1vdmUgRlRfUEFSQU1fVEFHX1hYWCBkZWZpbml0aW9ucyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9mdHBhcmFtcy5oOiAuLi50aGlzIG5ldyBmaWxlLgotCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL3R0dW5wYXQuaDogUmVtb3ZlLiAgTm8gbG9uZ2VyIG5lZWRlZC4KLQotMjAxNy0xMi0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JSW1wcm92ZSB0cmFjaW5nIG1lc3NhZ2VzIGJ5IHVzaW5nIHNpbmd1bGFyIGFuZCBwbHVyYWwgZm9ybXMuCi0KLQkqIHNyYy8qLyouYzogSW1wbGVtZW50IGl0LgotCi0yMDE3LTEyLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlbdHJ1ZXR5cGVdIEFsbG93IHNoYXJlZCBwb2ludHMgaW4gYGN2YXInIHRhYmxlICgjNTI1MzIpLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9mYWNlX3ZhcnlfY3Z0KTogSW1wbGVtZW50IGl0IGJ5IGNvcHlpbmcKLQlhbmQgYWRqdXN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgZnJvbQotCWBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcycuCi0KLTIwMTctMTEtMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0cnVldHlwZV0gSW1wcm92aW5nIHRyYWNpbmcgb2YgY29tcG9zaXRlIGdseXBocy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9Db21wb3NpdGVfR2x5cGgpCi0JW0ZUX0RFQlVHX0xFVkVMX1RSQUNFXTogU2hvdyBjb21wb3NpdGUgZ2x5cGggaW5mb3JtYXRpb24uCi0KLTIwMTctMTEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gQWxsb3cgKGFnYWluKSBgL0VuY29kaW5nJyB3aXRoID4yNTYgZWxlbWVudHMgKCM1MjQ2NCkuCi0KLQlJbiB2ZXJzaW9uIDIuNi4xLCB0aGlzIGhhcyBiZWVuIGRpc2FsbG93ZWQgdG8gYmV0dGVyIHJlamVjdAotCW1hbGZvcm1lZCBmb250czsgaG93ZXZlciwgdGhpcyByZXN0cmljdGlvbiB3YXMgdG9vIHN0cm9uZy4gIFRoaXMKLQl0aW1lLCB3ZSBvbmx5IHRha2UgdGhlIGZpcnN0IDI1NiBlbGVtZW50cyBpbnRvIGFjY291bnQsIHNpbmNlCi0JZW5jb2RpbmcgYXJyYXlzIGFyZSBhbHdheXMgYWNjZXNzZWQgd2l0aCBhIDhiaXQgaW50ZWdlciwgYWNjb3JkaW5nCi0JdG8gdGhlIFBvc3RTY3JpcHQgTGFuZ3VhZ2UgUmVmZXJlbmNlLgotCi0JKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHBhcnNlX2VuY29kaW5nKTogSW1wbGVtZW50IGl0LgotCi0yMDE3LTExLTI3ICBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpICA8amFuLnN0ZWZmZW5zQGdtYWlsLmNvbT4KLQotCUZpeCBsYXN0IGNvbW1pdCAoIzUyNTIyKS4KLQotCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiBTZXQgYEZUX09QVElPTl9IJyBhbmQgYEZUT1BUSU9OX0ZMQUcnCi0JcHJvcGVybHkgaWYgd2UgaGF2ZSBgZnRvcHRpb24uaCcgaW4gYEJVSUxEX0RJUicuCi0KLTIwMTctMTEtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt1bml4XSBJbnN0YWxsIGEgbWFzc2FnZWQgYGZ0b3B0aW9uLmgnIGZpbGUgKCM1MTc4MCkuCi0KLQkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcgKGZ0b3B0aW9uX3NldCwgZnRvcHRpb25fdW5zZXQpOiBOZXcKLQlhdXhpbGlhcnkgZnVuY3Rpb25zIHRvIGNvbnN0cnVjdC4uLgotCShGVE9QVElPTl9IX1NFRCk6IC4uLiB0aGlzIG5ldyB2YXJpYWJsZS4KLQlBcHBseSBpdCBhcyBhIHNlZCBhcmd1bWVudCB3aGlsZSBjb3B5aW5nIGBmdG9wdGlvbi5oJyB0byB0aGUKLQlgYnVpbGRzL3VuaXgnIGRpcmVjdG9yeSAodXNpbmcgYEFDX0NPTkZJR19GSUxFUycpLgotCVNpbXBsaWZ5IGNvZGUgb2YgdGVzdCB0aGF0IGNoZWNrcyBjcHAncyBjb21wdXRhdGlvbiBvZiBiaXQgbGVuZ3RoCi0JKHRoZSB0ZXN0IHByZXZpb3VzbHkgY3JlYXRlZCBhbiBlbXB0eSBgZnRvcHRpb24uaCcgZmlsZSBhbmQgZGVsZXRlZAotCWl0IGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMpOyB3aXRob3V0IHRoaXMgY2hhbmdlLCBpdCBjYW4gaGFwcGVuIG9uIG15Ci0JR05VL0xpbnV4IGJveCB0aGF0IGBjb25maWd1cmUncyBleGVjdXRpb24gb2YgYGNvbmZpZy5zdGF0dXMnIGRvZXNuJ3QKLQljcmVhdGUgYGZ0b3B0aW9uLmgnIChubyBpZGVhIHdoeSB0aGlzIGhhcHBlbnMpLgotCi0JKiBidWlsZHMvdW5peC9pbnN0YWxsLm1rIChpbnN0YWxsKTogSW5zdGFsbAotCWBidWlsZHMvdW5peC9mdG9wdGlvbi5oJy4KLQotCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKERJU1RDTEVBTik6IFVwZGF0ZWQuCi0KLQkqIGJ1aWxkcy91bml4Ly5naXRpZ25vcmU6IFVwZGF0ZWQuCi0KLTIwMTctMTEtMjMgIFRvciBBbmRlcnNzb24gIDx0b3IuYW5kZXJzc29uQGFydGlmZXguY29tPgotCi0JU2lsZW5jZSB1bnVzZWQgZnVuY3Rpb24gd2FybmluZ3MgKCM1MjQ2NSkuCi0KLQlTb21lIHN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgY2F1c2UgdW51c2VkIGZ1bmN0aW9uIHdhcm5pbmdzIGlmCi0JY2VydGFpbiBjb25maWcgb3B0aW9ucyBhcmUgdHVybmVkIG9mZiB2aWEgYGZ0b3B0aW9uLmgnLgotCi0JKiBzcmMvYmFzZS9mdGJhc2UuaCwgc3JjL2Jhc2UvZnRyZm9yay5jLCBzcmMvc2ZudC90dGJkZi5oLAotCXNyYy90cnVldHlwZS90dGd4dmFyLmg6IEFkZCAjaWZkZWYgZ3VhcmRzIGFyb3VuZCB0aGVzZSBzZWN0aW9ucy4KLQotMjAxNy0xMS0yMiAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgotCi0JKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfc2V0R2x5cGhXaWR0aCk6IENoZWNrIGZvcm1hdCBiZWZvcmUgc2V0dGluZy4KKwkqIHNyYy90b29scy9hcGluYW1lcy5jIChtYWluKTogRml4IGVycm9yIG1lc3NhZ2UuCiAKIAlSZXBvcnRlZCBhcwogCi0JICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD00Mzc3CisJICBodHRwczovL3NhdmFubmFoLm5vbmdudS5vcmcvcGF0Y2gvPzk3OTYKIAotMjAxNy0xMS0yMiAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOS0wNC0xMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JW3BzYXV4XSBGaXggQ0ZGIGFkdmFuY2Ugd2lkdGhzLiAoIzUyNDY2KQorCVtzbW9vdGhdIEZpeCBzZWdmYXVsdCBpbiBkaXJlY3QgbW9kZSAoIzU2MDkyKS4KIAotCUdseXBoIGFkdmFuY2Ugd2lkdGhzIHdlcmUgYmVpbmcgd3JpdHRlbiB0byB0aGUgbmV3IGBQU19EZWNvZGVyJyBidXQgbm90Ci0Jc2F2ZWQgdG8gdGhlIHVuZGVybHlpbmcgZm9ybWF0IHNwZWNpZmljIGRlY29kZXIuIFRoaXMgY2F1c2VkIHB1cmUgQ0ZGCi0JZm9udHMgdG8gaGF2ZSBiYWQgYWR2YW5jZSB3aWR0aC4KKwkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9SZW5kZXIpOiBTZXQgbWlzc2luZyBjbGlwX2JveCBmb3IKKwlkaXJlY3QgbW9kZS4KKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3Jhc3Rlcl9yZW5kZXIpOiBVc2UgaXQuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfRGVjb2Rlcik6IENoYW5nZSBgZ2x5cGhfd2lkdGgnCi0JZmllbGQgdG8gcG9pbnRlci4KLQlSZW1vdmUgdW51c2VkIGZpZWxkcy4KLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfZGVjb2Rlcl9pbml0KTogQ2hhbmdlIGBnbHlwaF93aWR0aCcgZnJvbSBjb3B5Ci0JdG8gcmVmZXJlbmNlLgotCVJlbW92ZSB1bnVzZWQuCi0JKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfc2V0R2x5cGhXaWR0aCk6IFVwZGF0ZSBjb2RlLgorMjAxOS0wNC0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0yMDE3LTExLTE1ICBWbGFkIFRzeXJrbGV2aWNoICA8dnRzeXJrbGV2aWNoQGdvb2dsZS5jb20+CisJKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfZ2V0X2dseXBoX25hbWUpOiBQYWNpZnkgY29tcGlsZXIgKCM1NjA2MSkuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaDogRml4IGBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jJyB0eXBlLgorCVRoaXMgaXMgZm9yIFZpc3VhbCBTdHVkaW8gMjAxOSBvbiBBUk0uCiAKLTIwMTctMTEtMTQgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KKzIwMTktMDQtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVVzZSBBZG9iZSBoaW50aW5nIGVuZ2luZSBmb3IgYGxpZ2h0JyBoaW50aW5nIG9mIGJvdGggQ0ZGIGFuZCBUeXBlIDEuCisJRm9yIGRpc3RyaWJ1dGlvbiwgcmVwbGFjZSBgLnRhci5iejInIHdpdGggYC50YXIueHonIGJ1bmRsZXMuCiAKLQlTaW5jZSBFd2FsZCBIZXcgZmFjdG9yZWQgdGhlIEFkb2JlIGhpbnRpbmcgZW5naW5lIG91dCBvZiB0aGUgQ0ZGCi0JZHJpdmVyIGNvZGUsIHdlIGNhbiBub3cgdXNlIGl0IG9uIFR5cGUgMSAoYW5kIENJRCkgZm9udCBmb3JtYXRzLCBhcwotCWJvdGggaGF2ZSB0aGUgc2FtZSBoaW50aW5nIHBoaWxvc29waHkuCisJKiBidWlsZHMvdG9wbGV2ZWwubWsgKGJ1aWxkKTogRG8gaXQuCiAKLQlUaGlzIGNoYW5nZSBhY3RpdmF0ZXMgdGhlIEFkb2JlIGhpbnRlciB3aGVuIGluIExJR0hUIG1vZGUsIGFuZAotCXRoZXJlZm9yZSBhbHdheXMgdW5sZXNzIGV4cGxpY2l0bHkgYXNraW5nIGZvciB0aGUgYXV0by1oaW50ZXIuICBUaGlzCi0JbWFrZXMgTElHSFQgYmVoYXZpb3IgY29uc2lzdGVudCB3aXRoIENGRiBmb250cy4gIEFzIG9mIHRoaXMgY29tbWl0LAotCXRoZSBoaW50aW5nIGVuZ2luZSB0YWJsZSBsb29rcyBhcyBmb2xsb3dzLgorCSogUkVBRE1FLCBkb2NzL0NIQU5HRVMsIGRvY3MvcmVsZWFzZTogVXBkYXRlZC4KIAotCSAgICAgICAgICAgICBMSUdIVCAgTk9STUFMCi0JICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICAgVHJ1ZVR5cGUgIEF1dG8gICB2NDAKLQkgICBDRkYgICAgICAgQWRvYmUgIEFkb2JlCi0JICAgVHlwZSAxICAgIEFkb2JlICBBZG9iZQorMjAxOS0wNC0wNiAgQW50b255IExlZSAgPGFubnR6ZXIubGVlQGdtYWlsLmNvbT4KIAotMjAxNy0xMS0xMCAgWXVyaSBMZXZjaGVua28gIDx5dXJpX2xldmNoZW5rb0Bib29sYXQuY29tPgorCU1ha2UgYGdseXBoX25hbWUnIHBhcmFtZXRlciB0byBgRlRfR2V0X05hbWVfSW5kZXgnIGEgYGNvbnN0Jy4KIAotCSogQ01ha2VMaXN0cy50eHQ6IEFkZCBgRElTQUJMRV9GT1JDRV9ERUJVR19QUkVGSVgnIG9wdGlvbi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfR2V0X05hbWVfSW5kZXgpLAorCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfR2V0R2x5cGhOYW1lSW5kZXhGdW5jKSwKKwlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKKwkoRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpLCBzcmMvYmFzZS9mdG9ianMuYyAoRlRfR2V0X05hbWVfSW5kZXgpLAorCXNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX2dldF9uYW1lX2luZGV4KSwgc3JjL3NmbnQvc2Zkcml2ZXIuYworCShzZm50X2dldF9uYW1lX2luZGV4KSwgc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX2dldF9uYW1lX2luZGV4KSwKKwlzcmMvdHlwZTQyL3Q0MmRyaXZyLmMgKHQ0Ml9nZXRfbmFtZV9pbmRleCk6IEFkZCBgY29uc3QnIHRvIHNlY29uZAorCWFyZ3VtZW50LgogCi0yMDE3LTExLTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisyMDE5LTAzLTMxICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgogCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFJlbG9jYXRlIGNvbmRpdGlvbi4KKwlbY2ZmXSBGaXggYm91bmRhcnkgY2hlY2tzLgogCi0yMDE3LTExLTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJNjQyYmM3NTkwYzcwMWM4Y2QzNWE5ZjYwZmE4OTljZmE1MThiMTdmZiBpbnRyb2R1Y2VkIGR5bmFtaWNhbGx5CisJYWxsb2NhdGVkIG1lbW9yeSB3aGVuIHBhcnNpbmcgQ0ZGIGZpbGVzIHdpdGggdGhlICJvbGQiIGVuZ2luZS4gIEJvdW5kcworCWNoZWNrcyBoYXZlIG5ldmVyIGJlZW4gdXBkYXRlZCwgaG93ZXZlciwgbGVhZGluZyB0byBwb2ludGxlc3MKKwljb21wYXJpc29ucyBvZiBwb2ludGVycyBpbiBzb21lIGNhc2VzLiAgVGhpcyBjb21taXQgcHJlc2VudHMgYQorCXNvbHV0aW9uIGZvciBib3VuZHMgY2hlY2tzIGluIHRoZSBDRkYgbW9kdWxlIHdpdGggYW4gZXh0ZW5kZWQgbG9naWMKKwlmb3IgdGhlICJvbGQiIGVuZ2luZSB3aGlsZSBzdGF5aW5nIGFzIGNvbmNpc2UgYXMgcG9zc2libGUgZm9yIHRoZQorCSJuZXciIG9uZS4KIAotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfc2V0X2NlbGwpOiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCisJKiBzcmMvY2ZmL2NmZnBhcnNlLmg6IEludHJvZHVjZSB0aGUgc3RydWN0IGBDRkZfVDJfU3RyaW5nUmVjJyBhbmQKKwl0aGUgYWRkaXRpb25hbCBmaWVsZCBgdDJfc3RyaW5ncycgd2l0aGluIGBDRkZfUGFyc2VyUmVjJy4KIAotMjAxNy0xMS0wMyAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgotCi0JW3BzYXV4XSBGaXggUG9zdFNjcmlwdCBpbnRlcnByZXRlciByZXdpbmRpbmcgaW4gVHlwZSAxIG1vZGUuICgjNTIyNTEpCi0KLQlUaGUgaW50ZXJwcmV0ZXIgaW4gVHlwZSAxIG1vZGUgcmV3aW5kcyB0aGUgY2hhcnN0cmluZyBhZnRlciBjb2xsZWN0aW5nCi0JYWxsIGhpbnRzIGZvciBidWlsZGluZyB0aGUgaW5pdGlhbCBoaW50bWFwIChjb21taXQgZDUyZGQ3ZikuIEhvd2V2ZXIsCi0Jc29tZSBjaGFyc3RyaW5ncyB1c2UgYGVuZGNoYXInIGluIGEgZmluYWwgc3Vicm91dGluZSBjYWxsLCByZXdpbmRpbmcgdG8KLQl0aGUgc3RhcnQgb2YgdGhhdCBzdWJyb3V0aW5lLCBhbmQgb25seSBhIHNtYWxsIHNlY3Rpb24gb2YgdGhlIGFjdHVhbAotCWdseXBoIGlzIGRyYXduLgotCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZEVORENIQVI+OgotCUVuc3VyZSB3ZSBhcmUgb24gdGhlIHRvcCBsZXZlbCBjaGFyc3RyaW5nIGJlZm9yZSByZXdpbmRpbmcuCi0KLTIwMTctMTEtMDMgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+Ci0KLQlbdHJ1ZXR5cGVdIEFkZCBtb3JlIHRyaWNreSBmb250cy4KLQotCVNlZSB0aGUgcmVwb3J0IGJ5IFlhbmcgWWluc2VuLgotCWh0dHBzOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxNy0xMS9tc2cwMDAwMC5odG1sCi0KLQkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHJpY2tfbmFtZXMpOiBBZGQgYERGR290aGljLUVCJywKLQlgREZHeW9TaG8tTHQnLCBgREZIU0dvdGhpYy1XNScsIGBERkhTTWluY2hvLVczJyBhbmQgYERGSFNNaW5jaG8tVzcnLgotCSh0dF9jaGVja190cmlja3luZXNzX3NmbnRfaWRzKTogQWRkIGNoZWNrc3VtcyBmb3IgREZHb3RoaWMtRUIsCi0JREZHeW9TaG8tTHQsIERGSFNHb3RoaWMtVzUsIERGSFNNaW5jaG8tVzMgYW5kIERGSFNNaW5jaG8tVzcuICBBbHNvCi0JYWRkIGNoZWNrc3VtcyBmb3IgRExDTGlTaHUgYW5kIERMQ0hheUJvbGQgd2hpY2ggdGhlaXIgZmFtaWx5IG5hbWVzCi0Jd2VyZSBhbHJlYWR5IGxpc3RlZCBidXQgdGhlaXIgY2hlY2tzdW1zIHdlcmUgcHJldmlvdXNseSB1bmtub3duLgotCi0yMDE3LTExLTAxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQlbc21vb3RoXSBGaXggY29tcGxleCByZW5kZXJpbmcgYXQgaGlnaCBwcGVtLgotCi0JV2UgdXNlZCB0byBzcGxpdCBsYXJnZSBnbHlwaHMgaW50byBob3Jpem9udGFsIGJhbmRzIGFuZCBjb250aW51ZQotCWJpc2VjdGluZyB0aGVtIHN0aWxsIGhvcml6b250YWxseSBpZiB0aGF0IHdhcyBub3QgZW5vdWdoLiAgVGhpcyBpcwotCWd1YXJhbnRlZWQgdG8gZmFpbCB3aGVuIGEgc2luZ2xlIHNjYW5saW5lIGNhbm5vdCBmaXQgaW50byB0aGUKLQlyZW5kZXJpbmcgbWVtb3J5IHBvb2wuICBOb3cgd2UgYmlzZWN0IHRoZSBiYW5kcyB2ZXJ0aWNhbGx5IHNvIHRoYXQKLQl0aGUgc21hbGxlc3QgdW5pdCBpcyBhIGNvbHVtbiBvZiB0aGUgYmFuZCBoZWlnaHQsIHdoaWNoIGlzIGd1cmFudGVlZAotCXRvIGZpdCBpbnRvIG1lbW9yeS4KLQotCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaCk6IEltcGxlbWVudCBpdC4KLQotMjAxNy0xMC0yMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW3Ntb290aF0gSW1wcm92ZSBjb21wbGV4IHJlbmRlcmluZyBhdCBoaWdoIHBwZW0uCi0KLQlBdCBsYXJnZSBzaXplcyBhbG1vc3QgYnV0IG5vdCBleGFjdGx5IGhvcml6b250YWwgc2VnbWVudHMgY2FuIHF1aWNrbHkKLQlkcmFpbiB0aGUgcmVuZGVyaW5nIHBvb2wuIFRoaXMgcGF0Y2ggYXQgbGVhc3QgYXZvaWRzIGZpbGxpbmcgdGhlIHBvb2wKLQl3aXRoIHRyaXZpYWwgY2VsbHMuIEJleW9uZCB0aGlzLCB3ZSBjYW4gb25seSBpbmNyZWFzZSB0aGUgcG9vbCBzaXplLgotCi0JUmVwb3J0ZWQsIGFuYWx5emVkLCBhbmQgdGVzdGVkIGJ5IENvbGluIEZhaGV5LgotCi0JKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9zZXRfY2VsbCk6IERvIG5vdCByZWNvcmQgdHJpdmlhbCBjZWxscy4KLQotMjAxNy0xMC0yMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEltcHJvdmUgdHJhY2luZyBpbiBGVF9Mb2FkX0dseXBoLCBGVF8qX1NpemUuCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVGFnIHRyYWNpbmcgbWVzc2FnZXMgd2l0aAotCWZ1bmN0aW9uIG5hbWUsIGdseXBoIGluZGV4LCBhbmQgbG9hZCBmbGFncy4KLQkoRlRfU2VsZWN0X01ldHJpY3MsIEZUX1JlcXVlc3RfTWV0cmljcyk6IFJlbW92ZSBhbGwgdHJhY2luZy4KLQkoRlRfU2VsZWN0X1NpemUsIEZUX1JlcXVlc3RfU2l6ZSk6IEltcHJvdmUgdHJhY2luZy4KLQotMjAxNy0xMC0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgotCi0JW2Jhc2VdIEltcHJvdmUgdHJhY2luZyBpbiBGVF9SZW5kZXJfR2x5cGguCi0KLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpOiBBZGQgdG90YWwgY292ZXJhZ2UKLQljYWxjdWxhdGlvbnMgYW5kIGRvd25ncmFkZSBOZXRwYm0gZHVtcCB0byBiaXRtYXA6Ny4KLQotMjAxNy0xMC0xNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgotCi0JW2NmZl0gRml4IHNlZ2ZhdWx0IG9uIG1pc3NpbmcgYHBzYXV4JyAoIzUyMjE4KQotCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX2RvbmVfYmxlbmQpOiBBZGQgYSBjaGVjayBmb3IgcG9zc2libGUgbnVsbHB0ci4KLQotCSogbW9kdWxlcy5jZmc6IFVwZGF0ZSBkZXBlbmRlbmN5IGxpc3QuCi0KLTIwMTctMTAtMTUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlLCBjZmZdIEZpeCBNU1ZDIHdhcm5pbmdzLgotCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTmV3X0xpYnJhcnkpOiBDNDcwMjogdW5yZWFjaGFibGUgY29kZS4KLQkoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOiBDNDI0NDogcG9zc2libGUgbG9zcyBvZiBkYXRhLgotCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9ibGVuZF9kb0JsZW5kKTogQzQyNDQ6IHBvc3NpYmxlIGxvc3Mgb2YgZGF0YS4KLQlUdXJuIGBzdW0nIGludG8gdW5zaWduZWQuCi0KLTIwMTctMTAtMTQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KLQotCVtiYXNlXSBOZXRwYm0gaW1hZ2UgdHJhY2luZy4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBUcmFjZSBiaXRtYXAgc2l6ZS4KLQkoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogVHJhY2UgYml0bWFwIGluIE5ldHBibSBmb3JtYXQuCi0KLQkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3N3ZWVwKTogU3dlZXAgcmVtbmFudHMgb2Ygc3BhbiB0cmFjaW5nLgotCi0yMDE3LTEwLTE0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+Ci0KLQkqIGJ1aWxkcy93aW5kb3dzL2Z0ZGVidWcuYyAoRlRfTWVzc2FnZSk6IFByaW50IHRvIHN0ZGVyci4KLQkqIGJ1aWxkcy93aW5jZS9mdGRlYnVnLmMgKEZUX01lc3NhZ2UpOiBEaXR0by4KLQotMjAxNy0xMC0xNCAgQmVoZGFkIEVzZmFoYm9kICA8YmVoZGFkQGJlaGRhZC5vcmc+Ci0KLQlbYWZzaGFwZXJdIERlbGF5IGNyZWF0aW5nIGBoYl9zZXQnIG9iamVjdHMgdW50aWwgbmVlZGVkLgotCi0JSW4gcnVucyBvbiBOb3RvIE5hc2toIEFyYWJpYywgdGhpcyByZXN1bHRzIGluIDg5IHNldHMgY3JlYXRlZAotCWluc3RlYWQgb2YgMzQwIGJlZm9yZS4gIE1ha2VzIGF1dG8taGludGVyIHNldHVwIHdpdGggSGFyZkJ1enoKLQllbmFibGVkIDIwJSB0byAzMCUgZmFzdGVyLgotCi0JKiBzcmMvYXV0b2ZpdC9hZnNoYXBlci5jIChhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKTogSW1wbGVtZW50IGl0LgotCi0yMDE3LTEwLTEyICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+Ci0KLQlbdHlwZTEsIGNpZF0gQWRkIGhpbnRpbmcgZW5naW5lIHN3aXRjaC4KLQotCUltcGxlbWVudCBwcm9wZXJ0eSBzZXJ2aWNlIGluIGB0eXBlMScgYW5kIGBjaWQnIGRyaXZlcnMgdG8gYWxsb3cKLQlzd2l0Y2hpbmcgYmV0d2VlbiBGcmVlVHlwZSBvciBBZG9iZSBoaW50aW5nIGVuZ2luZSB3aGVuIGJvdGggYXJlCi0JYXZhaWxhYmxlLgotCi0JKiBzcmMvY2lkL2NpZHJpdmVyLmMgKGNpZF9wcm9wZXJ0eV97c2V0LGdldH0sIGNpZF9zZXJ2aWNlcyksCi0Jc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3Byb3BlcnR5X3tzZXQsZ2V0fSwgdDFfc2VydmljZXMpOiBBZGQKLQlQcm9wZXJ0aWVzIHNlcnZpY2UuCi0KLQkqIHNyYy9jaWQvY2lkb2Jqcy5jIChjaWRfZHJpdmVyX2luaXQpLCBzcmMvdHlwZTEvdDFvYmpzLmMKLQkoVDFfRHJpdmVyX0luaXQpOiBBZGQgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMuCi0KLTIwMTctMTAtMTIgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KLQotCUFkZCBUMV9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29uZmlndXJhdGlvbiBvcHRpb24uCi0KLQlUaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIG9sZCBUeXBlIDEgZW5naW5lIGdldHMgY29tcGlsZWQgaW50byBGcmVlVHlwZS4KLQlJdCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotCi0JKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCi0JKFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSk6IE5ldyBtYWNyby4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChQU19EZWNvZGVyKTogUmVtb3ZlIHVudXNlZCBmaWVsZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL2NpZC9jaWRnbG9hZC5jCi0JKGNpZF9sb2FkX2dseXBoKSwgc3JjL3BzYXV4L3BzYXV4bW9kLmMsIHNyYy9wc2F1eC9wc29ianMuYwotCShwc19idWlsZGVyX2FkZF9wb2ludCksIHNyYy9wc2F1eC90MWRlY29kZS5jCi0JKHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSwgdDFfZGVjb2Rlcl9wYXJzZV9nbHlwaCwKLQl0MW9wZXJhdG9yX3NlYWMsIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpLCBzcmMvcHNhdXgvdDFkZWNvZGUuaCwKLQlzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogU3Vycm91bmQKLQlyZWxldmFudCBjb2RlIHdpdGggbWFjcm8uCi0JTWlub3IgY29kZSBjaGFuZ2VzLgotCi0yMDE3LTEwLTEyICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+Ci0KLQlFeHRyYWN0IHdpZHRoIHBhcnNpbmcgZnJvbSBUeXBlIDEgcGFyc2VyLgotCi0JRHVwbGljYXRlIHRoZSBmYXN0IGFkdmFuY2Ugd2lkdGggY2FsY3VsYXRpb25zIGZyb20gdGhlIG9sZCBwYXJzZXIuCi0JVGhpcyBpcyB0byBmYWNpbGl0YXRlIGFkZGluZyBvcHRpb25zIGZvciBjb21waWxpbmcgb3V0IHRoZSBvbGQgcGFyc2VyLgotCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUue2MsaH0gKHQxX2RlY29kZXJfcGFyc2VfbWV0cmljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoVDFfRGVjb2Rlcl9GdW5jcyk6IE5ldyBlbnRyeQotCWBwYXJzZV9tZXRyaWNzJy4KLQkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBTZXQgdGhlIG5ldyBlbnRyeS4KLQotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyksCi0Jc3JjL2NpZC9jaWRnbG9hZC5jIChjaWRfbG9hZF9nbHlwaCk6IFNlcGFyYXRlCi0JY29uZGl0aW9uYWwgZm9yIHNlbGVjdGluZyBlbmdpbmUuCi0KLTIwMTctMTAtMDkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX1RyYW5zbGF0ZSk6IEZpeCBpbnRlZ2VyIG92ZXJmbG93LgorCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMpOiBNb3ZlIGFsbCBib3VuZGFyeQorCWNoZWNrcyBpbnRvIHRoaXMgbmV3IGZ1bmN0aW9uIGFuZCB1cGRhdGUgdGhlIHJlc3Qgb2YgYGNmZnBhcnNlLmMnIHRvCisJdXNlIGl0LgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NzcyNzc1CisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMjEzNwogCi0yMDE3LTEwLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisyMDE5LTAzLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCk6IEludGVnZXIgb3ZlcmZsb3dzLgorCVthdXRvZml0XSBGaXggTW9uZ29saWFuIGJsdWUgem9uZSBjaGFyYWN0ZXJzLgorCisJKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBVc2UgVSsyMDBEIChaRVJPLVdJRFRIIEpPSU5FUikgY2hhcmFjdGVycworCXRvIGdldCBtZWRpYWwgZm9ybXMgZm9yIHNvbWUgTW9uZ29saWFuIGNoYXJhY3RlcnMuCisJKiBzcmMvYXV0b2ZpdC9hZmJsdWUuYywgc3JjL2F1dG9maXQvYWZibHVlLmg6IFJlZ2VuZXJhdGVkLgorCisyMDE5LTAzLTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbYXV0b2ZpdF0gQWRkIHN1cHBvcnQgZm9yIE1vbmdvbGlhbiBzY3JpcHQuCisKKwlBcyBhIGRlLWZhY3RvIHN0YW5kYXJkLCBsYXlvdXRzIHVzaW5nIHRoaXMgc2NyaXB0IGFyZSBjb25zdHJ1Y3RlZAorCWhvcml6b250YWxseSBsaW5lIGJ5IGxpbmUsIHRoZW4gdGhlIGxpbmVzIGFyZSByb3RhdGVkIGNsb2Nrd2lzZSBmb3IKKwl2ZXJ0aWNhbCBkaXNwbGF5LgorCisJKiBzcmMvYXV0b2ZpdC9hZmJsdWUuZGF0OiBBZGQgYmx1ZSB6b25lIGRhdGEgZm9yIE1vbmdvbGlhbi4KKwkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCisKKwkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBNb25nb2xpYW4gc3RhbmRhcmQgY2hhcmFjdGVycy4KKworCSogc3JjL2F1dG9maXQvYWZyYW5nZXMuYywgc3JjL2F1dG9maXQvYWZzdHlsZXMuaDogQWRkIE1vbmdvbGlhbgorCWRhdGEuCisKKzIwMTktMDMtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogVmVyc2lvbiAyLjEwLjAgcmVsZWFzZWQuCisJPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisJVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItMTAtMCcuCisKKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjEwLjAuCisJKiBkb2NzL0NIQU5HRVM6IFVwZGF0ZWQuCisKKwkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgc3JjL2Jhc2UvZnR2ZXIucmMsCisJYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2osCisJYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwsCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AsCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwsCisJYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sOiBzLzIuOS4xLzIuMTAuMC8sIHMvMjkxLzIxMDAvLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZSRUVUWVBFX01JTk9SKTogU2V0IHRvIDEwLgorCShGUkVFVFlQRV9QQVRDSCk6IFNldCB0byAwLgorCisJKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3ICh2ZXJzaW9uX2luZm8pOiBTZXQgdG8gMjM6MDoxNy4KKwkqIENNYWtlTGlzdHMudHh0IChWRVJTSU9OX01JTk9SKTogU2V0IHRvIDEwLgorCShWRVJTSU9OX1BBVENIKTogU2V0IHRvIDAuCisKKwkqIGJ1aWxkcy90b3BsZXZlbC5tayAodmVyc2lvbiwgd2ludmVyc2lvbik6IFNpbmNlIHRoZSBtaW5vciB2ZXJzaW9uCisJbnVtYmVyIGhhcyB0d28gZGlnaXRzIG5vdywgbmV2ZXIgb21pdCB0aGUgcGF0Y2ggbnVtYmVyLiAgV2Ugd291bGQKKwlnZXQgYW1iaWd1b3VzIHppcCBmaWxlIG5hbWVzIG90aGVyd2lzZS4KKwkoZGlzdCk6IFJlbW92ZSByZW1uYW50cyBvZiBgZG9jbWFrZXInIHRvb2wuCisJKGRvLWRpc3QpOiBSZW1vdmUgdW51c2VkIGludGVybWVkaWF0ZSBmaWxlcy4KKworCSogc3JjL2NmZi9jZmZwYXJzZS5jIChkZXN0cmljdF9jMnNfaXRlbSk6IEd1YXJkIGZ1bmN0aW9uIHdpdGgKKwlDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIG1hY3JvLgorCisyMDE5LTAzLTA3ICBBbmRyZWkgQWxleGV5ZXYgIDwweDQxNmI2MTcyNjlAZ21haWwuY29tPgorICAgICAgICAgICAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IGludmFsaWQgZnVuY3Rpb24gcG9pbnRlciBjYXN0cy4KKworCVRoaXMgY2hhbmdlIHNob3VsZCBhbGxvdyBGcmVldHlwZSB0byB3b3JrIG9uIFdBU00vRW1zY3JpcHRlbiB3aXRob3V0CisJbmVlZGluZyBgLXMgRU1VTEFURV9GVU5DVElPTl9QT0lOVEVSX0NBU1RTPTEnLgorCisJKiBzcmMvYXV0b2ZpdC9hZmR1bW15LmMgKGFmX2R1bW15X2hpbnRzX2FwcGx5KTogRml4IHNpZ25hdHVyZS4KKworCSogc3JjL2NpZC9jaWRsb2FkLmMgKGNpZF9wYXJzZV9mb250X21hdHJpeCwgcGFyc2VfZmRfYXJyYXksCisJcGFyc2VfZXhwYW5zaW9uX2ZhY3RvciwgcGFyc2VfZm9udF9uYW1lKTogUmV0dXJuIGB2b2lkJywgbm90CisJYEZUX0Vycm9yJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYyk6CisJRml4IHNpZ25hdHVyZS4KKworMjAxOS0wMy0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2Jhc2VdIEhhbmRsZSBudW1lcmljIG92ZXJmbG93ICgjNTU4MjcpLgorCisJKiBzcmMvYmFzZS9mdGdseXBoLmMgKEZUX0dseXBoX0dldF9DQm94KTogVXNlIGBGVF9QSVhfQ0VJTF9MT05HJy4KKworMjAxOS0wMy0wNSAgU2ViYXN0aWFuIFJhc211c3NlbiAgPHNlYnJhc0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgKCM1NTgzMikuCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpOiBUaGUgY2FsbCB0bworCWBjZjJfYXJyc3RhY2tfc2V0Q291bnQnIG1heSBmYWlsIGJlY2F1c2UgdGhlIGFsbG9jYXRvciByYW4gb3V0IG9mCisJbWVtb3J5LiAgV2hlbiB0aGlzIGhhcHBlbnMgdGhlIHN0YWNrIGlzIHN0aWxsIHdyaXR0ZW4gdG8gYmVmb3JlIHRoZQorCWVycm9yIGNvbmRpdGlvbiBpcyBjaGVja2VkLiAgVGhpcyBtZWFucyB0aGF0IEZyZWVUeXBlIHdyaXRlcyBvdXRzaWRlCisJb2YgYWxsb2NhdGVkIG1lbW9yeS4gIFRoaXMgY29tbWl0IG1vdmVzIHRoZSBlcnJvciBjaGVjayBwcmlvciB0byB0aGUKKwlzdGFjayBhc3NpZ25tZW50LCBoZW5jZSB0aGUgZnVuY3Rpb24gbm93IHByb3Blcmx5IHJldHVybnMgd2l0aCBhbgorCWVycm9yIGNvbmRpdGlvbi4KKworMjAxOS0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQmxlbmQpOiBObyBmcmFjdGlvbmFsIG9mZnNldHMuCisKKwlUaGUgZnVuY3Rpb24gb25seSBwcm92aWRlZCBhIGZyYW1ld29yayB3aXRob3V0IGFuIGFjdHVhbAorCWltcGxlbWVudGF0aW9uLCB3aGljaCB0aGlzIGNvbW1pdCByZW1vdmVzLgorCisyMDE5LTAyLTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90b29scy91cGRhdGUtY29weXJpZ2h0LXllYXI6IEluc2VydCBgKEMpJy4KKworMjAxOS0wMi0yMSAgQXJtaW4gSGFzaXR6a2EgIDxwcmluY2UuY2hlcnVza2VyQGdtYWlsLmNvbT4KKworCVt0cnVldHlwZV0gTWFzayBudW1lcmljIG92ZXJmbG93cy4KKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKE1vdmVfQ1ZULCBNb3ZlX0NWVF9TdHJldGNoZWQsIEluc19NSVJQKToKKwlNYXNrIG51bWVyaWMgb3ZlcmZsb3dzLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzU3OQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTE2ODEKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTExNzM0CiAKLTIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMTktMDItMjEgIEFybWluIEhhc2l0emthICA8cHJpbmNlLmNoZXJ1c2tlckBnbWFpbC5jb20+CiAKLQlbc2ZudF0gQWRqdXN0IGJlaGF2aW91ciBvZiBQUyBmb250IG5hbWVzIGZvciB2YXJpYXRpb24gZm9udHMuCisJW3BzYXV4XSBNYXNrIG51bWVyaWMgb3ZlcmZsb3cuCiAKLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3Zhcl9wc19uYW1lKTogVXNlIGEgbmFtZWQgaW5zdGFuY2UncwotCVBTIG5hbWUgb25seSBpZiBubyB2YXJpYXRpb24gaXMgYXBwbGllZC4KLQotMjAxNy0xMC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JW2NmZiwgdHJ1ZXR5cGVdIEFkanVzdCBiZWhhdmlvdXIgb2YgbmFtZWQgaW5zdGFuY2VzLgotCi0JVGhpcyBjb21taXQgY29tcGxldGVseSBzZXBhcmF0ZXMgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gbmFtZWQKLQlpbnN0YW5jZXMgYW5kIHZhcmlhdGlvbiBmdW5jdGlvbnMuICBJbiBwYXJ0aWN1bGFyLCByZXNldHRpbmcgdGhlCi0JdmFyaWF0aW9uIHJldHVybnMgdG8gdGhlIGN1cnJlbnQgbmFtZWQgaW5zdGFuY2UgKGlmIHNldCkgYW5kIG5vdCB0bwotCXRoZSBiYXNlIGZvbnQuCi0KLQlBcyBhIHNpZGUgZWZmZWN0LCB2YXJpYXRpb24gZnVuY3Rpb25zIG5vIGxvbmdlciBjaGFuZ2UgdGhlIG5hbWVkCi0JaW5zdGFuY2UgaW5kZXguCi0KLQkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogVXNlIE1NIHNlcnZpY2UncyBgc2V0X2luc3RhbmNlJwotCWZ1bmN0aW9uLgotCUFsc28gYXBwbHkgYE1WQVInIHRhYmxlIHRvIG5hbWVkIGluc3RhbmNlcy4KLQotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IEFkZCBjYXN0LgotCSh0dF9zZXRfbW1fYmxlbmQpOiBObyBsb25nZXIgY2hlY2sgd2hldGhlciByZXF1ZXN0ZWQgdmFyaWF0aW9uCi0JY29pbmNpZGVzIHdpdGggYSBuYW1lZCBpbnN0YW5jZS4KLQkoVFRfU2V0X1Zhcl9EZXNpZ24pOiBVc2UgY3VycmVudCBuYW1lZCBpbnN0YW5jZSBmb3IgZGVmYXVsdAotCWNvb3JkaW5hdGVzLgotCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBVc2UgYFRUX1NldF9OYW1lZF9JbnN0YW5jZScuCi0KLTIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCU1ha2UgYEZUX1NldF9OYW1lZF9JbnN0YW5jZScgd29yay4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfc2V0X2luc3RhbmNlKTogTmV3IGZ1bmN0aW9uLgotCShjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzKTogUmVnaXN0ZXIgaXQuCi0KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9OYW1lZF9JbnN0YW5jZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmg6IFVwZGF0ZWQuCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzKTogUmVnaXN0ZXIKLQlpdC4KLQotCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9SZXNldF9NTV9CbGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIHNyYy90eXBlMS90MWxvYWQuaDogVXBkYXRlZC4KLQkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMpOiBSZWdpc3RlciBpdC4KLQotMjAxNy0xMC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgotCi0JTWFrZSBgRlRfRkFDRV9GTEFHX1ZBUklBVElPTicgd29yay4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2UpOiBSZW1vdmUKLQlgaXNfZGVmYXVsdF9pbnN0YW5jZSc7IHRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBjb21iaW5hdGlvbiBvZgotCWBGVF9JU19WQVJJQVRJT04nIGFuZCBgRlRfSVNfSU5TVEFOQ0UnLgotCi0JKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfYWR2YW5jZXMpOiBVcGRhdGVkLgotCi0JKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9wc19uYW1lKSwgc3JjL3NmbnQvc2ZvYmpzLmMKLQkoc2ZudF9pbml0X2ZhY2UpOiBVcGRhdGVkLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfZ2V0X2FkdmFuY2VzKSwgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYwotCShUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwgbG9hZF90cnVldHlwZV9nbHlwaCwgSVNfREVGQVVMVF9JTlNUQU5DRSksCi0Jc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfc2V0X21tX2JsZW5kKTogVXBkYXRlZC4KLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9NTV9CbGVuZCwgVFRfU2V0X1Zhcl9EZXNpZ24pOgotCUhhbmRsZSBgRlRfRkFDRV9GTEFHX1ZBUklBVElPTicuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kLCBUMV9TZXRfTU1fRGVzaWduKTogSGFuZGxlCi0JYEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04nLgotCi0yMDE3LTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQlOZXcgZnVuY3Rpb24gYEZUX1NldF9OYW1lZF9JbnN0YW5jZScuCi0KLQlObyBlZmZlY3QgeWV0LgotCi0JKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9OYW1lZF9JbnN0YW5jZSk6IE5ldyBmdW5jdGlvbi4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9mdG1tLmg6IFVwZGF0ZWQuCi0KLTIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBtYWNyb3MgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBmb250IHZhcmlhdGlvbiBpcyBhY3RpdmUuCi0KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRkFDRV9GTEFHX1ZBUklBVElPTiwKLQlGVF9JU19WQVJJQVRJT04pOiBOZXcgbWFjcm9zLgotCU5vIGVmZmVjdCB5ZXQuCi0KLTIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCUFkZCBmcmFtZXdvcmsgZm9yIHNldHRpbmcgbmFtZWQgaW5zdGFuY2UgaW4gTU0gc2VydmljZS4KLQotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggKEZUX1NldF9JbnN0YW5jZV9GdW5jKToKLQlOZXcgZnVuY3Rpb24gdHlwZWRlZi4KLQkoTXVsdGlNYXN0ZXJzKTogQWRkIGBzZXRfaW5zdGFuY2UnIG1lbWJlci4KLQkoRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKTogVXBkYXRlZC4KLQotCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzKSwKLQlzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIgKHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyksCi0Jc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3NlcnZpY2VfbXVsdGlfbWFzdGVycyk6IFVwZGF0ZWQuCi0KLTIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCVt0eXBlMV0gTWlub3IgY29kZSBzaHVmZmxpbmcuCi0KLQkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kKTogTWFrZSBpdCBhIHdyYXBwZXIgb2YuLi4KLQkodDFfc2V0X21tX2JsZW5kKTogLi4udGhpcyBuZXcgZnVuY3Rpb24uCi0JKFQxX1NldF9NTV9EZXNpZ24pOiBVc2UgYHQxX3NldF9tbV9ibGVuZCcuCi0KLTIwMTctMTAtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KLQotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogRml4IGludGVnZXIKKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpOiBNYXNrIG51bWVyaWMKIAlvdmVyZmxvdy4KIAogCVJlcG9ydGVkIGFzCiAKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM1MzkKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEzMDQxCiAKLTIwMTctMTAtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKzIwMTktMDItMTYgIFdpbmsgU2F2aWxsZSAgPHdpbmtAc2F2aWxsZS5jb20+CiAKLQlGaXggY29tcGlsZXIgd2FybmluZ3MuCisJKiBzcmMvYXV0b2ZpdC9hZndhcnAuaCAoYWZfd2FycGVyX2NvbXB1dGUpOiBGaXggZGVjbGFyYXRpb24uCiAKLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3BzX2dldF9mb250X2V4dHJhKTogQXZvaWQgY29kZSB0aGF0IHJlbGllcwotCW9uIG51bWVyaWMgb3ZlcmZsb3cuCi0JQWRkIGNhc3QuCisyMDE5LTAyLTAyICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+CiAKLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRml4IHZhcmlhYmxlCi0JdHlwZXMsIGFkZCBjYXN0LgorCVt0cnVldHlwZV0gQXBwbHkgTVZBUiBoYXNjLCBoZHNjIGFuZCBobGdwIG1ldHJpY3MgdG8gY3VycmVudCBGVF9GYWNlIG1ldHJpY3MuCiAKLTIwMTctMTAtMDQgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+CisJSW5zdGVhZCBvZiBzZXR0aW5nIHR5cG8gb3Igd2luIG1ldHJpY3MgYXMgdGhlIG5ldyBgRlRfRmFjZScgbWV0cmljcworCWluZGlzY3JpbWluYXRlbHksIGFwcGx5IG9ubHkgdHlwbyBkZWx0YXMgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUKKwlgRlRfRmFjZScgbWV0cmljcy4gIFRoaXMgcHJldmVudHMgbGluZSBoZWlnaHQgZGlmZmVyZW5jZXMgd2hlbiB0aGUKKwlkZWZhdWx0IG91dGxpbmVzIHdlcmUgdXNlZCBhcyB0aGUgcmVndWxhciBmYWNlIGFuZCBpbnN0YW5jZXMgZm9yCisJZXZlcnl0aGluZyBlbHNlLCBmb3IgZXhhbXBsZS4KIAotCVtjZmZdIEFkZCBzdXBwb3J0IGZvciBgRlNUeXBlJy4KKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2FwcGx5X212YXIpOiBJbXBsZW1lbnQuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaCAoQ0ZGX0ZvbnRSZWMpOiBBZGQKLQlgZm9udF9leHRyYScgZW50cnkuCisyMDE5LTAyLTAyICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+CiAKLQkqIHNyYy9jZmYvY2ZmZHJpdnIuYyAoY2ZmX3BzX2dldF9mb250X2V4dHJhKTogTmV3IGZ1bmN0aW9uIHRvCi0JcmV0cmlldmUgRlNUeXBlIGluZm8gZnJvbSB0aGUgZW1iZWRkZWQgUG9zdFNjcmlwdCBkYXRhLgotCShjZmZfc2VydmljZV9wc19pbmZvKTogUmVnaXN0ZXIgZnVuY3Rpb24uCisJW3NmbnRdIFVzZSB0eXBvIG1ldHJpY3MgaWYgT1MvMiBmc1NlbGVjdGlvbiBVU0VfVFlQT19NRVRSSUNTIGJpdCBpcyBzZXQuCiAKLQkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfZm9udF9kb25lKTogRnJlZSBgZm9udF9leHRyYScuCisJSWYgdGhlIGBPUy8yJyB0YWJsZSBleGlzdHMgYW5kIGBmc1NlbGVjdGlvbicgYml0IDcKKwkoVVNFX1RZUE9fTUVUUklDUykgaXMgc2V0LCB1c2UgdGhlIGBzVHlwbyonIHNldCBvZiB2YWx1ZXMgdG8gY29tcHV0ZQorCXRoZSBgRlRfRmFjZSdzIGFzY2VuZGVyLCBkZXNjZW5kZXIsIGFuZCBoZWlnaHQuICBPdGhlcndpc2UsIGZhbGwKKwliYWNrIHRvIG9sZCBiZWhhdmlvci4KIAotMjAxNy0wOS0zMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogSW1wbGVtZW50LgogCi0JU2lnbmVkbmVzcyBmaXhlcyBpbiBiaXRtYXAgcHJlc2V0dGluZy4KKzIwMTktMDEtMTggIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+CisKKwlbc2ZudF0gSGFuZGxlIFRUIGZvbnRzIGhhdmluZyB0d28gUG9zdFNjcmlwdCBmb250IG5hbWVzICgjNTU0NzEpLgorCisJKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9uYW1lX2lkKTogUHJlZmVyIEVuZ2xpc2ggb3ZlciBhbnkKKwlvdGhlciBsYW5ndWFnZSBmb3VuZCBmb3IgUG9zdFNjcmlwdCBmb250IG5hbWVzLgorCisyMDE5LTAxLTA4ICBDaHJpcyBMaWRkZWxsIDxjaHJpcy5saWRkZWxsQGFydGlmZXguY29tPgorCisJW3BzYXV4XSBGaXggY2xvc2VwYXRoICgjNTU0MTQpLgorCisJQWxsIG9mIHRoZSBUeXBlIDEgcGF0aCBidWlsZGluZyBpcyBkb25lIHdpdGggY29kZSBjb21tb24gdG8gdGhlCisJcmV2aXNlZCBDRkYgZW5naW5lLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgY2xvc2VwYXRoLCB3aGljaCB3YXMgc3RpbGwKKwljYWxsaW5nIHBzX2J1aWxkZXJfY2xvc2VfY29udG91cigpLCB0aHVzIHByZXZpb3VzbHkgY2FjaGVkIHNlZ21lbnRzCisJd2VyZSBub3QgYWx3YXlzIHdyaXR0ZW4gdG8gdGhlIHBhdGgsIGFuZCBnbHlwaCBjb3JydXB0aW9uLCBvciBldmVuCisJaW52YWxpZCBvdXRsaW5lcyB3ZXJlIHBvc3NpYmxlLgorCisJKiBzcmMvcHNhdWMvcHNpbnRlcnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRDTE9TRVBBVEg+OgorCVN3aXRjaCB0byBjYWxsaW5nIGBjZjJfZ2x5cGhwYXRoX2Nsb3NlT3BlblBhdGgnLgorCisyMDE4LTEyLTI5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9hdXRvZml0L2FmbGF0aW4yLmM6IFNvbWUgZml4ZXMgZnJvbSBgYWZsYXRpbi5jJyAoIzU1MzEwKS4KKworMjAxOC0xMi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9vcGVyYW9yX3NlYWMpOiBGaXggbnVtZXJpYyBvdmVyZmxvdy4KIAogCVJlcG9ydGVkIGFzCiAKLQkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM1MTQuCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMTkxNQogCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBFeGxpY2l0bHkgc2lnbmVkIGhlaWdodC4KLQkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRGl0dG8uCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOiBFeHBsaWNpdGx5IHVuc2lnbmVkCi0Jc3VidHJhY3Rpb24uCisyMDE4LTEyLTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKwlbZ3h2YWxpZF0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgogCi0JQml0bWFwIG1ldHJpY3MgcHJlc2V0dGluZyBbMi8yXS4KKwkqIHNyYy9neHZhbGlkL2d4dmp1c3QuYyAoZ3h2X2p1c3RfY2hlY2tfbWF4X2dpZCksCisJc3JjL2d4dmFsaWQvZ3h2bW9ydC5jIChneHZfbW9ydF9jb3ZlcmFnZV92YWxpZGF0ZSk6IFVzZSBgRlRfVU5VU0VEJy4KIAotCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBQcmVzZXQgdGhlIGJpdG1hcCBtZXRyaWNzIHdoZW4KLQlhcHByb3ByaWF0ZSBidXQgYEZUX1JlbmRlcl9HbHlwaCcgaXMgbm90IGNhbGxlZC4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfR2x5cGhTbG90UmVjKTogRG9jdW1lbnQgdGhlIGNoYW5nZS4KKzIwMTgtMTItMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxNy0wOS0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfSGludF9HbHlwaCk6IFJlbW92ZSB1c2VsZXNzIHRlc3QuCiAKLQlbc21vb3RoLCByYXN0ZXJdIE1pc2NlbGxhbmVvdXMgY2xlYW51cHMuCisJYGNvbnRyb2xfbGVuJyBvbmx5IGdldHMgaXRzIHZhbHVlIGZyb20gYG5faW5zJyAoYW5kIHZpY2UgdmVyc2EpLAorCXdoaWNoIGlzIGFsd2F5cyByZWFkIGFzIGB1bnNpZ25lZCBzaG9ydCcgYW5kIHRodXMgY2FuJ3QgYmUgbGFyZ2VyCisJdGhhbiAweEZGRkYuCiAKLQkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3JlbmRlcik6IENsZWFuIHVwIHRoZSBleGl0LgotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBSZWR1Y2UKLQl0cmFuc2xhdGlvbnMgYW5kIGNsZWFuIHVwIHRoZSBleGl0LgotCShmdF9zbW9vdGhfcmVuZGVyX2xjZCwgZnRfc21vb3RoX3JlbmRlcl9sY2QpOiBSZW1vdmUgdW51c2VkIGBlcnJvcicuCisyMDE4LTEyLTA0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjggIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgotCi0JW3RydWV0eXBlXSBSZWFsbHksIHJlYWxseSBmaXggIzUyMDgyLgotCi0JKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EUlApOiBDb3JyZWN0IGNvbmRpdGlvbmFsLgotCi0yMDE3LTA5LTI4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+Ci0KLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9kb1N0ZW1zKTogRml4IGludGVnZXIgb3ZlcmZsb3cuCisJW2JkZl0gSWdub3JlIGRhdGEgYWZ0ZXIgYEVOREZPTlQnLgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzUxMAorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTA3OTgKIAotMjAxNy0wOS0yOCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9lbmQpOiBOZXcgZnVuY3Rpb24uCisJKF9iZGZfcGFyc2VfZ2x5cGhzKTogU3dpdGNoIHRvIGBfYmRmX3BhcnNlX2VuZCcgYWZ0ZXIgYEVOREZPTlQnIGhhcworCWJlZW4gZW5jb3VudGVyZWQuCiAKLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX3Nsb3RfbG9hZF9nbHlwaCk6IEZpeCBtZW1vcnkgbGVhay4KKzIwMTgtMTItMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3A6IER1c3Qgb2ZmLgorCisyMDE4LTExLTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qOiBTaW1wbGlmeS4KKworMjAxOC0xMS0yNyAgQ2hyaXMgTGlkZGVsbCAgPGNocmlzLmxpZGRlbGxAYXJ0aWZleC5jb20+CisKKwlbdHlwZTEsY2ZmXSBBZGQgRlRfe1NldCxHZXR9X01NX1dlaWdodFZlY3RvciBBUEkgY2FsbHMuCisKKwlGb3IgbXVsdGlwbGUgbWFzdGVyIGZvbnRzLCBjb21tb24gdXNhZ2UgKGluIFBvc3RzY3JpcHQpIGlzIHRvIG1vZGlmeQorCXRoZSBXZWlnaHRWZWN0b3Igb2YgYW4gZXhpc3RpbmcgZm9udCBpbnN0YW5jZSwgdGhpcyBhZGRpdGlvbgorCXN1cHBvcnRzIHRoYXQgdXNlLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaCwgc3JjL2Jhc2UvZnRtbS5jIChGVF9TZXRfTU1fV2VpZ2h0VmVjdG9yLAorCUZUX0dldF9NTV9XZWlnaHRWZWN0b3IpOiBOZXcgQVBJIGZ1bmN0aW9ucy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbHNlcnZpY2VzL3N2bW0uaAorCShGVF9TZXRfTU1fV2VpZ2h0VmVjdG9yX0Z1bmMsIEZUX0dldF9NTV9XZWlnaHRWZWN0b3JfRnVuYyk6IE5ldworCWZ1bmN0aW9uIHR5cGVzLgorCShNdWx0aU1hc3RlcnMpOiBBZGQgYHNldF9tbV93ZWlnaHR2ZWN0b3InIGFuZCBgZ2V0X21tX3dlaWdodHZlY3RvcicKKwltZW1iZXJzLgorCShGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMpOiBVcGRhdGVkLgorCisJKiBzcmMvY2ZmY2ZmZHJpdnIuYyAoY2ZmX3NldF9tbV93ZWlnaHR2ZWN0b3IsCisJY2ZmX2dldF9tbV93ZWlnaHR2ZWN0b3IpOiBOZXcgZnVuY3Rpb25zLgorCShjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzKTogUmVnaXN0ZXIgdGhlbS4KKworCSogc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgKHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyk6IFVwZGF0ZWQuCisJVGhpcyBkcml2ZXIgZG9lc24ndCB1c2UgdGhlIG5ldyBpbnRlcmZhY2UuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX1dlaWdodFZlY3RvciwKKwlUMV9HZXRfTU1fV2VpZ2h0VmVjdG9yKTogTmV3IGZ1bmN0aW9ucy4KKwkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMpOiBSZWdpc3RlciB0aGVtLgorCSogc3JjL3R5cGUxL3QxbG9hZC5oOiBVcGRhdGVkLgorCisyMDE4LTExLTI3ICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ29vZ2xlLmNvbT4KKworCVtjZmZdIEZpeCBjb21waWxlciB3YXJuaW5nICgjNTUxMDUpLgorCisJKiBzcmMvY2ZmL2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfcnVuKTogR3VhcmQgbGFiZWwgb25seSB1c2VkIGlmCisJQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSBpcyBhY3RpdmUuCisKKzIwMTgtMTEtMjcgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCisJW3RydWV0eXBlXSBGaXggbnVtZXJpYyBvdmVyZmxvdyAoIzU1MTAzKS4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoY29tcHV0ZV9nbHlwaF9tZXRyaWNzKTogVXNlIGBTVUJfTE9ORycuCisKKzIwMTgtMTEtMjUgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtidWlsZHNdIEJlbGF0ZWQgRExMIHN1cHBvcnQgd2l0aCB2YzIwMDItdmMyMDA4LgorCisJVGhlIHNvbHV0aW9uIGFuZCBwcm9qZWN0IGZpbGVzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHVwZ3JhZGVkIGZvcgorCXRoZSBhcHByb3JpYXRlIFZpc3VhbCBDKysgdmVyc2lvbi4KKworCSogYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS57c2xuLHZjcHJvan06IE1ham9yIHVwZ3JhZGVzLgorCSogYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sOiBEb2N1bWVudCB0aGUgY2hhbmdlLgorCSogYnVpbGRzL3dpbmRvd3MvdmMyMDA1LCBidWlsZHMvd2luZG93cy92YzIwMDg6IFJlbW92ZWQgYXMgcmVkdW5kYW50LgorCisyMDE4LTExLTIyICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJKiBzcmMvY2ZmL2NmZnBhcnNlLmM6IFBsZWFzZSB0aGUgY29tcGlsZXIuCisKKzIwMTgtMTEtMjIgIEFybWluIEhhc2l0emthICA8cHJpbmNlLmNoZXJ1c2tlckBnbWFpbC5jb20+CisKKwlbY2ZmXSBGaXggbWVtb3J5IG92ZXJmbG93LgogCiAJUmVwb3J0ZWQgYXMKIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzQ4OQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTg2OQorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTA4NjkKIAotMjAxNy0wOS0yOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCSogc3JjL2NmZi9jZmZwYXJzZS5jIChkZXN0cnVjdF90MnNfaXRlbSwgY2ZmX3BhcnNlcl9ydW4pOiBTdG9yZQorCWV2YWx1YXRlZCBUMiBjaGFyc3RyaW5ncyBpbiBzZXBhcmF0ZWx5IGFsbG9jYXRlZCBtZW1vcnkuCiAKLQlCaXRtYXAgbWV0cmljcyBwcmVzZXR0aW5nIFsxLzJdLgorMjAxOC0xMS0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JVGhpcyBtYWlubHkganVzdCBleHRyYWN0cyB0aGUgY29kZSBmb3IgcHJlc2V0dGluZyB0aGUgYml0bWFwIG1ldHJpY3MKLQlmcm9tIHRoZSBtb25vY2hyb21lLCBncmF5c2NhbGUsIGFuZCBMQ0QgcmVuZGVyZXJzIGludG8gYSBzZXBhcmF0ZQotCWZ1bmN0aW9uLgorCSogYnVpbGRzL3dpbmRvd3Mve3Zpc3VhbGMsdmMyMDA1LHZjMjAwOH0vZnJlZXR5cGUudmNwcm9qOiBGaXggaXQuCiAKLQkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCk6IE5ldyBmdW5jdGlvbiB0aGF0Ci0JY2FsY3VsYXRlcyBwcm9zcGVjdGl2ZSBiaXRtYXAgbWV0cmljcyBmb3IgdGhlIGdpdmVuIHJlbmRlcmluZyBtb2RlLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOgotCURlY2xhcmUgaXQuCisyMDE4LTExLTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKGZ0X2xjZF9wYWRkaW5nKTogTmV3IGhlbHBlciBmdW5jdGlvbiB0aGF0IGFkZHMKLQlwYWRkaW5nIHRvIENCb3ggdGFraW5nIGludG8gYWNjb3VudCBwZWN1bGFyaXRpZXMgb2YgTENEIHJlbmRlcmluZy4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCAoZnRfbGNkX3BhZGRpbmcpOiBEZWNsYXJlIGl0LgorCVtzbW9vdGhdIFBsYWNlaG9sZGVyIG9ubHkgZm9yIGxpYnJhcnktZW5hYmxlZCBMQ0QgZmlsdGVyaW5nLgogCi0JKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBSZXdvcmtlZCB0byB1c2UKLQlgZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXAnLgotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBEaXR0by4KLQkoZnRfc21vb3RoX3JlbmRlcl9sY2QsIGZ0X3Ntb290aF9yZW5kZXJfbGNkKTogVGhlIHBpeGVsX21vZGUgc2V0dGluZwotCWlzIG1vdmVkIHRvIGBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCcuCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9pbml0KTogQWRkIGRpc2FibGVkCisJYEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyJyBjYWxsLgogCi0yMDE3LTA5LTI4ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisyMDE4LTExLTA5ICBZb3VuZyBYaWFvICA8eWFuZ3g5MkBob3RtYWlsLmNvbT4KIAotCVtwc2F1eF0gRml4IGNvbXBpbGVyIHdhcm5pbmcuCisJW3BzYXV4XSBBZGQgc2FmZXR5IGd1YXJkICgjNTQ5ODUpLgogCi0JKiBzcmMvcHNhdXgvcHNoaW50cy5jIChjZjJfaGludG1hcF9kdW1wKTogQWRkIHN3aXRjaCBmb3IgdHJhY2luZworCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKTogRG8gaXQuCisKKzIwMTgtMTEtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogUmVxdWlyZSBgd2luZG93cy5oJyBmb3Igd2luZHJlcy4KKworMjAxOC0xMS0wOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2Z0c3Ryb2tlXSBGaXggdW5wcmVkaWN0YWJsZSBmYWlsdXJlcyAoIzU0OTg2KS4KKworCSogc3JjL2Jhc2UvZnRzdHJva2UuYyAoZnRfc3Jva2VfYm9yZGVyX2xpbmV0byk6IEZpeCBsaW5ldG8gY2hlY2suCisKKzIwMTgtMTEtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtmdHN0cm9rZV0gRml4IHVucHJlZGljdGFibGUgZmFpbHVyZXMgKCM1NDk3NikuCisKKwkqIHNyYy9iYXNlL2Z0c3Ryb2tlLmMgKGZ0X3Nyb2tlX2JvcmRlcl9jbG9zZSk6IFNldCB0aGUgc3RhcnQgdGFncy4KKworMjAxOC0xMS0wNyAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbdHJ1ZXR5cGVdIEZpeCBWRiBjaGVjayBmcm9tIDIwMTgtMDktMTIgKCM1NDk3MykuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogVXNlIGNvcnJlY3QKKwlvZmZzZXRzIGZvciBlc3RpbWF0ZXMuCisKKzIwMTgtMTEtMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtwc2hpbnRlcl0gRml4IG51bWVyaWMgb3ZlcmZsb3cuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMTI0MgorCisJKiBzcmMvcHNoaW50ZXIvcHNocmVjLmMgKHBzX2RpbWVuc2lvbl9hZGRfdDFzdGVtKTogSW1wbGVtZW50IGl0LgorCisyMDE4LTExLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbcHNhdXhdIEZpeCB0aW1lb3V0IGluIG9sZCBDRkYgZW5naW5lLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyNjAKKworCSogc3JjL3BzYXV4L2NmZmRlY29kZS5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykKKwk8Y2ZmX29wX3NxcnQ+IFtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogRml4IHBvdGVudGlhbCBlbmRsZXNzCisJbG9vcC4KKworMjAxOC0xMS0wNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jOiBVc2UgZW51bSBkZWZpbml0aW9ucy4KKworMjAxOC0xMS0wMyAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfYXBwbHlfdHVwbGUpOiBBZGp1c3QgY29uZGl0aW9uLgorCisyMDE4LTExLTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9hcHBseV90dXBsZSk6IFRyYWNpbmcgdHdlYWtzLgorCisyMDE4LTExLTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlSZXZlcnQgZHVlIHRvIHNwZWNzOiBbdHJ1ZXR5cGVdIFNwZWVkIHVwIHZhcmlhdGlvbiBJVVAuCisKKzIwMTgtMTEtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2dldF9pdGVtX2RlbHRhKTogRml4ZWQgbG9naWMuCisKKwlSZXBvcnRlZCBhbmQgdGVzdGVkIGJ5IEJlaGRhZC4KKworMjAxOC0xMS0wMiAgU2hhaWxlc2ggTWlzdHJ5ICA8c2hhaWxlc2gubWlzdHJ5QGhvdG1haWwuY28udWs+CisKKwlbYXV0b2ZpdF0gUHJldmVudCBTRUdWLgorCisJU2VlCisKKwkgIGh0dHBzOi8vYnVncy5naG9zdHNjcmlwdC5jb20vc2hvd19idWcuY2dpP2lkPTY5NzU0NQorCisJZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdGhlIGJ1ZyB3YXMgZm91bmQuCisKKwkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2dseXBoKTogUHJvcGFnYXRlIGVycm9yCiAJY29kZS4KIAotMjAxNy0wOS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAxOC0xMC0zMSAgQWxleGVpIFBvZHRlbGV6aG5pa292IDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9zZm50L3R0bG9hZC5jICh0dF9mYWNlX2xvYWRfZm9udF9kaXIpOiBGaXggY29tcGlsZXIgd2FybmluZy4KKwlbdHJ1ZXR5cGVdIFNwZWVkIHVwIHZhcmlhdGlvbiBJVVAuCiAKLTIwMTctMDktMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2RlbHRhX2ludGVycG9sYXRlKTogU2VwYXJhdGUgdHJpdmlhbAorCXNuYXBwaW5nIHRvIHRoZSBzYW1lIHBvc2l0aW9uIGZyb20gdHJ1ZSBpbnRlcnBvbGF0aW9uLgogCi0JW3BzYXV4XSBGaXggY29tcGlsZXIgd2FybmluZ3MuCisyMDE4LTEwLTMxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIpOiBSZW1vdmUgcmVkdW5kYW50Ci0JdGVzdC4KKwkqIHNyYy90eXBlMS90MWxvYWQuYyAodDFfc2V0X21tX2JsZW5kKTogT3B0aW1pemVkLgogCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKQotCTxjZjJfZXNjQ0FMTE9USEVSU1VCUj46IEFkZCBjYXN0cy4KKzIwMTgtMTAtMzEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19kZWNvZGVyX2luaXQpOiBBZGQgY2FzdC4KKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9nZXRfaXRlbV9kZWx0YSk6IE9wdGltaXplZC4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOC0xMC0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JW3BzYXV4XSBNaW5vciBmaXhlcy4KKwlbYmFzZV0gRml4IG51bWVyaWMgb3ZlcmZsb3cuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL3BzYXV4L3Bzb2Jqcy57YyxofToKLQlSZWFycmFuZ2UgYHBzX2J1aWxkZXJfaW5pdCcgYXJndW1lbnRzIHRvIGNvbnZlbnRpb25hbCBvcmRlci4KKwlSZXBvcnRlZCBhcwogCi0JKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEFkZCBhIGNoZWNrIGFuZAotCW5vdGljZSBmb3IgYFN1YkZvbnQnIGluIFR5cGUgMSBtb2RlLgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTEwODAKIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IFVzZSBgTVVMX0xPTkcnLgogCi0JW3BzYXV4XSBNb3ZlIGBwc2RlY29kZScgaW50byBgcHNvYmpzJy4KKzIwMTgtMTAtMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCUFzIHRoZSBmb3JtZXIgb25seSBjb250YWlucyBhIHNpbmdsZSBwcm9jZWR1cmUsIG1vdmUgaXQgaW50bwotCWBwc29ianMnIGZvciBzaW1wbGljaXR5LiAgQWxzbyBjaGFuZ2UgdGhlIHBhcmFtZXRlciBvcmRlciB0byB0aGUKLQljb252ZW50aW9uYWwgb25lLgorCVtjZmZdIEZpeCBudW1lcmljIG92ZXJmbG93LgogCi0JKiBzcmMvcHNhdXgvcHNkZWNvZGUuYyAocHNfZGVjb2Rlcl9pbml0KTogTW92ZWQgdG8uLi4KLQkqIHNyYy9wc2F1eC9wc29ianMuYzogLi4uSGVyZS4KLQkqIHNyYy9wc2F1eC9wc2RlY29kZS5oLCBzcmMvcHNhdXgvcHNvYmpzLmg6IERpdHRvLgorCVJlcG9ydGVkIGFzCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNBdXhfU2VydmljZVJlYyk6IFVwZGF0ZQotCWBwc19kZWNvZGVyX2luaXQnIGZ1bmN0aW9uIHNpZ25hdHVyZS4KKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwOTg4CiAKLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYywgc3JjL2NpZC9jaWRnbG9hZC5jLCBzcmMvdHlwZTEvdDFnbG9hZC5jOgotCVVwZGF0ZSBjYWxscy4KKwkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlcl9ydW4pCisJW0NGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkVdOiBVc2UgYE5FR19MT05HJy4KIAotCSogc3JjL3BzYXV4L3BzYXV4LmMsIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBVcGRhdGUgaW5jbHVkZXMuCisyMDE4LTEwLTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9wc2F1eC9KYW1maWxlIChfc291cmNlcyksIHNyYy9wc2F1eC9ydWxlcy5tayAoUFNBVVhfRFJWX1NSQyk6Ci0JVXBkYXRlIGZpbGUgcmVmZXJlbmNlcy4KKwlbc2ZudF0gTWFrZSBgaGVhZCcgdGltZXN0YW1wcyB1bnNpZ25lZC4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCUl0J3MgYmVlbiBtb3JlIHRoYW4gMl4zMSBzZWNvbmRzIHNpbmNlIDE5MDQuCiAKLQlbcHNhdXhdIEZpeCBUeXBlIDEgaGludGluZy4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCAoVFRfSGVhZGVyKTogQ2hhbmdlIGZpZWxkIHR5cGVzLgorCSogc3JjL3NmbnQvdHRsb2FkLmMgKHR0X2ZhY2VfbG9hZF9nZW5lcmljX2hlYWRlcik6IFVwZGF0ZWQuCiAKLQlUeXBlIDEgaGludGluZyBicmVha3Mgc29tZXRpbWVzIHdoZW4gbWlkLWNoYXJzdHJpbmcgaGludHMgc2hvdWxkCi0JaGF2ZSBiZWVuIGluIHRoZSBpbml0aWFsIGhpbnRtYXAuICBUaGlzIGZpeCBhZGRzIGEgcHJlcHJvY2Vzc2luZwotCXBhc3MgdGhhdCByZWFkcyBhbGwgaGludHMgYW5kIGJ1aWxkcyB0aGUgY29ycmVjdCBpbml0aWFsIGhpbnRtYXAKLQlmaXJzdCwgYmVmb3JlIHByb2NlZWRpbmcgdG8gYnVpbGQgdGhlIGdseXBoIG91dGxpbmUuCisyMDE4LTEwLTI3ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpOiBOZXcKLQlgaW5pdGlhbF9tYXBfcmVhZHknIGJvb2xlYW4gZmxhZy4KLQlJZ25vcmUgb3V0bGluZSBjb21tYW5kcyBhbmQgaGludCBjaGFuZ2VzIG9uIGZpcnN0IHBhc3MuCi0JPGNmMl9jbWRFTkRDSEFSPjogQWRkIHNlY3Rpb24gdG8gYnVpbGQgaGludG1hcCBhbmQgcmV3aW5kLgorCVJldmVydDogQWxpZ24gRnJlZVR5cGUgd2l0aCBzdGFuZGFyZCBDIG1lbW9yeSBtYW5hZ2VtZW50LgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisyMDE4LTEwLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlbcHNhdXhdIEFkZCB0cmFjaW5nIGZvciBoaW50cy4KKwlbcHNhdXhdIEZpeCBudW1lcmljIG92ZXJmbG93LgogCi0JKiBzcmMvcHNhdXgvcHNoaW50cy5jIChjZjJfaGludG1hcF9kdW1wKTogTmV3IGZ1bmN0aW9uLgotCShjZjJfaGludG1hcF9pbnNlcnRIaW50KTogVHJhY2UgaW5jb21pbmcgYW5kIGluc2VydGVkIGhpbnRzLgotCShjZjJfaGludG1hcF9idWlsZCk6IER1bXAgaGludG1hcCBiZWZvcmUgYW5kIGFmdGVyIGhpbnQgYWRqdXN0bWVudC4KKwlUcmlnZ2VyZWQgYnkKIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTExNTcKIAotCVtwc2F1eF0gTWlub3IgZml4ZXMuCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKSA8Y2ZmX29wX2JsZW5kPgorCVtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogRml4IGludGVnZXIgb3ZlcmZsb3cuCiAKLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpOiBGaXggY2hlY2sgZm9yIHBvcAotCXJlc3VsdHMuCi0Jcy9mb250LT5kZWNvZGVyL2RlY29kZXIvIHdoZXJlIG5lY2Vzc2FyeS4KLQk8Y2YyX2NtZEhTVEVNLCBjZjJfY21kVlNURU0sIGNmMl9lc2NIU1RFTTMsIGNmMl9lc2NWU1RFTTM+OiBVc2UKLQlvZmZzZXQgcGFyYW1ldGVyIGluIGBjZjJfZG9TdGVtcycgaW5zdGVhZCBvZiBkb2luZyBjb3JyZWN0aW9uIGZvcgotCWxlZnQtc2lkZWJlYXJpbmcuCisyMDE4LTEwLTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwlBdm9pZCBlbmRsZXNzIGxvb3Agd2hpbGUgdHJhY2luZyAoIzU0ODU4KS4KIAotCVtjaWRdIFVzZSB0aGUgbmV3IGVuZ2luZS4KKwkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfYnVpbGRjaGFyKTogR3VhcmQgdHJhY2luZyBzdHVmZiB3aXRoCisJRlRfREVCVUdfTEVWRUxfVFJBQ0UuCiAKLQkqIHNyYy9jaWQvY2lkZ2xvYWQuYzogVXBkYXRlIGluY2x1ZGVzLgotCShjaWRfbG9hZF9nbHlwaCwgY2lkX3Nsb3RfbG9hZF9nbHlwaCk6IEltcGxlbWVudCBjaGFuZ2VzIHRvIGdseXBoCi0JbG9hZGluZyBjb2RlIGFzIHdpdGggYHR5cGUxJyBtb2R1bGUuCisyMDE4LTEwLTE3ICBEYXZpZCBEZW1lbGllciAgPG1hcmthbmRAbWFsaWthbmlhLmZyPgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBDTWFrZUxpc3RzLnR4dDogU3BlY2lmeSBgUlVOVElNRSBERVNUSU5BVElPTicuCiAKLQlbY2lkXSBBZGQgQWRvYmUgZW5naW5lIGNvbmZpZ3VyYXRpb24uCisJVGhpcyBpcyBuZWVkZWQgZm9yIERMTCBidWlsZHMuCiAKLQlUaGlzIGlzIHNpbWlsYXIgdG8gd2hhdCB3YXMgZG9uZSBpbiB0aGUgYHR5cGUxJyBtb2R1bGUuCisyMDE4LTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9jaWQvY2lkcml2ZXIuYyAodDFjaWRfZHJpdmVyX2NsYXNzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogc3JjL2NpZC9jaWRvYmpzLmM6IEluY2x1ZGUgRlRfVFlQRTFfRFJJVkVSX0guCi0JKGNpZF9kcml2ZXJfaW5pdCk6IFVwZGF0ZSBjb2RlLgorCUEgbWlzc2luZyBVbmljb2RlIGNtYXAgaXMgbm90IGEgZmF0YWwgZXJyb3IuCiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwlUaGlzIGlzIGEgZm9sbG93LXVwIHRvIHRoZSBwcmV2aW91cyBjb21taXQuCiAKLQlbcHNhdXhdIENoYW5nZSBzdWJmb250IHN5bnRoZXNpcyBmb3IgQ0lEIGZvbnRzLgorCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpLCBzcmMvc2ZudC9zZm9ianMuYworCShzZm50X2xvYWRfZmFjZSksIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRmFjZV9Jbml0KSwKKwlzcmMvdHlwZTQyL3Q0Mm9ianMuYyAoVDQyX0ZhY2VfSW5pdCk6IEltcGxlbWVudCBpdC4KIAotCUNoYW5nZSBgdDFfbWFrZV9zdWJmb250JyB0byB0YWtlIGluIHRoZSBQcml2YXRlIGRpY3QgcmVjb3JkIGFzIGFuCi0JYXJndW1lbnQuICBUaGlzIGlzIGJlY2F1c2UgVHlwZSAxIGFuZCBDSUQgZm9udCByZWNvcmRzIGluIEZyZWVUeXBlCi0JaGF2ZSB0aGlzIGluIGRpZmZlcmVudCBwbGFjZXMuCisyMDE4LTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc29ianMuYyAodDFfbWFrZV9zdWJmb250KTogQ2hhbmdlIGBUMV9GYWNlJyB0bwotCWBGVF9GYWNlJyBzbyB0aGF0IENJRCBpcyBhbHNvIGFjY2VwdGVkLgotCVRha2UgYFBTX1ByaXZhdGUnIGFzIGFuIGFyZ3VtZW50IGFuZCBsZXQgY2FsbGVyIGZpZ3VyZSBvdXQgd2hlcmUgdGhlCi0JUHJpdmF0ZSBkaWN0IGFjdHVhbGx5IGlzLgotCVVwZGF0ZSByZWZlcmVuY2VzLgorCUZpeCBoYW5kbGluZyBvZiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QgKCM1NDc5NCkuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL3BzYXV4L3Bzb2Jqcy5oOiBVcGRhdGUKLQlkZWNsYXJhdGlvbi4KKwkqIHNyYy9jZmYvY2ZmY21hcC5jIChjZmZfY21hcF91bmljb2RlX2luaXQpLCBzcmMvcHNhdXgvdDFjbWFwLmMKKwkodDFfY21hcF91bmljb2RlX2luaXQpLCBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcF91bmljb2RlX2luaXQpOgorCUNoZWNrIGB1bmljb2Rlc19pbml0JyBmaWVsZC4KIAotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IFVwZGF0ZQotCWNhbGwuCisyMDE4LTEwLTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwlbZnRncmF5c10gRml4IHR5cG8gaW4gc3RhbmQtYWxvbmUgbW9kZSAoIzU0NzcxKS4KIAotCVt0eXBlMV0gU3dpdGNoIHRvIEFkb2JlIGVuZ2luZS4KKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChGVF9USFJPVykgW1NUQU5EQUxPTkVfICYmCisJRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBGaXggY2FsbCB0byBgRlRfRVJSX0NBVCcuCiAKLQkqIHNyYy90eXBlMS90MW9ianMuYyAoVDFfRHJpdmVyX0luaXQpOiBTZXQgZGVmYXVsdCB0byBBZG9iZSBlbmdpbmUuCisyMDE4LTEwLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwlbcHNhdXhdIEZpeCBzZWdmYXVsdC4KIAotCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChzZWFjKS4KKwlSZXBvcnRlZCBhcwogCi0JVGhpcyBjb25jbHVkZXMgdGhlIGNoYW5nZXMgbmVlZGVkIHRvIGFkZCBUeXBlIDEgc3VwcG9ydC4KKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwNzY4CiAKLQkqIHNyYy9wc2F1eC9wc2ludHJwLmM6IFVwZGF0ZSBpbmNsdWRlcy4KLQkoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9lc2NTRUFDPjogSW1wbGVtZW50IHRoaXMgc2ltaWxhcmx5IHRvCi0JaW1wbGllZCBzZWFjIGZvciBDRkYuCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQorCTxjZmZfb3BfY2FsbG90aGVyc3Vicj4gW0NGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkVdOiBDaGVjaworCWFyZ3VtZW50LgogCi0JKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlX3BzKTogTmV3Ci0JZnVuY3Rpb24gdG8gbG9vayB1cCB0aGUgZ2x5cGggaW5kZXguCisyMDE4LTEwLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9nZXRUMVNlYWNDb21wb25lbnQsCi0JY2YyX2ZyZWVUMVNlYWNDb21wb25lbnQpOiBOZXcgZnVuY3Rpb25zIHRvIGdldCB0aGUgY2hhcnN0cmluZ3MgZm9yCi0Jc2VhYyBjb21wb25lbnRzLgorCVtwc2F1eF0gRml4IG51bWVyaWMgb3ZlcmZsb3cuCiAKLQkqIHNyYy9wc2F1eC90MWRlY29kZS5oLCBzcmMvcHNhdXgvcHNmdC5oOiBVcGRhdGUgZGVjbGFyYXRpb25zLgorCVJlcG9ydGVkIGFzCiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwNzQwCiAKLQlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoZmxleCBpbiBjYWxsb3RoZXJzdWJyKS4KKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpIDxjZmZfb3Bfcm9sbD4KKwlbQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORV06IFVzZSBORUdfSU5ULgogCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKQotCTxjZjJfZXNjQ0FMTE9USEVSU1VCUj46IEZpeCBGbGV4IGZlYXR1cmUgaGFuZGxpbmcgKE90aGVyU3VicnMgMCwgMSwKLQkyKS4KLQk8Y2YyX2NtZFJNT1ZFVE8+OiBEbyBub3QgYWN0dWFsbHkgbW92ZSB0aGUgYGdseXBoUGF0aCcgd2hpbGUgZG9pbmcKLQlmbGV4LiAgVGhpcyBpcyB0byBhdm9pZCBjbG9zaW5nIHRoZSBjdXJyZW50IGNvbnRvdXIuCisyMDE4LTEwLTAyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwlbcHNoaW50ZXJdIEhhbmRsZSBudW1lcmljIG92ZXJmbG93LgogCi0JW3BzYXV4XSBFeHRlbmQgQWRvYmUgaW50ZXJwcmV0ZXIgKGNhbGxvdGhlcnN1YnIpLgorCVJlcG9ydGVkIGFzCiAKLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpCi0JPGNmMl9lc2NDQUxMT1RIRVJTVUJSPjogQ29weSBjb2RlIGZyb20KLQlgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncycgKGluIGB0MWRlY29kZS5jJykuCi0JT3RoZXJTdWJyIDMgKGNoYW5nZSBoaW50cykgc2hvdWxkIHJlc2V0IHRoZSBoaW50bWFzaywgc28gdGhhdCB0aGUKLQluZXcgaGludHMgYXJlIGFwcGxpZWQuCi0JRml4IGZ1bmN0aW9uIGNhbGxzIGFuZCBzdGFjayBhY2Nlc3MuCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMDU1MAogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBzcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIChwc2hfYmx1ZXNfc25hcF9zdGVtKTogTWFzayBudW1lcmljCisJb3ZlcmZsb3cuCiAKLQlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAocG9wKS4KKzIwMTgtMDktMjcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IENoYW5nZSBob3cgdW5oYW5kbGVkCi0JT3RoZXJTdWJyIHJlc3VsdHMgYXJlIHN0b3JlZC4gIEltcGxlbWVudCB0aGUgUG9zdFNjcmlwdCBzdGFjayB1c2luZwotCWFuIGFycmF5LgotCTxjZjJfZXNjUE9QPjogRW5zdXJlIHRoYXQgdGhlIHN0YWNrIGlzIG5vdCBjbGVhcmVkIGFmdGVyIGdldHRpbmcKLQlgT3RoZXJTdWJyJyByZXN1bHRzLgotCUZpeCBzdGFjayBhY2Nlc3MuCisJQWxpZ24gRnJlZVR5cGUgd2l0aCBzdGFuZGFyZCBDIG1lbW9yeSBtYW5hZ2VtZW50LgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmg6IEluY2x1ZGUgRlRfVFlQRVNfSC4KKwkoKkZUX0FsbG9jX0Z1bmMsICpGVF9SZWFsbG9jX0Z1bmMpOiBVc2Ugc2l6ZV90IGZvciB0aGUgc2l6ZSBhcmd1bWVudHMuCisJKiBzcmMvcmFzdGVyL2Z0bWlzYy5oOiBEaXR0by4KIAotCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChjYWxsc3VicikuCisJKiBidWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRzeXN0ZW0uYywgYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYywKKwkqIGJ1aWxkcy92bXMvZnRzeXN0ZW0uYywgc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoZnRfYWxsb2MsIGZ0X3JlYWxsb2MpOgorCVVzZSBzaXplX3QgZm9yIHRoZSBzaXplIGFyZ3VtZW50cy4KIAotCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRDQUxMU1VCUj46Ci0JVHlwZSAxIG1vZGUuCisJKiBzcmMvYmFzZS9mdGRiZ21lbS5jIChmdF9tZW1fZGVidWdfYWxsb2MsIGZ0X21lbV9kZWJ1Z19yZWFsbG9jKTogVXNlCisJRlRfT2Zmc2V0LCBha2Egc2l6ZV90LCBmb3IgdGhlIHNpemUgYXJndW1lbnRzLgogCi0JKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfaW5pdExvY2FsUmVnaW9uQnVmZmVyKTogQWRkIFR5cGUgMSBtb2RlLgorMjAxOC0wOS0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJRml4IGhhbmRsaW5nIG9mIGBGVF9Cb29sJy4KIAotCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChkaXYsIGZvdXItYnl0ZSBudW1iZXJzKS4KKwlCZWZvcmUgdGhpcyBjb21taXQgd2UgaGFkIGNvZGUgbGlrZQogCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2VzY0RJVj46IEFkZAotCVR5cGUgMSBtb2RlLiAgVHlwZSAxIHJlcXVpcmVzIGxhcmdlIGludGVnZXJzIHRvIGJlIGZvbGxvd2VkIGJ5Ci0JYGRpdic7IGNmLiBgQWRvYmUgVHlwZSAxIEZvbnQgRm9ybWF0Jywgc2VjdGlvbiA2LjIuCi0JPG9wID09IDI1NT46IFB1c2ggVHlwZSAxIGZvdXItYnl0ZSBudW1iZXJzIGFzIGBJbnQnIGFsd2F5cy4gIFRoaXMgaXMKLQl0byBlbnN1cmUgYGRpdicgYW5kIGBjYWxsc3VicicgZ2V0IHZhbHVlcyB0aGV5IGNhbiB1c2UuCisJICAoRlRfQm9vbCkoIGdsb2JhbHMtPmdseXBoX3N0eWxlc1tnaW5kZXhdICYgMHg4MDAwKQogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+Ci0KLQlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoaGludHMpLgotCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZEhTVEVNLAotCWNmMl9jbWRWU1RFTT46IEFkZCBjb3JyZWN0aW9uIGZvciBsZWZ0IHNpZGViZWFyaW5nIGluIFR5cGUgMSBtb2RlLgotCUFsbG93IGFkZGluZyBoaW50cyBtaWQtY2hhcnN0cmluZy4KLQk8Y2YyX2VzY1ZTVEVNMywgY2YyX2VzY0hTVEVNMz46IFRyYW5zbGF0ZSBpbnRvIGVxdWl2YWxlbnQgY29tbWFuZHMKLQlmb3IgdGhyZWUgbm9ybWFsIHN0ZW0gaGludHMuICBUaGlzIHJlcXVpcmVzIHNvbWUgcmVjYWxjdWxhdGlvbiBvZgotCXN0ZW0gcG9zaXRpb25zLgotCUNvcnJlY3Rpb24gZm9yIGxlZnQgc2lkZWJlYXJpbmcuCi0KLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KLQotCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChoc2J3LCBzYncpLgotCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfZG9TdGVtcyk6IGBoc2J3JyBvciBgc2J3JyBtdXN0IGJlIHRoZQotCWZpcnN0IG9wZXJhdGlvbiBpbiBhIFR5cGUgMSBjaGFyc3RyaW5nLgotCShjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JPGNmMl9jbWRITU9WRVRPLCBjZjJfY21kVk1PVkVUTywgY2YyX2NtZFJNT1ZFVE8+OiBgaHNidycgb3IgYHNidycKLQltdXN0IGJlIHRoZSBmaXJzdCBvcGVyYXRpb24gaW4gYSBUeXBlIDEgY2hhcnN0cmluZy4KLQk8Y2YyX2NtZEhTQlcsIGNmMl9lc2NTQlc+OiBGaXggZGF0YSBhY2Nlc3MgYW5kIGFkZCBjb3JyZWN0aW9uIGZvcgotCWxlZnQgc2lkZWJlYXJpbmcuCi0KLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KLQotCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChzZXRjdXJyZW50cG9pbnQpLgotCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKQotCTxjZjJfZXNjU0VUQ1VSUkVOVFBUPjogRml4IHN0YWNrIGFjY2Vzcy4KLQotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgotCi0JW3BzYXV4XSBFeHRlbmQgQWRvYmUgaW50ZXJwcmV0ZXIgKGNsb3NlcGF0aCkuCi0KLQkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjMmZfY21kQ0xPU0VQQVRIPjoKLQlVc2UgdGhlIHJpZ2h0IGJ1aWxkZXIgZnVuY3Rpb24uICBXZSBjYW4gdXNlIHRoZSBgaGF2ZVdpZHRoJyBib29sZWFuCi0JYWxyZWFkeSBwcmVzZW50LCBpbnN0ZWFkIG9mIGltcGxlbWVudGluZyBgcGFyc2Vfc3RhdGUnLgotCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+Ci0KLQlbcHNhdXhdIEFkZCBUeXBlIDEgb3BlcmF0aW9ucyB0byBBZG9iZSBDRkYgaW50ZXJwcmV0ZXIuCi0KLQlUaGUgZm9sbG93aW5nIFR5cGUgMSBzcGVjaWZpYyBvcHMgaGF2ZSBiZWVuIGFkZGVkIChjb3BpZWQgZnJvbQotCWB0MWRlY29kZScpOgotCi0JICBjbG9zZXBhdGgKLQkgIHZzdGVtMwotCSAgaHN0ZW0zCi0JICBzZWFjCi0JICBzYncKLQkgIGNhbGxvdGhlcnN1YnIKLQkgIHBvcAotCSAgc2V0Y3VycmVudHBvaW50Ci0JICBoc2J3Ci0KLQlUaGUgZm9sbG93aW5nIHJlcXVpcmUgYSBUeXBlIDEgbW9kZSwgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbgotCXNwZWNpZmljYXRpb246Ci0KLQkgIGhzdGVtCi0JICB2c3RlbQotCSAgdm1vdmV0bwotCSAgY2FsbHN1YnIKLQkgIGRpdgotCSAgcm1vdmV0bwotCSAgaG1vdmV0bwotCSAgTnVtYmVycwotCi0JVGhlIHN1YnNlcXVlbnQgY29tbWl0cyB3aWxsIGltcGxlbWVudCB0aGVzZSBjaGFuZ2VzIGFuZCBhZGFwdAotCWFjY2Vzc2VzIG9mIGRhdGEgYW5kIG9iamVjdHMgdG8gdGhlIG5ldyBpbnRlcnByZXRlci4KLQotCU5PVEU6IFdpbGwgbm90IGNvbXBpbGUgaW4gdGhlIG1lYW50aW1lIQotCi0JKiBzcmMvcHNhdXgvcHNpbnRycC5jOiBBZGQgb3Bjb2RlcyB0byBlbnVtLgotCShjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogQ29weSByZWxldmFudCBjb2RlIG92ZXIgZnJvbQotCWB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzJyAoaW4gYHQxZGVjb2RlLmMnKS4KKwlTaW5jZSBgRlRfQm9vbCcgaXMgZGVmaW5lZCB0byBiZSBhbiBgdW5zaWduZWQgY2hhcicsIHRoZSBjb2RlCisJZXZhbHVhdGVkIHRvIHNvbWV0aGluZyBsaWtlCiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKwkgICh1bnNpZ25lZCBjaGFyKSggMHg4NTMyICYgMHg4MDAwKQogCi0JW3R5cGUxXSBGaXhlcyBmb3IgcmVuZGVyaW5nLgorCXdoaWNoIGluIHR1cm4gZXhwYW5kZWQgdG8KIAotCVRoZSBUeXBlIDEgYWR2YW5jZSB3aWR0aCBjYWxjdWxhdGlvbiBwYXNzZXMgbnVsbCBmb3IgZ2x5cGggc2xvdCwKLQlldGMsIHdoaWNoIGNhbiBjYXVzZSBudWxsIHBvaW50ZXIgYWNjZXNzIGluIHRoZSBuZXcgaW50ZXJwcmV0ZXIuCi0JRmFsbCBiYWNrIHRvIHRoZSBvbGQgb25lIGZvciBub3cuCisJICAodW5zaWduZWQgY2hhcikoIDB4ODAwMCkKIAotCUZpeCB0aGUgbGFyZ2UgZ2x5cGggcmV0cnkgY29kZSBhbmQgZW5zdXJlIGhpbnRpbmcgYW5kIHNjYWxpbmcgZmxhZ3MKLQlhcmUgc2V0IHByb3Blcmx5LgorCWFuZCBmaW5hbGx5IHlpZWxkZWQgMHgwMCDigJMgaS5lLiwgZmFsc2Ug4oCTIG5vdCBhcyBleHBlY3RlZC4KIAotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IEFkZCBhCi0JY2hlY2sgZm9yIG1ldHJpY3Nfb25seS4KLQlTZXQgdGhlIGBmb3JjZV9zY2FsaW5nJyBmbGFnLgotCShUMV9QYXJzZV9HbHlwaCk6IFVwZGF0ZWQuCi0JKFQxX0xvYWRfR2x5cGgpOiBBZGQgYGhpbnRpbmcnIGFuZCBgc2NhbGVkJyBmbGFncy4KKwlQcm9ibGVtIHJlcG9ydGVkIGFuZCBhbmFseXplZCBieSBUb255IFNtaXRoIDx0b255LnNtaXRoQG1hY3JvNC5jb20+LgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCAoRlRfQk9PTCk6IEFkZCBhIGNvbXBhcmlzb24gYWdhaW5zdAorCXplcm8gc28gdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIEJvb2xlYW4gZXhwcmVzc2lvbi4KIAotCVtwc2F1eF0gQWRkIG1pc3Npbmcgb2JqZWN0cyAoMi8yKS4KKwkqLyo6IFJlcGxhY2UgY2FzdGluZ3MgdG8gYEZUX0Jvb2wnIHdpdGggY2FsbHMgdG8gYEZUX0JPT0wnIHdoZXJlCisJcG9zc2libGUuCiAKLQlTeW50aGVzaXplIGEgYFN1YkZvbnQnIG9iamVjdCBmb3IgVHlwZSAxIGZvbnRzLiAgVGhpcyBpcyB1c2VkIGluIHRoZQotCWludGVycHJldGVyIHRvIGFjY2VzcyBQcml2YXRlIGRpY3QgZGF0YSwgd2hpY2ggYXJlIHN0b3JlZCBpbgotCWRpZmZlcmVudCBwbGFjZXMgZm9yIFR5cGUgMSBhbmQgQ0ZGLiAgVGhpcyBhbGxvd3MgdGhlIHNhbWUgZGF0YSB0bwotCWJlIHVzZWQgaW4gZWl0aGVyIG1vZGUuCisyMDE4LTA5LTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIHNyYy9wc2F1eC9wc29ianMuYyAodDFfbWFrZV9zdWJmb250KTogTmV3IHByb2NlZHVyZSB0byBjb3B5Ci0JcmVxdWlyZWQgdmFsdWVzIHRvIGEgZHVtbXkgYENGRl9TdWJGb250JyBvYmplY3QuICBUaGlzIGlzIHNpbWlsYXIgdG8KLQlgY2ZmX21ha2VfcHJpdmF0ZV9kaWN0Jy4KLQkqIHNyYy9wc2F1eC9wc29ianMuaDogQWRkIHRoZSBuZXcgZGVjbGFyYXRpb24uCisJW2JkZl0gU3BlZWQgdXAgY2hhcm1hcCBhY2Nlc3MuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL3BzYXV4L3BzYXV4bW9kLmM6IERpdHRvLgotCUFkZCB0aGlzIHRvIHRoZSBQU0F1eCBTZXJ2aWNlIGZvciBmdXR1cmUgdXNlIHdpdGggQ0lEIGZvbnRzLgorCVRoaXMgbWFrZXMgRlRfR2V0X0NoYXJfSW5kZXggYW5kIEZUX0dldF9OZXh0X0NoYXIgNC01IHRpbWVzIGZhc3Rlci4KIAotCSogc3JjL3R5cGUxL3QxZ2xvYWQuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSC4KLQkoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IEFkZCB0aGUgY2FsbC4KKwkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoYmRmX2NtYXBfY2hhcl97aW5kZXgsbmV4dH0pOiBIZWxwIGJpbmFyeSBzZWFyY2gKKwl3aXRoIGNvbnRpbnVvdXMgcHJlZGljdGlvbi4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOC0wOS0yMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JW3BzYXV4XSBBZGQgbWlzc2luZyBvYmplY3RzIGZvciBUeXBlIDEgKDEvMikuCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaW1hcCk6IEFub3RoZXIgdHdlYWsuCiAKLQlNb3ZlIGBDRjJfRm9udCcgaW5zdGFuY2UgdG8gYFBTX0RlY29kZXInLiAgVGhpcyBpcyB0aGUgY29udGV4dCBmb3IKLQl0aGUgaW50ZXJwcmV0ZXIgYW5kIHNpbmNlIGl0IGlzIGN1cnJlbnRseSBzdG9yZWQgaW4gYENGRl9Gb250JywgaXMKLQl1bmF2YWlsYWJsZSBpbiBUeXBlIDEgbW9kZS4KKwlUaGlzIG9uZSBzaG91bGQgYmUgY2xlYXJlci4gV2hlbiB0aGUgcm91bmRlZCBtb25vY2hyb21lIGJib3ggY29sbGFwc2VzCisJd2UgYWRkIGEgcGl4ZWwgdGhhdCBjb3ZlcnMgbW9zdCBpZiBub3QgYWxsIG9yaWdpbmFsIGNib3guCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoVDFfRGVjb2RlciwgUFNfRGVjb2Rlcik6IE5ldwotCWBjZjJfaW5zdGFuY2UnIGZpZWxkLgorMjAxOC0wOS0yMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JKiBzcmMvcHNhdXgvcHNkZWNvZGUuYyAocHNfZGVjb2Rlcl9pbml0KTogQ29weSBgY2YyX2luc3RhbmNlJyB0bwotCWBQU19EZWNvZGVyJy4KKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpbWFwKTogRnVydGhlciB0d2Vhay4KIAotCSogc3JjL3BzYXV4L3QxZGVjb2RlLmMgKHQxX2RlY29kZXJfZG9uZSk6IEFkZCBmaW5hbGl6YXRpb24gY29kZS4KKzIwMTgtMDktMjEgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgogCi0JKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IFVwZGF0ZSBhY2Nlc3Nlcy4KKwlJbXByb3ZlIGF1dG8taGludGVyIGhhbmRsaW5nIG9mIGJpdG1hcCBmb250cyAoIzU0NjgxKS4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCUZvciBiaXRtYXAgZm9udHMsIGBGVF9Mb2FkX0dseXBoJyBzaG91bGQgZWl0aGVyIHJldHVybiBhbiBlcnJvciBvcgorCW5vdCBzZXQgdGhlIGZvcm1hdCB0byBgRlRfR0xZUEhfRk9STUFUX09VVExJTkUnLiAgSG93ZXZlciwgaW4gdGhpcworCWNhc2UgYEZUX0xvYWRfR2x5cGgnIGNhbGxzIGludG8gdGhlIGF1dG8taGludGVyIHdoaWNoIGNhbGxzIGJhY2sKKwlpbnRvIGBGVF9Mb2FkX0dseXBoJyB3aXRoIGBGVF9MT0FEX05PX1NDQUxFJyBpbiB0aGUgZmxhZ3MsIHdoaWNoCisJbWFya3MgdGhlIGdseXBoIGFzIGBGVF9HTFlQSF9GT1JNQVRfT1VUTElORScgd2l0aCBhbiBlbXB0eSBwYXRoCisJKGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgcGF0aCkuICBJdCBhcHBlYXJzIHRoYXQgdGhlCisJYXV0by1oaW50ZXIgc2hvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgZmFjZSBkb2Vzbid0IGhhdmUKKwlvdXRsaW5lcy4gIFRoZSBjdXJyZW50IHRlc3QgZm9yIHVzaW5nIHRoZSBhdXRvLWhpbnRlciBpbgorCWBGVF9Mb2FkX0dseXBoJyBjaGVja3Mgd2hldGhlciB0aGUgZHJpdmVyIHN1cHBvcnRzIHNjYWxhYmxlCisJb3V0bGluZXMsIGJ1dCBub3QgaWYgdGhlIGZhY2Ugc3VwcG9ydHMgc2NhbGFibGUgb3V0bGluZXMuCiAKLQlBbGxvdyBgdHlwZTEnIG1vZHVsZSB0byB1c2UgdGhlIEFkb2JlIGVuZ2luZS4KKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogRGlyZWN0bHkgY2hlY2sgd2hldGhlciB3ZSBoYXZlCisJc2NhbGFibGUgb3V0bGluZXMuCiAKLQlBZGQgdGhlIGNhbGxiYWNrIGFuZCBzb21lIGNvbmRpdGlvbmFscyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvCi0JZW5naW5lcy4KKzIwMTgtMDktMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyX0Z1bmNzUmVjKTogQ2hhbmdlCi0JZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCSogc3JjL3BzYXV4L3BzYXV4bW9kLmMgKFQxX0RlY29kZXJfRnVuY3NSZWMpOiBSZWdpc3RlciB0aGUKLQljYWxsYmFja3MuCisJW3Jhc3Rlcl0gRml4IGRpc2FwcGVhcmluZyB2ZXJ0aWNhbCBsaW5lcyAoIzU0NTg5KS4KIAotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19idWlsZGVyX2FkZF9wb2ludCk6IEFkZCBjb25kaXRpb25hbHMgZm9yCi0JbnVtYmVyIGNvbnZlcnNpb24uCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKFZlcnRpY2FsX1N3ZWVwX1NwYW4pOiBIYW5kbGUgc3BlY2lhbCBjYXNlCisJd2hlcmUgYm90aCBsZWZ0IGFuZCByaWdodCBvdXRsaW5lIGV4YWN0bHkgcGFzcyBwaXhlbCBjZW50ZXJzLgogCi0JKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogQWRkIGNvZGUKLQl0byBjaG9vc2Ugd2hpY2ggcmVuZGVyZXIgdG8gdXNlLgorMjAxOC0wOS0yMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKTogVXBkYXRlIGNhbGwuCi0JKiBzcmMvYmFzZS9mdG9ianMuYywgc3JjL3BzYXV4L3Bzb2Jqcy5jLCBzcmMvdHlwZTEvdDFnbG9hZC5jOiBVcGRhdGUKLQlpbmNsdWRlcy4KKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpbWFwKTogVGlueSByb3VuZGluZyB0d2Vhay4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCVRoaXMgYWRkcyBwaXhlbHMgaW4gY2FzZSBhIGNvbnRvdXIgZ29lcyB0aHJvdWdoIHRoZSBjZW50ZXIKKwlhbmQgdGhleSBuZWVkIHRvIGJlIHR1cm5lZCBvbiBpbiB0aGUgYi93IHJhc3Rlcml6ZXIuCiAKLQlbdHlwZTFdIEFkZCBBZG9iZSBlbmdpbmUgY29uZmlndXJhdGlvbi4KKzIwMTgtMDktMjAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCVVzZSB0aGUgcHJldmlvdXNseSBjaGFuZ2VkIFBTX0RyaXZlciBpbiB0eXBlMSBtb2R1bGUgdG8gc3RvcmUKLQloaW50aW5nIGVuZ2luZSBjb25maWd1cmF0aW9uLgorCVtwY2ZdIFJlcGxhY2UgY2hhcm1hcCBpbXBsZW1lbnRhdGlvbi4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9mdHQxZHJ2Lmg6IE5ldyBmaWxlLgotCUR1cGxpY2F0ZSBhbmQgcmVuYW1lIGNvbmZpZyBvcHRpb25zIGZyb20gQ0ZGLgotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfVFlQRTFfRFJJVkVSX0gpOiBOZXcgbWFjcm8uCisJUENGIGNvbWVzIHdpdGggY2hhcm1hcCBsb29rdXAgdGFibGUsIGFrYSBQQ0YgZW5jb2RpbmdzLiAgVXNpbmcgaXQKKwlkaXJlY3RseSBtYWtlcyBGVF9HZXRfQ2hhcl9JbmRleCBhbmQgRlRfR2V0X05leHRfQ2hhciA0LTUgdGltZXMKKwlmYXN0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgQkRGLWxpa2UgYmluYXJ5IHNlYXJjaGVzLgogCi0JKiBzcmMvdHlwZTEvdDFkcml2ZXIuYyAodDFfZHJpdmVyX2NsYXNzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogc3JjL3R5cGUxL3Qxb2Jqcy5jOiBJbmNsdWRlIEZUX1RZUEUxX0RSSVZFUl9ILgotCShUMV9Ecml2ZXJfSW5pdCk6IFVwZGF0ZSBjb2RlLgorCSogc3JjL3BjZi9wY2YuaCAoUENGX0VuY29kaW5nUmVjKTogUmVtb3ZlZC4KKwkoUENGX0ZhY2VSZWMpOiBSZW1vdmUgYG5lbmNvZGluZ3MnIGFuZCBgZW5jb2RpbmdzJy4KKwkqIHNyYy9wY2YvcGNmZHJpdnIuYyAocGNmX2NtYXBfY2hhcl97aW5kZXgsbmV4dH0pOiBSZXBsYWNlZC4KKwkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2VuY29kaW5ncyk6IFN0b3JlIGRhdGEgZGlmZmVyZW50bHkuCiAKLTIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKzIwMTgtMDktMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVtjZmZdIE1vdmUgYW5kIHJlbmFtZSBgQ0ZGX0RyaXZlcicuCisJW2Jhc2VdIFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gYEZUX0dseXBoTG9hZGVyX0NvcHlQb2ludHMnLgogCi0JVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlIHNhbWUgaGludGluZyBlbmdpbmUgcGFyYW1ldGVycyBmb3IKLQlUeXBlIDEuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmgsIHNyYy9iYXNlL2Z0Z2xvYWRyLmMKKwkoRlRfR2x5cGhMb2FkZXJfQ29weVBvaW50cyk6IERvIGl0LgogCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oIChDRkZfRHJpdmVyKTogUmVuYW1lIGFuZAotCW1vdmUgdG8uLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfRHJpdmVyKTogLi4uaGVyZS4KKzIwMTgtMDktMTkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCSogc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jZmYvY2ZmbG9hZC5jLAotCXNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2ZmL2NmZm9ianMuaCwgc3JjL3BzYXV4L3BzZnQuYywKLQlzcmMvcHNhdXgvcHNvYmpzLmM6IFVwZGF0ZSByZWZlcmVuY2VzLgorCVtwY2ZdIFByZXBhcmUgdG8gcmVwbGFjZSBjaGFybWFwIGltcGxlbWVudGF0aW9uLgogCi0yMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBzcmMvcGNmL3BjZi5oIChQQ0ZfRmFjZVJlYyk6IFVwZGF0ZWQgdG8gaW5jbHVkZS4uLgorCShQQ0ZfRW5jUmVjKTogLi4uIHRoaXMgbmV3IHN0cnVjdHVyZSB0byBzdG9yZSBjaGFybWFwIGdlb21ldHJ5LgogCi0JW3BzYXV4LCB0eXBlMV0gUmVvcmdhbml6ZSBvYmplY3QgZmllbGRzLgorCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfZW5jb2RpbmdzKTogU3RvcmUgY2hhcm1hcCBnZW9tZXRyeS4KIAotCU1ha2Ugc29tZSBmaWVsZHMgbW9yZSBnZW5lcmljLCBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgdGhlbSB0aGUgc2FtZQotCXdheSByZWdhcmRsZXNzIG9mIFR5cGUgMSBvciBDRkYuCisyMDE4LTA5LTE4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfQnVpbGRlcik6IENoYW5nZSBgVFRfRmFjZScKLQl0byBgRlRfRmFjZScuCiAJUmVtb3ZlIHVudXNlZCBmaWVsZHMuCiAKLQkqIHNyYy9wc2F1eC9wc2Z0LmM6IFVwZGF0ZSBhbGwgYWNjZXNzZXMgb2YgYFBTX0J1aWxkZXIuZmFjZScuCi0JQWRkIHNvbWUgYXNzZXJ0cyB0byBndWFyZCBhZ2FpbnN0IGNhc3RpbmcgYFQxX0ZhY2UnIGFzIGBUVF9GYWNlJy4KKwkqIHNyYy9wY2YuaCAoUENGX0ZhY2VSZWMpOiBSZW1vdmUgYGNoYXJtYXAnIGFuZCBgY2hhcm1hcF9oYW5kbGUnLgorCSogc3JjL2JkZmRydnIuaCAoQkRGX0ZhY2VSZWMpOiBEaXR0by4KKwkqIHNyYy93aW5mb250cy93aW5mbnQuaCAoRk5UX0ZhY2VSZWMpOiBEaXR0by4KIAotCSogc3JjL3R5cGUxL3Qxb2Jqcy5oIChUMV9HbHlwaFNsb3QpOiBSZW9yZGVyIGZpZWxkcyB0byBmb2xsb3cKLQlgQ0ZGX0dseXBoU2xvdCcsIHNvIHRoYXQgd2UgY2FuIHByZXRlbmQgdGhleSBhcmUgdGhlIHNhbWUgaW4gdGhlCi0JaW50ZXJwcmV0ZXIuCisyMDE4LTA5LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfYnVpbGRlcl9pbml0LCBwc19idWlsZGVyX2FkZF9wb2ludCk6Ci0JVXBkYXRlZCB3aXRoIGFib3ZlIGNoYW5nZXMuCisJW3BzaGludGVyXSBIYW5kbGUgbnVtZXJpYyBvdmVyZmxvdy4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCVJlcG9ydGVkIGFzCiAKLQlbcHNhdXhdIFByZXBhcmUgZm9yIFR5cGUgMSBtb2RlLgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAzOTYKIAotCUFkZCBzb21lIGNoZWNrcyBmb3IgVHlwZSAxIGRhdGEgcGFzc2luZyB0aHJvdWdoLgorCSogc3JjL3BzaGludGVyL3BzaGdsb2IuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0guCisJKHBzaF9ibHVlc19zbmFwX3N0ZW0pOiBNYXNrIG51bWVyaWMgb3ZlcmZsb3cuCiAKLQkqIHNyYy9wc2F1eC9wc2ZvbnQuaCAoQ0YyX0ZvbnQpOiBBZGQgYGlzVDEnIGZsYWcuCi0JKiBzcmMvcHNhdXgvcHNmb250LmMgKGNmMl9mb250X3NldHVwKTogU2tpcCB0aGUgdmFyaWF0aW9ucyBhbmQgYmxlbmQKLQljb2RlIHdoaWNoIGlzIG5vdCBhcHBsaWNhYmxlIGZvciBUeXBlIDEuCisyMDE4LTA5LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQXZvaWQgYWNjZXNzaW5nCi0JYGRlY29kZXItPmNmZicgaW4gVHlwZSAxIG1vZGUuCi0JQ29weSBgaXNfdDEnIGZsYWcgdG8gYENGMl9Gb250Jy4KKwlbdHJ1ZXR5cGVdIFNvbWUgZml4ZXMgZm9yIFZGIGNoZWNrcy4KIAotMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCVJlcG9ydGVkIGFzCiAKLQlbcHNhdXgsIGNmZl0gVXNlIHRoZSBuZXcgb2JqZWN0cy4KKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwMzE3CiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwgc3JjL3BzYXV4L3BzYXV4bW9kLmM6IEZpeAotCXN3aXRjaGluZyBiZXR3ZWVuIG5ldyBhbmQgb2xkIGVuZ2luZXMuCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfbG9hZF9ndmFyKTogUHJvcGVybHkgZXhpdCBtZW1vcnkKKwlmcmFtZSBpZiB3ZSBoYXZlIGludmFsaWQgZ2x5cGggdmFyaWF0aW9uIGRhdGEgb2Zmc2V0cy4KKwkodHRfZmFjZV92YXJ5X2N2dCk6IFByb3RlY3QgYWdhaW5zdCBtaXNzaW5nIGB0dXBsZWNvb3JkcycgYXJyYXkuCisJRml4IHR5cG8uCiAKLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYywgc3JjL2NmZi9jZmZwYXJzZS5jOiBVcGRhdGUgY2FsbHMuCisyMDE4LTA5LTEzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc2JsdWVzLmMsIHNyYy9wc2F1eC9wc2ZvbnQuYywgc3JjL3BzYXV4L3BzZm9udC5oLAotCXNyYy9wc2F1eC9wc2Z0LmMsIHNyYy9wc2F1eC9wc2Z0LmgsIHNyYy9wc2F1eC9wc2ludHJwLmM6IFVwZGF0ZSBhbGwKLQl0byB1c2UgbmV3IG9iamVjdHMuCisJKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF92YXJfcHNfbmFtZSk6IEZpeCBsYXN0IGNvbW1pdC4KIAotMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorMjAxOC0wOS0xMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JW3BzYXV4XSBPYmplY3RzIGZvciBuZXcgaW50ZXJwcmV0ZXIgKHBhcnQgMikuCisJKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF92YXJfcHNfbmFtZSk6IENoZWNrIGByZXN1bHQnLgogCi0JTWFrZSB0aGUgbmV3IG9iamVjdHMgY29weSBvdmVyIHZhbHVlcy4gIFRoZXkgYXJlIGVzc2VudGlhbGx5IHdyYXBwZXIKLQl0eXBlcyBmb3IgdGhlIGRpZmZlcmVudCBkZWNvZGVycy9idWlsZGVycy4KKwlSZXBvcnRlZCBhcwogCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKFBTX0J1aWxkZXIpOiBBZGQgYGlzX3QxJyBmbGFnLgotCShQU19EZWNvZGVyX3tHZXQsRnJlZX1fR2x5cGhfQ2FsbGJhY2spOiBSZW5hbWVkIHRvLi4uCi0JKENGRl9EZWNvZGVyX3tHZXQsRnJlZX1fR2x5cGhfQ2FsbGJhY2s6IC4uLiB0aGlzLgotCShQU19EZWNvZGVyKTogVXBkYXRlZC4KLQlBZGQgYHQxX3BhcnNlX2NhbGxiYWNrJyBtZW1iZXIuCi0JKFBTQXV4X1NlcnZpY2VSZWMpOiBBZGQgYHBzX2RlY29kZXJfaW5pdCcgbWVtYmVyLgorCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAzMTYKIAotCSogc3JjL3BzYXV4L3BzZGVjb2RlLmgsIHNyYy9wc2F1eC9wc29ianMuaDogVXBkYXRlIGRlY2xhcmF0aW9ucy4KKzIwMTgtMDktMTIgIEpvaG4gVHl0Z2F0ICA8Sm9obi5UeXRnYXRAZXNrby5jb20+CiAKLQkqIHNyYy9wc2F1eC9wc2RlY29kZS5jLCBzcmMvcHNhdXgvcHNvYmpzLmM6IEltcGxlbWVudCBjb3B5IHdpdGggdHdvCi0JbW9kZXMuCisJW3NmbnRdIEJldHRlciBQUyBuYW1lIGhhbmRsaW5nICgjNTQ2MjkpLgogCi0JKiBzcmMvcHNhdXgvcHNhdXhtb2QuYzogQWRkIGJ1aWxkZXIgYW5kIGRlY29kZXIgZnVuY3Rpb25zIHRvIGBQU0F1eCcKLQlzZXJ2aWNlLgorCSogc3JjL3NmbnQvc2Zkcml2ZXIgKElTX1dJTiwgSVNfQVBQTEUpOiBPbWl0IGxhbmd1YWdlIElEIGNoZWNrcy4KKwkoZ2V0X3dpbl9zdHJpbmcsIGdldF9hcHBsZV9zdHJpbmcpOiBSZXR1cm4gTlVMTCB3aGVuIHRoZSBQb3N0U2NyaXB0CisJZm9udCBuYW1lIGNoYXJhY3RlcnMgaXMgbm90IGFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLgorCShnZXRfd2luX3N0cmluZyk6IE1ha2UgdHJhY2Ugb3V0cHV0IHdvcmsgaWYgdGhlIGhpZ2ggYnl0ZSBpZgorCW5vbi16ZXJvLgorCShzZm50X2dldF92YXJfcHNfbmFtZSwgc2ZudF9nZXRfcHNfbmFtZSk6IFByZXZpb3VzbHkgd2UgcHJlZmVycmVkCisJV2luIFBTIG5hbWUgKHdoZW4gdGhlcmUgaXMgYWxzbyBhbiBBcHBsZSBQUyBuYW1lKTsgY2hhbmdlIHRoaXMgaW50bworCWEgZmFsbGJhY2sgdG8gQXBwbGUgUFMgbmFtZSBpbiBjYXNlIHRoZSBXaW4gUFMgbmFtZSBpcyBpbnZhbGlkLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisyMDE4LTA5LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlbcHNhdXhdIEFkZCBvYmplY3RzIGZvciBuZXcgaW50ZXJwcmV0ZXIuCisJW3RydWV0eXBlXSBJbXByb3ZlIFZGIGNoZWNrLgogCi0JSW50cm9kdWNlIGBQU19EZWNvZGVyJyBhbmQgYFBTX0J1aWxkZXInIHdoaWNoIGluY2x1ZGUgYWxsIGZpZWxkcwotCWZyb20gZWl0aGVyIFR5cGUgMSBvciBDRkYgZGVjb2RlcnMvYnVpbGRlcnMuCisJVHJpZ2dlcmVkIGJ5CiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfQnVpbGRlciwgUFNfRGVjb2Rlcik6IE5ldwotCXN0cnVjdHMuCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMDI1NQogCi0JKiBzcmMvcHNhdXgvcHNvYmpzLmMsIHNyYy9wc2F1eC9wc29ianMuaDogQWRkIGBQU19CdWlsZGVyJworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX2xvYWRfZ3Zhcik6IFVzZSBiZXR0ZXIgbGltaXQgY2hlY2sKKwlmb3IgYHR1cGxlQ291bnQnLgorCisyMDE4LTA5LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl9sb2FkX2d2YXIpOiBDaGVjayBgZ2x5cGhvZmZzZXRzJy4KKworMjAxOC0wOS0xMCAgQXJtaW4gSGFzaXR6a2EgIDxwcmluY2UuY2hlcnVza2VyQGdtYWlsLmNvbT4KKworCSogc3JjL3BzaGludGVyL3BzaHJlYy5jICh0Ml9oaW50c19zdGVtcyk6IE1hc2sgbnVtZXJpYyBvdmVyZmxvdy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwMjE1CisKKzIwMTgtMDktMDkgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCisJKiBidWlsZHMvZnJlZXR5cGUubWsgKHJlZmRvYy12ZW52KTogRW5zdXJlIHB5dGhvbiB2ZXJzaW9uICgjNTQ2MzEpLgorCisyMDE4LTA5LTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEZpeCBhc3NlcnRpb24gZmFpbHVyZS4KKworCVRyaWdnZXJlZCBieQorCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0xMDIxMgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChsb2FkX3RydWV0eXBlX2dseXBoKTogUmVpbnRyb2R1Y2UKKwlgb3BlbmVkX2ZyYW1lJyAocmVtb3ZlZCBpbiBhIGNoYW5nZSBmcm9tIDIwMTgtMDgtMjYpIHRvIGhhbmRsZQorCWRlYWxsb2NhdGlvbiBvZiB0aGUgc2Vjb25kIGZyYW1lLgorCisyMDE4LTA5LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlTeW5jaHJvbml6ZSBgZnRkZWJ1Zy5jJyBmaWxlcy4KKworCSogYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0ZGVidWcuYywgYnVpbGRzL3dpbmNlL2Z0ZGVidWcuYywKKwlidWlsZHMvd2luZG93cy9mdGRlYnVnLmM6IFN5bmNocm9uaXplIHdpdGggYHNyYy9iYXNlL2Z0ZGVidWcuYycuCisKKzIwMTgtMDktMDUgIE5pa2hpbCBSYW1ha3Jpc2huYW4gIDxyYW1ha3Jpc2huYW4ubmlraGlsQGdtYWlsLmNvbT4KKworCUFkZCBkb2N1bWVudGF0aW9uIGd1aWRlbGluZXMgZmlsZS4KKworCSogZG9jcy9ET0NHVUlERTogTmV3IGZpbGUuCisKKzIwMTgtMDktMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogZGV2ZWwvZnRvcHRpb24uaDogU3luY2hyb25pemUgd2l0aCBtYXN0ZXIgYGZ0b3B0aW9uLmgnLgorCisyMDE4LTA5LTAzICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbZG9jd3JpdGVyXSBEb24ndCBicmVhayBjb2RlIHNuaXBwZXRzIGFjY3Jvc3MgbGluZXMuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2xpc3RzLm5vbmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTgtMDgvbXNnMDAxMjQuaHRtbAorCisJKiBkb2NzL3JlZmVyZW5jZS9tYXJrZG93bi9zdHlsZXNoZWV0cy9leHRyYS5jc3MgKC5tZC10eXBlc2V0IGNvZGUpOgorCUFkZCBydWxlIGB3aGl0ZS1zcGFjZScuCisKKzIwMTgtMDktMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSovKjogcy9QU05hbWVzL3BzbmFtZXMvLgorCisJT25seSB0cmFjaW5nIG1lc3NhZ2VzIGFyZSBhZmZlY3RlZC4KKworMjAxOC0wOS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3NmbnRdIEZpeCBoZWFwIGJ1ZmZlciBvdmVyZmxvdyBpbiBDUEFMIGhhbmRsaW5nLgorCisJKiBzcmMvc2ZudC90dGNwYWwuYyAodHRfZmFjZV9wYWxldHRlX3NldCk6IEZpeCBib3VuZGFyeSB0ZXN0LgorCSh0dF9mYWNlX2xvYWRfY3BhbCk6IFVwZGF0ZWQuCisKKzIwMTgtMDktMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVJlbW92ZSBgRlRfT3V0bGluZV97TmV3LERvbmV9X0ludGVybmFsJy4KKworCVRoZXNlIHB1YmxpYyBBUEkgZnVuY3Rpb25zKCEpIHdlcmUgYWx3YXlzIHVuZG9jdW1lbnRlZCBhbmQgaGF2ZQorCWVzY2FwZWQgYWxsIGNsZWFuLXVwIGVmZm9ydHMgdW50aWwgbm93LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCAoRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwsCisJRlRfT3V0bGluZV9Eb25lX0ludGVybmFsKTogUmVtb3ZlZC4KKworCSogc3JjL2Jhc2UvZnRvdXRsbi5oIChGVF9PdXRsaW5lX05ld19JbnRlcm5hbCwKKwlGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwpOiBNZXJnZSBpbnRvLi4uCisJKEZUX091dGxpbmVfTmV3LCBGVF9PdXRsaW5lX0RvbmUpOiAuLi4gdGhlc2UgZnVuY3Rpb25zLgorCisJKiBkb2NzL1JFQURNRTogVXBkYXRlZC4KKworMjAxOC0wOC0zMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOiBDaGVjayBnbHlwaCBmb3JtYXQuCisKKzIwMTgtMDgtMzEgIEFybWluIEhhc2l0emthICA8cHJpbmNlLmNoZXJ1c2tlckBnbWFpbC5jb20+CisKKwlbZXJyb3JzXSBSZWZpbmUgdGhlIG1hY3JvIGxvZ2ljIHN1cnJvdW5kaW5nIGBGVF9FcnJvcl9TdHJpbmcnLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmggKEZUX0lOQ0xVREVfRVJSX1BST1RPUywKKwlGVF9FUlJfUFJPVE9TX0RFRklORUQpOiBVbmRlZmluZSBgRlRfSU5DTFVERV9FUlJfUFJPVE9TJyBhZnRlcgorCWNoZWNraW5nIGl0IGFuZCBpbnRyb2R1Y2UgYSBuZXcgbWFjcm8gdGhhdCB0YWtlcyBwcm9wZXIgY2FyZSBvZgorCW11bHRpcGxlLWluY2x1c2lvbiBwcm90ZWN0aW9uLgorCisyMDE4LTA4LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9iYXNlL2Z0ZGVidWcuYyAoRlRfVGhyb3cpOiBSZXN0b3JlIG1pc3NpbmcgYEZUX1VOVVNFRCcgY2FsbHMuCisKKzIwMTgtMDgtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRkZWJ1Zy5jIChGVF9UaHJvdyk6IFJlZHVjZSBjaGF0dGluZXNzLgorCisyMDE4LTA4LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2x5cGhfaGludHNfcmVsb2FkKTogQWRkIGluaXRpYWxpemF0aW9uLgorCisyMDE4LTA4LTMwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlDb25zb2xpZGF0ZSBiaXRtYXAgcHJlc2V0dGluZyBhbmQgc2l6ZSBhc3Nlc3NtZW50LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCk6CisJQ2hhbmdlIHJldHVybiB0eXBlLgorCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogUmV0dXJuIHRoZSBiaXRtYXAKKwlzaXplIGFzc2Vzc21lbnQuCisKKwkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3JlbmRlcik6IFVzZSBpdCB0byByZWZ1c2UgdGhlCisJcmVuZGVyaW5nIG9mIGVub3VybW91cyBvciBmYXItZmV0Y2hlZCBvdXRsaW5lcy4KKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRGl0dG8uCisKKzIwMTgtMDgtMzAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogQ29ycmVjdCBtb25vLgorCisyMDE4LTA4LTMwICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJW2Vycm9yc10gSW50cm9kdWNlIGEgbWFjcm8gdG8gY29udHJvbCBgRlRfRXJyb3JfU3RyaW5nJy4KKworCSogZGV2ZWwvZnRvcHRpb24uaCAoRlRfQ09ORklHX09QVElPTl9FUlJPUl9TVFJJTkdTKSwKKwlpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIChGVF9DT05GSUdfT1BUSU9OX0VSUk9SX1NUUklOR1MpOgorCU5ldyBtYWNyby4KKworMjAxOC0wOC0zMCAgQXJtaW4gSGFzaXR6a2EgIDxwcmluY2UuY2hlcnVza2VyQGdtYWlsLmNvbT4KKworCVtlcnJvcnNdIEludHJvZHVjZSBgRlRfRXJyb3JfU3RyaW5nJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oIChGVF9FcnJvcl9TdHJpbmcpLAorCXNyYy9iYXNlL2Z0ZXJyb3JzLmMgKEZUX0Vycm9yX1N0cmluZyk6IEltcGxlbWVudCBgRlRfRXJyb3JfU3RyaW5nJy4KKworCSogc3JjL2Jhc2UvZnRiYXNlLmMsIHNyYy9iYXNlL0phbWZpbGUgKF9zb3VyY2UpLAorCXNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IEFkZCBgZnRlcnJvcnMuYycgdG8gdGhlIGJ1aWxkIGxvZ2ljLgorCisJKiBzcmMvYmFzZS9mdGRlYnVnLmMgKEZUX1Rocm93KTogVXNlIGBGVF9FcnJvcl9TdHJpbmcnLgorCisyMDE4LTA4LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbYXV0b2ZpdF0gVHJhY2UgYGJlZm9yZScgYW5kIGBhZnRlcicgZWRnZXMgb2Ygc3Ryb25nIHBvaW50cy4KKworCSogc3JjL2F1dG9maXQvYWZoaW50cy5oIChBRl9Qb2ludFJlYykgW0ZUX0RFQlVHX0FVVE9GSVRdOiBOZXcgYXJyYXlzCisJYGJlZm9yZScgYW5kIGBhZnRlcicuCisKKwkqIHNyYy9hdXRvZml0L2FmaGludHMuYyAoYWZfZ2V0X3N0cm9uZ19lZGdlX2luZGV4KTogTmV3IGF1eGlsaWFyeQorCWZ1bmN0aW9uLgorCShhZl9nbHlwaF9oaW50c19kdW1wX3BvaW50cyk6IFRyYWNlIGBiZWZvcmUnIGFuZCBgYWZ0ZXInIGVkZ2VzLgorCShhZl9nbHlwaF9oaW50c19hbGlnbl9zdHJvbmdfcG9pbnRzKSBbRlRfREVCVUdfQVVUT0ZJVF06IFNldAorCWBiZWZvcmUnIGFuZCBgYWZ0ZXInIGluZm9ybWF0aW9uLgorCisyMDE4LTA4LTMwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmFzZV0gT3ZlcmZsb3ctcmVzaXN0YW50IGJpdG1hcCBwcmVzZXR0aW5nLgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOiBJbXBsZW1lbnQgaXQuCisKKzIwMTgtMDgtMjkgIEFybWluIEhhc2l0emthICA8cHJpbmNlLmNoZXJ1c2tlckBnbWFpbC5jb20+CisKKwlGaXggbnVtZXJpYyBvdmVyZmxvd3MuCisKKwkqIHNyYy9wc2hpbnQvcHNoYWxnby5jIChwc2hfaGludF9hbGlnbiwgcHNoX2hpbnRfYWxpZ25fbGlnaHQsCisJcHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKTogRml4IG51bWVyaWMgb3ZlcmZsb3dzLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAwODMKKworMjAxOC0wOC0yOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2NmZl0gRml4IGhhbmRsaW5nIG9mIGByb2xsJyBvcCBpbiBvbGQgZW5naW5lLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAwODAKKworCSogc3JjL3BzYXV4L2NmZmRlY29kZS5jIChjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncykgPGNmZl9vcF9yb2xsPgorCVtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogVXNlIG1vZHVsbyBmb3IgbG9vcCBjb3VudCwgYXMKKwlkb2N1bWVudGVkIGluIHRoZSBzcGVjaWZpY2F0aW9uLgorCisyMDE4LTA4LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHRfc2l6ZV9yZWFkX2J5dGVjb2RlKTogVHJhY2UgQ1ZUIHZhbHVlcy4KKworMjAxOC0wOC0yNiAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJKiBjb25maWd1cmU6IENvcHkgYXNzZXRzIHJlcXVpcmVkIGJ5IGRvY3dyaXRlci4KKworCUNvcHkgZGlyZWN0b3J5IGBkb2NzL3JlZmVyZW5jZS9tYXJrZG93bicgd2hlbiBGcmVlVHlwZSBpcyBjb21waWxlZCBpbiBhCisJZGlmZmVyZW50IGRpcmVjdG9yeS4KKworCUZpeGVzIGBtYWtlIHJlZmRvYycgaWYgYnVpbGRkaXIgIT0gc3JjZGlyLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9saXN0cy5ub25nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDE4LTA4L21zZzAwMDgzLmh0bWwKKworMjAxOC0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvcHNoaW50L3BzaGFsZ28uYyAocHNoX2hpbnRfb3ZlcmxhcCk6IEZpeCBudW1lcmljIG92ZXJmbG93LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAwNTcKKworMjAxOC0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJTWlub3IgdHJhY2luZyBhZGp1c3RtZW50cy4KKworCSogc3JjL2Jhc2UvZnRzdHJlYW0uYyAoRlRfU3RyZWFtX0VudGVyRnJhbWUsIEZUX1N0cmVhbV9FeGl0RnJhbWUpOgorCVRyYWNlLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9BY2Nlc3NfR2x5cGhfRnJhbWUpOiBSZW1vdmUgdHJhY2luZy4KKworMjAxOC0wOC0yNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBBdm9pZCBuZXN0ZWQgZnJhbWVzLgorCisJVHJpZ2dlcmVkIGJ5CisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTEwMDU0CisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKGxvYWRfdHJ1ZXR5cGVfZ2x5cGgpOiBEb24ndCB1c2UgdmFyaWFibGUKKwlgb3BlbmVkX2ZyYW1lJyB0byB0cmFjZSB3aGV0aGVyIGEgZnJhbWUgbXVzdCBiZSBjbG9zZWQgYXQgdGhlIGVuZCBvZgorCWZ1bmN0aW9uOiBUaGlzIGZhaWxzIGJlY2F1c2UgYFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzJyAod2hpY2gKKwlnZXRzIGNhbGxlZCBmb3Igc3BhY2UgZ2x5cGhzKSB1c2VzIGEgZnJhbWUgYnkgaXRzZWxmLiAgSW5zdGVhZCwKKwljbG9zZSB0aGUgZnJhbWUgYWZ0ZXIgbG9hZGluZyB0aGUgaGVhZGVyLCB0aGVuIHVzZSBhbm90aGVyIGZyYW1lIGZvcgorCXRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgZ2x5cGggbGF0ZXIgb24uCisKKwlBbHNvIGF2b2lkIGNhbGxpbmcgYHR0X2dldF9tZXRyaWNzJyB0d2ljZSB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuCisKKzIwMTgtMDgtMjYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVZhcmlvdXMgbWlub3IgY2xlYW4tdXBzLgorCisJKiBzcmMvYmFzZS9mdGFwaS5jOiBSZW1vdmUuICBVbnVzZWQuCisJKiBzcmMvYmFzZS9KYW1maWxlIChfc291cmNlcyk6IFVwZGF0ZWQuCisKKwkqIHNyYy9iYXNlL2Z0c3RyZWFtLmMgKEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUpOiBSZW1vdmUgcmVkdW5kYW50CisJY29kZS4KKworMjAxOC0wOC0yNSAgTmlraGlsIFJhbWFrcmlzaG5hbiAgPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPgorCisJQ29udmVydCBkb2N1bWVudGF0aW9uIG1hcmt1cCB0byBNYXJrZG93bi4KKworCUl0IGlzIHRoZSByZXN1bHQgb2YgYSBHU29DIDIwMTggcHJvamVjdDsgdGhpcyBzZXBhcmF0ZSBDaGFuZ2VMb2cKKwljb21taXQgY292ZXJzIHRoZSBsYXN0IGZvdXIgY29tbWl0cworCisJICBhZTVkMWE0Y2VjMzc1NTdmMzFhZWMyNzAzMzJjZmU4ODZhNjJmOWEwCisJICA1M2M2OWNlMDRmYWVkM2RjYzY4Y2EwZjU0Y2I4ZDcwM2Q4YmFiZjY5CisJICAxOTU3MjhkNWJhMzhmMzRmYjJjMmMyMDgwN2MwMTY1NmYyZjU5YjY2CisJICBjOTYyZGIyOGVhNTkyMjVmMDEwNWMwM2Q5MDdkNGE5YjcxNzY1Njg3CisKKwkqIGRvY3MvcmVmZXJlbmNlL21hcmtkb3duL2ltYWdlcy9mYXZpY28uaWNvLAorCWRvY3MvcmVmZXJlbmNlL21hcmtkb3duL2phdmFzY3JpcHRzL2V4dHJhLmpzLAorCWRvY3MvcmVmZXJlbmNlL21hcmtkb3duL3N0eWxlc2hlZXRzL2V4dHJhLmNzczogTmV3IGZpbGVzLgorCisJKiBkb2NzL3JlZmVyZW5jZS8uZ2l0aWdub3JlLCBkb2NzL3JlZmVyZW5jZS9SRUFETUU6IFVwZGF0ZWQuCisKKwkqIHNyYy90b29scy9kb2NtYWtlci8qOiBSZW1vdmVkLiAgSXQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aAorCWBkb2N3cml0ZXInLCBhIHB5dGhvbiBwYWNrYWdlIGF2YWlsYWJsZSBhdAorCisJICBodHRwczovL3B5cGkub3JnL3Byb2plY3QvZG9jd3JpdGVyLworCisJKiBKYW1maWxlOiBVcGRhdGVkLgorCSogYnVpbGRzL2Fuc2kvYW5zaS1kZWYubWssIGJ1aWxkcy9iZW9zL2Jlb3MtZGVmLm1rLAorCWJ1aWxkcy9kb3MvZG9zLWRlZi5taywgYnVpbGRzL29zMi9vczItZGVmLm1rIChCSU4pLAorCWJ1aWxkcy91bml4L3VuaXhkZGVmLm1rLCBidWlsZHMvd2luZG93cy93aW4zMi1kZWYubWs6IE5ldyB2YXJpYWJsZS4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQ2hlY2sgZm9yIGBweXRob24nIGFuZCBgcGlwJy4KKwlJZiBub3QgcHJlc2VudCwgd2FybiB0aGF0IGBtYWtlIHJlZmRvYycgd2lsbCBmYWlsLgorCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKFBZVEhPTiwgUElQLCBCSU4pOiBOZXcgdmFyaWFibGVzLgorCisJKiBidWlsZHMvZnJlZXR5cGUubWsgKFBZVEhPTiwgUElQLCBWRU5WX05BTUUsIFZFTlZfRElSLCBFTlZfUFlUSE9OLAorCUVOVl9QSVApOiBOZXcgdmFyaWFibGVzLgorCShyZWZkb2MpOiBVcGRhdGVkLgorCShyZWZkb2MtdmVudik6IE5ldyB0YXJnZXQuCisJKC5QSE9OWSk6IFVwZGF0ZWQuCisKKzIwMTgtMDgtMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFkZCBtYWNyb3MgZm9yIGhhbmRsaW5nIG92ZXItL3VuZGVyZmxvd2luZyBgRlRfSW50NjQnIHZhbHVlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoQUREX0lOVDY0LCBTVUJfSU5UNjQsCisJTVVMX0lOVDY0LCBESVZfSU5UNjQpIFtGVF9MT05HNjRdOiBOZXcgbWFjcm9zLgorCisJKiBzcmMvYmFzZS9mdGNhbGMuYyAoZnRfY29ybmVyX29yaWVudGF0aW9uKSBbRlRfTE9ORzY0XTogVXNlCisJYFNVQl9JTlQ2NCcgYW5kIGBNVUxfSU5UNjQnLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MTAwMjgKKworMjAxOC0wOC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBJbXByb3ZlIGxlZ2liaWxpdHkgb2YgYGdseWYnIHBhcnNpbmcuCisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKE9OX0NVUlZFX1BPSU5ULCBYX1NIT1JUX1ZFQ1RPUiwKKwlZX1NIT1JUX1ZFQ1RPUiwgUkVQRUFUX0ZMQUcsIFhfUE9TSVRJVkUsIFNBTUVfWCwgWV9QT1NJVElWRSwgU0FNRV9ZLAorCU9WRVJMQVBfU0lNUExFKTogTmV3IG1hY3Jvcy4KKwkoVFRfTG9hZF9TaW1wbGVfR2x5cGgpOiBVc2UgbmV3IG1hY3JvcyB0byBtYWtlIGNvZGUgbW9yZSByZWFkYWJsZS4KKwlSZW1vdmUgdXNlbGVzcyBhZGp1c3RtZW50IG9mIGBvdXRsaW5lLT50YWdzJyBlbGVtZW50cy4KKworMjAxOC0wOC0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC90dGNwYWwuYyAodHRfZmFjZV9sb2FkX2NwYWwpOiBBZGQgbWlzc2luZyBzYWZldHkgY2hlY2suCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05OTgxCisKKzIwMTgtMDgtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtwc2F1eF0gQXZvaWQgc2xvdyBQUyBmb250IHBhcnNpbmcgaW4gY2FzZSBvZiBlcnJvci4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk5NTUKKworCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfdG9fYnl0ZXMpOiBTZXQgYHBhcnNlci0+Y3Vyc29yJyBldmVuCisJaW4gY2FzZSBvZiBlcnJvciB0byBhdm9pZCBwb3RlbnRpYWwgcmUtc2Nhbm5pbmcuCisKKzIwMTgtMDgtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtjZmZdIEZpeCBoZWFwIGJ1ZmZlciBvdmVyZmxvdyBpbiBvbGQgZW5naW5lLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTk2NworCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQorCTxjZmZfb3BfYmxlbmQ+IFtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogYG51bV9kZXNpZ25zJyBtdXN0IGJlCisJbm9uLXplcm8uCisKKzIwMTgtMDgtMTYgIFlvdW5nIFhpYW8gIDx5YW5neDkyQGhvdG1haWwuY29tPgorCisJKiBidWlsZHMvbWFjL2Z0bWFjLmMgKHBhcnNlX2ZvbmQpOiBGaXggYnVmZmVyIG92ZXJydW4uCisKKwlSZXBvcnRlZCBhcyBidWcgIzU0NTE1LCBkdXBsaWNhdGUgb2YgIzQzNTQwLgorCisyMDE4LTA4LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIGJ1aWxkcy8qL2Z0c3lzdGVtLmMgKEZUX0NPTVBPTkVOVCk6IFVwZGF0ZWQgYWxzby4KKworMjAxOC0wOC0xNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2JkZl0gRG9uJ3QgdHJhY2sgZHVwbGljYXRlIGVuY29kaW5ncy4KKworCVRoZXJlIGlzIG5vIGhhcm0gZXhjZXB0IHNvbWUgdW1iaWd1aXR5IGluIGJyb2tlbiBmb250cyB3aXRoIGR1cGxpY2F0ZQorCWVuY29kaW5ncy4KKworCSogc3JjL2JkZi9iZGZsaWIuYyAoX2JkZl9wYXJzZV9nbHlwaHMpOiBSZW1vdmUgZHVwbGljYXRlIHRyYWNraW5nLgorCShfYmRmX3BhcnNlX3QpOiBSZW1vdmUgbGFyZ2UgYGhhdmUnIGJpdGZpZWxkLgorCisyMDE4LTA4LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlEb24ndCB1c2UgYHRyYWNlXycgcHJlZml4IGZvciBGVF9DT01QT05FTlQgYXJndW1lbnRzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaCAoRlRfVFJBQ0VfQ09NUCwKKwlGVF9UUkFDRV9DT01QXyk6IE5ldyBhdXhpbGlhcnkgbWFjcm9zIHRvIGFkZCBgdHJhY2VfJyBwcmVmaXguCisJKEZUX1RSQUNFKTogVXNlIGBGVF9UUkFDRV9DT01QJy4KKworCSovKiAoRlRfQ09NUE9ORU5UKTogVXBkYXRlZC4KKworMjAxOC0wOC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJVXNlIGZvcm1hdHRpbmcgc3RyaW5nIGluIEZUX1RSQUNFWCBjYWxscyBmb3Igbm9uLXNpbXBsZSBhcmd1bWVudHMuCisKKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYyAoY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MpCisJPGNmZl9vcF9oc3RlbSwgY2ZmX29wX2hpbnRtYXNrLCBjZmZfb3BfaGxpbmV0bywgY2ZmX29wX3ZoY3VydmV0bz46CisJRG8gaXQuCisKKwkqIHNyYy9wc2F1eC9wc2hpbnRzLmMgKGNmMl9oaW50bWFwX2J1aWxkKTogRGl0dG8uCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kSFNURU0sCisJY2YyX2NtZFZTVEVNLCBjZjJfY21kSExJTkVUTywgY2YyX2NtZFJSQ1VSVkVUTywgY2YyX2NtZENBTExTVUJSLAorCWNmMl9lc2NIU1RFTTMsIGNmMl9jbWRISU5UTUFTSywgY2YyX2NtZEhWQ1VSVkVUTz46IERpdHRvLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoVFRfUnVuSW5zKTogRGl0dG8uCisKKzIwMTgtMDgtMTQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtiZGZdIFJlbW92ZSB1bnVzZWQgZmllbGRzLgorCisJKiBzcmMvYmRmL2JkZi5oIChiZGZfZm9udF90KTogUmVtb3ZlIGBubW9kJywgYHVtb2QnLCBhbmQgYG1vZGlmaWVkJywKKwl3aGljaCB3ZXJlIHNldCBidXQgbmV2ZXIgdXNlZC4KKwkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2Vfe2dseXBocyxwcm9wZXJ0aWVzfSwgYmRmX2xvYWRfZm9udCk6CisJVXBkYXRlZCBhY2NvcmRpbmdseS4KKworMjAxOC0wOC0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2NmZl0gRml4IGFub3RoZXIgc2VndiBpbiBvbGQgZW5naW5lLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTg3MgorCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQorCVtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogRGlzYWxsb3cgaW52YWxpZCBUMSBvcGNvZGVzIGluCisJZGljdGlvbmFyaWVzLgorCisyMDE4LTA4LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbY2ZmXSBGaXggbWlzc2luZyBlcnJvciBoYW5kbGluZy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk4NjUKKworCSogc3JjL3BzYXV4L2NmZnBhcnNlLmMgKGNmZl9wYXJzZXJfcnVuKQorCVtDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FXTogRG9uJ3QgaWdub3JlIHJldHVybiB2YWx1ZSBvZgorCWBwYXJzZV9jaGFyc3RyaW5nc19vbGQnLgorCisyMDE4LTA4LTE0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmRmXSBSZW1vdmUgdW51c2VkIG92ZXJmbG93IHN0b3JhZ2UuCisKKwkqIHNyYy9iZGYvYmRmLmggKGJkZl9nbHlwaGxpc3RfdCk6IFJlbW92ZSB0aGlzIHR5cGUuCisJKGJkZl9mb250X3QpOiBSZW1vdmUgYG92ZXJmbG93JyBmaWVsZC4KKwkqIHNyYy9iZGYvYmRmbGliLmMgKGJkZl9mcmVlX2ZvbnQpOiBSZW1vdmUgYG92ZXJmbG93JyBmcmVlaW5nLgorCisyMDE4LTA4LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbY2ZmXSBGaXggc2VndiBpbiBvbGQgZW5naW5lLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTg2NAorCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKQorCTxjZmZfb3BfcmFuZG9tPiBbQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORV06IFVzZSB0b3AgZGljdCdzCisJYHJhbmRvbScgZmllbGQgZGlyZWN0bHkgaWYgcGFyc2luZyBkaWN0aW9uYXJpZXMuCisKKzIwMTgtMDgtMTMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtiZGZdIFVzZSB1bnNpZ25lZCB0eXBlcy4KKworCSogc3JjL2JkZi9iZGYuaCAoYmRmX2dseXBoX3QpOiBVbnNpZ24gYGVuY29kaW5nJy4KKwkoYmRmX2ZvbnRfdCk6IFVuc2lnbiBgZGVmYXVsdF9jaGFyJy4KKwkqIHNyYy9iZGYvYmRmZHJpdnIuaCAoQkRGX2VuY29kaW5nX2VsKTogVW5zaWduIGBlbmMnLgorCisJKiBzcmMvYmRmL2JkZmxpYi5jIChfYmRmX2FkZF9wcm9wZXJ0eSwgX2JkZl9wYXJzZV9nbHlwaHMsCisJX2JkZl9wYXJzZV9zdGFydCk6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCisJKiBzcmMvYmRmL2JkZmRyaXZyLmMgKGJkZl9jbWFwX2NoYXJfe2luZGV4LG5leHR9KTogRGl0dG8uCisKKzIwMTgtMDgtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2Vfc2ZudHMpOiBPbmUgbW9yZSBmb3JtYXQgY2hlY2suCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05ODMyCisKKzIwMTgtMDgtMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRjYWxjLmMgKEZUX01hdHJpeF9DaGVjayk6IEZpeCBpbnRlZ2VyIG92ZXJmbG93LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTgxMQorCisyMDE4LTA4LTEwICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9zZm50L3R0c2JpdC5jICh0dF9zYml0X2RlY29kZXJfbG9hZF9jb21wb3VuZCk6IEZvbGxvdyBzcGVjcy4KKworMjAxOC0wOC0xMCAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IEZpeCBtZW1vcnkgbGVhayAoIzU0NDM1KS4KKworMjAxOC0wOC0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogSW1wcm92ZSB0cmFjaW5nLgorCisyMDE4LTA4LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXggY2xhbmcgd2FybmluZ3MuCisKKwkqIHNyYy9iYXNlL2Z0ZGVidWcuYyAoZnRfdHJhY2VfbGV2ZWxfZW5hYmxlZCwKKwlmdF90cmFjZV9sZXZlbF9kaXNhYmxlZCk6IEFkZCBgc3RhdGljJyBrZXl3b3JkLgorCisyMDE4LTA4LTA5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbcmFzdGVyLCBzbW9vdGhdIFJlaW5zdGF0ZSBiaXRtYXAgc2l6ZSBsaW1pdHMuCisKKwlUaGlzIGFnYWluIG1vdmVzIG91dGxpbmUgYW5kIGJpdG1hcCBzaXplIGNoZWNrcyBvbmUgbGV2ZWwgdXAuCisKKwkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9SZW5kZXIpOiBFeHBsaWNpdGx5IHJlamVjdCBlbm9ybW91cworCW91dGxpbmVzLgorCSogc3JjL3Jhc3Rlci9mdHJlbmQxLmMgKGZ0X3Jhc3RlcjFfcmVuZGVyKTogUmVqZWN0IGVub3Jtb3VzIGJpdG1hcHMKKwlhbmQsIHRoZXJlZm9yZSwgb3V0bGluZXMgdGhhdCByZXF1aXJlIHRoZW0uCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IERpdHRvLgorCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGZ0X2JsYWNrX3JlbmRlcik6IFJlbW92ZSBvdXRsaW5lIHNpemUgY2hlY2tzLgorCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfcmFzdGVyX3JlbmRlcik6IERpdHRvLgorCVtTVEFOREFMT05FXTogUmVtb3ZlIGBGVF9PdXRsaW5lX0dldF9DQm94JyBjb3B5LgorCisyMDE4LTA4LTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbcGNmXSBSZXZlcnQgbWFzc2l2ZSB1bnNpZ25pbmcuCisKKzIwMTgtMDgtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzbW9vdGhdIEltcHJvdmUgdHJhY2luZy4KKworCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfY29udmVydF9nbHlwaF9pbm5lcik6IE9ubHkgdXNlIHRyYWNpbmcKKwlpZiBjYWxsZWQgdGhlIGZpcnN0IHRpbWUuCisJKGdyYXlfY29udmVydF9nbHlwaCk6IFVwZGF0ZWQuCisKKzIwMTgtMDgtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFkZCBpbnRlcm5hbCBmdW5jdGlvbnMgYEZUX1RyYWNlX0Rpc2FibGUnIGFuZCBgRlRfVHJhY2VfRW5hYmxlJy4KKworCUl0IHNvbWV0aW1lcyBtYWtlcyBzZW5zZSB0byBzdXBwcmVzcyB0cmFjaW5nIGluZm9ybWF0aW9ucywgZm9yCisJZXhhbXBsZSwgaWYgaXQgb3V0cHV0cyBpZGVudGljYWwgbWVzc2FnZXMgYWdhaW4gYW5kIGFnYWluLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaDogTWFrZSBgZnRfdHJhY2VfbGV2ZWxzJyBhCisJcG9pbnRlci4KKwkoRlRfVHJhY2VfRGlzYWJsZSwgRlRfVHJhY2VfRW5hYmxlKTogTmV3IGRlY2xhcmF0aW9ucy4KKworCSogc3JjL2Jhc2UvZnRkZWJ1Zy5jIChmdF90cmFjZV9sZXZlbHMpOiBSZW5hbWUgdG8uLi4KKwkoZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQpOiAuLi4gdGhpcy4KKwkoZnRfdHJhY2VfbGV2ZWxzX2Rpc2FibGVkKTogTmV3IGFycmF5LgorCShmdF90cmFjZV9sZXZlbHMpOiBOZXcgcG9pbnRlci4KKwkoRlRfVHJhY2VfRGlzYWJsZSwgRlRfVHJhY2VfRW5hYmxlKTogSW1wbGVtZW50LgorCShmdF9kZWJ1Z19pbml0KTogVXBkYXRlZC4KKworMjAxOC0wOC0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRGVidWdnaW5nIGltcHJvdmVtZW50cy4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKHBpeGVsX21vZGVzKTogTW92ZSB0aGlzIGFycmF5IHRvIHRvcCBsZXZlbAorCWZyb20gLi4uCisJKEZUX0xvYWRfR2x5cGgpOiAuLi4gaGVyZS4KKwkoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogVXNlIGB3aWR0aCcgeCBgaGVpZ2h0JyBpbiB0cmFjZSBtZXNzYWdlLgorCVVzZSBgcGl4ZWxfbW9kZXMnLgorCisyMDE4LTA4LTA4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbcGNmXSBNYXNzaXZlIHVuc2lnbmluZyAocGFydCAyKS4KKworCVRyZWF0IGFsbCBzaXplIHJlbGF0ZWQgcHJvcGVydGllcyBhcyB1bnNpZ25lZCB2YWx1ZXMuCisKKwkqIHNyYy9wY2YvcGNmLmggKFBDRl9QYXJzZVByb3BlcnR5UmVjKTogVXNlIHVuc2lnbmVkIGBuYW1lJyBhbmQKKwlgdmFsdWUnLgorCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfcHJvcGVydGllcywgcGNmX2xvYWRfZm9udCk6IFVwZGF0ZWQKKwlwYXJzaW5nIGNvZGUgYW5kIGhhbmRsaW5nIG9mIEFWRVJBR0VfV0lEVEgsIFBPSU5UX1NJWkUsIFBJWEVMX1NJWkUsCisJUkVTT0xVVElPTl9YIGFuZCBSRVNPTFVUSU9OX1kuCisKKzIwMTgtMDgtMDggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtwY2ZdIE1hc3NpdmUgdW5zaWduaW5nIChwYXJ0IDEpLgorCisJVW5vZmZpY2lhbCBzcGVjaWZpY2F0aW9ucyBoZXNpdGF0ZSB0byB1c2UgdW5zaWduZWQgMzItYml0IGludGVnZXJzLgorCU5lZ2F0aXZlIHZhbHVlcyBjYXVzZWQgYSBsb3Qgb2YgdHJvdWJsZSBpbiB0aGUgcGFzdCBhbmQgaXQgaXMgc2FmZXIKKwlhbmQgZWFzaWVyIHRvIHRyZWF0IHNvbWUgcHJvcGVydGllcyBhcyB1bnNpZ25lZC4KKworCSogc3JjL3BjZi9wY2YuaCAoUENGX0FjY2VsUmVjKTogVXNlIHVuc2lnbmVkIHZhbHVlcyBmb3IgYGZvbnRBc2NlbnQnLAorCWBmb250RGVzY2VudCcsIGFuZCBgbWF4T3ZlcmxhcCcuCisJKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2xvYWRfZm9udCwgcGNmX2dldF9hY2NlbCk6IFVwZGF0ZWQuCisJKiBzcmMvcGNmL3BjZmRyaXZyLmMgKFBDRl9HbHlwaF9Mb2FkLCBQQ0ZfU2l6ZV9TZWxlY3QsCisJUENGX1NpemVfUmVxdWVzdCk6IFVwZGF0ZWQuCisKKzIwMTgtMDgtMDcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfYml0bWFwcyk6IFVuc2lnbiBgb2Zmc2V0cycgYW5kCisJYGJpdG1hcFNpemVzJy4KKworMjAxOC0wOC0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBkZXZlbC9mdG9wdGlvbi5oOiBTeW5jaHJvbml6ZSB3aXRoIG1haW4gYGZ0b3B0aW9uLmgnLgorCisyMDE4LTA4LTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbcGNmXSBVc2UgdW5zaWduZWQgdHlwZXMuCisKKwkqIHNyYy9wY2YvcGNmLmggKFBDRl9FbmNvZGluZyk6IFVzZSB1bnNpZ25lZCBgZW5jJy4KKwkqIHNyYy9wY2YvcGNmZHJpdnIuYyAocGNmX2NtYXBfY2hhcl97aW5kZXgsbmV4dH0pOiBEaXR0by4KKwkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfZ2V0X2VuY29kaW5ncyk6IFVzZSB1bnNpZ25lZCB0eXBlcy4KKworMjAxOC0wOC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChjb21wdXRlX2dseXBoX21ldHJpY3MpOiBGaXggb3ZlcmZsb3cuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD03NzcxNTEKKworMjAxOC0wOC0wNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAob3Bjb2RlX25hbWUpOiBGaXggdHlwb3MuCisKKzIwMTgtMDgtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBjbGFuZyB3YXJuaW5ncy4KKworCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0VtYm9sZGVuWFkpOiBGaXggdHlwZSBvZgorCWBvcmllbnRhdGlvbicuCisKKwkqIHNyYy9neHZhbGlkL2d4dmNvbW1uLmMgKGd4X2xvb2t1cF92YWx1ZV9yZWFkKTogRml4IHNpZ25hdHVyZS4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfZW5jb2RpbmdzKTogRml4IHR5cGUgb2Ygc29tZSB2YXJpYWJsZXMuCisJQWRkIGNhc3QuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2Vfd2VpZ2h0X3ZlY3Rvcik6IEZpeCBjYXN0LgorCisyMDE4LTA3LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9jaWQvY2lkdG9rZW4uaDogSGFuZGxlIGBYVUlEJyBrZXl3b3JkLgorCisyMDE4LTA3LTMxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbY2lkXSBUcmFjZSBQb3N0U2NyaXB0IGRpY3Rpb25hcmllcy4KKworCSogc3JjL2NpZC9jaWRsb2FkLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSC4KKwkoY2lkX2xvYWRfa2V5d29yZCwgY2lkX3BhcnNlX2ZvbnRfbWF0cml4LCBwYXJzZV9mZF9hcnJheSwKKwlwYXJzZV9leHBhbnNpb25fZmFjdG9yLCBjaWRfcGFyc2VfZGljdCk6IEFkZCB0cmFjaW5nIGNhbGxzLgorCShwYXJzZV9mb250X25hbWUpOiBOZXcgZnVuY3Rpb24gdG8gdHJhY2UgYC9Gb250TmFtZScga2V5d29yZHMgaW4KKwkvRkRBcnJheSBkaWN0LgorCShjaWRfZmllbGRfcmVjb3Jkcyk6IFJlZ2lzdGVyIGBwYXJzZV9mb250X25hbWUnLgorCisyMDE4LTA3LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbY2ZmXSBGaXggdHlwby4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk0MDkKKworCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4KTogRml4IGJvdW5kYXJ5CisJY2hlY2suCisKKzIwMTgtMDctMjkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfZW5jb2RpbmdzKTogQW5vdGhlciB0aGlua28uCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NjA4CisKKzIwMTgtMDctMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIEZpeCBIYXJtb255IG1lbW9yeSBtYW5hZ2VtZW50LgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9OTUwMQorCisJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogUmVzdG9yZSBidWZmZXIKKwlhZnRlciBlYWNoIHJlbmRlcmluZyBpbiBjYXNlIG9mIGZhaWx1cmUuCisKKzIwMTgtMDctMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0eXBlMV0gQXZvaWQgc2VnZmF1bHRzIHdpdGggYEZUX0dldF9QU19Gb250X1ZhbHVlJy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk2MTAKKworCSogc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3BzX2dldF9mb250X3ZhbHVlKTogUHJvdGVjdCBhZ2FpbnN0IE5VTEwuCisKKzIwMTgtMDctMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gTWFrZSBgVFRfU2V0X01NX0JsZW5kJyBpZGVtcG90ZW50ICgjNTQzODgpLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9zZXRfbW1fYmxlbmQpOiBDb3JyZWN0bHkgc2V0CisJYGZhY2UtPmRvYmxlbmQnIGlmIHRoZSBjdXJyZW50IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHlpZWxkcyB0aGUgc2FtZQorCWJsZW5kIGNvb3JkaW5hdGVzIGFzIHRoZSBwcmV2aW91cyBjYWxsLgorCisyMDE4LTA3LTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbcHNhdXgsIHR5cGUxXTogTW9yZSB0cmFjaW5nIGltcHJvdmVtZW50cy4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IFRyYWNlIHNraXBwZWQKKwlvdXRsaW5lIGNvbW1hbmRzLgorCisJKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nKTogRml4CisJbWlzc2luZyBjYXNlLgorCSh0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3MpOiBNYWtlIHRyYWNpbmcgb3V0cHV0IG1vcmUgY29tcGFjdC4KKworCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSk6IEJlIGxlc3MgdmVyYm9zZS4KKwkoVDFfR2V0X0FkdmFuY2VzKTogQWRkIHRyYWNpbmcuCisKKzIwMTgtMDctMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtwc2F1eCwgdHlwZTFdIFRyYWNlIFBvc3RTY3JpcHQgZGljdGlvbmFyaWVzIGFuZCBvdGhlciB0aGluZ3MuCisKKwlUaGUgdHJhY2luZyBvZiAvRW5jb2RpbmcsIC9TdWJycywgYW5kIC9DaGFyc3RyaW5ncyBpcyBydWRpbWVudGFyeQorCXJpZ2h0IG5vdy4KKworCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19wYXJzZXJfbG9hZF9maWVsZCwKKwlwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSk6IEFkZCB0cmFjaW5nIGNhbGxzLgorCisJKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IE1ha2UgdHJhY2luZworCW91dHB1dCBtb3JlIGNvbXBhY3QuCisKKwkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX0NvbXB1dGVfTWF4X0FkdmFuY2UsIFQxX0dldF9BZHZhbmNlcyk6IEFkZAorCXRyYWNpbmcgbWVzc2FnZXMuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfYmxlbmRfYXhpc190eXBlcywKKwlwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zLCBwYXJzZV9ibGVuZF9kZXNpZ25fbWFwLAorCXBhcnNlX3dlaWdodF92ZWN0b3IsIHQxX2xvYWRfa2V5d29yZCwgdDFfcGFyc2VfZm9udF9tYXRyaXgsCisJcGFyc2VfZW5jb2RpbmcsIHBhcnNlX3N1YnJzLCBwYXJzZV9jaGFyc3RyaW5ncywgVDFfT3Blbl9GYWNlKTogQWRkCisJdHJhY2luZyBjYWxscy4KKworCSogc3JjL3R5cGUxL3Qxb2Jqcy5jIChUMV9GYWNlX0luaXQpOiBBZGQgdHJhY2luZyBjYWxsLgorCisJKiBzcmMvc2ZudC9zZm9ianMuYyAoc2ZudF9pbml0X2ZhY2UpOiBNYWtlIHRyYWNpbmcgbWVzc2FnZSBtb3JlCisJdmVyYm9zZS4KKworMjAxOC0wNy0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IG1pbm9yIEFTQU4gcnVuLXRpbWUgd2FybmluZ3MuCisKKwkqIHNyYy9iYXNlL2Z0dXRpbC5jIChmdF9tZW1fYWxsb2MsIGZ0X21lbV9yZWFsbG9jKTogT25seSBjYWxsCisJYEZUX01FTV9aRVJPJyBpZiB3ZSBhY3R1YWxseSBoYXZlIGEgYnVmZmVyLgorCShmdF9tZW1fZHVwKTogT25seSBjYWxsIGBmdF9tZW1jcHknIGlmIHdlIGFjdHVhbGx5IGhhdmUgYSBidWZmZXIuCisKKzIwMTgtMDctMjQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtidWlsZF0gRm9ydGlmeSBkbGxleHBvcnQvZGxsaW1wb3J0IGF0dHJpYnV0ZXMgKCM1Mzk2OSwjNTQzMzApLgorCisJV2Ugbm8gbG9uZ2VyIHVzZSBwcmVkZWZpbmVkIF9ETEwsIHdoaWNoIGNhbiBiZSBkZWZpbmVkIGZvciBzdGF0aWMKKwlidWlsZHMgdG9vIHdpdGggL01ELiBXZSB1c2UgRExMX0VYUE9SVCBhbmQgRExMX0lNUE9SVCBpbnN0ZWFkLAorCWZvbGxvd2luZyBsaWJ0b29sIGNvbnZlbnRpb24uCisKKwkqIENNYWtlTGlzdHMudHh0IFtXSU4zMl0sIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qOgorCURlZmluZSBETExfRVhQT1JUIG1hbnVhbGx5LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oLCBidWlsZHMvdW5peC9mdGNvbmZpZy5pbiwKKwlidWlsZHMvdm1zL2Z0Y29uZmlnLmgsIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAorCXNyYy9iYXNlL2Z0dmVyLnJjOiAvX0RMTC9kLCBzL0ZUMl9ETExJTVBPUlQvRExMX0lNUE9SVC8uCisKKzIwMTgtMDctMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0eXBlMV0gQ2hlY2sgcmVsYXRpb25zaGlwIGJldHdlZW4gbnVtYmVyIG9mIGF4ZXMgYW5kIGRlc2lnbnMuCisKKwlGb3IgTXVsdGlwbGUgTWFzdGVycyBmb250cyB3ZSBkb24ndCBzdXBwb3J0IGludGVybWVkaWF0ZSBkZXNpZ25zOworCXRoaXMgaW1wbGllcyB0aGF0CisKKwkgIG51bWJlcl9vZl9kZXNpZ25zID09IDIgXl4gbnVtYmVyX29mX2F4ZXMKKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk1NTcKKworCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9PcGVuX0ZhY2UpOiBFbnN1cmUgYWJvdmUgY29uc3RyYWludC4KKwkoVDFfR2V0X01NX1Zhcik6IFJlbW92ZSBub3cgcmVkdW5kYW50IHRlc3QuCisKKzIwMTgtMDctMjQgIEhpbi1UYWsgTGV1bmcgIDxodGwxMEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisKKwlbdHJ1ZXR5cGVdIE1hdGNoIHR0ZGVidWcncyBuYW1pbmcgb2YgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYzogVGhlIGZvcm0gdXNlZCBpbiB0dGRlYnVnLAorCSJNRFJQW0csQixXLD9dIiwgZXRjLiwgaXMgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZSB0aGFuCisJIk1EUlBbMDAsMDEsMDIsMDNdIi4KKworMjAxOC0wNy0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9lbmNvZGluZ3MpOiBUaGlua28uCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NTYxCisKKzIwMTgtMDctMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfZW5jb2RpbmdzKTogQ2hlY2sgaW5kZXggb2YgZGVmYXVsdENoYXIuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NTI3CisKKzIwMTgtMDctMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9sb2FkX2ZvbnQpOiBGaXggbnVtYmVyIG9mIGdseXBocy4KKworCVRoaXMgaXMgYW4gb3ZlcnNpZ2h0IG9mIHRoZSBtb2R1bGUgY2hhbmdlIDIwMTgtMDctMjEuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NTI0CisKKzIwMTgtMDctMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtjaWRdIFNhbml0aXplIGBCbHVlU2hpZnQnIGFuZCBgQmx1ZUZ1enonLgorCisJVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIHR5cGUxIG1vZHVsZS4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTk1MTAKKworCSogc3JjL2NpZC9jaWRsb2FkLmMgKHBhcnNlX2ZkX2FycmF5KTogU2V0IHNvbWUgcHJpdmF0ZSBkaWN0IGRlZmF1bHQKKwl2YWx1ZXMuCisJKGNpZF9mYWNlX29wZW4pOiBEbyB0aGUgc2FuaXRpemluZy4KKwlGaXggc29tZSB0cmFjaW5nIG1lc3NhZ2VzLgorCisyMDE4LTA3LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbcGNmXSBGaXggaGFuZGxpbmcgb2YgdGhlIHVuZGVmaW5lZCBnbHlwaC4KKworCVRoaXMgY2hhbmdlIG1ha2VzIHRoZSBkcml2ZXIgdXNlIHRoZSBgZGVmYXVsdENoYXInIHByb3BlcnR5IG9mIFBDRgorCWZpbGVzLgorCisJKiBzcmMvcGNmL3BjZi5oIChQQ0ZfRmFjZVJlYyk6IENoYW5nZSB0eXBlIG9mIGBkZWZhdWx0Q2hhcicgdG8KKwl1bnNpZ25lZC4KKworCSogc3JjL3BjZi9wY2ZyZWFkLmMgKHBjZl9nZXRfZW5jb2RpbmdzKTogUmVhZCBgZGVmYXVsdENoYXInIGFzCisJdW5zaWduZWQuCisJVmFsaWRhdGUgYGRlZmF1bHRDaGFyJy4KKwlJZiBgZGVmYXVsdENoYXInIGRvZXNuJ3QgcG9pbnQgdG8gZ2x5cGggaW5kZXggemVybywgc3dhcCBnbHlwaHMgd2l0aAorCWluZGV4IHplcm8gYW5kIGluZGV4IGBkZWZhdWx0Q2hhcicgYW5kIGFkanVzdCB0aGUgZW5jb2RpbmdzCisJYWNjb3JkaW5nbHkuCisKKwkqIHNyYy9wY2YvcGNmZHJpdnIuYyAocGNmX2NtYXBfY2hhcl9pbmRleCwgcGNmX2NtYXBfY2hhcl9uZXh0LAorCVBDRl9HbHlwaF9Mb2FkKTogVW5kbyBjaGFuZ2UgZnJvbSAyMDAyLTA2LTE2IHdoaWNoIGFsd2F5cyBlbmZvcmNlZAorCXRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGZvbnQgdG8gYmUgdGhlIGRlZmF1bHQgY2hhcmFjdGVyLgorCisyMDE4LTA3LTIwICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJTW92ZSB0aGUgbGVnYWN5IGZ1enogdGFyZ2V0IHRvIHRoZSBgZnJlZXR5cGUtdGVzdGluZycgcmVwb3NpdG9yeS4KKworCUl0IGNhbiBub3cgYmUgZm91bmQgYXQKKworCSAgaHR0cHM6Ly9naXRodWIuY29tL2ZyZWV0eXBlL2ZyZWV0eXBlMi10ZXN0aW5nL3RyZWUvbWFzdGVyL2Z1enppbmcvc3JjL2xlZ2FjeQorCisJKiBzcmMvdG9vbHMvZnRmdXp6ZXI6IFJlbW92ZSB0aGlzIGZvbGRlciBhbmQgaXRzIGNvbnRlbnRzIGZyb20gdGhlCisJcmVwb3NpdG9yeS4KKworMjAxOC0wNy0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2NmZl0gQXZvaWQgbGVmdC1zaGlmdCBvZiBuZWdhdGl2ZSBudW1iZXJzICgjNTQzMjIpLgorCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBVc2UgbXVsdGlwbGljYXRpb24uCisKKzIwMTgtMDctMTcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFsbG93IEZUX0VOQ09ESU5HX05PTkUgZm9yIGBGVF9TZWxlY3RfQ2hhcm1hcCcuCisKKwlUaGlzIGlzIGEgdmFsaWQgZW5jb2RpbmcgdGFnIGZvciBCREYsIFBDRiwgYW5kIFdpbmRvd3MgRk5ULCBhbmQKKwl0aGVyZSBpcyBubyByZWFzb24gdG8gZGlzYWxsb3cgaXQgZm9yIHRoZXNlIGZvcm1hdHMuCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZWxlY3RfQ2hhcm1hcCk6IEltcGxlbWVudCBpdC4KKworMjAxOC0wNy0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvcGNmL3BjZnJlYWQuYyAocGNmX2dldF9lbmNvZGluZ3MpOiBUcmFjZSBgZGVmYXVsdENoYXInLgorCisyMDE4LTA3LTE2ICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oOiBBZGQgbWFjcm9zIGZvciBoYW5kbGluZworCWhhcm1sZXNzIG92ZXItL3VuZGVyZmxvd2luZyBgRlRfSW50JyB2YWx1ZXMuCisKKwkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKGZpeGVkMmZsb2F0KTogRml4IG5lZ2F0aW9uIG9mCisJYChpbnQpKC0yMTQ3NDgzNjQ4KScuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NDIzCisKKzIwMTgtMDctMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfc2V0X21tX2JsZW5kKTogRml4IG9mZi1ieS1vbmUgZXJyb3IuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05NDEyCisKKzIwMTgtMDctMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRvdXRsbi5jIChGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbik6IEluaXQgYGNib3gnLgorCisJVGFrZW4gZnJvbSBwYXRjaCAjOTY2Nywgd3JpdHRlbiBieSBTdGV2ZSBMYW5nYXNlaworCTx2b3Jsb25AZGViaWFuLm9yZz4uCisKKwlUaGlzIGZpeGVzIGEgYnVpbGQgZmFpbHVyZSAobW9zdCBwcm9iYWJseSBhIGJ1ZyBpbiBnY2MpIG9uIHBwYzY0ZWwKKwl3aGVuIGJ1aWxkaW5nIHdpdGggLU8zLgorCisyMDE4LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXggdHlwbyAoIzU0MjM4KS4KKworCSogc3JjL2Jhc2UvZnRjb2xvci5jIChGVF9QYWxldHRlX1NldF9Gb3JlZ3JvdW5kX0NvbG9yKQorCVshVFRfQ09ORklHX09QVElPTl9DT0xPUl9MQVlFUlNdOiBBZGQgcmV0dXJuIHZhbHVlLgorCisyMDE4LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBZGp1c3QgdGFibGUgc2l6ZSBjb21wYXJpc29ucyAoIzU0MjQyKS4KKworCSogc3JjL3NmbnQvdHRjcGFsLmMgKHR0X2ZhY2VfbG9hZF9jcGFsKTogSW1wbGVtZW50IGl0LgorCisyMDE4LTA3LTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXggbW9yZSAzMmJpdCBpc3N1ZXMgKCM1NDIwOCkuCisKKwkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfYmxlbmRfYnVpbGRfdmVjdG9yKTogQ29udmVydCBhc3NlcnRpb24gaW50bworCXJ1bi10aW1lIGVycm9yLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfdG9fbm9ybWFsaXplZCk6IFByb3RlY3QgYWdhaW5zdAorCW51bWVyaWMgb3ZlcmZsb3cuCisKKzIwMTgtMDctMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCAzMmJpdCBidWlsZCB3YXJuaW5ncyAoIzU0MjM5KS4KKworCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoRlRfQml0bWFwX0JsZW5kKTogQWRkIGNhc3RzIHRvIGF2b2lkIHNpZ25lZAorCXZzLiB1bnNpZ25lZCBjb21wYXJpc29ucy4KKworCSogc3JiL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIpOiBEaXR0by4KKworMjAxOC0wNy0wMiAgSmVmZiBDYXJleSAgPEplZmYuQ2FyZXlAbW9ub3R5cGUuY29tPgorCisJKiBzcmMvcHNuYW1lcy9wc21vZHVsZS5jIChwc191bmljb2Rlc19pbml0KTogRml4IGFsbG9jIGRlYnVnZ2luZy4KKworMjAxOC0wNy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJcy9wYWxldHRlX3R5cGVzL3BhbGV0dGVfZmxhZ3MvLgorCisJU3VnZ2VzdGVkIGJ5IEJlaGRhZC4KKworMjAxOC0wNy0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJTWFrZSBgRlRfR2V0X0NvbG9yX0dseXBoX0xheWVyJyByZXR1cm4gRlRfQm9vbC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oLCBzcmMvYmFzZS9mdG9ianMuYworCShGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIsIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCk6IFVwZGF0ZWQuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChUVF9HZXRfQ29scl9MYXllcl9GdW5jKSwKKwlzcmMvc2ZudC90dGNvbHIuaCwgc3JjL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIpOgorCVVwZGF0ZWQuCisKKzIwMTgtMDctMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcik6IEd1YXJkIFNGTlQgZnVuY3Rpb24uCisKKwlSZXBvcnRlZCBieSBCZWhkYWQuCisKKzIwMTgtMDYtMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL2Jhc2UvZnR0cmlnb24uYyAoRlRfVGFuKTogSW1wcm92ZSBhY2N1cmFjeS4KKwkoRlRfVmVjdG9yX1JvdGF0ZSk6IFNpbXBsaWZ5LgorCisyMDE4LTA2LTI4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9TZXRfQ2hhcm1hcCk6IFJvYnVzdGlmeS4KKworMjAxOC0wNi0yNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBGaXggbWVtb3J5IGxlYWsuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogQWRkIGluaXRpYWxpemVycy4KKwlGaXggdHlwbyBpbiBgZ290bycgZGVzdGluYXRpb24uCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05MDcxCisKKzIwMTgtMDYtMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfZmFjZV92YXJ5X2N2dCk6IEFkZCBpbml0aWFsaXplcnMuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD05MDcwCisKKzIwMTgtMDYtMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gSW5jcmVhc2UgcHJlY2lzaW9uIHdoaWxlIGFwcGx5aW5nIFZGIGRlbHRhcy4KKworCUl0IHR1cm5lZCBvdXQgdGhhdCB3ZSBpbmNvcnJlY3RseSByb3VuZCBDVlQgYW5kIGdseXBoIHBvaW50IGRlbHRhcworCWJlZm9yZSBhY2N1bXVsYXRpb24sIGxlYWRpbmcgdG8gc2V2ZXJlIHBvc2l0aW9uaW5nIGVycm9ycyBpZiB0aGVyZQorCWFyZSBtYW55IGRlbHRhIHZhbHVlcyB0byBzdW0gdXAuCisKKwlQcm9ibGVtIHJlcG9ydGVkIGJ5IEFraWVtIEhlbG1saW5nIDxha2llbUB1bmRlcndhcmUubmw+IGFuZCBhbmFseXplZAorCWJ5IEJlaGRhZC4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoZnRfdmFyX3JlYWRwYWNrZWRkZWx0YSk6IFJldHVybiBkZWx0YXMgaW4KKwkxNi4xNiBmb3JtYXQuCisJKHR0X2ZhY2VfdmFyX2N2dCk6IENvbGxlY3QgZGVsdGFzIGluIGBjdnRfZGVsdGFzJywgd2hpY2ggaXMgYSAxNi4xNgorCWZvcm1hdCBhcnJheSwgYW5kIGFkZCB0aGUgYWNjdW11bGF0ZWQgdmFsdWVzIHRvIHRoZSBDVlQgYXQgdGhlIGVuZAorCW9mIHRoZSBmdW5jdGlvbi4KKwkoVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMpOiBTdG9yZSBkYXRhIGluIGBwb2ludHNfb3JnJyBhbmQKKwlgcG9pbnRzX291dCcgaW4gMTYuMTYgZm9ybWF0LgorCUNvbGxlY3QgZGVsdGFzIGluIGBwb2ludF9kZWx0YXNfeCcgYW5kIGBwb2ludF9kZWx0YXNfeScsIHdoaWNoIGFyZQorCTE2LjE2IGZvcm1hdCBhcnJheXMsIGFuZCBhZGQgdGhlIGFjY3VtdWxhdGVkIHZhbHVlcyB0byB0aGUgZ2x5cGgKKwljb29yZGluYXRlcyBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4KKworMjAxOC0wNi0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJTmV3IGJhc2UgZnVuY3Rpb24gYEZUX01hdHJpeF9DaGVjaycgKCM1NDAxOSkuCisKKwkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChGVF9NYXRyaXhfQ2hlY2spOiBOZXcgYmFzZSBmdW5jdGlvbiB0byBwcm9wZXJseQorCXJlamVjdCBkZWdlbmVyYXRlIGZvbnQgbWF0cmljZXMuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg6IFVwZGF0ZWQuCisKKwkqIHNyYy9jZmYvY2ZmcGFyc2UuYyAoY2ZmX3BhcnNlX2ZvbnRfbWF0cml4KSwgc3JjL2NpZC9jaWRsb2FkLmMKKwkoY2lkX3BhcnNlX2ZvbnRfbWF0cml4KSwgc3JjL3R5cGUxL3QxbG9hZC5jICh0MV9wYXJzZV9mb250X21hdHJpeCksCisJc3JjL3R5cGU0Mi90NDJwYXJzZS5jICh0NDJfcGFyc2VfZm9udF9tYXRyaXgpOiBVc2UKKwlgRlRfTWF0cml4X0NoZWNrJy4KKworMjAxOC0wNi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IHR5cG8uCisKKwlSZXBvcnRlZCBieSBCZWhkYWQuCisKKwkqIHNyYy9iYXNlL2Z0Y29sb3IuYyAoRlRfUGFsZXR0ZV9EYXRhX0dldCkKKwlbIVRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTXTogcy9hcGFsZXR0ZS9hcGFsZXR0ZV9kYXRhLy4KKworMjAxOC0wNi0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJcy9GVF9QQUxFVFRFX1VTQUJMRV9XSVRIXy9GVF9QQUxFVFRFX0ZPUl8vLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y29sb3IuaCwgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmgsCisJc3JjL3NmbnQvdHRjb2xyLmM6IERvIGl0LgorCisyMDE4LTA2LTE5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbc2ZudF0gRml4IENQQUwgaGVhcCBidWZmZXIgb3ZlcmZsb3cuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD04OTY4CisKKwkqIHNyYy9zZm50L3R0Y3BhbC5jICh0dF9mYWNlX2xvYWRfY3BhbCk6IEd1YXJkIENQQUwgdmVyc2lvbiAxCisJb2Zmc2V0cy4KKworMjAxOC0wNi0xOSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRG9oLiAgRG9uJ3QgdXNlIENQQUwgb3IgQ09MUiBkYXRhIGlmIHRhYmxlcyBhcmUgbWlzc2luZy4KKworCVJlcG9ydGVkIGJ5IEFsZXhlaS4KKworCSogc3JjL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIpOiBSZXR1cm4gaW1tZWRpYXRlbHkgaWYKKwlgY29scicgaXMgTlVMTC4KKworCSogc3JjL3NmbnQvdHRjcGFsLmMgKHR0X2ZhY2VfcGFsZXR0ZV9zZXQpOiBSZXR1cm4gaW1tZWRpYXRlbHksIGlmCisJYGNwYWwnIGlzIE5VTEwuCisKKzIwMTgtMDYtMTcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtiYXNlXSBJbnRyb2R1Y2UgYEZUX05ld19HbHlwaCcuCisKKwlUaGlzIGZ1bmN0aW9uIGZhY2lsaXRhdGVzIGFjY2VzcyB0byBmdWxsIGNhcGFiaWxpdGllcyBvZiBGcmVlVHlwZQorCXJlbmRlcmluZyBlbmdpbmUgZm9yIGN1c3RvbSBnbHlwaHMuIFRoaXMgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IKKwljb25zaXN0ZW50IHJlbmRlcmluZyBvZiBtYXRoZW1hdGljYWwgYW5kIGNoZW1pY2FsIGZvcm11bGFzLCBlLmcuCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTc1NzA3OAorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCwgc3JjL2Jhc2UvZnRnbHlwaC5jIChGVF9OZXdfR2x5cGgpOiBOZXcKKwlmdW5jdGlvbi4KKworMjAxOC0wNi0xNyAgQXJtaW4gSGFzaXR6a2EgIDxwcmluY2UuY2hlcnVza2VyQGdtYWlsLmNvbT4KKworCVtiZGZdIEZpeCB1bmRlcmZsb3cgb2YgYW4gdW5zaWduZWQgdmFsdWUuCisKKwliZGZsaWIuYzoxNTYyIGNvdWxkIGJlIHJlYWNoZWQgd2l0aCBgZm9udC0+Z2x5cGhzX3VzZWQgPT0gMCcuICBUaGF0CisJY2F1c2VkIGFuIHVuZGVyZmxvdyBvZiB0aGUgdW5zaWduZWQgdmFsdWUgd2hpY2ggcmVzdWx0cyBpbiB1bmRlZmluZWQKKwliZWhhdmlvdXIuCisKKwkqIHNyYy9iZGYvYmRmbGliLmMgKF9iZGZfcGFyc2VfZ2x5cGhzKTogQmFpbCBvdXQgZWFybGllciB0aGFuIGJlZm9yZQorCWlmIHRoZSBgRU5DT0RJTkcnIGtleXdvcmQgY2Fubm90IGJlIGZvdW5kLgorCisyMDE4LTA2LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbYmFzZV0gQWRkIHRyYWNpbmcgZm9yIGBGVF9CaXRtYXBfQmxlbmQnLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCAodHJhY2VfYml0bWFwKTogTmV3CisJZW51bWVyYXRpb24uCisKKwkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0NPTVBPTkVOVCk6IERlZmluZS4KKwkoRlRfQml0bWFwX0JsZW5kKTogQWRkIGBGVF9UUkFDRTUnIGNhbGxzLgorCisyMDE4LTA2LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlzL3RyYWNlX2JpdG1hcC90cmFjZV9jaGVja3N1bS8uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBzL2JpdG1hcC9jaGVja3N1bS8uCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9DT01QT05FTlQpOiBzL3RyYWNlX2JpdG1hcC90cmFjZV9jaGVja3N1bS8uCisJQWRqdXN0IGNvZGUuCisKKzIwMTgtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBGaXggY29sb3IgZ2x5cGggbGF5ZXIgbG9hZGluZy4KKworCSogc3JjL3NmbnQvdHRjb2xyLmMgKENvbHIpOiBBZGQgYHRhYmxlX3NpemUnIGZpZWxkLgorCSh0dF9mYWNlX2xvYWRfY29scik6IFNldCBpdC4KKwkodHRfZmFjZV9nZXRfY29scl9sYXllcik6IENoZWNrIHBvaW50ZXIgbGltaXQgZm9yIGxheWVyIGVudHJpZXMuCisKKzIwMTgtMDYtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBGaXggY29sb3IgcGFsZXR0ZSBsb2FkaW5nLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9ODkzMworCisJKiBzcmMvc2ZudC90dGNwYWwuYyAoQ3BhbCk6IEFkZCBgdGFibGVfc2l6ZScgZmllbGQuCisJKHR0X2ZhY2VfbG9hZF9jcGFsKTogU2V0IGl0LgorCSh0dF9mYWNlX3BhbGV0dGVfc2V0KTogQ2hlY2sgcG9pbnRlciBsaW1pdCBmb3IgY29sb3IgZW50cmllcy4KKworMjAxOC0wNi0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChGVF9CaXRtYXBfQmxlbmQpOiBBdm9pZCBpbnRlZ2VyIG92ZXJmbG93LgorCisyMDE4LTA2LTE2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBZGQgYEZUX0JpdG1hcF9CbGVuZCcgQVBJLgorCisJU3RpbGwgbWlzc2luZzogU3VwcG9ydCBmb3IgbmVnYXRpdmUgYml0bWFwIHBpdGNoIGFuZCBzdWJwaXhlbCBvZmZzZXQKKwlvZiBzb3VyY2UgYml0bWFwLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Yml0bWFwLmgsIHNyYy9iYXNlL2Z0Yml0bWFwLmMKKwkoRlRfQml0bWFwX0JsZW5kKTogTmV3IGZ1bmN0aW9uLgorCisyMDE4LTA2LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlSZXBsYWNlIGBGVF9HZXRfR2x5cGhMYXllcnMnIHdpdGggYEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcicuCisKKwlUaGlzIGF2b2lkcyBhbnkgYWRkaXRpb25hbCBhbGxvY2F0aW9uIG9mIENPTFIgcmVsYXRlZCBzdHJ1Y3R1cmVzIGluCisJYSBnbHlwaCBzbG90LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dseXBoX0xheWVyLCBGVF9HbHlwaF9MYXllclJlYywKKwlGVF9HZXRfR2x5cGhMYXllcnMpOiBSZW1vdmVkLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9Db2xyX0ludGVybmFsUmVjKTogUmVtb3ZlZC4KKwkoRlRfU2xvdF9JbnRlcm5hbFJlYyk6IFJlbW92ZSBgY29sb3JfbGF5ZXJzJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFRUX0xvYWRfQ29scl9MYXllcl9GdW5jKToKKwlSZW1vdmVkLgorCShTRk5UX0ludGVyZmFjZSwgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKTogUmVtb3ZlCisJYGxvYWRfY29scl9sYXllcicuCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaF9zbG90X2RvbmUpOiBVcGRhdGVkLgorCShGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwpOiBVc2UgYEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcicuCisJKEZUX0dldF9HbHlwaExheWVycyk6IFJlbW92ZWQuCisKKwkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfaW50ZXJmYWNlKTogVXBkYXRlZC4KKworCSogc3JjL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfbG9hZF9jb2xyX2xheWVycyk6IFJlbW92ZWQuCisJKiBzcmMvc2ZudC90dGNvbHIuaDogVXBkYXRlZC4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCisKKzIwMTgtMDYtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVByb3ZpZGUgaXRlcmF0aXZlIEFQSSB0byBhY2Nlc3MgYENPTFInIGRhdGEuCisKKwlUaGlzIHNvbHV0aW9uIGRvZXNuJ3Qgc3RvcmUgYW55IGRhdGEgaW4gYW4gYEZUX0dseXBoU2xvdCcgb2JqZWN0LgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0xheWVySXRlcmF0b3IpOiBOZXcgc3RydWN0dXJlLgorCShGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIpOiBOZXcgZnVuY3Rpb24uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChUVF9HZXRfQ29scl9MYXllcl9GdW5jKTogTmV3CisJZnVuY3Rpb24gdHlwZS4KKwkoU0ZOVF9JbnRlcmZhY2UsIEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSk6IEFkZCBpdC4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcik6IEltcGxlbWVudCBpdC4KKworCSogc3JjL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIpOiBOZXcgZnVuY3Rpb24uCisJKiBzcmMvc2ZudC90dGNvbHIuaDogVXBkYXRlZC4KKworCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9pbnRlcmZhY2UpOiBVcGRhdGVkLgorCisyMDE4LTA2LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBZGQgZ2x5cGggaW5kZXggYW5kIGdseXBoIGxvYWQgZmxhZ3MgdG8gZ2x5cGggc2xvdC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIChGVF9HbHlwaFNsb3RSZWMpOiBSZW5hbWUgdW51c2VkCisJYHJlc2VydmVkJyBmaWVsZCB0byBgZ2x5cGhfaW5kZXgnLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9TbG90X0ludGVybmFsUmVjKTogQWRkCisJYGxvYWRfZmxhZ3MnIGZpZWxkLgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFNldCBuZXcgZmllbGRzLgorCisyMDE4LTA2LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbc2ZudF0gTW92ZSBgQ1BBTCcgc3R1ZmYgaW50byBzZXBhcmF0ZSBmaWxlcy4KKworCSogc3JjL3NmbnQvc2Zkcml2ZXIuYzogSW5jbHVkZSBgdHRjcGFsLmgnLgorCSogc3JjL3NmbnQvc2ZudC5jOiBJbmNsdWRlIGB0dGNwYWwuYycuCisKKwkqIHNyYy9zZm50L3R0Y29sci5jLCBzcmMvc2ZudC90dGNvbHIuaDogTW92ZSBDUEFMIHN0dWZmIHRvIC4uLgorCSogc3JjL3NmbnQvdHRjcGFsLmMsIHNyYy9zZm50L3R0Y3BhbC5jOiAuLi4gdGhlc2UgbmV3IGZpbGVzLgorCisJKiBzcmMvc2ZudC9KYW1maWxlIChfc291cmNlcyksIHNyYy9zZm50L3J1bGVzLm1rIChTRk5UX0RSVl9TUkMpOgorCVVwZGF0ZWQuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgc3VwcG9ydCBmb3IgYGNvbHInIGFuZAorCWBjcGFsJy4KKwlTb3J0IGVudHJpZXMuCisKKzIwMTgtMDYtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBTZXBhcmF0ZSBgQ1BBTCcgYW5kIGBDT0xSJyB0YWJsZSBoYW5kbGluZy4KKworCUxhdGVyIG9uIHdlIHdhbnQgdG8gc3VwcG9ydCB0aGUgYFNWRycgdGFibGUgYWxzbywgd2hpY2ggbmVlZHMgYENQQUwnCisJKGJ1dCBub3QgYENPTFInKS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFNGTlRfSW50ZXJmYWNlKTogQWRkIGBsb2FkX2NwYWwnCisJYW5kIGBmcmVlX2NwYWwnIGZpZWxkcy4KKwkoRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKTogVXBkYXRlZC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBSZXBsYWNlCisJYGNvbHJfYW5kX2NwYWwnIGZpZWxkcyB3aXRoIGBjcGFsJyBhbmQgYGNvbHInLgorCisJKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2ludGVyZmFjZSk6IFVwZGF0ZWQuCisKKwkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2xvYWRfZmFjZSwgc2ZudF9kb25lX2ZhY2UpOiBVcGRhdGVkLgorCisJKiBzcmMvc2ZudC90dGNvbHIuYyAoQ29sciwgQ3BhbCk6IEFkZCBgdGFibGUnIGZpZWxkLgorCShDb2xyQ3BhbCk6IFJlbW92ZWQuCisJKHR0X2ZhY2VfbG9hZF9jb2xyKTogU3BsaXQgb2ZmIENQQUwgaGFuZGxpbmcgaW50by4uLgorCSh0dF9mYWNlX2xvYWRfY3BhbCk6IC4uLiB0aGlzIG5ldyBmdW5jdGlvbi4KKwkodHRfZmFjZV9mcmVlX2NvbHIpOiBTcGxpdCBvZmYgQ1BBTCBoYW5kbGluZyBpbnRvLi4uCisJKHR0X2ZhY2VfZnJlZV9jcGFsKTogLi4uIHRoaXMgbmV3IGZ1bmN0aW9uLgorCSh0dF9mYWNlX2xvYWRfY29scl9sYXllcnMsIHR0X2ZhY2VfcGFsZXR0ZV9zZXQpOiBVcGRhdGVkLgorCisJKiBzcmMvc2ZudC90dGNvbHIuaDogVXBkYXRlZC4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IFVwZGF0ZWQuCisKKzIwMTgtMDYtMTIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBGaXggYHNpemVvZicgdGhpbmtvLgorCisJKiBzcmMvc2ZudC90dGNvbHIuYyAodHRfZmFjZV9sb2FkX2NvbHIsIHR0X2ZhY2VfcGFsZXR0ZV9zZXQpOiBEb24ndAorCXVzZSBgc2l6ZW9mJyBmb3IgY29tcHV0aW5nIGFycmF5IGxpbWl0LgorCisyMDE4LTA2LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaW5pc2ggQ1BBTC9DT0xSIHN1cHBvcnQgKDQvNCkuCisKKwkqIHNyYy9zZm50L3R0Y29sci5jICh0dF9mYWNlX2ZpbmRfY29sb3IpOiBSZW1vdmVkLgorCSh0dF9mYWNlX2NvbHJfYmxlbmRfbGF5ZXIpOiBVc2UgYGZhY2UtPnBhbGV0dGUnIGluc3RlYWQgb2YgY2FsbGluZworCWB0dF9mYWNlX2ZpbmRfY29sb3InLgorCVVzZSBhbmQgc2V0IHRleHQgZm9yZWdyb3VuZCBjb2xvci4KKworMjAxOC0wNi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRmluaXNoIENQQUwvQ09MUiBzdXBwb3J0ICgzLzQpLgorCisJKiBzcmMvYmFzZS9mdGNvbG9yLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ILgorCShGVF9QYWxldHRlX1NlbGVjdCwgRlRfUGFsZXR0ZV9TZXRfRm9yZWdyb3VuZF9Db2xvcik6IEltcGxlbWVudAogCWZ1bmN0aW9ucy4KIAotCSogc3JjL3BzYXV4L3BzZGVjb2RlLmMsIHNyYy9wc2F1eC9wc2RlY29kZS5oOiBOZXcgZmlsZXMgdG8gaG9sZAotCWBQU19EZWNvZGVyJyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisyMDE4LTA2LTEyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9wc2F1eC9wc2F1eC5jLCBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLAotCXNyYy9wc2F1eC9ydWxlcy5tayAoUFNBVVhfRFJWX1NSQyk6IFVwZGF0ZWQuCisJRmluaXNoIENQQUwvQ09MUiBzdXBwb3J0ICgyLzQpLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBzcmMvc2ZudC90dGNvbHIuYyAodHRfZmFjZV9wYWxldHRlX3NldCk6IE5ldyBmdW5jdGlvbi4KKwkodHRfZmFjZV9sb2FkX2NvbHIpOiBBbGxvY2F0ZSBgZmFjZS0+cGFsZXR0ZScgYW5kIGNhbGwKKwlgdHRfZmFjZV9wYWxldHRlX3NldCcuCisJQWRqdXN0IHJldHVybiBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZXJyb3IuCiAKLQlbcHNhdXhdIFJlbmFtZSBmaWxlcy4KKwkqIHNyYy9zZm50L3R0Y29sci5oOiBVcGRhdGVkLgogCi0JUmVwbGFjZSB0aGUgYGNmMicgZmlsZSBuYW1lIHByZWZpeCB3aXRoIGBwcycgYXMgdGhlIEFkb2JlIGVuZ2luZQotCXdpbGwgYmUgdXNlZCBmb3IgYm90aCBQb3N0U2NyaXB0IFR5cGVzIDEgYW5kIDIgKENGRikgaW5zdGVhZCBvZiBqdXN0Ci0JQ0ZGLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFRUX1NldF9QYWxldHRlX0Z1bmMpOiBOZXcKKwlmdW5jdGlvbiB0eXBlLgorCShTRk5UX0ludGVyZmFjZSwgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKTogQWRkIGl0LgogCi0Jcy9jZjIvcHMvIGZvciBhbGwgZm9sbG93aW5nLgorCSogc3JjL3NmbnQvc2Zkcml2ZXIuYyAoc2ZudF9pbnRlcmZhY2UpLCBzcmMvc2ZudC9zZm9ianMuYworCShzZm50X2RvbmVfZmFjZSk6IFVwZGF0ZWQuCiAKLQkqIHNyYy9wc2F1eC9jZjIqOiBSZW5hbWUgZmlsZXMuCi0JKiBzcmMvcHNhdXgvKjogVXBkYXRlIGluY2x1ZGVzLgorMjAxOC0wNi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLCBzcmMvcHNhdXgvcnVsZXMubWsgKFBTQVVYX0RSQ19TUkMsCi0JUFNBVVhfRFJWX0gpOiBVcGRhdGUgZmlsZSByZWZlcmVuY2VzLgorCUZpbmlzaCBDUEFML0NPTFIgc3VwcG9ydCAoMS80KS4KIAotMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBOZXcgZmllbGRzCisJYHBhbGV0dGVfaW5kZXgnLCBgcGFsZXR0ZScsIGBoYXZlX2ZvcmVncm91bmRfY29sb3InIGFuZAorCWBmb3JlZ3JvdW5kX2NvbG9yJy4KIAotCVtwc2F1eF0gTWlub3IgZml4LgorMjAxOC0wNi0xMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JVXNlIGBNdWx0aU1hc3RlcnMnIHNlcnZpY2UgaW4gYHBzYXV4JyBpbnN0ZWFkIG9mIGEgY2FsbCB0byBgY2ZmJy4KLQlUaGUgcHJvamVjdCBidWlsZHMgaWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSBpcyBub3QgZGVmaW5lZC4KKwlbc2ZudF0gTWlub3IuCiAKLQkqIHNyYy9wc2F1eC9jZjJmdC5jOiBVcGRhdGUgaW5jbHVkZXMuCi0JKGNmMl9nZXROb3JtYWxpemVkVmVjdG9yKTogVXNlIGBtbS0+Z2V0X3Zhcl9ibGVuZCcgaW5zdGVhZCBvZgotCWBjZmZfZ2V0X3Zhcl9ibGVuZCcuCisJKiBzcmMvc2ZudC90dGNvbHIuYyAodHRfZmFjZV9sb2FkX2NvbHJfbGF5ZXJzKToKKwlzL3BhbGV0dGVfaW5kZXgvcGFsZXR0ZV9lbnRyeV9pbmRleC8gZm9yIGNvbnNpc3RlbmN5LgorCUFkanVzdCByZXR1cm4gZXJyb3IgY29kZSBpbiBjYXNlIG9mIGVycm9yLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisyMDE4LTA2LTExICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQlbcHNhdXgsIGNmZl0gTW92ZSBgY2ZmX3JhbmRvbScgaW50byBgcHNhdXgnIHNlcnZpY2UuCisJW3Jhc3Rlcl0gQ2xlYW4gdXAuCiAKLQlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChibGFja19UV29ya2VyLCBTQ0FMRUQsIFNldF9IaWdoX1ByZWNpc2lvbik6CisJQ2xlYW4gdXAgYWZ0ZXIgNS1sZXZlbCBncmF5IHJlbW92YWwgKDhkYzg2MzU4NzQpLgorCShWZXJ0aWNhbF9Td2VlcF9TcGFuKTogQmUgYnJpZWYuCiAKLQlNaW5vciBmaXggdG8gYWxsb3cgYm90aCBgY2ZmJyBhbmQgYHBzYXV4JyB0byB1c2UgYGNmZl9yYW5kb20nLgorMjAxOC0wNi0xMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvY2ZmL2NmZmxvYWQuYyAoY2ZmX3JhbmRvbSk6IE1vdmUgdG8uLi4KLQkqIHNyYy9wc2F1eC9wc29ianMuYzogSGVyZS4KLQkqIHNyYy9jZmYvY2ZmbG9hZC5oOiBNb3ZlIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb24gdG8KLQlgc3JjL3BzYXV4L3Bzb2Jqcy5oJy4KKwlbc2ZudF0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgogCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFBTQXV4X1NlcnZpY2VSZWMpOiBSZWdpc3RlciB0aGUKLQlmdW5jdGlvbiBoZXJlLi4uCi0JKiBzcmMvcHNhdXgvcHNhdXhtb2QuYzogQW5kIGhlcmUuCisJKiBzcmMvc2ZudC90dGNvbHIuYyAodHRfZmFjZV9sb2FkX2NvbHIsIHR0X2ZhY2VfbG9hZF9jb2xyX2xheWVycywKKwl0dF9mYWNlX2NvbHJfYmxlbmRfbGF5ZXIpOiBBZGQgYE5VTEwnIGluaXRpYWxpemVycy4KIAotCSogc3JjL2NmZi9jZmZsb2FkLmMsIHNyYy9wc2F1eC9jZjJpbnRycC5jOiBVcGRhdGUgY29kZS4KKzIwMTgtMDYtMTAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCXMvRlRfUGFsZXR0ZS9GVF9QYWxldHRlX0RhdGEvLCBzL3BhbGV0dGUvcGFsZXR0ZV9kYXRhLy4KIAotCVtjZmZdIE1vdmUgc3RydWN0IGRlY2xhcmF0aW9ucyB0byBgZnJlZXR5cGUvaW50ZXJuYWwnLgorCSogaW5jbHVkZS9mcmVldHlwZS9mdGNvbG9yLmgsIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oLAorCXNyYy9iYXNlL2Z0Y29sb3IuYywgc3JjL3NmbnQvc2ZvYmpzLmMsIHNyYy9zZm50L3R0Y29sci5jOiBVcGRhdGVkLgogCi0JTk9URTogRG9lcyBub3QgY29tcGlsZSEKKzIwMTgtMDYtMTAgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KIAotCVRoaXMgaXMgc28gdGhhdCB0aGUgQ0ZGIGZ1bmN0aW9ucyBtb3ZlZCB0byBgcHNhdXgnIGNhbiBhY2Nlc3MgdGhlCi0Jc2FtZSBzdHJ1Y3RzIHRoYXQgdGhleSBuZWVkLgorCUNNYWtlTGlzdHM6IGFsc28gYWNjZXB0IElPU19QTEFURk9STT1TSU1VTEFUT1I2NAogCi0JKiBzcmMvY2ZmL2NmZnR5cGVzLmg6IE1vdmVkIHRvLi4uCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmg6IC4uLkhlcmUuCisJVGhpcyBtaWdodCBiZSBuZWVkZWQgdG8gYnVpbGQgRnJlZVR5cGUgZm9yIHRoZSBpT1Mgc2ltdWxhdG9yLiBTZWUKKwlodHRwczovL3NhdmFubmFoLm5vbmdudS5vcmcvYnVncy9pbmRleC5waHA/NTQwNDguIFBhdGNoIGNvbnRyaWJ1dGVkCisJYnkgU3RldmUgUm9iaW5zb24uCiAKLQkqIHNyYy9jZmYvY2Zmb2Jqcy5oOiBNb3ZlZCB0aGUgc3RydWN0IGRlY2xhcmF0aW9ucyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaDogLi4uIHRoaXMgbmV3IGZpbGUuCisJKiBDTWFrZUxpc3RzLnR4dDogQWNjZXB0IElPU19QTEFURk9STT1TSU1VTEFUT1I2NAogCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggKEZUX0lOVEVSTkFMX0NGRl9UWVBFU19ILAotCUZUX0lOVEVSTkFMX0NGRl9PQkpFQ1RfVFlQRVNfSCk6IE5ldyBtYWNyb3MuCisyMDE4LTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9jZmYvY2ZmY21hcC5oLCBzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuYywKLQlzcmMvY2ZmL2NmZmdsb2FkLmgsIHNyYy9jZmYvY2ZmbG9hZC5oLCBzcmMvY2ZmL2NmZm9ianMuYywKLQlzcmMvY2ZmL2NmZm9ianMuaCwgc3JjL2NmZi9jZmZwYXJzZS5oLCBzcmMvcHNhdXgvcHNvYmpzLmgsCi0JaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oLAotCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oOiBVcGRhdGUgaW5jbHVkZXMuCisJSW1wbGVtZW50IGBGVF9QYWxldHRlX0dldCcuCiAKLQkqIHNyYy9jZmYvcnVsZXMubWsgKENGRl9EUlZfSCk6IFVwZGF0ZWQuCisJKiBzcmMvYmFzZS9mdGNvbG9yLmM6IE5ldyBmaWxlLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBzcmMvYmFzZS9KYW1lZmlsZSAoX3NvdXJjZXMpLCBzcmMvYmFzZS9ydWxlcy5tayAoQkFTRV9TUkMpLAorCXNyYy9iYXNlL2Z0YmFzZS5jOiBBZGQgYGZ0Y29sb3IuYycuCiAKLQlbcHNhdXgsIGNmZl0gQWRkIG5ldyBzZXJ2aWNlIGZvciBpbnRlci1tb2R1bGUgY2FsbHMuCisyMDE4LTA2LTEwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCSogc3JjL3NmbnQvdHRjb2xyLmMgKHR0X2ZhY2VfbG9hZF9jb2xyKTogSW1wcm92ZSBvdmVyZmxvdyBjaGVja3MuCiAKLQlUaGlzIGlzIHRvIGFsbG93IENGRiBmdW5jdGlvbnMgbW92ZWQgdG8gYHBzYXV4JyB0byBjYWxsIGZ1bmN0aW9ucwotCWRlY2xhcmVkIGluIGBzcmMvY2ZmL2NmZmxvYWQuaCcuCisyMDE4LTA2LTA5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oOiBOZXcgZmlsZSwgc2V0dGluZyB1cAotCWEgYENGRkxvYWQnIHNlcnZpY2UuCisJW3Jhc3Rlcl0gRGVhbCB3aXRoIHBpdGNoIHNpZ24gZWFybGllci4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCAoRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMTAsCi0JRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDKTogTmV3IG1hY3Jvcy4KLQkoRlRfU0VSVklDRV9DRkZfVEFCTEVfTE9BRF9IKTogTmV3IG1hY3JvLgorCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIChibGFja19UV29ya2VyKTogUmVtb3ZlIHVudXNlZCBgdHJhY2VHJywKKwlzL2JUYXJnZXQvYk9yaWdpbi8uCisJKFJlbmRlcl9HbHlwaCk6IFNldCBgcmFzLmJPcmlnaW4nIGF0IHRoZSBib3R0b20tbGVmdCBjb3JuZXIuCisJKFZlcnRpY2FsX1N3ZWVwX0luaXQsIHtWZXJ0aWNhbCxIb3Jpem9udGFsfV9Td2VlcF97U3BhbixEcm9wfSk6CisJVXBkYXRlZCBhY2NvcmRpbmdseS4KIAotCSogc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2ZmL2NmZnBpYy5oOiBSZWdpc3RlciB0aGUgbmV3IHNlcnZpY2UuCisyMDE4LTA2LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9jZmYvY2ZmdHlwZXMuaCAoQ0ZGX0ZvbnRSZWMpLCBzcmMvcHNhdXgvY2YyZm9udC5oCi0JKENGMl9Gb250UmVjKTogQWRkIHNlcnZpY2UgaW50ZXJmYWNlLgorCVtzZm50XSBSZWFkIGBDUEFMJyB2ZXJzaW9uIDEgdGFibGVzLgogCi0JKiBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL3BzYXV4L2NmMmZvbnQuYywgc3JjL3BzYXV4L2NmMmZ0LmMsCi0Jc3JjL3BzYXV4L2NmMmludHJwLmMsIHNyYy9wc2F1eC9jZmZkZWNvZGUuYzogVXNlIHRoZSBuZXcgc2VydmljZS4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwudHR0eXBlcy5oOiBJbmNsdWRlIEZUX0NPTE9SX0guCisJKFRUX0ZhY2VSZWMpOiBBZGQgYHBhbGV0dGUnIGZpZWxkLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJKiBzcmMvc2ZudC90dGNvbHIuYzogSW5jbHVkZSBGVF9DT0xPUl9ILgorCShDcGFsKTogUmVtb3ZlIGFsbCBkYXRhIGNvdmVyZWQgYnkgdGhlIG5ldyBgcGFsZXR0ZScgZmllbGQgaW4KKwlgVFRfRmFjZVJlYycuCisJKHR0X2ZhY2VfbG9hZF9jb2xyKTogVXBkYXRlZC4KKwlSZWFkIGBDUEFMJyB2ZXJzaW9uIDEgZGF0YS4KKwkodHRfZmFjZV9sb2FkX2NvbHJfbGF5ZXJzLCB0dF9mYWNlX2ZpbmRfY29sb3IpOiBVcGRhdGVkLgogCi0JW3BzYXV4LCBjZmZdIEFkZCBjYWxsYmFja3MgZm9yIGludGVyLW1vZHVsZSBjYWxscy4KKwkqIHNyYy9zZm50L3Nmb2Jqcy5jIChzZm50X2RvbmVfZmFjZSk6IEZyZWUgZ2x5cGggY29sb3IgcGFsZXR0ZSBkYXRhLgogCi0JTk9URTogRG9lcyBub3QgY29tcGlsZSEKKzIwMTgtMDYtMDcgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBBZGQgZnVuY3Rpb24gcG9pbnRlcgotCWRlY2xhcmF0aW9ucy4KKwlbYmFzZV0gQVBJIGZvciBIYXJtb255IExDRCByZW5kZXJpbmcuCiAKLQkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYyAoY2ZmX2RlY29kZXJfaW5pdCk6IFVwZGF0ZSB0byB0YWtlIGluCi0JY2FsbGJhY2tzLgotCSogc3JjL3BzYXV4L2NmZmRlY29kZS5oOiBEaXR0by4KKwlUaGlzIGludHJvZHVjZXMgYEZUX0xpYnJhcnlfU2V0TGNkR2VvbWV0cnknIGZvciBzZXR0aW5nIHVwIGFyYml0cmFyeQorCUxDRCBzdWJwaXhlbCBnZW9tZXRyeSBpbmNsdWRpbmcgbm9uLXN0cmlwZWQgcGF0dGVybnMuCiAKLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2NvbXB1dGVfbWF4X2FkdmFuY2UsIGNmZl9zbG90X2xvYWQpOgotCVVwZGF0ZSBjYWxscyB0byBwYXNzIGluIGNhbGxiYWNrcy4KLQkqIHNyYy9wc2F1eC9jZjJmdC5jLCBzcmMvcHNhdXgvY2ZmZGVjb2RlLmM6IFVzZSB0aGVtLgorCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoRlRfTGlicmFyeV9TZXRMY2RHZW9tZXRyeSk6IE5ldyBmdW5jdGlvbi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaDogRG9jdW1lbnQgaXQuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmg6IE1pbm9yLgorCSogaW5jbHVkZS9mcmVldHlwZS9mdGNoYXB0ZXJzLmg6IE1pbm9yLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisyMDE4LTA2LTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlbcHNhdXgsIGNmZl0gQ3JlYXRlIG5ldyBgUFNBdXgnIHNlcnZpY2UgaW50ZXJmYWNlIGVudHJpZXMuCisJZnRjb2xvci5oOiBSZWRlc2lnbiBBUEkuCiAKLQlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCVdoaWxlIGdvaW5nIHRvIGltcGxlbWVudCBpdCBJIG5vdGljZWQgdGhhdCBJIG5lZWQgYWNjZXNzIHRvIG1vc3Qgb2YKKwl0aGUgYENQQUwnIGVsZW1lbnRzOyBJIHRodXMgcGxhbiB0byBhZGQgYSBgY3BhbCcgZmllbGQgdG8KKwlgVFRfRmFjZVJlYycsIHdoaWNoIG1ha2VzIG1vc3Qgb2YgdGhlIHByZXZpb3VzbHkgc3VnZ2VzdGVkIEFQSQorCWZ1bmN0aW9ucyBvYnNvbGV0ZSBiZWNhdXNlIHRoZSBmaWVsZHMgd2lsbCBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlLgogCi0JKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg6IEluY2x1ZGUKLQlGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ILgotCShDRkZfQnVpbGRlcl9GdW5jc1JlYywgQ0ZGX0RlY29jZXJfRnVuY3NSZWMpOiBOZXcgZnVuY3Rpb24gdGFibGVzLgotCShDRkZfQnVpbGRlcik6IFVwZGF0ZWQuCi0JRml4IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShQU0F1eF9TZXJ2aWNlUmVjKTogTmV3IGZpZWxkIGBjZmZfZGVjb2Rlcl9mdW5jcycuCisyMDE4LTA2LTA2ICBQYXJ0aCBXYXp1cmthciAgPHBhcnRod2F6dXJrYXJAZ21haWwuY29tPgogCi0JKiBzcmMvcHNhdXgvcHNhdXhtb2QuYyAoY2ZmX2J1aWxkZXJfZnVuY3MsIGNmZl9kZWNvZGVyX2Z1bmNzKTogTmV3Ci0JZnVuY3Rpb24gdGFibGVzLgotCShQU0F1eF9JbnRlcmZhY2UpOiBVcGRhdGVkLgorCVtiZGYsIHBjZl0gUmVtb3ZlIGRlcHJlY2F0ZWQgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIGZsYWcuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogQWRkIGBwc2F1eCcKLQlzZXJ2aWNlIGludGVyZmFjZS4KKwkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFJlbW92ZSBkZXByZWNhdGVkCisJRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIGZsYWcuCisKKwkqIHNyYy9wY2YvcGNmcmVhZC5jIChwY2ZfbG9hZF9mb250KTogUmVtb3ZlIGRlcHJlY2F0ZWQKKwlGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFMgZmxhZy4KKworMjAxOC0wNi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3Ntb290aCwgcmFzdGVyXSBMaW1pdCBiaXRtYXAgc2l6ZSAoIzU0MDE5KS4KKworCSogc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIFtTVEFOREFMT05FXSAoRlRfT3V0bGluZV9HZXRfQ0JveCk6IEFkZAorCWZ1bmN0aW9uLgorCVshU1RBTkRBTE9ORV06IEluY2x1ZGUgRlRfT1VUTElORV9ILgorCShmdF9ibGFja19yZW5kZXIpOiBDb21wdXRlIENCb3ggYW5kIHJlamVjdCBnbHlwaHMgbGFyZ2VyIHRoYW4KKwkweEZGRkYgeCAweEZGRkYuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X3Jhc3Rlcl9yZW5kZXIpOiBSZWplY3QgZ2x5cGhzIGxhcmdlcgorCXRoYW4gMHhGRkZGIHggMHhGRkZGLgorCisyMDE4LTA2LTAzICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9jb252ZXJ0X2dseXBoKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCisKKzIwMTgtMDYtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3Rvb2xzL2dsbmFtZXMucHkgKG1haW4pOiBFbWl0IGhlYWRlciBpbiBgbGlnaHQnIGNvbW1lbnQgc3R5bGUuCisKKzIwMTgtMDYtMDIgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIEF0dGVtcHQgdG8gbWl0aWdhdGUgYnVnICM1NDAxOS4KKworCVRoZSByb2J1c3QgcmVuZGVyaW5nIG9mIGVzdHJhIGxhcmdlIGdseXBocyBjYW1lIHdpdGggdW5iZWFyYWJsZSBjb3N0LgorCVRoZSBvbGQgd2F5IG9mIGJpc2VjdGluZyBzaG91bGQgZmFpbCBidXQgZmFpbCBmYXN0ZXIuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2NvbnZlcnRfZ2x5cGgpOiBTd2l0Y2ggYmFjayB0byBiaXNlY3RpbmcKKwlpbiB5LWRpcmVjdGlvbi4KKworMjAxOC0wNi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01JUlApOiBVc2UgU1VCX0xPTkc7IGF2b2lkIEZUX0FCUy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTg3MDYKKworMjAxOC0wNi0wMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYXV0b2ZpdC9hZndhcnAuaDogVXNlIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUiAoIzU0MDMzKS4KKworMjAxOC0wNS0zMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMgKGJsYWNrX1RXb3JrZXJfKTogUmVtb3ZlIGBnVGFyZ2V0JyBmaWVsZC4KKworCVRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuCisKKzIwMTgtMDUtMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBHZXQgY29sb3JzIGZyb20gYENQQUwnIHRhYmxlIGluIHJpZ2h0IG9yZGVyICgjNTQwMTUpLgorCisJKiBzcmMvc2ZudC90dGNvbHIuYyAodHRfZmFjZV9maW5kX2NvbG9yKTogRml4IGl0LgorCisyMDE4LTA1LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlmdGNvbG9yLmg6IEltcHJvdmUgQVBJIGRlc2lnbiwgZml4IHR5cG9zICgjNTQwMTEsICM1NDAxNCkuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjb2xvci5oIChGVF9QYWxldHRlX0dldF9OYW1lcyk6IFJlcGxhY2Ugd2l0aC4uLgorCShGVF9QYWxldHRlX0dldF9OYW1lX0lEcyk6IC4uLiB0aGlzIGZ1bmN0aW9uLgorCShGVF9QYWxldHRlX0dldF9FbnRyeV9OYW1lcyk6IFJlcGxhY2Ugd2l0aC4uLgorCShGVF9QYWxldHRlX0dldF9FbnRyeV9OYW1lX0lEcyk6IC4uLiB0aGlzIGZ1bmN0aW9uCisJcy9GVF9QYWxldHRlX1NldF9Gb3JlZ3JvdW5kX0NPbG9yL0ZUX1BhbGV0dGVfU2V0X0ZvcmVncm91bmRfQ29sb3IvLgorCisyMDE4LTA1LTMwICBBcm1pbiBIYXNpdHprYSAgPHByaW5jZS5jaGVydXNrZXJAZ21haWwuY29tPgorCisJQmVhdXRpZnkgYTNjZmVkNWU4NzIzMmM5MzNiZGM2NGY0M2U4ZWJlYmNmZDE4YjQxYi4KKworCSogc3JjL2F1dG9maXQvYWZsb2FkZXIuYyAoYWZfbG9hZGVyX2xvYWRfZ2x5cGgpOiBNb3ZlIHRoZQorCWluaXRpYWxpc2F0aW9uYW5kIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbnRvIHRoZSBpZi1ibG9jay4KKworMjAxOC0wNS0zMCAgQXJtaW4gSGFzaXR6a2EgIDxwcmluY2UuY2hlcnVza2VyQGdtYWlsLmNvbT4KKworCUZpeCBwb2ludGVyIHVuZGVyZmxvdy4KKworCVRoZSBkZWNsYXJhdGlvbiBvZiBgZWRnZTInIGNhbiBiZSByZWFjaGVkIHdpdGggYGVkZ2UxID09IE5VTEwnIGFuZAorCWBheGlzLT5lZGdlcyA9PSAwJyB3aGljaCByZXN1bHRzIGluIHVuZGVmaW5lZCBiZWhhdmlvdXIuCisKKwkqIHNyYy9hdXRvZml0L2FmbG9hZGVyLmMgKGFmX2xvYWRlcl9sb2FkX2dseXBoKTogSW5pdGlhbGlzZSBgZWRnZTInCisJYWZ0ZXIgY2hlY2tpbmcgYGF4aXMtPm51bV9lZGdlcyA+IDEnLiAgYGVkZ2UxICE9IE5VTEwnIGNhbiBiZSBhc3N1bWVkLgorCisyMDE4LTA1LTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlWYXJpb3VzIG1pbm9yIGNvbG9yIGZpeGVzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9DT0xPUl9IKTogTmV3IG1hY3JvLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9Db2xyX0ludGVybmFsKTogQ2hhbmdlCisJdHlwZSBvZiBgbG9hZF9mbGFncycgdG8gYEZUX0ludDMyJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggKFRUX0xvYWRfQ29scl9MYXllcl9GdW5jKTogQ2hhbmdlCisJdHlwZSBvZiBgaWR4JyB0byBgRlRfVUludCcuCisJKFRUX0JsZW5kX0NvbHJfRnVuYyk6IENoYW5nZSB0eXBlIG9mIGBjb2xvcl9pbmRleCcgdG8gYEZUX1VJbnQnLgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogQ2hhbmdlIHR5cGUgb2YKKwlgbG9hZF9mbGFncycgdG8gYEZUX0ludDMyJy4KKworCSogc3JjL3NmbnQvdHRjb2xyLmMgKGZpbmRfYmFzZV9nbHlwaF9yZWNvcmQsCisJdHRfZmFjZV9sb2FkX2NvbHJfbGF5ZXJzKTogQ2hhbmdlIHR5cGUgb2YgYGdseXBoX2lkJyB0byBgRlRfVUludCcuCisJKHR0X2ZhY2VfZmluZF9jb2xvciwgdHRfZmFjZV9jb2xyX2JsZW5kX2xheWVyKTogQ2hhbmdlIHR5cGUgb2YKKwlgY29sb3JfaW5kZXgnIHRvIGBGVF9VSW50Jy4KKwlGaXggc2lnbmVkbmVzcyBhbmQgdHlwZSBpc3N1ZXMuCisKKwkqIHNyYy9zZm50L3R0Y29sci5oOiBVcGRhdGVkLgorCisyMDE4LTA1LTI1ICBOaWtoaWwgUmFtYWtyaXNobmFuICA8cmFtYWtyaXNobmFuLm5pa2hpbEBnbWFpbC5jb20+CisKKwlbZG9jbWFrZXJdIEZpeCBtaXNzaW5nIGBEZWZpbmVkIGluICguLi4pJyB1bmRlciBXaW5kb3dzL0N5Z3dpbi4KKworCVRoaXMgcGxhdGZvcm0gdXNlcyBiYWNrc2xhc2hlcyBmb3IgcGF0aHMsIHdoaWNoIGRvY21ha2VyIGRpZG4ndAorCXVuZGVyc3RhbmQgY29ycmVjdGx5LgorCisJKiBzcmMvdG9vbHMvZG9jbWFrZXIvdG9odG1sLnB5IChIdG1sRm9ybWF0dGVyOjpibG9ja0VudGVyKTogVXNlCisJYG9zLnBhdGgubm9ybXBhdGgnIHRvIG5vcm1hbGl6ZSB0aGUgcGF0aCBmb3IgdGhlIHBsYXRmb3JtIGJlaW5nCisJdXNlZC4KKworMjAxOC0wNS0yNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Ntb290aF0gRm9ybWFsaXplIEhhcm1vbnkgTENEIHJlbmRlcmluZy4KKworCVRoaXMgZ2VuZXJhbGl6ZXMgbWFnaWMgb3V0bGluZSBzaGlmdHMgdGhhdCBtYWtlIEhhcm1vbnkgTENECisJcmVuZGVyaW5nIHdvcmsgaW4gdGVybXMgb2YgcHJlY2lzZSB0d28tZGltZW5zaW9uYWwgUkdCIHN1YnBpeGVsCisJcG9zaXRpb25zLiBUaGVzZSBjb29yZGluYXRlcyBhcmUgbm93IHNldCBpbiB0aW1lIG9mIHRoZSBgc21vb3RoJworCW1vZHVsZSBpbml0aWFsaXphdGlvbiBhbmQgbGF0ZXIgdXNlZCB0byBzaGlmdCBhIGdseXBoIG91dGxpbmUgZm9yCisJcmVuZGVyaW5nLiBGVF9SRU5ERVJfTU9ERV9MQ0QgYW5kIEZUX1JFTkRFUl9NT0RFX0xDRF9WIHVzZSB0aGUgc2FtZQorCWNvb3JkaW5hdGVzLiBUaGUgbGV0dGVyLCBob3dldmVyLCByb3RhdGVzIHRoZW0gYmVmb3JlIHVzaW5nLgorCVRoZSBMQ0QgYml0bWFwIHBhZGRpbmcgaXMgYWxzbyBjYWxjdWxhdGVkIHVzaW5nIHRoZXNlIGNvb3JkaW5hdGVzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIChGVF9MaWJyYXJ5UmVjKTogTmV3IGFycmF5IGZpZWxkCisJYGxjZF9nZW9tZXRyeScuCisJKiBzcmMvYmFzZS9mdGxjZGZpbC5jIChmdF9sY2RfcGFkZGluZyk6IFJld29ya2VkLgorCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogVXBkYXRlZCBhY2NvcmRpbmdseS4KKworCSogc3JjL3Ntb290aC9mdHNtb290aC5jIFshRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkddCisJKGZ0X3Ntb290aF9pbml0KTogSW5pdGlhbGl6ZSBgbGNkX2dlb21ldHJ5Jy4KKwkoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRm9ybWFsaXplIG91dGxpbmUgc2hpZnRzLgorCisyMDE4LTA1LTIyICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIFJlamVjdCBlbGVtZW50cyBvZiBjb21wb3NpdGVzIHdpdGggaW52YWxpZCBnbHlwaCBpbmRpY2VzLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9ODQxMworCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCk6IEltcGxlbWVudCBpdC4KKworMjAxOC0wNS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX1NpbXBsZV9HbHlwaCk6IFRyYWNlICMgb2YgcG9pbnRzLgorCisyMDE4LTA1LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRjb2xvci5oOiBOZXcgZmlsZS4KKworCVRoaXMgaXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBgQ1BBTCcgT3BlblR5cGUgdGFibGUuICBObworCWltcGxlbWVudGF0aW9uIHlldC4KKworMjAxOC0wNS0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIChGVF9NU0IpOiBWZXJpZmllZCBgX01TQ19WRVInLgogCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jZmYvY2Zmb2Jqcy5jLCBzcmMvY2ZmL2NmZnBhcnNlLmM6IFVwZGF0ZQotCWZ1bmN0aW9uIGNhbGxzIHRvIHVzZSBwc2F1eCBzZXJ2aWNlLgorCUFjdHVhbGx5IGBfQml0U2NhblJldmVyc2UnIGlzIGF2YWlsYWJsZSBzaW5jZSBWUzIwMDUuCiAKLTIwMTctMDktMjQgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKzIwMTgtMDUtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVtwc2F1eCwgY2ZmXSBNb3ZlIENGRiBidWlsZGVyIGNvbXBvbmVudHMgaW50byBgcHNhdXgnIG1vZHVsZS4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmggKEZUX01TQik6IFVzZSBgX01TQ19WRVInIHZhbHVlLgogCi0JTk9URTogRG9lcyBub3QgY29tcGlsZSEKKwlPbGRlciBWQyB2ZXJzaW9ucyBkb24ndCBwcm92aWRlIGBfQml0U2NhblJldmVyc2UnLiAgV2UgdGVzdCBmb3IgVkMKKwkyMDEzLgogCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMKLQkoY2ZmX2J1aWxkZXJfe2luaXQsZG9uZSxhZGRfcG9pbnQsYWRkX3BvaW50MSxhZGRfY29udG91cixzdGFydF9wb2ludCxjbG9zZV9jb250b3VyfSwKLQljZmZfY2hlY2tfcG9pbnRzKTogTW92ZSB0by4uLgotCSogc3JjL3BzYXV4L3Bzb2Jqcy5jOiBIZXJlLgorCVJlcG9ydGVkIGJ5IEpvaG4gRW1tYXMgPGpvaG5AY3JlYXRpdmVwb3N0LmNvLnVrPi4KIAotCSogc3JjL2NmZi9jZmZnbG9hZC5oOiBNb3ZlIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb25zIHRvCi0JYHNyYy9wc2F1eC9wc29ianMuaCcuCisyMDE4LTA1LTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaCAoQ0ZGX0J1aWxkZXIpOiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBIZXJlLgorCXMvaW5saW5lL19faW5saW5lLyBmb3IgTVNWQy4KIAotMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCVJlcG9ydGVkIGJ5IEpvaG4gRW1tYXMgPGpvaG5AY3JlYXRpdmVwb3N0LmNvLnVrPi4KIAotCVtwc2F1eCwgY2ZmXSBNb3ZlIENGRiBkZWNvZGVyIGNvbXBvbmVudHMgaW50byBgcHNhdXgnIG1vZHVsZS4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmggKEZUX01TQikgW19NU0NfVkVSXTogRG8gaXQuCiAKLQlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorMjAxOC0wNS0xNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9PcGVyYXRvciwKLQlDRkZfQ09VTlRfe0NIRUNLX1dJRFRILEVYQUNULENMRUFSX1NUQUNLfSwgY2ZmX2FyZ3VtZW50X2NvdW50cywKLQljZmZfb3BlcmF0b3Jfc2VhYywgY2ZmX2NvbXB1dGVfYmlhcywKLQljZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlLAotCWNmZl9kZWNvZGVyX3twYXJzZV9jaGFyc3RyaW5ncyxpbml0LHByZXBhcmV9KTogTW92ZSB0by4uLgotCSogc3JjL3BzYXV4L2NmZmRlY29kZS5jOiBUaGlzIG5ldyBmaWxlLgorCUFkZCBmdW5jdGlvbiBgRlRfR2V0X0dseXBoTGF5ZXJzJyB0byBhY2Nlc3MgYENPTFInIHRhYmxlIGRhdGEuCiAKLQkqIHNyYy9jZmYvY2ZmZ2xvYWQuaDogTW92ZSBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9ucyB0by4uLgotCSogc3JjL3BzYXV4L2NmZmRlY29kZS5oOiBUaGlzIG5ldyBmaWxlLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfR2x5cGhfTGF5ZXJSZWMpOiBNb3ZlIHRoaXMKKwlzdHJ1Y3R1cmUgdG8uLi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfR2x5cGhfTGF5ZXJSZWMpOiAuLi4gdGhpcworCWhlYWRlciBmaWxlLgorCShGVF9HbHlwaF9MYXllcik6IE5ldyB0eXBlZGVmLgorCVVwZGF0ZSBjb2RlIHRvIHVzZSBpdCB3aGVyZSBhcHByb3ByaWF0ZS4KIAotCSogc3JjL2NmZi9jZmZnbG9hZC5oIChDRkZfTUFYX3tPUEVSQU5EUyxTVUJSU19DQUxMUyxUUkFOU19FTEVNRU5UU30sCi0JQ0ZGX0RlY29kZXJfWm9uZSwgQ0ZGX0RlY29kZXIpOiBNb3ZlIGRlY2xhcmF0aW9ucyB0by4uLgotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBIZXJlLgorCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0dldF9HbHlwaExheWVycyk6IE5ldyBmdW5jdGlvbi4KIAotCSogc3JjL3BzYXV4L2NmMmZ0Lmg6IFVwZGF0ZSBpbmNsdWRlLgorMjAxOC0wNS0xNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgogCi0JKiBzcmMvcHNhdXgvcHNhdXguYywgc3JjL3BzYXV4L3J1bGVzLm1rIChQU0FVWF9EUlZfU1JDKTogVXBkYXRlIHdpdGgKLQl0aGUgbmV3IGZpbGUuCisJW2Jhc2VdIEZpeCBtb25vIGJpdG1hcCBwcmVzZXR0aW5nICgjNTM4OTYpLgogCi0yMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisJSXQgaXMgcmF0aGVyIGZ1bmRhbWVudGFsIHRvIHNldCBtb25vY2hyb21lIGJpdG1hcCBiYXNlZCBvbiByb3VuZGVkCisJQ0JveCBiZWNhdXNlIHRoZSBiL3cgcmFzdGVyaXplciB0dXJucyBvbiBwaXhlbHMgd2hlbiB0aGVpciBjZW50ZXJzIGFyZQorCWluc2lkZSB0aGUgZ2x5cGggb3V0bGluZS4gVGhlIGRyb3BvdXQgY29udHJvbCBpcyB1bnByZWRpY3RhYmxlIGFuZCBjYW4KKwlkaXN0b3J0IG5hcnJvdyBnbHlwaHMgaWYgdGhlIGJpdG1hcCBpcyB0b28gd2lkZS4KIAotCVtwc2F1eCwgY2ZmXSBNb3ZlIEFkb2JlJ3MgZW5naW5lIGNvbXBvbmVudHMgaW50byBgcHNhdXgnIG1vZHVsZS4KKwlSZXBvcnRlZCBieSBDaHJpcyBMaWRkZWxsLgogCi0JVGhpcyBpcyB0aGUgZmlyc3QgcGF0Y2ggb2YgYSBzZXF1ZW5jZSB0byBtb3ZlIHRoZSBUeXBlIDIgY2hhcnN0cmluZwotCXByb2Nlc3NpbmcgY2FwYWJpbGl0eSBmcm9tIHRoZSBgY2ZmJyBtb2R1bGUgdG8gdGhlIGBwc2F1eCcgbW9kdWxlLgorCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogSWYgQkJveCBib3VuZGFyaWVzCisJYXJlIHRvbyBjbG9zZSwgYWRqdXN0IHRoZW0gYmVmb3JlIHJvdW5kaW5nLgogCi0JTk9URTogRG9lcyBub3QgY29tcGlsZSEKKzIwMTgtMDUtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogc3JjL2NmZi9jZjIqOiBNb3ZlIHRoZXNlIGZpbGVzIHRvLi4uCi0JKiBzcmMvcHNhdXgvY2YyKjogSGVyZS4KKwlbcHNhdXhdIEZpeCBjb21waWxlciB3YXJuaW5nICgjNTM5MTUpLgogCi0JKiBzcmMvY2ZmL0phbWZpbGUgKF9zb3VyY2VzKSwgc3JjL2NmZi9ydWxlcy5tayAoQ0ZGX0RSVl9TUkMsCi0JQ0ZGX0RSVl9IKSwgc3JjL2NmZi9jZmYuYywgc3JjL2NmZi9jZmZnbG9hZC5jOiBSZW1vdmUgZmlsZQotCXJlZmVyZW5jZXMuCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfZnJlZVQxU2VhY0NvbXBvbmVudCk6IERvIGl0LgogCi0JKiBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLCBzcmMvcHNhdXgvcnVsZXMubWssIHNyYy9wc2F1eC9wc2F1eC5jCi0JKFBTQVVYX0RSVl9TUkMsIFBTQVVYX0RSVl9IKTogQWRkIGZpbGUgcmVmZXJlbmNlcy4KKzIwMTgtMDUtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotMjAxNy0wOS0yNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCVtzZm50XSBGaXggbWVtb3J5IGxlYWsgaW4gaGFuZGxpbmcgYENPTFInIGRhdGEuCiAKLQlUd2VhayBwZXItZmFjZSBMQ0QgZmlsdGVyaW5nIGNvbnRyb2xzLgorCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IEZyZWUgb2xkIGBsYXllcnMnIGFycmF5CisJYmVmb3JlIHJlYXNzaWduaW5nIGFsbG9jYXRlZCBtZW1vcnkuCisJT25seSBhbGxvY2F0ZSBgY29sb3JfbGF5ZXJzJyBpZiB3ZSBkb24ndCBoYXZlIG9uZSBhbHJlYWR5LgogCi0JVGhpbmcgYXJlIHNpbXBsZXIgd2l0aCBhIE5VTEwtZnVuY3Rpb24gcG9pbnRlci4KKzIwMTgtMDUtMTUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfRmFjZV9JbnRlcm5hbFJlYyk6IE5ldwotCXBvaW50ZXIgdG8gdGhlIGZpbHRlciBmdW5jdGlvbi4KLQkoRlRfTGlicmFyeVJlYyk6IFJlbW92ZSB1bnVzZWQgYGxjZF9maWx0ZXInLgotCShGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYywgZnRfbGNkX2ZpbHRlcl9maXIpOiAgTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCAoRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMsCi0JZnRfbGNkX2ZpbHRlcl9maXIpOiAuLi4gdG8gaGVyZS4KKwlbc2ZudF0gSWYgYENPTFInIGlzIHByZXNlbnQsIGRvbid0IGFzc3VtZSB0aGF0IGFsbCBnbHlwaHMgdXNlIGl0LgogCi0JKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfb3Blbl9mYWNlX2ludGVybmFsKTogTlVMTC1pbml0aWFsaXplIHRoZQotCXBlci1mYWNlIGZpbHRlci4KLQkoRlRfRmFjZV9Qcm9wZXJ0aWVzKTogU2V0IGl0LgotCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBTaW1wbGlmeS4KKwkqIHNyYy9zZm50L3R0Y29sci5jICh0dF9mYWNlX2xvYWRfY29scl9sYXllcnMpOiBSZXR1cm4gRlRfRXJyX09rIGlmCisJY3VycmVudCBnbHlwaCBpcyBub3QgYSBgQ09MUicgYmFzZSBnbHlwaC4KIAotCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoZnRfbGNkX2ZpbHRlcl9maXIsIEZUX0xpYmFyeV9TZXRMY2RGaWx0ZXIpOgotCU1pbm9yLgorCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfTG9hZF9HbHlwaCk6IERvbid0IGFsbG9jYXRlCisJYGNvbG9yX2xheWVycycgaWYgdGhlcmUgYXJlIG5vIGNvbG9yIGxheWVycy4KIAotMjAxNy0wOS0yNCAgSm9uYXRoYW4gS2V3ICA8amZrdGhhbWVAZ21haWwuY29tPgorMjAxOC0wNS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JW3NmbnRdIEZpeCBgcHJlbXVsdGlwbHlfZGF0YScgKCM1MjA5MikuCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IEZpeCBzaWduYXR1cmUgb2YgYHBpeGVsX21vZGVzJy4KIAotCSogc3JjL3NmbnQvcG5nc2hpbS5jIChwcmVtdWx0aXBseV9kYXRhKTogRG9uJ3QgdXNlIHZlY3RvciBleHRlbnNpb24KLQlpZiB3ZSBoYXZlIGxlc3MgdGhhbiAxNiBieXRlcyBvZiBkYXRhLgorMjAxOC0wNS0xNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0yMDE3LTA5LTI0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJUHJvdmlkZSBkdW1teSBmdW5jdGlvbnMgaWYgYFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUycgaXMgbm90IHNldC4KIAotCVtvdHZhbGlkXSBGaXggaGFuZGxpbmcgb2YgVmFsdWVSZWNvcmRzLgorCSogc3JjL2Jhc2UvZnRzbmFtZXMuYyBbIVRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FU106IEltcGxlbWVudCBpdC4KIAotCUZvciBHUE9TIHBhaXIgcG9zaXRpb25pbmcgZm9ybWF0IDEgdGhlIGRlc2NyaXB0aW9uIG9mIFZhbHVlUmVjb3JkcwotCWluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uICgxLjguMiwgZnJvbSB0b2RheSkgaXMgd3Jvbmcg4oCTIHRoZQotCW9mZnNldCBoYXMgdG8gYmUgdGFrZW4gZnJvbSB0aGUgcGFyZW50IHN0cnVjdHVyZTsgaW4gdGhpcyBjYXNlIHRoZQotCWBQYWlyU2V0JyB0YWJsZS4KKzIwMTgtMDUtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogc3JjL290dmFsaWQvb3R2Z3Bvcy5jIChvdHZfUGFpclNldF92YWxpZGF0ZSk6IFNldCBgZXh0cmEzJy4KLQkob3R2X1BhaXJQb3NfdmFsaWRhdGUpOiBBZGp1c3QuCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IEltcHJvdmUgdHJhY2luZy4KIAotMjAxNy0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAxOC0wNS0xMyAgU2hhbyBZdSBaaGFuZyAgPHNoYW96aGFuZ0BmYi5jb20+CisJICAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCVtvdHZhbGlkXSBIYW5kbGUgYEdTVUInIGFuZCBgR1BPUycgdjEuMSB0YWJsZXMuCisJW3NmbnRdIFByZWxpbWluYXJ5IHN1cHBvcnQgb2YgY29sb3JlZCBsYXllciBvdXRsaW5lcyAoIzQ0Njg5KS4KIAotCSogc3JjL290dmFsaWQvb3R2Z3N1Yi5jIChvdHZfR1NVQl92YWxpZGF0ZSksIHNyYy9vdHZhbGlkL290dmdwb3MuYwotCShvdHZfR1BPU192YWxpZGF0ZSk6IEltcGxlbWVudCBpdC4KKwlUaGlzIGNvbW1pdCBlbmFibGVzIE9wZW5UeXBlJ3MgQ09MUi9DUEFMIHRhYmxlIGhhbmRsaW5nOyBhIHR5cGljYWwKKwlhcHBsaWNhdGlvbiBhcmUgY29sb3IgZW1vamlzIHRoYXQgY2FuIGJlIHNjYWxlZCB0byBhbnkgc2l6ZS4KIAotMjAxNy0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCUlmIHRoZSBjb2xvciBwYWxldHRlIGRvZXMgbm90IGV4aXN0IG9yIGlzIGludmFsaWQsIHRoZSByZW5kZXJpbmcKKwlzdGVwIHJhc3Rlcml6ZXMgdGhlIG91dGxpbmUgaW5zdGVhZC4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCisJYXNzdW1lcyB0aGF0IHRoZSBmb3JlZ3JvdW5kIGlzIGJsYWNrLgogCi0JW290dmFsaWRdIFVwZGF0ZSBjb21tb24gdGFibGUgaGFuZGxpbmcgdG8gT3BlblR5cGUgMS44LjIuCisJRW5hYmxlIHRoaXMgYnkgZGVmaW5pbmcgb3B0aW9uIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTLgogCi0JKiBzcmMvb3R2YWxpZC9vdHZjb21tbi5jIChvdHZfRGV2aWNlX3ZhbGlkYXRlKTogSGFuZGxlCi0JVmFyaWF0aW9uSW5kZXggc3VidGFibGUuCi0JKG90dl9Mb29rdXBfdmFsaWRhdGUpOiBIYW5kbGUgTWFya0ZpbHRlcmluZ1NldC4KKwlUaGVyZSBhcmUgc3RpbGwgc29tZSBpc3N1ZXMgd2l0aCBtZXRyaWNzOyBhZGRpdGlvbmFsbHksIGFuIEFQSSB0bworCWZldGNoIGNvbG9yIGxheWVycyBpcyBtaXNzaW5nLgogCi0yMDE3LTA5LTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJKiBkZXZlbC9mdG9wdGlvbi5oLCBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCisJKFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTKTogTmV3IG1hY3JvLgogCi0JW2J1aWxkXSBXaW5kb3dzLXN0eWxlIERMTCB2ZXJzaW9uaW5nLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoRlRfR2x5cGhfTGF5ZXJSZWMsCisJRlRfQ29scl9JbnRlcm5hbFJlYyk6IE5ldyBzdHJ1Y3R1cmVzLgorCShGVF9TbG90X0ludGVybmFsUmVjKTogQWRkIGBjb2xvcl9sYXllcnMnIGZpZWxkLgogCi0JKiBidWlsZC93aW5kb3dzL2Z0dmVyLnJjOiBOZXcgVkVSU0lPTklORk8gcmVzb3VyY2UuCi0JKiBidWlsZC93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qOiBGdXJ0aGVyIGltcHJvdmVtZW50cy4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIChUVF9Mb2FkX0NvbHJfTGF5ZXJfRnVuYywKKwlUVF9CbGVuZF9Db2xyX0Z1bmMpOiBOZXcgZnVuY3Rpb24gdHlwZXMuCisJKFNGTlRfSW50ZXJmYWNlKTogQWRkIGBsb2FkX2NvbHInLCBgZnJlZV9jb2xyJywgYGxvYWRfY29scl9sYXllcicsCisJYW5kIGBjb2xyX2JsZW5kJyBmaWVsZHMuCiAKLTIwMTctMDktMjMgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2VSZWMpOiBBZGQKKwlgY29scl9hbmRfY3BhbCcgZmllbGQuCiAKLQlbdHJ1ZXR5cGVdIFJlYWxseSBmaXggIzUyMDgyLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHRhZ3MuIChUVEFHX0NPTFIsIFRUQUdfQ1BBTCk6IE5ldworCW1hY3Jvcy4KIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NRFJQKTogQ29ycmVjdCBjb25kaXRpb25hbC4KKwkqIHNyYy9zZm50L3R0Y29sci5jLCBzcmMvc2ZudC90dGNvbHIuaDogTmV3IGZpbGVzLgogCi0yMDE3LTA5LTIzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X2RvbmUsIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCk6CisJSGFuZGxlIGdseXBoIGNvbG9yIGxheWVycy4KIAotCVtvdHZhbGlkXSBIYW5kbGUgYEdERUYnIHYxLjIgYW5kIHYxLjMgdGFibGVzLgorCSogc3JjL3NmbnQvSmFtZmlsZSAoX3NvdXJjZXMpLCBzcmMvc2ZudC9ydWxlcy5tayAoU0ZOVF9EUlZfU1JDKTogQWRkCisJYHR0Y29sci5jJy4KIAotCU5vIHZhbGlkYXRpb24gb2YgdmFyaWF0aW9uIHN0dWZmIHlldC4KKwkqIHNyYy9zZm50L3NmZHJpdmVyLmM6IEluY2x1ZGUgYHR0Y29sci5oJy4KKwkoUFVUX0NPTE9SX0xBWUVSUyk6IE5ldyBtYWNyby4KKwlVcGRhdGUgY2FsbCB0byBgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFJy4KIAotCSogc3JjL290dmFsaWQvb3R2Z2RlZi5jIChvdHZfTWFya0dseXBoU2V0c192YWxpZGF0ZSk6IE5ldyBmdW5jdGlvbi4KLQkob3R2X0dERUZfdmFsaWRhdGUpOiBJbXBsZW1lbnQgaXQuCisJKiBzcmMvc2ZudC9zZm50LmM6IEluY2x1ZGUgYHR0Y29sci5jJy4KIAotMjAxNy0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCSogc3JjL3NmbnQvc2ZvYmpzLmMgKHNmbnRfbG9hZF9mYWNlKTogTG9hZCBgQ09MUicgYW5kIGBDUEFMJyB0YWJsZXMuCisJKHNmbnRfZG9uZV9mYWNlKTogVXBkYXRlZC4KIAotCVtvdHZhbGlkXSBIYW5kbGUgYEJBU0UnIHYxLjEgdGFibGUuCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogSGFuZGxlIGNvbG9yIGxheWVycy4KIAotCU5vIHZhbGlkYXRpb24gb2YgdmFyaWF0aW9uIHN0dWZmIHlldC4KKzIwMTgtMDUtMTIgIEFya2FkeSBTaGFwa2luICA8YXJrYWR5LnNoYXBraW5AZ21haWwuY29tPgogCi0JKiBzcmMvb3R2YWxpZC9vdHZiYXNlLmMgKG90dl9CQVNFX3ZhbGlkYXRlKTogSW1wbGVtZW50IGl0LgorCVVzZSBNUyBWQysrJ3MgX0JpdFNjYW5SZXZlcnNlIHRvIGNhbGN1bGF0ZSBNU0IgKHBhdGNoICM5NjM2KS4KIAotMjAxNy0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCAoRlRfTVNCKSBbX01TQ19WRVJdOiBJbXBsZW1lbnQKKwlpdC4KIAotCVtvdHZhbGlkXSBNYWNyb3MgZm9yIDMyYml0IG9mZnNldCBzdXBwb3J0LgorMjAxOC0wNS0xMCAgQWxhbiBDb29wZXJzbWl0aCAgPGFsYW4uY29vcGVyc21pdGhAb3JhY2xlLmNvbT4KIAotCSogc3JjL290dmFsaWQvb3R2Y29tbW4uaCAoT1RWX09QVElPTkFMX1RBQkxFMzIsCi0JT1RWX09QVElPTkFMX09GRlNFVDMyLCBPVFZfU0laRV9DSEVDSzMyKTogTmV3IG1hY3Jvcy4KKwlGaXggRExMIGNvbXBpbGF0aW9uIG9uIFNvbGFyaXMuCiAKLTIwMTctMDktMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKwlBQ19DT01QSUxFX0lGRUxTRSBvbmx5IHRyaWVzIHRvIGNvbXBpbGUgYSBgKi5jJyB0byBhIGAqLm8nLiAgVGhlCisJU29sYXJpcyBTdHVkaW8gMTIuMSB0aHJvdWdoIDEyLjUgY29tcGlsZXJzIHNlZSB0aGUKKwlgLWZ2aXNpYmlsaXR5PWhpZGRlbicgZmxhZywgYnV0IGlnbm9yZSBpdCB3aXRoIGEgd2FybmluZyBvZjoKIAotCVtidWlsZF0gU2ltcGxpZnkgVmlzdWFsIEMrKyAyMDEwIHByb2plY3QuCisJICBjYzogV2FybmluZzogT3B0aW9uIC1mdmlzaWJpbGl0eT1oaWRkZW4gcGFzc2VkIHRvIGxkLAorCSAgICAgICAgICAgICAgIGlmIGxkIGlzIGludm9rZWQsIGlnbm9yZWQgb3RoZXJ3aXNlCiAKLQkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFJlbW92ZSBmYWtlIHNpbmdsZXRocmVhZGVkCi0JY29uZmlndXJhdGlvbnMgYW5kIHR3ZWFrLgorCUFDX0xJTktfSUZFTFNFIGRvZXMgdGhlIGNvbXBpbGUgYW5kIHRoZW4gdHJpZXMgdG8gbGluayB0aGUgcmVzdWx0LAorCWF0IHdoaWNoIHBvaW50IHRoZSBTb2xhcmlzIGxpbmtlciB3aWxsIGlzc3VlIGFuIGVycm9yOgogCi0yMDE3LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJICBsZDogZmF0YWw6IG9wdGlvbiAnLWZ2aXNpYmlsaXR5PWhpZGRlbicgaXMgaW5jb21wYXRpYmxlIHdpdGgKKwkgICAgICBidWlsZGluZyBhIGR5bmFtaWMgZXhlY3V0YWJsZQogCi0JW3RydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93ICgjNTIwODIpLgorCUlmIHdlIGRvbid0IHVzZSBBQ19MSU5LX0lGRUxTRSB0byBjYXRjaCB0aGUgZXJyb3IsIHRoZW4gY29uZmlndXJlCisJd2lsbCBmYWlsIGZ1cnRoZXIgdGVzdHMgd2hpY2ggYXR0ZW1wdCB0byBsaW5rLCBzdWNoIGFzIHRob3NlIHRlc3RpbmcKKwlkZXBlbmRlbmNpZXMgbGlrZSBgbGliYnoyJy4KIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19NRFJQKTogQXZvaWQgRlRfQUJTLgorCUFsc28sIGRvbid0IHRyeSBhZGRpbmcgYC1mdmlzaWJpbGl0eScgaWYgd2UgaGF2ZSBhbHJlYWR5IGFkZGVkCisJYC14bGRzY29wZScsIGp1c3QgdXNlIG9uZSBvZiB0aGVtLCBzaW5jZSBTdW4gU3R1ZGlvIDEyIGFuZCBlYXJsaWVyCisJY29tcGlsZXJzIG9ubHkgaXNzdWUgYSB3YXJuaW5nLCBhbmQgZG9uJ3QgdHJ5IHBhc3NpbmcgdGhyb3VnaCB0byB0aGUKKwlsaW5rZXIgdG8gZ2VuZXJhdGUgYW4gZXJyb3IsIHNvIEFDX0xJTktfSUZFTFNFIGRvZXNuJ3QgY2F0Y2ggdGhlbS4KIAotMjAxNy0wOS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCVRlc3RlZCBvbiBTb2xhcmlzIDExLjQgYmV0YSB3aXRoIGNvbXBpbGVyIHZlcnNpb25zOgogCi0JW3NmbnRdIEZpeCBwb3N0c2NyaXB0IG5hbWUgZm9yIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdmFyaWF0aW9uIGZvbnRzLgorCSAgU3VuIFN0dWRpbyA4IChTdW4gQyA1LjUpCisJICBTdW4gU3R1ZGlvIDEwIChTdW4gQyA1LjcpCisJICBTdW4gU3R1ZGlvIDExIChTdW4gQyA1LjgpCisJICBTdW4gU3R1ZGlvIDEyIChTdW4gQyA1LjkpCisJICBTdW4gU3R1ZGlvIDEyLjEgKFN1biBDIDUuMTApCisJICBPcmFjbGUgU29sYXJpcyBTdHVkaW8gMTIuMiAoU3VuIEMgNS4xMSkKKwkgIE9yYWNsZSBTb2xhcmlzIFN0dWRpbyAxMi4zIChTdW4gQyA1LjEyKQorCSAgT3JhY2xlIFNvbGFyaXMgU3R1ZGlvIDEyLjQgKFN1biBDIDUuMTMpCisJICBPcmFjbGUgRGV2ZWxvcGVyIFN0dWRpbyAxMi41IChTdW4gQyA1LjE0KQorCSAgT3JhY2xlIERldmVsb3BlciBTdHVkaW8gMTIuNiAoU3VuIEMgNS4xNSkKKwkgIGdjYyA1LjUuMAorCSAgZ2NjIDcuMy4wCiAKLQlQcm9ibGVtIHJlcG9ydGVkIGJ5IEJlaGRhZC4KKwlhbmQgdmVyaWZpZWQgdGhlIGxpYmZyZWV0eXBlLnNvLjYgZ2VuZXJhdGVkIGJ5IGVhY2ggb2YgdGhvc2UKKwljb21waWxlcnMgZXhwb3J0ZWQgdGhlIHNhbWUgc2V0IG9mIHN5bWJvbHMuCiAKLQkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3BzX25hbWUpOiBUZXN0Ci0JYGlzX2RlZmF1bHRfaW5zdGFuY2UnLgorCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogSW1wbGVtZW50IGl0LgogCi0yMDE3LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisyMDE4LTA1LTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKLQlbdHJ1ZXR5cGVdIEZpeCBgbW12YXInIGFycmF5IHBvaW50ZXJzLCBwYXJ0IDIuCisJW2F1dG9maXRdIEF2b2lkIHBvdGVudGlhbCBTRUdWIGlmIHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4KIAotCVRoZSBwcmV2aW91cyBjb21taXQgd2FzIGluY29tcGxldGUuCisJUHJvYmxlbSByZXBvcnRlZCBieSBTaGFpbGVzaCBNaXN0cnkgPHNoYWlsZXNoLm1pc3RyeUBob3RtYWlsLmNvLnVrPi4KIAotCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYzogUHJvcGVybHkgaW5pdGlhbGl6ZSBzdWItYXJyYXkgb2Zmc2V0cyBmb3IKLQlgbWFzdGVyJyBhbHNvLgorCSogc3JjL2F1dG9maXQvYWZzaGFwZXIuYyAoYWZfc2hhcGVyX2J1Zl9jcmVhdGUsCisJYWZfc2hhcGVyX2J1Zl9kZXN0cm95KSBbIUZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaXTogRG9uJ3QKKwlhbGxvY2F0ZSBhbmQgZnJlZSBhIGZvdXItYnl0ZSBidWZmZXIuICBJbnN0ZWFkLCBtYWtlIHRob3NlIGZ1bmN0aW9ucworCW5vLW9wczsgdGhlIGNhbGxpbmcgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBhIHBvaW50ZXIgdG8gYSBidWZmZXIKKwlpbnN0ZWFkLgogCi0yMDE3LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisJKiBzcmMvYXV0b2ZpdC9hZmNqay5jIChhZl9jamtfbWV0cmljc19pbml0X3dpZHRocywKKwlhZl9jamtfbWV0cmljc19pbml0X2JsdWVzLCBhZl9jamtfbWV0cmljc19jaGVja19kaWdpdHMpLAorCXNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocywKKwlhZl9sYXRpbl9tZXRyaWNzX2luaXRfYmx1ZXMsIGFmX2xhdGluX21ldHJpY3NfY2hlY2tfZGlnaXRzKQorCVshRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlpdOiBVc2UgcG9pbnRlciB0byBsb2NhbCB2YXJpYWJsZSBmb3IKKwlgc2hhcGVyX2J1ZicuCiAKLQlbdHJ1ZXR5cGVdIEZpeCBgbW12YXInIGFycmF5IHBvaW50ZXJzLgorMjAxOC0wNS0wNyAgTmlrb2xhdXMgV2F4d2VpbGVyICA8bWFkaWdlbnNAZ21haWwuY29tPgogCi0JV2l0aG91dCB0aGlzIGNoYW5nZSwgY2xhbmcncyBBZGRyZXNzU2FuaXRpemVyIHJlcG9ydHMgbWFueSBydW50aW1lCi0JZXJyb3JzIGR1ZSB0byBtaXNhbGlnbmVkIGFkZHJlc3Nlcy4KKwlbY21ha2VdIEFsbG93IHVzaW5nIHByb2plY3QgYXMgc3ViZm9sZGVyIGluIG90aGVyIHByb2plY3QuCiAKLQkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBVc2UgbXVsdGlwbGVzIG9mIHBvaW50ZXIKLQlzaXplIGZvciBzdWItYXJyYXkgb2Zmc2V0cyBpbnRvIGBtbXZhcicuCisJKiBDTWFrZUxpc3RzLnR4dDogVGVzdCBmb3IgQ01ha2UgYnVpbGQgZGlyZWN0b3J5IGJlaW5nIGRpZmZlcmVudAorCWZyb20gc291cmNlIGRpcmVjdG9yeS4gIFByb3ZpZGUgb3RoZXIgcGFydHMgb2YgdGhlIGJ1aWxkIHN5c3RlbQorCWFjY2VzcyB0aGUgZnVsbCBpbmNsdWRlIGRpcmVjdG9yeS4KIAotMjAxNy0wOS0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorMjAxOC0wNS0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JW3RydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93cy4KKwlbYnVpbGRdIFN1cHByZXNzIGNvbmZpZ3VyZSdzIGBub3RoaW5nIHRvIGJlIGRvbmUnIG1lc3NhZ2UuCiAKLQlDaGFuZ2VzIHRyaWdnZXJlZCBieQorCVRoaXMgaXMgZHVlIHRvIGNhbGxpbmcgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdmlhIGBtYWtlJyAod2l0aGluIHRoZQorCXRvcC1sZXZlbCBgY29uZmlndXJlJyB3cmFwcGVyIHNjcmlwdCkuICBUaGUgc2FtZSBjYW4gaGFwcGVuIGZvciBhbGwKKwlvdGhlciBzZWNvbmRhcnkgbWFrZSB0YXJnZXRzIHRoYXQgYXJlIHVzZWQgdG8gb25seSBtb2RpZnkgdGhlCisJcHJpbWFyeSBvbmUsIGUuZy4sIGBtYWtlIHNldHVwIGRldmVsJy4KIAotCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzQyOQorCSogYnVpbGRzL2Rvcy9kZXRlY3QubWsgKGVteCwgdHVyYm9jLCB3YXRjb20sIGJvcmxhbmRjLCBib3JsYW5kYzE2KSwKKwlidWlsZHMvb3MyL2RldGVjdCAodmlzdWFsYWdlLCB3YXRjb20sIGJvcmxhbmRjLCBkZXZlbCksCisJYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rIChkZXZlbCwgbGNjLCB1bml4KSwgYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rCisJKHZpc3VhbGMsIHdhdGNvbSwgdmlzdWFsYWdlLCBsY2MsIG1pbmd3MzIsIGJjYzMyLCBkZXZlbC1iY2MsCisJZGV2ZWwtZ2NjKTogVXNlIG5vLW9wIHJlY2lwZS4KIAotCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TSFBJWCwgSW5zX0RFTFRBUCk6IFVzZSBORUdfTE9ORy4KLQkoSW5zX01JQVApOiBVc2UgU1VCX0xPTkcuCisyMDE4LTA1LTA0ICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgogCi0yMDE3LTA5LTE5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisJU3VwcG9ydCBzeW1ib2wgdmlzaWJpbGl0eSBmZWF0dXJlcyBvZiBTdW4gLyBPcmFjbGUgQyBjb21waWxlcnMuCiAKLQlbYnVpbGRdIEZpeCBETEwgYnVpbGRzIGluIFZpc3VhbCBDKysgcHJvamVjdC4KKwlSZXBvcnRlZCBieSBLaXlvc2hpIEthbmF6YXdhOgorCWh0dHBzOi8vbGlzdHMuZ251Lm9yZy9hcmNoaXZlL2h0bWwvZnJlZXR5cGUtZGV2ZWwvMjAxOC0wNS9tc2cwMDAwOC5odG1sCisJVGhhbmtzIHRvIHRoZSBzdWdnZXN0aW9ucyBieSBBbGV4ZWkgYW5kIEFsYW4gQ29vcGVyc21pdGguCiAKLQkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFVzZSBEeW5hbWljTGlicmFyeSBpbiBEZWJ1ZwotCWFuZCBSZWxlYXNlIGNvbmZpZ3VyYXRpb25zLgotCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfRVhQT1JULCBGVF9FWFBPUlRfREVGKQotCVtfRExMXTogVXNlIFZpc3VhbCBDKysgZXh0ZW5zaW9ucy4KKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IENoZWNrIGlmICIteGxkc2NvcGU9aGlkZGVuIiBpcworCWFjY2VwdGVkLCBhbmQgaWYgc28sIGl0IGlzIGFkZGVkIHRvIENGTEFHUy4gIFRoaXMgaXMgdGhlIG9wdGlvbgorCW1ha2luZyBTdW4gLyBPcmFjbGUgQyBjb21waWxlcnMgaGlkZSB0aGUgc3ltYm9scyBmcm9tIGdsb2JhbAorCXNjb3BlLgorCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaDogVXNlICJfX2dsb2JhbCIgcHJlZml4CisJZm9yIEZUX0VYUE9SVCgpIG1hY3JvLCBpZiBTdW5Qcm8gQyBpcyBuZXdlciB0aGFuIFN1biBPTkUKKwlTdHVkaW8gOCAoMjAwMykuCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogRGl0dG8uCisJKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IERpdHRvLgogCi0yMDE3LTA5LTE5ICBKb2huIFR5dGdhdCAgPEpvaG4uVHl0Z2F0QGVza28uY29tPgorMjAxOC0wNS0wMiAgTmlrb2xhdXMgV2F4d2VpbGVyICA8bWFkaWdlbnNAZ21haWwuY29tPgogCi0JW2NmZl0gRml4IGZhbWlseSBuYW1lIGxvZ2ljIG9mIHB1cmUgQ0ZGIGZvbnRkYXRhICgjNTIwNTYpLgorCVVuYnJlYWsgQ01ha2UgV2luZG93cyBpbnN0YWxsYXRpb24KIAotCTEuIElmIGBGYW1pbHlOYW1lJyBpcyBwcmVzZW50IGluIHRoZSBDRkYgZm9udCwgdXNlIHRoaXMgZm9yCi0JICAgRlRfRmFjZSdzIGBmYW1pbHlfbmFtZScuCi0JMi4gT3RoZXJ3aXNlLCB1c2UgdGhlIGZhY2UgbmFtZSBhbmQgY2hvcCBvZmYgYW55IHN1YnNldCBwcmVmaXguCi0JMy4gSWYgYXQgdGhpcyBwb2ludCBGVF9GYWNlJ3MgYGZhbWlseV9uYW1lJyBpcyBzZXQsIHVzZSB0aGlzCi0JICAgdG9nZXRoZXIgd2l0aCB0aGUgZnVsbCBuYW1lIHRvIGRldGVybWluZSB0aGUgc3R5bGUuCi0JNC4gT3RoZXJ3aXNlLCB1c2UgYENJREZvbnROYW1lJyBhcyBGVF9GYWNlJ3MgYGZhbWlseV9uYW1lJy4KLQk1LiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3R5bGUsIHVzZSAiUmVndWxhciIuCisJKiBDTWFrZUxpc3RzLnR4dDogR2VuZXJhdGUgZnRjb25maWcuaCBvbiBub24tVU5JWC4KIAotCVByZXZpb3VzbHksIEZUX0ZhY2UncyBgZmFtaWx5X25hbWUnIGVudHJ5IGZvciBwdXJlIENGRiBmb250ZGF0YQotCW5lYXJseSBhbHdheXMgd2FzIHRoZSBmb250bmFtZSBpdHNlbGYsIGluc3RlYWQgb2YgdGhlIGBGYW1pbHlOYW1lJwotCWVudHJ5IGluIHRoZSBDRkYgZm9udCAoYXNzdW1pbmcgdGhlcmUgaXMgb25lKS4KKzIwMTgtMDUtMDIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KIAotCSogc3JjL2NmZi9jZmZvYmpzLmMgKGNmZl9mYWNlX2luaXQpIFtwdXJlX2NmZl06IEltcGxlbWVudCBpdC4KKwlSZW1vdmUgRlRfQ09ORklHX09QVElPTl9QSUMgYW5kIHJlbGF0ZWQgY29kZS4KIAotMjAxNy0wOS0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCSovKiBbRlRfQ09ORklHX09QVElPTl9QSUNdOiBSZW1vdmUgYWxsIGNvZGUgZ3VhcmRlZCBieSB0aGlzCisJcHJlcHJvY2Vzc29yIHN5bWJvbC4KIAotCVtidWlsZF0gRGVjbHV0dGVyIFZpc3VhbCBDKysgMjAxMC0yMDE3IHByb2plY3QuCisJKi8qOiBSZXBsYWNlIGBYWFhfR0VUJyBtYWNyb3MgKHdoaWNoIGNvdWxkIGJlIGVpdGhlciBhIGZ1bmN0aW9uIGluCisJUElDIG1vZGUgb3IgYW4gYXJyYXkgaW4gbm9uLVBJQyBtb2RlKSB3aXRoIGB4eHgnIGFycmF5cy4KIAotCSogYnVpbGQvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogVXNlIE1heFNwZWVkICgvMDIpCi0Jb3B0aW1pemF0aW9uIGZvciBSZWxlYXNlIGNvbmZpZ3VyYXRpb24gdGhyb3VnaG91dCB0aGUgcHJvamVjdC4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaCwgc3JjL2F1dG9maXQvYWZwaWMuYywKKwlzcmMvYXV0b2ZpdC9hZnBpYy5oLCBzcmMvYmFzZS9iYXNlcGljLmMsIHNyYy9iYXNlL2Jhc2VwaWMuaCwKKwlzcmMvYmFzZS9mdHBpYy5jLCBzcmMvY2ZmL2NmZnBpYy5jLCBzcmMvY2ZmL2NmZnBpYy5oLAorCXNyYy9wc2hpbnRlci9wc2hwaWMuYywgc3JjL3BzaGludGVyL3BzaHBpYy5oLCBzcmMvcHNuYW1lcy9wc3BpYy5jLAorCXNyYy9wc25hbWVzL3BzcGljLmgsIHNyYy9yYXN0ZXIvcmFzdHBpYy5jLCBzcmMvcmFzdGVyL3Jhc3RwaWMuaCwKKwlzcmMvc2ZudC9zZm50cGljLmMsIHNyYy9zZm50L3NmbnRwaWMuaCwgc3JjL3Ntb290aC9mdHNwaWMuYywKKwlzcmMvc21vb3RoL2Z0c3BpYy5oLCBzcmMvdHJ1ZXR5cGUvdHRwaWMuYywgc3JjL3RydWV0eXBlL3R0cGljLmg6CisJUmVtb3ZlZC4KIAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDE3LTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAxOC0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjAgYi9DaGFuZ2VMb2cuMjAKaW5kZXggNjNlMzExNi4uOWY4MTkxNCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nLjIwCisrKyBiL0NoYW5nZUxvZy4yMApAQCAtMTY4OCw3ICsxNjg4LDcgQEAKIAogMjAwMS0wNC0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgogCi0JKiBzcmMvKi9KYW1maWxlOiBTbGlnaHQgY2hhbmdlcwl0byBtYWtlIGZpbGVzIG1vcmUgY3J5cHRpYy4KKwkqIHNyYy8qL0phbWZpbGU6IFNsaWdodCBjaGFuZ2VzIHRvIG1ha2UgZmlsZXMgbW9yZSBjcnlwdGljLgogCiAyMDAxLTA0LTAzICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CiAKQEAgLTE5MjgsNyArMTkyOCw3IEBACiAKIAkqIHNyYy9hdXRvaGludC9haHR5cGVzLmggKEFIX0hpbnRlcik6IEFkZCBlbGVtZW50cwogCWBkaXNhYmxlX2hvcnpfZWRnZXMnLCBgZGlzYWJsZV92ZXJ0X2VkZ2VzJy4KLQkqIHNyYy9hdXRvaGludC9haGhpbnQuYwkoYWhfaGludF9lZGdlc18zLCBhaF9oaW50ZXJfaGludF9lZGdlcyk6IFVzZQorCSogc3JjL2F1dG9oaW50L2FoaGludC5jIChhaF9oaW50X2VkZ2VzXzMsIGFoX2hpbnRlcl9oaW50X2VkZ2VzKTogVXNlCiAJdGhlbSAoYW5kIHJlbW92ZSBzdGF0aWMgdmFyaWFibGVzIHdpdGggdGhlIHNhbWUgbmFtZXMpLgogCSogc3JjL3BjZi9wY2Z1dGlsLmMgKEJpdE9yZGVySW52ZXJ0KTogQWRkIGBjb25zdCcuCiAJKiBkb2NzL2dsbmFtZXMucHk6IFVwZGF0ZWQgdG8gbGF0ZXN0IHBzdGFibGVzLmggY2hhbmdlcy4KQEAgLTIxMDksNyArMjEwOSw3IEBACiAJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QydHlwZXMuaDogVGhpcyBmaWxlIHdhcyBtZXJnZWQgd2l0aAogCWNmZnR5cGVzLmggYW5kIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdDJlcnJvcnMuaDoJUmVuYW1lZCB0byBjZmZlcnJzLmguCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QyZXJyb3JzLmg6IFJlbmFtZWQgdG8gY2ZmZXJycy5oLgogCiAJKiBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL2NmZi9jZmZvYmpzLmgsIHNyYy9jZmYvY2ZmcGFyc2UuYywKIAlzcmMvY2ZmL2NmZmRyaXZyLmMsIHNyYy9jZmYvY2ZmLmMsIHNyYy9jZmYvY2ZmbG9hZC5jLApAQCAtMjE4NCwxMSArMjE4NCwxMSBAQAogCiAyMDAwLTEyLTI0ICBUb20gS2Fjdmluc2t5ICA8dGthY3ZpbnNAZnJlZXR5cGUub3JnPgogCi0JKiBzcmMvY2ZmL3QyZ2xvYWQuYyAoVDJfTG9hZF9HbHlwaCk6IEFkZGVkIGNvZGUJc28gdGhhdCB0aGUgZm9udAorCSogc3JjL2NmZi90Mmdsb2FkLmMgKFQyX0xvYWRfR2x5cGgpOiBBZGRlZCBjb2RlIHNvIHRoYXQgdGhlIGZvbnQKIAl0cmFuc2Zvcm0gaXMgYXBwbGllZC4KIAogCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfZm9udF9tYXRyaXgpOiBBZGRlZCBjb2RlIHNvIHRoYXQKLQl0aGUgZm9udCBtYXRyaXggbnVtYmVycwlhcmUgc2NhbGVkIGJ5IDEvKG1hdHJpeC0+eXkpLiAgQWxzbywgdGhlCisJdGhlIGZvbnQgbWF0cml4IG51bWJlcnMgYXJlIHNjYWxlZCBieSAxLyhtYXRyaXgtPnl5KS4gIEFsc28sIHRoZQogCW9mZnNldCB2ZWN0b3Igbm93IGNvbnRhaW5zIGludGVnZXIgdmFsdWVzIGluc3RlYWQgb2YgMTYuMTYgZml4ZWQKIAludW1iZXJzLgogCkBAIC0yNTk3LDcgKzI1OTcsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAwLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjEgYi9DaGFuZ2VMb2cuMjEKaW5kZXggMWFkYzgxNy4uZjM2ZjViNyAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nLjIxCisrKyBiL0NoYW5nZUxvZy4yMQpAQCAtNTUzLDcgKzU1Myw3IEBACiAJKFQxX05ld19QYXJzZXIpOiBVc2UgaXQgdG8gY2hlY2sgZm9udCBoZWFkZXIgYmVmb3JlIGFsbG9jYXRpbmcKIAlhbnl0aGluZyBvbiB0aGUgaGVhcC4KIAotCSogc3JjL3R5cGU0Mi90NDJwYXJzZS5jCSh0NDJfcGFyc2VyX2luaXQpOiBNb2RpZnkgZnVuY3Rpb25zIHRvIGNoZWNrCisJKiBzcmMvdHlwZTQyL3Q0MnBhcnNlLmMgKHQ0Ml9wYXJzZXJfaW5pdCk6IE1vZGlmeSBmdW5jdGlvbnMgdG8gY2hlY2sKIAl0aGUgZm9udCBoZWFkZXIgYmVmb3JlIGFsbG9jYXRpbmcgYW55dGhpbmcgb24gdGhlIGhlYXAuCiAKIAkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCAoRlRfQVJSQVlfTUFYLApAQCAtNDc5OSwxMSArNDc5OSwxMSBAQAogCShjaGFwdGVyX2ludGVyLCBjaGFwdGVyX2Zvb3Rlcik6IEFkZCA8bGk+IGFuZCB1c2Ugc3BlY2lhbCA8dWw+CiAJY2xhc3MuCiAJVXNlIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHRhYmxlIHdpZHRocyBnaXZlbiBpbiBwZXJjZW50LgotCShrZXl3b3JkX3ByZWZpeCwga2V5d29yZF9zdWZmaXgpOiBEb24ndCBjaGFuZ2UgZm9udCBjb2xvdXIgZGlyZWN0bHkKKwkoa2V5d29yZF9wcmVmaXgsIGtleXdvcmRfc3VmZml4KTogRG9uJ3QgY2hhbmdlIGZvbnQgY29sb3IgZGlyZWN0bHkKIAlidXQgdXNlIGEgbmV3IDxzcGFuPiBjbGFzcy4KIAkoc2VjdGlvbl9zeW5vcHNpc19oZWFkZXIsIHNlY3Rpb25fc3lub3BzaXNfZm9vdGVyKTogRG9uJ3QgY2hhbmdlCi0JY29sb3VyLgotCShjb2RlX2hlYWRlciwgY29kZV9mb290ZXIpOiBEb24ndCBjaGFuZ2UgZm9udCBjb2xvdXIgZGlyZWN0bHkgYnV0CisJY29sb3IuCisJKGNvZGVfaGVhZGVyLCBjb2RlX2Zvb3Rlcik6IERvbid0IGNoYW5nZSBmb250IGNvbG9yIGRpcmVjdGx5IGJ1dAogCXVzZSBhIHNwZWNpYWwgPHByZT4gY2xhc3MuCiAJKHByaW50X2h0bWxfZmllbGQpOiA8dHI+IGdldHMgdGhlIGB2YWxpZ24nIGF0dHJpYnV0ZSwgbm90IDx0YWJsZT4uCiAJKHByaW50X2h0bWxfZmllbGRfbGlzdCk6IERpdHRvLgpAQCAtOTQyMiw3ICs5NDIyLDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwMi0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nLjIyIGIvQ2hhbmdlTG9nLjIyCmluZGV4IDQ1MTdjMzIuLjg2NjYyZjYgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZy4yMgorKysgYi9DaGFuZ2VMb2cuMjIKQEAgLTI4MjEsNyArMjgyMSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDUtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yMyBiL0NoYW5nZUxvZy4yMwppbmRleCA4NTI1M2YxLi40YzgwNTA0IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cuMjMKKysrIGIvQ2hhbmdlTG9nLjIzCkBAIC03NTAsNyArNzUwLDcgQEAKIDIwMDktMDctMzEgIHN1enVraSB0b3NoaXlhICA8bXBzdXp1a2lAaGlyb3NoaW1hLXUuYWMuanA+CiAKIAlzZm50OiBDYXN0IGEgY2hhcmNvZGUgdG8gMzItYml0IGluIGNtYXAgZm9ybWF0IDE0IHBhcnNlci4KLQkKKwogCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAxNF9jaGFyX3Zhcl9pbmRleCwKIAl0dF9jbWFwMTRfY2hhcl92YXJfaXNkZWZhdWx0LCB0dF9jbWFwMTRfY2hhcl92YXJpYW50cywKIAl0dF9jbWFwMTRfdmFyaWFudF9jaGFycyk6IENvcnJlY3QgbWlzbWF0Y2hlcyBmcm9tCkBAIC0xMzQ0LDI0ICsxMzQ0LDI0IEBACiAJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oOiBJbnRyb2R1Y2UKIAlGVF9JTlRfTUlOLCB0byB1c2UgaW4gc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaW4KIAkxNi1iaXQgYW5kIDY0LWJpdCBwbGF0Zm9ybXMuCi0JCisKIAkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oOiBBZGQgYSB0cmFjZXIKIAl0byBmdHN5bnRoLmMuCi0JCisKIAkqIHNyYy9iYXNlL2Z0Yml0bWFwLmMgKEZUX0JpdG1hcF9FbWJvbGRlbik6IENoZWNrCiAJaW52YWxpZCBzdHJlbmd0aCBjYXVzaW5nIGludGVnZXIgb3ZlcmZsb3cgb24gMTYtYml0CiAJcGxhdGZvcm0uCi0JCisKIAkqIHNyYy9iYXNlL2Z0Y2FsYy5jIChmdF9jb3JuZXJfb3JpZW50YXRpb24pOiBDaGFuZ2UKIAl0aGUgaW50ZXJuYWwgY2FsY3VsYXRpb24gZnJvbSBGVF9JbnQgdG8gRlRfTG9uZywgdG8KIAlhdm9pZCBhbiBvdmVyZmxvdyBvbiAxNi1iaXQgcGxhdGZvcm1zLiAgVGhlIGNhbGxlciBvZgogCXRoaXMgZnVuY3Rpb24gc2hvdWxkIHVzZSBvbmx5IHRoZSBzaWduIG9mIHJlc3VsdCwKIAlzbyB0aGUgY2FzdCB0byBGVF9JbnQgaXMgYWNjZXB0YWJsZS4KLQkKKwogCSogc3JjL2Jhc2UvZnRzeW50aC5jOiBJbnRyb2R1Y2UgYSB0cmFjZXIgZm9yIHN5bnRoIG1vZHVsZS4KIAkoRlRfR2x5cGhTbG90X0VtYm9sZGVuKTogQ2hlY2sgaW52YWxpZCBzdHJlbmd0aCBjYXVzaW5nCiAJaW50ZWdlciBvdmVyZmxvdyBvbiAxNi1iaXQgcGxhdGZvcm0uCi0JCisKIAkqIHNyYy9iZGYvYmRmZHJpdnIuYyAoQkRGX0ZhY2VfSW5pdCk6IFRoZSBnbHlwaCBpbmRleAogCWluIEZUMiBBUEkgaXMgdHlwZWQgYXMgRlRfVUludCwgYWx0aG91Z2ggQkRGIGRyaXZlcgogCWNhbiBoYW5kbGUgdW5zaWduZWQgbG9uZyBnbHlwaCBpbmRleCBpbnRlcm5hbGx5LiAgVG8KQEAgLTEzNzIsMjUgKzEzNzIsMjUgQEAKIAlnbHlwaCBwaXRjaCBpbnRlcm5hbGx5LiAgVG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyBvbgogCTE2LWJpdCBwbGF0Zm9ybSwgdG9vIGxhcmdlIGdseXBoIHBpdGNoIHNob3VsZCBub3QgYmUKIAlyZXR1cm5lZC4KLQkKKwogCSogc3JjL3Bmci9wZnJzYml0LmMgKHBmcl9zbG90X2xvYWRfYml0bWFwKTogVGhlIGdseXBoCiAJcGl0Y2ggaW4gRlQyIGlzIHR5cGVkIGFzIEZUX1VJbnQsIGFsdGhvdWdoIFBGUiBmb250CiAJZm9ybWF0IGNhbiBpbmNsdWRlIGh1Z2UgYml0bWFwIGdseXBoIHdpdGggMjQtYml0IHBpdGNoCiAJKGhvd2V2ZXIsIGEgZ2x5cGggc3BlbmRzIDE2LjcgcGl4ZWwsIGl0J3Mgbm90IHJlYWxpc3RpYykuCiAJVG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvdyBvbiAxNi1iaXQgcGxhdGZvcm0sIGh1Z2UKIAliaXRtYXAgZ2x5cGggc2hvdWxkIGJlIGV4Y2x1ZGVkLgotCQorCiAJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9obGluZSk6IEFzIEZUX1NwYW4ueCBpcwogCXRydW5jYXRlZCB0byBmaXQgaXRzIHR5cGUgKDE2LWJpdCBzaG9ydCksIEZUX1NwYW4ueQogCXNob3VsZCBiZSB0cnVuY2F0ZWQgdG8gZml0IGl0cyB0eXBlIChGVF9JbnQpLgotCQorCiAJKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfcm9zKTogQ0ZGIHNwZWNpZmljYXRpb24KIAlkZWZpbmVzIHRoZSBzdXBwbGVtZW50IGluIFJPUyBhcyBhIHJlYWwgbnVtYmVyLgogCVRydW5jYXRlIGl0IHRvIGZpdCBwdWJsaWMgRlQyIEFQSS4KLQkKKwogCSogc3JjL2NmZi9jZmZwYXJzZS5jIChjZmZfcGFyc2VfY2lkX3Jvcyk6IFdhcm4gdGhlCiAJc3VwcGxlbWVudCBpZiBpdCBpcyB0cnVuY2F0ZWQgb3Igcm91bmRlZCBpbiBjZmZfZ2V0X3JvcygpLgotCQorCiAJKiBzcmMvY2ZmL2NmZnR5cGVzLmg6IENoYW5nZSB0aGUgdHlwZSBvZiBpbnRlcm5hbCB2YXJpYWJsZQogCWBzdXBwbGVtZW50JyBmcm9tIEZUX0xvbmcgdG8gRlRfVUxvbmcgdG8gZml0IHRoZSBzaWduZWRuZXNzCiAJdG8gdGhlIHR5cGUgaW4gcHVibGljIEFQSS4KQEAgLTE2NTMsNyArMTY1Myw3IEBACiAKIAljZmY6IEZpeCBzb21lIGRhdGEgdHlwZXMgbWlzbWF0Y2hpbmcgd2l0aCB0aGVpciBzb3VyY2VzLgogCi0JKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBUaGUgdHlwZXMgb2YJCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKGNmZl9zbG90X2xvYWQpOiBUaGUgdHlwZXMgb2YKIAlgdG9wX3VwbScgYW5kIGBzdWJfdXBtJyBhcmUgbWF0Y2hlZCB3aXRoCiAJQ0ZGX0ZvbnRSZWNEaWN0LT51bml0c19wZXJfZW0uCiAKQEAgLTE4MTEsNTYgKzE4MTEsNTYgQEAKIAlneHZfWENsYXNzVGFibGVfbG9va3VwdmFsX3ZhbGlkYXRlLAogCWd4dl9YQ2xhc3NUYWJsZV9sb29rdXBmbXQ0X3RyYW5zaXQpOgogCVVwZGF0ZSBmcm9tIEdYVl9Mb29rdXBWYWx1ZURlc2MgdG8gR1hWX0xvb2t1cFZhbHVlQ1B0ci4KLQkKKwogCSogc3JjL2d4dmFsaWQvZ3h2YnNsbi5jIChneHZfYnNsbl9Mb29rdXBWYWx1ZV92YWxpZGF0ZSwKIAlneHZfYnNsbl9Mb29rdXBGbXQ0X3RyYW5zaXQpOiBEaXR0by4KLQkKKwogCSogc3JjL2d4dmFsaWQvZ3h2anVzdC5jCiAJKGd4dl9qdXN0X3BjVGFibGVfTG9va3VwVmFsdWVfZW50cnlfdmFsaWRhdGUsCiAJZ3h2X2p1c3RfY2xhc3NUYWJsZV9lbnRyeV92YWxpZGF0ZSwKIAlneHZfanVzdF93ZGNUYWJsZV9Mb29rdXBWYWx1ZV92YWxpZGF0ZSk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZrZXJuLmMKIAkoZ3h2X2tlcm5fc3VidGFibGVfZm10MV9lbnRyeV92YWxpZGF0ZSk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZsY2FyLmMgKGd4dl9sY2FyX0xvb2t1cFZhbHVlX3ZhbGlkYXRlLAogCWd4dl9sY2FyX0xvb2t1cEZtdDRfdHJhbnNpdCk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZvcGJkLmMgKGd4dl9vcGJkX0xvb2t1cFZhbHVlX3ZhbGlkYXRlLAogCWd4dl9vcGJkX0xvb2t1cEZtdDRfdHJhbnNpdCk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZwcm9wLmMgKGd4dl9wcm9wX0xvb2t1cFZhbHVlX3ZhbGlkYXRlLAogCWd4dl9wcm9wX0xvb2t1cEZtdDRfdHJhbnNpdCk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZtb3J0NC5jCiAJKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU0X2xvb2t1cHZhbF92YWxpZGF0ZSk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZtb3J0MC5jCiAJKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKTogVXBkYXRlCiAJZnJvbSBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldERlc2MKIAl0byBHWFZfU3RhdGVUYWJsZV9HbHlwaE9mZnNldENQdHIuCi0JCisKIAkqIHNyYy9neHZhbGlkL2d4dm1vcnQxLmMKIAkoZ3h2X21vcnRfc3VidGFibGVfdHlwZTFfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKKwogCSogc3JjL2d4dmFsaWQvZ3h2bW9ydDIuYwogCShneHZfbW9ydF9zdWJ0YWJsZV90eXBlMl9lbnRyeV92YWxpZGF0ZSk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZtb3J0NS5jCiAJKGd4dl9tb3J0X3N1YnRhYmxlX3R5cGU1X2VudHJ5X3ZhbGlkYXRlKTogRGl0dG8uCi0JCisKIAkqIHNyYy9neHZhbGlkL2d4dm1vcngyLmMKIAkoZ3h2X21vcnhfc3VidGFibGVfdHlwZTJfZW50cnlfdmFsaWRhdGUpOiBEaXR0by4KLQkKKwogCSogc3JjL2d4dmFsaWQvZ3h2bW9yeDUuYwogCShneHZfbW9yeF9zdWJ0YWJsZV90eXBlNV9lbnRyeV92YWxpZGF0ZSk6IERpdHRvLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZtb3J4MS5jCiAJKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX2VudHJ5X3ZhbGlkYXRlKTogRGl0dG8uCiAJKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX0xvb2t1cFZhbHVlX3ZhbGlkYXRlLAogCWd4dl9tb3J4X3N1YnRhYmxlX3R5cGUxX0xvb2t1cEZtdDRfdHJhbnNpdCk6CiAJVXBkYXRlIGZyb20gR1hWX0xvb2t1cFZhbHVlRGVzYyB0byBHWFZfTG9va3VwVmFsdWVDUHRyLgotCQorCiAJKiBzcmMvZ3h2YWxpZC9neHZtb3J4MC5jCiAJKGd4dl9tb3J4X3N1YnRhYmxlX3R5cGUwX2VudHJ5X3ZhbGlkYXRlKTogVXBkYXRlCiAJZnJvbSBHWFZfWFN0YXRlVGFibGVfR2x5cGhPZmZzZXREZXNjCkBAIC0xOTc2LDcgKzE5NzYsNyBAQAogCVByZXZlbnQgdGhlIG92ZXJmbG93cyBieSBhIGdseXBoIHdpdGggdG9vIG1hbnkgcG9pbnRzIG9yIGNvbnRvdXJzLgogCVRoZSBidWcgaXMgcmVwb3J0ZWQgYnkgQm9yaXMgTGV0b2NoYSA8Yi5sZXRvY2hhQGdtYy5uZXQ+LiAgU2VlCiAJaHR0cHM6Ly9saXN0cy5nbnUub3JnL2FyY2hpdmUvaHRtbC9mcmVldHlwZS1kZXZlbC8yMDA5LTA2L21zZzAwMDMxLmh0bWwKLQlodHRwczovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDktMDcvbXNnMDAwMDIuaHRtbAkKKwlodHRwczovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMDktMDcvbXNnMDAwMDIuaHRtbAogCiAJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCAoRlRfT1VUTElORV9DT05UT1VSU19NQVgsCiAJRlRfT1VUTElORV9QT0lOVFNfTUFYKTogTmV3IG1hY3JvcyB0byBkZWNsYXJlIHRoZSBtYXhpbXVtCkBAIC02OTQ4LDcgKzY5NDgsNyBAQAogCiAyMDA2LTExLTI1ICBEYXZpZCBUdXJuZXIgIDxkYXZpZEBmcmVldHlwZS5vcmc+CiAKLQkqIHNyYy9hdXRvZml0L2FmaGludHMuYwkoYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMsCisJKiBzcmMvYXV0b2ZpdC9hZmhpbnRzLmMgKGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzLAogCWFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMsIGFmX2dseXBoX2hpbnRzX2R1bXBlZGdlcykgWyFBRl9ERUJVR106CiAJQWRkIHN0dWJzIHRvIGxpbmsgdGhlIGBmdGdyaWQnIHRlc3QgcHJvZ3JhbSB3aGVuIGRlYnVnZ2luZyBpcwogCWRpc2FibGVkIGluIHRoZSBhdXRvLWhpbnRlci4KQEAgLTc5MzIsNyArNzkzMiw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDYtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yNCBiL0NoYW5nZUxvZy4yNAppbmRleCA0NGFiYzQwLi4xN2U5OGM0IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cuMjQKKysrIGIvQ2hhbmdlTG9nLjI0CkBAIC0yMzEsNyArMjMxLDcgQEAKIAogCSogc3JjL2Jhc2UvbWQ1LmMsIHNyYy9iYXNlL21kNS5oOiBOZXcgZmlsZXMsIHRha2VuIGZyb20KIAotCSAgaHR0cDovL29wZW53YWxsLmluZm8vd2lraS9wZW9wbGUvc29sYXIvc29mdHdhcmUvcHVibGljLWRvbWFpbi1zb3VyY2UtY29kZS9tZDUKKwkgIGh0dHBzOi8vb3BlbndhbGwuaW5mby93aWtpL3Blb3BsZS9zb2xhci9zb2Z0d2FyZS9wdWJsaWMtZG9tYWluLXNvdXJjZS1jb2RlL21kNQogCiAJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIGBiaXRtYXAnLgogCkBAIC03NzQsNyArNzc0LDcgQEAKIAogCShGb250X0NsYXNzKTogUmVuYW1lIHRvLi4uCiAJKFNQSF9Gb250X0NsYXNzKTogVGhpcy4gIERlY29yYXRlIHdpdGggYGNvbnN0JyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkKKwogCSogc3JjL3RydWV0eXBlL3R0c3VicGl4LmggKHNjYWxlX3Rlc3RfdHdlYWssIHNwaF90ZXN0X3R3ZWFrKToKIAlEZWNvcmF0ZSBhcmd1bWVudHMgd2l0aCBgY29uc3QnIHdoZXJlIGFwcHJvcHJpYXRlLgogCkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX21ldHJpY3NfaW5pdF93aWR0aHMpOiBVc2UgaXQuCiAJKGFmX2Nqa19tZXRyaWNzX2luaXQsIGFmX2Nqa19zY3JpcHRfY2xhc3MpOiBVcGRhdGVkLgogCi0JKiBzcmMvYXV0b2ZpdC9hZmluZGljLmMJKGFmX2luZGljX21ldHJpY3NfaW5pdCwKKwkqIHNyYy9hdXRvZml0L2FmaW5kaWMuYyAoYWZfaW5kaWNfbWV0cmljc19pbml0LAogCWFmX2luZGljX3NjcmlwdF9jbGFzcyk6IFVwZGF0ZWQuCiAKIAkqIHNyYy9hdXRvZml0L2FmY2prLmgsIHNyYy9hdXRvZml0L2FmbGF0aW4uaDogVXBkYXRlZC4KQEAgLTYzNDQsNyArNjM0NCw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMTAtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDEwLTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yNSBiL0NoYW5nZUxvZy4yNQppbmRleCA1OWNmMmJmLi42ZTA0NDI3IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cuMjUKKysrIGIvQ2hhbmdlTG9nLjI1CkBAIC0zNDA1LDcgKzM0MDUsNyBAQAogCiAJVGhlIGNhbm9uaWNhbCBVUkwgdG8gZ2V0IHVwZGF0ZXMgZm9yIHRoaXMgZmlsZSBpcwogCi0JICBodHRwOi8vY3Zzd2ViLm9wZW53YWxsLmNvbS9jZ2kvY3Zzd2ViLmNnaS9Pd2wvcGFja2FnZXMvcG9wYTNkL3BvcGEzZC9tZDUvCisJICBodHRwczovL2N2c3dlYi5vcGVud2FsbC5jb20vY2dpL2N2c3dlYi5jZ2kvT3dsL3BhY2thZ2VzL3BvcGEzZC9wb3BhM2QvbWQ1LwogCiAJYXMgdGhlIGF1dGhvciB0b2xkIG1lIGluIHByaXZhdGUgY29tbXVuaWNhdGlvbi4KIApAQCAtNDgzNyw3ICs0ODM3LDcgQEAKIAogCUFwcGx5IGZpeGVzIGZvciBjcHBjaGVjayBuaXRwaWNrcy4KIAotCSAgaHR0cDovL2NwcGNoZWNrLnNvdXJjZWZvcmdlLm5ldC8KKwkgIGh0dHBzOi8vY3BwY2hlY2suc291cmNlZm9yZ2UubmV0LwogCiAJVGhlIGNhbGwgd2FzIChmcm9tIHRoZSB0b3AtbGV2ZWwgb2YgdGhlIEZyZWVUeXBlIHRyZWUpOgogCkBAIC01MTQ1LDcgKzUxNDUsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDEzLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjYgYi9DaGFuZ2VMb2cuMjYKaW5kZXggZWE4OWU5MS4uYTRmYzA2MCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nLjI2CisrKyBiL0NoYW5nZUxvZy4yNgpAQCAtMjM5Myw3ICsyMzkzLDcgQEAKIAogCSogc3JjL2F1dG9maXQvYWZjamsuYyAoYWZfY2prX2dldF9zdGFuZGFyZF93aWR0aCk6IE5ldyBmdW5jdGlvbi4KIAkoYWZfY2prX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogVXBkYXRlZC4KLQkqIHNyYy9hdXRvZml0L2FmZHVtbXkuYwkoYWZfZHVtbXlfd3JpdGluZ19zeXN0ZW1fY2xhc3MpOiBVcGRhdGVkLgorCSogc3JjL2F1dG9maXQvYWZkdW1teS5jIChhZl9kdW1teV93cml0aW5nX3N5c3RlbV9jbGFzcyk6IFVwZGF0ZWQuCiAJKiBzcmMvYXV0b2ZpdC9hZmluZGljLmMgKGFmX2Nqa19nZXRfc3RhbmRhcmRfd2lkdGgpOiBOZXcgZnVuY3Rpb24uCiAJKGFmX2luZGljX3dyaXRpbmdfc3lzdGVtX2NsYXNzKTogVXBkYXRlZC4KIAkqIHNyYy9hdXRvZml0L2FmbGF0aW4uYyAoYWZfbGF0aW5fZ2V0X3N0YW5kYXJkX3dpZHRoKTogTmV3IGZ1bmN0aW9uLgpAQCAtNTY5NSw3ICs1Njk1LDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAxNS0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMTUtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nLjI3IGIvQ2hhbmdlTG9nLjI3CmluZGV4IDBlODJiMmYuLmM1OWVkN2IgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZy4yNworKysgYi9DaGFuZ2VMb2cuMjcKQEAgLTIwOTAsNyArMjA5MCw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMTYtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDE2LTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZy4yOCBiL0NoYW5nZUxvZy4yOAppbmRleCBjYTFmZjM4Li5iMTdhNzUxIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cuMjgKKysrIGIvQ2hhbmdlTG9nLjI4CkBAIC0yNDg5LDggKzI0ODksOCBAQAogCiAJQmFzZWQgb24gaWRlYXMgdGFrZW4gZnJvbQogCi0JICBodHRwOi8vcGtncy5mZWRvcmFwcm9qZWN0Lm9yZy9jZ2l0L3JwbXMvZnJlZXR5cGUuZ2l0L3RyZWUvZnJlZXR5cGUtbXVsdGlsaWIucGF0Y2gKLQkgIGh0dHA6Ly9wa2dzLmZlZG9yYXByb2plY3Qub3JnL2NnaXQvcnBtcy9mcmVldHlwZS5naXQvdHJlZS9mcmVldHlwZS0yLjUuMy1mcmVldHlwZS1jb25maWctcHJlZml4LnBhdGNoCisJICBodHRwczovL3BrZ3MuZmVkb3JhcHJvamVjdC5vcmcvY2dpdC9ycG1zL2ZyZWV0eXBlLmdpdC90cmVlL2ZyZWV0eXBlLW11bHRpbGliLnBhdGNoCisJICBodHRwczovL3BrZ3MuZmVkb3JhcHJvamVjdC5vcmcvY2dpdC9ycG1zL2ZyZWV0eXBlLmdpdC90cmVlL2ZyZWV0eXBlLTIuNS4zLWZyZWV0eXBlLWNvbmZpZy1wcmVmaXgucGF0Y2gKIAogCSogYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluOiBSZXdyaXR0ZW4uICBVc2UgYHBrZy1jb25maWcnIHRvCiAJc2V0IG91dHB1dCB2YXJpYWJsZXMgaWYgcHJvZ3JhbSBpcyBhdmFpbGFibGUuCkBAIC0zMTIwLDcgKzMxMjAsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDE2LTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAxNi0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cuMjkgYi9DaGFuZ2VMb2cuMjkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxYzA1NgotLS0gL2Rldi9udWxsCisrKyBiL0NoYW5nZUxvZy4yOQpAQCAtMCwwICsxLDIzNTIgQEAKKzIwMTgtMDUtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogVmVyc2lvbiAyLjkuMSByZWxlYXNlZC4KKwk9PT09PT09PT09PT09PT09PT09PT09PT09CisKKworCVRhZyBzb3VyY2VzIHdpdGggYFZFUi0yLTktMScuCisKKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjkuMS4KKwkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KKworCSogUkVBRE1FLCBKYW1maWxlIChSZWZEb2MpLCBidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAorCXNyYy9iYXNlL2Z0dmVyLnJjLCBidWlsZHMvd2luZG93cy92YzIwMDUvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AsCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCisJYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjkvMi45LjEvLCBzLzI5LzI5MS8uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMS4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDIyOjE6MTYuCisJKiBDTWFrZUxpc3RzLnR4dCAoVkVSU0lPTl9QQVRDSCk6IFNldCB0byAxLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2FzcC5oOiBVc2UgRlRfQkVHSU5fSEVBREVSIGFuZCBGVF9FTkRfSEVBREVSLgorCisyMDE4LTA0LTI2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBbm90aGVyIGZpeCBmb3IgaGFuZGxpbmcgaW52YWxpZCBmb3JtYXQgMiBjbWFwcy4KKworCVNpZ2guCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD04MDAzCisKKwkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwMl9jaGFyX25leHQpOiBBZGp1c3QgY29uZGl0aW9uIHRvIGF2b2lkCisJYW4gZW5kbGVzcyBsb29wLgorCisyMDE4LTA0LTI0ICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ29vZ2xlLmNvbT4KKworCVtiYXNlXSBBdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIGluIGxjZCBmaWx0ZXJpbmcgY29kZSAoIzUzNzI3KS4KKworCSogc3JjL2Jhc2UvZnRsY2RmaWwuYyAoZnRfbGNkX2ZpbHRlcl9maXIsIF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSk6CisJRW5zdXJlIGBoZWlnaHQgPiAwJy4KKworMjAxOC0wNC0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvYmFzZS9mdG91dGxuLmMgKEZUX091dGxpbmVfRGVjb21wb3NlKTogSW1wcm92ZSBlcnJvciB0cmFjaW5nLgorCisyMDE4LTA0LTIyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmFzZV0gRml4IGJpdG1hcCBlbWJvbGRlbmluZy4KKworCUJ1ZyBpbnRyb2R1Y2VkIGFmdGVyIHJlbGVhc2UgMi44LgorCisJKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlcik6IFdlIHVzZQorCWBGVF9RQUxMT0NfTVVMVCcsIHdoaWNoIGRvZXNuJ3QgemVybyBvdXQgdGhlIGJ1ZmZlci4gIEFkanVzdCB0aGUKKwliaXRtYXAgY29weWluZyBjb2RlIHRvIHRha2UgY2FyZSBvZiB0aGlzIGZhY3QuCisKKzIwMTgtMDQtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFub3RoZXIgZml4IGZvciBoYW5kbGluZyBpbnZhbGlkIGZvcm1hdCAyIGNtYXBzLgorCisJVGhlIHByZXZpb3VzIGNvbW1pdCB3YXMgaW5jb21wbGV0ZS4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTc5MjgKKworCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEFkanVzdCBjb25kaXRpb24gdG8gYXZvaWQKKwlhbiBlbmRsZXNzIGxvb3AuCisKKzIwMTgtMDQtMTkgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZworCisJW2F1dG9maXRdIEFkZCBzdXBwb3J0IGZvciBHZW9yZ2lhbiBNdGF2cnVsaSBjaGFyYWN0ZXJzLgorCisJVGhpcyB3aWxsIGJlIHBhcnQgb2YgdGhlIGZvcnRoY29taW5nIFVuaWNvZGUgMTEuMC4KKworCSogc3JjL2F1dG9maXQvYWZibHVlLmRhdDogQWRkIGJsdWUgem9uZSBkYXRhIGZvciBNdGF2cnVsaS4KKwkqIHNyYy9hdXRvZml0L2FmYmx1ZS5jLCBzcmMvYXV0b2ZpdC9hZmJsdWUuaDogUmVnZW5lcmF0ZWQuCisKKwkqIHNyYy9hdXRvZml0L2Fmc2NyaXB0Lmg6IEFkZCBNdGF2cnVsaSBzdGFuZGFyZCBjaGFyYWN0ZXIuCisKKzIwMTgtMDQtMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBoYW5kbGluZyBvZiBpbnZhbGlkIGZvcm1hdCAyIGNtYXBzLgorCisJVGhlIHByb2JsZW0gd2FzIGludHJvZHVjZWQgYWZ0ZXIgdGhlIGxhc3QgcmVsZWFzZS4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTc4MjgKKworCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEF2b2lkIGVuZGxlc3MgbG9vcC4KKworMjAxOC0wNC0xNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBJbnRlZ2VyIG92ZXJmbG93IGlzc3Vlcy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTc3MzkKKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19DRUlMSU5HKTogVXNlIEZUX1BJWF9DRUlMX0xPTkcuCisKKzIwMTgtMDQtMTYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gSW50ZWdlciBvdmVyZmxvdyBpc3N1ZXMuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD03NzE4CisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTUlSUCk6IFVzZSBBRERfTE9ORy4KKworMjAxOC0wNC0xNSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2J1aWxkXSBVc2UgYGluZm8nIGZ1bmN0aW9uIG9mIG1ha2UgMy44MS4KKworCSogY29uZmlndXJlLCBkb2NzL0lOU1RBTEwsIGRvY3MvSU5TVEFMTC5DUk9TUywgZG9jcy9JTlNUQUxMLkdOVSwKKwlkb2NzL0lOU1RBTEwuVU5JWCwgZG9jcy9NQUtFUFA6IEJ1bXAgbWFrZSB2ZXJzaW9uIHJlcXVpcmVtZW50cy4KKworCSogYnVpbGRzL2RldGVjdC5tayAoc3RkX3NldHVwKTogUmVwbGFjZSBgZWNobycgd2l0aCBgaW5mbycuCisJKGRvc19zZXR1cCk6IFJlbW92ZWQuCisJKiBidWlsZHMvdW5peC9pbnN0YWxsLm1rLCBidWlsZHMvbW9kdWxlcy5taywgYnVpbGRzL2Rvcy9kZXRlY3QubWssCisJYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rLCBidWlsZHMvb3MyL2RldGVjdC5tazogVXBkYXRlZC4KKwkqIGJ1aWxkcy9uZXdsaW5lOiBObyBsb25nZXIgbmVlZGVkLgorCisyMDE4LTA0LTE1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdOiBMaW1pdCBgU0xPT1AnIGJ5dGVjb2RlIGFyZ3VtZW50IHRvIDE2IGJpdHMuCisKKwlUaGlzIGZpeGVzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTc3MDcKKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKEluc19TTE9PUCk6IERvIGl0LgorCisyMDE4LTA0LTE0ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3cgaXNzdWVzLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzY1MgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX01EQVApOiBVc2UgU1VCX0xPTkcuCisKKzIwMTgtMDQtMTQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVthdXRvZml0XSBVcGRhdGUgdG8gVW5pY29kZSAxMS4wLjAuCisKKwlCdXQgbm8gc3VwcG9ydCBuZXcgc2NyaXB0cyAodm9sdW50ZWVycyB3ZWxjb21lZCkuCisKKwkqIHNyYy9hdXRvZml0L2FmcmFuZ2VzLmMgKGFmX2FyYWJfbm9uYmFzZV91bmlyYW5nZXMsCisJYWZfYmVuZ19ub25iYXNlX3VuaXJhbmdlcywgYWZfY2FrbV9ub25iYXNlX3VuaXJhbmdlcywKKwlhZl9kZXZhX25vbmJhc2VfdW5pcmFuZ2VzLCBhZl9nZW9yX3VuaXJhbmdlcywKKwlhZl9ndWpyX25vbmJhc2VfdW5pcmFuZ2VzLCBhZl9tbHltX25vbmJhc2VfdW5pcmFuZ2VzLAorCWFmX25rb29fbm9uYmFzZV91bmlyYW5nZXMsIGFmX3RlbHVfbm9uYmFzZV91bmlyYW5nZXMsCisJYWZfaGFuaV91bmlyYW5nZXMpOiBBZGQgbmV3IGRhdGEuCisKKzIwMTgtMDQtMTAgIE5pa29sYXVzIFdheHdlaWxlciAgPG1hZGlnZW5zQGdtYWlsLmNvbT4KKworCSogQ01ha2VMaXN0cy50eHQsIGJ1aWxkcy9jbWFrZS9GaW5kSGFyZkJ1enouY21ha2U6IEV4dGVuc2l2ZQorCW1vZGVybml6YXRpb24gbWVhc3VyZXMuCisKKwlUaGlzIGJyaW5ncyB1cCB0aGUgbWluaW11bSByZXF1aXJlZCBDTWFrZSB2ZXJzaW9uIHRvIDIuOC4xMi4KKworCVRoZSBpbnN0YWxsYXRpb24gcGF0aHMgZm9sbG93IHRoZSBHTlUgZGVmYXVsdHMgbm93LCBlLmcuIGluc3RhbGxpbmcgb24gYQorCTY0IGJpdCBob3N0IHdpbGwgcGxhY2UgYmluYXJpZXMgaW50byB0aGUgbGliNjQvIGZvbGRlciBvbiBlLmcuIEZlZG9yYS4KKworCVN5bWJvbHMgYXJlIGhpZGRlbiBieSBkZWZhdWx0IChlLmcuIGAtZnZpc2liaWxpdHk9aGlkZGVuJyBvbiBHQ0MpLgorCisJQ01ha2Ugd2lsbCBubyBsb25nZXIgbG9vayBmb3IgYSBDKysgY29tcGlsZXIuCisKKwlMaWJyYXJ5IGFuZCAuc28gdmVyc2lvbiBub3cgbWF0Y2ggdGhlIEF1dG90b29scyBidWlsZC4KKworCUNvbW1lbnRzIGluIHRoZSBidWlsZCBmaWxlIGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIG5vdyB1c2UgcGxhdGZvcm0KKwlhZ25vc3RpYyBleGFtcGxlIGNvbW1hbmRzLgorCisJZnRvcHRpb24uaCBhbmQgZnRjb25maWcuaCBhcmUgd3JpdHRlbiBkaXJlY3RseSB3aXRob3V0IGEgcmVkdW5kYW50IGAtbmV3JworCWNvcHkuCisKKwlFeHRlcm5hbCBkZXBlbmRlbmNpZXMgYXJlIGV4cHJlc3NlZCBhcyBvcHRpb24oKXMgYW5kIHdpbGwgdHVybiB1cCBhcyBzdWNoCisJaW4gY21ha2UtZ3VpLgorCisJSW50ZXJuYWw6IFByb3BlcnRpZXMgc3VjaCBhcyBkZXBlbmRlbmNpZXMgYW5kIGluY2x1ZGUgZGlyZWN0b3JpZXMgYXJlIG5vdworCXByaXZhdGVseSBzZXQgb24gdGhlIGZyZWV0eXBlIGxpYnJhcnkgaW5zdGVhZCBvZiBnbG9iYWxseS4KKworCVRoZSBDUGFjayBkZWZpbml0aW9ucyBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgdGhlIGBtYWtlIGRpc3QnIGhhcyBiZWVuCisJcmVtb3ZlZC4gU291cmNlIHBhY2thZ2VzIGdlbmVyYXRlZCB3aXRoIENQYWNrIGRvbid0IGNvbnRhaW4gQXV0b3Rvb2xzCisJZmlsZXMgYW5kIGFyZW4ndCB1c2VkIGJ5IHRoZSBtYWludGFpbmVycyBhbnl3YXkuCisKKwlPbiBXaW5kb3dzLCBzcmMvYmFzZS9mdHZlci5yYyBpcyBjb21waWxlZCB0byBkZWNvcmF0ZSB0aGUgbGlicmFyeSB3aXRoCisJdmVyc2lvbiBhbmQgY29weXJpZ2h0IGluZm9ybWF0aW9uLgorCisJQSBwa2ctY29uZmlnIGZpbGUgaXMgbm93IGdlbmVyYXRlZCBhbmQgaW5zdGFsbGVkLgorCisyMDE4LTA0LTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3cgaXNzdWVzLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NzQ1MworCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoUm91bmRfU3VwZXIsIFJvdW5kX1N1cGVyXzQ1KTogVXNlCisJQUREX0xPTkcgYW5kIFNVQl9MT05HLgorCisyMDE4LTA0LTA2ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbd2luZG93cywgd2luY2VdIENsZWFuIHVwIGxlZ2FjeSBwcm9qZWN0IGZpbGVzLgorCisJKiBidWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luY2UvdmMyMDA4LWNlL2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcDogUmVtb3ZlIHBlci1maWxlIGNvbXBpbGUgZmxhZ3MuCisKKzIwMTgtMDQtMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtjZmYsIHR5cGUxXSBTYW5pdGl6ZSBgQmx1ZUZ1enonIGFuZCBgQmx1ZVNoaWZ0Jy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTczNzEKKworCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9sb2FkX3ByaXZhdGVfZGljdCk6IFNhbml0aXplCisJYHByaXYtPmJsdWVfc2hpZnQnIGFuZCBgcHJpdi0+Ymx1ZV9mdXp6JyB0byBhdm9pZCBvdmVyZmxvd3MgbGF0ZXIKKwlvbi4KKworCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9PcGVuX0ZhY2UpOiBEaXR0by4KKworMjAxOC0wNC0wNCAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwkqIHNyYy90cnVldHlwZS90dG9ianMuYyAodHJpY2tfbmFtZXMpOiBBZGQgMyB0cmlja3kgZm9udHMgKCM1MzU1NCksCisJYERGSGVpLU1kLUhLLUJGJywgYERGS2FpU2h1LU1kLUhLLUJGJyBhbmQgYERGTWluZy1CZC1ISy1CRicuCisJKHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMpOiBBZGQgY2hlY2tzdW1zIGZvciAzIHRyaWNreSBmb250cworCWluIGFib3ZlLgorCisyMDE4LTA0LTAxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIGJ1aWxkcy90b3BsZXZlbC5tayAod29yayk6IFVzZSAkKFNFUCkuCisKKwlUaGlzIGZpeGVzIHRoZSBgbWFrZSByZWZkb2MnIHVzaW5nIEN5Z3dpbjogJChDQVQpIGlzIGB0eXBlJyBvbiB0aGlzCisJcGxhdGZvcm0sIGFuZCB0aGlzIHByb2dyYW0gb25seSB1bmRlcnN0YW5kcyBiYWNrc2xhc2hlcyBpbiBwYXRocy4KKworCVJlcG9ydGVkIGJ5IE5pa2hpbCBSYW1ha3Jpc2huYW4gPHJhbWFrcmlzaG5hbi5uaWtoaWxAZ21haWwuY29tPi4KKworMjAxOC0wMy0zMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBGaXggbWVtb3J5IGxlYWsgKG9ubHkgaWYgdHJhY2luZyBpcyBvbikuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpIFtGVF9ERUJVR19MRVZFTF9UUkFDRX06IEZpeAorCWl0LgorCisyMDE4LTAzLTIzICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ29vZ2xlLmNvbT4KKworCVtzZm50XSBDb3JyZWN0bHkgaGFuZGxlIG1pc3NpbmcgYml0bWFwcyBpbiBzYml4IGZvcm1hdCAoIzUzNDA0KS4KKworCSogc3JjL3NmbnQvdHRmc2JpdC5jICh0dF9mYWNlX2xvYWRfc2JpeF9pbWFnZSk6IEZpeCByZXR1cm4gdmFsdWUuCisKKzIwMTgtMDMtMjMgIEJlbiBXYWduZXIgIDxidW5nZW1hbkBnb29nbGUuY29tPgorCisJW3RydWV0eXBlXSBGaXggYWR2YW5jZSBvZiBlbXB0eSBnbHlwaHMgaW4gYml0bWFwIGZvbnRzICgjNTMzOTMpLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0dseXBoKTogQXBwbHkgc2NhbGluZyB0byBtZXRyaWNzCisJZm9yIGVtcHR5IGJpdG1hcHMuCisKKzIwMTgtMDMtMjIgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVJlbW92ZSBgZnRsY2RmaWwuYycgYW5kIGBmdGZudGZtdC5jJyBmcm9tIGJ1aWxkIGZpbGVzICgjNTM0MTUpLgorCisJYnVpbGRzL2FtaWdhL21ha2VmaWxlLCBidWlsZHMvYW1pZ2EvbWFrZWZpbGUub3M0LAorCWJ1aWxkcy9hbWlnYS9zbWFrZWZpbGUsIGJ1aWxkcy9tYWMvRnJlZVR5cGUubTY4a19jZm0ubWFrZS50eHQsCisJYnVpbGRzL21hYy9GcmVlVHlwZS5tNjhrX2Zhci5tYWtlLnR4dCwKKwlidWlsZHMvbWFjL0ZyZWVUeXBlLnBwY19jYXJib24ubWFrZS50eHQsCisJYnVpbGRzL21hYy9GcmVlVHlwZS5wcGNfY2xhc3NpYy5tYWtlLnR4dCwKKwlidWlsZHMvc3ltYmlhbi9mcmVldHlwZS5tbXAsIGJ1aWxkcy93aW5jZS92YzIwMDUtY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiwKKwlidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvai5maWx0ZXJzLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2osIHZtc19tYWtlLmNvbTogRG8gaXQuCisKKzIwMTgtMDMtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX3ZhbGlkYXRlKTogRml4IHBvdGVudGlhbCBudW1lcmljCisJb3ZlcmZsb3cuCisKKzIwMTgtMDMtMTMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBjbWFwIGZvcm1hdCAyIGhhbmRsaW5nICgjNTMzMjApLgorCisJVGhlIHBhdGNoIGludHJvZHVjZWQgZm9yICM1MjY0NiB3YXMgbm90IGNvcnJlY3QuCisKKwkqIHNyYy9zZm50L3R0Y21hcC5jICh0dF9jbWFwMl9jaGFyX25leHQpOiBBZGp1c3QgY29uZGl0aW9uLgorCisyMDE4LTAzLTEwICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+CisKKwkqIENNYWtlTGlzdHMudHh0IChCQVNFX1NSQ1MpOiBVcGRhdGUgdG8gY2hhbmdlcyBmcm9tIDIwMTgtMDMtMDUuCisKKzIwMTgtMDMtMDkgIENodW4td2VpIEZhbiAgPGZhbmM5OTlAeWFob28uY29tLnR3PgorCisJKiBDTWFrZUxpc3RzLnR4dCBbd2luMzJdOiBBbGxvdyBNU1ZDIERMTCBidWlsZHMgKCM1MzI4NykuCisKKwlEbyBub3QgbGltaXQgRExMIGJ1aWxkcyB0byBNaW5HVywgc2luY2Ugd2UgYWxyZWFkeSBoYXZlCisJYF9fZGVjbHNwZWMoZGxsZXhwb3J0KScgZGlyZWN0aXZlcyBpbiBgZnRjb25maWcuaCcuCisJQWxzbyBzdXBwcmVzcyBtb3JlIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMuCisKKzIwMTgtMDMtMDggIEh1Z2ggTWNNYXN0ZXIgIDxodWdoLm1jbWFzdGVyQG91dGxvb2suY29tPgorCisJTWFrZSBpbnN0YWxsYXRpb24gb2YgYGZyZWV0eXBlLWNvbmZpZycgb3B0aW9uYWwgKCM1MzA5MykuCisKKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IEFkZCBvcHRpb24gYC0tZW5hYmxlLWZyZWV0eXBlLWNvbmZpZycKKwlhbmQgc2V0IGBJTlNUQUxMX0ZUMl9DT05GSUcnLgorCSogYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gKElOU1RBTExfRlQyX0NPTkZJRyk6IERlZmluZS4KKwkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBIYW5kbGUgaXQuCisKKzIwMTgtMDMtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCU1ha2UgYGZ0bGNkZmlsLmMnIHBhcnQgb2YgdGhlIGBiYXNlJyBtb2R1bGUuCisKKwlgZnRvYmpzLmMnIG5lZWRzIGBmdF9sY2RfcGFkZGluZycuCisKKwlQcm9ibGVtIHJlcG9ydGVkIGJ5IGR1aHVhbnBlbmcgPDU0ODcwODg4MEBxcS5jb20+LgorCisJKiBtb2R1bGVzLmNmZyAoQkFTRV9FWFRFTlNJT05TKTogRG9uJ3QgaW5jbHVkZSBgZnRsY2RmaWwuYycuCisKKwkqIHNyYy9iYXNlL2Z0YmFzZS5jOiBJbmNsdWRlIGBmdGxjZGZpbC5jJy4KKwkqIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyk6IEFkZCBgZnRsY2RmaWwuYycuCisJKiBzcmMvYmFzZS9KYW1maWxlIChfc291cmNlcyk6IEFkanVzdGVkLgorCisJKiBkb2NzL0lOU1RBTEwuQU5ZOiBVcGRhdGVkLgorCisyMDE4LTAzLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlNYWtlIGBmdGZudGZtdC5jJyBwYXJ0IG9mIHRoZSBgYmFzZScgbW9kdWxlLgorCisJYGZ0b2Jqcy5jJyBuZWVkcyBgRlRfR2V0X0ZvbnRfRm9ybWF0Jy4KKworCVByb2JsZW0gcmVwb3J0ZWQgYnkgZHVodWFucGVuZyA8NTQ4NzA4ODgwQHFxLmNvbT4uCisKKwkqIG1vZHVsZXMuY2ZnIChCQVNFX0VYVEVOU0lPTlMpOiBEb24ndCBpbmNsdWRlIGBmdGZudGZtdC5jJy4KKworCSogc3JjL2Jhc2UvZnRiYXNlLmM6IEluY2x1ZGUgYGZ0Zm50Zm10LmMnLgorCSogc3JjL2Jhc2UvcnVsZXMubWsgKEJBU0VfU1JDKTogQWRkIGBmdGZudGZtdC5jJy4KKwkqIHNyYy9iYXNlL0phbWZpbGUgKF9zb3VyY2VzKTogQWRqdXN0ZWQuCisKKwkqIGRvY3MvSU5TVEFMTC5BTlk6IFVwZGF0ZWQuCisKKzIwMTgtMDMtMDEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgKFRUX1J1bklucyk6IEZpeCB0cmFjaW5nIGFyZ3VtZW50cy4KKworMjAxOC0wMi0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBidWlsZHMvdW5peC9jb25maWd1cmUucmF3OiBOZWVkIEhhcmZCdXp6IDEuMy4wIG9yIG5ld2VyLgorCisJUHJvYmxlbSByZXBvcnRlZCBieSBBbGFuIENvb3BlcnNtaXRoIDxhbGFuLmNvb3BlcnNtaXRoQG9yYWNsZS5jb20+LgorCisyMDE4LTAyLTE3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbc2ZudF0gUHJlZmVyIGBDQkRUJy9gQ0JMQycgb3ZlciBgZ2x5ZicgdGFibGUgKCM1MzE1NCkuCisKKzIwMTgtMDItMDYgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gSW50ZWdlciBvdmVyZmxvdyBpc3N1ZXMuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD02MDI3CisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTVNJUlAsIEluc19NSUFQLCBJbnNfTUlSUCk6IFVzZQorCVNVQl9MT05HOyBhdm9pZCBGVF9BQlMuCisKKzIwMTgtMDItMDQgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVt1bml4XSBVc2UgLWZ2aXNpYmlsaXR5PWhpZGRlbi4KKworCUl0IGlzIG5vdyB3aWRlbHkgcmVjb21tZW5kZWQgdGhhdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBoaWRlIHN5bWJvbHMKKwlleGNlcHQgdGhvc2Ugd2l0aCBleHBsaWNpdCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKS4KKwlUaGlzIGlzIHN1cHBvcnRlZCBieSBhbGwgbWFqb3IgY29tcGlsZXJzIGFuZCBzaG91bGQgcmF0aGVyIGJlIGFuCisJb3B0aW9uIGluIGxpYnRvb2wuCisKKwkqIGJ1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXc6IEFkZCAtZnZpc2liaWxpdHk9aGlkZGVuIHRvIENGTEFHUy4KKwkqIGJ1aWxkcy91bml4L2Z0Y29uZmlnLmluLCBidWlsZHMvdm1zL2Z0Y29uZmlnLmgsCisJaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfRVhQT1JUKTogVXNlIHZpc2liaWxpdHkKKwlhdHRyaWJ1dGUuCisKKzIwMTgtMDEtMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gQmV0dGVyIHByb3RlY3Rpb24gYWdhaW5zdCBpbnZhbGlkIFZGIGRhdGEuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD01NzM5CisKKwlCdWcgaW50cm9kdWNlZCBpbiBjb21taXQgMDhjZDYyZGVlZGVmZTIxN2YyZWE1MGUzOTI5MjNjZThiNWJjN2FjNy4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfU2V0X1Zhcl9EZXNpZ24pOiBBbHdheXMgaW5pdGlhbGl6ZQorCWBub3JtYWxpemVkY29vcmRzJy4KKworMjAxOC0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX0dFVFZBUklBVElPTik6IEF2b2lkIE5VTEwgcmVmZXJlbmNlLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NTczNgorCisyMDE4LTAxLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X3NldF9tbV9ibGVuZCk6IE1pbm9yLgorCisyMDE4LTAxLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEJldHRlciB0cmFjZSBWRiBpbnN0YW5jZXMuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl90b19ub3JtYWxpemVkKTogRG9uJ3QgZW1pdCBudW1iZXIKKwlvZiBjb29yZGluYXRlcy4KKwkoVFRfR2V0X01NX1Zhcik6IFRyYWNlIGluc3RhbmNlIGluZGljZXMgbmFtZXMuCisJKFRUX1NldF9WYXJfRGVzaWduKTogVXBkYXRlZC4KKworMjAxOC0wMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBCZWF1dGlmeSB0cmFjaW5nIG9mIFZGIGF4aXMgcmVjb3Jkcy4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IFNob3cgYXhpcyByZWNvcmRzIGluIGEKKwl0YWJsZS1saWtlIG1hbm5lci4KKworMjAxOC0wMS0yNiAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbdHJ1ZXR5cGVdIEZpeCBtdWx0aXBsZSBjYWxscyBvZiBgRlRfR2V0X01NX1ZhcicgKCM1Mjk1NSkuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX0dldF9NTV9WYXIpOiBTZXQKKwlgZmFjZS0+YmxlbmQtPm51bV9heGlzJyBpbiBjYXNlIHdlIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGUKKwlgZmFjZS0+YmxlbmQnLgorCisyMDE4LTAxLTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYXBpbmFtZXNdIEFub255bW91cyB2ZXJzaW9uIG1hcCBmb3IgR05VIGxpbmtlci4KKworCSogc3JjL3Rvb2xzL2FwaW5hbWVzLmMgKFBST0dSQU1fVkVSU0lPTik6IFNldCB0byAwLjMuCisJKE91dHB1dEZvcm1hdCk6IEFkZCBgT1VUUFVUX0dOVV9WRVJNQVAnLgorCShuYW1lc19kdW1wKTogSGFuZGxlIGl0LgorCSh1c2FnZSk6IFVwZGF0ZWQuCisJKG1haW4pOiBIYW5kbGUgbmV3IGNvbW1hbmQgbGluZSBmbGFnIGAtd0wnLgorCisyMDE4LTAxLTIxICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbdW5peF0gQ2FsbCBsaWJ0b29sIHRvIGNsZWFuIHVwLgorCisJKiBidWlsZHMvdW5peC9pbnN0YWxsLm1rIChjbGVhbl9wcm9qZWN0X3VuaXgsIGRpc3RjbGVhbl9wcm9qZWN0X3VuaXgpOgorCVVzZSBsaWJ0b29sLgorCSogYnVpbGRzL2ZyZWV0eXBlLm1rOiBNaW5vci4KKworMjAxOC0wMS0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBzcmMvYmFzZS9mdHZlci5yYzogRml4IG1pbmd3LXc2NCBjb21waWxhdGlvbi4KKworMjAxOC0wMS0xOCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2J1aWxkXSBFbmFibGUgVkVSU0lPTklORk8gcmVzb3VyY2UgZm9yIEN5Z3dpbi9NaW5HVy4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdzogQ2hlY2sgZm9yIHJlc291cmNlIGNvbXBpbGVyLgorCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbjogQ29uZGl0aW9uYWxseSBzZXQgdXAgcmVzb3VyY2UgY29tcGlsZXIuCisJKiBidWlsZHMvZnJlZXR5cGUubWs6IEFkZCBjb25kaXRpb25hbCBydWxlIGZvciBgZnR2ZXIucmMnLgorCSogc3JjL2Jhc2UvZnR2ZXIucmM6IENvcHlyaWdodCBub3RpY2UgYW5kIHllYXIgdXBkYXRlLgorCisyMDE4LTAxLTE4ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYnVpbGRdIE1vdmUgVkVSU0lPTklORk8gcmVzb3VyY2UuCisKKwkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qOiBVcGRhdGVkLgorCSogYnVpbGRzL3dpbmRvd3MvZnR2ZXIucmM6IE1vdmUgZmlsZSBmcm9tIGhlcmUuLi4KKwkqIHNyYy9iYXNlL2Z0dmVyLnJjOiAuLi4gdG8gaGVyZS4KKworMjAxOC0wMS0xMiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2J1aWxkXSBFeHBhbmQgZGxsZXhwb3J0L2RsbGltcG9ydCB0byBDeWd3aW4vTWluR1cuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IFJlc3BlY3QgRExMX0VYUE9SVCwKKwlzL19NU0NfVkVSL19XSU4zMi8uCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogUmVwbGljYXRlIGhlcmUuCisJKiBidWlsZHMvdm1zL2Z0Y29uZmlnLmg6IFJlcGxpY2F0ZSBoZXJlLgorCisyMDE4LTAxLTEyICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYnVpbGRdIEltcHJvdmUgYW5kIGRvY3VtZW50IE1TVkMgYnVpbGQuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg6IEd1YXJkIGRsbGV4cG9ydC9kbGxpbXBvcnQKKwlhdHRyaWJ1dGVzIHdpdGggX0RMTCBhbmQgRlQyX0RMTElNUE9SVC4KKwkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KKworMjAxOC0wMS0xMCAgU3RldmUgUm9iaW5zb24gIDxzc3JvYmluc0BnbWFpbC5jb20+CisKKwkqIENNYWtlTGlzdHMudHh0IFt3aW4zMl06IFN1cHByZXNzIHdhcm5pbmdzIGZvciBQT1NJWCBmdW5jdGlvbnMuCisKKzIwMTgtMDEtMTAgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gQ29ycmVjdGx5IGhhbmRsZSBGbGV4IGZlYXR1cmVzICgjNTI4NDYpLgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8Y2YyX2NtZFZNT1ZFVE8sCisJY2YyX2NtZEhNT1ZFVE8+OiBEbyBub3QgbW92ZSBpZiBkb2luZyBGbGV4LgorCisyMDE4LTAxLTA5ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS5zbG46IFN5bmNocm9uaXplIHdpdGggdGhlIHByb2plY3QuCisKKzIwMTgtMDEtMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogVmVyc2lvbiAyLjkgcmVsZWFzZWQuCisJPT09PT09PT09PT09PT09PT09PT09PT0KKworCisJVGFnIHNvdXJjZXMgd2l0aCBgVkVSLTItOScuCisKKwkqIGRvY3MvVkVSU0lPTi5UWFQ6IEFkZCBlbnRyeSBmb3IgdmVyc2lvbiAyLjkuCisKKwkqIFJFQURNRSwgSmFtZmlsZSAoUmVmRG9jKSwgYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiwKKwlidWlsZHMvd2luZG93cy92YzIwMDUvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAwOC9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuZHNwLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbCwKKwlidWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AsCisJYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2luZGV4Lmh0bWwsCisJYnVpbGRzL3dpbmRvd3MvZnR2ZXIucmMsCisJYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2osCisJYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sLAorCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qLAorCWJ1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbDogcy8yLjguMS8yLjkvLCBzLzI4MS8yOS8uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlJFRVRZUEVfTUlOT1IpOiBTZXQgdG8gOS4KKwkoRlJFRVRZUEVfUEFUQ0gpOiBTZXQgdG8gMC4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAodmVyc2lvbl9pbmZvKTogU2V0IHRvIDIyOjA6MTYuCisJKiBDTWFrZUxpc3RzLnR4dCAoVkVSU0lPTl9QQVRDSCk6IFNldCB0byAwLgorCisyMDE4LTAxLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlBZGQgY2hlY2sgZm9yIGxpYnJ0LCBuZWVkZWQgZm9yIGBmdGJlbmNoJyAoIzUyODI0KS4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAoTElCX0NMT0NLX0dFVFRJTUUpOiBEZWZpbmU7IHRoaXMgd2lsbAorCWhvbGQgYC1scnQnIGlmIG5lY2Vzc2FyeS4KKworCSogYnVpbGRzL3VuaXgvdW5peC1jYy5pbiAoTElCX0NMT0NLX0dFVFRJTUUpOiBOZXcgdmFyaWFibGUuCisKKzIwMTgtMDEtMDcgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRml4IFR5cGUgMSBnbHlwaHMgd2l0aCB0b28gbWFueSBzdGVtIGhpbnRzLgorCisJQWNjb3JkaW5nIHRvIHRoZSBDRkYgc3BlY2lmaWNhdGlvbiwgY2hhcnN0cmluZ3MgY2FuIGhhdmUgdXAgdG8gOTYgc3RlbQorCWhpbnRzLiBEdWUgdG8gaGludCByZXBsYWNlbWVudCByb3V0aW5lcyBpbiBUeXBlIDEgY2hhcnN0cmluZ3MsIHNvbWUKKwlnbHlwaHMgYXJlIHJlamVjdGVkIGJ5IHRoZSBBZG9iZSBlbmdpbmUsIHdoaWNoIGltcGxlbWVudHMgdGhlIGFib3ZlCisJbGltaXQuIFRoaXMgZml4IHR1cm5zIG9mZiBoaW50aW5nIGZvciBzdWNoIGdseXBocy4KKworCSogc3JjL3BzYXV4L3BzaGludHMuYyAoY2YyX2hpbnRtYXBfYnVpbGQpOiBSZXNldCB0aGUgZXJyb3IgZnJvbSBjYWxsaW5nCisJYGNmMl9oaW50bWFza19zZXRBbGwnIG9uIGEgcHJvYmxlbWF0aWMgVHlwZSAxIGNoYXJzdHJpbmcgYW5kIHR1cm4gb2ZmCisJaGludGluZy4KKworMjAxOC0wMS0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJQWRkIGBGVF9Eb25lX01NX1ZhcicuCisKKwlUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBhcHBsaWNhdGlvbidzIG1lbW9yeSByb3V0aW5lcyBkaWZmZXIKKwlmcm9tIEZyZWVUeXBlLiAgQSB0eXBpY2FsIGV4YW1wbGUgaXMgYSBQeXRob24gYXBwbGljYXRpb24gb24gV2luZG93cworCXRoYXQgY2FsbHMgRnJlZVR5cGUgY29tcGlsZWQgYXMgYSBETEwgdmlhIHRoZSBgY3R5cGVzJyBpbnRlcmZhY2UuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRtbS5oLCBzcmMvYmFzZS9mdG1tLmMgKEZUX0RvbmVfTU1fVmFyKTogRGVjbGFyZQorCWFuZCBkZWZpbmUuCisKKwkqIGRvY3MvQ0hBTkdFUzogVXBkYXRlZC4KKworMjAxOC0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBSb3VuZCBvZmZzZXRzIG9mIGdseXBoIGNvbXBvbmVudHMgb25seSBpZiBoaW50aW5nIGlzIG9uLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQpOiBJbXBsZW1lbnQKKwlpdC4KKworMjAxOC0wMS0wMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChmdF92YXJfdG9fZGVzaWduKTogUmVtb3ZlIGRlYWQgY29kZS4KKworCVRoaXMgaXMgYSBiZXR0ZXIgZml4IHRoYW4gdGhlIHByZXZpb3VzIGNvbW1pdCwgd2hpY2ggaXMgbm93CisJcmV2ZXJ0ZWQuCisKKzIwMTgtMDEtMDMgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCU1vdmUgaW50ZXJuYWwgTENELXJlbGF0ZWQgZGVjbGFyYXRpb25zLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmggKGZ0X2xjZF9wYWRkaW5nLCBmdF9sY2RfZmlsdGVyX2Zpcik6CisJTW92ZSBmcm9tIGhlcmUuLi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IC4uLiB0byBoZXJlLgorCisyMDE4LTAxLTAzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX0VYUE9SVCwgRlRfRVhQT1JUX0RFRikKKwlbX01TQ19WRVJdOiBMaW1pdCBWaXN1YWwgQysrIGF0dHJpYnV0ZXMuCisKKzIwMTgtMDEtMDMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gTWFrZSBibGVuZC9kZXNpZ24gY29vcmRpbmF0ZSByb3VuZC10cmlwcGluZyB3b3JrLgorCisJQmVoZGFkIHJlcG9ydGVkIHRoYXQgc2V0dGluZyBibGVuZCBjb29yZGluYXRlcywgdGhlbiBnZXR0aW5nIGRlc2lnbgorCWNvb3JkaW5hdGVzIGRpZCBpbmNvcnJlY3RseSByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UncworCWNvb3JkaW5hdGVzLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9zZXRfbW1fYmxlbmQpOiBGaXggaXQuCisKKzIwMTctMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3NmbnQvdHRjbWFwLmMgKHR0X2NtYXAyX2NoYXJfbmV4dCk6IEZpeCBlbmRsZXNzIGxvb3AuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD00ODM4CisKKzIwMTctMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVN5bmNocm9uaXplIG90aGVyIFdpbmRvd3MgcHJvamVjdCBmaWxlcy4KKworCSogYnVpbGRzL3dpbmRvd3MvKjogQWRkIG1pc3NpbmcgZmlsZXMuCisKKzIwMTctMTItMzEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVVwZGF0ZSBWaXN1YWwgQyAyMDEwIHByb2plY3QgZmlsZXMuCisKKwlQcm9ibGVtIHJlcG9ydGVkIGJ5IEhpbi1UYWsuCisKKwkqIGJ1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qOiBBZGQgZmlsZXMgYGZ0YmRmLmMnIGFuZAorCWBmdGNpZC5jJy4KKwlTb3J0IGVudHJpZXMuCisJKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvai5maWx0ZXI6IERpdHRvLgorCUZpeCBtZW1iZXJzIG9mIGBGVF9NT0RVTEUnIGdyb3VwLgorCisyMDE3LTEyLTMwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIGJ1aWxkcy92bXMvZnRjb25maWcuaDogU3luY2hyb25pemUgd2l0aCB1bml4IGBmdGNvbmZpZy5pbicgZmlsZS4KKworMjAxNy0xMi0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBidWlsZHMvdW5peC9mdGNvbmZpZy5pbjogU3luY2hyb25pemUgd2l0aCBtYWluIGBmdGNvbmZpZy5oJyBmaWxlLgorCisJUmVwb3J0ZWQgYnkgTmlrb2xhdXMuCisKKzIwMTctMTItMjcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBjb21waWxlciB3YXJuaW5ncy4KKworCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIpOiBNYWtlIGBwaXRjaCcgYW5kCisJYG5ld19waXRjaCcgdW5zaWduZWQuCisKKwkqIHNyYy9iYXNlL2Z0cHNwcm9wLmM6IEluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9QUk9QU19ILgorCisyMDE3LTEyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXhlcyBmb3IgYG1ha2UgbXVsdGknLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cHNwcm9wLmg6IFVzZSBgRlRfQkFTRV9DQUxMQkFDSycuCisJKHBzX3Byb3BlcnR5X2dldCk6IEhhcm1vbml6ZSBkZWNsYXJhdGlvbiB3aXRoIGNvcnJlc3BvbmRpbmcKKwlmdW5jdGlvbiB0eXBlZGVmLgorCisJKiBpbmNsdWRlL2ZyZWV0eVtlL2ludGVybmFsL2Z0dHJhY2UuaDogQWRkIGB0cmFjZV9wc3Byb3BzJy4KKworCSogc3JjL2Jhc2UvZnRwc3Byb3AuYzogSW5jbHVkZSBuZWNlc3NhcnkgaGVhZGVyIGZpbGVzLgorCShGVF9DT01QT05FTlQpOiBEZWZpbmUuCisJKHBzX3Byb3BlcnR5X3NldCk6IFRhZyB3aXRoIGBGVF9CQVNFX0NBTExCQUNLX0RFRicuCisJKHBzX3Byb3BlcnR5X2dldCk6IFRhZyB3aXRoIGBGVF9CQVNFX0NBTExCQUNLX0RFRicuCisJSGFybW9uaXplIGRlY2xhcmF0aW9uIHdpdGggY29ycmVzcG9uZGluZyBmdW5jdGlvbiB0eXBlZGVmLgorCisyMDE3LTEyLTI3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlQcm92aWRlIHN1cHBvcnQgZm9yIGludHJhLW1vZHVsZSBjYWxsYmFjayBmdW5jdGlvbnMuCisKKwlUaGlzIGlzIG5lZWRlZCBlc3BlY2lhbGx5IGZvciBgbWFrZSBtdWx0aScgd2l0aCBDKysuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmggKEZUX0JBU0VfQ0FMTEJBQ0ssCisJRlRfQkFTRV9DQUxMQkFDS19ERUYpOiBOZXcgbWFjcm9zLgorCisyMDE3LTEyLTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlNb3ZlIFBvc3RTY3JpcHQgZHJpdmVycycgcHJvcGVydHkgaGFuZGxlcnMgdG8gYGJhc2UnLgorCisJVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgZHVwbGljYXRlZCBjb2RlIGFjcm9zcyBQb3N0U2NyaXB0CisJZHJpdmVycy4KKworCSogc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2lkL2NpZHJpdmVyLmMsIHNyYy90eXBlMS90MWRyaXZlci5jCisJKHtjZmYsY2lkLHQxfV9wcm9wZXJ0eV97Z2V0LHNldH0pOiBNb3ZlZCB0by4uLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oOiAuLi50aGlzIG5ldyBmaWxlLgorCShwc19wcm9wZXJ0eV97Z2V0LHNldH0pOiBOZXcgZnVuY3Rpb25zIHRvIHJlcGxhY2UgbW92ZWQgb25lcy4KKworCSogc3JjL2Jhc2UvZnRwc3Byb3AuYzogTmV3IGZpbGUgdGhhdCBpbXBsZW1lbnRzIGFib3ZlIGZ1bmN0aW9ucy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oCisJKEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfUFJPUFNfSCk6IE5ldyBtYWNyby4KKworCSogc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2lkL2NpZHJpdmVyLmMsIHNyYy90eXBlMS90MWRyaXZlci5jOgorCVVwZGF0ZWQuCisKKwkqIHNyYy9iYXNlL0phbWZpbGUsIHNyYy9iYXNlL3J1bGVzLm1rIChCQVNFX1NSQyksIHNyYy9iYXNlL2Z0YmFzZS5jOgorCVVwZGF0ZWQuCisKKzIwMTctMTItMjAgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVNwZWVkIHVwIEZUX1NldF9WYXJfe0Rlc2lnbixCbGVuZH1fQ29vcmRpbmF0ZXMgaWYgY3VyciA9PSBuZXcuCisKKwlXZSBleGl0IGVhcmx5IGlmIHRoZSBjdXJyZW50IGRlc2lnbiBvciBibGVuZCBjb29yZGluYXRlcyBhcmUKKwlpZGVudGljYWwgdG8gdGhlIG5ldyBvbmVzLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jICh0dF9zZXRfbW1fYmxlbmQsIFRUX1NldF9WYXJfRGVzaWduKToKKwlJbXBsZW1lbnQgaXQsIHJldHVybmluZyBpbnRlcm5hbCBlcnJvciBjb2RlIC0xIGlmIHRoZXJlIHdpbGwgYmUgbm8KKwl2YXJpYXRpb24gY2hhbmdlLgorCisJKiBzcmMvdHlwZTEvdDFsb2FkLmMgKHQxX3NldF9tbV9ibGVuZCk6IERpdHRvLgorCisJKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzLAorCUZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcywgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyk6IFVwZGF0ZWQuCisKKzIwMTctMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtzZm50XSBGaXggY2hhcm1hcCB0eXBlIDIgaXRlcmF0b3IgKCM1MjY0NikuCisKKwlUaGUgc3Vic2V0dGVkIGRlbW8gZm9udCBvZiB0aGUgcmVwb3J0IHRoYXQgZXhoaWJpdHMgdGhlIGJ1ZyBoYXMgYQorCXZlcnkgdW51c3VhbCB0eXBlIDIgY21hcCBmb3IgVW5pY29kZSghKTogSXQgY29udGFpbnMgb25seSB0d28KKwlzdWItaGVhZGVycywgb25lIGZvciBvbmUtYnl0ZSBjaGFyYWN0ZXJzIChjb3ZlcmluZyB0aGUgcmFuZ2UgMHgyMCB0bworCTB4RkEpLCBhbmQgYSBzZWNvbmQgb25lIGZvciBoaWdoZXIgYnl0ZSAweDAxIChqdXN0IGZvciBjaGFyYWN0ZXIKKwljb2RlIFUrMDEzMSkuCisKKwlCZWZvcmUgdGhpcyBjb21taXQsIHRoZSBpdGVyYXRvciB3YXNuJ3QgYWJsZSB0byBjb3JyZWN0bHkgaGFuZGxlIGEKKwlzdWItaGVhZGVyIGZvciBoaWdoZXIgYnl0ZSAweDAxLgorCisJKiBzcmMvc2ZudC90dGNtYXAuYyAodHRfY21hcDJfY2hhcl9uZXh0KTogRml4IGNoYXJhY3RlciBpbmNyZW1lbnQKKwlmb3Igb3V0ZXIgbG9vcC4KKworMjAxNy0xMi0xOCAgTWF0dGhpYXMgQ2xhc2VuICA8bWF0dGhpYXMuY2xhc2VuQGdtYWlsLmNvbT4KKworCVt0cnVldHlwZV0gRml4IGNsYW1waW5nLCBtaW5vciB0cmFjaW5nIGNvZGUgYmVhdXRpZmljYXRpb24uCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKGZ0X3Zhcl90b19ub3JtYWxpemVkKTogVHJhY2UgbnVtYmVyIG9mCisJZGVzaWduIGNvb3JkaW5hdGVzLgorCVVzZSBjbGFtcGVkIHZhbHVlLgorCisyMDE3LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy8qLyo6IE9ubHkgdXNlIGBmdF8nIGFuZCBgRlRfJyB2YXJpYW50cyBvZiBzdGRjIGxpYnJhcnkgc3R1ZmYuCisKKzIwMTctMTItMTggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfZmFjZV92YXJ5X2N2dCk6IEFkZCBzaXplIGd1YXJkICgjNTI2ODgpLgorCisyMDE3LTEyLTE4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEZpeCBwcmV2aW91cyBjb21taXQuCisKKwkqIHNyYy90cnVldHlwZS90dGdsb2FkLmMgKFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoKTogQ29ycmVjdGx5IGhhbmRsZQorCXVuaGludGVkIHBoYW50b20gcG9pbnRzLCB3aGljaCBtdXN0IGJlIHByb3Blcmx5IHNjYWxlZC4KKworMjAxNy0xMi0xOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBEb24ndCBhcHBseSBIVkFSIGFuZCBWVkFSIGRlbHRhcyB0d2ljZSAoIzUyNjgzKS4KKworCSogc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyAoVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgpOiBBbHdheXMgYWRqdXN0CisJYHBwMScgdG8gYHBwNCcsIGV4Y2VwdCBpZiB3ZSBoYXZlIGFuIEhWQVIgYW5kL29yIFZWQVIgdGFibGUuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKTogSGFuZGxlCisJYWx0ZXJuYXRpdmUgY29kZSBicmFuY2ggaWRlbnRpY2FsbHkgdy5yLnQuIHByZXNlbmNlIG9mIGFuIEhWQVIKKwlhbmQvb3IgVlZBUiB0YWJsZS4KKworMjAxNy0xMi0xNyAgSm9uYXRoYW4gS2V3ICA8amZrdGhhbWVAZ21haWwuY29tPgorCisJW3RydWV0eXBlXSBDb3JyZWN0bHkgaGFuZGxlIHZhcmlhdGlvbiBmb250IHBoYW50b20gcG9pbnRzICgjNTI2ODMpLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyk6IEZpeCBwaGFudG9tCisJcG9pbnQgaW5kaWNlcy4KKworMjAxNy0xMi0xNyAgSm9uYXRoYW4gS2V3ICA8amZrdGhhbWVAZ21haWwuY29tPgorCisJRml4IGluY29ycmVjdCBhZHZhbmNlIHdpZHRoIHNjYWxpbmcgKCM1MjY4MykuCisKKwkqIHNyYy9iYXNlL2Z0YWR2YW5jZS5jIChGVF9HZXRfQWR2YW5jZXMpOiBBbHdheXMgcmVzcGVjdCB0aGUKKwlGVF9MT0FEX05PX1NDQUxFIGZsYWcgaWYgcHJlc2VudC4KKworMjAxNy0xMi0xNiAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogQWZ0ZXJCdWlsZCBjb3B5LgorCSogb2Jqcy8uZ2l0aWdub3JlOiBJZ25vcmUgYWxtb3N0IGV2ZXJ5dGhpbmcuCisKKzIwMTctMTItMTEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBjb21waWxlciB3YXJuaW5nICgjNTI2NDApLgorCisJKiBzcmMvYmFzZS9mdGJpdG1hcC5jIChmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlcik6IFJlbW92ZSB1bnVzZWQKKwl2YXJpYWJsZS4KKworMjAxNy0xMi0wOCAgQXp6dXJvICA8YXp6dXJvQHRlYW0tbWVkaWFwb3J0YWwuY29tPgorCisJKiBidWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvajogQWRqdXN0IG91dHB1dCBkaXJlY3RvcnkuCisKKwlUaGlzIGFsbG93cyBidWlsZHMgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbnMgaW4gcGFyYWxsZWwuCisKKzIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBgbWFrZSBzZXR1cCBkb3MnLCBzZWNvbmQgdHJ5ICgjNTI2MjIpLgorCisJKiBidWlsZHMvZGV0ZWN0Lm1rIChkb3Nfc2V0dXApOiBEb24ndCB1c2UgbGl0ZXJhbCBgPicgY2hhcmFjdGVyIGF0CisJYWxsLiAgTWl4aW5nIHRoZSBkaWZmZXJlbnQgZXNjYXBpbmcgcnVsZXMgZnJvbSBtYWtlLCBkb3MsIGFuZAorCXdpbmRvd3MgaXMgdG9vIGZyYWdpbGUuCisKKzIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtkb2NtYWtlcl0gRml4IGNvZGUgc2VjdGlvbiBwYXJzaW5nLgorCisJU3R1ZmYgbGlrZQorCisJICB7CisJICAgIDxibGE+CisJICB9CisKKwljb25mdXNlZCB0aGUgcGFyc2VyLCB3aGljaCBpbmNvcnJlY3RseSB0cmVhdGVkIGA8YmxhPicgYXMgYSBtYXJrdXAKKwl0YWcuCisKKwkqIHNyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5IChDb250ZW50UHJvY2Vzc29yOjpwcm9jZXNzX2NvbnRlbnQpOgorCUFwcGx5IGByZV9tYXJrdXBfdGFncycgb25seSBvdXRzaWRlIG9mIGNvZGUgc2VjdGlvbnMuCisKKzIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCU5ldyBgZnRkcml2ZXIuaCcgZmlsZSwgY292ZXJpbmcgYWxsIGRyaXZlciBtb2R1bGVzLgorCisJVGhpcyByZWR1Y2VzIHJlZHVuZGFuY3kgYW5kIGluY3JlYXNlcyBzeW5lcmd5OyBpdCBhbHNvIHJlZHVjZXMgdGhlCisJbnVtYmVyIG9mIGhlYWRlciBmaWxlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfRFJJVkVSX0gpOiBOZXcgbWFjcm8uCisJKEZUX0FVVE9ISU5URVJfSCwgRlRfQ0ZGX0RSSVZFUl9ILCBGVF9UUlVFVFlQRV9EUklWRVJfSCwKKwlGVF9QQ0ZfRFJJVkVSX0gsIEZUX1RZUEUxX0RSSVZFUl9IKTogTWFrZSB0aGVtIGFsaWFzZXMgdG8KKwlGVF9EUklWRVJfSC4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdGF1dG9oLmgsIGluY2x1ZGUvZnJlZXR5cGUvZnRjZmZkcnYuaCwKKwlpbmNsdWRlL2ZyZWV0eXBlL2Z0cGNmZHJ2LmgsIGluY2x1ZGUvZnJlZXR5cGUvZnR0MWRydi5oLAorCWluY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oOiBSZXBsYWNlZCB3aXRoLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0ZHJpdmVyLmg6IC4uLnRoaXMgbmV3IGZpbGUuCisJKEZUX0NGRl9ISU5USU5HX0FET0JFLCBGVF9UMV9ISU5USU5HX0FET0JFKTogUmVuYW1lZCB0by4uLgorCShGVF9ISU5USU5HX0FET0JFKTogLi4uIHRoaXMgbmV3IG1hY3JvLgorCShGVF9DRkZfSElOVElOR19GUkVFVFlQRSwgRlRfVDFfSElOVElOR19GUkVFVFlQRSk6IFJlbmFtZWQgdG8uLi4KKwkoRlRfSElOVElOR19GUkVFVFlQRSk6IC4uLiB0aGlzIG5ldyBtYWNyby4KKworCSogc3JjLyovKjogVXBkYXRlZCBhY2NvcmRpbmdseS4KKworMjAxNy0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJTW92ZSBgZnRkcml2ZXIuaCcgdG8gYGZ0ZHJ2LmgnLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJpdmVyLmg6IFJlbmFtZWQgdG8uLi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcnYuaDogLi4uIHRoaXMgbmFtZS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oIChGVF9JTlRFUk5BTF9EUklWRVJfSCk6CisJVXBkYXRlZC4KKworMjAxNy0xMi0wOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IGFjY2VzcyB0byB1bmluaXRhbGl6ZWQgbWVtb3J5ICgjNTI2MTMpLgorCisJQWxzbyByZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD03OTEzMTcKKworCSogc3JjL2Jhc2UvZnRiaXRtYXAuYyAoZnRfYml0bWFwX2Fzc3VyZV9idWZmZXIpOiBJZiBpbmNyZWFzaW5nIHRoZQorCWJpdG1hcCBzaXplIG5lZWRzIGEgbGFyZ2VyIGJpdG1hcCBidWZmZXIsIGFzc3VyZSB0aGF0IHRoZSBuZXcgbWVtb3J5CisJYXJlYXMgYXJlIGluaXRpYWxpemVkIGFsc28uCisKKzIwMTctMTItMDggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBgbWFrZSBzZXR1cCBkb3MnICgjNTI2MjIpLgorCisJKiBidWlsZHMvZGV0ZWN0Lm1rIChkb3Nfc2V0dXApOiBQcm9wZXJseSBlc2NhcGUgbGl0ZXJhbCBgPicKKwljaGFyYWN0ZXIuCisKKzIwMTctMTItMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUZpeCBDKysgY29tcGlsYXRpb24uCisKKwkqIHNyYy9wc2F1eC9wc2F1eG1vZC5oOiBVc2UgRlRfQ0FMTEJBQ0tfVEFCTEUgbWFjcm8gd2hlcmUgbmVjZXNzYXJ5LgorCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IEZpeCB3YXJuaW5nLgorCisyMDE3LTEyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlGaXggYG1ha2UgbXVsdGknLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaDogUmVtb3ZlIHVudXNlZCB0cmFjaW5nIG1hY3Jvcy4KKwlzL3BzaGFsZ28yL3BzaGFsZ28vLgorCUFkZCBgdHJhY2VfY2ZmZGVjb2RlJy4KKwkqIHNyYy9wc2hpbnRlci9wc2hhbGdvLmMgKEZUX0NPTVBPTkVOVCk6IFVwZGF0ZWQuCisKKwkqIHNyYy9jZmYvY2ZmbG9hZC5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0guCisJKiBzcmMvY2ZmL2NmZm9ianMuYzogSW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19IIGFuZAorCUZUX1NFUlZJQ0VfQ0ZGX1RBQkxFX0xPQURfSC4KKworCSogc3JjL2NpZC9jaWRyaXZlci5jOiBJbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0guCisKKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuYzogSW5jbHVkZSBGVF9GUkVFVFlQRV9IIGFuZAorCUZUX0lOVEVSTkFMX0RFQlVHX0guCisJKEZUX0NPTVBPTkVOVCk6IERlZmluZS4KKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuaDogSW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ILgorCSogc3JjL3BzYXV4L3BzYXV4bW9kLmg6IEluY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSC4KKwlEZWNsYXJlIGBjZmZfYnVpbGRlcl9mdW5jcycgYW5kIGBwc19idWlsZGVyX2Z1bmNzJy4KKwkqIHNyYy9wc2F1eC9wc2Z0LmM6IEluY2x1ZGUgYHBzb2Jqcy5oJyBhbmQgYGNmZmRlY29kZS5oJy4KKwkqIHNyYy9wc2F1eC9wc29ianMuYyA6IEluY2x1ZGUgYHBzYXV4bW9kLmgnLgorCisyMDE3LTEyLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg6IFNvbWUgY2xlYW4tdXAuCisKKwlUaGlzIGNvbW1pdCByZW1vdmVzIGRvY3VtZW50YXRpb24gb2YgZGVwcmVjYXRlZCBtYWNyb3MgYW5kIGRvZXMgc29tZQorCW1pbm9yIHN0cmVhbWxpbmluZy4KKworMjAxNy0xMi0wNiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBidWlsZHMvc3ltYmlhbi9ibGQuaW5mOiBVcGRhdGVkLgorCisyMDE3LTEyLTA2ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlOZXcgaGVhZGVyIGZpbGUgYGZ0cGFyYW1zLmgnIHRoYXQgY29sbGVjdHMgYWxsIHBhcmFtZXRlciB0YWdzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oIChGVF9QQVJBTUVURVJfVEFHU19IKTogTmV3CisJbWFjcm8uCisJKEZUX1RSVUVUWVBFX1VOUEFURU5URURfSCwgRlRfVU5QQVRFTlRFRF9ISU5USU5HX0gpOiBEZWZpbmUgaXQgdG8KKwlgZnRwYXJhbXMuaCcuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmgsCisJaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgsCisJaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oLCBpbmNsdWRlL2ZyZWV0eXBlL2Z0dDFkcnYuaDogSW5jbHVkZQorCUZUX1BBUkFNRVRFUl9UQUdTX0guCisJTW92ZSBGVF9QQVJBTV9UQUdfWFhYIGRlZmluaXRpb25zIHRvLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0cGFyYW1zLmg6IC4uLnRoaXMgbmV3IGZpbGUuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvdHR1bnBhdC5oOiBSZW1vdmUuICBObyBsb25nZXIgbmVlZGVkLgorCisyMDE3LTEyLTA1ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlJbXByb3ZlIHRyYWNpbmcgbWVzc2FnZXMgYnkgdXNpbmcgc2luZ3VsYXIgYW5kIHBsdXJhbCBmb3Jtcy4KKworCSogc3JjLyovKi5jOiBJbXBsZW1lbnQgaXQuCisKKzIwMTctMTItMDQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gQWxsb3cgc2hhcmVkIHBvaW50cyBpbiBgY3ZhcicgdGFibGUgKCM1MjUzMikuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKHR0X2ZhY2VfdmFyeV9jdnQpOiBJbXBsZW1lbnQgaXQgYnkgY29weWluZworCWFuZCBhZGp1c3RpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBmcm9tCisJYFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzJy4KKworMjAxNy0xMS0yOCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3RydWV0eXBlXSBJbXByb3ZpbmcgdHJhY2luZyBvZiBjb21wb3NpdGUgZ2x5cGhzLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jIChUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCkKKwlbRlRfREVCVUdfTEVWRUxfVFJBQ0VdOiBTaG93IGNvbXBvc2l0ZSBnbHlwaCBpbmZvcm1hdGlvbi4KKworMjAxNy0xMS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3R5cGUxXSBBbGxvdyAoYWdhaW4pIGAvRW5jb2RpbmcnIHdpdGggPjI1NiBlbGVtZW50cyAoIzUyNDY0KS4KKworCUluIHZlcnNpb24gMi42LjEsIHRoaXMgaGFzIGJlZW4gZGlzYWxsb3dlZCB0byBiZXR0ZXIgcmVqZWN0CisJbWFsZm9ybWVkIGZvbnRzOyBob3dldmVyLCB0aGlzIHJlc3RyaWN0aW9uIHdhcyB0b28gc3Ryb25nLiAgVGhpcworCXRpbWUsIHdlIG9ubHkgdGFrZSB0aGUgZmlyc3QgMjU2IGVsZW1lbnRzIGludG8gYWNjb3VudCwgc2luY2UKKwllbmNvZGluZyBhcnJheXMgYXJlIGFsd2F5cyBhY2Nlc3NlZCB3aXRoIGEgOGJpdCBpbnRlZ2VyLCBhY2NvcmRpbmcKKwl0byB0aGUgUG9zdFNjcmlwdCBMYW5ndWFnZSBSZWZlcmVuY2UuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZW5jb2RpbmcpOiBJbXBsZW1lbnQgaXQuCisKKzIwMTctMTEtMjcgIEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgIDxqYW4uc3RlZmZlbnNAZ21haWwuY29tPgorCisJRml4IGxhc3QgY29tbWl0ICgjNTI1MjIpLgorCisJKiBidWlsZHMvZnJlZXR5cGUubWs6IFNldCBgRlRfT1BUSU9OX0gnIGFuZCBgRlRPUFRJT05fRkxBRycKKwlwcm9wZXJseSBpZiB3ZSBoYXZlIGBmdG9wdGlvbi5oJyBpbiBgQlVJTERfRElSJy4KKworMjAxNy0xMS0yNCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3VuaXhdIEluc3RhbGwgYSBtYXNzYWdlZCBgZnRvcHRpb24uaCcgZmlsZSAoIzUxNzgwKS4KKworCSogYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyAoZnRvcHRpb25fc2V0LCBmdG9wdGlvbl91bnNldCk6IE5ldworCWF1eGlsaWFyeSBmdW5jdGlvbnMgdG8gY29uc3RydWN0Li4uCisJKEZUT1BUSU9OX0hfU0VEKTogLi4uIHRoaXMgbmV3IHZhcmlhYmxlLgorCUFwcGx5IGl0IGFzIGEgc2VkIGFyZ3VtZW50IHdoaWxlIGNvcHlpbmcgYGZ0b3B0aW9uLmgnIHRvIHRoZQorCWBidWlsZHMvdW5peCcgZGlyZWN0b3J5ICh1c2luZyBgQUNfQ09ORklHX0ZJTEVTJykuCisJU2ltcGxpZnkgY29kZSBvZiB0ZXN0IHRoYXQgY2hlY2tzIGNwcCdzIGNvbXB1dGF0aW9uIG9mIGJpdCBsZW5ndGgKKwkodGhlIHRlc3QgcHJldmlvdXNseSBjcmVhdGVkIGFuIGVtcHR5IGBmdG9wdGlvbi5oJyBmaWxlIGFuZCBkZWxldGVkCisJaXQgaW1tZWRpYXRlbHkgYWZ0ZXJ3YXJkcyk7IHdpdGhvdXQgdGhpcyBjaGFuZ2UsIGl0IGNhbiBoYXBwZW4gb24gbXkKKwlHTlUvTGludXggYm94IHRoYXQgYGNvbmZpZ3VyZSdzIGV4ZWN1dGlvbiBvZiBgY29uZmlnLnN0YXR1cycgZG9lc24ndAorCWNyZWF0ZSBgZnRvcHRpb24uaCcgKG5vIGlkZWEgd2h5IHRoaXMgaGFwcGVucykuCisKKwkqIGJ1aWxkcy91bml4L2luc3RhbGwubWsgKGluc3RhbGwpOiBJbnN0YWxsCisJYGJ1aWxkcy91bml4L2Z0b3B0aW9uLmgnLgorCisJKiBidWlsZHMvdW5peC91bml4LWRlZi5pbiAoRElTVENMRUFOKTogVXBkYXRlZC4KKworCSogYnVpbGRzL3VuaXgvLmdpdGlnbm9yZTogVXBkYXRlZC4KKworMjAxNy0xMS0yMyAgVG9yIEFuZGVyc3NvbiAgPHRvci5hbmRlcnNzb25AYXJ0aWZleC5jb20+CisKKwlTaWxlbmNlIHVudXNlZCBmdW5jdGlvbiB3YXJuaW5ncyAoIzUyNDY1KS4KKworCVNvbWUgc3RhdGljIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYXVzZSB1bnVzZWQgZnVuY3Rpb24gd2FybmluZ3MgaWYKKwljZXJ0YWluIGNvbmZpZyBvcHRpb25zIGFyZSB0dXJuZWQgb2ZmIHZpYSBgZnRvcHRpb24uaCcuCisKKwkqIHNyYy9iYXNlL2Z0YmFzZS5oLCBzcmMvYmFzZS9mdHJmb3JrLmMsIHNyYy9zZm50L3R0YmRmLmgsCisJc3JjL3RydWV0eXBlL3R0Z3h2YXIuaDogQWRkICNpZmRlZiBndWFyZHMgYXJvdW5kIHRoZXNlIHNlY3Rpb25zLgorCisyMDE3LTExLTIyICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9zZXRHbHlwaFdpZHRoKTogQ2hlY2sgZm9ybWF0IGJlZm9yZSBzZXR0aW5nLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9NDM3NworCisyMDE3LTExLTIyICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEZpeCBDRkYgYWR2YW5jZSB3aWR0aHMuICgjNTI0NjYpCisKKwlHbHlwaCBhZHZhbmNlIHdpZHRocyB3ZXJlIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIG5ldyBgUFNfRGVjb2RlcicgYnV0IG5vdAorCXNhdmVkIHRvIHRoZSB1bmRlcmx5aW5nIGZvcm1hdCBzcGVjaWZpYyBkZWNvZGVyLiBUaGlzIGNhdXNlZCBwdXJlIENGRgorCWZvbnRzIHRvIGhhdmUgYmFkIGFkdmFuY2Ugd2lkdGguCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfRGVjb2Rlcik6IENoYW5nZSBgZ2x5cGhfd2lkdGgnCisJZmllbGQgdG8gcG9pbnRlci4KKwlSZW1vdmUgdW51c2VkIGZpZWxkcy4KKwkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfZGVjb2Rlcl9pbml0KTogQ2hhbmdlIGBnbHlwaF93aWR0aCcgZnJvbSBjb3B5CisJdG8gcmVmZXJlbmNlLgorCVJlbW92ZSB1bnVzZWQuCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfc2V0R2x5cGhXaWR0aCk6IFVwZGF0ZSBjb2RlLgorCisyMDE3LTExLTE1ICBWbGFkIFRzeXJrbGV2aWNoICA8dnRzeXJrbGV2aWNoQGdvb2dsZS5jb20+CisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaDogRml4IGBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jJyB0eXBlLgorCisyMDE3LTExLTE0ICBOaWtvbGF1cyBXYXh3ZWlsZXIgIDxtYWRpZ2Vuc0BnbWFpbC5jb20+CisKKwlVc2UgQWRvYmUgaGludGluZyBlbmdpbmUgZm9yIGBsaWdodCcgaGludGluZyBvZiBib3RoIENGRiBhbmQgVHlwZSAxLgorCisJU2luY2UgRXdhbGQgSGV3IGZhY3RvcmVkIHRoZSBBZG9iZSBoaW50aW5nIGVuZ2luZSBvdXQgb2YgdGhlIENGRgorCWRyaXZlciBjb2RlLCB3ZSBjYW4gbm93IHVzZSBpdCBvbiBUeXBlIDEgKGFuZCBDSUQpIGZvbnQgZm9ybWF0cywgYXMKKwlib3RoIGhhdmUgdGhlIHNhbWUgaGludGluZyBwaGlsb3NvcGh5LgorCisJVGhpcyBjaGFuZ2UgYWN0aXZhdGVzIHRoZSBBZG9iZSBoaW50ZXIgd2hlbiBpbiBMSUdIVCBtb2RlLCBhbmQKKwl0aGVyZWZvcmUgYWx3YXlzIHVubGVzcyBleHBsaWNpdGx5IGFza2luZyBmb3IgdGhlIGF1dG8taGludGVyLiAgVGhpcworCW1ha2VzIExJR0hUIGJlaGF2aW9yIGNvbnNpc3RlbnQgd2l0aCBDRkYgZm9udHMuICBBcyBvZiB0aGlzIGNvbW1pdCwKKwl0aGUgaGludGluZyBlbmdpbmUgdGFibGUgbG9va3MgYXMgZm9sbG93cy4KKworCSAgICAgICAgICAgICBMSUdIVCAgTk9STUFMCisJICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgVHJ1ZVR5cGUgIEF1dG8gICB2NDAKKwkgICBDRkYgICAgICAgQWRvYmUgIEFkb2JlCisJICAgVHlwZSAxICAgIEFkb2JlICBBZG9iZQorCisyMDE3LTExLTEwICBZdXJpIExldmNoZW5rbyAgPHl1cmlfbGV2Y2hlbmtvQGJvb2xhdC5jb20+CisKKwkqIENNYWtlTGlzdHMudHh0OiBBZGQgYERJU0FCTEVfRk9SQ0VfREVCVUdfUFJFRklYJyBvcHRpb24uCisKKzIwMTctMTEtMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX0xvYWRfR2x5cGgpOiBSZWxvY2F0ZSBjb25kaXRpb24uCisKKzIwMTctMTEtMDYgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfc2V0X2NlbGwpOiBGaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCisKKzIwMTctMTEtMDMgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRml4IFBvc3RTY3JpcHQgaW50ZXJwcmV0ZXIgcmV3aW5kaW5nIGluIFR5cGUgMSBtb2RlLiAoIzUyMjUxKQorCisJVGhlIGludGVycHJldGVyIGluIFR5cGUgMSBtb2RlIHJld2luZHMgdGhlIGNoYXJzdHJpbmcgYWZ0ZXIgY29sbGVjdGluZworCWFsbCBoaW50cyBmb3IgYnVpbGRpbmcgdGhlIGluaXRpYWwgaGludG1hcCAoY29tbWl0IGQ1MmRkN2YpLiBIb3dldmVyLAorCXNvbWUgY2hhcnN0cmluZ3MgdXNlIGBlbmRjaGFyJyBpbiBhIGZpbmFsIHN1YnJvdXRpbmUgY2FsbCwgcmV3aW5kaW5nIHRvCisJdGhlIHN0YXJ0IG9mIHRoYXQgc3Vicm91dGluZSwgYW5kIG9ubHkgYSBzbWFsbCBzZWN0aW9uIG9mIHRoZSBhY3R1YWwKKwlnbHlwaCBpcyBkcmF3bi4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRFTkRDSEFSPjoKKwlFbnN1cmUgd2UgYXJlIG9uIHRoZSB0b3AgbGV2ZWwgY2hhcnN0cmluZyBiZWZvcmUgcmV3aW5kaW5nLgorCisyMDE3LTExLTAzICBzdXp1a2kgdG9zaGl5YSAgPG1wc3V6dWtpQGhpcm9zaGltYS11LmFjLmpwPgorCisJW3RydWV0eXBlXSBBZGQgbW9yZSB0cmlja3kgZm9udHMuCisKKwlTZWUgdGhlIHJlcG9ydCBieSBZYW5nIFlpbnNlbi4KKwlodHRwczovL2xpc3RzLmdudS5vcmcvYXJjaGl2ZS9odG1sL2ZyZWV0eXBlLWRldmVsLzIwMTctMTEvbXNnMDAwMDAuaHRtbAorCisJKiBzcmMvdHJ1ZXR5cGUvdHRvYmpzLmMgKHRyaWNrX25hbWVzKTogQWRkIGBERkdvdGhpYy1FQicsCisJYERGR3lvU2hvLUx0JywgYERGSFNHb3RoaWMtVzUnLCBgREZIU01pbmNoby1XMycgYW5kIGBERkhTTWluY2hvLVc3Jy4KKwkodHRfY2hlY2tfdHJpY2t5bmVzc19zZm50X2lkcyk6IEFkZCBjaGVja3N1bXMgZm9yIERGR290aGljLUVCLAorCURGR3lvU2hvLUx0LCBERkhTR290aGljLVc1LCBERkhTTWluY2hvLVczIGFuZCBERkhTTWluY2hvLVc3LiAgQWxzbworCWFkZCBjaGVja3N1bXMgZm9yIERMQ0xpU2h1IGFuZCBETENIYXlCb2xkIHdoaWNoIHRoZWlyIGZhbWlseSBuYW1lcworCXdlcmUgYWxyZWFkeSBsaXN0ZWQgYnV0IHRoZWlyIGNoZWNrc3VtcyB3ZXJlIHByZXZpb3VzbHkgdW5rbm93bi4KKworMjAxNy0xMS0wMSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW3Ntb290aF0gRml4IGNvbXBsZXggcmVuZGVyaW5nIGF0IGhpZ2ggcHBlbS4KKworCVdlIHVzZWQgdG8gc3BsaXQgbGFyZ2UgZ2x5cGhzIGludG8gaG9yaXpvbnRhbCBiYW5kcyBhbmQgY29udGludWUKKwliaXNlY3RpbmcgdGhlbSBzdGlsbCBob3Jpem9udGFsbHkgaWYgdGhhdCB3YXMgbm90IGVub3VnaC4gIFRoaXMgaXMKKwlndWFyYW50ZWVkIHRvIGZhaWwgd2hlbiBhIHNpbmdsZSBzY2FubGluZSBjYW5ub3QgZml0IGludG8gdGhlCisJcmVuZGVyaW5nIG1lbW9yeSBwb29sLiAgTm93IHdlIGJpc2VjdCB0aGUgYmFuZHMgdmVydGljYWxseSBzbyB0aGF0CisJdGhlIHNtYWxsZXN0IHVuaXQgaXMgYSBjb2x1bW4gb2YgdGhlIGJhbmQgaGVpZ2h0LCB3aGljaCBpcyBndXJhbnRlZWQKKwl0byBmaXQgaW50byBtZW1vcnkuCisKKwkqIHNyYy9zbW9vdGgvZnRncmF5cy5jIChncmF5X2NvbnZlcnRfZ2x5cGgpOiBJbXBsZW1lbnQgaXQuCisKKzIwMTctMTAtMjAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGhdIEltcHJvdmUgY29tcGxleCByZW5kZXJpbmcgYXQgaGlnaCBwcGVtLgorCisJQXQgbGFyZ2Ugc2l6ZXMgYWxtb3N0IGJ1dCBub3QgZXhhY3RseSBob3Jpem9udGFsIHNlZ21lbnRzIGNhbiBxdWlja2x5CisJZHJhaW4gdGhlIHJlbmRlcmluZyBwb29sLiBUaGlzIHBhdGNoIGF0IGxlYXN0IGF2b2lkcyBmaWxsaW5nIHRoZSBwb29sCisJd2l0aCB0cml2aWFsIGNlbGxzLiBCZXlvbmQgdGhpcywgd2UgY2FuIG9ubHkgaW5jcmVhc2UgdGhlIHBvb2wgc2l6ZS4KKworCVJlcG9ydGVkLCBhbmFseXplZCwgYW5kIHRlc3RlZCBieSBDb2xpbiBGYWhleS4KKworCSogc3JjL3Ntb290aC9mdGdyYXlzLmMgKGdyYXlfc2V0X2NlbGwpOiBEbyBub3QgcmVjb3JkIHRyaXZpYWwgY2VsbHMuCisKKzIwMTctMTAtMjAgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtiYXNlXSBJbXByb3ZlIHRyYWNpbmcgaW4gRlRfTG9hZF9HbHlwaCwgRlRfKl9TaXplLgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfTG9hZF9HbHlwaCk6IFRhZyB0cmFjaW5nIG1lc3NhZ2VzIHdpdGgKKwlmdW5jdGlvbiBuYW1lLCBnbHlwaCBpbmRleCwgYW5kIGxvYWQgZmxhZ3MuCisJKEZUX1NlbGVjdF9NZXRyaWNzLCBGVF9SZXF1ZXN0X01ldHJpY3MpOiBSZW1vdmUgYWxsIHRyYWNpbmcuCisJKEZUX1NlbGVjdF9TaXplLCBGVF9SZXF1ZXN0X1NpemUpOiBJbXByb3ZlIHRyYWNpbmcuCisKKzIwMTctMTAtMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtiYXNlXSBJbXByb3ZlIHRyYWNpbmcgaW4gRlRfUmVuZGVyX0dseXBoLgorCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKTogQWRkIHRvdGFsIGNvdmVyYWdlCisJY2FsY3VsYXRpb25zIGFuZCBkb3duZ3JhZGUgTmV0cGJtIGR1bXAgdG8gYml0bWFwOjcuCisKKzIwMTctMTAtMTUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtjZmZdIEZpeCBzZWdmYXVsdCBvbiBtaXNzaW5nIGBwc2F1eCcgKCM1MjIxOCkKKworCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9kb25lX2JsZW5kKTogQWRkIGEgY2hlY2sgZm9yIHBvc3NpYmxlIG51bGxwdHIuCisKKwkqIG1vZHVsZXMuY2ZnOiBVcGRhdGUgZGVwZW5kZW5jeSBsaXN0LgorCisyMDE3LTEwLTE1ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmFzZSwgY2ZmXSBGaXggTVNWQyB3YXJuaW5ncy4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKEZUX05ld19MaWJyYXJ5KTogQzQ3MDI6IHVucmVhY2hhYmxlIGNvZGUuCisJKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogQzQyNDQ6IHBvc3NpYmxlIGxvc3Mgb2YgZGF0YS4KKwkqIHNyYy9jZmYvY2ZmbG9hZC5jIChjZmZfYmxlbmRfZG9CbGVuZCk6IEM0MjQ0OiBwb3NzaWJsZSBsb3NzIG9mIGRhdGEuCisJVHVybiBgc3VtJyBpbnRvIHVuc2lnbmVkLgorCisyMDE3LTEwLTE0ICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYmFzZV0gTmV0cGJtIGltYWdlIHRyYWNpbmcuCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogVHJhY2UgYml0bWFwIHNpemUuCisJKEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCk6IFRyYWNlIGJpdG1hcCBpbiBOZXRwYm0gZm9ybWF0LgorCisJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYyAoZ3JheV9zd2VlcCk6IFN3ZWVwIHJlbW5hbnRzIG9mIHNwYW4gdHJhY2luZy4KKworMjAxNy0xMC0xNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJKiBidWlsZHMvd2luZG93cy9mdGRlYnVnLmMgKEZUX01lc3NhZ2UpOiBQcmludCB0byBzdGRlcnIuCisJKiBidWlsZHMvd2luY2UvZnRkZWJ1Zy5jIChGVF9NZXNzYWdlKTogRGl0dG8uCisKKzIwMTctMTAtMTQgIEJlaGRhZCBFc2ZhaGJvZCAgPGJlaGRhZEBiZWhkYWQub3JnPgorCisJW2Fmc2hhcGVyXSBEZWxheSBjcmVhdGluZyBgaGJfc2V0JyBvYmplY3RzIHVudGlsIG5lZWRlZC4KKworCUluIHJ1bnMgb24gTm90byBOYXNraCBBcmFiaWMsIHRoaXMgcmVzdWx0cyBpbiA4OSBzZXRzIGNyZWF0ZWQKKwlpbnN0ZWFkIG9mIDM0MCBiZWZvcmUuICBNYWtlcyBhdXRvLWhpbnRlciBzZXR1cCB3aXRoIEhhcmZCdXp6CisJZW5hYmxlZCAyMCUgdG8gMzAlIGZhc3Rlci4KKworCSogc3JjL2F1dG9maXQvYWZzaGFwZXIuYyAoYWZfc2hhcGVyX2dldF9jb3ZlcmFnZSk6IEltcGxlbWVudCBpdC4KKworMjAxNy0xMC0xMiAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3R5cGUxLCBjaWRdIEFkZCBoaW50aW5nIGVuZ2luZSBzd2l0Y2guCisKKwlJbXBsZW1lbnQgcHJvcGVydHkgc2VydmljZSBpbiBgdHlwZTEnIGFuZCBgY2lkJyBkcml2ZXJzIHRvIGFsbG93CisJc3dpdGNoaW5nIGJldHdlZW4gRnJlZVR5cGUgb3IgQWRvYmUgaGludGluZyBlbmdpbmUgd2hlbiBib3RoIGFyZQorCWF2YWlsYWJsZS4KKworCSogc3JjL2NpZC9jaWRyaXZlci5jIChjaWRfcHJvcGVydHlfe3NldCxnZXR9LCBjaWRfc2VydmljZXMpLAorCXNyYy90eXBlMS90MWRyaXZlci5jICh0MV9wcm9wZXJ0eV97c2V0LGdldH0sIHQxX3NlcnZpY2VzKTogQWRkCisJUHJvcGVydGllcyBzZXJ2aWNlLgorCisJKiBzcmMvY2lkL2NpZG9ianMuYyAoY2lkX2RyaXZlcl9pbml0KSwgc3JjL3R5cGUxL3Qxb2Jqcy5jCisJKFQxX0RyaXZlcl9Jbml0KTogQWRkIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLgorCisyMDE3LTEwLTEyICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlBZGQgVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgorCisJVGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSBvbGQgVHlwZSAxIGVuZ2luZSBnZXRzIGNvbXBpbGVkIGludG8gRnJlZVR5cGUuCisJSXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworCSogZGV2ZWwvZnRvcHRpb24uaCwgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAorCShUMV9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUpOiBOZXcgbWFjcm8uCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNfRGVjb2Rlcik6IFJlbW92ZSB1bnVzZWQgZmllbGQuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy9jaWQvY2lkZ2xvYWQuYworCShjaWRfbG9hZF9nbHlwaCksIHNyYy9wc2F1eC9wc2F1eG1vZC5jLCBzcmMvcHNhdXgvcHNvYmpzLmMKKwkocHNfYnVpbGRlcl9hZGRfcG9pbnQpLCBzcmMvcHNhdXgvdDFkZWNvZGUuYworCSh0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUsIHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgsCisJdDFvcGVyYXRvcl9zZWFjLCB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKSwgc3JjL3BzYXV4L3QxZGVjb2RlLmgsCisJc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IFN1cnJvdW5kCisJcmVsZXZhbnQgY29kZSB3aXRoIG1hY3JvLgorCU1pbm9yIGNvZGUgY2hhbmdlcy4KKworMjAxNy0xMC0xMiAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJRXh0cmFjdCB3aWR0aCBwYXJzaW5nIGZyb20gVHlwZSAxIHBhcnNlci4KKworCUR1cGxpY2F0ZSB0aGUgZmFzdCBhZHZhbmNlIHdpZHRoIGNhbGN1bGF0aW9ucyBmcm9tIHRoZSBvbGQgcGFyc2VyLgorCVRoaXMgaXMgdG8gZmFjaWxpdGF0ZSBhZGRpbmcgb3B0aW9ucyBmb3IgY29tcGlsaW5nIG91dCB0aGUgb2xkIHBhcnNlci4KKworCSogc3JjL3BzYXV4L3QxZGVjb2RlLntjLGh9ICh0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3MpOiBOZXcgZnVuY3Rpb24uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFQxX0RlY29kZXJfRnVuY3MpOiBOZXcgZW50cnkKKwlgcGFyc2VfbWV0cmljcycuCisJKiBzcmMvcHNhdXgvcHNhdXhtb2QuYzogU2V0IHRoZSBuZXcgZW50cnkuCisKKwkqIHNyYy90eXBlMS90MWdsb2FkLmMgKFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcpLAorCXNyYy9jaWQvY2lkZ2xvYWQuYyAoY2lkX2xvYWRfZ2x5cGgpOiBTZXBhcmF0ZQorCWNvbmRpdGlvbmFsIGZvciBzZWxlY3RpbmcgZW5naW5lLgorCisyMDE3LTEwLTA5ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9iYXNlL2Z0b3V0bG4uYyAoRlRfT3V0bGluZV9UcmFuc2xhdGUpOiBGaXggaW50ZWdlciBvdmVyZmxvdy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTc3Mjc3NQorCisyMDE3LTEwLTA4ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCk6IEludGVnZXIgb3ZlcmZsb3dzLgorCisJUmVwb3J0ZWQgYXMKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzU3OQorCisyMDE3LTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbc2ZudF0gQWRqdXN0IGJlaGF2aW91ciBvZiBQUyBmb250IG5hbWVzIGZvciB2YXJpYXRpb24gZm9udHMuCisKKwkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3Zhcl9wc19uYW1lKTogVXNlIGEgbmFtZWQgaW5zdGFuY2UncworCVBTIG5hbWUgb25seSBpZiBubyB2YXJpYXRpb24gaXMgYXBwbGllZC4KKworMjAxNy0xMC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW2NmZiwgdHJ1ZXR5cGVdIEFkanVzdCBiZWhhdmlvdXIgb2YgbmFtZWQgaW5zdGFuY2VzLgorCisJVGhpcyBjb21taXQgY29tcGxldGVseSBzZXBhcmF0ZXMgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gbmFtZWQKKwlpbnN0YW5jZXMgYW5kIHZhcmlhdGlvbiBmdW5jdGlvbnMuICBJbiBwYXJ0aWN1bGFyLCByZXNldHRpbmcgdGhlCisJdmFyaWF0aW9uIHJldHVybnMgdG8gdGhlIGN1cnJlbnQgbmFtZWQgaW5zdGFuY2UgKGlmIHNldCkgYW5kIG5vdCB0bworCXRoZSBiYXNlIGZvbnQuCisKKwlBcyBhIHNpZGUgZWZmZWN0LCB2YXJpYXRpb24gZnVuY3Rpb25zIG5vIGxvbmdlciBjaGFuZ2UgdGhlIG5hbWVkCisJaW5zdGFuY2UgaW5kZXguCisKKwkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KTogVXNlIE1NIHNlcnZpY2UncyBgc2V0X2luc3RhbmNlJworCWZ1bmN0aW9uLgorCUFsc28gYXBwbHkgYE1WQVInIHRhYmxlIHRvIG5hbWVkIGluc3RhbmNlcy4KKworCSogc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAoVFRfR2V0X01NX1Zhcik6IEFkZCBjYXN0LgorCSh0dF9zZXRfbW1fYmxlbmQpOiBObyBsb25nZXIgY2hlY2sgd2hldGhlciByZXF1ZXN0ZWQgdmFyaWF0aW9uCisJY29pbmNpZGVzIHdpdGggYSBuYW1lZCBpbnN0YW5jZS4KKwkoVFRfU2V0X1Zhcl9EZXNpZ24pOiBVc2UgY3VycmVudCBuYW1lZCBpbnN0YW5jZSBmb3IgZGVmYXVsdAorCWNvb3JkaW5hdGVzLgorCSogc3JjL3RydWV0eXBlL3R0b2Jqcy5jICh0dF9mYWNlX2luaXQpOiBVc2UgYFRUX1NldF9OYW1lZF9JbnN0YW5jZScuCisKKzIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCU1ha2UgYEZUX1NldF9OYW1lZF9JbnN0YW5jZScgd29yay4KKworCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfc2V0X2luc3RhbmNlKTogTmV3IGZ1bmN0aW9uLgorCShjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzKTogUmVnaXN0ZXIgaXQuCisKKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9OYW1lZF9JbnN0YW5jZSk6IE5ldyBmdW5jdGlvbi4KKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmg6IFVwZGF0ZWQuCisJKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzKTogUmVnaXN0ZXIKKwlpdC4KKworCSogc3JjL3R5cGUxL3QxbG9hZC5jIChUMV9SZXNldF9NTV9CbGVuZCk6IE5ldyBmdW5jdGlvbi4KKwkqIHNyYy90eXBlMS90MWxvYWQuaDogVXBkYXRlZC4KKwkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMpOiBSZWdpc3RlciBpdC4KKworMjAxNy0xMC0wNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJTWFrZSBgRlRfRkFDRV9GTEFHX1ZBUklBVElPTicgd29yay4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmggKFRUX0ZhY2UpOiBSZW1vdmUKKwlgaXNfZGVmYXVsdF9pbnN0YW5jZSc7IHRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBjb21iaW5hdGlvbiBvZgorCWBGVF9JU19WQVJJQVRJT04nIGFuZCBgRlRfSVNfSU5TVEFOQ0UnLgorCisJKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9nZXRfYWR2YW5jZXMpOiBVcGRhdGVkLgorCisJKiBzcmMvc2ZudC9zZmRyaXZlci5jIChzZm50X2dldF9wc19uYW1lKSwgc3JjL3NmbnQvc2ZvYmpzLmMKKwkoc2ZudF9pbml0X2ZhY2UpOiBVcGRhdGVkLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyAodHRfZ2V0X2FkdmFuY2VzKSwgc3JjL3RydWV0eXBlL3R0Z2xvYWQuYworCShUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwgbG9hZF90cnVldHlwZV9nbHlwaCwgSVNfREVGQVVMVF9JTlNUQU5DRSksCisJc3JjL3RydWV0eXBlL3R0Z3h2YXIuYyAodHRfc2V0X21tX2JsZW5kKTogVXBkYXRlZC4KKwkqIHNyYy90cnVldHlwZS90dGd4dmFyLmMgKFRUX1NldF9NTV9CbGVuZCwgVFRfU2V0X1Zhcl9EZXNpZ24pOgorCUhhbmRsZSBgRlRfRkFDRV9GTEFHX1ZBUklBVElPTicuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kLCBUMV9TZXRfTU1fRGVzaWduKTogSGFuZGxlCisJYEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04nLgorCisyMDE3LTEwLTA3ICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlOZXcgZnVuY3Rpb24gYEZUX1NldF9OYW1lZF9JbnN0YW5jZScuCisKKwlObyBlZmZlY3QgeWV0LgorCisJKiBzcmMvYmFzZS9mdG1tLmMgKEZUX1NldF9OYW1lZF9JbnN0YW5jZSk6IE5ldyBmdW5jdGlvbi4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdG1tLmg6IFVwZGF0ZWQuCisKKzIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFkZCBtYWNyb3MgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBmb250IHZhcmlhdGlvbiBpcyBhY3RpdmUuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCAoRlRfRkFDRV9GTEFHX1ZBUklBVElPTiwKKwlGVF9JU19WQVJJQVRJT04pOiBOZXcgbWFjcm9zLgorCU5vIGVmZmVjdCB5ZXQuCisKKzIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCUFkZCBmcmFtZXdvcmsgZm9yIHNldHRpbmcgbmFtZWQgaW5zdGFuY2UgaW4gTU0gc2VydmljZS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggKEZUX1NldF9JbnN0YW5jZV9GdW5jKToKKwlOZXcgZnVuY3Rpb24gdHlwZWRlZi4KKwkoTXVsdGlNYXN0ZXJzKTogQWRkIGBzZXRfaW5zdGFuY2UnIG1lbWJlci4KKwkoRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKTogVXBkYXRlZC4KKworCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzKSwKKwlzcmMvdHJ1ZXR5cGUvdHRkcml2ZXIgKHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyksCisJc3JjL3R5cGUxL3QxZHJpdmVyLmMgKHQxX3NlcnZpY2VfbXVsdGlfbWFzdGVycyk6IFVwZGF0ZWQuCisKKzIwMTctMTAtMDcgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0eXBlMV0gTWlub3IgY29kZSBzaHVmZmxpbmcuCisKKwkqIHNyYy90eXBlMS90MWxvYWQuYyAoVDFfU2V0X01NX0JsZW5kKTogTWFrZSBpdCBhIHdyYXBwZXIgb2YuLi4KKwkodDFfc2V0X21tX2JsZW5kKTogLi4udGhpcyBuZXcgZnVuY3Rpb24uCisJKFQxX1NldF9NTV9EZXNpZ24pOiBVc2UgYHQxX3NldF9tbV9ibGVuZCcuCisKKzIwMTctMTAtMDUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL2Jhc2UvZnRvYmpzLmMgKGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKTogRml4IGludGVnZXIKKwlvdmVyZmxvdy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM1MzkKKworMjAxNy0xMC0wNSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCisJKiBzcmMvY2ZmL2NmZmRyaXZyLmMgKGNmZl9wc19nZXRfZm9udF9leHRyYSk6IEF2b2lkIGNvZGUgdGhhdCByZWxpZXMKKwlvbiBudW1lcmljIG92ZXJmbG93LgorCUFkZCBjYXN0LgorCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IEZpeCB2YXJpYWJsZQorCXR5cGVzLCBhZGQgY2FzdC4KKworMjAxNy0xMC0wNCAgSm9obiBUeXRnYXQgIDxKb2huLlR5dGdhdEBlc2tvLmNvbT4KKworCVtjZmZdIEFkZCBzdXBwb3J0IGZvciBgRlNUeXBlJy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oIChDRkZfRm9udFJlYyk6IEFkZAorCWBmb250X2V4dHJhJyBlbnRyeS4KKworCSogc3JjL2NmZi9jZmZkcml2ci5jIChjZmZfcHNfZ2V0X2ZvbnRfZXh0cmEpOiBOZXcgZnVuY3Rpb24gdG8KKwlyZXRyaWV2ZSBGU1R5cGUgaW5mbyBmcm9tIHRoZSBlbWJlZGRlZCBQb3N0U2NyaXB0IGRhdGEuCisJKGNmZl9zZXJ2aWNlX3BzX2luZm8pOiBSZWdpc3RlciBmdW5jdGlvbi4KKworCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9mb250X2RvbmUpOiBGcmVlIGBmb250X2V4dHJhJy4KKworMjAxNy0wOS0zMCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJU2lnbmVkbmVzcyBmaXhlcyBpbiBiaXRtYXAgcHJlc2V0dGluZy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM1MTQuCisKKwkqIHNyYy9yYXN0ZXIvZnRyZW5kMS5jIChmdF9yYXN0ZXIxX3JlbmRlcik6IEV4cGxpY2l0bHkgc2lnbmVkIGhlaWdodC4KKwkqIHNyYy9zbW9vdGgvZnRzbW9vdGguYyAoZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKTogRGl0dG8uCisJKiBzcmMvYmFzZS9mdG9ianMuYyAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOiBFeHBsaWNpdGx5IHVuc2lnbmVkCisJc3VidHJhY3Rpb24uCisKKzIwMTctMDktMjkgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCUJpdG1hcCBtZXRyaWNzIHByZXNldHRpbmcgWzIvMl0uCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChGVF9Mb2FkX0dseXBoKTogUHJlc2V0IHRoZSBiaXRtYXAgbWV0cmljcyB3aGVuCisJYXBwcm9wcmlhdGUgYnV0IGBGVF9SZW5kZXJfR2x5cGgnIGlzIG5vdCBjYWxsZWQuCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmggKEZUX0dseXBoU2xvdFJlYyk6IERvY3VtZW50IHRoZSBjaGFuZ2UuCisKKzIwMTctMDktMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtzbW9vdGgsIHJhc3Rlcl0gTWlzY2VsbGFuZW91cyBjbGVhbnVwcy4KKworCSogc3JjL3Jhc3Rlci9mdHJlbmQxLmMgKGZ0X3Jhc3RlcjFfcmVuZGVyKTogQ2xlYW4gdXAgdGhlIGV4aXQuCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IFJlZHVjZQorCXRyYW5zbGF0aW9ucyBhbmQgY2xlYW4gdXAgdGhlIGV4aXQuCisJKGZ0X3Ntb290aF9yZW5kZXJfbGNkLCBmdF9zbW9vdGhfcmVuZGVyX2xjZCk6IFJlbW92ZSB1bnVzZWQgYGVycm9yJy4KKworMjAxNy0wOS0yOCAgQmVuIFdhZ25lciAgPGJ1bmdlbWFuQGdvb2dsZS5jb20+CisKKwlbdHJ1ZXR5cGVdIFJlYWxseSwgcmVhbGx5IGZpeCAjNTIwODIuCisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTURSUCk6IENvcnJlY3QgY29uZGl0aW9uYWwuCisKKzIwMTctMDktMjggIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2RvU3RlbXMpOiBGaXggaW50ZWdlciBvdmVyZmxvdy4KKworCVJlcG9ydGVkIGFzCisKKwkgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTM1MTAKKworMjAxNy0wOS0yOCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9zbG90X2xvYWRfZ2x5cGgpOiBGaXggbWVtb3J5IGxlYWsuCisKKwlSZXBvcnRlZCBhcworCisJICBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avb3NzLWZ1enovaXNzdWVzL2RldGFpbD9pZD0zNDg5CisKKzIwMTctMDktMjggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCUJpdG1hcCBtZXRyaWNzIHByZXNldHRpbmcgWzEvMl0uCisKKwlUaGlzIG1haW5seSBqdXN0IGV4dHJhY3RzIHRoZSBjb2RlIGZvciBwcmVzZXR0aW5nIHRoZSBiaXRtYXAgbWV0cmljcworCWZyb20gdGhlIG1vbm9jaHJvbWUsIGdyYXlzY2FsZSwgYW5kIExDRCByZW5kZXJlcnMgaW50byBhIHNlcGFyYXRlCisJZnVuY3Rpb24uCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCk6IE5ldyBmdW5jdGlvbiB0aGF0CisJY2FsY3VsYXRlcyBwcm9zcGVjdGl2ZSBiaXRtYXAgbWV0cmljcyBmb3IgdGhlIGdpdmVuIHJlbmRlcmluZyBtb2RlLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCAoZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXApOgorCURlY2xhcmUgaXQuCisKKwkqIHNyYy9iYXNlL2Z0bGNkZmlsLmMgKGZ0X2xjZF9wYWRkaW5nKTogTmV3IGhlbHBlciBmdW5jdGlvbiB0aGF0IGFkZHMKKwlwYWRkaW5nIHRvIENCb3ggdGFraW5nIGludG8gYWNjb3VudCBwZWN1bGFyaXRpZXMgb2YgTENEIHJlbmRlcmluZy4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCAoZnRfbGNkX3BhZGRpbmcpOiBEZWNsYXJlIGl0LgorCisJKiBzcmMvcmFzdGVyL2Z0cmVuZDEuYyAoZnRfcmFzdGVyMV9yZW5kZXIpOiBSZXdvcmtlZCB0byB1c2UKKwlgZnRfZ2x5cGhzbG90X3ByZXNldF9iaXRtYXAnLgorCSogc3JjL3Ntb290aC9mdHNtb290aC5jIChmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMpOiBEaXR0by4KKwkoZnRfc21vb3RoX3JlbmRlcl9sY2QsIGZ0X3Ntb290aF9yZW5kZXJfbGNkKTogVGhlIHBpeGVsX21vZGUgc2V0dGluZworCWlzIG1vdmVkIHRvIGBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCcuCisKKzIwMTctMDktMjggIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRml4IGNvbXBpbGVyIHdhcm5pbmcuCisKKwkqIHNyYy9wc2F1eC9wc2hpbnRzLmMgKGNmMl9oaW50bWFwX2R1bXApOiBBZGQgc3dpdGNoIGZvciB0cmFjaW5nCisJY29kZS4KKworMjAxNy0wOS0yNyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJKiBzcmMvc2ZudC90dGxvYWQuYyAodHRfZmFjZV9sb2FkX2ZvbnRfZGlyKTogRml4IGNvbXBpbGVyIHdhcm5pbmcuCisKKzIwMTctMDktMjUgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtwc2F1eF0gRml4IGNvbXBpbGVyIHdhcm5pbmdzLgorCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfaW5pdExvY2FsUmVnaW9uQnVmZmVyKTogUmVtb3ZlIHJlZHVuZGFudAorCXRlc3QuCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpCisJPGNmMl9lc2NDQUxMT1RIRVJTVUJSPjogQWRkIGNhc3RzLgorCisJKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHBzX2RlY29kZXJfaW5pdCk6IEFkZCBjYXN0LgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIE1pbm9yIGZpeGVzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy9wc2F1eC9wc29ianMue2MsaH06CisJUmVhcnJhbmdlIGBwc19idWlsZGVyX2luaXQnIGFyZ3VtZW50cyB0byBjb252ZW50aW9uYWwgb3JkZXIuCisKKwkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKTogQWRkIGEgY2hlY2sgYW5kCisJbm90aWNlIGZvciBgU3ViRm9udCcgaW4gVHlwZSAxIG1vZGUuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gTW92ZSBgcHNkZWNvZGUnIGludG8gYHBzb2JqcycuCisKKwlBcyB0aGUgZm9ybWVyIG9ubHkgY29udGFpbnMgYSBzaW5nbGUgcHJvY2VkdXJlLCBtb3ZlIGl0IGludG8KKwlgcHNvYmpzJyBmb3Igc2ltcGxpY2l0eS4gIEFsc28gY2hhbmdlIHRoZSBwYXJhbWV0ZXIgb3JkZXIgdG8gdGhlCisJY29udmVudGlvbmFsIG9uZS4KKworCSogc3JjL3BzYXV4L3BzZGVjb2RlLmMgKHBzX2RlY29kZXJfaW5pdCk6IE1vdmVkIHRvLi4uCisJKiBzcmMvcHNhdXgvcHNvYmpzLmM6IC4uLkhlcmUuCisJKiBzcmMvcHNhdXgvcHNkZWNvZGUuaCwgc3JjL3BzYXV4L3Bzb2Jqcy5oOiBEaXR0by4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChQU0F1eF9TZXJ2aWNlUmVjKTogVXBkYXRlCisJYHBzX2RlY29kZXJfaW5pdCcgZnVuY3Rpb24gc2lnbmF0dXJlLgorCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jaWQvY2lkZ2xvYWQuYywgc3JjL3R5cGUxL3QxZ2xvYWQuYzoKKwlVcGRhdGUgY2FsbHMuCisKKwkqIHNyYy9wc2F1eC9wc2F1eC5jLCBzcmMvcHNhdXgvcHNhdXhtb2QuYzogVXBkYXRlIGluY2x1ZGVzLgorCisJKiBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLCBzcmMvcHNhdXgvcnVsZXMubWsgKFBTQVVYX0RSVl9TUkMpOgorCVVwZGF0ZSBmaWxlIHJlZmVyZW5jZXMuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRml4IFR5cGUgMSBoaW50aW5nLgorCisJVHlwZSAxIGhpbnRpbmcgYnJlYWtzIHNvbWV0aW1lcyB3aGVuIG1pZC1jaGFyc3RyaW5nIGhpbnRzIHNob3VsZAorCWhhdmUgYmVlbiBpbiB0aGUgaW5pdGlhbCBoaW50bWFwLiAgVGhpcyBmaXggYWRkcyBhIHByZXByb2Nlc3NpbmcKKwlwYXNzIHRoYXQgcmVhZHMgYWxsIGhpbnRzIGFuZCBidWlsZHMgdGhlIGNvcnJlY3QgaW5pdGlhbCBoaW50bWFwCisJZmlyc3QsIGJlZm9yZSBwcm9jZWVkaW5nIHRvIGJ1aWxkIHRoZSBnbHlwaCBvdXRsaW5lLgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogTmV3CisJYGluaXRpYWxfbWFwX3JlYWR5JyBib29sZWFuIGZsYWcuCisJSWdub3JlIG91dGxpbmUgY29tbWFuZHMgYW5kIGhpbnQgY2hhbmdlcyBvbiBmaXJzdCBwYXNzLgorCTxjZjJfY21kRU5EQ0hBUj46IEFkZCBzZWN0aW9uIHRvIGJ1aWxkIGhpbnRtYXAgYW5kIHJld2luZC4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBBZGQgdHJhY2luZyBmb3IgaGludHMuCisKKwkqIHNyYy9wc2F1eC9wc2hpbnRzLmMgKGNmMl9oaW50bWFwX2R1bXApOiBOZXcgZnVuY3Rpb24uCisJKGNmMl9oaW50bWFwX2luc2VydEhpbnQpOiBUcmFjZSBpbmNvbWluZyBhbmQgaW5zZXJ0ZWQgaGludHMuCisJKGNmMl9oaW50bWFwX2J1aWxkKTogRHVtcCBoaW50bWFwIGJlZm9yZSBhbmQgYWZ0ZXIgaGludCBhZGp1c3RtZW50LgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIE1pbm9yIGZpeGVzLgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKTogRml4IGNoZWNrIGZvciBwb3AKKwlyZXN1bHRzLgorCXMvZm9udC0+ZGVjb2Rlci9kZWNvZGVyLyB3aGVyZSBuZWNlc3NhcnkuCisJPGNmMl9jbWRIU1RFTSwgY2YyX2NtZFZTVEVNLCBjZjJfZXNjSFNURU0zLCBjZjJfZXNjVlNURU0zPjogVXNlCisJb2Zmc2V0IHBhcmFtZXRlciBpbiBgY2YyX2RvU3RlbXMnIGluc3RlYWQgb2YgZG9pbmcgY29ycmVjdGlvbiBmb3IKKwlsZWZ0LXNpZGViZWFyaW5nLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbY2lkXSBVc2UgdGhlIG5ldyBlbmdpbmUuCisKKwkqIHNyYy9jaWQvY2lkZ2xvYWQuYzogVXBkYXRlIGluY2x1ZGVzLgorCShjaWRfbG9hZF9nbHlwaCwgY2lkX3Nsb3RfbG9hZF9nbHlwaCk6IEltcGxlbWVudCBjaGFuZ2VzIHRvIGdseXBoCisJbG9hZGluZyBjb2RlIGFzIHdpdGggYHR5cGUxJyBtb2R1bGUuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtjaWRdIEFkZCBBZG9iZSBlbmdpbmUgY29uZmlndXJhdGlvbi4KKworCVRoaXMgaXMgc2ltaWxhciB0byB3aGF0IHdhcyBkb25lIGluIHRoZSBgdHlwZTEnIG1vZHVsZS4KKworCSogc3JjL2NpZC9jaWRyaXZlci5jICh0MWNpZF9kcml2ZXJfY2xhc3MpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBzcmMvY2lkL2NpZG9ianMuYzogSW5jbHVkZSBGVF9UWVBFMV9EUklWRVJfSC4KKwkoY2lkX2RyaXZlcl9pbml0KTogVXBkYXRlIGNvZGUuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gQ2hhbmdlIHN1YmZvbnQgc3ludGhlc2lzIGZvciBDSUQgZm9udHMuCisKKwlDaGFuZ2UgYHQxX21ha2Vfc3ViZm9udCcgdG8gdGFrZSBpbiB0aGUgUHJpdmF0ZSBkaWN0IHJlY29yZCBhcyBhbgorCWFyZ3VtZW50LiAgVGhpcyBpcyBiZWNhdXNlIFR5cGUgMSBhbmQgQ0lEIGZvbnQgcmVjb3JkcyBpbiBGcmVlVHlwZQorCWhhdmUgdGhpcyBpbiBkaWZmZXJlbnQgcGxhY2VzLgorCisJKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX21ha2Vfc3ViZm9udCk6IENoYW5nZSBgVDFfRmFjZScgdG8KKwlgRlRfRmFjZScgc28gdGhhdCBDSUQgaXMgYWxzbyBhY2NlcHRlZC4KKwlUYWtlIGBQU19Qcml2YXRlJyBhcyBhbiBhcmd1bWVudCBhbmQgbGV0IGNhbGxlciBmaWd1cmUgb3V0IHdoZXJlIHRoZQorCVByaXZhdGUgZGljdCBhY3R1YWxseSBpcy4KKwlVcGRhdGUgcmVmZXJlbmNlcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oLCBzcmMvcHNhdXgvcHNvYmpzLmg6IFVwZGF0ZQorCWRlY2xhcmF0aW9uLgorCisJKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogVXBkYXRlCisJY2FsbC4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3R5cGUxXSBTd2l0Y2ggdG8gQWRvYmUgZW5naW5lLgorCisJKiBzcmMvdHlwZTEvdDFvYmpzLmMgKFQxX0RyaXZlcl9Jbml0KTogU2V0IGRlZmF1bHQgdG8gQWRvYmUgZW5naW5lLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoc2VhYykuCisKKwlUaGlzIGNvbmNsdWRlcyB0aGUgY2hhbmdlcyBuZWVkZWQgdG8gYWRkIFR5cGUgMSBzdXBwb3J0LgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jOiBVcGRhdGUgaW5jbHVkZXMuCisJKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfZXNjU0VBQz46IEltcGxlbWVudCB0aGlzIHNpbWlsYXJseSB0bworCWltcGxpZWQgc2VhYyBmb3IgQ0ZGLgorCisJKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlX3BzKTogTmV3CisJZnVuY3Rpb24gdG8gbG9vayB1cCB0aGUgZ2x5cGggaW5kZXguCisKKwkqIHNyYy9wc2F1eC9wc2Z0LmMgKGNmMl9nZXRUMVNlYWNDb21wb25lbnQsCisJY2YyX2ZyZWVUMVNlYWNDb21wb25lbnQpOiBOZXcgZnVuY3Rpb25zIHRvIGdldCB0aGUgY2hhcnN0cmluZ3MgZm9yCisJc2VhYyBjb21wb25lbnRzLgorCisJKiBzcmMvcHNhdXgvdDFkZWNvZGUuaCwgc3JjL3BzYXV4L3BzZnQuaDogVXBkYXRlIGRlY2xhcmF0aW9ucy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBFeHRlbmQgQWRvYmUgaW50ZXJwcmV0ZXIgKGZsZXggaW4gY2FsbG90aGVyc3VicikuCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpCisJPGNmMl9lc2NDQUxMT1RIRVJTVUJSPjogRml4IEZsZXggZmVhdHVyZSBoYW5kbGluZyAoT3RoZXJTdWJycyAwLCAxLAorCTIpLgorCTxjZjJfY21kUk1PVkVUTz46IERvIG5vdCBhY3R1YWxseSBtb3ZlIHRoZSBgZ2x5cGhQYXRoJyB3aGlsZSBkb2luZworCWZsZXguICBUaGlzIGlzIHRvIGF2b2lkIGNsb3NpbmcgdGhlIGN1cnJlbnQgY29udG91ci4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBFeHRlbmQgQWRvYmUgaW50ZXJwcmV0ZXIgKGNhbGxvdGhlcnN1YnIpLgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKQorCTxjZjJfZXNjQ0FMTE9USEVSU1VCUj46IENvcHkgY29kZSBmcm9tCisJYHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MnIChpbiBgdDFkZWNvZGUuYycpLgorCU90aGVyU3ViciAzIChjaGFuZ2UgaGludHMpIHNob3VsZCByZXNldCB0aGUgaGludG1hc2ssIHNvIHRoYXQgdGhlCisJbmV3IGhpbnRzIGFyZSBhcHBsaWVkLgorCUZpeCBmdW5jdGlvbiBjYWxscyBhbmQgc3RhY2sgYWNjZXNzLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAocG9wKS4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IENoYW5nZSBob3cgdW5oYW5kbGVkCisJT3RoZXJTdWJyIHJlc3VsdHMgYXJlIHN0b3JlZC4gIEltcGxlbWVudCB0aGUgUG9zdFNjcmlwdCBzdGFjayB1c2luZworCWFuIGFycmF5LgorCTxjZjJfZXNjUE9QPjogRW5zdXJlIHRoYXQgdGhlIHN0YWNrIGlzIG5vdCBjbGVhcmVkIGFmdGVyIGdldHRpbmcKKwlgT3RoZXJTdWJyJyByZXN1bHRzLgorCUZpeCBzdGFjayBhY2Nlc3MuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChjYWxsc3VicikuCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfY21kQ0FMTFNVQlI+OgorCVR5cGUgMSBtb2RlLgorCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfaW5pdExvY2FsUmVnaW9uQnVmZmVyKTogQWRkIFR5cGUgMSBtb2RlLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoZGl2LCBmb3VyLWJ5dGUgbnVtYmVycykuCisKKwkqIHNyYy9wc2F1eC9wc2ludHJwLmMgKGNmMl9pbnRlcnBUMkNoYXJTdHJpbmcpIDxjZjJfZXNjRElWPjogQWRkCisJVHlwZSAxIG1vZGUuICBUeXBlIDEgcmVxdWlyZXMgbGFyZ2UgaW50ZWdlcnMgdG8gYmUgZm9sbG93ZWQgYnkKKwlgZGl2JzsgY2YuIGBBZG9iZSBUeXBlIDEgRm9udCBGb3JtYXQnLCBzZWN0aW9uIDYuMi4KKwk8b3AgPT0gMjU1PjogUHVzaCBUeXBlIDEgZm91ci1ieXRlIG51bWJlcnMgYXMgYEludCcgYWx3YXlzLiAgVGhpcyBpcworCXRvIGVuc3VyZSBgZGl2JyBhbmQgYGNhbGxzdWJyJyBnZXQgdmFsdWVzIHRoZXkgY2FuIHVzZS4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBFeHRlbmQgQWRvYmUgaW50ZXJwcmV0ZXIgKGhpbnRzKS4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykgPGNmMl9jbWRIU1RFTSwKKwljZjJfY21kVlNURU0+OiBBZGQgY29ycmVjdGlvbiBmb3IgbGVmdCBzaWRlYmVhcmluZyBpbiBUeXBlIDEgbW9kZS4KKwlBbGxvdyBhZGRpbmcgaGludHMgbWlkLWNoYXJzdHJpbmcuCisJPGNmMl9lc2NWU1RFTTMsIGNmMl9lc2NIU1RFTTM+OiBUcmFuc2xhdGUgaW50byBlcXVpdmFsZW50IGNvbW1hbmRzCisJZm9yIHRocmVlIG5vcm1hbCBzdGVtIGhpbnRzLiAgVGhpcyByZXF1aXJlcyBzb21lIHJlY2FsY3VsYXRpb24gb2YKKwlzdGVtIHBvc2l0aW9ucy4KKwlDb3JyZWN0aW9uIGZvciBsZWZ0IHNpZGViZWFyaW5nLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoaHNidywgc2J3KS4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2RvU3RlbXMpOiBgaHNidycgb3IgYHNidycgbXVzdCBiZSB0aGUKKwlmaXJzdCBvcGVyYXRpb24gaW4gYSBUeXBlIDEgY2hhcnN0cmluZy4KKwkoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgorCTxjZjJfY21kSE1PVkVUTywgY2YyX2NtZFZNT1ZFVE8sIGNmMl9jbWRSTU9WRVRPPjogYGhzYncnIG9yIGBzYncnCisJbXVzdCBiZSB0aGUgZmlyc3Qgb3BlcmF0aW9uIGluIGEgVHlwZSAxIGNoYXJzdHJpbmcuCisJPGNmMl9jbWRIU0JXLCBjZjJfZXNjU0JXPjogRml4IGRhdGEgYWNjZXNzIGFuZCBhZGQgY29ycmVjdGlvbiBmb3IKKwlsZWZ0IHNpZGViZWFyaW5nLgorCisyMDE3LTA5LTI1ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIEV4dGVuZCBBZG9iZSBpbnRlcnByZXRlciAoc2V0Y3VycmVudHBvaW50KS4KKworCSogc3JjL3BzYXV4L3BzaW50cnAuYyAoY2YyX2ludGVycFQyQ2hhclN0cmluZykKKwk8Y2YyX2VzY1NFVENVUlJFTlRQVD46IEZpeCBzdGFjayBhY2Nlc3MuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gRXh0ZW5kIEFkb2JlIGludGVycHJldGVyIChjbG9zZXBhdGgpLgorCisJKiBzcmMvcHNhdXgvcHNpbnRycC5jIChjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKSA8YzJmX2NtZENMT1NFUEFUSD46CisJVXNlIHRoZSByaWdodCBidWlsZGVyIGZ1bmN0aW9uLiAgV2UgY2FuIHVzZSB0aGUgYGhhdmVXaWR0aCcgYm9vbGVhbgorCWFscmVhZHkgcHJlc2VudCwgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcgYHBhcnNlX3N0YXRlJy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBBZGQgVHlwZSAxIG9wZXJhdGlvbnMgdG8gQWRvYmUgQ0ZGIGludGVycHJldGVyLgorCisJVGhlIGZvbGxvd2luZyBUeXBlIDEgc3BlY2lmaWMgb3BzIGhhdmUgYmVlbiBhZGRlZCAoY29waWVkIGZyb20KKwlgdDFkZWNvZGUnKToKKworCSAgY2xvc2VwYXRoCisJICB2c3RlbTMKKwkgIGhzdGVtMworCSAgc2VhYworCSAgc2J3CisJICBjYWxsb3RoZXJzdWJyCisJICBwb3AKKwkgIHNldGN1cnJlbnRwb2ludAorCSAgaHNidworCisJVGhlIGZvbGxvd2luZyByZXF1aXJlIGEgVHlwZSAxIG1vZGUsIGJlY2F1c2Ugb2YgZGlmZmVyZW5jZXMgaW4KKwlzcGVjaWZpY2F0aW9uOgorCisJICBoc3RlbQorCSAgdnN0ZW0KKwkgIHZtb3ZldG8KKwkgIGNhbGxzdWJyCisJICBkaXYKKwkgIHJtb3ZldG8KKwkgIGhtb3ZldG8KKwkgIE51bWJlcnMKKworCVRoZSBzdWJzZXF1ZW50IGNvbW1pdHMgd2lsbCBpbXBsZW1lbnQgdGhlc2UgY2hhbmdlcyBhbmQgYWRhcHQKKwlhY2Nlc3NlcyBvZiBkYXRhIGFuZCBvYmplY3RzIHRvIHRoZSBuZXcgaW50ZXJwcmV0ZXIuCisKKwlOT1RFOiBXaWxsIG5vdCBjb21waWxlIGluIHRoZSBtZWFudGltZSEKKworCSogc3JjL3BzYXV4L3BzaW50cnAuYzogQWRkIG9wY29kZXMgdG8gZW51bS4KKwkoY2YyX2ludGVycFQyQ2hhclN0cmluZyk6IENvcHkgcmVsZXZhbnQgY29kZSBvdmVyIGZyb20KKwlgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncycgKGluIGB0MWRlY29kZS5jJykuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVt0eXBlMV0gRml4ZXMgZm9yIHJlbmRlcmluZy4KKworCVRoZSBUeXBlIDEgYWR2YW5jZSB3aWR0aCBjYWxjdWxhdGlvbiBwYXNzZXMgbnVsbCBmb3IgZ2x5cGggc2xvdCwKKwlldGMsIHdoaWNoIGNhbiBjYXVzZSBudWxsIHBvaW50ZXIgYWNjZXNzIGluIHRoZSBuZXcgaW50ZXJwcmV0ZXIuCisJRmFsbCBiYWNrIHRvIHRoZSBvbGQgb25lIGZvciBub3cuCisKKwlGaXggdGhlIGxhcmdlIGdseXBoIHJldHJ5IGNvZGUgYW5kIGVuc3VyZSBoaW50aW5nIGFuZCBzY2FsaW5nIGZsYWdzCisJYXJlIHNldCBwcm9wZXJseS4KKworCSogc3JjL3R5cGUxL3QxZ2xvYWQuYyAoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IEFkZCBhCisJY2hlY2sgZm9yIG1ldHJpY3Nfb25seS4KKwlTZXQgdGhlIGBmb3JjZV9zY2FsaW5nJyBmbGFnLgorCShUMV9QYXJzZV9HbHlwaCk6IFVwZGF0ZWQuCisJKFQxX0xvYWRfR2x5cGgpOiBBZGQgYGhpbnRpbmcnIGFuZCBgc2NhbGVkJyBmbGFncy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBBZGQgbWlzc2luZyBvYmplY3RzICgyLzIpLgorCisJU3ludGhlc2l6ZSBhIGBTdWJGb250JyBvYmplY3QgZm9yIFR5cGUgMSBmb250cy4gIFRoaXMgaXMgdXNlZCBpbiB0aGUKKwlpbnRlcnByZXRlciB0byBhY2Nlc3MgUHJpdmF0ZSBkaWN0IGRhdGEsIHdoaWNoIGFyZSBzdG9yZWQgaW4KKwlkaWZmZXJlbnQgcGxhY2VzIGZvciBUeXBlIDEgYW5kIENGRi4gIFRoaXMgYWxsb3dzIHRoZSBzYW1lIGRhdGEgdG8KKwliZSB1c2VkIGluIGVpdGhlciBtb2RlLgorCisJKiBzcmMvcHNhdXgvcHNvYmpzLmMgKHQxX21ha2Vfc3ViZm9udCk6IE5ldyBwcm9jZWR1cmUgdG8gY29weQorCXJlcXVpcmVkIHZhbHVlcyB0byBhIGR1bW15IGBDRkZfU3ViRm9udCcgb2JqZWN0LiAgVGhpcyBpcyBzaW1pbGFyIHRvCisJYGNmZl9tYWtlX3ByaXZhdGVfZGljdCcuCisJKiBzcmMvcHNhdXgvcHNvYmpzLmg6IEFkZCB0aGUgbmV3IGRlY2xhcmF0aW9uLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBEaXR0by4KKwlBZGQgdGhpcyB0byB0aGUgUFNBdXggU2VydmljZSBmb3IgZnV0dXJlIHVzZSB3aXRoIENJRCBmb250cy4KKworCSogc3JjL3R5cGUxL3QxZ2xvYWQuYzogSW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSC4KKwkoVDFfUGFyc2VfR2x5cGhfQW5kX0dldF9DaGFyX1N0cmluZyk6IEFkZCB0aGUgY2FsbC4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBBZGQgbWlzc2luZyBvYmplY3RzIGZvciBUeXBlIDEgKDEvMikuCisKKwlNb3ZlIGBDRjJfRm9udCcgaW5zdGFuY2UgdG8gYFBTX0RlY29kZXInLiAgVGhpcyBpcyB0aGUgY29udGV4dCBmb3IKKwl0aGUgaW50ZXJwcmV0ZXIgYW5kIHNpbmNlIGl0IGlzIGN1cnJlbnRseSBzdG9yZWQgaW4gYENGRl9Gb250JywgaXMKKwl1bmF2YWlsYWJsZSBpbiBUeXBlIDEgbW9kZS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyLCBQU19EZWNvZGVyKTogTmV3CisJYGNmMl9pbnN0YW5jZScgZmllbGQuCisKKwkqIHNyYy9wc2F1eC9wc2RlY29kZS5jIChwc19kZWNvZGVyX2luaXQpOiBDb3B5IGBjZjJfaW5zdGFuY2UnIHRvCisJYFBTX0RlY29kZXInLgorCisJKiBzcmMvcHNhdXgvdDFkZWNvZGUuYyAodDFfZGVjb2Rlcl9kb25lKTogQWRkIGZpbmFsaXphdGlvbiBjb2RlLgorCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IFVwZGF0ZSBhY2Nlc3Nlcy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJQWxsb3cgYHR5cGUxJyBtb2R1bGUgdG8gdXNlIHRoZSBBZG9iZSBlbmdpbmUuCisKKwlBZGQgdGhlIGNhbGxiYWNrIGFuZCBzb21lIGNvbmRpdGlvbmFscyB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvCisJZW5naW5lcy4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChUMV9EZWNvZGVyX0Z1bmNzUmVjKTogQ2hhbmdlCisJZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorCSogc3JjL3BzYXV4L3BzYXV4bW9kLmMgKFQxX0RlY29kZXJfRnVuY3NSZWMpOiBSZWdpc3RlciB0aGUKKwljYWxsYmFja3MuCisKKwkqIHNyYy9wc2F1eC9wc29ianMuYyAocHNfYnVpbGRlcl9hZGRfcG9pbnQpOiBBZGQgY29uZGl0aW9uYWxzIGZvcgorCW51bWJlciBjb252ZXJzaW9uLgorCisJKiBzcmMvdHlwZTEvdDFnbG9hZC5jIChUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKTogQWRkIGNvZGUKKwl0byBjaG9vc2Ugd2hpY2ggcmVuZGVyZXIgdG8gdXNlLgorCisJKiBzcmMvY2lkL2NpZGdsb2FkLmMgKGNpZF9sb2FkX2dseXBoKTogVXBkYXRlIGNhbGwuCisJKiBzcmMvYmFzZS9mdG9ianMuYywgc3JjL3BzYXV4L3Bzb2Jqcy5jLCBzcmMvdHlwZTEvdDFnbG9hZC5jOiBVcGRhdGUKKwlpbmNsdWRlcy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3R5cGUxXSBBZGQgQWRvYmUgZW5naW5lIGNvbmZpZ3VyYXRpb24uCisKKwlVc2UgdGhlIHByZXZpb3VzbHkgY2hhbmdlZCBQU19Ecml2ZXIgaW4gdHlwZTEgbW9kdWxlIHRvIHN0b3JlCisJaGludGluZyBlbmdpbmUgY29uZmlndXJhdGlvbi4KKworCSogaW5jbHVkZS9mcmVldHlwZS9mdHQxZHJ2Lmg6IE5ldyBmaWxlLgorCUR1cGxpY2F0ZSBhbmQgcmVuYW1lIGNvbmZpZyBvcHRpb25zIGZyb20gQ0ZGLgorCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCAoRlRfVFlQRTFfRFJJVkVSX0gpOiBOZXcgbWFjcm8uCisKKwkqIHNyYy90eXBlMS90MWRyaXZlci5jICh0MV9kcml2ZXJfY2xhc3MpOiBVcGRhdGUgZGVjbGFyYXRpb24uCisJKiBzcmMvdHlwZTEvdDFvYmpzLmM6IEluY2x1ZGUgRlRfVFlQRTFfRFJJVkVSX0guCisJKFQxX0RyaXZlcl9Jbml0KTogVXBkYXRlIGNvZGUuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtjZmZdIE1vdmUgYW5kIHJlbmFtZSBgQ0ZGX0RyaXZlcicuCisKKwlUaGlzIGlzIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgc2FtZSBoaW50aW5nIGVuZ2luZSBwYXJhbWV0ZXJzIGZvcgorCVR5cGUgMS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaCAoQ0ZGX0RyaXZlcik6IFJlbmFtZSBhbmQKKwltb3ZlIHRvLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFBTX0RyaXZlcik6IC4uLmhlcmUuCisKKwkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2ZmL2NmZmxvYWQuYywKKwlzcmMvY2ZmL2NmZm9ianMuYywgc3JjL2NmZi9jZmZvYmpzLmgsIHNyYy9wc2F1eC9wc2Z0LmMsCisJc3JjL3BzYXV4L3Bzb2Jqcy5jOiBVcGRhdGUgcmVmZXJlbmNlcy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4LCB0eXBlMV0gUmVvcmdhbml6ZSBvYmplY3QgZmllbGRzLgorCisJTWFrZSBzb21lIGZpZWxkcyBtb3JlIGdlbmVyaWMsIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyB0aGVtIHRoZSBzYW1lCisJd2F5IHJlZ2FyZGxlc3Mgb2YgVHlwZSAxIG9yIENGRi4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oIChQU19CdWlsZGVyKTogQ2hhbmdlIGBUVF9GYWNlJworCXRvIGBGVF9GYWNlJy4KKwlSZW1vdmUgdW51c2VkIGZpZWxkcy4KKworCSogc3JjL3BzYXV4L3BzZnQuYzogVXBkYXRlIGFsbCBhY2Nlc3NlcyBvZiBgUFNfQnVpbGRlci5mYWNlJy4KKwlBZGQgc29tZSBhc3NlcnRzIHRvIGd1YXJkIGFnYWluc3QgY2FzdGluZyBgVDFfRmFjZScgYXMgYFRUX0ZhY2UnLgorCisJKiBzcmMvdHlwZTEvdDFvYmpzLmggKFQxX0dseXBoU2xvdCk6IFJlb3JkZXIgZmllbGRzIHRvIGZvbGxvdworCWBDRkZfR2x5cGhTbG90Jywgc28gdGhhdCB3ZSBjYW4gcHJldGVuZCB0aGV5IGFyZSB0aGUgc2FtZSBpbiB0aGUKKwlpbnRlcnByZXRlci4KKworCSogc3JjL3BzYXV4L3Bzb2Jqcy5jIChwc19idWlsZGVyX2luaXQsIHBzX2J1aWxkZXJfYWRkX3BvaW50KToKKwlVcGRhdGVkIHdpdGggYWJvdmUgY2hhbmdlcy4KKworMjAxNy0wOS0yNSAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBQcmVwYXJlIGZvciBUeXBlIDEgbW9kZS4KKworCUFkZCBzb21lIGNoZWNrcyBmb3IgVHlwZSAxIGRhdGEgcGFzc2luZyB0aHJvdWdoLgorCisJKiBzcmMvcHNhdXgvcHNmb250LmggKENGMl9Gb250KTogQWRkIGBpc1QxJyBmbGFnLgorCSogc3JjL3BzYXV4L3BzZm9udC5jIChjZjJfZm9udF9zZXR1cCk6IFNraXAgdGhlIHZhcmlhdGlvbnMgYW5kIGJsZW5kCisJY29kZSB3aGljaCBpcyBub3QgYXBwbGljYWJsZSBmb3IgVHlwZSAxLgorCisJKiBzcmMvcHNhdXgvcHNmdC5jIChjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyk6IEF2b2lkIGFjY2Vzc2luZworCWBkZWNvZGVyLT5jZmYnIGluIFR5cGUgMSBtb2RlLgorCUNvcHkgYGlzX3QxJyBmbGFnIHRvIGBDRjJfRm9udCcuCisKKzIwMTctMDktMjUgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eCwgY2ZmXSBVc2UgdGhlIG5ldyBvYmplY3RzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgsIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBGaXgKKwlzd2l0Y2hpbmcgYmV0d2VlbiBuZXcgYW5kIG9sZCBlbmdpbmVzLgorCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmMsIHNyYy9jZmYvY2ZmcGFyc2UuYzogVXBkYXRlIGNhbGxzLgorCisJKiBzcmMvcHNhdXgvcHNibHVlcy5jLCBzcmMvcHNhdXgvcHNmb250LmMsIHNyYy9wc2F1eC9wc2ZvbnQuaCwKKwlzcmMvcHNhdXgvcHNmdC5jLCBzcmMvcHNhdXgvcHNmdC5oLCBzcmMvcHNhdXgvcHNpbnRycC5jOiBVcGRhdGUgYWxsCisJdG8gdXNlIG5ldyBvYmplY3RzLgorCisyMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXhdIE9iamVjdHMgZm9yIG5ldyBpbnRlcnByZXRlciAocGFydCAyKS4KKworCU1ha2UgdGhlIG5ldyBvYmplY3RzIGNvcHkgb3ZlciB2YWx1ZXMuICBUaGV5IGFyZSBlc3NlbnRpYWxseSB3cmFwcGVyCisJdHlwZXMgZm9yIHRoZSBkaWZmZXJlbnQgZGVjb2RlcnMvYnVpbGRlcnMuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaDogVXBkYXRlIGRlY2xhcmF0aW9ucy4KKwkoUFNfQnVpbGRlcik6IEFkZCBgaXNfdDEnIGZsYWcuCisJKFBTX0RlY29kZXJfe0dldCxGcmVlfV9HbHlwaF9DYWxsYmFjayk6IFJlbmFtZWQgdG8uLi4KKwkoQ0ZGX0RlY29kZXJfe0dldCxGcmVlfV9HbHlwaF9DYWxsYmFjazogLi4uIHRoaXMuCisJKFBTX0RlY29kZXIpOiBVcGRhdGVkLgorCUFkZCBgdDFfcGFyc2VfY2FsbGJhY2snIG1lbWJlci4KKwkoUFNBdXhfU2VydmljZVJlYyk6IEFkZCBgcHNfZGVjb2Rlcl9pbml0JyBtZW1iZXIuCisKKwkqIHNyYy9wc2F1eC9wc2RlY29kZS5oLCBzcmMvcHNhdXgvcHNvYmpzLmg6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCisKKwkqIHNyYy9wc2F1eC9wc2RlY29kZS5jLCBzcmMvcHNhdXgvcHNvYmpzLmM6IEltcGxlbWVudCBjb3B5IHdpdGggdHdvCisJbW9kZXMuCisKKwkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBBZGQgYnVpbGRlciBhbmQgZGVjb2RlciBmdW5jdGlvbnMgdG8gYFBTQXV4JworCXNlcnZpY2UuCisKKzIwMTctMDktMjQgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gQWRkIG9iamVjdHMgZm9yIG5ldyBpbnRlcnByZXRlci4KKworCUludHJvZHVjZSBgUFNfRGVjb2RlcicgYW5kIGBQU19CdWlsZGVyJyB3aGljaCBpbmNsdWRlIGFsbCBmaWVsZHMKKwlmcm9tIGVpdGhlciBUeXBlIDEgb3IgQ0ZGIGRlY29kZXJzL2J1aWxkZXJzLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggKFBTX0J1aWxkZXIsIFBTX0RlY29kZXIpOiBOZXcKKwlzdHJ1Y3RzLgorCisJKiBzcmMvcHNhdXgvcHNvYmpzLmMsIHNyYy9wc2F1eC9wc29ianMuaDogQWRkIGBQU19CdWlsZGVyJworCWZ1bmN0aW9ucy4KKworCSogc3JjL3BzYXV4L3BzZGVjb2RlLmMsIHNyYy9wc2F1eC9wc2RlY29kZS5oOiBOZXcgZmlsZXMgdG8gaG9sZAorCWBQU19EZWNvZGVyJyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisKKwkqIHNyYy9wc2F1eC9wc2F1eC5jLCBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLAorCXNyYy9wc2F1eC9ydWxlcy5tayAoUFNBVVhfRFJWX1NSQyk6IFVwZGF0ZWQuCisKKzIwMTctMDktMjQgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eF0gUmVuYW1lIGZpbGVzLgorCisJUmVwbGFjZSB0aGUgYGNmMicgZmlsZSBuYW1lIHByZWZpeCB3aXRoIGBwcycgYXMgdGhlIEFkb2JlIGVuZ2luZQorCXdpbGwgYmUgdXNlZCBmb3IgYm90aCBQb3N0U2NyaXB0IFR5cGVzIDEgYW5kIDIgKENGRikgaW5zdGVhZCBvZiBqdXN0CisJQ0ZGLgorCisJcy9jZjIvcHMvIGZvciBhbGwgZm9sbG93aW5nLgorCisJKiBzcmMvcHNhdXgvY2YyKjogUmVuYW1lIGZpbGVzLgorCSogc3JjL3BzYXV4Lyo6IFVwZGF0ZSBpbmNsdWRlcy4KKworCSogc3JjL3BzYXV4L0phbWZpbGUgKF9zb3VyY2VzKSwgc3JjL3BzYXV4L3J1bGVzLm1rIChQU0FVWF9EUkNfU1JDLAorCVBTQVVYX0RSVl9IKTogVXBkYXRlIGZpbGUgcmVmZXJlbmNlcy4KKworMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4XSBNaW5vciBmaXguCisKKwlVc2UgYE11bHRpTWFzdGVycycgc2VydmljZSBpbiBgcHNhdXgnIGluc3RlYWQgb2YgYSBjYWxsIHRvIGBjZmYnLgorCVRoZSBwcm9qZWN0IGJ1aWxkcyBpZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGlzIG5vdCBkZWZpbmVkLgorCisJKiBzcmMvcHNhdXgvY2YyZnQuYzogVXBkYXRlIGluY2x1ZGVzLgorCShjZjJfZ2V0Tm9ybWFsaXplZFZlY3Rvcik6IFVzZSBgbW0tPmdldF92YXJfYmxlbmQnIGluc3RlYWQgb2YKKwlgY2ZmX2dldF92YXJfYmxlbmQnLgorCisyMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXgsIGNmZl0gTW92ZSBgY2ZmX3JhbmRvbScgaW50byBgcHNhdXgnIHNlcnZpY2UuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJTWlub3IgZml4IHRvIGFsbG93IGJvdGggYGNmZicgYW5kIGBwc2F1eCcgdG8gdXNlIGBjZmZfcmFuZG9tJy4KKworCSogc3JjL2NmZi9jZmZsb2FkLmMgKGNmZl9yYW5kb20pOiBNb3ZlIHRvLi4uCisJKiBzcmMvcHNhdXgvcHNvYmpzLmM6IEhlcmUuCisJKiBzcmMvY2ZmL2NmZmxvYWQuaDogTW92ZSBjb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uIHRvCisJYHNyYy9wc2F1eC9wc29ianMuaCcuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCAoUFNBdXhfU2VydmljZVJlYyk6IFJlZ2lzdGVyIHRoZQorCWZ1bmN0aW9uIGhlcmUuLi4KKwkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jOiBBbmQgaGVyZS4KKworCSogc3JjL2NmZi9jZmZsb2FkLmMsIHNyYy9wc2F1eC9jZjJpbnRycC5jOiBVcGRhdGUgY29kZS4KKworMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW2NmZl0gTW92ZSBzdHJ1Y3QgZGVjbGFyYXRpb25zIHRvIGBmcmVldHlwZS9pbnRlcm5hbCcuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJVGhpcyBpcyBzbyB0aGF0IHRoZSBDRkYgZnVuY3Rpb25zIG1vdmVkIHRvIGBwc2F1eCcgY2FuIGFjY2VzcyB0aGUKKwlzYW1lIHN0cnVjdHMgdGhhdCB0aGV5IG5lZWQuCisKKwkqIHNyYy9jZmYvY2ZmdHlwZXMuaDogTW92ZWQgdG8uLi4KKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaDogLi4uSGVyZS4KKworCSogc3JjL2NmZi9jZmZvYmpzLmg6IE1vdmVkIHRoZSBzdHJ1Y3QgZGVjbGFyYXRpb25zIHRvLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oOiAuLi4gdGhpcyBuZXcgZmlsZS4KKworCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oIChGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSCwKKwlGVF9JTlRFUk5BTF9DRkZfT0JKRUNUX1RZUEVTX0gpOiBOZXcgbWFjcm9zLgorCisJKiBzcmMvY2ZmL2NmZmNtYXAuaCwgc3JjL2NmZi9jZmZkcml2ci5jLCBzcmMvY2ZmL2NmZmdsb2FkLmMsCisJc3JjL2NmZi9jZmZnbG9hZC5oLCBzcmMvY2ZmL2NmZmxvYWQuaCwgc3JjL2NmZi9jZmZvYmpzLmMsCisJc3JjL2NmZi9jZmZvYmpzLmgsIHNyYy9jZmYvY2ZmcGFyc2UuaCwgc3JjL3BzYXV4L3Bzb2Jqcy5oLAorCWluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCwKKwlpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaDogVXBkYXRlIGluY2x1ZGVzLgorCisJKiBzcmMvY2ZmL3J1bGVzLm1rIChDRkZfRFJWX0gpOiBVcGRhdGVkLgorCisyMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXgsIGNmZl0gQWRkIG5ldyBzZXJ2aWNlIGZvciBpbnRlci1tb2R1bGUgY2FsbHMuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJVGhpcyBpcyB0byBhbGxvdyBDRkYgZnVuY3Rpb25zIG1vdmVkIHRvIGBwc2F1eCcgdG8gY2FsbCBmdW5jdGlvbnMKKwlkZWNsYXJlZCBpbiBgc3JjL2NmZi9jZmZsb2FkLmgnLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaDogTmV3IGZpbGUsIHNldHRpbmcgdXAKKwlhIGBDRkZMb2FkJyBzZXJ2aWNlLgorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIChGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxMCwKKwlGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMpOiBOZXcgbWFjcm9zLgorCShGVF9TRVJWSUNFX0NGRl9UQUJMRV9MT0FEX0gpOiBOZXcgbWFjcm8uCisKKwkqIHNyYy9jZmYvY2ZmZHJpdnIuYywgc3JjL2NmZi9jZmZwaWMuaDogUmVnaXN0ZXIgdGhlIG5ldyBzZXJ2aWNlLgorCisJKiBzcmMvY2ZmL2NmZnR5cGVzLmggKENGRl9Gb250UmVjKSwgc3JjL3BzYXV4L2NmMmZvbnQuaAorCShDRjJfRm9udFJlYyk6IEFkZCBzZXJ2aWNlIGludGVyZmFjZS4KKworCSogc3JjL2NmZi9jZmZvYmpzLmMsIHNyYy9wc2F1eC9jZjJmb250LmMsIHNyYy9wc2F1eC9jZjJmdC5jLAorCXNyYy9wc2F1eC9jZjJpbnRycC5jLCBzcmMvcHNhdXgvY2ZmZGVjb2RlLmM6IFVzZSB0aGUgbmV3IHNlcnZpY2UuCisKKzIwMTctMDktMjQgIEV3YWxkIEhldyAgPGV3YWxkaGV3QGdtYWlsLmNvbT4KKworCVtwc2F1eCwgY2ZmXSBBZGQgY2FsbGJhY2tzIGZvciBpbnRlci1tb2R1bGUgY2FsbHMuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg6IEFkZCBmdW5jdGlvbiBwb2ludGVyCisJZGVjbGFyYXRpb25zLgorCisJKiBzcmMvcHNhdXgvY2ZmZGVjb2RlLmMgKGNmZl9kZWNvZGVyX2luaXQpOiBVcGRhdGUgdG8gdGFrZSBpbgorCWNhbGxiYWNrcy4KKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuaDogRGl0dG8uCisKKwkqIHNyYy9jZmYvY2ZmZ2xvYWQuYyAoY2ZmX2NvbXB1dGVfbWF4X2FkdmFuY2UsIGNmZl9zbG90X2xvYWQpOgorCVVwZGF0ZSBjYWxscyB0byBwYXNzIGluIGNhbGxiYWNrcy4KKwkqIHNyYy9wc2F1eC9jZjJmdC5jLCBzcmMvcHNhdXgvY2ZmZGVjb2RlLmM6IFVzZSB0aGVtLgorCisyMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXgsIGNmZl0gQ3JlYXRlIG5ldyBgUFNBdXgnIHNlcnZpY2UgaW50ZXJmYWNlIGVudHJpZXMuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg6IEluY2x1ZGUKKwlGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ILgorCShDRkZfQnVpbGRlcl9GdW5jc1JlYywgQ0ZGX0RlY29jZXJfRnVuY3NSZWMpOiBOZXcgZnVuY3Rpb24gdGFibGVzLgorCShDRkZfQnVpbGRlcik6IFVwZGF0ZWQuCisJRml4IGZvciBmb3J3YXJkIGRlY2xhcmF0aW9uLgorCShQU0F1eF9TZXJ2aWNlUmVjKTogTmV3IGZpZWxkIGBjZmZfZGVjb2Rlcl9mdW5jcycuCisKKwkqIHNyYy9wc2F1eC9wc2F1eG1vZC5jIChjZmZfYnVpbGRlcl9mdW5jcywgY2ZmX2RlY29kZXJfZnVuY3MpOiBOZXcKKwlmdW5jdGlvbiB0YWJsZXMuCisJKFBTQXV4X0ludGVyZmFjZSk6IFVwZGF0ZWQuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIChUVF9GYWNlUmVjKTogQWRkIGBwc2F1eCcKKwlzZXJ2aWNlIGludGVyZmFjZS4KKworCSogc3JjL2NmZi9jZmZnbG9hZC5jLCBzcmMvY2ZmL2NmZm9ianMuYywgc3JjL2NmZi9jZmZwYXJzZS5jOiBVcGRhdGUKKwlmdW5jdGlvbiBjYWxscyB0byB1c2UgcHNhdXggc2VydmljZS4KKworMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4LCBjZmZdIE1vdmUgQ0ZGIGJ1aWxkZXIgY29tcG9uZW50cyBpbnRvIGBwc2F1eCcgbW9kdWxlLgorCisJTk9URTogRG9lcyBub3QgY29tcGlsZSEKKworCSogc3JjL2NmZi9jZmZnbG9hZC5jCisJKGNmZl9idWlsZGVyX3tpbml0LGRvbmUsYWRkX3BvaW50LGFkZF9wb2ludDEsYWRkX2NvbnRvdXIsc3RhcnRfcG9pbnQsY2xvc2VfY29udG91cn0sCisJY2ZmX2NoZWNrX3BvaW50cyk6IE1vdmUgdG8uLi4KKwkqIHNyYy9wc2F1eC9wc29ianMuYzogSGVyZS4KKworCSogc3JjL2NmZi9jZmZnbG9hZC5oOiBNb3ZlIGNvcnJlc3BvbmRpbmcgZGVjbGFyYXRpb25zIHRvCisJYHNyYy9wc2F1eC9wc29ianMuaCcuCisKKwkqIHNyYy9jZmYvY2ZmZ2xvYWQuaCAoQ0ZGX0J1aWxkZXIpOiBNb3ZlIHN0cnVjdCBkZWNsYXJhdGlvbiB0by4uLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBIZXJlLgorCisyMDE3LTA5LTI0ICBFd2FsZCBIZXcgIDxld2FsZGhld0BnbWFpbC5jb20+CisKKwlbcHNhdXgsIGNmZl0gTW92ZSBDRkYgZGVjb2RlciBjb21wb25lbnRzIGludG8gYHBzYXV4JyBtb2R1bGUuCisKKwlOT1RFOiBEb2VzIG5vdCBjb21waWxlIQorCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmMgKENGRl9PcGVyYXRvciwKKwlDRkZfQ09VTlRfe0NIRUNLX1dJRFRILEVYQUNULENMRUFSX1NUQUNLfSwgY2ZmX2FyZ3VtZW50X2NvdW50cywKKwljZmZfb3BlcmF0b3Jfc2VhYywgY2ZmX2NvbXB1dGVfYmlhcywKKwljZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlLAorCWNmZl9kZWNvZGVyX3twYXJzZV9jaGFyc3RyaW5ncyxpbml0LHByZXBhcmV9KTogTW92ZSB0by4uLgorCSogc3JjL3BzYXV4L2NmZmRlY29kZS5jOiBUaGlzIG5ldyBmaWxlLgorCisJKiBzcmMvY2ZmL2NmZmdsb2FkLmg6IE1vdmUgY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbnMgdG8uLi4KKwkqIHNyYy9wc2F1eC9jZmZkZWNvZGUuaDogVGhpcyBuZXcgZmlsZS4KKworCSogc3JjL2NmZi9jZmZnbG9hZC5oIChDRkZfTUFYX3tPUEVSQU5EUyxTVUJSU19DQUxMUyxUUkFOU19FTEVNRU5UU30sCisJQ0ZGX0RlY29kZXJfWm9uZSwgQ0ZGX0RlY29kZXIpOiBNb3ZlIGRlY2xhcmF0aW9ucyB0by4uLgorCSogaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oOiBIZXJlLgorCisJKiBzcmMvcHNhdXgvY2YyZnQuaDogVXBkYXRlIGluY2x1ZGUuCisKKwkqIHNyYy9wc2F1eC9wc2F1eC5jLCBzcmMvcHNhdXgvcnVsZXMubWsgKFBTQVVYX0RSVl9TUkMpOiBVcGRhdGUgd2l0aAorCXRoZSBuZXcgZmlsZS4KKworMjAxNy0wOS0yNCAgRXdhbGQgSGV3ICA8ZXdhbGRoZXdAZ21haWwuY29tPgorCisJW3BzYXV4LCBjZmZdIE1vdmUgQWRvYmUncyBlbmdpbmUgY29tcG9uZW50cyBpbnRvIGBwc2F1eCcgbW9kdWxlLgorCisJVGhpcyBpcyB0aGUgZmlyc3QgcGF0Y2ggb2YgYSBzZXF1ZW5jZSB0byBtb3ZlIHRoZSBUeXBlIDIgY2hhcnN0cmluZworCXByb2Nlc3NpbmcgY2FwYWJpbGl0eSBmcm9tIHRoZSBgY2ZmJyBtb2R1bGUgdG8gdGhlIGBwc2F1eCcgbW9kdWxlLgorCisJTk9URTogRG9lcyBub3QgY29tcGlsZSEKKworCSogc3JjL2NmZi9jZjIqOiBNb3ZlIHRoZXNlIGZpbGVzIHRvLi4uCisJKiBzcmMvcHNhdXgvY2YyKjogSGVyZS4KKworCSogc3JjL2NmZi9KYW1maWxlIChfc291cmNlcyksIHNyYy9jZmYvcnVsZXMubWsgKENGRl9EUlZfU1JDLAorCUNGRl9EUlZfSCksIHNyYy9jZmYvY2ZmLmMsIHNyYy9jZmYvY2ZmZ2xvYWQuYzogUmVtb3ZlIGZpbGUKKwlyZWZlcmVuY2VzLgorCisJKiBzcmMvcHNhdXgvSmFtZmlsZSAoX3NvdXJjZXMpLCBzcmMvcHNhdXgvcnVsZXMubWssIHNyYy9wc2F1eC9wc2F1eC5jCisJKFBTQVVYX0RSVl9TUkMsIFBTQVVYX0RSVl9IKTogQWRkIGZpbGUgcmVmZXJlbmNlcy4KKworMjAxNy0wOS0yNCAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJVHdlYWsgcGVyLWZhY2UgTENEIGZpbHRlcmluZyBjb250cm9scy4KKworCVRoaW5nIGFyZSBzaW1wbGVyIHdpdGggYSBOVUxMLWZ1bmN0aW9uIHBvaW50ZXIuCisKKwkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggKEZUX0ZhY2VfSW50ZXJuYWxSZWMpOiBOZXcKKwlwb2ludGVyIHRvIHRoZSBmaWx0ZXIgZnVuY3Rpb24uCisJKEZUX0xpYnJhcnlSZWMpOiBSZW1vdmUgdW51c2VkIGBsY2RfZmlsdGVyJy4KKwkoRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMsIGZ0X2xjZF9maWx0ZXJfZmlyKTogIE1vdmUgZnJvbSBoZXJlLi4uCisJKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmggKEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jLAorCWZ0X2xjZF9maWx0ZXJfZmlyKTogLi4uIHRvIGhlcmUuCisKKwkqIHNyYy9iYXNlL2Z0b2Jqcy5jIChmdF9vcGVuX2ZhY2VfaW50ZXJuYWwpOiBOVUxMLWluaXRpYWxpemUgdGhlCisJcGVyLWZhY2UgZmlsdGVyLgorCShGVF9GYWNlX1Byb3BlcnRpZXMpOiBTZXQgaXQuCisJKiBzcmMvc21vb3RoL2Z0c21vb3RoLmMgKGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyk6IFNpbXBsaWZ5LgorCisJKiBzcmMvYmFzZS9mdGxjZGZpbC5jIChmdF9sY2RfZmlsdGVyX2ZpciwgRlRfTGliYXJ5X1NldExjZEZpbHRlcik6CisJTWlub3IuCisKKzIwMTctMDktMjQgIEpvbmF0aGFuIEtldyAgPGpma3RoYW1lQGdtYWlsLmNvbT4KKworCVtzZm50XSBGaXggYHByZW11bHRpcGx5X2RhdGEnICgjNTIwOTIpLgorCisJKiBzcmMvc2ZudC9wbmdzaGltLmMgKHByZW11bHRpcGx5X2RhdGEpOiBEb24ndCB1c2UgdmVjdG9yIGV4dGVuc2lvbgorCWlmIHdlIGhhdmUgbGVzcyB0aGFuIDE2IGJ5dGVzIG9mIGRhdGEuCisKKzIwMTctMDktMjQgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtvdHZhbGlkXSBGaXggaGFuZGxpbmcgb2YgVmFsdWVSZWNvcmRzLgorCisJRm9yIEdQT1MgcGFpciBwb3NpdGlvbmluZyBmb3JtYXQgMSB0aGUgZGVzY3JpcHRpb24gb2YgVmFsdWVSZWNvcmRzCisJaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKDEuOC4yLCBmcm9tIHRvZGF5KSBpcyB3cm9uZyDigJMgdGhlCisJb2Zmc2V0IGhhcyB0byBiZSB0YWtlbiBmcm9tIHRoZSBwYXJlbnQgc3RydWN0dXJlOyBpbiB0aGlzIGNhc2UgdGhlCisJYFBhaXJTZXQnIHRhYmxlLgorCisJKiBzcmMvb3R2YWxpZC9vdHZncG9zLmMgKG90dl9QYWlyU2V0X3ZhbGlkYXRlKTogU2V0IGBleHRyYTMnLgorCShvdHZfUGFpclBvc192YWxpZGF0ZSk6IEFkanVzdC4KKworMjAxNy0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW290dmFsaWRdIEhhbmRsZSBgR1NVQicgYW5kIGBHUE9TJyB2MS4xIHRhYmxlcy4KKworCSogc3JjL290dmFsaWQvb3R2Z3N1Yi5jIChvdHZfR1NVQl92YWxpZGF0ZSksIHNyYy9vdHZhbGlkL290dmdwb3MuYworCShvdHZfR1BPU192YWxpZGF0ZSk6IEltcGxlbWVudCBpdC4KKworMjAxNy0wOS0yMyAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW290dmFsaWRdIFVwZGF0ZSBjb21tb24gdGFibGUgaGFuZGxpbmcgdG8gT3BlblR5cGUgMS44LjIuCisKKwkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmMgKG90dl9EZXZpY2VfdmFsaWRhdGUpOiBIYW5kbGUKKwlWYXJpYXRpb25JbmRleCBzdWJ0YWJsZS4KKwkob3R2X0xvb2t1cF92YWxpZGF0ZSk6IEhhbmRsZSBNYXJrRmlsdGVyaW5nU2V0LgorCisyMDE3LTA5LTIzICBBbGV4ZWkgUG9kdGVsZXpobmlrb3YgIDxhcG9kdGVsZUBnbWFpbC5jb20+CisKKwlbYnVpbGRdIFdpbmRvd3Mtc3R5bGUgRExMIHZlcnNpb25pbmcuCisKKwkqIGJ1aWxkL3dpbmRvd3MvZnR2ZXIucmM6IE5ldyBWRVJTSU9OSU5GTyByZXNvdXJjZS4KKwkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IEZ1cnRoZXIgaW1wcm92ZW1lbnRzLgorCisyMDE3LTA5LTIzICBCZW4gV2FnbmVyICA8YnVuZ2VtYW5AZ29vZ2xlLmNvbT4KKworCVt0cnVldHlwZV0gUmVhbGx5IGZpeCAjNTIwODIuCisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTURSUCk6IENvcnJlY3QgY29uZGl0aW9uYWwuCisKKzIwMTctMDktMjMgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVtvdHZhbGlkXSBIYW5kbGUgYEdERUYnIHYxLjIgYW5kIHYxLjMgdGFibGVzLgorCisJTm8gdmFsaWRhdGlvbiBvZiB2YXJpYXRpb24gc3R1ZmYgeWV0LgorCisJKiBzcmMvb3R2YWxpZC9vdHZnZGVmLmMgKG90dl9NYXJrR2x5cGhTZXRzX3ZhbGlkYXRlKTogTmV3IGZ1bmN0aW9uLgorCShvdHZfR0RFRl92YWxpZGF0ZSk6IEltcGxlbWVudCBpdC4KKworMjAxNy0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW290dmFsaWRdIEhhbmRsZSBgQkFTRScgdjEuMSB0YWJsZS4KKworCU5vIHZhbGlkYXRpb24gb2YgdmFyaWF0aW9uIHN0dWZmIHlldC4KKworCSogc3JjL290dmFsaWQvb3R2YmFzZS5jIChvdHZfQkFTRV92YWxpZGF0ZSk6IEltcGxlbWVudCBpdC4KKworMjAxNy0wOS0yMiAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW290dmFsaWRdIE1hY3JvcyBmb3IgMzJiaXQgb2Zmc2V0IHN1cHBvcnQuCisKKwkqIHNyYy9vdHZhbGlkL290dmNvbW1uLmggKE9UVl9PUFRJT05BTF9UQUJMRTMyLAorCU9UVl9PUFRJT05BTF9PRkZTRVQzMiwgT1RWX1NJWkVfQ0hFQ0szMik6IE5ldyBtYWNyb3MuCisKKzIwMTctMDktMjEgIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtidWlsZF0gU2ltcGxpZnkgVmlzdWFsIEMrKyAyMDEwIHByb2plY3QuCisKKwkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFJlbW92ZSBmYWtlIHNpbmdsZXRocmVhZGVkCisJY29uZmlndXJhdGlvbnMgYW5kIHR3ZWFrLgorCisyMDE3LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3cgKCM1MjA4MikuCisKKwkqIHNyYy90cnVldHlwZS90dGludGVycC5jIChJbnNfTURSUCk6IEF2b2lkIEZUX0FCUy4KKworMjAxNy0wOS0yMSAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgorCisJW3NmbnRdIEZpeCBwb3N0c2NyaXB0IG5hbWUgZm9yIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdmFyaWF0aW9uIGZvbnRzLgorCisJUHJvYmxlbSByZXBvcnRlZCBieSBCZWhkYWQuCisKKwkqIHNyYy9zZm50L3NmZHJpdmVyLmMgKHNmbnRfZ2V0X3BzX25hbWUpOiBUZXN0CisJYGlzX2RlZmF1bHRfaW5zdGFuY2UnLgorCisyMDE3LTA5LTIxICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEZpeCBgbW12YXInIGFycmF5IHBvaW50ZXJzLCBwYXJ0IDIuCisKKwlUaGUgcHJldmlvdXMgY29tbWl0IHdhcyBpbmNvbXBsZXRlLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jOiBQcm9wZXJseSBpbml0aWFsaXplIHN1Yi1hcnJheSBvZmZzZXRzIGZvcgorCWBtYXN0ZXInIGFsc28uCisKKzIwMTctMDktMjEgIFdlcm5lciBMZW1iZXJnICA8d2xAZ251Lm9yZz4KKworCVt0cnVldHlwZV0gRml4IGBtbXZhcicgYXJyYXkgcG9pbnRlcnMuCisKKwlXaXRob3V0IHRoaXMgY2hhbmdlLCBjbGFuZydzIEFkZHJlc3NTYW5pdGl6ZXIgcmVwb3J0cyBtYW55IHJ1bnRpbWUKKwllcnJvcnMgZHVlIHRvIG1pc2FsaWduZWQgYWRkcmVzc2VzLgorCisJKiBzcmMvdHJ1ZXR5cGUvdHRneHZhci5jIChUVF9HZXRfTU1fVmFyKTogVXNlIG11bHRpcGxlcyBvZiBwb2ludGVyCisJc2l6ZSBmb3Igc3ViLWFycmF5IG9mZnNldHMgaW50byBgbW12YXInLgorCisyMDE3LTA5LTIwICBXZXJuZXIgTGVtYmVyZyAgPHdsQGdudS5vcmc+CisKKwlbdHJ1ZXR5cGVdIEludGVnZXIgb3ZlcmZsb3dzLgorCisJQ2hhbmdlcyB0cmlnZ2VyZWQgYnkKKworCSAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL29zcy1mdXp6L2lzc3Vlcy9kZXRhaWw/aWQ9MzQyOQorCisJKiBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYyAoSW5zX1NIUElYLCBJbnNfREVMVEFQKTogVXNlIE5FR19MT05HLgorCShJbnNfTUlBUCk6IFVzZSBTVUJfTE9ORy4KKworMjAxNy0wOS0xOSAgQWxleGVpIFBvZHRlbGV6aG5pa292ICA8YXBvZHRlbGVAZ21haWwuY29tPgorCisJW2J1aWxkXSBGaXggRExMIGJ1aWxkcyBpbiBWaXN1YWwgQysrIHByb2plY3QuCisKKwkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFVzZSBEeW5hbWljTGlicmFyeSBpbiBEZWJ1ZworCWFuZCBSZWxlYXNlIGNvbmZpZ3VyYXRpb25zLgorCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCAoRlRfRVhQT1JULCBGVF9FWFBPUlRfREVGKQorCVtfRExMXTogVXNlIFZpc3VhbCBDKysgZXh0ZW5zaW9ucy4KKworMjAxNy0wOS0xOSAgSm9obiBUeXRnYXQgIDxKb2huLlR5dGdhdEBlc2tvLmNvbT4KKworCVtjZmZdIEZpeCBmYW1pbHkgbmFtZSBsb2dpYyBvZiBwdXJlIENGRiBmb250ZGF0YSAoIzUyMDU2KS4KKworCTEuIElmIGBGYW1pbHlOYW1lJyBpcyBwcmVzZW50IGluIHRoZSBDRkYgZm9udCwgdXNlIHRoaXMgZm9yCisJICAgRlRfRmFjZSdzIGBmYW1pbHlfbmFtZScuCisJMi4gT3RoZXJ3aXNlLCB1c2UgdGhlIGZhY2UgbmFtZSBhbmQgY2hvcCBvZmYgYW55IHN1YnNldCBwcmVmaXguCisJMy4gSWYgYXQgdGhpcyBwb2ludCBGVF9GYWNlJ3MgYGZhbWlseV9uYW1lJyBpcyBzZXQsIHVzZSB0aGlzCisJICAgdG9nZXRoZXIgd2l0aCB0aGUgZnVsbCBuYW1lIHRvIGRldGVybWluZSB0aGUgc3R5bGUuCisJNC4gT3RoZXJ3aXNlLCB1c2UgYENJREZvbnROYW1lJyBhcyBGVF9GYWNlJ3MgYGZhbWlseV9uYW1lJy4KKwk1LiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgc3R5bGUsIHVzZSAiUmVndWxhciIuCisKKwlQcmV2aW91c2x5LCBGVF9GYWNlJ3MgYGZhbWlseV9uYW1lJyBlbnRyeSBmb3IgcHVyZSBDRkYgZm9udGRhdGEKKwluZWFybHkgYWx3YXlzIHdhcyB0aGUgZm9udG5hbWUgaXRzZWxmLCBpbnN0ZWFkIG9mIHRoZSBgRmFtaWx5TmFtZScKKwllbnRyeSBpbiB0aGUgQ0ZGIGZvbnQgKGFzc3VtaW5nIHRoZXJlIGlzIG9uZSkuCisKKwkqIHNyYy9jZmYvY2Zmb2Jqcy5jIChjZmZfZmFjZV9pbml0KSBbcHVyZV9jZmZdOiBJbXBsZW1lbnQgaXQuCisKKzIwMTctMDktMTggIEFsZXhlaSBQb2R0ZWxlemhuaWtvdiAgPGFwb2R0ZWxlQGdtYWlsLmNvbT4KKworCVtidWlsZF0gRGVjbHV0dGVyIFZpc3VhbCBDKysgMjAxMC0yMDE3IHByb2plY3QuCisKKwkqIGJ1aWxkL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2o6IFVzZSBNYXhTcGVlZCAoLzAyKQorCW9wdGltaXphdGlvbiBmb3IgUmVsZWFzZSBjb25maWd1cmF0aW9uIHRocm91Z2hvdXQgdGhlIHByb2plY3QuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDb3B5cmlnaHQgKEMpIDIwMTctMjAyMCBieQorRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorCitUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAorYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAorTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKK2luZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0CitmdWxseS4KKworCitMb2NhbCBWYXJpYWJsZXM6Cit2ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCitjb2Rpbmc6IHV0Zi04CitFbmQ6CmRpZmYgLS1naXQgYS9KYW1maWxlIGIvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3OGE1Zi4uMDAwMDAwMAotLS0gYS9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLSMgRnJlZVR5cGUgMiB0b3AgSmFtZmlsZS4KLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotIyBUaGUgSERSTUFDUk8gaXMgYWxyZWFkeSBkZWZpbmVkIGluIEZUSmFtIGFuZCBpcyB1c2VkIHRvIGFkZAotIyB0aGUgY29udGVudCBvZiBjZXJ0YWluIG1hY3JvcyB0byB0aGUgbGlzdCBvZiBpbmNsdWRlZCBoZWFkZXIKLSMgZmlsZXMuCi0jCi0jIFdlIGNhbiBjb21waWxlIEZyZWVUeXBlIDIgd2l0aCBjbGFzc2ljIEphbSBob3dldmVyIHRoYW5rcyB0bwotIyB0aGUgZm9sbG93aW5nIGNvZGUKLSMKLWlmICEgJChKQU1fVE9PTFNFVCkKLXsKLSAgcnVsZSBIRFJNQUNSTwotICB7Ci0gICAgIyBub3RoaW5nCi0gIH0KLX0KLQotCi0jIFdlIG5lZWQgdG8gaW52b2tlIGEgU3ViRGlyIHJ1bGUgaWYgdGhlIEZUMiBzb3VyY2UgZGlyZWN0b3J5IHRvcCBpcyBub3QgdGhlCi0jIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhpcyBhbGxvd3MgdXMgdG8gYnVpbGQgRnJlZVR5cGUgMiBhcyBwYXJ0IG9mIGEgbGFyZ2VyCi0jIHByb2plY3QgZWFzaWx5LgotIwotaWYgJChGVDJfVE9QKSAhPSAkKERPVCkKLXsKLSAgU3ViRGlyICBGVDJfVE9QIDsKLX0KLQotCi0jIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGRlZmluZSB0aGUgaW5jbHVkZSBkaXJlY3RvcnksIHRoZSBzb3VyY2UgZGlyZWN0b3J5LAotIyBhbmQgdGhlIGZpbmFsIGxpYnJhcnkgbmFtZSAod2l0aG91dCBsaWJyYXJ5IGV4dGVuc2lvbnMpLiAgVGhleSBjYW4gYmUKLSMgcmVwbGFjZWQgYnkgb3RoZXIgZGVmaW5pdGlvbnMgd2hlbiB0aGUgbGlicmFyeSBpcyBjb21waWxlZCBhcyBwYXJ0IG9mCi0jIGEgbGFyZ2VyIHByb2plY3QuCi0jCi0KLSMgTmFtZSBvZiBGcmVlVHlwZSBpbmNsdWRlIGRpcmVjdG9yeSBkdXJpbmcgY29tcGlsYXRpb24uCi0jIFRoaXMgaXMgcmVsYXRpdmUgdG8gRlQyX1RPUC4KLSMKLUZUMl9JTkNMVURFX0RJUiA/PSBpbmNsdWRlIDsKLQotIyBOYW1lIG9mIEZyZWVUeXBlIHNvdXJjZSBkaXJlY3RvcnkgZHVyaW5nIGNvbXBpbGF0aW9uLgotIyBUaGlzIGlzIHJlbGF0aXZlIHRvIEZUMl9UT1AuCi0jCi1GVDJfU1JDX0RJUiA/PSBzcmMgOwotCi0jIE5hbWUgb2YgZmluYWwgbGlicmFyeSwgd2l0aG91dCBleHRlbnNpb24uCi0jCi1GVDJfTElCID89ICQoTElCUFJFRklYKWZyZWV0eXBlIDsKLQotCi0jIERlZmluZSBGVDJfQlVJTERfSU5DTFVERSB0byBwb2ludCB0byB5b3VyIGJ1aWxkLXNwZWNpZmljIGRpcmVjdG9yeS4KLSMgVGhpcyBpcyBwcmVwZW5kZWQgdG8gRlQyX0lOQ0xVREVfRElSLiAgSXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotIyB0aGUgbG9jYXRpb24gb2YgYSBjdXN0b20gPGZ0MmJ1aWxkLmg+IHdoaWNoIHdpbGwgcG9pbnQgdG8gY3VzdG9tCi0jIHZlcnNpb25zIG9mIGBmdG1vZHVsZS5oJyBhbmQgYGZ0b3B0aW9uLmgnLCBmb3IgZXhhbXBsZS4KLSMKLUZUMl9CVUlMRF9JTkNMVURFID89IDsKLQotIyBUaGUgbGlzdCBvZiBtb2R1bGVzIHRvIGNvbXBpbGUgb24gYW55IGdpdmVuIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LgotIyBCeSBkZWZhdWx0LCB0aGlzIHdpbGwgY29udGFpbiBfYWxsXyBtb2R1bGVzIGRlZmluZWQgaW4gRlQyX1NSQ19ESVIuCi0jCi0jIElNUE9SVEFOVDogWW91J2xsIG5lZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50IG9mIGBmdG1vZHVsZS5oJyBhcyB3ZWxsCi0jICAgICAgICAgICAgaWYgeW91IG1vZGlmeSB0aGlzIGxpc3Qgb3IgcHJvdmlkZSB5b3VyIG93bi4KLSMKLUZUMl9DT01QT05FTlRTID89IGF1dG9maXQgICAgIyBhdXRvLWZpdHRlcgotICAgICAgICAgICAgICAgICAgYmFzZSAgICAgICAjIGJhc2UgY29tcG9uZW50IChwdWJsaWMgQVBJcykKLSAgICAgICAgICAgICAgICAgIGJkZiAgICAgICAgIyBCREYgZm9udCBkcml2ZXIKLSAgICAgICAgICAgICAgICAgIGJ6aXAyICAgICAgIyBzdXBwb3J0IGZvciBiemlwMi1jb21wcmVzc2VkIFBDRiBmb250Ci0gICAgICAgICAgICAgICAgICBjYWNoZSAgICAgICMgY2FjaGUgc3ViLXN5c3RlbQotICAgICAgICAgICAgICAgICAgY2ZmICAgICAgICAjIENGRi9DRUYgZm9udCBkcml2ZXIKLSAgICAgICAgICAgICAgICAgIGNpZCAgICAgICAgIyBQb3N0U2NyaXB0IENJRC1rZXllZCBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgZ3ppcCAgICAgICAjIHN1cHBvcnQgZm9yIGd6aXAtY29tcHJlc3NlZCBQQ0YgZm9udAotICAgICAgICAgICAgICAgICAgbHp3ICAgICAgICAjIHN1cHBvcnQgZm9yIExaVy1jb21wcmVzc2VkIFBDRiBmb250Ci0gICAgICAgICAgICAgICAgICBwY2YgICAgICAgICMgUENGIGZvbnQgZHJpdmVyCi0gICAgICAgICAgICAgICAgICBwZnIgICAgICAgICMgUEZSL1RydWVEb2MgZm9udCBkcml2ZXIKLSAgICAgICAgICAgICAgICAgIHBzYXV4ICAgICAgIyBjb21tb24gUG9zdFNjcmlwdCByb3V0aW5lcyBtb2R1bGUKLSAgICAgICAgICAgICAgICAgIHBzaGludGVyICAgIyBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUKLSAgICAgICAgICAgICAgICAgIHBzbmFtZXMgICAgIyBQb3N0U2NyaXB0IG5hbWVzIGhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICByYXN0ZXIgICAgICMgbW9ub2Nocm9tZSByYXN0ZXJpemVyCi0gICAgICAgICAgICAgICAgICBzZm50ICAgICAgICMgU0ZOVC1iYXNlZCBmb3JtYXQgc3VwcG9ydCByb3V0aW5lcwotICAgICAgICAgICAgICAgICAgc21vb3RoICAgICAjIGFudGktYWxpYXNlZCByYXN0ZXJpemVyCi0gICAgICAgICAgICAgICAgICB0cnVldHlwZSAgICMgVHJ1ZVR5cGUgZm9udCBkcml2ZXIKLSAgICAgICAgICAgICAgICAgIHR5cGUxICAgICAgIyBQb3N0U2NyaXB0IFR5cGUgMSBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgdHlwZTQyICAgICAjIFBvc3RTY3JpcHQgVHlwZSA0MiAoZW1iZWRkZWQgVHJ1ZVR5cGUpIGRyaXZlcgotICAgICAgICAgICAgICAgICAgd2luZm9udHMgICAjIFdpbmRvd3MgRk9OL0ZOVCBmb250IGRyaXZlcgotICAgICAgICAgICAgICAgICAgOwotCi0KLSMgRG9uJ3QgdG91Y2guCi0jCi1GVDJfSU5DTFVERSAgPSAkKEZUMl9CVUlMRF9JTkNMVURFKQotICAgICAgICAgICAgICAgWyBGVDJfU3ViRGlyICQoRlQyX0lOQ0xVREVfRElSKSBdIDsKLQotRlQyX1NSQyAgICAgID0gWyBGVDJfU3ViRGlyICQoRlQyX1NSQ19ESVIpIF0gOwotCi0jIExvY2F0aW9uIG9mIEFQSSBSZWZlcmVuY2UgRG9jdW1lbnRhdGlvbgotIwotaWYgJChET0NfRElSKQotewotICBET0NfRElSID0gJChET0NESVI6VCkgOwotfQotZWxzZQotewotICBET0NfRElSID0gZG9jcy9yZWZlcmVuY2UgOwotfQotCi0KLSMgT25seSB1c2VkIGJ5IEZyZWVUeXBlIGRldmVsb3BlcnMuCi0jCi1pZiAkKERFQlVHX0hJTlRFUikKLXsKLSAgQ0NGTEFHUyArPSAtRERFQlVHX0hJTlRFUiA7Ci19Ci0KLQotIyBXZSBuZWVkIGBpbmNsdWRlJyBpbiB0aGUgY3VycmVudCBpbmNsdWRlIHBhdGggaW4gb3JkZXIgdG8KLSMgY29tcGlsZSBhbnkgcGFydCBvZiBGcmVlVHlwZSAyLgotIwotSERSUyArPSAkKEZUMl9JTkNMVURFKSA7Ci0KLQotIyBXZSBuZWVkIHRvICNkZWZpbmUgRlQyX0JVSUxEX0xJQlJBUlkgc28gdGhhdCBvdXIgc291cmNlcyBmaW5kIHRoZQotIyBpbnRlcm5hbCBoZWFkZXJzCi0jCi1DQ0ZMQUdTICs9IC1ERlQyX0JVSUxEX0xJQlJBUlkgOwotCi0jIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgaW5kaXZpZHVhbCBzb3VyY2UgZmlsZXMKLSMgZm9yIGVhY2ggRnJlZVR5cGUgMiBtb2R1bGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIGR1cmluZyBkZXZlbG9wbWVudCwgYW5kCi0jIGlzIGJldHRlciBkZWZpbmVkIGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFueXdheSEKLSMKLSMgRlQyX01VTFRJID0gdHJ1ZSA7Ci0KLQotIyBUaGUgZmlsZXMgYGZ0aGVhZGVyLmgnLCBgaW50ZXJuYWwuaCcsIGFuZCBgZnRzZXJ2LmgnIGFyZSB1c2VkIHRvIGRlZmluZQotIyBtYWNyb3MgdGhhdCBhcmUgbGF0ZXIgdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzLiAgVGhleSBuZWVkIHRvIGJlIHBhcnNlZAotIyBpbiBvcmRlciB0byByZWNvcmQgdGhlc2UgZGVmaW5pdGlvbnMuCi0jCi1IRFJNQUNSTyAgWyBGVDJfU3ViRGlyICAkKEZUMl9JTkNMVURFX0RJUikgZnJlZXR5cGUgY29uZmlnIGZ0aGVhZGVyLmggXSA7Ci1IRFJNQUNSTyAgWyBGVDJfU3ViRGlyICAkKEZUMl9JTkNMVURFX0RJUikgZnJlZXR5cGUgaW50ZXJuYWwgaW50ZXJuYWwuaCBdIDsKLUhEUk1BQ1JPICBbIEZUMl9TdWJEaXIgICQoRlQyX0lOQ0xVREVfRElSKSBmcmVldHlwZSBpbnRlcm5hbCBmdHNlcnYuaCBdIDsKLQotCi0jIE5vdyBpbmNsdWRlIHRoZSBKYW1maWxlIGluIGBmcmVldHlwZTIvc3JjJywgdXNlZCB0byBkcml2ZSB0aGUgY29tcGlsYXRpb24KLSMgb2YgZWFjaCBGcmVlVHlwZSAyIGNvbXBvbmVudCBhbmQvb3IgbW9kdWxlLgotIwotU3ViSW5jbHVkZSAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSA7Ci0KLSMgSGFuZGxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBgZnRleHBvcnQuc3ltJyBmaWxlLCB3aGljaCBjb250YWlucyB0aGUgbGlzdAotIyBvZiBleHBvcnRlZCBzeW1ib2xzLiAgVGhpcyBjYW4gYmUgdXNlZCBvbiBVbml4IGJ5IGxpYnRvb2wuCi0jCi1TdWJJbmNsdWRlIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgdG9vbHMgOwotCi1ydWxlIEdlbkV4cG9ydFN5bWJvbHMKLXsKLSAgbG9jYWwgIGFwaW5hbWVzID0gYXBpbmFtZXMkKFNVRkVYRSkgOwotICBsb2NhbCAgYWhlYWRlciA7Ci0gIGxvY2FsICBoZWFkZXJzIDsKLQotICBmb3IgYWhlYWRlciBpbiBbIEdsb2IgJCgyKSA6ICouaCBdCi0gIHsKLSAgICBzd2l0Y2ggJChhaGVhZGVyKQotICAgIHsKLSAgICAgIGNhc2UgKi9mdG1hYy5oIDoKLSAgICAgICAgaWYgKCAkKE1BQykgfHwgJChPUykgPSBNQUNPU1ggKSB7Ci0gICAgICAgICAgaGVhZGVycyArPSAkKGFoZWFkZXIpIDsKLSAgICAgICAgfQotICAgICAgY2FzZSAqLmggOiBoZWFkZXJzICs9ICQoYWhlYWRlcikgOwotICAgIH0KLSAgfQotCi0gIExPQ0FURSBvbiAkKDEpID0gJChBTExfTE9DQVRFX1RBUkdFVCkgOwotCi0gIEFQSU5BTUVTIG9uICQoMSkgPSBhcGluYW1lcyQoU1VGRVhFKSA7Ci0KLSAgRGVwZW5kcyAgICAgICAgICAgICQoMSkgOiAkKGFwaW5hbWVzKSAkKGhlYWRlcnMpIDsKLSAgR2VuRXhwb3J0U3ltYm9sczEgICQoMSkgOiAkKGhlYWRlcnMpIDsKLSAgQ2xlYW4gICAgICAgICAgICAgIGNsZWFuIDogJCgxKSA7Ci19Ci0KLWFjdGlvbnMgR2VuRXhwb3J0U3ltYm9sczEgYmluZCBBUElOQU1FUwotewotICAkKEFQSU5BTUVTKSAkKDIpID4gJCgxKQotfQotCi1HZW5FeHBvcnRTeW1ib2xzICBmdGV4cG9ydC5zeW0gOiBpbmNsdWRlL2ZyZWV0eXBlIDsKLQotIyBUZXN0IGZpbGVzIChoaW50ZXIgZGVidWdnaW5nKS4gIE9ubHkgdXNlZCBieSBGcmVlVHlwZSBkZXZlbG9wZXJzLgotIwotaWYgJChERUJVR19ISU5URVIpCi17Ci0gIFN1YkluY2x1ZGUgRlQyX1RPUCB0ZXN0cyA7Ci19Ci0KLXJ1bGUgUmVmRG9jCi17Ci0gIERlcGVuZHMgICQxIDogYWxsIDsKLSAgTm90RmlsZSAgJDEgOwotICBBbHdheXMgICAkMSA7Ci19Ci0KLWFjdGlvbnMgUmVmRG9jCi17Ci0gIHB5dGhvbiAkKEZUMl9TUkMpL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5Ci0gICAgICAgICAtLXByZWZpeD1mdDIKLSAgICAgICAgIC0tdGl0bGU9RnJlZVR5cGUtMi45LjEKLSAgICAgICAgIC0tb3V0cHV0PSQoRE9DX0RJUikKLSAgICAgICAgICQoRlQyX0lOQ0xVREUpL2ZyZWV0eXBlLyouaAotICAgICAgICAgJChGVDJfSU5DTFVERSkvZnJlZXR5cGUvY29uZmlnLyouaAotfQotCi1SZWZEb2MgIHJlZmRvYyA7Ci0KLQotIyBlbmQgb2YgdG9wIEphbWZpbGUKZGlmZiAtLWdpdCBhL0phbXJ1bGVzIGIvSmFtcnVsZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDA0YmMuLjAwMDAwMDAKLS0tIGEvSmFtcnVsZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jIEZyZWVUeXBlIDIgSmFtUnVsZXMuCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBKYW0gcnVsZXMgbmVlZGVkIHRvIGJ1aWxkIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuCi0jIEl0IGlzIHNoYXJlZCBieSBhbGwgSmFtZmlsZXMgYW5kIGlzIGluY2x1ZGVkIG9ubHkgb25jZSBpbiB0aGUgYnVpbGQKLSMgcHJvY2Vzcy4KLSMKLQotCi0jIENhbGwgU3ViRGlySGRycyBvbiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuCi0jCi1ydWxlIEFkZFN1YkRpckhkcnMKLXsKLSAgbG9jYWwgeCA7Ci0KLSAgZm9yIHggaW4gJCg8KQotICB7Ci0gICAgU3ViRGlySGRycyAkKHgpIDsKLSAgfQotfQotCi0KLSMgRGV0ZXJtaW5lIHByZWZpeCBvZiBsaWJyYXJ5IGZpbGUuICBXZSBtdXN0IHVzZSAibGlieHh4eHgiIG9uIFVuaXggc3lzdGVtcywKLSMgd2hpbGUgYWxsIG90aGVyIHNpbXBseSB1c2UgdGhlIHJlYWwgbmFtZS4KLSMKLWlmICQoVU5JWCkKLXsKLSAgTElCUFJFRklYID89IGxpYiA7Ci19Ci1lbHNlCi17Ci0gIExJQlBSRUZJWCA/PSAiIiA7Ci19Ci0KLSMgRlQyX1RPUCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIEZyZWVUeXBlIHNvdXJjZSBkaXJlY3RvcnkuICBZb3UgY2FuCi0jIHNldCBpdCB0byBhIHNwZWNpZmljIHZhbHVlIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgcGFydCBvZiBhCi0jIGxhcmdlciBwcm9qZWN0LgotIwotRlQyX1RPUCA/PSAkKERPVCkgOwotCi0jIERlZmluZSBhIG5ldyBydWxlIHVzZWQgdG8gZGVjbGFyZSBhIHN1YiBkaXJlY3Rvcnkgb2YgdGhlIE5pcnZhbmEgc291cmNlCi0jIHRyZWUuCi0jCi1ydWxlIEZUMl9TdWJEaXIKLXsKLSAgaWYgJChGVDJfVE9QKSA9ICQoRE9UKQotICB7Ci0gICAgcmV0dXJuIFsgRkRpck5hbWUgICQoPCkgXSA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgcmV0dXJuIFsgRkRpck5hbWUgICQoRlQyX1RPUCkgJCg8KSBdIDsKLSAgfQotfQotCi0jIFdlIGFsc28gc2V0IEFMTF9MT0NBVEVfVEFSR0VUIGluIG9yZGVyIHRvIHBsYWNlIGFsbCBvYmplY3QgYW5kIGxpYnJhcnkKLSMgZmlsZXMgaW4gIm9ianMiLgotIwotQUxMX0xPQ0FURV9UQVJHRVQgPz0gWyBGVDJfU3ViRGlyICBvYmpzIF0gOwotCi0KLSMgZW5kIG9mIEphbXJ1bGVzCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDBjN2VlMGUuLmUxZDE0NjkgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggYzIzYjk5ZS4uZTRjOGNmMSAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLSAgRnJlZVR5cGUgMi45LjEKLSAgPT09PT09PT09PT09PT0KKyAgRnJlZVR5cGUgMi4xMC40CisgID09PT09PT09PT09PT09PQogCiAgIEhvbWVwYWdlOiBodHRwczovL3d3dy5mcmVldHlwZS5vcmcKIApAQCAtMTUsMjIgKzE1LDI1IEBACiAgIFJlYWQgdGhlICBmaWxlcyBgZG9jcy9JTlNUQUxMKicgIGZvciBpbnN0YWxsYXRpb24gIGluc3RydWN0aW9uczsgc2VlCiAgIHRoZSBmaWxlIGBkb2NzL0xJQ0VOU0UuVFhUJyBmb3IgdGhlIGF2YWlsYWJsZSBsaWNlbnNlcy4KIAotICBUaGUgRnJlZVR5cGUgMiBBUEkgcmVmZXJlbmNlIGlzIGxvY2F0ZWQgaW4gYGRvY3MvcmVmZXJlbmNlJzsgdXNlIHRoZQotICBmaWxlICAgYGZ0Mi10b2MuaHRtbCcgICBhcyAgIHRoZSAgIHRvcCAgZW50cnkgICBwb2ludC4gICAgQWRkaXRpb25hbAotICBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhcyBhIHNlcGFyYXRlIHBhY2thZ2UgZnJvbSBvdXIgc2l0ZXMuICBHbwotICB0bworICBUaGUgRnJlZVR5cGUgIDIgQVBJICByZWZlcmVuY2UgaXMgbG9jYXRlZCAgaW4gYGRvY3MvcmVmZXJlbmNlL3NpdGUnOworICB1c2UgdGhlIGZpbGUgYGluZGV4Lmh0bWwnIGFzIHRoZSB0b3AgZW50cnkgcG9pbnQuICBbUGxlYXNlIG5vdGUgdGhhdAorICBjdXJyZW50bHkgdGhlICBzZWFyY2ggZnVuY3Rpb24gIGZvciBsb2NhbGx5ICBpbnN0YWxsZWQgZG9jdW1lbnRhdGlvbgorICBkb2Vzbid0IHdvcmsgZHVlIHRvIGNyb3NzLXNpdGUgc2NyaXB0aW5nIGlzc3Vlcy5dCisKKyAgQWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBhcyBhIHNlcGFyYXRlIHBhY2thZ2UgZnJvbSBvdXIKKyAgc2l0ZXMuICBHbyB0bwogCiAgICAgaHR0cHM6Ly9kb3dubG9hZC5zYXZhbm5haC5nbnUub3JnL3JlbGVhc2VzL2ZyZWV0eXBlLwogCiAgIGFuZCBkb3dubG9hZCBvbmUgb2YgdGhlIGZvbGxvd2luZyBmaWxlcy4KIAotICAgIGZyZWV0eXBlLWRvYy0yLjkuMS50YXIuYnoyCi0gICAgZnJlZXR5cGUtZG9jLTIuOS4xLnRhci5negotICAgIGZ0ZG9jMjkxLnppcAorICAgIGZyZWV0eXBlLWRvYy0yLjEwLjQudGFyLnh6CisgICAgZnJlZXR5cGUtZG9jLTIuMTAuNC50YXIuZ3oKKyAgICBmdGRvYzIxMDQuemlwCiAKICAgVG8gdmlldyB0aGUgZG9jdW1lbnRhdGlvbiBvbmxpbmUsIGdvIHRvCiAKLSAgICBodHRwczovL3d3dy5mcmVldHlwZS5vcmcvZnJlZXR5cGUyL2RvY3VtZW50YXRpb24uaHRtbAorICAgIGh0dHBzOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy8KIAogCiAgIE1haWxpbmcgTGlzdHMKQEAgLTY0LDYgKzY3LDE4IEBACiAgIGEgdGVyc2UgbWVzc2FnZSB0aGF0IG9ubHkgc2F5cyBgaXQgZG9lc24ndCB3b3JrJy4KIAogCisgIFBhdGNoZXMKKyAgPT09PT09PQorCisgIFBsZWFzZSAgc3VibWl0IHBhdGNoZXMgIHRvICB0aGUgYGZyZWV0eXBlLWRldmVsQG5vbmdudS5vcmcnICBtYWlsaW5nCisgIGxpc3QgIC0tICBhbmQgdGhhbmsgIHlvdSAgaW4gIGFkdmFuY2UgIGZvciAgeW91ciB3b3JrICBvbiAgaW1wcm92aW5nCisgIEZyZWVUeXBlIQorCisgIERldGFpbHMgb24gdGhlIHByb2Nlc3MgY2FuIGJlIGZvdW5kIGhlcmU6CisKKyAgICBodHRwczovL3d3dy5mcmVldHlwZS5vcmcvZGV2ZWxvcGVyLmh0bWwjcGF0Y2hlcworCisKICAgRW5qb3khCiAKIApAQCAtNzEsNyArODYsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDA2LTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKZGlmZiAtLWdpdCBhL1JFQURNRS5naXQgYi9SRUFETUUuZ2l0CmluZGV4IGEzZDdmYzAuLmM0ZjAwMzMgMTAwNjQ0Ci0tLSBhL1JFQURNRS5naXQKKysrIGIvUkVBRE1FLmdpdApAQCAtMzcsNyArMzcsNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDA1LTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKZGlmZiAtLWdpdCBhL2F1dG9nZW4uc2ggYi9hdXRvZ2VuLnNoCmluZGV4IGFiOTBlNjQuLjc5YzRlNGUgMTAwNzU1Ci0tLSBhL2F1dG9nZW4uc2gKKysrIGIvYXV0b2dlbi5zaApAQCAtMSw2ICsxLDYgQEAKICMhL2Jpbi9zaAogCi0jIENvcHlyaWdodCAyMDA1LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2FtaWdhL1JFQURNRSBiL2J1aWxkcy9hbWlnYS9SRUFETUUKaW5kZXggMjllOTdkNi4uYzU1MjUyNyAxMDA2NDQKLS0tIGEvYnVpbGRzL2FtaWdhL1JFQURNRQorKysgYi9idWlsZHMvYW1pZ2EvUkVBRE1FCkBAIC0xLDcgKzEsNyBAQAogCiBSRUFETUUgZm9yIHRoZSBidWlsZHMvYW1pZ2Egc3ViZGlyZWN0b3J5LgogCi1Db3B5cmlnaHQgMjAwNS0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQogV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLgogCiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMjYsNyArMjYsNyBAQAogaHR0cDovL3JhZ3JpZmZpLmhvbWUuc3ByeW5ldC5jb20pLgogCiBZb3Ugd2lsbCBhbHNvIG5lZWQgdGhlIGxhdGVzdCBpbmNsdWRlIGZpbGVzIGFuZCBhbWlnYS5saWIgZnJvbSB0aGUKLUFtaWdhIHdlYiBzaXRlIChodHRwOi8vd3d3LmFtaWdhLmNvbS8zLjkvZG93bmxvYWQvTkRLMy45LmxoYSkgZm9yCitBbWlnYSB3ZWIgc2l0ZSAoaHR0cHM6Ly9vcy5hbWlnYXdvcmxkLmRlL2Rvd25sb2FkLnBocD9pZD0zKSBmb3IKIEFtaWdhT1MgMy45OyB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIHdvcmsgdW5kZXIgQW1pZ2FPUyAyLjA0IGFuZCB1cC4KIAogVG8gdXNlIGl0LCBjYWxsICJzbWFrZSBhc3NpZ24iIGFuZCB0aGVuICJzbWFrZSIgZnJvbSB0aGUgYnVpbGRzL2FtaWdhCmRpZmYgLS1naXQgYS9idWlsZHMvYW1pZ2EvaW5jbHVkZS9jb25maWcvZnRjb25maWcuaCBiL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oCmluZGV4IDAyMTdlMGUuLjQ5NzZjNzUgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oCisrKyBiL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFtaWdhLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCmRpZmYgLS1naXQgYS9idWlsZHMvYW1pZ2EvaW5jbHVkZS9jb25maWcvZnRtb2R1bGUuaCBiL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oCmluZGV4IGY4YmFhYjUuLjYwMzViZjAgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oCisrKyBiL2J1aWxkcy9hbWlnYS9pbmNsdWRlL2NvbmZpZy9mdG1vZHVsZS5oCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEFtaWdhLXNwZWNpZmljIEZyZWVUeXBlIG1vZHVsZSBzZWxlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xMzcsOCArMTM3LDYgQEAKIAogI2lmZGVmIEZUX1VTRV9TTU9PVEgKIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzICkKICNlbmRpZgogCiAjaWZkZWYgRlRfVVNFX09UVgpkaWZmIC0tZ2l0IGEvYnVpbGRzL2FtaWdhL21ha2VmaWxlIGIvYnVpbGRzL2FtaWdhL21ha2VmaWxlCmluZGV4IDZhNzcwMGEuLjUwMzE1ZjMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZQorKysgYi9idWlsZHMvYW1pZ2EvbWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CiAjIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQgYi9idWlsZHMvYW1pZ2EvbWFrZWZpbGUub3M0CmluZGV4IDBkMzQwY2YuLmNkNTE1MWMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbWlnYS9tYWtlZmlsZS5vczQKKysrIGIvYnVpbGRzL2FtaWdhL21ha2VmaWxlLm9zNApAQCAtNCw3ICs0LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDA1LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKICMgV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2FtaWdhL3NtYWtlZmlsZSBiL2J1aWxkcy9hbWlnYS9zbWFrZWZpbGUKaW5kZXggZjVkZTMwOC4uZmE0MTY3NiAxMDA2NDQKLS0tIGEvYnVpbGRzL2FtaWdhL3NtYWtlZmlsZQorKysgYi9idWlsZHMvYW1pZ2Evc21ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDUtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQogIyBXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jIGIvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0ZGVidWcuYwppbmRleCBmM2JhNDhjLi42NTEwZDIwIDEwMDY0NAotLS0gYS9idWlsZHMvYW1pZ2Evc3JjL2Jhc2UvZnRkZWJ1Zy5jCisrKyBiL2J1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdGRlYnVnLmMKQEAgLTEsNzYgKzEsNzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IGZvciBhbWlnYSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcgYW5kIERldGxlZiBX/HJrbmVyLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0ZGVidWcuYworICoKKyAqICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCBmb3IgYW1pZ2EgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZywgYW5kIERldGxlZiBXdWVya25lci4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBjb21wb25lbnQgY29udGFpbnMgdmFyaW91cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB1c2VkIHRvIGVhc2UgdGhlICovCi0gIC8qIGRlYnVnZ2luZyBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLiAgSXRzIG1haW4gcHVycG9zZSBpcyBpbiBhc3NlcnRpb24gICAqLwotICAvKiBjaGVja2luZywgdHJhY2luZywgYW5kIGVycm9yIGRldGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSBub3cgdGhyZWUgZGVidWdnaW5nIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSB0cmFjZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgbG9nIGZpbGUgKHdoaWNoIGNhbiBiZSB0aGUgKi8KLSAgLyogICBzdGFuZGFyZCBlcnJvciBvdXRwdXQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGVycm9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT25seSBlcnJvciBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSByZWxlYXNlIG1vZGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vIGVycm9yIG1lc3NhZ2UgaXMgc2VudCBvciBnZW5lcmF0ZWQuICBUaGUgY29kZSBpcyBmcmVlIGZyb20gYW55ICAgKi8KLSAgLyogICBkZWJ1Z2dpbmcgcGFydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZQorICAgKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uCisgICAqIGNoZWNraW5nLCB0cmFjaW5nLCBhbmQgZXJyb3IgZGV0ZWN0aW9uLgorICAgKgorICAgKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczoKKyAgICoKKyAgICogLSB0cmFjZSBtb2RlCisgICAqCisgICAqICAgRXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSAod2hpY2ggY2FuIGJlIHRoZQorICAgKiAgIHN0YW5kYXJkIGVycm9yIG91dHB1dCkuCisgICAqCisgICAqIC0gZXJyb3IgbW9kZQorICAgKgorICAgKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4KKyAgICoKKyAgICogLSByZWxlYXNlIG1vZGU6CisgICAqCisgICAqICAgTm8gZXJyb3IgbWVzc2FnZSBpcyBzZW50IG9yIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGlzIGZyZWUgZnJvbSBhbnkKKyAgICogICBkZWJ1Z2dpbmcgcGFydHMuCisgICAqCisgICAqLwogCiAKICAgLyoKLSAgICogQmFzZWQgb24gdGhlIGRlZmF1bHQgZnRkZWJ1Zy5jLAotICAgKiByZXBsYWNlZCB2cHJpbnRmKCkgd2l0aCBLVlByaW50RigpLAotICAgKiBjb21tZW50ZWQgb3V0IGV4aXQoKSwKLSAgICogcmVwbGFjZWQgZ2V0ZW52KCkgd2l0aCBHZXRWYXIoKS4KKyAgICogQmFzZWQgb24gdGhlIGRlZmF1bHQgYGZ0ZGVidWcuYycgZmlsZSwKKyAgICogcmVwbGFjZWQgYHZwcmludGYnIHdpdGggYEtWUHJpbnRGJywKKyAgICogY29tbWVudGVkIG91dCBgZXhpdCcsCisgICAqIHJlcGxhY2VkIGBnZXRlbnYnIHdpdGggYEdldFZhcicuCiAgICAqLwogCiAjaW5jbHVkZSA8ZXhlYy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxpdHkvdGFnaXRlbS5oPgogI2luY2x1ZGUgPGRvcy9leGFsbC5oPgogI2luY2x1ZGUgPGRvcy92YXIuaD4KKwogI2RlZmluZSBfX05PTElCQkFTRV9fCiAjZGVmaW5lIF9fTk9MT0JBTElGQUNFX18KICNkZWZpbmUgX19VU0VfSU5MSU5FX18KKwogI2luY2x1ZGUgPHByb3RvL2Rvcy5oPgogI2luY2x1ZGUgPGNsaWIvZGVidWdfcHJvdG9zLmg+CiAKICNpZm5kZWYgX19hbWlnYW9zNF9fCi0gIGV4dGVybiBzdHJ1Y3QgTGlicmFyeSAqRE9TQmFzZTsKKyAgZXh0ZXJuIHN0cnVjdCBMaWJyYXJ5KiAgRE9TQmFzZTsKICNlbHNlCi0gIGV4dGVybiBzdHJ1Y3QgRE9TSUZhY2UgKklET1M7CisgIGV4dGVybiBzdHJ1Y3QgRE9TSUZhY2UqICBJRE9TOwogI2VuZGlmCiAKIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKIAotI2lmIGRlZmluZWQoIEZUX0RFQlVHX0xFVkVMX0VSUk9SICkKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCiAKQEAgLTEwMCw3ICsxMDIsNyBAQAogICAgIEtWUHJpbnRGKCBmbXQsIGFwICk7CiAgICAgdmFfZW5kKCBhcCApOwogCi0vKiAgZXhpdCggRVhJVF9GQUlMVVJFICk7ICovCisgICAgLyogZXhpdCggRVhJVF9GQUlMVVJFICk7ICovCiAgIH0KIAogCkBAIC0xMTEsOSArMTEzLDE5IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICkKICAgeworI2lmIDAKKyAgICAvKiBhY3RpdmF0aW5nIHRoZSBjb2RlIGluIHRoaXMgYmxvY2sgbWFrZXMgRnJlZVR5cGUgdmVyeSBjaGF0dHkgKi8KKyAgICBmcHJpbnRmKCBzdGRlcnIsCisgICAgICAgICAgICAgIiVzOiVkOiBlcnJvciAweCUwMng6ICVzXG4iLAorICAgICAgICAgICAgIGZpbGUsCisgICAgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICBGVF9FcnJvcl9TdHJpbmcoIGVycm9yICkgKTsKKyNlbHNlCiAgICAgRlRfVU5VU0VEKCBlcnJvciApOwogICAgIEZUX1VOVVNFRCggbGluZSApOwogICAgIEZUX1VOVVNFRCggZmlsZSApOworI2VuZGlmCiAKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTI0LDE2ICsxMzYsMjMgQEAKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKLSAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwICovCi0gIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKKyAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwOyAqLworICAvKiB0aGlzIGdldHMgYWRqdXN0ZWQgYXQgcnVuLXRpbWUgICAgICAgICAgICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19lbmFibGVkW3RyYWNlX2NvdW50XTsKIAorICAvKiBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIGFsd2F5cyBpbml0aWFsaXplZCB0byAwICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19kaXNhYmxlZFt0cmFjZV9jb3VudF07CisKKyAgLyogYSBwb2ludGVyIHRvIGVpdGhlciBgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQnICovCisgIC8qIG9yIGBmdF90cmFjZV9sZXZlbHNfZGlzYWJsZWQnICAgICAgICAgICAgICAgICAqLworICBpbnQqICBmdF90cmFjZV9sZXZlbHM7CiAKICAgLyogZGVmaW5lIGFycmF5IG9mIHRyYWNlIHRvZ2dsZSBuYW1lcyAqLwogI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgI3ggLAogCiAgIHN0YXRpYyBjb25zdCBjaGFyKiAgZnRfdHJhY2VfdG9nZ2xlc1t0cmFjZV9jb3VudCArIDFdID0KICAgewotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJBQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KICAgICBOVUxMCiAgIH07CiAKQEAgLTE2NCwzMyArMTgzLDUxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhY2luZyBzdWItc3lzdGVtLiAgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlICAgICovCi0gIC8qIHZhbHVlIG9mIHRoZSBgRlQyX0RFQlVHJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mICAqLwotICAvKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycsIG9yIGAsJy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4cG9ydCBGVDJfREVCVUc9ImFueTozIG1lbW9yeTo3IHN0cmVhbTo1IiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyByZXF1ZXN0cyB0aGF0IGFsbCBsZXZlbHMgYmUgc2V0IHRvIDMsIGV4Y2VwdCB0aGUgdHJhY2UgbGV2ZWwgZm9yICovCi0gIC8qIHRoZSBtZW1vcnkgYW5kIHN0cmVhbSBjb21wb25lbnRzIHdoaWNoIGFyZSBzZXQgdG8gNyBhbmQgNSwgICAgICAgICAgICAqLwotICAvKiByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mIHRoZSAqLwotICAvKiBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwotICAvKiBydW50aW1lIGVycm9ycyksIGFuZCA3IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9EaXNhYmxlKCB2b2lkICkKKyAgeworICAgIGZ0X3RyYWNlX2xldmVscyA9IGZ0X3RyYWNlX2xldmVsc19kaXNhYmxlZDsKKyAgfQorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKworICBGVF9CQVNFX0RFRiggdm9pZCApCisgIEZUX1RyYWNlX0VuYWJsZSggdm9pZCApCisgIHsKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEluaXRpYWxpemUgdGhlIHRyYWNpbmcgc3ViLXN5c3RlbS4gIFRoaXMgaXMgZG9uZSBieSByZXRyaWV2aW5nIHRoZQorICAgKiB2YWx1ZSBvZiB0aGUgYEZUMl9ERUJVRycgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJdCBtdXN0IGJlIGEgbGlzdCBvZgorICAgKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycsIG9yIGAsJy4gIEV4YW1wbGU6CisgICAqCisgICAqICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiCisgICAqCisgICAqIFRoaXMgcmVxdWVzdHMgdGhhdCBhbGwgbGV2ZWxzIGJlIHNldCB0byAzLCBleGNlcHQgdGhlIHRyYWNlIGxldmVsIGZvcgorICAgKiB0aGUgbWVtb3J5IGFuZCBzdHJlYW0gY29tcG9uZW50cyB3aGljaCBhcmUgc2V0IHRvIDcgYW5kIDUsCisgICAqIHJlc3BlY3RpdmVseS4KKyAgICoKKyAgICogU2VlIHRoZSBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCcgZm9yIGRldGFpbHMgb2YKKyAgICogdGhlIGF2YWlsYWJsZSB0b2dnbGUgbmFtZXMuCisgICAqCisgICAqIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzCisgICAqIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuCisgICAqLwogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIGZ0X2RlYnVnX2luaXQoIHZvaWQgKQogICB7Ci0vKiAgY29uc3QgY2hhciogIGZ0Ml9kZWJ1ZyA9IGdldGVudiggIkZUMl9ERUJVRyIgKTsgKi8KKyAgICAvKiBjb25zdCBjaGFyKiAgZnQyX2RlYnVnID0gZnRfZ2V0ZW52KCAiRlQyX0RFQlVHIiApOyAqLwogICAgIGNoYXIgICAgICAgICBidWZbMjU2XTsKICAgICBjb25zdCBjaGFyKiAgZnQyX2RlYnVnID0gJmJ1ZlswXTsKIAogCi0vKiAgaWYgKCBmdDJfZGVidWcgKSAqLworICAgIC8qIGlmICggZnQyX2RlYnVnICkgKi8KICAgICBpZiAoIEdldFZhciggIkZUMl9ERUJVRyIsIChTVFJQVFIpZnQyX2RlYnVnLCAyNTYsIExWX1ZBUiApID4gMCApCiAgICAgewogICAgICAgY29uc3QgY2hhciogIHAgPSBmdDJfZGVidWc7CkBAIC0yNTAsMTQgKzI4NywxNiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGBhbnknICovCiAgICAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW25dID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWRbbl0gPSBsZXZlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW2ZvdW5kXSA9IGxldmVsOworICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZFtmb3VuZF0gPSBsZXZlbDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZDsKICAgfQogCiAKQEAgLTI4NywxMSArMzI2LDIzIEBACiAgIH0KIAogCisgIEZUX0JBU0VfREVGKCB2b2lkICkKKyAgRlRfVHJhY2VfRGlzYWJsZSggdm9pZCApCisgIHsKKyAgICAvKiBub3RoaW5nICovCisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9FbmFibGUoIHZvaWQgKQorICB7CisgICAgLyogbm90aGluZyAqLworICB9CisKKwogI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwogCi0vKgotTG9jYWwgVmFyaWFibGVzOgotY29kaW5nOiBsYXRpbi0xCi1FbmQ6Ci0qLworCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy9hbWlnYS9zcmMvYmFzZS9mdHN5c3RlbS5jIGIvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKaW5kZXggYmFiYWVlYi4uMWRmYmQ2NiAxMDA2NDQKLS0tIGEvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKKysrIGIvYnVpbGRzL2FtaWdhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKQEAgLTQsNyArNCw3IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgQW1pZ2Etc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgRGV0bGVmIFf8cmtuZXIuICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KQEAgLTk2LDEwICs5NiwxMCBAQAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c3lzdGVtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdHR5cGVzLmg+CiAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpAQCAtMjM1LDcgKzIzNSw3IEBACiAgIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfaW8KKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBpbwogCiAgIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZJTEUgZm9yIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICovCiAgIC8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCmRpZmYgLS1naXQgYS9idWlsZHMvYW5zaS9hbnNpLWRlZi5tayBiL2J1aWxkcy9hbnNpL2Fuc2ktZGVmLm1rCmluZGV4IDE0ODRmOTYuLjk2NDIwOTggMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbnNpL2Fuc2ktZGVmLm1rCisrKyBiL2J1aWxkcy9hbnNpL2Fuc2ktZGVmLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xOSw2ICsxOSw5IEBACiBCVUlMRF9ESVIgOj0gJChUT1BfRElSKS9idWlsZHMvYW5zaQogUExBVEZPUk0gIDo9IGFuc2kKIAorIyBUaGlzIGlzIHVzZWQgZm9yIGBtYWtlIHJlZmRvYycgYW5kIGBtYWtlIHJlZmRvYy12ZW52JworIworQklOIDo9IGJpbgogCiAjIFRoZSBkaXJlY3Rvcnkgd2hlcmUgYWxsIGxpYnJhcnkgZmlsZXMgYXJlIHBsYWNlZC4KICMKZGlmZiAtLWdpdCBhL2J1aWxkcy9hbnNpL2Fuc2kubWsgYi9idWlsZHMvYW5zaS9hbnNpLm1rCmluZGV4IGMwNjczMmMuLmMyNDQ4MDMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9hbnNpL2Fuc2kubWsKKysrIGIvYnVpbGRzL2Fuc2kvYW5zaS5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2Jlb3MvYmVvcy1kZWYubWsgYi9idWlsZHMvYmVvcy9iZW9zLWRlZi5tawppbmRleCA4OWM1NGRkLi41YWU3ZWQ4IDEwMDY0NAotLS0gYS9idWlsZHMvYmVvcy9iZW9zLWRlZi5taworKysgYi9idWlsZHMvYmVvcy9iZW9zLWRlZi5tawpAQCAtNSw3ICs1LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMjEsNiArMjEsOSBAQAogQlVJTERfRElSIDo9ICQoVE9QX0RJUikvYnVpbGRzL2Jlb3MKIFBMQVRGT1JNICA6PSBiZW9zCiAKKyMgVGhpcyBpcyB1c2VkIGZvciBgbWFrZSByZWZkb2MnIGFuZCBgbWFrZSByZWZkb2MtdmVudicKKyMKK0JJTiA6PSBiaW4KIAogIyBUaGUgZGlyZWN0b3J5IHdoZXJlIGFsbCBsaWJyYXJ5IGZpbGVzIGFyZSBwbGFjZWQuCiAjCmRpZmYgLS1naXQgYS9idWlsZHMvYmVvcy9iZW9zLm1rIGIvYnVpbGRzL2Jlb3MvYmVvcy5tawppbmRleCA2MTljZWFmLi4xYTA4MmMxIDEwMDY0NAotLS0gYS9idWlsZHMvYmVvcy9iZW9zLm1rCisrKyBiL2J1aWxkcy9iZW9zL2Jlb3MubWsKQEAgLTIsNyArMiw3IEBACiAjIEZyZWVUeXBlIDIgY29uZmlndXJhdGlvbiBydWxlcyBmb3IgYSBCZU9TIHN5c3RlbQogIwogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2Jlb3MvZGV0ZWN0Lm1rIGIvYnVpbGRzL2Jlb3MvZGV0ZWN0Lm1rCmluZGV4IDgyZjYyMDUuLjViOTI1MTIgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9iZW9zL2RldGVjdC5taworKysgYi9idWlsZHMvYmVvcy9kZXRlY3QubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9jbWFrZS9GaW5kQnJvdGxpRGVjLmNtYWtlIGIvYnVpbGRzL2NtYWtlL0ZpbmRCcm90bGlEZWMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ODRjNwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy9jbWFrZS9GaW5kQnJvdGxpRGVjLmNtYWtlCkBAIC0wLDAgKzEsNTEgQEAKKyMgRmluZEJyb3RsaURlYy5jbWFrZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBieQorIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisjCisjIFdyaXR0ZW4gYnkgV2VybmVyIExlbWJlcmcgPHdsQGdudS5vcmc+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCisjIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKKyMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKKyMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKKyMgZnVsbHkuCisjCisjCisjIFRyeSB0byBmaW5kIGxpYmJyb3RsaWRlYyBpbmNsdWRlIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgorIworIyBJZiBmb3VuZCwgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIHNldC4KKyMKKyMgICBCUk9UTElERUNfSU5DTFVERV9ESVJTCisjICAgQlJPVExJREVDX0xJQlJBUklFUworCitpbmNsdWRlKEZpbmRQa2dDb25maWcpCitwa2dfY2hlY2tfbW9kdWxlcyhQQ19CUk9UTElERUMgUVVJRVQgbGliYnJvdGxpZGVjKQorCitpZiAoUENfQlJPVExJREVDX1ZFUlNJT04pCisgIHNldChCUk9UTElERUNfVkVSU0lPTiAiJHtQQ19CUk9UTElERUNfVkVSU0lPTn0iKQorZW5kaWYgKCkKKworCitmaW5kX3BhdGgoQlJPVExJREVDX0lOQ0xVREVfRElSUworICBOQU1FUyBicm90bGkvZGVjb2RlLmgKKyAgSElOVFMgJHtQQ19CUk9UTElERUNfSU5DTFVERURJUn0KKyAgICAgICAgJHtQQ19CUk9UTElERUNfSU5DTFVERV9ESVJTfQorICBQQVRIX1NVRkZJWEVTIGJyb3RsaSkKKworZmluZF9saWJyYXJ5KEJST1RMSURFQ19MSUJSQVJJRVMKKyAgTkFNRVMgYnJvdGxpZGVjCisgIEhJTlRTICR7UENfQlJPVExJREVDX0xJQkRJUn0KKyAgICAgICAgJHtQQ19CUk9UTElERUNfTElCUkFSWV9ESVJTfSkKKworCitpbmNsdWRlKEZpbmRQYWNrYWdlSGFuZGxlU3RhbmRhcmRBcmdzKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKAorICBicm90bGlkZWMKKyAgUkVRVUlSRURfVkFSUyBCUk9UTElERUNfSU5DTFVERV9ESVJTIEJST1RMSURFQ19MSUJSQVJJRVMKKyAgRk9VTkRfVkFSIEJST1RMSURFQ19GT1VORAorICBWRVJTSU9OX1ZBUiBCUk9UTElERUNfVkVSU0lPTikKKworbWFya19hc19hZHZhbmNlZCgKKyAgQlJPVExJREVDX0lOQ0xVREVfRElSUworICBCUk9UTElERUNfTElCUkFSSUVTKQpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NtYWtlL0ZpbmRIYXJmQnV6ei5jbWFrZSBiL2J1aWxkcy9jbWFrZS9GaW5kSGFyZkJ1enouY21ha2UKaW5kZXggZWUwZDUyZS4uZDQ4OTYxMyAxMDA2NDQKLS0tIGEvYnVpbGRzL2NtYWtlL0ZpbmRIYXJmQnV6ei5jbWFrZQorKysgYi9idWlsZHMvY21ha2UvRmluZEhhcmZCdXp6LmNtYWtlCkBAIC0yMyw1OSArMjMsNjUgQEAKICMgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKICMgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICMgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jCi0jIFRyeSB0byBmaW5kIEhhcmZidXp6IGluY2x1ZGUgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMuCisKKworIyBUcnkgdG8gZmluZCBIYXJmQnV6eiBpbmNsdWRlIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogIwogIyBBZnRlciBzdWNjZXNzZnVsIGRpc2NvdmVyeSwgdGhpcyB3aWxsIHNldCBmb3IgaW5jbHVzaW9uIHdoZXJlIG5lZWRlZDoKLSMgSEFSRkJVWlpfSU5DTFVERV9ESVJTIC0gY29udGFpbmcgdGhlIEhhcmZCdXp6IGhlYWRlcnMKLSMgSEFSRkJVWlpfTElCUkFSSUVTIC0gY29udGFpbmcgdGhlIEhhcmZCdXp6IGxpYnJhcnkKKyMKKyMgICBIQVJGQlVaWl9JTkNMVURFX0RJUlMgLSBjb250YWluZyB0aGUgSGFyZkJ1enogaGVhZGVycworIyAgIEhBUkZCVVpaX0xJQlJBUklFUyAgICAtIGNvbnRhaW5nIHRoZSBIYXJmQnV6eiBsaWJyYXJ5CiAKIGluY2x1ZGUoRmluZFBrZ0NvbmZpZykKIHBrZ19jaGVja19tb2R1bGVzKFBDX0hBUkZCVVpaIFFVSUVUIGhhcmZidXp6KQogCiBmaW5kX3BhdGgoSEFSRkJVWlpfSU5DTFVERV9ESVJTCi0gICAgTkFNRVMgaGIuaAotICAgIEhJTlRTICR7UENfSEFSRkJVWlpfSU5DTFVERURJUn0KLSAgICAgICAgICAke1BDX0hBUkZCVVpaX0lOQ0xVREVfRElSU30KLSAgICBQQVRIX1NVRkZJWEVTIGhhcmZidXp6Ci0pCisgIE5BTUVTIGhiLmgKKyAgSElOVFMgJHtQQ19IQVJGQlVaWl9JTkNMVURFRElSfQorICAgICAgICAke1BDX0hBUkZCVVpaX0lOQ0xVREVfRElSU30KKyAgUEFUSF9TVUZGSVhFUyBoYXJmYnV6eikKIAotZmluZF9saWJyYXJ5KEhBUkZCVVpaX0xJQlJBUklFUyBOQU1FUyBoYXJmYnV6egotICAgIEhJTlRTICR7UENfSEFSRkJVWlpfTElCRElSfQotICAgICAgICAgICR7UENfSEFSRkJVWlpfTElCUkFSWV9ESVJTfQotKQorZmluZF9saWJyYXJ5KEhBUkZCVVpaX0xJQlJBUklFUworICBOQU1FUyBoYXJmYnV6egorICBISU5UUyAke1BDX0hBUkZCVVpaX0xJQkRJUn0KKyAgICAgICAgJHtQQ19IQVJGQlVaWl9MSUJSQVJZX0RJUlN9KQogCiBpZiAoSEFSRkJVWlpfSU5DTFVERV9ESVJTKQotICAgIGlmIChFWElTVFMgIiR7SEFSRkJVWlpfSU5DTFVERV9ESVJTfS9oYi12ZXJzaW9uLmgiKQotICAgICAgICBmaWxlKFJFQUQgIiR7SEFSRkJVWlpfSU5DTFVERV9ESVJTfS9oYi12ZXJzaW9uLmgiIF9oYXJmYnV6el92ZXJzaW9uX2NvbnRlbnQpCisgIGlmIChFWElTVFMgIiR7SEFSRkJVWlpfSU5DTFVERV9ESVJTfS9oYi12ZXJzaW9uLmgiKQorICAgIGZpbGUoUkVBRCAiJHtIQVJGQlVaWl9JTkNMVURFX0RJUlN9L2hiLXZlcnNpb24uaCIgX2hhcmZidXp6X3ZlcnNpb25fY29udGVudCkKIAotICAgICAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIiNkZWZpbmUgK0hCX1ZFUlNJT05fU1RSSU5HICtcIihbMC05XStcXC5bMC05XStcXC5bMC05XSspXCIiIF9kdW1teSAiJHtfaGFyZmJ1enpfdmVyc2lvbl9jb250ZW50fSIpCi0gICAgICAgIHNldChIQVJGQlVaWl9WRVJTSU9OICIke0NNQUtFX01BVENIXzF9IikKLSAgICBlbmRpZiAoKQorICAgIHN0cmluZyhSRUdFWCBNQVRDSAorICAgICAgICAgICAiI2RlZmluZSArSEJfVkVSU0lPTl9TVFJJTkcgK1wiKFswLTldK1xcLlswLTldK1xcLlswLTldKylcIiIKKyAgICAgICAgICAgX2R1bW15ICIke19oYXJmYnV6el92ZXJzaW9uX2NvbnRlbnR9IikKKyAgICBzZXQoSEFSRkJVWlpfVkVSU0lPTiAiJHtDTUFLRV9NQVRDSF8xfSIpCisgIGVuZGlmICgpCiBlbmRpZiAoKQogCiBpZiAoIiR7aGFyZmJ1enpfRklORF9WRVJTSU9OfSIgVkVSU0lPTl9HUkVBVEVSICIke0hBUkZCVVpaX1ZFUlNJT059IikKLSAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJSZXF1aXJlZCB2ZXJzaW9uICgiICR7aGFyZmJ1enpfRklORF9WRVJTSU9OfSAiKSBpcyBoaWdoZXIgdGhhbiBmb3VuZCB2ZXJzaW9uICgiICR7SEFSRkJVWlpfVkVSU0lPTn0gIikiKQorICBtZXNzYWdlKEZBVEFMX0VSUk9SCisgICAgIlJlcXVpcmVkIHZlcnNpb24gKCIgJHtoYXJmYnV6el9GSU5EX1ZFUlNJT059ICIpIgorICAgICIgaXMgaGlnaGVyIHRoYW4gZm91bmQgdmVyc2lvbiAoIiAke0hBUkZCVVpaX1ZFUlNJT059ICIpIikKIGVuZGlmICgpCiAKIGluY2x1ZGUoRmluZFBhY2thZ2VIYW5kbGVTdGFuZGFyZEFyZ3MpCi1GSU5EX1BBQ0tBR0VfSEFORExFX1NUQU5EQVJEX0FSR1MoCi0gICAgaGFyZmJ1enogCi0gICAgICAgIFJFUVVJUkVEX1ZBUlMgSEFSRkJVWlpfSU5DTFVERV9ESVJTIEhBUkZCVVpaX0xJQlJBUklFUwotICAgICAgICBWRVJTSU9OX1ZBUiBIQVJGQlVaWl9WRVJTSU9OKQorZmluZF9wYWNrYWdlX2hhbmRsZV9zdGFuZGFyZF9hcmdzKAorICBoYXJmYnV6egorICBSRVFVSVJFRF9WQVJTIEhBUkZCVVpaX0lOQ0xVREVfRElSUyBIQVJGQlVaWl9MSUJSQVJJRVMKKyAgVkVSU0lPTl9WQVIgSEFSRkJVWlpfVkVSU0lPTikKIAogbWFya19hc19hZHZhbmNlZCgKLSAgICBIQVJGQlVaWl9JTkNMVURFX0RJUlMKLSAgICBIQVJGQlVaWl9MSUJSQVJJRVMKLSkKKyAgSEFSRkJVWlpfSU5DTFVERV9ESVJTCisgIEhBUkZCVVpaX0xJQlJBUklFUykKIAotIyBBbGxvd3MgZWFzeSBsaW5raW5nIGFzIGluIAorIyBBbGxvdyBlYXN5IGxpbmtpbmcgYXMgaW4KKyMKICMgICB0YXJnZXRfbGlua19saWJyYXJpZXMoZnJlZXR5cGUgUFJJVkFURSBIYXJmYnV6ejo6SGFyZmJ1enopCisjCiBpZiAoTk9UIENNQUtFX1ZFUlNJT04gVkVSU0lPTl9MRVNTIDMuMSkKLSAgICBpZiAoSEFSRkJVWlpfRk9VTkQgQU5EIE5PVCBUQVJHRVQgSGFyZmJ1eno6OkhhcmZidXp6KQotICAgICAgICBhZGRfbGlicmFyeShIYXJmYnV6ejo6SGFyZmJ1enogSU5URVJGQUNFIElNUE9SVEVEKQotICAgICAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoCi0gICAgICAgICAgICBIYXJmYnV6ejo6SGFyZmJ1enogUFJPUEVSVElFUwotICAgICAgICAgICAgICAgIElOVEVSRkFDRV9JTkNMVURFX0RJUkVDVE9SSUVTICIke0hBUkZCVVpaX0lOQ0xVREVfRElSU30iKQotICAgIGVuZGlmICgpCisgIGlmIChIQVJGQlVaWl9GT1VORCBBTkQgTk9UIFRBUkdFVCBIYXJmYnV6ejo6SGFyZmJ1enopCisgICAgYWRkX2xpYnJhcnkoSGFyZmJ1eno6OkhhcmZidXp6IElOVEVSRkFDRSBJTVBPUlRFRCkKKyAgICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMoCisgICAgICAgIEhhcmZidXp6OjpIYXJmYnV6eiBQUk9QRVJUSUVTCisgICAgICAgICAgSU5URVJGQUNFX0lOQ0xVREVfRElSRUNUT1JJRVMgIiR7SEFSRkJVWlpfSU5DTFVERV9ESVJTfSIpCisgIGVuZGlmICgpCiBlbmRpZiAoKQpkaWZmIC0tZ2l0IGEvYnVpbGRzL2NtYWtlL2lPUy5jbWFrZSBiL2J1aWxkcy9jbWFrZS9pT1MuY21ha2UKaW5kZXggYzZkYTcwYy4uNmY0NjgzNiAxMDA2NDQKLS0tIGEvYnVpbGRzL2NtYWtlL2lPUy5jbWFrZQorKysgYi9idWlsZHMvY21ha2UvaU9TLmNtYWtlCkBAIC0xLDYgKzEsNiBAQAogIyBpT1MuY21ha2UKICMKLSMgQ29weXJpZ2h0IDIwMTQtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMTQtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFdyaXR0ZW4gYnkgRGF2aWQgV2ltc2V5IDxkYXZpZEB3aW1zZXkudXM+CmRpZmYgLS1naXQgYS9idWlsZHMvY21ha2UvdGVzdGJ1aWxkLnNoIGIvYnVpbGRzL2NtYWtlL3Rlc3RidWlsZC5zaAppbmRleCAxZmEzYTE4Li5jYzY3YWJkIDEwMDc1NQotLS0gYS9idWlsZHMvY21ha2UvdGVzdGJ1aWxkLnNoCisrKyBiL2J1aWxkcy9jbWFrZS90ZXN0YnVpbGQuc2gKQEAgLTEsNiArMSw2IEBACiAjIS9iaW4vc2ggLWUKIAotIyBDb3B5cmlnaHQgMjAxNS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAxNS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTkzLDcgKzkzLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogCiBGVF9MaWJyYXJ5IGxpYnJhcnk7CmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvYW5zaS1jYy5tayBiL2J1aWxkcy9jb21waWxlci9hbnNpLWNjLm1rCmluZGV4IDk5ZmU4Y2IuLjc4YjEzYTQgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9jb21waWxlci9hbnNpLWNjLm1rCisrKyBiL2J1aWxkcy9jb21waWxlci9hbnNpLWNjLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvYmNjLWRldi5tayBiL2J1aWxkcy9jb21waWxlci9iY2MtZGV2Lm1rCmluZGV4IDhkNjdmYTEuLjVmNmYxNjEgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9jb21waWxlci9iY2MtZGV2Lm1rCisrKyBiL2J1aWxkcy9jb21waWxlci9iY2MtZGV2Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvYmNjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL2JjYy5tawppbmRleCAwMmQ0ODMzLi5mNWUyZThhIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvYmNjLm1rCisrKyBiL2J1aWxkcy9jb21waWxlci9iY2MubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9jb21waWxlci9lbXgubWsgYi9idWlsZHMvY29tcGlsZXIvZW14Lm1rCmluZGV4IDI5MjZiMTEuLmJiYjc2MDQgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9jb21waWxlci9lbXgubWsKKysrIGIvYnVpbGRzL2NvbXBpbGVyL2VteC5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAzLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL2djYy1kZXYubWsgYi9idWlsZHMvY29tcGlsZXIvZ2NjLWRldi5tawppbmRleCA0OGQyODQ4Li45NWI1ZjUwIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvZ2NjLWRldi5taworKysgYi9idWlsZHMvY29tcGlsZXIvZ2NjLWRldi5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL2djYy5tayBiL2J1aWxkcy9jb21waWxlci9nY2MubWsKaW5kZXggOWM3NzIzOS4uNjNjZDkzYiAxMDA2NDQKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL2djYy5taworKysgYi9idWlsZHMvY29tcGlsZXIvZ2NjLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL2ludGVsYy5tawppbmRleCBlOTIzNmQzLi5iM2M2OWIwIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvaW50ZWxjLm1rCisrKyBiL2J1aWxkcy9jb21waWxlci9pbnRlbGMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9jb21waWxlci91bml4LWxjYy5tayBiL2J1aWxkcy9jb21waWxlci91bml4LWxjYy5tawppbmRleCAwOWZmZmViLi4yNmY4ZTdiIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvdW5peC1sY2MubWsKKysrIGIvYnVpbGRzL2NvbXBpbGVyL3VuaXgtbGNjLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvY29tcGlsZXIvdmlzdWFsYWdlLm1rIGIvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGFnZS5tawppbmRleCAxMDI5OWRhLi40YThjOGFjIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvdmlzdWFsYWdlLm1rCisrKyBiL2J1aWxkcy9jb21waWxlci92aXN1YWxhZ2UubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9jb21waWxlci92aXN1YWxjLm1rIGIvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGMubWsKaW5kZXggNzRmNDk4Yi4uYTljZjcxZCAxMDA2NDQKLS0tIGEvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGMubWsKKysrIGIvYnVpbGRzL2NvbXBpbGVyL3Zpc3VhbGMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9jb21waWxlci93YXRjb20ubWsgYi9idWlsZHMvY29tcGlsZXIvd2F0Y29tLm1rCmluZGV4IGU0NTU5MjIuLjQzYTllMDYgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9jb21waWxlci93YXRjb20ubWsKKysrIGIvYnVpbGRzL2NvbXBpbGVyL3dhdGNvbS5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2NvbXBpbGVyL3dpbi1sY2MubWsgYi9idWlsZHMvY29tcGlsZXIvd2luLWxjYy5tawppbmRleCAxMzU2YzFjLi4wMGQ5ZDMxIDEwMDY0NAotLS0gYS9idWlsZHMvY29tcGlsZXIvd2luLWxjYy5taworKysgYi9idWlsZHMvY29tcGlsZXIvd2luLWxjYy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2RldGVjdC5tayBiL2J1aWxkcy9kZXRlY3QubWsKaW5kZXggZWI3Zjc5Ny4uOTQ2MjdmYyAxMDA2NDQKLS0tIGEvYnVpbGRzL2RldGVjdC5taworKysgYi9idWlsZHMvZGV0ZWN0Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkkKGluZm8gYCQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4pCiAJJChpbmZvICkKIAkkKGluZm8gT3RoZXJ3aXNlLCBzaW1wbHkgdHlwZSBgJChNQUtFKScgYWdhaW4gdG8gYnVpbGQgdGhlIGxpYnJhcnksKQotCSQoaW5mbyBvciBgJChNQUtFKSByZWZkb2MnIHRvIGJ1aWxkIHRoZSBBUEkgcmVmZXJlbmNlICh0aGlzIG5lZWRzIHB5dGhvbiA+PSAyLjYpLikKKwkkKGluZm8gb3IgYCQoTUFLRSkgcmVmZG9jJyB0byBidWlsZCB0aGUgQVBJIHJlZmVyZW5jZSAodGhpcyBuZWVkcyBQeXRob24gPj0gMy41KS4pCiAJJChpbmZvICkKIAlAJChDT1BZKSAkKHN1YnN0IC8sJChTRVApLCQoQ09ORklHX1JVTEVTKSAkKENPTkZJR19NSykpCiAKZGlmZiAtLWdpdCBhL2J1aWxkcy9kb3MvZGV0ZWN0Lm1rIGIvYnVpbGRzL2Rvcy9kZXRlY3QubWsKaW5kZXggMDIwMWY3Yi4uZjU5ODc5NCAxMDA2NDQKLS0tIGEvYnVpbGRzL2Rvcy9kZXRlY3QubWsKKysrIGIvYnVpbGRzL2Rvcy9kZXRlY3QubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTgwLDM2ICs4MCw0NiBAQAogICBpZm5lcSAoJChmaW5kc3RyaW5nIGVteCwkKE1BS0VDTURHT0FMUykpLCkgICAgICAgICMgRU1YIGdjYwogICAgIENPTkZJR19GSUxFIDo9IGRvcy1lbXgubWsKICAgICBDQyAgICAgICAgICA6PSBnY2MKLSAgICBlbXg6IHNldHVwCisKICAgICAuUEhPTlk6IGVteAorICAgIGVteDogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHR1cmJvYywkKE1BS0VDTURHT0FMUykpLCkgICAgICMgVHVyYm8gQwogICAgIENPTkZJR19GSUxFIDo9IGRvcy10Y2MubWsKICAgICBDQyAgICAgICAgICA6PSB0Y2MKLSAgICB0dXJib2M6IHNldHVwCisKICAgICAuUEhPTlk6IHR1cmJvYworICAgIHR1cmJvYzogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHdhdGNvbSwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgV2F0Y29tIEMvQysrCiAgICAgQ09ORklHX0ZJTEUgOj0gZG9zLXdhdC5tawogICAgIENDICAgICAgICAgIDo9IHdjYzM4NgotICAgIHdhdGNvbTogc2V0dXAKKwogICAgIC5QSE9OWTogd2F0Y29tCisgICAgd2F0Y29tOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgYm9ybGFuZGMsJChNQUtFQ01ER09BTFMpKSwpICAgIyBCb3JsYW5kIEMvQysrIDMyLWJpdAogICAgIENPTkZJR19GSUxFIDo9IGRvcy1iY2MubWsKICAgICBDQyAgICAgICAgICA6PSBiY2MzMgotICAgIGJvcmxhbmRjOiBzZXR1cAorCiAgICAgLlBIT05ZOiBib3JsYW5kYworICAgIGJvcmxhbmRjOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgYm9ybGFuZGMxNiwkKE1BS0VDTURHT0FMUykpLCkgIyBCb3JsYW5kIEMvQysrIDE2LWJpdAogICAgIENPTkZJR19GSUxFIDo9IGRvcy1iY2MubWsKICAgICBDQyAgICAgICAgICA6PSBiY2MKLSAgICBib3JsYW5kYzE2OiBzZXR1cAorCiAgICAgLlBIT05ZOiBib3JsYW5kYzE2CisgICAgYm9ybGFuZGMxNjogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIGJhc2gsJChTSEVMTCkpLCkgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGJhc2gKZGlmZiAtLWdpdCBhL2J1aWxkcy9kb3MvZG9zLWRlZi5tayBiL2J1aWxkcy9kb3MvZG9zLWRlZi5tawppbmRleCBjYjExNTRkLi4wNjdkMWQ0IDEwMDY0NAotLS0gYS9idWlsZHMvZG9zL2Rvcy1kZWYubWsKKysrIGIvYnVpbGRzL2Rvcy9kb3MtZGVmLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xOSw2ICsxOSw5IEBACiBCVUlMRF9ESVIgOj0gJChUT1BfRElSKS9idWlsZHMvZG9zCiBQTEFURk9STSAgOj0gZG9zCiAKKyMgVGhpcyBpcyB1c2VkIGZvciBgbWFrZSByZWZkb2MnIGFuZCBgbWFrZSByZWZkb2MtdmVudicKKyMKK0JJTiA6PSBTY3JpcHRzCiAKICMgVGhlIGV4ZWN1dGFibGUgZmlsZSBleHRlbnNpb24gKGZvciB0b29scyksICp3aXRoKiBsZWFkaW5nIGRvdC4KICMKZGlmZiAtLWdpdCBhL2J1aWxkcy9kb3MvZG9zLWVteC5tayBiL2J1aWxkcy9kb3MvZG9zLWVteC5tawppbmRleCBkZWRjYzNmLi41MTczMjA4IDEwMDY0NAotLS0gYS9idWlsZHMvZG9zL2Rvcy1lbXgubWsKKysrIGIvYnVpbGRzL2Rvcy9kb3MtZW14Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDMtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvZG9zL2Rvcy1nY2MubWsgYi9idWlsZHMvZG9zL2Rvcy1nY2MubWsKaW5kZXggNTMwOTlhYi4uNjM4ODkyZCAxMDA2NDQKLS0tIGEvYnVpbGRzL2Rvcy9kb3MtZ2NjLm1rCisrKyBiL2J1aWxkcy9kb3MvZG9zLWdjYy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL2Rvcy9kb3Mtd2F0Lm1rIGIvYnVpbGRzL2Rvcy9kb3Mtd2F0Lm1rCmluZGV4IDFiZDAwZTcuLjRlMzlkMjEgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9kb3MvZG9zLXdhdC5taworKysgYi9idWlsZHMvZG9zL2Rvcy13YXQubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9leHBvcnRzLm1rIGIvYnVpbGRzL2V4cG9ydHMubWsKaW5kZXggNTlmZTMxYS4uZWJhOTY2OCAxMDA2NDQKLS0tIGEvYnVpbGRzL2V4cG9ydHMubWsKKysrIGIvYnVpbGRzL2V4cG9ydHMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9mcmVldHlwZS5tayBiL2J1aWxkcy9mcmVldHlwZS5tawppbmRleCA2ZjY4YTBmLi4xZDdlZWI2IDEwMDY0NAotLS0gYS9idWlsZHMvZnJlZXR5cGUubWsKKysrIGIvYnVpbGRzL2ZyZWV0eXBlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC03NSw3ICs3NSw3IEBACiAjIFRoZSB0YXJnZXRzIGBvYmplY3RzJyBhbmQgYGxpYnJhcnknIGFyZSBkZWZpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcwogIyBNYWtlZmlsZSBhZnRlciBhbGwgb3RoZXIgcnVsZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLgogIwotLlBIT05ZOiBzaW5nbGUgbXVsdGkgb2JqZWN0cyBsaWJyYXJ5IHJlZmRvYworLlBIT05ZOiBzaW5nbGUgbXVsdGkgb2JqZWN0cyBsaWJyYXJ5IHJlZmRvYyByZWZkb2MtdmVudgogCiAjIGRlZmF1bHQgdGFyZ2V0IC0tIGJ1aWxkIHNpbmdsZSBvYmplY3RzIGFuZCBsaWJyYXJ5CiAjCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogIyBUaGUgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuCiAjCi1ET0NfRElSID89ICQoVE9QX0RJUikvZG9jcy9yZWZlcmVuY2UKK0RPQ19ESVIgPz0gJChUT1BfRElSKS9kb2NzCiAKICMgVGhlIGZpbmFsIG5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZS4KICMKQEAgLTEyNiwxMiArMTI2LDE0IEBACiAKIElOQ0xVREVfRkxBR1MgOj0gJChJTkNMVURFUzolPSRJJSkKIAorIyBGb3IgYSBkZXZlbG9wbWVudCBidWlsZCwgd2UgYXNzdW1lIHRoYXQgdGhlIGV4dGVybmFsIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjIGRlZmluZWQgaW4gYGZ0b3B0aW9uLmgnIGFyZSBmdWxmaWxsZWQsIHNvIHdlIGRpcmVjdGx5IGFjY2VzcyB0aGUgbmVjZXNzYXJ5CisjIGluY2x1ZGUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIHVzaW5nIGBwa2ctY29uZmlnJy4KKyMKIGlmZGVmIERFVkVMX0RJUgotICAjIFdlIGFzc3VtZSB0aGF0IGFsbCBsaWJyYXJ5IGRlcGVuZGVuY2llcyBmb3IgRnJlZVR5cGUgYXJlIGZ1bGZpbGxlZCBmb3IgYQotICAjIGRldmVsb3BtZW50IGJ1aWxkLCBzbyB3ZSBkaXJlY3RseSBhY2Nlc3MgdGhlIG5lY2Vzc2FyeSBpbmNsdWRlIGRpcmVjdG9yeQotICAjIGluZm9ybWF0aW9uIHVzaW5nIGBwa2ctY29uZmlnJy4KLSAgSU5DTFVERV9GTEFHUyArPSAkKHNoZWxsIHBrZy1jb25maWcgLS1jZmxhZ3MgbGlicG5nIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFyZmJ1enogKQorICBJTkNMVURFX0ZMQUdTICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJwbmcpCisgIElOQ0xVREVfRkxBR1MgKz0gJChzaGVsbCBwa2ctY29uZmlnIC0tY2ZsYWdzIGhhcmZidXp6KQorICBJTkNMVURFX0ZMQUdTICs9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyBsaWJicm90bGlkZWMpCiBlbmRpZgogCiAKQEAgLTE0NiwyNSArMTQ4LDEzIEBACiAjIEZyZWVUeXBlLiAgVGhpcyBpcyByZXF1aXJlZCB0byBsZXQgb3VyIHNvdXJjZXMgaW5jbHVkZSB0aGUgaW50ZXJuYWwKICMgaGVhZGVycyAoc29tZXRoaW5nIGZvcmJpZGRlbiBieSBjbGllbnRzKS4KICMKLSMgRmluYWxseSwgd2UgZGVmaW5lIEZUX0NPTkZJR19NT0RVTEVTX0ggc28gdGhhdCB0aGUgY29tcGlsZXIgdXNlcyB0aGUKLSMgZ2VuZXJhdGVkIHZlcnNpb24gb2YgYGZ0bW9kdWxlLmgnIGluICQoT0JKX0RJUikuICBJZiB0aGVyZSBpcyBhbgotIyBgZnRvcHRpb24uaCcgZmlsZXMgaW4gJChPQkpfRElSKSwgZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggdG9vLgotIwotaWZuZXEgKCQod2lsZGNhcmQgJChPQkpfRElSKS9mdG9wdGlvbi5oKSwpCi0gIEZUT1BUSU9OX0ggICAgOj0gJChPQkpfRElSKS9mdG9wdGlvbi5oCi0gIEZUT1BUSU9OX0ZMQUcgOj0gJERGVF9DT05GSUdfT1BUSU9OU19IPSI8ZnRvcHRpb24uaD4iCi1lbHNlIGlmbmVxICgkKHdpbGRjYXJkICQoQlVJTERfRElSKS9mdG9wdGlvbi5oKSwpCi0gIEZUT1BUSU9OX0ggICAgOj0gJChCVUlMRF9ESVIpL2Z0b3B0aW9uLmgKLSAgRlRPUFRJT05fRkxBRyA6PSAkREZUX0NPTkZJR19PUFRJT05TX0g9IjxmdG9wdGlvbi5oPiIKLWVuZGlmCi0KICMgYENQUEZMQUdTJyBtaWdodCBiZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaW4gdGhlIGVudmlyb25tZW50LgogIwogRlRfQ0ZMQUdTICA9ICQoQ1BQRkxBR1MpIFwKICAgICAgICAgICAgICAkKENGTEFHUykgXAotICAgICAgICAgICAgICRERlQyX0JVSUxEX0xJQlJBUlkgXAotICAgICAgICAgICAgICRERlRfQ09ORklHX01PRFVMRVNfSD0iPGZ0bW9kdWxlLmg+IiBcCi0gICAgICAgICAgICAgJChGVE9QVElPTl9GTEFHKQorICAgICAgICAgICAgICRERlQyX0JVSUxEX0xJQlJBUlkKKworRlRfQ09NUElMRSA6PSAkKENDKSAkKEFOU0lGTEFHUykgJChJTkNMVURFX0ZMQUdTKSAkKEZUX0NGTEFHUykKIAogCiAjIEluY2x1ZGUgdGhlIGBleHBvcnRzJyBydWxlcyBmaWxlLgpAQCAtMTc5LDExICsxNjksMTcgQEAKIAogIyBEZWZpbmUgJChQVUJMSUNfSCkgYXMgdGhlIGxpc3Qgb2YgYWxsIHB1YmxpYyBoZWFkZXIgZmlsZXMgbG9jYXRlZCBpbgogIyBgJChUT1BfRElSKS9pbmNsdWRlL2ZyZWV0eXBlJy4gICQoSU5URVJOQUxfSCksIGFuZCAkKENPTkZJR19IKSBhcmUgZGVmaW5lZAotIyBzaW1pbGFybHkuCisjIHNpbWlsYXJseS4gICQoRlRPUFRJT05fSCkgaXMgdGhlIG9wdGlvbiBmaWxlIHVzZWQgaW4gdGhlIGNvbXBpbGF0aW9uLgogIwogIyBUaGlzIGlzIHVzZWQgdG8gc2ltcGxpZnkgdGhlIGRlcGVuZGVuY3kgcnVsZXMgLS0gaWYgb25lIG9mIHRoZXNlIGZpbGVzCiAjIGNoYW5nZXMsIHRoZSB3aG9sZSBsaWJyYXJ5IGlzIHJlY29tcGlsZWQuCiAjCitpZm5lcSAoJCh3aWxkY2FyZCAkKE9CSl9ESVIpL2Z0b3B0aW9uLmgpLCkKKyAgRlRPUFRJT05fSCAgICA6PSAkKE9CSl9ESVIpL2Z0b3B0aW9uLmgKK2Vsc2UgaWZuZXEgKCQod2lsZGNhcmQgJChCVUlMRF9ESVIpL2Z0b3B0aW9uLmgpLCkKKyAgRlRPUFRJT05fSCAgICA6PSAkKEJVSUxEX0RJUikvZnRvcHRpb24uaAorZW5kaWYKKwogUFVCTElDX0ggICA6PSAkKHdpbGRjYXJkICQoUFVCTElDX0RJUikvKi5oKQogSU5URVJOQUxfSCA6PSAkKHdpbGRjYXJkICQoSU5URVJOQUxfRElSKS8qLmgpIFwKICAgICAgICAgICAgICAgJCh3aWxkY2FyZCAkKFNFUlZJQ0VTX0RJUikvKi5oKQpAQCAtMTk2LDggKzE5Miw2IEBACiBGUkVFVFlQRV9IIDo9ICQoUFVCTElDX0gpICQoSU5URVJOQUxfSCkgJChDT05GSUdfSCkgJChERVZFTF9IKQogCiAKLUZUX0NPTVBJTEUgOj0gJChDQykgJChBTlNJRkxBR1MpICQoSU5DTFVERV9GTEFHUykgJChGVF9DRkxBR1MpCi0KICMgZnRzeXN0ZW0gY29tcG9uZW50CiAjCiBGVFNZU19TUkMgPz0gJChCQVNFX0RJUikvZnRzeXN0ZW0uYwpAQCAtMjg5LDE4ICsyODMsNTEgQEAKIAogbGlicmFyeTogJChQUk9KRUNUX0xJQlJBUlkpCiAKLQotIyBPcHRpb24gYC1CJyBkaXNhYmxlcyBnZW5lcmF0aW9uIG9mIC5weWMgZmlsZXMgKGF2YWlsYWJsZSBzaW5jZSBweXRob24gMi42KQorIyBSdW4gYGRvY3dyaXRlcicgaW4gdGhlIGN1cnJlbnQgUHl0aG9uIGVudmlyb25tZW50LgogIwotcmVmZG9jOgotCXB5dGhvbiAtQiAkKFNSQ19ESVIpL3Rvb2xzL2RvY21ha2VyL2RvY21ha2VyLnB5IFwKLSAgICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgLS10aXRsZT1GcmVlVHlwZS0kKHZlcnNpb24pICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAtLW91dHB1dD0kKERPQ19ESVIpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICQoUFVCTElDX0RJUikvKi5oICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgJChQVUJMSUNfRElSKS9jb25maWcvKi5oICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAkKFBVQkxJQ19ESVIpL2NhY2hlLyouaAorUFlUSE9OID89IHB5dGhvbgogCityZWZkb2M6CisJQGVjaG8gUnVubmluZyBkb2N3cml0ZXIuLi4KKwkkKFBZVEhPTikgLW0gZG9jd3JpdGVyIFwKKyAgICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiBcCisgICAgICAgICAgICAgICAgICAtLXRpdGxlPUZyZWVUeXBlLSQodmVyc2lvbikgXAorICAgICAgICAgICAgICAgICAgLS1zaXRlPXJlZmVyZW5jZSBcCisgICAgICAgICAgICAgICAgICAtLW91dHB1dD0kKERPQ19ESVIpIFwKKyAgICAgICAgICAgICAgICAgICQoUFVCTElDX0RJUikvKi5oIFwKKyAgICAgICAgICAgICAgICAgICQoUFVCTElDX0RJUikvY29uZmlnLyouaCBcCisgICAgICAgICAgICAgICAgICAkKFBVQkxJQ19ESVIpL2NhY2hlLyouaAorCUBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBzaXRlLi4uCisJY2QgJChET0NfRElSKSAmJiBta2RvY3MgYnVpbGQKKwlAZWNobyBEb25lLgorCisjIFZhcmlhYmxlcyBmb3IgcnVubmluZyBgcmVmZG9jJyB3aXRoIFB5dGhvbidzIGB2aXJ0dWFsZW52Jy4gIFRoZQorIyBlbnZpcm9ubWVudCBpcyBjcmVhdGVkIGluIGBET0NfRElSL2VudicgYW5kIGlzIGdpdGlnbm9yZWQuCisjCisjIFdlIHN0aWxsIG5lZWQgdG8gY2QgaW50byBgRE9DX0RJUicgdG8gYnVpbGQgYG1rZG9jcycgYmVjYXVzZSBwYXRocyBpbgorIyBgbWtkb2NzLnltbCcgYXJlIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorIworVkVOVl9OQU1FICA6PSBlbnYKK1ZFTlZfRElSICAgOj0gJChET0NfRElSKSQoU0VQKSQoVkVOVl9OQU1FKQorRU5WX1BZVEhPTiA6PSAkKFZFTlZfRElSKSQoU0VQKSQoQklOKSQoU0VQKSQoUFlUSE9OKQorCityZWZkb2MtdmVudjoKKwlAZWNobyBTZXR0aW5nIHVwIHZpcnR1YWxlbnYgZm9yIFB5dGhvbi4uLgorCXZpcnR1YWxlbnYgLS1weXRob249JChQWVRIT04pICQoVkVOVl9ESVIpCisJQGVjaG8gSW5zdGFsbGluZyBkb2N3cml0ZXIuLi4KKwkkKEVOVl9QWVRIT04pIC1tIHBpcCBpbnN0YWxsIGRvY3dyaXRlcgorCUBlY2hvIFJ1bm5pbmcgZG9jd3JpdGVyLi4uCisJJChFTlZfUFlUSE9OKSAtbSBkb2N3cml0ZXIgXAorICAgICAgICAgICAgICAgICAgICAgIC0tcHJlZml4PWZ0MiBcCisgICAgICAgICAgICAgICAgICAgICAgLS10aXRsZT1GcmVlVHlwZS0kKHZlcnNpb24pIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLXNpdGU9cmVmZXJlbmNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLW91dHB1dD0kKERPQ19ESVIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKFBVQkxJQ19ESVIpLyouaCBcCisgICAgICAgICAgICAgICAgICAgICAgJChQVUJMSUNfRElSKS9jb25maWcvKi5oIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKFBVQkxJQ19ESVIpL2NhY2hlLyouaAorCUBlY2hvIEJ1aWxkaW5nIHN0YXRpYyBzaXRlLi4uCisJY2QgJChET0NfRElSKSAmJiAkKFZFTlZfTkFNRSkkKFNFUCkkKEJJTikkKFNFUClweXRob24gLW0gbWtkb2NzIGJ1aWxkCisJQGVjaG8gRG9uZS4KIAogLlBIT05ZOiBjbGVhbl9wcm9qZWN0X3N0ZCBkaXN0Y2xlYW5fcHJvamVjdF9zdGQKIApkaWZmIC0tZ2l0IGEvYnVpbGRzL2xpbmtfZG9zLm1rIGIvYnVpbGRzL2xpbmtfZG9zLm1rCmluZGV4IDNiMGU4ZGEuLmMxZWQxNTAgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9saW5rX2Rvcy5taworKysgYi9idWlsZHMvbGlua19kb3MubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9saW5rX3N0ZC5tayBiL2J1aWxkcy9saW5rX3N0ZC5tawppbmRleCA4YmE1ZTY0Li45NDBlNjc0IDEwMDY0NAotLS0gYS9idWlsZHMvbGlua19zdGQubWsKKysrIGIvYnVpbGRzL2xpbmtfc3RkLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvbWFjL1JFQURNRSBiL2J1aWxkcy9tYWMvUkVBRE1FCmluZGV4IGY1OGU0N2QuLjA5MjQ4N2EgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9tYWMvUkVBRE1FCisrKyBiL2J1aWxkcy9tYWMvUkVBRE1FCkBAIC00Niw3ICs0Niw3IEBACiAKICAgUmVxdWlyZWQgZmlsZXMgYXJlIGRvd25sb2FkYWJsZSBmcm9tOgogCi0gICAgICBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9tcHctdG9vbHMvaW5kZXguaHRtbAorICAgICAgaHR0cDovL21hY2ludG9zaGdhcmRlbi5vcmcvYXBwcy9tYWNpbnRvc2gtcHJvZ3JhbW1lcnMtd29ya3Nob3AKIAogICBBbHNvIHlvdSBjYW4gZmluZCBkb2N1bWVudHMgaG93IHRvIHVwZGF0ZSBieSBNUFctUFIuCiAKQEAgLTU0LDcgKzU0LDcgQEAKICAgc2tlbGV0b25zLiBQeXRob24gYnVuZGxlZCB0byBNYWMgT1MgWCBpcyBlbm91Z2guIEZvcgogICBjbGFzc2ljIE1hY09TLCBNYWNQeXRob24gaXMgYXZhaWxhYmxlOgogCi0gICAgICBodHRwOi8vaG9tZXBhZ2VzLmN3aS5ubC9+amFjay9tYWNweXRob24vCisgICAgICBodHRwczovL2hvbWVwYWdlcy5jd2kubmwvfmphY2svbWFjcHl0aG9uLwogCiAgIE1QVyByZXF1aXJlcyBhbGwgZmlsZXMgYXJlIHR5cGVkIGJ5IHJlc291cmNlIGZvcmsuCiAgIFJlc0VkaXQgYnVuZGxlZCB0byBNUFcgaXMgZW5vdWdoLiBJbiBNYWMgT1MgWCwKQEAgLTI4MCw3ICsyODAsNyBAQAogICAgIG1pZ3JhdGUgdG8gRlNSZWYgZGF0YXR5cGUuIFRoZSBiaWcgZGlmZmVyZW5jZXMgb2YgRlNSZWYKICAgICBhZ2FpbnN0IEZTU3BlYyBhcmUgZXhwbGFpbmVkIGluIEFwcGxlIFRlY2hOb3RlcyAyMDc4LgogCi0gICAgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdGVjaG5vdGVzL3RuMjAwMi90bjIwNzguaHRtbAorICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9saWJyYXJ5L2FyY2hpdmUvdGVjaG5vdGVzL3RuMjA3OC8KIAogICAgIC0gZmlsZW5hbWUgbGVuZ3RoOiB0aGUgbWF4IGxlbmd0aCBvZiBmaWxlCiAgICAgbmFtZSBvZiBGU1JlZiBpcyAyNTUgY2hhcnMgKGl0IGlzIGxpbWl0IG9mIEhGUyspLApAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgb2YgRm9udE1hbmFnZXIgZW11bGF0aW9uIHdpdGhvdXQgUXVpY2tEcmF3IGlzCiAgICAgZXhwbGFpbmVkIGluCiAKLSAgICAgIGh0dHA6Ly93d3cuZ3l2ZS5vcmcvfm1wc3V6dWtpL2F0c19iZW5jaG1hcmsuaHRtbAorICAgICAgaHR0cDovL2d5dmVybi5pcGMuaGlyb3NoaW1hLXUuYWMuanAvfm1wc3V6dWtpL2F0c19iZW5jaG1hcmsuaHRtbAogCiAgIEEtMy4gRnJhbWV3b3JrIEF2YWlsYWJpbGl0aWVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9idWlsZHMvbWFjL2ZyZWV0eXBlLUluZm8ucGxpc3QgYi9idWlsZHMvbWFjL2ZyZWV0eXBlLUluZm8ucGxpc3QKaW5kZXggYjNkMTE0ZC4uNGI1ZDc5YiAxMDA2NDQKLS0tIGEvYnVpbGRzL21hYy9mcmVldHlwZS1JbmZvLnBsaXN0CisrKyBiL2J1aWxkcy9tYWMvZnJlZXR5cGUtSW5mby5wbGlzdApAQCAtMSw2ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CiA8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iCi0gICAgICAgICAgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorICAgICAgICAgICJodHRwczovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CiAKIDxwbGlzdCB2ZXJzaW9uPSIxLjAiPgogCmRpZmYgLS1naXQgYS9idWlsZHMvbWFjL2Z0bWFjLmMgYi9idWlsZHMvbWFjL2Z0bWFjLmMKaW5kZXggYzQ1NTQ2Yy4uMmNiMzA0NiAxMDA2NDQKLS0tIGEvYnVpbGRzL21hYy9mdG1hYy5jCisrKyBiL2J1aWxkcy9tYWMvZnRtYWMuYwpAQCAtNSw3ICs1LDcgQEAKIC8qICAgIE1hYyBGT05EIHN1cHBvcnQuICBXcml0dGVuIGJ5IGp1c3RAbGV0dGVycm9yLmNvbS4gICAgICAgICAgICAgICAgICAgICovCiAvKiAgSGVhdmlseSBGaXhlZCBieSBtcHN1enVraSwgR2VvcmdlIFdpbGxpYW1zIGFuZCBTZWFuIE1jQnJpZGUgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEp1c3QgdmFuIFJvc3N1bSwgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtNjIsMTAgKzYyLDkgQEAKICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAjaW5jbHVkZSAiZnRiYXNlLmgiCiAKICNpZiBkZWZpbmVkKCBfX0dOVUNfXyApIHx8IGRlZmluZWQoIF9fSUJNQ19fICkKQEAgLTc4MCw5ICs3NzksMTAgQEAKICAgICAgIHN0eWxlID0gKFN0eWxlVGFibGUqKXA7CiAgICAgICBwICs9IHNpemVvZiAoIFN0eWxlVGFibGUgKTsKICAgICAgIHN0cmluZ19jb3VudCA9IEVuZGlhblMxNl9CdG9OKCAqKHNob3J0KikocCkgKTsKKyAgICAgIHN0cmluZ19jb3VudCA9IEZUX01JTiggNjQsIHN0cmluZ19jb3VudCApOwogICAgICAgcCArPSBzaXplb2YgKCBzaG9ydCApOwogCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHN0cmluZ19jb3VudCAmJiBpIDwgNjQ7IGkrKyApCisgICAgICBmb3IgKCBpID0gMDsgaSA8IHN0cmluZ19jb3VudDsgaSsrICkKICAgICAgIHsKICAgICAgICAgbmFtZXNbaV0gPSBwOwogICAgICAgICBwICAgICAgICs9IG5hbWVzW2ldWzBdOwpAQCAtNzk5LDcgKzc5OSw3IEBACiAgICAgICAgICAgcHNfbmFtZVtwc19uYW1lX2xlbl0gPSAwOwogICAgICAgICB9CiAgICAgICAgIGlmICggc3R5bGUtPmluZGV4ZXNbZmFjZV9pbmRleF0gPiAxICYmCi0gICAgICAgICAgICAgc3R5bGUtPmluZGV4ZXNbZmFjZV9pbmRleF0gPD0gRlRfTUlOKCBzdHJpbmdfY291bnQsIDY0ICkgKQorICAgICAgICAgICAgIHN0eWxlLT5pbmRleGVzW2ZhY2VfaW5kZXhdIDw9IHN0cmluZ19jb3VudCApCiAgICAgICAgIHsKICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgc3VmZml4ZXMgPSBuYW1lc1tzdHlsZS0+aW5kZXhlc1tmYWNlX2luZGV4XSAtIDFdOwogCmRpZmYgLS1naXQgYS9idWlsZHMvbWVzb24vZXh0cmFjdF9mcmVldHlwZV92ZXJzaW9uLnB5IGIvYnVpbGRzL21lc29uL2V4dHJhY3RfZnJlZXR5cGVfdmVyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU4N2RiCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRzL21lc29uL2V4dHJhY3RfZnJlZXR5cGVfdmVyc2lvbi5weQpAQCAtMCwwICsxLDEwNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJFeHRyYWN0IHRoZSBGcmVlVHlwZSB2ZXJzaW9uIG51bWJlcnMgZnJvbSBgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+YC4KKworVGhpcyBzY3JpcHQgcGFyc2VzIHRoZSBoZWFkZXIgdG8gZXh0cmFjdCB0aGUgdmVyc2lvbiBudW1iZXIgZGVmaW5lZCB0aGVyZS4KK0J5IGRlZmF1bHQsIHRoZSBmdWxsIGRvdHRlZCB2ZXJzaW9uIG51bWJlciBpcyBwcmludGVkLCBidXQgYC0tbWFqb3JgLAorYC0tbWlub3JgIG9yIGAtLXBhdGNoYCBjYW4gYmUgdXNlZCB0byBvbmx5IHByaW50IG9uZSBvZiB0aGVzZSB2YWx1ZXMKK2luc3RlYWQuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKyMgRXhwZWN0ZWQgaW5wdXQ6CisjCisjICAuLi4KKyMgICNkZWZpbmUgRlJFRVRZUEVfTUFKT1IgIDIKKyMgICNkZWZpbmUgRlJFRVRZUEVfTUlOT1IgIDEwCisjICAjZGVmaW5lIEZSRUVUWVBFX1BBVENIICAyCisjICAuLi4KKworUkVfTUFKT1IgPSByZS5jb21waWxlKHIiXiBcI2RlZmluZSBccysgRlJFRVRZUEVfTUFKT1IgXHMrICguKikgJCIsIHJlLlgpCitSRV9NSU5PUiA9IHJlLmNvbXBpbGUociJeIFwjZGVmaW5lIFxzKyBGUkVFVFlQRV9NSU5PUiBccysgKC4qKSAkIiwgcmUuWCkKK1JFX1BBVENIID0gcmUuY29tcGlsZShyIl4gXCNkZWZpbmUgXHMrIEZSRUVUWVBFX1BBVENIIFxzKyAoLiopICQiLCByZS5YKQorCisKK2RlZiBwYXJzZV9mcmVldHlwZV9oZWFkZXIoaGVhZGVyKToKKyAgICBtYWpvciA9IE5vbmUKKyAgICBtaW5vciA9IE5vbmUKKyAgICBwYXRjaCA9IE5vbmUKKworICAgIGZvciBsaW5lIGluIGhlYWRlci5zcGxpdGxpbmVzKCk6CisgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgIG0gPSBSRV9NQUpPUi5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgYXNzZXJ0IG1ham9yID09IE5vbmUsICJGUkVFVFlQRV9NQUpPUiBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlISIKKyAgICAgICAgICAgIG1ham9yID0gbS5ncm91cCgxKQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBtID0gUkVfTUlOT1IubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGFzc2VydCBtaW5vciA9PSBOb25lLCAiRlJFRVRZUEVfTUlOT1IgYXBwZWFycyBtb3JlIHRoYW4gb25jZSEiCisgICAgICAgICAgICBtaW5vciA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgbSA9IFJFX1BBVENILm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBhc3NlcnQgcGF0Y2ggPT0gTm9uZSwgIkZSRUVUWVBFX1BBVENIIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UhIgorICAgICAgICAgICAgcGF0Y2ggPSBtLmdyb3VwKDEpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgYXNzZXJ0ICgKKyAgICAgICAgbWFqb3IgYW5kIG1pbm9yIGFuZCBwYXRjaAorICAgICksICJUaGlzIGhlYWRlciBpcyBtaXNzaW5nIG9uZSBvZiBGUkVFVFlQRV9NQUpPUiwgRlJFRVRZUEVfTUlOT1Igb3IgRlJFRVRZUEVfUEFUQ0ghIgorCisgICAgcmV0dXJuIChtYWpvciwgbWlub3IsIHBhdGNoKQorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIi0tbWFqb3IiLAorICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICBoZWxwPSJPbmx5IHByaW50IHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlci4iLAorICAgICkKKyAgICBncm91cC5hZGRfYXJndW1lbnQoCisgICAgICAgICItLW1pbm9yIiwKKyAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgaGVscD0iT25seSBwcmludCB0aGUgbWlub3IgdmVyc2lvbiBudW1iZXIuIiwKKyAgICApCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1wYXRjaCIsCisgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgIGhlbHA9Ik9ubHkgcHJpbnQgdGhlIHBhdGNoIHZlcnNpb24gbnVtYmVyLiIsCisgICAgKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgImlucHV0IiwKKyAgICAgICAgbWV0YXZhcj0iRlJFRVRZUEVfSCIsCisgICAgICAgIGhlbHA9IlRoZSBpbnB1dCBmcmVldHlwZS5oIGhlYWRlciB0byBwYXJzZS4iLAorICAgICkKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgd2l0aCBvcGVuKGFyZ3MuaW5wdXQpIGFzIGY6CisgICAgICAgIGhlYWRlciA9IGYucmVhZCgpCisKKyAgICB2ZXJzaW9uID0gcGFyc2VfZnJlZXR5cGVfaGVhZGVyKGhlYWRlcikKKworICAgIGlmIGFyZ3MubWFqb3I6CisgICAgICAgIHByaW50KHZlcnNpb25bMF0pCisgICAgZWxpZiBhcmdzLm1pbm9yOgorICAgICAgICBwcmludCh2ZXJzaW9uWzFdKQorICAgIGVsaWYgYXJncy5wYXRjaDoKKyAgICAgICAgcHJpbnQodmVyc2lvblsyXSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiJXMuJXMuJXMiICUgdmVyc2lvbikKKworICAgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9idWlsZHMvbWVzb24vZXh0cmFjdF9saWJ0b29sX3ZlcnNpb24ucHkgYi9idWlsZHMvbWVzb24vZXh0cmFjdF9saWJ0b29sX3ZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU2OTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy9tZXNvbi9leHRyYWN0X2xpYnRvb2xfdmVyc2lvbi5weQpAQCAtMCwwICsxLDEwNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJFeHRyYWN0IHRoZSBsaWJ0b29sIHZlcnNpb24gZnJvbSBgY29uZmlndXJlLnJhd2AuCisKK1RoaXMgc2NyaXB0IHBhcnNlcyB0aGUgYGNvbmZpZ3VyZS5yYXdgIGZpbGUgdG8gZXh0cmFjdCB0aGUgbGlidG9vbCB2ZXJzaW9uCitudW1iZXIuICBCeSBkZWZhdWx0LCB0aGUgZnVsbCBkb3R0ZWQgdmVyc2lvbiBudW1iZXIgaXMgcHJpbnRlZCwgYnV0CitgLS1tYWpvcmAsIGAtLW1pbm9yYCBvciBgLS1wYXRjaGAgY2FuIGJlIHVzZWQgdG8gb25seSBwcmludCBvbmUgb2YgdGhlc2UKK3ZhbHVlcyBpbnN0ZWFkLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisjIEV4cGVjdGVkIGlucHV0OgorIworIyAgLi4uCisjICB2ZXJzaW9uX2luZm89JzIzOjI6MTcnCisjICAuLi4KKworUkVfVkVSU0lPTl9JTkZPID0gcmUuY29tcGlsZShyIl52ZXJzaW9uX2luZm89JyhcZCspOihcZCspOihcZCspJyIpCisKKworZGVmIHBhcnNlX2NvbmZpZ3VyZV9yYXcoaGVhZGVyKToKKyAgICBtYWpvciA9IE5vbmUKKyAgICBtaW5vciA9IE5vbmUKKyAgICBwYXRjaCA9IE5vbmUKKworICAgIGZvciBsaW5lIGluIGhlYWRlci5zcGxpdGxpbmVzKCk6CisgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgIG0gPSBSRV9WRVJTSU9OX0lORk8ubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGFzc2VydCBtYWpvciA9PSBOb25lLCAidmVyc2lvbl9pbmZvIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UhIgorICAgICAgICAgICAgbWFqb3IgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICBtaW5vciA9IG0uZ3JvdXAoMikKKyAgICAgICAgICAgIHBhdGNoID0gbS5ncm91cCgzKQorICAgICAgICAgICAgY29udGludWUKKworICAgIGFzc2VydCAoCisgICAgICAgIG1ham9yIGFuZCBtaW5vciBhbmQgcGF0Y2gKKyAgICApLCAiVGhpcyBpbnB1dCBmaWxlIGlzIG1pc3NpbmcgYSB2ZXJzaW9uX2luZm8gZGVmaW5pdGlvbiEiCisKKyAgICByZXR1cm4gKG1ham9yLCBtaW5vciwgcGF0Y2gpCisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1tYWpvciIsCisgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgIGhlbHA9Ik9ubHkgcHJpbnQgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLiIsCisgICAgKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIi0tbWlub3IiLAorICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICBoZWxwPSJPbmx5IHByaW50IHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlci4iLAorICAgICkKKyAgICBncm91cC5hZGRfYXJndW1lbnQoCisgICAgICAgICItLXBhdGNoIiwKKyAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgaGVscD0iT25seSBwcmludCB0aGUgcGF0Y2ggdmVyc2lvbiBudW1iZXIuIiwKKyAgICApCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1zb3ZlcnNpb24iLAorICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICBoZWxwPSJPbmx5IHByaW50IHRoZSBsaWJ0b29sIGxpYnJhcnkgc3VmZml4LiIsCisgICAgKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgImlucHV0IiwKKyAgICAgICAgbWV0YXZhcj0iQ09ORklHVVJFX1JBVyIsCisgICAgICAgIGhlbHA9IlRoZSBpbnB1dCBjb25maWd1cmUucmF3IGZpbGUgdG8gcGFyc2UuIiwKKyAgICApCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHdpdGggb3BlbihhcmdzLmlucHV0KSBhcyBmOgorICAgICAgICByYXdfZmlsZSA9IGYucmVhZCgpCisKKyAgICB2ZXJzaW9uID0gcGFyc2VfY29uZmlndXJlX3JhdyhyYXdfZmlsZSkKKworICAgIGlmIGFyZ3MubWFqb3I6CisgICAgICAgIHByaW50KHZlcnNpb25bMF0pCisgICAgZWxpZiBhcmdzLm1pbm9yOgorICAgICAgICBwcmludCh2ZXJzaW9uWzFdKQorICAgIGVsaWYgYXJncy5wYXRjaDoKKyAgICAgICAgcHJpbnQodmVyc2lvblsyXSkKKyAgICBlbGlmIGFyZ3Muc292ZXJzaW9uOgorICAgICAgICAjIENvbnZlcnQgbGlidG9vbCB2ZXJzaW9uX2luZm8gdG8gdGhlIGxpYnJhcnkgc3VmZml4LgorICAgICAgICAjIChjdXJyZW50LHJldmlzaW9uLCBhZ2UpIC0+IChjdXJyZW50IC0gYWdlLCBhZ2UsIHJldmlzaW9uKQorICAgICAgICBwcmludCgKKyAgICAgICAgICAgICIlZC4lcy4lcyIKKyAgICAgICAgICAgICUgKGludCh2ZXJzaW9uWzBdKSAtIGludCh2ZXJzaW9uWzJdKSwgdmVyc2lvblsyXSwgdmVyc2lvblsxXSkKKyAgICAgICAgKQorICAgIGVsc2U6CisgICAgICAgIHByaW50KCIlcy4lcy4lcyIgJSB2ZXJzaW9uKQorCisgICAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL2J1aWxkcy9tZXNvbi9nZW5lcmF0ZV9yZWZlcmVuY2VfZG9jcy5weSBiL2J1aWxkcy9tZXNvbi9nZW5lcmF0ZV9yZWZlcmVuY2VfZG9jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTkwMTdjCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRzL21lc29uL2dlbmVyYXRlX3JlZmVyZW5jZV9kb2NzLnB5CkBAIC0wLDAgKzEsNzkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiR2VuZXJhdGUgRnJlZVR5cGUgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24uIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICItLWlucHV0LWRpciIsCisgICAgICAgIHJlcXVpcmVkPVRydWUsCisgICAgICAgIGhlbHA9IlRvcC1sZXZlbCBGcmVlVHlwZSBzb3VyY2UgZGlyZWN0b3J5LiIsCisgICAgKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIi0tdmVyc2lvbiIsIHJlcXVpcmVkPVRydWUsIGhlbHA9J0ZyZWVUeXBlIHZlcnNpb24gKGUuZy4gIjIueC55IikuJworICAgICkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICItLW91dHB1dC1kaXIiLCByZXF1aXJlZD1UcnVlLCBoZWxwPSJPdXRwdXQgZGlyZWN0b3J5LiIKKyAgICApCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgIyBHZXQgdGhlIGxpc3Qgb2YgaW5wdXQgZmlsZXMgb2YgaW50ZXJlc3QuCisgICAgaW5jbHVkZV9kaXIgPSBvcy5wYXRoLmpvaW4oYXJncy5pbnB1dF9kaXIsICJpbmNsdWRlIikKKyAgICBpbmNsdWRlX2NvbmZpZ19kaXIgPSBvcy5wYXRoLmpvaW4oaW5jbHVkZV9kaXIsICJjb25maWciKQorICAgIGluY2x1ZGVfY2FjaGVfZGlyID0gb3MucGF0aC5qb2luKGluY2x1ZGVfZGlyLCAiY2FjaGUiKQorCisgICAgYWxsX2hlYWRlcnMgPSAoCisgICAgICAgIGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oYXJncy5pbnB1dF9kaXIsICJpbmNsdWRlIiwgImZyZWV0eXBlIiwgIiouaCIpKQorICAgICAgICArIGdsb2IuZ2xvYigKKyAgICAgICAgICAgIG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICBhcmdzLmlucHV0X2RpciwgImluY2x1ZGUiLCAiZnJlZXR5cGUiLCAiY29uZmlnIiwgIiouaCIKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICAgICArIGdsb2IuZ2xvYigKKyAgICAgICAgICAgIG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICBhcmdzLmlucHV0X2RpciwgImluY2x1ZGUiLCAiZnJlZXR5cGUiLCAiY2FjaGUiLCAiKi5oIgorICAgICAgICAgICAgKQorICAgICAgICApCisgICAgKQorCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyZ3Mub3V0cHV0X2Rpcik6CisgICAgICAgIG9zLm1ha2VkaXJzKGFyZ3Mub3V0cHV0X2RpcikKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgb3MucGF0aC5pc2RpcihhcmdzLm91dHB1dF9kaXIpLCAoCisgICAgICAgICAgICAiTm90IGEgZGlyZWN0b3J5OiAiICsgYXJncy5vdXRwdXRfZGlyCisgICAgICAgICkKKworICAgIGNtZHMgPSBbCisgICAgICAgIHN5cy5leGVjdXRhYmxlLAorICAgICAgICAiLW0iLAorICAgICAgICAiZG9jd3JpdGVyIiwKKyAgICAgICAgIi0tcHJlZml4PWZ0MiIsCisgICAgICAgICItLXRpdGxlPUZyZWVUeXBlLSIgKyBhcmdzLnZlcnNpb24sCisgICAgICAgICItLXNpdGU9cmVmZXJlbmNlIiwKKyAgICAgICAgIi0tb3V0cHV0PSIgKyBhcmdzLm91dHB1dF9kaXIsCisgICAgXSArIGFsbF9oZWFkZXJzCisKKyAgICBwcmludCgiUnVubmluZyBkb2N3cml0ZXIuLi4iKQorICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChjbWRzKQorCisgICAgcHJpbnQoIkJ1aWxkaW5nIHN0YXRpYyBzaXRlLi4uIikKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCisgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1tIiwgIm1rZG9jcyIsICJidWlsZCJdLCBjd2Q9YXJncy5vdXRwdXRfZGlyCisgICAgKQorICAgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9idWlsZHMvbWVzb24vcGFyc2VfbW9kdWxlc19jZmcucHkgYi9idWlsZHMvbWVzb24vcGFyc2VfbW9kdWxlc19jZmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmNzYwNQotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy9tZXNvbi9wYXJzZV9tb2R1bGVzX2NmZy5weQpAQCAtMCwwICsxLDE2MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJQYXJzZSBtb2R1bGVzLmNmZyBhbmQgZHVtcCBpdHMgb3V0cHV0IGVpdGhlciBhcyBmdG1vZHVsZS5oIG9yIGEgbGlzdCBvZgorYmFzZSBleHRlbnNpb25zLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisjIEV4cGVjdGVkIGlucHV0OgorIworIyAgLi4uCisjICBGT05UX01PRFVMRVMgKz0gPG5hbWU+CisjICBISU5USU5HX01PRFVMRVMgKz0gPG5hbWU+CisjICBSQVNURVJfTU9EVUxFUyArPSA8bmFtZT4KKyMgIEFVWF9NT0RVTEVTICs9IDxuYW1lPgorIyAgQkFTRV9FWFRFTlNJT05TICs9IDxuYW1lPgorIyAgLi4uCisKKworZGVmIHBhcnNlX21vZHVsZXNfY2ZnKGlucHV0X2ZpbGUpOgorCisgICAgbGlzdHMgPSB7CisgICAgICAgICJGT05UX01PRFVMRVMiOiBbXSwKKyAgICAgICAgIkhJTlRJTkdfTU9EVUxFUyI6IFtdLAorICAgICAgICAiUkFTVEVSX01PRFVMRVMiOiBbXSwKKyAgICAgICAgIkFVWF9NT0RVTEVTIjogW10sCisgICAgICAgICJCQVNFX0VYVEVOU0lPTlMiOiBbXSwKKyAgICB9CisKKyAgICBmb3IgbGluZSBpbiBpbnB1dF9maWxlLnNwbGl0bGluZXMoKToKKyAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgIyBJZ25vcmUgZW1wdHkgbGluZXMgYW5kIHRob3NlIHRoYXQgc3RhcnQgd2l0aCBhIGNvbW1lbnQuCisgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmVbMF0gPT0gIiMiOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpdGVtcyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBhc3NlcnQgbGVuKGl0ZW1zKSA9PSAzIGFuZCBpdGVtc1sxXSA9PSAiKz0iLCAoCisgICAgICAgICAgICAiVW5leHBlY3RlZCBpbnB1dCBsaW5lIFslc10iICUgbGluZQorICAgICAgICApCisgICAgICAgIGFzc2VydCBpdGVtc1swXSBpbiBsaXN0cywgKAorICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBuYW1lICIgKyBpdGVtc1swXQorICAgICAgICApCisKKyAgICAgICAgbGlzdHNbaXRlbXNbMF1dLmFwcGVuZChpdGVtc1syXSkKKworICAgIHJldHVybiBsaXN0cworCisKK2RlZiBnZW5lcmF0ZV9mdG1vZHVsZShsaXN0cyk6CisgICAgcmVzdWx0ID0gIi8qIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZS4gKi9cbiIKKyAgICBmb3IgZHJpdmVyIGluIGxpc3RzWyJGT05UX01PRFVMRVMiXToKKyAgICAgICAgaWYgZHJpdmVyID09ICJzZm50IjogICMgU3BlY2lhbCBjYXNlIGZvciB0aGUgc2ZudCAnZHJpdmVyJy4KKyAgICAgICAgICAgIHJlc3VsdCArPSAiRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBzZm50X21vZHVsZV9jbGFzcyApXG4iCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIG5hbWUgPSB7CisgICAgICAgICAgICAidHJ1ZXR5cGUiOiAidHQiLAorICAgICAgICAgICAgInR5cGUxIjogInQxIiwKKyAgICAgICAgICAgICJjaWQiOiAidDFjaWQiLAorICAgICAgICAgICAgInR5cGU0MiI6ICJ0NDIiLAorICAgICAgICAgICAgIndpbmZvbnRzIjogIndpbmZudCIsCisgICAgICAgIH0uZ2V0KGRyaXZlciwgZHJpdmVyKQorICAgICAgICByZXN1bHQgKz0gKAorICAgICAgICAgICAgIkZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgJXNfZHJpdmVyX2NsYXNzIClcbiIgJSBuYW1lCisgICAgICAgICkKKworICAgIGZvciBtb2R1bGUgaW4gbGlzdHNbIkhJTlRJTkdfTU9EVUxFUyJdOgorICAgICAgICByZXN1bHQgKz0gKAorICAgICAgICAgICAgIkZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgJXNfbW9kdWxlX2NsYXNzIClcbiIgJSBtb2R1bGUKKyAgICAgICAgKQorCisgICAgZm9yIG1vZHVsZSBpbiBsaXN0c1siUkFTVEVSX01PRFVMRVMiXToKKyAgICAgICAgbmFtZSA9IHsKKyAgICAgICAgICAgICJyYXN0ZXIiOiAiZnRfcmFzdGVyMSIsCisgICAgICAgICAgICAic21vb3RoIjogImZ0X3Ntb290aCIsCisgICAgICAgIH0uZ2V0KG1vZHVsZSkKKyAgICAgICAgcmVzdWx0ICs9ICgKKyAgICAgICAgICAgICJGVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgJXNfcmVuZGVyZXJfY2xhc3MgKVxuIiAlIG5hbWUKKyAgICAgICAgKQorCisgICAgZm9yIG1vZHVsZSBpbiBsaXN0c1siQVVYX01PRFVMRVMiXToKKyAgICAgICAgaWYgbW9kdWxlIGluICgicHNhdXgiLCAicHNuYW1lcyIsICJvdHZhbGlkIiwgImd4dmFsaWQiKToKKyAgICAgICAgICAgIHJlc3VsdCArPSAoCisgICAgICAgICAgICAgICAgIkZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgJXNfbW9kdWxlX2NsYXNzIClcbiIgJSBtb2R1bGUKKyAgICAgICAgICAgICkKKworICAgIHJlc3VsdCArPSAiLyogRU9GICovXG4iCisgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBnZW5lcmF0ZV9tYWluX21vZHVsZXMobGlzdHMpOgorICAgIHJldHVybiAiXG4iLmpvaW4oCisgICAgICAgIGxpc3RzWyJGT05UX01PRFVMRVMiXQorICAgICAgICArIGxpc3RzWyJISU5USU5HX01PRFVMRVMiXQorICAgICAgICArIGxpc3RzWyJSQVNURVJfTU9EVUxFUyJdCisgICAgKQorCisKK2RlZiBnZW5lcmF0ZV9hdXhfbW9kdWxlcyhsaXN0cyk6CisgICAgcmV0dXJuICJcbiIuam9pbihsaXN0c1siQVVYX01PRFVMRVMiXSkKKworCitkZWYgZ2VuZXJhdGVfYmFzZV9leHRlbnNpb25zKGxpc3RzKToKKyAgICByZXR1cm4gIlxuIi5qb2luKGxpc3RzWyJCQVNFX0VYVEVOU0lPTlMiXSkKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1mb3JtYXQiLAorICAgICAgICByZXF1aXJlZD1UcnVlLAorICAgICAgICBjaG9pY2VzPSgKKyAgICAgICAgICAgICJmdG1vZHVsZS5oIiwKKyAgICAgICAgICAgICJtYWluLW1vZHVsZXMiLAorICAgICAgICAgICAgImF1eC1tb2R1bGVzIiwKKyAgICAgICAgICAgICJiYXNlLWV4dGVuc2lvbnMtbGlzdCIsCisgICAgICAgICksCisgICAgICAgIGhlbHA9IlNlbGVjdCBvdXRwdXQgZm9ybWF0LiIsCisgICAgKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgImlucHV0IiwKKyAgICAgICAgbWV0YXZhcj0iQ09ORklHVVJFX1JBVyIsCisgICAgICAgIGhlbHA9IlRoZSBpbnB1dCBjb25maWd1cmUucmF3IGZpbGUgdG8gcGFyc2UuIiwKKyAgICApCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLW91dHB1dCIsIGhlbHA9Ik91dHB1dCBmaWxlIChkZWZhdWx0IGlzIHN0ZG91dCkuIikKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgd2l0aCBvcGVuKGFyZ3MuaW5wdXQpIGFzIGY6CisgICAgICAgIGlucHV0X2RhdGEgPSBmLnJlYWQoKQorCisgICAgbGlzdHMgPSBwYXJzZV9tb2R1bGVzX2NmZyhpbnB1dF9kYXRhKQorCisgICAgaWYgYXJncy5mb3JtYXQgPT0gImZ0bW9kdWxlLmgiOgorICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZV9mdG1vZHVsZShsaXN0cykKKyAgICBlbGlmIGFyZ3MuZm9ybWF0ID09ICJtYWluLW1vZHVsZXMiOgorICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZV9tYWluX21vZHVsZXMobGlzdHMpCisgICAgZWxpZiBhcmdzLmZvcm1hdCA9PSAiYXV4LW1vZHVsZXMiOgorICAgICAgICByZXN1bHQgPSBnZW5lcmF0ZV9hdXhfbW9kdWxlcyhsaXN0cykKKyAgICBlbGlmIGFyZ3MuZm9ybWF0ID09ICJiYXNlLWV4dGVuc2lvbnMtbGlzdCI6CisgICAgICAgIHJlc3VsdCA9IGdlbmVyYXRlX2Jhc2VfZXh0ZW5zaW9ucyhsaXN0cykKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJJbnZhbGlkIG91dHB1dCBmb3JtYXQhIgorCisgICAgaWYgYXJncy5vdXRwdXQ6CisgICAgICAgIHdpdGggb3BlbihhcmdzLm91dHB1dCwgInciKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShyZXN1bHQpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQocmVzdWx0KQorICAgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9idWlsZHMvbWVzb24vcHJvY2Vzc19mdG9wdGlvbl9oLnB5IGIvYnVpbGRzL21lc29uL3Byb2Nlc3NfZnRvcHRpb25faC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY4MGMzCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRzL21lc29uL3Byb2Nlc3NfZnRvcHRpb25faC5weQpAQCAtMCwwICsxLDEwNSBAQAorIyEvdXNyL2Jpbi9weXRob24KKyIiIlRvZ2dsZSBzZXR0aW5ncyBpbiBgZnRvcHRpb24uaGAgZmlsZSBiYXNlZCBvbiBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCitUaGlzIHNjcmlwdCB0YWtlcyBhbiBgZnRvcHRpb24uaGAgZmlsZSBhcyBpbnB1dCBhbmQgcmV3cml0ZXMKK2AjZGVmaW5lYC9gI3VuZGVmYCBsaW5lcyBpbiBpdCBiYXNlZCBvbiBgLS1lbmFibGU9Q09ORklHX1ZBUk5BTUVgIG9yCitgLS1kaXNhYmxlPUNPTkZJR19WQVJOQU1FYCBhcmd1bWVudHMgcGFzc2VkIHRvIGl0LCB3aGVyZSBgQ09ORklHX1ZBUk5BTUVgIGlzCitjb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWUsIHN1Y2ggYXMgYEZUX0NPTkZJR19PUFRJT05fVVNFX0xaV2AsIHRoYXQgbWF5CithcHBlYXIgaW4gdGhlIGZpbGUuCisKK05vdGUgdGhhdCBpZiBvbmUgb2YgYENPTkZJR19WQVJOQU1FYCBpcyBub3QgZm91bmQgaW4gdGhlIGlucHV0IGZpbGUsIHRoaXMKK3NjcmlwdCBleGl0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgbGlzdGluZyB0aGUgbWlzc2luZyB2YXJpYWJsZSBuYW1lcy4KKyIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKworZGVmIG1haW4oKToKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj1fX2RvY19fKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgImlucHV0IiwgbWV0YXZhcj0iRlRPUFRJT05fSCIsIGhlbHA9IlBhdGggdG8gaW5wdXQgZnRvcHRpb24uaCBmaWxlLiIKKyAgICApCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLW91dHB1dCIsIGhlbHA9Ik91dHB1dCB0byBmaWxlIGluc3RlYWQgb2Ygc3Rkb3V0LiIpCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1lbmFibGUiLAorICAgICAgICBhY3Rpb249ImFwcGVuZCIsCisgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgIGhlbHA9IkVuYWJsZSBhIGdpdmVuIGJ1aWxkIG9wdGlvbiAoZS5nLiBGVF9DT05GSUdfT1BUSU9OX1VTRV9MWlcpLiIsCisgICAgKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIi0tZGlzYWJsZSIsCisgICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKKyAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgaGVscD0iRGlzYWJsZSBhIGdpdmVuIGJ1aWxkIG9wdGlvbi4iLAorICAgICkKKworICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBjb21tb25fb3B0aW9ucyA9IHNldChhcmdzLmVuYWJsZSkgJiBzZXQoYXJncy5kaXNhYmxlKQorICAgIGlmIGNvbW1vbl9vcHRpb25zOgorICAgICAgICBwYXJzZXIuZXJyb3IoCisgICAgICAgICAgICAiT3B0aW9ucyBjYW5ub3QgYmUgYm90aCBlbmFibGVkIGFuZCBkaXNhYmxlZDogJXMiCisgICAgICAgICAgICAlIHNvcnRlZChjb21tb25fb3B0aW9ucykKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gMQorCisgICAgd2l0aCBvcGVuKGFyZ3MuaW5wdXQpIGFzIGY6CisgICAgICAgIGlucHV0X2ZpbGUgPSBmLnJlYWQoKQorCisgICAgb3B0aW9uc19zZWVuID0gc2V0KCkKKworICAgIG5ld19saW5lcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gaW5wdXRfZmlsZS5zcGxpdGxpbmVzKCk6CisgICAgICAgICMgRXhwZWN0ZWQgZm9ybWF0czoKKyAgICAgICAgIyAgICNkZWZpbmUgPENPTkZJR19WQVI+CisgICAgICAgICMgICAvKiAjZGVmaW5lIDxDT05GSUdfVkFSPiAqLworICAgICAgICAjICAgI3VuZGVmIDxDT05GSUdfVkFSPgorICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIi8qICNkZWZpbmUgIikgYW5kIGxpbmUuZW5kc3dpdGgoIiAqLyIpOgorICAgICAgICAgICAgb3B0aW9uX25hbWUgPSBsaW5lWzExOi0zXS5zdHJpcCgpCisgICAgICAgICAgICBvcHRpb25fZW5hYmxlZCA9IEZhbHNlCisgICAgICAgIGVsaWYgbGluZS5zdGFydHN3aXRoKCIjZGVmaW5lICIpOgorICAgICAgICAgICAgb3B0aW9uX25hbWUgPSBsaW5lWzg6XS5zdHJpcCgpCisgICAgICAgICAgICBvcHRpb25fZW5hYmxlZCA9IFRydWUKKyAgICAgICAgZWxpZiBsaW5lLnN0YXJ0c3dpdGgoIiN1bmRlZiAiKToKKyAgICAgICAgICAgIG9wdGlvbl9uYW1lID0gbGluZVs3Ol0uc3RyaXAoKQorICAgICAgICAgICAgb3B0aW9uX2VuYWJsZWQgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3X2xpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBvcHRpb25zX3NlZW4uYWRkKG9wdGlvbl9uYW1lKQorICAgICAgICBpZiBvcHRpb25fZW5hYmxlZCBhbmQgb3B0aW9uX25hbWUgaW4gYXJncy5kaXNhYmxlOgorICAgICAgICAgICAgbGluZSA9ICIjdW5kZWYgIiArIG9wdGlvbl9uYW1lCisgICAgICAgIGVsaWYgbm90IG9wdGlvbl9lbmFibGVkIGFuZCBvcHRpb25fbmFtZSBpbiBhcmdzLmVuYWJsZToKKyAgICAgICAgICAgIGxpbmUgPSAiI2RlZmluZSAiICsgb3B0aW9uX25hbWUKKyAgICAgICAgbmV3X2xpbmVzLmFwcGVuZChsaW5lKQorCisgICAgcmVzdWx0ID0gIlxuIi5qb2luKG5ld19saW5lcykKKworICAgICMgU2FuaXR5IGNoZWNrIHRoYXQgYWxsIGNvbW1hbmQtbGluZSBvcHRpb25zIHdlcmUgYWN0dWFsbHkgcHJvY2Vzc2VkLgorICAgIGNtZGxpbmVfb3B0aW9ucyA9IHNldChhcmdzLmVuYWJsZSkgfCBzZXQoYXJncy5kaXNhYmxlKQorICAgIGFzc2VydCBjbWRsaW5lX29wdGlvbnMuaXNzdWJzZXQoCisgICAgICAgIG9wdGlvbnNfc2VlbgorICAgICksICJDb3VsZCBub3QgZmluZCBvcHRpb25zIGluIGlucHV0IGZpbGU6ICIgKyAiLCAiLmpvaW4oCisgICAgICAgIHNvcnRlZChjbWRsaW5lX29wdGlvbnMgLSBvcHRpb25zX3NlZW4pCisgICAgKQorCisgICAgaWYgYXJncy5vdXRwdXQ6CisgICAgICAgIHdpdGggb3BlbihhcmdzLm91dHB1dCwgInciKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShyZXN1bHQpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQocmVzdWx0KQorCisgICAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL2J1aWxkcy9tb2R1bGVzLm1rIGIvYnVpbGRzL21vZHVsZXMubWsKaW5kZXggOWE3YTRhMC4uYWUyZTIzOCAxMDA2NDQKLS0tIGEvYnVpbGRzL21vZHVsZXMubWsKKysrIGIvYnVpbGRzL21vZHVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9vczIvZGV0ZWN0Lm1rIGIvYnVpbGRzL29zMi9kZXRlY3QubWsKaW5kZXggYWFmNzg0OC4uNjU5YjZjNCAxMDA2NDQKLS0tIGEvYnVpbGRzL29zMi9kZXRlY3QubWsKKysrIGIvYnVpbGRzL29zMi9kZXRlY3QubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTQwLDI5ICs0MCwzNyBAQAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGFnZSwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgVmlzdWFsIEFnZSBDKysKICAgICBDT05GSUdfRklMRSA6PSBvczItaWNjLm1rCiAgICAgQ0MgICAgICAgICAgOj0gaWNjCi0gICAgdmlzdWFsYWdlOiBzZXR1cAorCiAgICAgLlBIT05ZOiB2aXN1YWxhZ2UKKyAgICB2aXN1YWxhZ2U6IHNldHVwCisJICAgIEBjZCAuCiAgIGVuZGlmCiAKICAgaWZuZXEgKCQoZmluZHN0cmluZyB3YXRjb20sJChNQUtFQ01ER09BTFMpKSwpICAgICAgICAjIFdhdGNvbSBDL0MrKwogICAgIENPTkZJR19GSUxFIDo9IG9zMi13YXQubWsKICAgICBDQyAgICAgICAgICA6PSB3Y2MzODYKLSAgICB3YXRjb206IHNldHVwCisKICAgICAuUEhPTlk6IHdhdGNvbQorICAgIHdhdGNvbTogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIGJvcmxhbmRjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICMgQm9ybGFuZCBDKysgMzItYml0CiAgICAgQ09ORklHX0ZJTEUgOj0gb3MyLWJjYy5tawogICAgIENDICAgICAgICAgIDo9IGJjYzMyCi0gICAgYm9ybGFuZGM6IHNldHVwCisKICAgICAuUEhPTlk6IGJvcmxhbmRjCisgICAgYm9ybGFuZGM6IHNldHVwCisJICAgIEBjZCAuCiAgIGVuZGlmCiAKICAgaWZuZXEgKCQoZmluZHN0cmluZyBkZXZlbCwkKE1BS0VDTURHT0FMUykpLCkgICAgICAgICAjIGRldmVsb3BtZW50IHRhcmdldAogICAgIENPTkZJR19GSUxFIDo9IG9zMi1kZXYubWsKICAgICBDQyAgICAgICAgICA6PSBnY2MKLSAgICBkZXZlbDogc2V0dXAKKwogICAgIC5QSE9OWTogZGV2ZWwKKyAgICBkZXZlbDogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBzZXR1cDogc3RkX3NldHVwCmRpZmYgLS1naXQgYS9idWlsZHMvb3MyL29zMi1kZWYubWsgYi9idWlsZHMvb3MyL29zMi1kZWYubWsKaW5kZXggN2FkMWZmYi4uYjA5NzY1NCAxMDA2NDQKLS0tIGEvYnVpbGRzL29zMi9vczItZGVmLm1rCisrKyBiL2J1aWxkcy9vczIvb3MyLWRlZi5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTksNiArMTksMTAgQEAKIEJVSUxEX0RJUiA6PSAkKFRPUF9ESVIpL2J1aWxkcy9vczIKIFBMQVRGT1JNICA6PSBvczIKIAorIyBUaGlzIGlzIHVzZWQgZm9yIGBtYWtlIHJlZmRvYycgYW5kIGBtYWtlIHJlZmRvYy12ZW52JworIworQklOIDo9IFNjcmlwdHMKKwogIyBUaGUgZXhlY3V0YWJsZSBmaWxlIGV4dGVuc2lvbiAoZm9yIHRvb2xzKSwgKndpdGgqIGxlYWRpbmcgZG90LgogIwogRSA6PSAuZXhlCmRpZmYgLS1naXQgYS9idWlsZHMvb3MyL29zMi1kZXYubWsgYi9idWlsZHMvb3MyL29zMi1kZXYubWsKaW5kZXggNTA1YTc1NC4uOGUyYTRlYiAxMDA2NDQKLS0tIGEvYnVpbGRzL29zMi9vczItZGV2Lm1rCisrKyBiL2J1aWxkcy9vczIvb3MyLWRldi5tawpAQCAtNSw3ICs1LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL29zMi9vczItZ2NjLm1rIGIvYnVpbGRzL29zMi9vczItZ2NjLm1rCmluZGV4IDY1MDI2YjEuLjJiZDM5YWUgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9vczIvb3MyLWdjYy5taworKysgYi9idWlsZHMvb3MyL29zMi1nY2MubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9zeW1iaWFuL2JsZC5pbmYgYi9idWlsZHMvc3ltYmlhbi9ibGQuaW5mCmluZGV4IDljNmQ4ZGMuLjk3MzlkYTEgMTAwNjQ0Ci0tLSBhL2J1aWxkcy9zeW1iaWFuL2JsZC5pbmYKKysrIGIvYnVpbGRzL3N5bWJpYW4vYmxkLmluZgpAQCAtMiw3ICsyLDcgQEAKIC8vIEZyZWVUeXBlIDIgcHJvamVjdCBmb3IgdGhlIHN5bWJpYW4gcGxhdGZvcm0KIC8vCiAKLS8vIENvcHlyaWdodCAyMDA4LTIwMTggYnkKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDIwIGJ5CiAvLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAvLwogLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy9zeW1iaWFuL2ZyZWV0eXBlLm1tcCBiL2J1aWxkcy9zeW1iaWFuL2ZyZWV0eXBlLm1tcAppbmRleCA0ZTRhMDQxLi45MGZjNmJiIDEwMDY0NAotLS0gYS9idWlsZHMvc3ltYmlhbi9mcmVldHlwZS5tbXAKKysrIGIvYnVpbGRzL3N5bWJpYW4vZnJlZXR5cGUubW1wCkBAIC0yLDcgKzIsNyBAQAogLy8gRnJlZVR5cGUgMiBtYWtlZmlsZSBmb3IgdGhlIHN5bWJpYW4gcGxhdGZvcm0KIC8vCiAKLS8vIENvcHlyaWdodCAyMDA4LTIwMTggYnkKKy8vIENvcHlyaWdodCAoQykgMjAwOC0yMDIwIGJ5CiAvLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAvLwogLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy90b3BsZXZlbC5tayBiL2J1aWxkcy90b3BsZXZlbC5tawppbmRleCA3Y2UwZWQ4Li41ZGU2MWMxIDEwMDY0NAotLS0gYS9idWlsZHMvdG9wbGV2ZWwubWsKKysrIGIvYnVpbGRzL3RvcGxldmVsLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xOTEsMTMgKzE5MSwxMyBAQAogcGF0Y2ggOj0gJChzdWJzdCB8LCQoc3BhY2UpLCQod29yaykpCiBwYXRjaCA6PSAkKGZpcnN0d29yZCAkKHBhdGNoKSkKIAotaWZuZXEgKCQoZmluZHN0cmluZyB4MHgseCQocGF0Y2gpeCksKQotICB2ZXJzaW9uIDo9ICQobWFqb3IpLiQobWlub3IpCi0gIHdpbnZlcnNpb24gOj0gJChtYWpvcikkKG1pbm9yKQotZWxzZQorIyBpZm5lcSAoJChmaW5kc3RyaW5nIHgweCx4JChwYXRjaCl4KSwpCisjICAgdmVyc2lvbiA6PSAkKG1ham9yKS4kKG1pbm9yKQorIyAgIHdpbnZlcnNpb24gOj0gJChtYWpvcikkKG1pbm9yKQorIyBlbHNlCiAgIHZlcnNpb24gOj0gJChtYWpvcikuJChtaW5vcikuJChwYXRjaCkKICAgd2ludmVyc2lvbiA6PSAkKG1ham9yKSQobWlub3IpJChwYXRjaCkKLWVuZGlmCisjIGVuZGlmCiAKIAogIyBUaGlzIHRhcmdldCBidWlsZHMgdGhlIHRhcmJhbGxzLgpAQCAtMjA4LDcgKzIwOCw3IEBACiBkaXN0OgogCS1ybSAtcmYgdG1wCiAJcm0gLWYgZnJlZXR5cGUtJCh2ZXJzaW9uKS50YXIuZ3oKLQlybSAtZiBmcmVldHlwZS0kKHZlcnNpb24pLnRhci5iejIKKwlybSAtZiBmcmVldHlwZS0kKHZlcnNpb24pLnRhci54egogCXJtIC1mIGZ0JCh3aW52ZXJzaW9uKS56aXAKIAogCWZvciBkIGluIGBmaW5kIC4gLXdob2xlbmFtZSAnKi8uZ2l0JyAtcHJ1bmUgXApAQCAtMjI2LDIzICsyMjYsMTYgQEAKIAkgIGxuIC1zICQkY3VycmRpci8kJGYgdG1wLyQkZiA7IFwKIAlkb25lCiAKLQlAIyBQcmV2ZW50IGdlbmVyYXRpb24gb2YgLnB5YyBmaWxlcy4gIFB5dGhvbiBmb2xsb3dzIChzb2Z0KSBsaW5rcyBpZgotCUAjIHRoZSBsaW5rJ3MgZGlyZWN0b3J5IGlzIHdyaXRlIHByb3RlY3RlZCwgc28gd2UgaGF2ZSB0ZW1wb3JhcmlseQotCUAjIGRpc2FibGUgd3JpdGUgYWNjZXNzIGhlcmUgdG9vLgotCWNobW9kIC13IHNyYy90b29scy9kb2NtYWtlcgotCiAJY2QgdG1wIDsgXAogCSQoTUFLRSkgZGV2ZWwgOyBcCiAJJChNQUtFKSBkby1kaXN0CiAKLQljaG1vZCArdyBzcmMvdG9vbHMvZG9jbWFrZXIKLQogCW12IHRtcCBmcmVldHlwZS0kKHZlcnNpb24pCiAKIAl0YXIgLUggdXN0YXIgLWNoZiAtIGZyZWV0eXBlLSQodmVyc2lvbikgXAogCXwgZ3ppcCAtOSAtYyA+IGZyZWV0eXBlLSQodmVyc2lvbikudGFyLmd6CiAJdGFyIC1IIHVzdGFyIC1jaGYgLSBmcmVldHlwZS0kKHZlcnNpb24pIFwKLQl8IGJ6aXAyIC1jID4gZnJlZXR5cGUtJCh2ZXJzaW9uKS50YXIuYnoyCisJfCB4eiAtYyA+IGZyZWV0eXBlLSQodmVyc2lvbikudGFyLnh6CiAKIAlAIyBVc2UgQ1IvTEYgZm9yIHppcCBmaWxlcy4KIAl6aXAgLWxyOSBmdCQod2ludmVyc2lvbikuemlwIGZyZWV0eXBlLSQodmVyc2lvbikKQEAgLTI3NCw0ICsyNjcsOCBAQAogCWNwICQoQ09ORklHX0dVRVNTKSBidWlsZHMvdW5peAogCWNwICQoQ09ORklHX1NVQikgYnVpbGRzL3VuaXgKIAorCUAjIFJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMgY3JlYXRlZCBieSB0aGUgYHJlZmRvYycgdGFyZ2V0LgorCXJtIC1yZiBkb2NzL21hcmtkb3duCisJcm0gLWYgZG9jcy9ta2RvY3MueW1sCisKICMgRU9GCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9heF9jb21wYXJlX3ZlcnNpb24ubTQgYi9idWlsZHMvdW5peC9heF9jb21wYXJlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNDk5NwotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy91bml4L2F4X2NvbXBhcmVfdmVyc2lvbi5tNApAQCAtMCwwICsxLDE3NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX0NPTVBBUkVfVkVSU0lPTihWRVJTSU9OX0EsIE9QLCBWRVJTSU9OX0IsIFtBQ1RJT04tSUYtVFJVRV0sIFtBQ1RJT04tSUYtRkFMU0VdKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gY29tcGFyZXMgdHdvIHZlcnNpb24gc3RyaW5ncy4gRHVlIHRvIHRoZSB2YXJpb3VzIG51bWJlciBvZgorIyAgIG1pbm9yLXZlcnNpb24gbnVtYmVycyB0aGF0IGNhbiBleGlzdCwgYW5kIHRoZSBmYWN0IHRoYXQgc3RyaW5nCisjICAgY29tcGFyaXNvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggbnVtZXJpYyBjb21wYXJpc29ucywgdGhpcyBpcyBub3QKKyMgICBuZWNlc3NhcmlseSB0cml2aWFsIHRvIGRvIGluIGEgYXV0b2NvbmYgc2NyaXB0LiBUaGlzIG1hY3JvIG1ha2VzIGRvaW5nCisjICAgdGhlc2UgY29tcGFyaXNvbnMgZWFzeS4KKyMKKyMgICBUaGUgc2l4IGJhc2ljIGNvbXBhcmlzb25zIGFyZSBhdmFpbGFibGUsIGFzIHdlbGwgYXMgY2hlY2tpbmcgZXF1YWxpdHkKKyMgICBsaW1pdGVkIHRvIGEgY2VydGFpbiBudW1iZXIgb2YgbWlub3ItdmVyc2lvbiBsZXZlbHMuCisjCisjICAgVGhlIG9wZXJhdG9yIE9QIGRldGVybWluZXMgd2hhdCB0eXBlIG9mIGNvbXBhcmlzb24gdG8gZG8sIGFuZCBjYW4gYmUgb25lCisjICAgb2Y6CisjCisjICAgIGVxICAtIGVxdWFsICh0ZXN0IEEgPT0gQikKKyMgICAgbmUgIC0gbm90IGVxdWFsICh0ZXN0IEEgIT0gQikKKyMgICAgbGUgIC0gbGVzcyB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPD0gQikKKyMgICAgZ2UgIC0gZ3JlYXRlciB0aGFuIG9yIGVxdWFsICh0ZXN0IEEgPj0gQikKKyMgICAgbHQgIC0gbGVzcyB0aGFuICh0ZXN0IEEgPCBCKQorIyAgICBndCAgLSBncmVhdGVyIHRoYW4gKHRlc3QgQSA+IEIpCisjCisjICAgQWRkaXRpb25hbGx5LCB0aGUgZXEgYW5kIG5lIG9wZXJhdG9yIGNhbiBoYXZlIGEgbnVtYmVyIGFmdGVyIGl0IHRvIGxpbWl0CisjICAgdGhlIHRlc3QgdG8gdGhhdCBudW1iZXIgb2YgbWlub3IgdmVyc2lvbnMuCisjCisjICAgIGVxMCAtIGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lvbgorIyAgICBuZTAgLSBub3QgZXF1YWwgdXAgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uCisjICAgIGVxTiAtIGVxdWFsIHVwIHRvIE4gc3ViLXZlcnNpb24gbGV2ZWxzCisjICAgIG5lTiAtIG5vdCBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVscworIworIyAgIFdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtVFJVRSBhcmUgcnVuLAorIyAgIG90aGVyd2lzZSBzaGVsbCBjb21tYW5kcyBBQ1RJT04tSUYtRkFMU0UgYXJlIHJ1bi4gVGhlIGVudmlyb25tZW50CisjICAgdmFyaWFibGUgJ2F4X2NvbXBhcmVfdmVyc2lvbicgaXMgYWx3YXlzIHNldCB0byBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKKyMgICBhcyB3ZWxsLgorIworIyAgIEV4YW1wbGVzOgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtsdF0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtsdF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSB0cnVlLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcV0sWzMuMTUuOF0pCisjICAgICBBWF9DT01QQVJFX1ZFUlNJT04oWzMuMTVdLFtndF0sWzMuMTUuOF0pCisjCisjICAgd291bGQgYm90aCBiZSBmYWxzZS4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXEyXSxbMy4xNS44XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdHdvIG1pbm9yIHZlcnNpb25zLgorIworIyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1LjddLFtlcTBdLFszLjE1XSkKKyMKKyMgICB3b3VsZCBiZSB0cnVlIGJlY2F1c2UgaXQgaXMgb25seSBjb21wYXJpbmcgdGhlIGxlc3NlciBudW1iZXIgb2YgbWlub3IKKyMgICB2ZXJzaW9ucyBvZiB0aGUgdHdvIHZhbHVlcy4KKyMKKyMgICBOb3RlOiBUaGUgY2hhcmFjdGVycyB0aGF0IHNlcGFyYXRlIHRoZSB2ZXJzaW9uIG51bWJlcnMgZG8gbm90IG1hdHRlci4gQW4KKyMgICBlbXB0eSBzdHJpbmcgaXMgdGhlIHNhbWUgYXMgdmVyc2lvbiAwLiBPUCBpcyBldmFsdWF0ZWQgYnkgYXV0b2NvbmYsIG5vdAorIyAgIGNvbmZpZ3VyZSwgc28gbXVzdCBiZSBhIHN0cmluZywgbm90IGEgdmFyaWFibGUuCisjCisjICAgVGhlIGF1dGhvciB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIEd1aWRvIERyYWhlaW0gd2hvc2UgYWR2aWNlIGFib3V0CisjICAgdGhlIG00X2Nhc2UgYW5kIG00X2lmdmFsbiBmdW5jdGlvbnMgbWFrZSB0aGlzIG1hY3JvIG9ubHkgaW5jbHVkZSB0aGUKKyMgICBwb3J0aW9ucyBuZWNlc3NhcnkgdG8gcGVyZm9ybSB0aGUgc3BlY2lmaWMgY29tcGFyaXNvbiBzcGVjaWZpZWQgYnkgdGhlCisjICAgT1AgYXJndW1lbnQgaW4gdGhlIGZpbmFsIGNvbmZpZ3VyZSBzY3JpcHQuCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDggVGltIFRvb2xhbiA8dG9vbGFuQGVsZS51cmkuZWR1PgorIworIyAgIENvcHlpbmcgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZQorIyAgIHBlcm1pdHRlZCBpbiBhbnkgbWVkaXVtIHdpdGhvdXQgcm95YWx0eSBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZQorIyAgIGFuZCB0aGlzIG5vdGljZSBhcmUgcHJlc2VydmVkLiBUaGlzIGZpbGUgaXMgb2ZmZXJlZCBhcy1pcywgd2l0aG91dCBhbnkKKyMgICB3YXJyYW50eS4KKworI3NlcmlhbCAxMworCitkbmwgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworQUNfREVGVU4oW0FYX0NPTVBBUkVfVkVSU0lPTl0sIFsKKyAgQUNfUkVRVUlSRShbQUNfUFJPR19BV0tdKQorCisgICMgVXNlZCB0byBpbmRpY2F0ZSB0cnVlIG9yIGZhbHNlIGNvbmRpdGlvbgorICBheF9jb21wYXJlX3ZlcnNpb249ZmFsc2UKKworICAjIENvbnZlcnQgdGhlIHR3byB2ZXJzaW9uIHN0cmluZ3MgdG8gYmUgY29tcGFyZWQgaW50byBhIGZvcm1hdCB0aGF0CisgICMgYWxsb3dzIGEgc2ltcGxlIHN0cmluZyBjb21wYXJpc29uLiAgVGhlIGVuZCByZXN1bHQgaXMgdGhhdCBhIHZlcnNpb24KKyAgIyBzdHJpbmcgb2YgdGhlIGZvcm0gMS4xMi41LXI2MTcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGZvcm0KKyAgIyAwMDAxMDAxMjAwMDUwNjE3LiAgSW4gb3RoZXIgd29yZHMsIGVhY2ggbnVtYmVyIGlzIHplcm8gcGFkZGVkIHRvIGZvdXIKKyAgIyBkaWdpdHMsIGFuZCBub24gZGlnaXRzIGFyZSByZW1vdmVkLgorICBBU19WQVJfUFVTSERFRihbQV0sW2F4X2NvbXBhcmVfdmVyc2lvbl9BXSkKKyAgQT1gZWNobyAiJDEiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBBU19WQVJfUFVTSERFRihbQl0sW2F4X2NvbXBhcmVfdmVyc2lvbl9CXSkKKyAgQj1gZWNobyAiJDMiIHwgc2VkIC1lICdzL1woW1swLTldXSpcKS9aXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1cKVovWjBcMVovZycgXAorICAgICAgICAgICAgICAgICAgICAgLWUgJ3MvWlwoW1swLTldXVtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1tbXjAtOV1dLy9nJ2AKKworICBkbmwgIyBJbiB0aGUgY2FzZSBvZiBsZSwgZ2UsIGx0LCBhbmQgZ3QsIHRoZSBzdHJpbmdzIGFyZSBzb3J0ZWQgYXMgbmVjZXNzYXJ5CisgIGRubCAjIHRoZW4gdGhlIGZpcnN0IGxpbmUgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICBkbmwgIyBUaGUgc2VkIHJpZ2h0IGFmdGVyIHRoZSBlY2hvIGlzIHRvIHJlbW92ZSBhbnkgaW5kZW50ZWQgd2hpdGUgc3BhY2UuCisgIG00X2Nhc2UobTRfdG9sb3dlcigkMiksCisgIFtsdF0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vZmFsc2UvO3MveCR7Qn0vdHJ1ZS87MXEiYAorICBdLAorICBbZ3RdLFsKKyAgICBheF9jb21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBzb3J0IHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFxImAKKyAgXSwKKyAgW2xlXSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBlY2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAicy94JHtBfS90cnVlLztzL3gke0J9L2ZhbHNlLzsxcSJgCisgIF0sCisgIFtnZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIiIHwgc2VkICdzL14gKi8vJyB8IHNvcnQgLXIgfCBzZWQgInMveCR7QX0vdHJ1ZS87cy94JHtCfS9mYWxzZS87MXEiYAorICBdLFsKKyAgICBkbmwgU3BsaXQgdGhlIG9wZXJhdG9yIGZyb20gdGhlIHN1YnZlcnNpb24gY291bnQgaWYgcHJlc2VudC4KKyAgICBtNF9ibWF0Y2gobTRfc3Vic3RyKCQyLDIpLAorICAgIFswXSxbCisgICAgICAjIEEgY291bnQgb2YgemVybyBtZWFucyB1c2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlciB2ZXJzaW9uLgorICAgICAgIyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEEgYW5kIEIuCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0E9YGVjaG8gIiRBIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisgICAgICBheF9jb21wYXJlX3ZlcnNpb25fbGVuX0I9YGVjaG8gIiRCIiB8ICRBV0sgJ3twcmludChsZW5ndGgpfSdgCisKKyAgICAgICMgU2V0IEEgdG8gbm8gbW9yZSB0aGFuIEIncyBsZW5ndGggYW5kIEIgdG8gbm8gbW9yZSB0aGFuIEEncyBsZW5ndGguCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQgInMvXCguXHskYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9BXH1cKS4qL1wxLyJgCisgICAgXSwKKyAgICBbWzAtOV0rXSxbCisgICAgICAjIEEgY291bnQgZ3JlYXRlciB0aGFuIHplcm8gbWVhbnMgdXNlIG9ubHkgdGhhdCBtYW55IHN1YnZlcnNpb25zCisgICAgICBBPWBlY2hvICIkQSIgfCBzZWQgInMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiovXDEvImAKKyAgICAgIEI9YGVjaG8gIiRCIiB8IHNlZCAicy9cKFwoW1swLTldXVx7NFx9XClce200X3N1YnN0cigkMiwyKVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgWy4rXSxbCisgICAgICBBQ19XQVJOSU5HKAorICAgICAgICBbaW52YWxpZCBPUCBudW1lcmljIHBhcmFtZXRlcjogJDJdKQorICAgIF0sW10pCisKKyAgICAjIFBhZCB6ZXJvcyBhdCBlbmQgb2YgbnVtYmVycyB0byBtYWtlIHNhbWUgbGVuZ3RoLgorICAgIGF4X2NvbXBhcmVfdmVyc2lvbl90bXBfQT0iJEFgZWNobyAkQiB8IHNlZCAncy8uLzAvZydgIgorICAgIEI9IiRCYGVjaG8gJEEgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBBPSIkYXhfY29tcGFyZV92ZXJzaW9uX3RtcF9BIgorCisgICAgIyBDaGVjayBmb3IgZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBhcyBuZWNlc3NhcnkuCisgICAgbTRfY2FzZShtNF90b2xvd2VyKG00X3N1YnN0cigkMiwwLDIpKSwKKyAgICBbZXFdLFsKKyAgICAgIHRlc3QgIngkQSIgPSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sCisgICAgW25lXSxbCisgICAgICB0ZXN0ICJ4JEEiICE9ICJ4JEIiICYmIGF4X2NvbXBhcmVfdmVyc2lvbj10cnVlCisgICAgXSxbCisgICAgICBBQ19XQVJOSU5HKFtpbnZhbGlkIE9QIHBhcmFtZXRlcjogJDJdKQorICAgIF0pCisgIF0pCisKKyAgQVNfVkFSX1BPUERFRihbQV0pZG5sCisgIEFTX1ZBUl9QT1BERUYoW0JdKWRubAorCisgIGRubCAjIEV4ZWN1dGUgQUNUSU9OLUlGLVRSVUUgLyBBQ1RJT04tSUYtRkFMU0UuCisgIGlmIHRlc3QgIiRheF9jb21wYXJlX3ZlcnNpb24iID0gInRydWUiIDsgdGhlbgorICAgIG00X2lmdmFsbihbJDRdLFskNF0sWzpdKWRubAorICAgIG00X2lmdmFsbihbJDVdLFtlbHNlICQ1XSlkbmwKKyAgZmkKK10pIGRubCBBWF9DT01QQVJFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2F4X3Byb2dfcHl0aG9uX3ZlcnNpb24ubTQgYi9idWlsZHMvdW5peC9heF9wcm9nX3B5dGhvbl92ZXJzaW9uLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZHMvdW5peC9heF9wcm9nX3B5dGhvbl92ZXJzaW9uLm00CkBAIC0wLDAgKzEsNjYgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19weXRob25fdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfUFlUSE9OX1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1JRi1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3VyZSB0aGF0IHB5dGhvbiBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQuIElmIHRydWUgdGhlIHNoZWxsCisjICAgY29tbWFuZHMgaW4gQUNUSU9OLUlGLVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRzIGluCisjICAgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIE5vdGUgaWYgJFBZVEhPTiBpcyBub3Qgc2V0IChmb3IgZXhhbXBsZSBieQorIyAgIHJ1bm5pbmcgQUNfQ0hFQ0tfUFJPRyBvciBBQ19QQVRIX1BST0cpIHRoZSBtYWNybyB3aWxsIGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJPRyhbUFlUSE9OXSxbcHl0aG9uXSkKKyMgICAgIEFYX1BST0dfUFlUSE9OX1ZFUlNJT04oWzIuNC40XSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgVGhpcyB3aWxsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBweXRob24geW91IGhhdmUgc3VwcG9ydHMgYXQgbGVhc3QKKyMgICB2ZXJzaW9uIDIuNC40LgorIworIyAgIE5PVEU6IFRoaXMgbWFjcm8gdXNlcyB0aGUgJFBZVEhPTiB2YXJpYWJsZSB0byBwZXJmb3JtIHRoZSBjaGVjay4KKyMgICBBWF9XSVRIX1BZVEhPTiBjYW4gYmUgdXNlZCB0byBzZXQgdGhhdCB2YXJpYWJsZSBwcmlvciB0byBydW5uaW5nIHRoaXMKKyMgICBtYWNyby4gVGhlICRQWVRIT05fVkVSU0lPTiB2YXJpYWJsZSB3aWxsIGJlIHZhbG9yaXplZCB3aXRoIHRoZSBkZXRlY3RlZAorIyAgIHZlcnNpb24uCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMpIDIwMDkgRnJhbmNlc2NvIFNhbHZlc3RyaW5pIDxzYWx2ZXN0cmluaUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDEyCisKK0FDX0RFRlVOKFtBWF9QUk9HX1BZVEhPTl9WRVJTSU9OXSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorICAgIEFDX1JFUVVJUkUoW0FDX1BST0dfR1JFUF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAiJFBZVEhPTiJdLFsKKyAgICAgICAgYXhfcHl0aG9uX3ZlcnNpb249IiQxIgorCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHB5dGhvbiB2ZXJzaW9uXSkKKyAgICAgICAgY2hhbmdlcXVvdGUoPDwsPj4pCisgICAgICAgIHB5dGhvbl92ZXJzaW9uPWAkUFlUSE9OIC1WIDI+JjEgfCAkR1JFUCAiXlB5dGhvbiAiIHwgJFNFRCAtZSAncy9eLiogXChbMC05XSpcLlswLTldKlwuWzAtOV0qXCkvXDEvJ2AKKyAgICAgICAgY2hhbmdlcXVvdGUoWyxdKQorICAgICAgICBBQ19NU0dfUkVTVUxUKCRweXRob25fdmVyc2lvbikKKworCUFDX1NVQlNUKFtQWVRIT05fVkVSU0lPTl0sWyRweXRob25fdmVyc2lvbl0pCisKKyAgICAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFskYXhfcHl0aG9uX3ZlcnNpb25dLFtsZV0sWyRweXRob25fdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAgICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkKKyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5kIHRoZSBweXRob24gaW50ZXJwcmV0ZXJdKQorICAgICAgICAkMworICAgIF0pCitdKQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdyBiL2J1aWxkcy91bml4L2NvbmZpZ3VyZS5yYXcKaW5kZXggYmFhYjc5ZC4uYmM2NWU0NSAxMDA2NDQKLS0tIGEvYnVpbGRzL3VuaXgvY29uZmlndXJlLnJhdworKysgYi9idWlsZHMvdW5peC9jb25maWd1cmUucmF3CkBAIC0yLDcgKzIsNyBAQAogIwogIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgogIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTEyLDEyICsxMiwxMiBAQAogIyBmdWxseS4KIAogQUNfSU5JVChbRnJlZVR5cGVdLCBbQFZFUlNJT05AXSwgW2ZyZWV0eXBlQG5vbmdudS5vcmddLCBbZnJlZXR5cGVdKQotQUNfQ09ORklHX1NSQ0RJUihbZnRjb25maWcuaW5dKQorQUNfQ09ORklHX1NSQ0RJUihbZnRjb25maWcuaC5pbl0pCiAKIAogIyBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIGBkb2NzL1ZFUlNJT05TLlRYVCchCiAKLXZlcnNpb25faW5mbz0nMjI6MToxNicKK3ZlcnNpb25faW5mbz0nMjM6NDoxNycKIEFDX1NVQlNUKFt2ZXJzaW9uX2luZm9dKQogZnRfdmVyc2lvbj1gZWNobyAkdmVyc2lvbl9pbmZvIHwgdHIgOiAuYAogQUNfU1VCU1QoW2Z0X3ZlcnNpb25dKQpAQCAtMzcsNyArMzcsNyBAQAogUEtHX1BST0dfUEtHX0NPTkZJRyhbMC4yNF0pCiAKIExUX0lOSVQod2luMzItZGxsKQotTFRfUFJPR19SQworQUNfQ0hFQ0tfSEVBREVSKFt3aW5kb3dzLmhdLCBbTFRfUFJPR19SQ10pCiAKIAogIyBjaGVja3MgZm9yIG5hdGl2ZSBwcm9ncmFtcyB0byBnZW5lcmF0ZSBidWlsZGluZyB0b29sCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogQUNfVFlQRV9MT05HX0xPTkdfSU5UCiAKIAotIyBjaGVjayB3aGV0aGVyIGNwcCBjb21wdXRhdGlvbiBvZiBzaXplIG9mIGludCBhbmQgbG9uZyBpbiBmdGNvbmZpZy5pbiB3b3JrcworIyBjaGVjayB3aGV0aGVyIGNwcCBjb21wdXRhdGlvbiBvZiBzaXplIG9mIGludCBhbmQgbG9uZyBpbiBmdGNvbmZpZy5oLmluIHdvcmtzCiAKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciBjcHAgY29tcHV0YXRpb24gb2YgYml0IGxlbmd0aCBpbiBmdGNvbmZpZy5pbiB3b3Jrc10pCitBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgY3BwIGNvbXB1dGF0aW9uIG9mIGJpdCBsZW5ndGggaW4gZnRjb25maWcuaC5pbiB3b3Jrc10pCiBvcmlnX0NQUEZMQUdTPSIke0NQUEZMQUdTfSIKLUNQUEZMQUdTPSItSSR7c3JjZGlyfSAtSS4gLUkke3NyY2Rpcn0vLi4vLi4vaW5jbHVkZS9mcmVldHlwZS9jb25maWcgJHtDUFBGTEFHU30iCitDUFBGTEFHUz0iLUkke3NyY2Rpcn0gLUkuIC1JJHtzcmNkaXJ9Ly4uLy4uL2luY2x1ZGUgJHtDUFBGTEFHU30iCiAKIGFjX2NsZWFuX2ZpbGVzPQogaWYgdGVzdCAhIC1mIGZ0MmJ1aWxkLmg7IHRoZW4KQEAgLTEyMywxMSArMTIzLDExIEBACiAKIGNhdCA+IGNvbmZ0ZXN0LmMgPDxcX0FDRU9GCiAjaW5jbHVkZSA8bGltaXRzLmg+Ci0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggImZ0b3B0aW9uLmgiCi0jZGVmaW5lIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggImZ0c3RkbGliLmgiCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgorI2RlZmluZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IIDxmcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaD4KICNkZWZpbmUgRlRfVUlOVF9NQVggIFVJTlRfTUFYCiAjZGVmaW5lIEZUX1VMT05HX01BWCBVTE9OR19NQVgKLSNpbmNsdWRlICJmdGNvbmZpZy5pbiIKKyNpbmNsdWRlICJmdGNvbmZpZy5oLmluIgogX0FDRU9GCiBlY2hvID4+IGNvbmZ0ZXN0LmMgIiNpZiBGVF9TSVpFT0ZfSU5UID09ICIke2FjX2N2X3NpemVvZl9pbnR9CiBlY2hvID4+IGNvbmZ0ZXN0LmMgImFjX2NwcF9mdF9zaXplb2ZfaW50PSIke2FjX2N2X3NpemVvZl9pbnR9CkBAIC0xOTYsNyArMTk2LDcgQEAKIEFDX0FSR19FTkFCTEUoW21tYXBdLAogICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW1tYXBdLAogICAgICAgICAgICAgICAgICBbZG8gbm90IGNoZWNrIG1tYXAoKSBhbmQgZG8gbm90IHVzZV0pLAotICBbZW5hYmxlX21tYXA9Im5vIl0sW2VuYWJsZV9tbWFwPSJ5ZXMiXSkKKyAgW2VuYWJsZV9tbWFwPSJubyJdLCBbZW5hYmxlX21tYXA9InllcyJdKQogaWYgdGVzdCAieCR7ZW5hYmxlX21tYXB9IiAhPSAieG5vIjsgdGhlbgogICBBQ19GVU5DX01NQVAKIGZpCkBAIC0zMTEsMTQgKzMxMSwyNiBAQAogIyBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgaGlkZSBzeW1ib2xzIGV4Y2VwdCB0aG9zZSB3aXRoCiAjIGV4cGxpY2l0IF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpLgogIworZm91bmRfdmlzaWJpbGl0eV9mbGFnPW5vCiBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAtZnZpc2liaWxpdHk9aGlkZGVuIGNvbXBpbGVyIGZsYWddKQogb3JpZ19DRkxBR1M9IiR7Q0ZMQUdTfSIKIENGTEFHUz0iJHtDRkxBR1N9IC1mdmlzaWJpbGl0eT1oaWRkZW4iCi1BQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLFtdKV0sCi0gICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcyksCi0gICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7b3JpZ19DRkxBR1N9IgotICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubykpCitBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLAorICAgICAgICAgICAgICAgW2ZvdW5kX3Zpc2liaWxpdHlfZmxhZz15ZXMKKyAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKHllcyldLAorICAgICAgICAgICAgICAgW0NGTEFHUz0iJHtvcmlnX0NGTEFHU30iCisgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChubyldKQogCitpZiB0ZXN0ICIke2ZvdW5kX3Zpc2liaWxpdHlfZmxhZ30iID0gIm5vIjsgdGhlbgorICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAteGxkc2NvcGU9aGlkZGVuIGNvbXBpbGVyIGZsYWddKQorICBvcmlnX0NGTEFHUz0iJHtDRkxBR1N9IgorICBDRkxBR1M9IiR7Q0ZMQUdTfSAteGxkc2NvcGU9aGlkZGVuIgorICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtdLCBbXSldLAorICAgICAgICAgICAgICAgICBbZm91bmRfdmlzaWJpbGl0eV9mbGFnPXllcworICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVCh5ZXMpXSwKKyAgICAgICAgICAgICAgICAgW0NGTEFHUz0iJHtvcmlnX0NGTEFHU30iCisgICAgICAgICAgICAgICAgICBBQ19NU0dfUkVTVUxUKG5vKV0pCitmaQogCiAjIEFsbCBsaWJyYXJ5IHRlc3RzIGJlbG93IHRyeSBgcGtnLWNvbmZpZycgZmlyc3QuICBJZiB0aGF0IGZhaWxzLCBhIGZ1bmN0aW9uCiAjIGZyb20gdGhlIGxpYnJhcnkgaXMgdGVzdGVkIGluIHRoZSB0cmFkaXRpb25hbCBhdXRvY29uZiB3YXkgKHpsaWIsIGJ6aXAyKSwKQEAgLTQ2Niw3ICs0NzgsNyBAQAogICAgICAgbGlicG5nX2xpYnNzdGF0aWNjb25mPSIkTElCUE5HX0xJQlMiCiAgICAgICBoYXZlX2xpYnBuZz0ieWVzIChMSUJQTkdfQ0ZMQUdTIGFuZCBMSUJQTkdfTElCUykiCiAgICAgZWxzZQotICAgICAgIyBmYWxsIGJhY2sgdG8gY29uZmlnIHNjcmlwdC4KKyAgICAgICMgZmFsbCBiYWNrIHRvIGNvbmZpZyBzY3JpcHQKICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGxpYnBuZy1jb25maWddKQogICAgICAgaWYgd2hpY2ggbGlicG5nLWNvbmZpZyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIExJQlBOR19DRkxBR1M9YGxpYnBuZy1jb25maWcgLS1jZmxhZ3NgCkBAIC00OTYsNyArNTA4LDcgQEAKIAogaGF2ZV9oYXJmYnV6ej1ubwogaWYgdGVzdCB4IiR3aXRoX2hhcmZidXp6IiA9IHh5ZXMgLW8geCIkd2l0aF9oYXJmYnV6eiIgPSB4YXV0bzsgdGhlbgotICBoYXJmYnV6el9wa2c9ImhhcmZidXp6ID49IDEuMy4wIgorICBoYXJmYnV6el9wa2c9ImhhcmZidXp6ID49IDEuOC4wIgogICBoYXZlX2hhcmZidXp6X3BrZz1ubwogCiAgIGlmIHRlc3QgeCIkSEFSRkJVWlpfQ0ZMQUdTIiA9IHggLWEgeCIkSEFSRkJVWlpfTElCUyIgPSB4OyB0aGVuCkBAIC01MzEsNiArNTQzLDUwIEBACiBmaQogCiAKKyMgY2hlY2sgZm9yIHN5c3RlbSBsaWJicm90bGlkZWMKKworQUNfQVJHX1dJVEgoW2Jyb3RsaV0sCisgIFtBU19IRUxQX1NUUklORyhbLS13aXRoLWJyb3RsaT1APDpAeWVzfG5vfGF1dG9AOj5AXSwKKyAgICAgICAgICAgICAgICAgIFtzdXBwb3J0IGRlY29tcHJlc3Npb24gb2YgV09GRjIgc3RyZWFtcyBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pXSwKKyAgW10sIFt3aXRoX2Jyb3RsaT1hdXRvXSkKKworaGF2ZV9icm90bGk9bm8KK2lmIHRlc3QgeCIkd2l0aF9icm90bGkiID0geHllcyAtbyB4IiR3aXRoX2Jyb3RsaSIgPSB4YXV0bzsgdGhlbgorICBicm90bGlfcGtnPSJsaWJicm90bGlkZWMiCisgIGhhdmVfYnJvdGxpX3BrZz1ubworCisgIGlmIHRlc3QgeCIkQlJPVExJX0NGTEFHUyIgPSB4IC1hIHgiJEJST1RMSV9MSUJTIiA9IHg7IHRoZW4KKyAgICBQS0dfQ0hFQ0tfRVhJU1RTKFskYnJvdGxpX3BrZ10sIFtoYXZlX2Jyb3RsaV9wa2c9eWVzXSkKKyAgZmkKKyAgUEtHX0NIRUNLX01PRFVMRVMoW0JST1RMSV0sIFskYnJvdGxpX3BrZ10sCisgICAgICAgICAgICAgICAgICAgIFtoYXZlX2Jyb3RsaT0ieWVzIChwa2ctY29uZmlnKSJdLCBbOl0pCisKKyAgaWYgdGVzdCAkaGF2ZV9icm90bGlfcGtnID0geWVzOyB0aGVuCisgICAgIyB3ZSBoYXZlIGxpYmJyb3RsaWRlYy5wYworICAgIGJyb3RsaV9yZXFwcml2PSIkYnJvdGxpX3BrZyIKKyAgICBicm90bGlfbGlic3ByaXY9CisgICAgYnJvdGxpX2xpYnNzdGF0aWNjb25mPWAkUEtHX0NPTkZJRyAtLXN0YXRpYyAtLWxpYnMgIiRicm90bGlfcGtnImAKKyAgZWxzZQorICAgIGJyb3RsaV9yZXFwcml2PQorCisgICAgaWYgdGVzdCAiJGhhdmVfYnJvdGxpIiAhPSBubzsgdGhlbgorICAgICAgIyBCUk9UTElfQ0ZMQUdTIGFuZCBCUk9UTElfTElCUyBhcmUgc2V0IGJ5IHRoZSB1c2VyCisgICAgICBicm90bGlfbGlic3ByaXY9IiRCUk9UTElfTElCUyIKKyAgICAgIGJyb3RsaV9saWJzc3RhdGljY29uZj0iJEJST1RMSV9MSUJTIgorICAgICAgaGF2ZV9icm90bGk9InllcyAoQlJPVExJX0NGTEFHUyBhbmQgQlJPVExJX0xJQlMpIgorICAgIGVsc2UKKyAgICAgICMgc2luY2UgQnJvdGxpIGlzIHF1aXRlIGEgbmV3IGxpYnJhcnkgd2UgZG9uJ3QgZmFsbCBiYWNrIHRvIGEKKyAgICAgICMgZGlmZmVyZW50IHRlc3QKKyAgICAgIDoKKyAgICBmaQorICBmaQorZmkKKworaWYgdGVzdCB4IiR3aXRoX2Jyb3RsaSIgPSB4eWVzIC1hICIkaGF2ZV9icm90bGkiID0gbm87IHRoZW4KKyAgQUNfTVNHX0VSUk9SKFticm90bGkgc3VwcG9ydCByZXF1ZXN0ZWQgYnV0IGxpYnJhcnkgbm90IGZvdW5kXSkKK2ZpCisKKwogIyBjaGVjayBmb3IgbGlicnQKICMKICMgV2UgbmVlZCBgY2xvY2tfZ2V0dGltZScgZm9yIHRoZSBgZnRiZW5jaCcgZGVtbyBwcm9ncmFtLgpAQCAtOTU2LDEyICsxMDEyLDM2IEBACiAgICAgOzsKIGVzYWMKIAorIyBDaGVjayBmb3IgUHl0aG9uIGFuZCBkb2N3cml0ZXIKIAotIyBlbnRyaWVzIGluIFJlcXVpcmVzLnByaXZhdGUgYXJlIHNlcGFyYXRlZCBieSBjb21tYXM7CitoYXZlX3B5Mz1ubworaGF2ZV9kb2N3cml0ZXI9bm8KK1BJUD1waXAKKworQUNfQ0hFQ0tfUFJPR1MoW1BZVEhPTl0sIFtweXRob24zIHB5dGhvbl0sIFttaXNzaW5nXSkKK2lmIHRlc3QgIngkUFlUSE9OIiAhPSAieG1pc3NpbmciOyB0aGVuCisgIEFYX1BST0dfUFlUSE9OX1ZFUlNJT04oWzMuNV0sIFtoYXZlX3B5Mz15ZXNdLCBbXSkKKworICBpZiB0ZXN0ICJ4JGhhdmVfcHkzIiA9ICJ4eWVzIjsgdGhlbgorICAgIFBJUD0iJFBZVEhPTiAtbSAkUElQIgorICAgIEFDX01TR19DSEVDS0lORyhbZm9yIFxgZG9jd3JpdGVyJyBQeXRob24gbW9kdWxlXSkKKyAgICAkUFlUSE9OIC1tIGRvY3dyaXRlciAtaCA+IC9kZXYvbnVsbCAyPiYxCisgICAgaWYgdGVzdCAieCQ/IiA9ICJ4MCI7IHRoZW4KKyAgICAgIGhhdmVfZG9jd3JpdGVyPXllcworICAgICAgQUNfTVNHX1JFU1VMVChbeWVzXSkKKyAgICBlbHNlCisgICAgICBBQ19NU0dfUkVTVUxUKFtub10pCisgICAgZmkKKyAgZmkKK2ZpCisKKworIyBlbnRyaWVzIGluIFJlcXVpcmVzLnByaXZhdGUgYXJlIHNlcGFyYXRlZCBieSBjb21tYXMKIFJFUVVJUkVTX1BSSVZBVEU9IiR6bGliX3JlcXByaXYsICAgICBcCiAgICAgICAgICAgICAgICAgICAkYnppcDJfcmVxcHJpdiwgICAgXAogICAgICAgICAgICAgICAgICAgJGxpYnBuZ19yZXFwcml2LCAgIFwKLSAgICAgICAgICAgICAgICAgICRoYXJmYnV6el9yZXFwcml2IgorICAgICAgICAgICAgICAgICAgJGhhcmZidXp6X3JlcXByaXYsIFwKKyAgICAgICAgICAgICAgICAgICRicm90bGlfcmVxcHJpdiIKICMgYmVhdXRpZnkKIFJFUVVJUkVTX1BSSVZBVEU9YGVjaG8gIiRSRVFVSVJFU19QUklWQVRFIiBcCiAgICAgICAgICAgICAgICAgICB8IHNlZCAtZSAncy9eICAqLy8nICAgICAgXApAQCAtOTc2LDYgKzEwNTYsNyBAQAogICAgICAgICAgICAgICAkYnppcDJfbGlic3ByaXYgICAgXAogICAgICAgICAgICAgICAkbGlicG5nX2xpYnNwcml2ICAgXAogICAgICAgICAgICAgICAkaGFyZmJ1enpfbGlic3ByaXYgXAorICAgICAgICAgICAgICAkYnJvdGxpX2xpYnNwcml2ICAgXAogICAgICAgICAgICAgICAkZnQyX2V4dHJhX2xpYnMiCiAjIGJlYXV0aWZ5CiBMSUJTX1BSSVZBVEU9YGVjaG8gIiRMSUJTX1BSSVZBVEUiICBcCkBAIC05ODgsNiArMTA2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgJGJ6aXAyX2xpYnNzdGF0aWNjb25mICAgIFwKICAgICAgICAgICAgICAgICAgICAkbGlicG5nX2xpYnNzdGF0aWNjb25mICAgXAogICAgICAgICAgICAgICAgICAgICRoYXJmYnV6el9saWJzc3RhdGljY29uZiBcCisgICAgICAgICAgICAgICAgICAgJGJyb3RsaV9saWJzc3RhdGljY29uZiAgIFwKICAgICAgICAgICAgICAgICAgICAkZnQyX2V4dHJhX2xpYnMiCiAjIHJlbW92ZSAtTC91c3IvbGliIGFuZCAtTC91c3IvbGliNjQgc2luY2UgYGZyZWV0eXBlLWNvbmZpZycgYWRkcyB0aGVtIGxhdGVyCiAjIG9uIGlmIG5lY2Vzc2FyeTsgYWxzbyBiZWF1dGlmeQpAQCAtMTA1Miw2ICsxMTM0LDEzIEBACiBlbHNlCiAgIGZ0b3B0aW9uX3Vuc2V0IEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCiBmaQoraWYgdGVzdCAiJGhhdmVfYnJvdGxpIiAhPSBubzsgdGhlbgorICBDRkxBR1M9IiRDRkxBR1MgJEJST1RMSV9DRkxBR1MiCisgIExERkxBR1M9IiRMREZMQUdTICRCUk9UTElfTElCUyIKKyAgZnRvcHRpb25fc2V0IEZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSQorZWxzZQorICBmdG9wdGlvbl91bnNldCBGVF9DT05GSUdfT1BUSU9OX1VTRV9CUk9UTEkKK2ZpCiAKIEFDX1NVQlNUKFtDRkxBR1NdKQogQUNfU1VCU1QoW0xERkxBR1NdKQpAQCAtMTA2OSwxNSArMTE1OCw3IEBACiAgICBybSBmdG9wdGlvbi50bXBdLAogICBbRlRPUFRJT05fSF9TRUQ9IiRGVE9QVElPTl9IX1NFRCJdKQogCi0jIGNvbmZpZ3VyYXRpb24gZmlsZSAtLSBzdGF5IGluIDguMyBsaW1pdAotIwotIyBzaW5jZSAjdW5kZWYgZG9lc24ndCBzdXJ2aXZlIGluIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZpbGVzIHdlIHJlcGxhY2UKLSMgYC91bmRlZicgd2l0aCBgI3VuZGVmJyBhZnRlciBjcmVhdGluZyB0aGUgb3V0cHV0IGZpbGUKLQotQUNfQ09ORklHX0hFQURFUlMoW2Z0Y29uZmlnLmg6ZnRjb25maWcuaW5dLAotICBbbXYgZnRjb25maWcuaCBmdGNvbmZpZy50bXAKLSAgIHNlZCAnc3wvdW5kZWZ8I3VuZGVmfCcgPCBmdGNvbmZpZy50bXAgPiBmdGNvbmZpZy5oCi0gICBybSBmdGNvbmZpZy50bXBdKQorQUNfQ09ORklHX0hFQURFUlMoW2Z0Y29uZmlnLmhdKQogCiAjIGNyZWF0ZSB0aGUgVW5peC1zcGVjaWZpYyBzdWItTWFrZWZpbGVzIGBidWlsZHMvdW5peC91bml4LWRlZi5taycKICMgYW5kIGBidWlsZHMvdW5peC91bml4LWNjLm1rJyB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgYnVpbGQgc3lzdGVtCkBAIC0xMDg1LDEwICsxMTY2LDYgQEAKIEFDX0NPTkZJR19GSUxFUyhbdW5peC1jYy5tazp1bml4LWNjLmluCiAgICAgICAgICAgICAgICAgIHVuaXgtZGVmLm1rOnVuaXgtZGVmLmluXSkKIAotIyByZS1nZW5lcmF0ZSB0aGUgSmFtZmlsZSB0byB1c2UgbGlidG9vbCBub3cKLSMKLSMgQUNfQ09ORklHX0ZJTEVTKFsuLi8uLi9KYW1maWxlOi4uLy4uL0phbWZpbGUuaW5dKQotCiBBQ19PVVRQVVQKIAogQUNfTVNHX05PVElDRShbCkBAIC0xMDk4LDYgKzExNzUsMTggQEAKICAgYnppcDI6ICAgICAgICAgJGhhdmVfYnppcDIKICAgbGlicG5nOiAgICAgICAgJGhhdmVfbGlicG5nCiAgIGhhcmZidXp6OiAgICAgICRoYXZlX2hhcmZidXp6CisgIGJyb3RsaTogICAgICAgICRoYXZlX2Jyb3RsaQogXSkKIAorIyBXYXJuIGlmIGRvY3dyaXRlciBpcyBub3QgaW5zdGFsbGVkCisKK2lmIHRlc3QgJGhhdmVfZG9jd3JpdGVyID0gbm87IHRoZW4KKyAgQUNfTVNHX1dBUk4oWworICBcYG1ha2UgcmVmZG9jJyB3aWxsIGZhaWwgc2luY2UgcGlwIHBhY2thZ2UgXGBkb2N3cml0ZXInIGlzIG5vdCBpbnN0YWxsZWQuCisgIFRvIGluc3RhbGwsIHJ1biBcYCRQSVAgaW5zdGFsbCBkb2N3cml0ZXInLCBvciB0byB1c2UgYSBQeXRob24KKyAgdmlydHVhbCBlbnZpcm9ubWVudCwgcnVuIFxgbWFrZSByZWZkb2MtdmVudicgKHJlcXVpcmVzIHBpcCBwYWNrYWdlCisgIFxgdmlydHVhbGVudicpLiBUaGVzZSBvcGVyYXRpb25zIHJlcXVpcmUgUHl0aG9uID49IDMuNS4KKyAgXSkKK2ZpCisKICMgZW5kIG9mIGNvbmZpZ3VyZS5yYXcKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2RldGVjdC5tayBiL2J1aWxkcy91bml4L2RldGVjdC5tawppbmRleCA1NGRhYTA3Li5jN2U4NDA4IDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC9kZXRlY3QubWsKKysrIGIvYnVpbGRzL3VuaXgvZGV0ZWN0Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC00MCw4ICs0MCwxMCBAQAogICBpZm5lcSAoJChmaW5kc3RyaW5nIGRldmVsLCQoTUFLRUNNREdPQUxTKSksKQogICAgIENPTkZJR19GSUxFIDo9IHVuaXgtZGV2Lm1rCiAgICAgQ0MgICAgICAgICAgOj0gZ2NjCi0gICAgZGV2ZWw6IHNldHVwCisKICAgICAuUEhPTlk6IGRldmVsCisgICAgZGV2ZWw6IHNldHVwCisJICAgIEA6CiAgIGVsc2UKIAogICAgICMgSWYgYGxjYycgaXMgdGhlIHJlcXVlc3RlZCB0YXJnZXQsIHdlIHVzZSBhIHNwZWNpYWwgY29uZmlndXJhdGlvbgpAQCAtNTAsOCArNTIsMTAgQEAKICAgICBpZm5lcSAoJChmaW5kc3RyaW5nIGxjYywkKE1BS0VDTURHT0FMUykpLCkKICAgICAgIENPTkZJR19GSUxFIDo9IHVuaXgtbGNjLm1rCiAgICAgICBDQyAgICAgICAgICA6PSBsY2MKLSAgICAgIGxjYzogc2V0dXAKKwogICAgICAgLlBIT05ZOiBsY2MKKyAgICAgIGxjYzogc2V0dXAKKwkgICAgICBAOgogICAgIGVsc2UKIAogICAgICAgIyBJZiBhIFVuaXggcGxhdGZvcm0gaXMgZGV0ZWN0ZWQsIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIGNhbGxlZCBhbmQKQEAgLTY4LDkgKzcyLDExIEBACiAgICAgICAjIHBsYXRmb3JtKS4KICAgICAgICMKICAgICAgIENPTkZJR19GSUxFIDo9IHVuaXgubWsKLSAgICAgIHVuaXg6IHNldHVwCiAgICAgICBtdXN0X2NvbmZpZ3VyZSA6PSAxCisKICAgICAgIC5QSE9OWTogdW5peAorICAgICAgdW5peDogc2V0dXAKKwkgICAgICBAOgogICAgIGVuZGlmCiAgIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbiBiL2J1aWxkcy91bml4L2ZyZWV0eXBlLWNvbmZpZy5pbgppbmRleCAyZDViOTBkLi4zOTE4ZGRiIDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC9mcmVldHlwZS1jb25maWcuaW4KKysrIGIvYnVpbGRzL3VuaXgvZnJlZXR5cGUtY29uZmlnLmluCkBAIC0xLDYgKzEsNiBAQAogIyEgL2Jpbi9zaAogIwotIyBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2ZyZWV0eXBlMi5tNCBiL2J1aWxkcy91bml4L2ZyZWV0eXBlMi5tNAppbmRleCBhZjJlNjU5Li4yMDdjMjYzIDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC9mcmVldHlwZTIubTQKKysrIGIvYnVpbGRzL3VuaXgvZnJlZXR5cGUyLm00CkBAIC0xLDcgKzEsNyBAQAogIyBDb25maWd1cmUgcGF0aHMgZm9yIEZyZWVUeXBlMgogIyBNYXJjZWxvIE1hZ2FsbG9uIDIwMDEtMTAtMjYsIGJhc2VkIG9uIGd0ay5tNCBieSBPd2VuIFRheWxvcgogIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE1LDcgKzE1LDcgQEAKICMgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB1bmRlciB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgYXMgdGhlIHJlc3Qgb2YKICMgdGhhdCBwcm9ncmFtLgogIwotIyBzZXJpYWwgNAorIyBzZXJpYWwgNQogCiAjIEFDX0NIRUNLX0ZUMihbTUlOSU1VTS1WRVJTSU9OIFssIEFDVElPTi1JRi1GT1VORCBbLCBBQ1RJT04tSUYtTk9ULUZPVU5EXV1dKQogIyBUZXN0IGZvciBGcmVlVHlwZSAyLCBhbmQgZGVmaW5lIEZUMl9DRkxBR1MgYW5kIEZUMl9MSUJTLgpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgICAgICAgQUNfTEFOR19TT1VSQ0UoW1sKIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9mdC1tdW5tYXAubTQgYi9idWlsZHMvdW5peC9mdC1tdW5tYXAubTQKaW5kZXggMDBlZGE0OS4uYTFhZWEyYiAxMDA2NDQKLS0tIGEvYnVpbGRzL3VuaXgvZnQtbXVubWFwLm00CisrKyBiL2J1aWxkcy91bml4L2Z0LW11bm1hcC5tNApAQCAtMSw2ICsxLDYgQEAKICMjIEZyZWVUeXBlIHNwZWNpZmljIGF1dG9jb25mIHRlc3RzCiAjCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvZnRjb25maWcuaC5pbiBiL2J1aWxkcy91bml4L2Z0Y29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiNWE4MgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy91bml4L2Z0Y29uZmlnLmguaW4KQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNvbmZpZy5oLmluCisgKgorICogICBVTklYLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgdXNlZCBieQorICAgKiB0aGUgcmVzdCBvZiB0aGUgZW5naW5lLiAgTW9zdCBvZiB0aGUgbWFjcm9zIGhlcmUgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICogZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUsIGFuZCB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNoYW5nZSBpdCB0byBwb3J0CisgICAqIEZyZWVUeXBlLCBleGNlcHQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIGEgbm9uLUFOU0kgY29tcGlsZXIuCisgICAqCisgICAqIE5vdGUgaG93ZXZlciB0aGF0IGlmIHNvbWUgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkLCB3ZSBhZHZpc2UKKyAgICogeW91IHRvIHBsYWNlIGEgbW9kaWZpZWQgY29weSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICoKKyAgICogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBidWlsZHMvPHN5c3RlbT5gLCBhbmQgY29udGFpbnMKKyAgICogc3lzdGVtLXNwZWNpZmljIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyBpbmNsdWRlZCBmaXJzdCB3aGVuIGJ1aWxkaW5nIHRoZQorICAgKiBsaWJyYXJ5LgorICAgKgorICAgKi8KKworI2lmbmRlZiBGVENPTkZJR19IXworI2RlZmluZSBGVENPTkZJR19IXworCisjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKKyNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKKworI3VuZGVmIEhBVkVfVU5JU1REX0gKKyN1bmRlZiBIQVZFX0ZDTlRMX0gKKworI3VuZGVmIEZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMKKyNpZmRlZiBGVF9VU0VfQVVUT0NPTkZfU0laRU9GX1RZUEVTCisKKyN1bmRlZiBTSVpFT0ZfSU5UCisjdW5kZWYgU0laRU9GX0xPTkcKKyNkZWZpbmUgRlRfU0laRU9GX0lOVCAgU0laRU9GX0lOVAorI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyBTSVpFT0ZfTE9ORworCisjZW5kaWYgLyogRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFUyAqLworCisjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2ludGVnZXItdHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvcHVibGljLW1hY3Jvcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9tYWMtc3VwcG9ydC5oPgorCisjZW5kaWYgLyogRlRDT05GSUdfSF8gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L2Z0Y29uZmlnLmluIGIvYnVpbGRzL3VuaXgvZnRjb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5YzIxZGEuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3VuaXgvZnRjb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjb25maWcuaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFVOSVgtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCi0gIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseSAqLwotICAvKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvICAgKi8KLSAgLyogcG9ydCBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJICAgICAgICAgICovCi0gIC8qIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlICAgICAgICovCi0gIC8qIGFkdmlzZSB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBidWlsZHMvPHN5c3RlbT4nLCBhbmQgY29udGFpbnMgICAgICAgICovCi0gIC8qIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiBidWlsZGluZyAgICAqLwotICAvKiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRDT05GSUdfSF8KLSNkZWZpbmUgRlRDT05GSUdfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfT1BUSU9OU19ICi0jaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCi0gIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLwotICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KLSAgLyogYGJ1aWxkcy88c3lzdGVtPicgZGlyZWN0b3J5LCBhbmQgZWRpdCBpdCB0byBwb3J0IHRoZSBlbmdpbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgSEFWRV9VTklTVERfSAotI3VuZGVmIEhBVkVfRkNOVExfSAotI3VuZGVmIEhBVkVfU1RESU5UX0gKLQotCi0gIC8qIFRoZXJlIGFyZSBzeXN0ZW1zIChsaWtlIHRoZSBUZXhhcyBJbnN0cnVtZW50cyAnQzU0eCkgd2hlcmUgYSBgY2hhcicgKi8KLSAgLyogaGFzIDE2IGJpdHMuICBBTlNJIEMgc2F5cyB0aGF0IHNpemVvZihjaGFyKSBpcyBhbHdheXMgMS4gIFNpbmNlIGFuICAqLwotICAvKiBgaW50JyBoYXMgMTYgYml0cyBhbHNvIGZvciB0aGlzIHN5c3RlbSwgc2l6ZW9mKGludCkgZ2l2ZXMgMSB3aGljaCAgICovCi0gIC8qIGlzIHByb2JhYmx5IHVuZXhwZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgQ0hBUl9CSVQnIChkZWZpbmVkIGluIGxpbWl0cy5oKSBnaXZlcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSAgICAgICovCi0gIC8qIGBjaGFyJyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBGVF9DSEFSX0JJVAotI2RlZmluZSBGVF9DSEFSX0JJVCAgQ0hBUl9CSVQKLSNlbmRpZgotCi0KLSN1bmRlZiBGVF9VU0VfQVVUT0NPTkZfU0laRU9GX1RZUEVTCi0jaWZkZWYgRlRfVVNFX0FVVE9DT05GX1NJWkVPRl9UWVBFUwotCi0jdW5kZWYgU0laRU9GX0lOVAotI3VuZGVmIFNJWkVPRl9MT05HCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgIFNJWkVPRl9JTlQKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgU0laRU9GX0xPTkcKLQotI2Vsc2UgLyogIUZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMgKi8KLQotICAvKiBGb2xsb3dpbmcgY3BwIGNvbXB1dGF0aW9uIG9mIHRoZSBiaXQgbGVuZ3RoIG9mIGludCBhbmQgbG9uZyAqLwotICAvKiBpcyBjb3BpZWQgZnJvbSBkZWZhdWx0IGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmguICAqLwotICAvKiBJZiBhbnkgaW1wcm92ZW1lbnQgaXMgcmVxdWlyZWQgZm9yIHRoaXMgZmlsZSwgaXQgc2hvdWxkIGJlICAqLwotICAvKiBhcHBsaWVkIHRvIHRoZSBvcmlnaW5hbCBoZWFkZXIgZmlsZSBmb3IgdGhlIGJ1aWxkZXJzIHRoYXQgICAqLwotICAvKiBkbyBub3QgdXNlIGNvbmZpZ3VyZSBzY3JpcHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoZSBzaXplIG9mIGFuIGBpbnQnIHR5cGUuICAqLwotI2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDE2IC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoNjQgLyBGVF9DSEFSX0JJVCkKLSNlbHNlCi0jZXJyb3IgIlVuc3VwcG9ydGVkIHNpemUgb2YgYGludCcgdHlwZSEiCi0jZW5kaWYKLQotICAvKiBUaGUgc2l6ZSBvZiBhIGBsb25nJyB0eXBlLiAgQSBmaXZlLWJ5dGUgYGxvbmcnIChhcyB1c2VkIGUuZy4gb24gdGhlICovCi0gIC8qIERNNjQyKSBpcyByZWNvZ25pemVkIGJ1dCBhdm9pZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBsb25nJyB0eXBlISIKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX1VTRV9BVVRPQ09ORl9TSVpFT0ZfVFlQRVMgKi8KLQotCi0gIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCi0gIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCi0jaWZuZGVmIEZUX1VOVVNFRAotI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCi0gIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLwotICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLwotICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQotICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCi0gIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KLSAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2VuZGlmCi0jaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQotL3VuZGVmIEZUX01BQ0lOVE9TSAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQotICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCi0jaWYgVEFSR0VUX09TX01BQwotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSAgLyogRml4IGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBzZ2kgY29tcGlsZXIgKi8KLSNpZiBkZWZpbmVkKCBfX3NnaSApICYmICFkZWZpbmVkKCBfX0dOVUNfXyApCi0jaWYgZGVmaW5lZCggX0NPTVBJTEVSX1ZFUlNJT04gKSAmJiAoIF9DT01QSUxFUl9WRVJTSU9OID49IDczMCApCi0jcHJhZ21hIHNldCB3b2ZmIDM1MDUKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfSW50MTY7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VJbnQxNjsKLQotICAvKiAqLwotCi0KLSAgLyogdGhpcyAjaWYgMCAuLi4gI2VuZGlmIGNsYXVzZSBpcyBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyAqLwotI2lmIDAKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDMyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OyAgICovCi0gIC8qICAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQ2NDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50NjQ7Ci0KLSAgLyogKi8KLQotI2VuZGlmCi0KLSNpZiBGVF9TSVpFT0ZfSU5UID09IDQKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSA0Ci0KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1VJbnQzMjsKLQotI2Vsc2UKLSNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgotI2VuZGlmCi0KLQotICAvKiBsb29rIHVwIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KLSNpZiBGVF9TSVpFT0ZfSU5UID49IDQKLQotICB0eXBlZGVmIGludCAgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgRlRfVUZhc3Q7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID49IDQKLQotICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7Ci0KLSNlbmRpZgotCi0KLSAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBpbnQgdHlwZSAgKi8KLSAgLyogKG1vc3RseSBmb3IgZW52aXJvbm1lbnRzIHdpdGhvdXQgYGF1dG9jb25mJykgKi8KLSNpZiBGVF9TSVpFT0ZfTE9ORyA9PSA4Ci0KLSAgLyogRlRfTE9ORzY0IG11c3QgYmUgZGVmaW5lZCBpZiBhIDY0LWJpdCB0eXBlIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nCi0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZwotCi0gIC8qIHdlIGhhbmRsZSB0aGUgTExQNjQgc2NoZW1lIHNlcGFyYXRlbHkgZm9yIEdDQyBhbmQgY2xhbmcsICovCi0gIC8qIHN1cHByZXNzaW5nIHRoZSBgbG9uZyBsb25nJyB3YXJuaW5nICAgICAgICAgICAgICAgICAgICAgICovCi0jZWxpZiAoIEZUX1NJWkVPRl9MT05HID09IDQgKSAgICAgICAmJiBcCi0gICAgICBkZWZpbmVkKCBIQVZFX0xPTkdfTE9OR19JTlQgKSAmJiBcCi0gICAgICBkZWZpbmVkKCBfX0dOVUNfXyApCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSA2NC1iaXQgZGF0YSB0eXBlIG1heSBjcmVhdGUgY29tcGlsYXRpb24gcHJvYmxlbXMgaWYgeW91IGNvbXBpbGUgICAgICovCi0gIC8qIGluIHN0cmljdCBBTlNJIG1vZGUuICBUbyBhdm9pZCB0aGVtLCB3ZSBkaXNhYmxlIG90aGVyIDY0LWJpdCBkYXRhICAgICAqLwotICAvKiB0eXBlcyBpZiBfX1NURENfXyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGlnbm9yZSB0aGlzIHJ1bGUgICAgICAgKi8KLSAgLyogYnkgZGVmaW5pbmcgdGhlIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgY29uZmlndXJhdGlvbiBtYWNyby4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VsaWYgIWRlZmluZWQoIF9fU1REQ19fICkgfHwgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCApCi0KLSNpZiBkZWZpbmVkKCBfX1NURENfVkVSU0lPTl9fICkgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKSAmJiBfTVNDX1ZFUiA+PSA5MDAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fQk9STEFORENfXyApICAvKiBCb3JsYW5kIEMrKyAqLwotCi0gIC8qIFhYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgdmFsdWUgb2YgX19CT1JMQU5EQ19fIGluIG9yZGVyICovCi0gIC8qICAgICAgIHRvIHRlc3QgdGhlIGNvbXBpbGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fV0FUQ09NQ19fICkgICAvKiBXYXRjb20gQysrICovCi0KLSAgLyogV2F0Y29tIGRvZXNuJ3QgcHJvdmlkZSA2NC1iaXQgZGF0YSB0eXBlcyAqLwotCi0jZWxpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgICAgLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKLQotICAvKiBHQ0MgcHJvdmlkZXMgdGhlIGBsb25nIGxvbmcnIHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VuZGlmIC8qIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gOCAqLwotCi0jaWZkZWYgRlRfTE9ORzY0Ci0gIHR5cGVkZWYgRlRfSU5UNjQgICBGVF9JbnQ2NDsKLSAgdHlwZWRlZiBGVF9VSU5UNjQgIEZUX1VJbnQ2NDsKLSNlbmRpZgotCi0KLSNpZmRlZiBfV0lONjQKLSAgLyogb25seSA2NGJpdCBXaW5kb3dzIHVzZXMgdGhlIExMUDY0IGRhdGEgbW9kZWwsIGkuZS4sICovCi0gIC8qIDMyYml0IGludGVnZXJzLCA2NGJpdCBwb2ludGVycyAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIF9faW50NjQpKHgpCi0jZWxzZQotI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAodm9pZCopKHVuc2lnbmVkIGxvbmcpKHgpCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogbWlzY2VsbGFuZW91cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX0JFR0lOX1NUTU5UICBkbyB7Ci0jZGVmaW5lIEZUX0VORF9TVE1OVCAgICB9IHdoaWxlICggMCApCi0jZGVmaW5lIEZUX0RVTU1ZX1NUTU5UICBGVF9CRUdJTl9TVE1OVCBGVF9FTkRfU1RNTlQKLQotCi0gIC8qIHR5cGVvZiBjb25kaXRpb24gdGFrZW4gZnJvbSBnbnVsaWIncyBgaW50cHJvcHMuaCcgaGVhZGVyIGZpbGUgKi8KLSNpZiAoICggZGVmaW5lZCggX19HTlVDX18gKSAmJiBfX0dOVUNfXyA+PSAyICkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19JQk1DX18gKSAmJiBfX0lCTUNfXyA+PSAxMjEwICYmICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGVmaW5lZCggX19JQk1fX1RZUEVPRl9fICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgICggZGVmaW5lZCggX19TVU5QUk9fQyApICYmIF9fU1VOUFJPX0MgPj0gMHg1MTEwICYmICFfX1NURENfXyApICkKLSNkZWZpbmUgRlRfVFlQRU9GKCB0eXBlICkgICggX190eXBlb2ZfXyAoIHR5cGUgKSApCi0jZWxzZQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0KLSAgLyogVXNlIEZUX0xPQ0FMIGFuZCBGVF9MT0NBTF9ERUYgdG8gZGVjbGFyZSBhbmQgZGVmaW5lLCByZXNwZWN0aXZlbHksICovCi0gIC8qIGEgZnVuY3Rpb24gdGhhdCBnZXRzIHVzZWQgb25seSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgbW9kdWxlLiAgICAgICAqLwotICAvKiBOb3JtYWxseSwgYm90aCB0aGUgaGVhZGVyIGFuZCBzb3VyY2UgY29kZSBmaWxlcyBmb3Igc3VjaCBhICAgICAgICAgKi8KLSAgLyogZnVuY3Rpb24gYXJlIHdpdGhpbiBhIHNpbmdsZSBtb2R1bGUgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbnRyYS1tb2R1bGUgYXJyYXlzIHNob3VsZCBiZSB0YWdnZWQgd2l0aCBGVF9MT0NBTF9BUlJBWSBhbmQgICAgICAgKi8KLSAgLyogRlRfTE9DQUxfQVJSQVlfREVGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgc3RhdGljICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBzdGF0aWMgIHgKLQotI2Vsc2UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBleHRlcm4gIkMiICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QgKi8KLQotI2RlZmluZSBGVF9MT0NBTF9BUlJBWSggeCApICAgICAgZXh0ZXJuIGNvbnN0ICB4Ci0jZGVmaW5lIEZUX0xPQ0FMX0FSUkFZX0RFRiggeCApICBjb25zdCAgeAotCi0KLSAgLyogVXNlIEZUX0JBU0UgYW5kIEZUX0JBU0VfREVGIHRvIGRlY2xhcmUgYW5kIGRlZmluZSwgcmVzcGVjdGl2ZWx5LCAqLwotICAvKiBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBtb3JlIHRoYW4gYSBzaW5nbGUgbW9kdWxlLiAgSW4gdGhlICAgICovCi0gIC8qIGN1cnJlbnQgc2V0dXAgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIGRlY2xhcmF0aW9uIGlzIGluIGEgaGVhZGVyICAgKi8KLSAgLyogZmlsZSBpbiB0aGUgYGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwnIGRpcmVjdG9yeSwgYW5kIHRoZSAgICAgICAqLwotICAvKiBmdW5jdGlvbiBib2R5IGlzIGluIGEgZmlsZSBpbiBgc3JjL2Jhc2UnLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQkFTRQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfQkFTRSAqLwotCi0KLSNpZm5kZWYgRlRfQkFTRV9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0VfREVGKCB4ICkgIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0VfREVGICovCi0KLQotICAvKiAgIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMIG9yIERTTyB3aXRoIGhpZGRlbiB2aXNpYmlsaXR5ICAgICAgKi8KLSAgLyogICBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSBzcGVjaWFsIGF0dHJpYnV0ZSBpbiBmcm9udCBPUiBhZnRlciAgICovCi0gIC8qICAgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUd28gbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdG8gZGVmaW5lICAgICAgICovCi0gIC8qICAgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IEZUX0VYUE9SVCBhbmQgRlRfRVhQT1JUX0RFRi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVCggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICkgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIEZUX0VYUE9SVCBhbmQgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VYUE9SVF9ERUYgaGVyZSBpZiB5b3Ugd2FudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVG8gZXhwb3J0IGEgdmFyaWFibGUsIHVzZSBGVF9FWFBPUlRfVkFSLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfRVhQT1JUCi0KLSNpZmRlZiBGVDJfQlVJTERfTElCUkFSWQotCi0jaWYgZGVmaW5lZCggX1dJTjMyICkgJiYgKCBkZWZpbmVkKCBfRExMICkgfHwgZGVmaW5lZCggRExMX0VYUE9SVCApICkKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIF9fZGVjbHNwZWMoIGRsbGV4cG9ydCApICB4Ci0jZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIF9fR05VQ19fID49IDQKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIF9fYXR0cmlidXRlX18oKCB2aXNpYmlsaXR5KCAiZGVmYXVsdCIgKSApKSAgeAotI2VsaWYgZGVmaW5lZCggX19jcGx1c3BsdXMgKQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbHNlCi0KLSNpZiBkZWZpbmVkKCBGVDJfRExMSU1QT1JUICkKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIF9fZGVjbHNwZWMoIGRsbGltcG9ydCApICB4Ci0jZWxpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVhQT1JUICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCi0gIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCi0gIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLwotICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbiwgICAgICAgICovCi0gIC8qIGxvY2F0ZWQgaW4gdGhlIHNhbWUgc291cmNlIGNvZGUgZmlsZSBhcyB0aGUgc3RydWN0dXJlIHRoYXQgdXNlcyAqLwotICAvKiBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0JBU0VfQ0FMTEJBQ0sgYW5kIEZUX0JBU0VfQ0FMTEJBQ0tfREVGIGFyZSB1c2VkIHRvIGRlY2xhcmUgICAqLwotICAvKiBhbmQgZGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHJlc3BlY3RpdmVseSwgaW4gYSBzaW1pbGFyIHdheSAgKi8KLSAgLyogYXMgRlRfQkFTRSBhbmQgRlRfQkFTRV9ERUYgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KLSAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KLSAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCi0gIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLwotCi0jaWZuZGVmIEZUX0JBU0VfQ0FMTEJBQ0sKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFX0NBTExCQUNLKCB4ICkgICAgICBleHRlcm4gIkMiICB4Ci0jZGVmaW5lIEZUX0JBU0VfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0VfQ0FMTEJBQ0soIHggKSAgICAgIGV4dGVybiAgeAotI2RlZmluZSBGVF9CQVNFX0NBTExCQUNLX0RFRiggeCApICB4Ci0jZW5kaWYKLSNlbmRpZiAvKiBGVF9CQVNFX0NBTExCQUNLICovCi0KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfVEFCTEUKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybiAiQyIKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICBleHRlcm4gIkMiCi0jZWxzZQotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRSAgICAgIGV4dGVybgotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX1RBQkxFICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBGVENPTkZJR19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYyBiL2J1aWxkcy91bml4L2Z0c3lzdGVtLmMKaW5kZXggOGZkYmViMC4uYjRkNzFkNCAxMDA2NDQKLS0tIGEvYnVpbGRzL3VuaXgvZnRzeXN0ZW0uYworKysgYi9idWlsZHMvdW5peC9mdHN5c3RlbS5jCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFVuaXgtc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xOCwxMiArMTgsMTIgQEAKIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAgIC8qIHdlIHVzZSBvdXIgc3BlY2lhbCBmdGNvbmZpZy5oIGZpbGUsIG5vdCB0aGUgc3RhbmRhcmQgb25lICovCi0jaW5jbHVkZSA8ZnRjb25maWcuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKKyNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdHN5c3RlbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnR0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKICAgLyogbWVtb3J5LW1hcHBpbmcgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zICovCiAjaWZkZWYgSEFWRV9VTklTVERfSApAQCAtMTczLDcgKzE3Myw3IEBACiAgIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfaW8KKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBpbwogCiAgIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZJTEUgZm9yIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICovCiAgIC8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCkBAIC0zNTEsNyArMzUxLDcgQEAKICAgICBzdHJlYW0tPnJlYWQgPSAwOwogCiAgICAgRlRfVFJBQ0UxKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgRlRfVFJBQ0UxKCggIiBvcGVuZWQgYCVzJyAoJWQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKKyAgICBGVF9UUkFDRTEoKCAiIG9wZW5lZCBgJXMnICglbGQgYnl0ZXMpIHN1Y2Nlc3NmdWxseVxuIiwKICAgICAgICAgICAgICAgICBmaWxlcGF0aG5hbWUsIHN0cmVhbS0+c2l6ZSApKTsKIAogICAgIHJldHVybiBGVF9FcnJfT2s7CmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC9pbnN0YWxsLm1rIGIvYnVpbGRzL3VuaXgvaW5zdGFsbC5tawppbmRleCBjMDhjM2I3Li5hYTI1MTg3IDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC9pbnN0YWxsLm1rCisrKyBiL2J1aWxkcy91bml4L2luc3RhbGwubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy91bml4L3VuaXgtY2MuaW4gYi9idWlsZHMvdW5peC91bml4LWNjLmluCmluZGV4IDU2NzU4NjYuLjMwZDA5N2IgMTAwNjQ0Ci0tLSBhL2J1aWxkcy91bml4L3VuaXgtY2MuaW4KKysrIGIvYnVpbGRzL3VuaXgvdW5peC1jYy5pbgpAQCAtMiw3ICsyLDcgQEAKICMgRnJlZVR5cGUgMiB0ZW1wbGF0ZSBmb3IgVW5peC1zcGVjaWZpYyBjb21waWxlciBkZWZpbml0aW9ucwogIwogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtNzYsMTAgKzc2LDEzIEBACiAjICAgVXNlIHRoZSBBTlNJRkxBR1MgdmFyaWFibGUgdG8gZGVmaW5lIHRoZSBjb21waWxlciBmbGFncyB1c2VkIHRvIGVuZm9yZQogIyAgIEFOU0kgY29tcGxpYW5jZS4KICMKLSMgICBXZSB1c2Ugb3VyIG93biBGcmVlVHlwZSBjb25maWd1cmF0aW9uIGZpbGUuCisjICAgV2UgdXNlIG91ciBvd24gRnJlZVR5cGUgY29uZmlndXJhdGlvbiBmaWxlcyBvdmVycmlkaW5nIGRlZmF1bHRzLgogIwogQ1BQRkxBR1MgOj0gQENQUEZMQUdTQAotQ0ZMQUdTICAgOj0gLWMgQFhYX0NGTEFHU0AgQENGTEFHU0AgLURGVF9DT05GSUdfQ09ORklHX0g9IjxmdGNvbmZpZy5oPiIKK0NGTEFHUyAgIDo9IC1jIEBYWF9DRkxBR1NAIEBDRkxBR1NAIFwKKyAgICAgICAgICAgICRERlRfQ09ORklHX0NPTkZJR19IPSI8ZnRjb25maWcuaD4iIFwKKyAgICAgICAgICAgICRERlRfQ09ORklHX01PRFVMRVNfSD0iPGZ0bW9kdWxlLmg+IiBcCisgICAgICAgICAgICAkREZUX0NPTkZJR19PUFRJT05TX0g9IjxmdG9wdGlvbi5oPiIKIAogIyBBTlNJRkxBR1M6IFB1dCB0aGVyZSB0aGUgZmxhZ3MgdXNlZCB0byBtYWtlIHlvdXIgY29tcGlsZXIgQU5TSS1jb21wbGlhbnQuCiAjCkBAIC04Nyw4ICs5MCwxMiBAQAogCiAjIEMgY29tcGlsZXIgdG8gdXNlIC0tIHdlIHVzZSBsaWJ0b29sIQogIwotQ0NyYXcgOj0gJChDQykKLUNDICAgIDo9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQ3JhdykKKyMgQ0MgbWlnaHQgYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmU7IHdlIHN0b3JlIHRoaXMgdmFsdWUgaW4gYENDcmF3Jy4KKyMgQ29uc2VxdWVudGx5LCB3ZSB1c2UgdGhlIGBvdmVycmlkZScgZGlyZWN0aXZlIHRvIGVuc3VyZSB0aGF0IHRoZQorIyBsaWJ0b29sIGNhbGwgaXMgYWx3YXlzIHByZXBlbmRlZC4KKyMKK0NDcmF3ICAgICAgIDo9ICQoQ0MpCitvdmVycmlkZSBDQyA6PSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0NyYXcpCiAKICMgUmVzb3VyY2UgY29tcGlsZXIgdG8gdXNlIG9uIEN5Z3dpbi9NaW5HVywgdXN1YWxseSB3aW5kcmVzLgogIwpkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC1kZWYuaW4gYi9idWlsZHMvdW5peC91bml4LWRlZi5pbgppbmRleCA2OTU3MDUzLi41ZTA0ZjFjIDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC91bml4LWRlZi5pbgorKysgYi9idWlsZHMvdW5peC91bml4LWRlZi5pbgpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMjEsNiArMjEsMTEgQEAKIENBVCAgICA6PSBjYXQKIFNFUCAgICA6PSAvCiAKKyMgVGhpcyBpcyB1c2VkIGZvciBgbWFrZSByZWZkb2MnIGFuZCBgbWFrZSByZWZkb2MtdmVudicKKyMKK1BZVEhPTiA6PSBAUFlUSE9OQAorQklOICAgIDo9IGJpbgorCiAjIHRoaXMgaXMgdXNlZCBmb3IgYG1ha2UgZGlzdGNsZWFuJyBhbmQgYG1ha2UgaW5zdGFsbCcKIE9CSl9CVUlMRCA/PSAkKEJVSUxEX0RJUikKIApkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC1kZXYubWsgYi9idWlsZHMvdW5peC91bml4LWRldi5tawppbmRleCA1YTUxNmFkLi4xMzUyNTc1IDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC91bml4LWRldi5taworKysgYi9idWlsZHMvdW5peC91bml4LWRldi5tawpAQCAtNiw3ICs2LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC1sY2MubWsgYi9idWlsZHMvdW5peC91bml4LWxjYy5tawppbmRleCA3M2EwMmQ0Li5hNjU3OWRiIDEwMDY0NAotLS0gYS9idWlsZHMvdW5peC91bml4LWxjYy5taworKysgYi9idWlsZHMvdW5peC91bml4LWxjYy5tawpAQCAtNiw3ICs2LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3VuaXgvdW5peC5tayBiL2J1aWxkcy91bml4L3VuaXgubWsKaW5kZXggYWNkNTRkMy4uZTA4NzI3ZCAxMDA2NDQKLS0tIGEvYnVpbGRzL3VuaXgvdW5peC5taworKysgYi9idWlsZHMvdW5peC91bml4Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvdW5peC91bml4ZGRlZi5tayBiL2J1aWxkcy91bml4L3VuaXhkZGVmLm1rCmluZGV4IGE4ZGE2M2EuLmI4ZTMyMTcgMTAwNjQ0Ci0tLSBhL2J1aWxkcy91bml4L3VuaXhkZGVmLm1rCisrKyBiL2J1aWxkcy91bml4L3VuaXhkZGVmLm1rCkBAIC00LDcgKzQsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0yMyw2ICsyMywxMCBAQAogQ0FUICAgIDo9IGNhdAogU0VQICAgIDo9IC8KIAorIyBUaGlzIGlzIHVzZWQgZm9yIGBtYWtlIHJlZmRvYycgYW5kIGBtYWtlIHJlZmRvYy12ZW52JworIworQklOIDo9IGJpbgorCiAjIHdlIHVzZSBhIHNwZWNpYWwgZGV2ZWwgZnRvcHRpb24uaAogREVWRUxfRElSIDo9ICQoVE9QX0RJUikvZGV2ZWwKIApkaWZmIC0tZ2l0IGEvYnVpbGRzL3Ztcy9MSUJTLk9QVF9JQTY0IGIvYnVpbGRzL3Ztcy9MSUJTLk9QVF9JQTY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NjhjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9idWlsZHMvdm1zL0xJQlMuT1BUX0lBNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3Ztcy9fTElOSy5PUFRfSUE2NCBiL2J1aWxkcy92bXMvX0xJTksuT1BUX0lBNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjYmQxYgotLS0gL2Rldi9udWxsCisrKyBiL2J1aWxkcy92bXMvX0xJTksuT1BUX0lBNjQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3Ztcy9mdGNvbmZpZy5oIGIvYnVpbGRzL3Ztcy9mdGNvbmZpZy5oCmluZGV4IDAyMWUyYzYuLjA3ZTVmODMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy92bXMvZnRjb25maWcuaAorKysgYi9idWlsZHMvdm1zL2Z0Y29uZmlnLmgKQEAgLTEsMzggKzEsMzYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBWTVMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y29uZmlnLmgKKyAqCisgKiAgIFZNUy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkICovCi0gIC8qIGJ5IHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseSAqLwotICAvKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvICAgKi8KLSAgLyogcG9ydCBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJICAgICAgICAgICovCi0gIC8qIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlICAgICAgICovCi0gIC8qIGFkdmlzZSB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyB1c3VhbGx5IGBidWlsZHMvPHN5c3RlbT4nLCBhbmQgY29udGFpbnMgICAgICAgICovCi0gIC8qIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiBidWlsZGluZyAgICAqLwotICAvKiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgYnkKKyAgICogdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIE1vc3Qgb2YgdGhlIG1hY3JvcyBoZXJlIGFyZSBhdXRvbWF0aWNhbGx5CisgICAqIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UgaXQgdG8gcG9ydAorICAgKiBGcmVlVHlwZSwgZXhjZXB0IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhIG5vbi1BTlNJIGNvbXBpbGVyLgorICAgKgorICAgKiBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBzb21lIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZCwgd2UgYWR2aXNlCisgICAqIHlvdSB0byBwbGFjZSBhIG1vZGlmaWVkIGNvcHkgaW4geW91ciBidWlsZCBkaXJlY3RvcnkuCisgICAqCisgICAqIFRoZSBidWlsZCBkaXJlY3RvcnkgaXMgdXN1YWxseSBgYnVpbGRzLzxzeXN0ZW0+YCwgYW5kIGNvbnRhaW5zCisgICAqIHN5c3RlbS1zcGVjaWZpYyBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW5jbHVkZWQgZmlyc3Qgd2hlbiBidWlsZGluZyB0aGUKKyAgICogbGlicmFyeS4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgRlRDT05GSUdfSF8KICNkZWZpbmUgRlRDT05GSUdfSF8KQEAgLTQxLDIyICszOSw2IEBACiAjaW5jbHVkZSBGVF9DT05GSUdfT1BUSU9OU19ICiAjaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICiAKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCi0gIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLwotICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KLSAgLyogYGJ1aWxkcy88c3lzdGVtPicgZGlyZWN0b3J5LCBhbmQgZWRpdCBpdCB0byBwb3J0IHRoZSBlbmdpbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCiAjZGVmaW5lIEhBVkVfVU5JU1REX0ggIDEKICNkZWZpbmUgSEFWRV9GQ05UTF9IICAgMQogCkBAIC02Niw0ODcgKzQ4LDkgQEAKICNkZWZpbmUgRlRfU0laRU9GX0lOVCAgIDQKICNkZWZpbmUgRlRfU0laRU9GX0xPTkcgIDQKIAotI2RlZmluZSBGVF9DSEFSX0JJVCAgOAotCi0KLSAgLyogRlRfVU5VU0VEIGlzIGEgbWFjcm8gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gcGFyYW1ldGVyIGlzIG5vdCAgKi8KLSAgLyogdXNlZCAtLSB0aGlzIGlzIG9ubHkgdXNlZCB0byBnZXQgcmlkIG9mIHVucGxlYXNhbnQgY29tcGlsZXIgd2FybmluZ3MgKi8KLSNpZm5kZWYgRlRfVU5VU0VECi0jZGVmaW5lIEZUX1VOVVNFRCggYXJnICkgICggKGFyZykgPSAoYXJnKSApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBBVVRPTUFUSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBtYWNyb3MgYXJlIGNvbXB1dGVkIGZyb20gdGhlIG9uZXMgZGVmaW5lZCBhYm92ZS4gIERvbid0IHRvdWNoICAgKi8KLSAgLyogdGhlaXIgZGVmaW5pdGlvbiwgdW5sZXNzIHlvdSBrbm93IHByZWNpc2VseSB3aGF0IHlvdSBhcmUgZG9pbmcuICBObyAgICovCi0gIC8qIHBvcnRlciBzaG91bGQgbmVlZCB0byBtZXNzIHdpdGggdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1hYyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIGlzIHRoZSBvbmx5IG5lY2Vzc2FyeSBjaGFuZ2UsIHNvIGl0IGlzIGRlZmluZWQgaGVyZSBpbnN0ZWFkICAgICovCi0gIC8qICAgcHJvdmlkaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBfX0FQUExFX18gKSB8fCAoIGRlZmluZWQoIF9fTVdFUktTX18gKSAmJiBkZWZpbmVkKCBtYWNpbnRvc2ggKSApCi0gIC8qIG5vIENhcmJvbiBmcmFtZXdvcmtzIGZvciA2NGJpdCAxMC40LnggKi8KLSAgLyogQXZhaWxhYmlsaXR5TWFjcm9zLmggaXMgYXZhaWxhYmxlIHNpbmNlIE1hYyBPUyBYIDEwLjIsICAgICAgICAqLwotICAvKiBzbyBndWVzcyB0aGUgc3lzdGVtIHZlcnNpb24gYnkgbWF4aW11bSBlcnJubyBiZWZvcmUgaW5jbHVzaW9uICovCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZmRlZiBFQ0FOQ0VMRUQgLyogZGVmaW5lZCBzaW5jZSAxMC4yICovCi0jaW5jbHVkZSAiQXZhaWxhYmlsaXR5TWFjcm9zLmgiCi0jZW5kaWYKLSNpZiBkZWZpbmVkKCBfX0xQNjRfXyApICYmIFwKLSAgICAoIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEIDw9IE1BQ19PU19YX1ZFUlNJT05fMTBfNCApCi0jdW5kZWYgRlRfTUFDSU5UT1NICi0jZW5kaWYKLQotI2VsaWYgZGVmaW5lZCggX19TQ19fICkgfHwgZGVmaW5lZCggX19NUkNfXyApCi0gIC8qIENsYXNzaWMgTWFjT1MgY29tcGlsZXJzICovCi0jaW5jbHVkZSAiQ29uZGl0aW9uYWxNYWNyb3MuaCIKLSNpZiBUQVJHRVRfT1NfTUFDCi0jZGVmaW5lIEZUX01BQ0lOVE9TSCAxCi0jZW5kaWYKLQotI2VuZGlmCi0KLQotICAvKiBGaXggY29tcGlsZXIgd2FybmluZyB3aXRoIHNnaSBjb21waWxlciAqLwotI2lmIGRlZmluZWQoIF9fc2dpICkgJiYgIWRlZmluZWQoIF9fR05VQ19fICkKLSNpZiBkZWZpbmVkKCBfQ09NUElMRVJfVkVSU0lPTiApICYmICggX0NPTVBJTEVSX1ZFUlNJT04gPj0gNzMwICkKLSNwcmFnbWEgc2V0IHdvZmYgMzUwNQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9JbnQxNjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgRlRfVUludDE2OwotCi0gIC8qICovCi0KLQotICAvKiB0aGlzICNpZiAwIC4uLiAjZW5kaWYgY2xhdXNlIGlzIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzICovCi0jaWYgMAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAzMmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50MzI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAzMmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50MzI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KLSAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDY0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlLiAgVGhlIHNpemUgZGVwZW5kcyBvbiAgKi8KLSAgLyogICAgdGhlIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OyAgICovCi0gIC8qICAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQ2NDsKLQotICAvKiAqLwotCi0jZW5kaWYKLQotI2lmIEZUX1NJWkVPRl9JTlQgPT0gNAotCi0gIHR5cGVkZWYgc2lnbmVkIGludCAgICAgIEZUX0ludDMyOwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBGVF9VSW50MzI7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID09IDQKLQotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRlRfVUludDMyOwotCi0jZWxzZQotI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0tIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCi0jZW5kaWYKLQotCi0gIC8qIGxvb2sgdXAgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMgYXQgbGVhc3QgMzIgYml0cyAqLwotI2lmIEZUX1NJWkVPRl9JTlQgPj0gNAotCi0gIHR5cGVkZWYgaW50ICAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VRmFzdDsKLQotI2VsaWYgRlRfU0laRU9GX0xPTkcgPj0gNAotCi0gIHR5cGVkZWYgbG9uZyAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VRmFzdDsKLQotI2VuZGlmCi0KLQotICAvKiBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGEgNjQtYml0IGludCB0eXBlICAqLwotICAvKiAobW9zdGx5IGZvciBlbnZpcm9ubWVudHMgd2l0aG91dCBgYXV0b2NvbmYnKSAqLwotI2lmIEZUX1NJWkVPRl9MT05HID09IDgKLQotICAvKiBGVF9MT05HNjQgbXVzdCBiZSBkZWZpbmVkIGlmIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nCi0KLSAgLyogd2UgaGFuZGxlIHRoZSBMTFA2NCBzY2hlbWUgc2VwYXJhdGVseSBmb3IgR0NDIGFuZCBjbGFuZywgKi8KLSAgLyogc3VwcHJlc3NpbmcgdGhlIGBsb25nIGxvbmcnIHdhcm5pbmcgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbGlmICggRlRfU0laRU9GX0xPTkcgPT0gNCApICAgICAgICYmIFwKLSAgICAgIGRlZmluZWQoIEhBVkVfTE9OR19MT05HX0lOVCApICYmIFwKLSAgICAgIGRlZmluZWQoIF9fR05VQ19fICkKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdsb25nLWxvbmciCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIDY0LWJpdCBkYXRhIHR5cGUgbWF5IGNyZWF0ZSBjb21waWxhdGlvbiBwcm9ibGVtcyBpZiB5b3UgY29tcGlsZSAgICAgKi8KLSAgLyogaW4gc3RyaWN0IEFOU0kgbW9kZS4gIFRvIGF2b2lkIHRoZW0sIHdlIGRpc2FibGUgb3RoZXIgNjQtYml0IGRhdGEgICAgICovCi0gIC8qIHR5cGVzIGlmIF9fU1REQ19fIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgaWdub3JlIHRoaXMgcnVsZSAgICAgICAqLwotICAvKiBieSBkZWZpbmluZyB0aGUgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBjb25maWd1cmF0aW9uIG1hY3JvLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZWxpZiAhZGVmaW5lZCggX19TVERDX18gKSB8fCBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0ICkKLQotI2lmIGRlZmluZWQoIF9fU1REQ19WRVJTSU9OX18gKSAmJiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLQotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0jZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICYmIF9NU0NfVkVSID49IDkwMCAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLQotICAvKiB0aGlzIGNvbXBpbGVyIHByb3ZpZGVzIHRoZSBfX2ludDY0IHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgX19pbnQ2NAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIF9faW50NjQKLQotI2VsaWYgZGVmaW5lZCggX19CT1JMQU5EQ19fICkgIC8qIEJvcmxhbmQgQysrICovCi0KLSAgLyogWFhYWDogV2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoZSB2YWx1ZSBvZiBfX0JPUkxBTkRDX18gaW4gb3JkZXIgKi8KLSAgLyogICAgICAgdG8gdGVzdCB0aGUgY29tcGlsZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiB0aGlzIGNvbXBpbGVyIHByb3ZpZGVzIHRoZSBfX2ludDY0IHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgX19pbnQ2NAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIF9faW50NjQKLQotI2VsaWYgZGVmaW5lZCggX19XQVRDT01DX18gKSAgIC8qIFdhdGNvbSBDKysgKi8KLQotICAvKiBXYXRjb20gZG9lc24ndCBwcm92aWRlIDY0LWJpdCBkYXRhIHR5cGVzICovCi0KLSNlbGlmIGRlZmluZWQoIF9fTVdFUktTX18gKSAgICAvKiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yICovCi0KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQotCi0gIC8qIEdDQyBwcm92aWRlcyB0aGUgYGxvbmcgbG9uZycgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0jZW5kaWYgLyogX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMICovCi0KLSNlbmRpZiAvKiBGVF9TSVpFT0ZfTE9ORyA9PSA4ICovCi0KLSNpZmRlZiBGVF9MT05HNjQKLSAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OwotICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OwotI2VuZGlmCi0KLQotI2lmZGVmIF9XSU42NAotICAvKiBvbmx5IDY0Yml0IFdpbmRvd3MgdXNlcyB0aGUgTExQNjQgZGF0YSBtb2RlbCwgaS5lLiwgKi8KLSAgLyogMzJiaXQgaW50ZWdlcnMsIDY0Yml0IHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgX19pbnQ2NCkoeCkKLSNlbHNlCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgbG9uZykoeCkKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKLSNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKLSNkZWZpbmUgRlRfRFVNTVlfU1RNTlQgIEZUX0JFR0lOX1NUTU5UIEZUX0VORF9TVE1OVAotCi0KLSAgLyogdHlwZW9mIGNvbmRpdGlvbiB0YWtlbiBmcm9tIGdudWxpYidzIGBpbnRwcm9wcy5oJyBoZWFkZXIgZmlsZSAqLwotI2lmICggKCBkZWZpbmVkKCBfX0dOVUNfXyApICYmIF9fR05VQ19fID49IDIgKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX0lCTUNfXyApICYmIF9fSUJNQ19fID49IDEyMTAgJiYgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkZWZpbmVkKCBfX0lCTV9fVFlQRU9GX18gKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX1NVTlBST19DICkgJiYgX19TVU5QUk9fQyA+PSAweDUxMTAgJiYgIV9fU1REQ19fICkgKQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgKCBfX3R5cGVvZl9fICggdHlwZSApICkKLSNlbHNlCi0jZGVmaW5lIEZUX1RZUEVPRiggdHlwZSApICAvKiBlbXB0eSAqLwotI2VuZGlmCi0KLQotICAvKiBVc2UgRlRfTE9DQUwgYW5kIEZUX0xPQ0FMX0RFRiB0byBkZWNsYXJlIGFuZCBkZWZpbmUsIHJlc3BlY3RpdmVseSwgKi8KLSAgLyogYSBmdW5jdGlvbiB0aGF0IGdldHMgdXNlZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBtb2R1bGUuICAgICAgICovCi0gIC8qIE5vcm1hbGx5LCBib3RoIHRoZSBoZWFkZXIgYW5kIHNvdXJjZSBjb2RlIGZpbGVzIGZvciBzdWNoIGEgICAgICAgICAqLwotICAvKiBmdW5jdGlvbiBhcmUgd2l0aGluIGEgc2luZ2xlIG1vZHVsZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEludHJhLW1vZHVsZSBhcnJheXMgc2hvdWxkIGJlIHRhZ2dlZCB3aXRoIEZUX0xPQ0FMX0FSUkFZIGFuZCAgICAgICAqLwotICAvKiBGVF9MT0NBTF9BUlJBWV9ERUYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBzdGF0aWMgIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIHN0YXRpYyAgeAotCi0jZWxzZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAiQyIgIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBleHRlcm4gIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVCAqLwotCi0jZGVmaW5lIEZUX0xPQ0FMX0FSUkFZKCB4ICkgICAgICBleHRlcm4gY29uc3QgIHgKLSNkZWZpbmUgRlRfTE9DQUxfQVJSQVlfREVGKCB4ICkgIGNvbnN0ICB4Ci0KLQotICAvKiBVc2UgRlRfQkFTRSBhbmQgRlRfQkFTRV9ERUYgdG8gZGVjbGFyZSBhbmQgZGVmaW5lLCByZXNwZWN0aXZlbHksICovCi0gIC8qIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIG1vcmUgdGhhbiBhIHNpbmdsZSBtb2R1bGUuICBJbiB0aGUgICAgKi8KLSAgLyogY3VycmVudCBzZXR1cCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgZGVjbGFyYXRpb24gaXMgaW4gYSBoZWFkZXIgICAqLwotICAvKiBmaWxlIGluIHRoZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbCcgZGlyZWN0b3J5LCBhbmQgdGhlICAgICAgICovCi0gIC8qIGZ1bmN0aW9uIGJvZHkgaXMgaW4gYSBmaWxlIGluIGBzcmMvYmFzZScuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9CQVNFCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFICovCi0KLQotI2lmbmRlZiBGVF9CQVNFX0RFRgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfQkFTRV9ERUYgKi8KLQotCi0gIC8qICAgV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwgb3IgRFNPIHdpdGggaGlkZGVuIHZpc2liaWxpdHkgICAgICAqLwotICAvKiAgIHNvbWUgc3lzdGVtcy9jb21waWxlcnMgbmVlZCBhIHNwZWNpYWwgYXR0cmlidXRlIGluIGZyb250IE9SIGFmdGVyICAgKi8KLSAgLyogICB0aGUgcmV0dXJuIHR5cGUgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFR3byBtYWNyb3MgYXJlIHVzZWQgd2l0aGluIHRoZSBGcmVlVHlwZSBzb3VyY2UgY29kZSB0byBkZWZpbmUgICAgICAgKi8KLSAgLyogICBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9uczogRlRfRVhQT1JUIGFuZCBGVF9FWFBPUlRfREVGLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUKCByZXR1cm5fdHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlQoIEZUX0Vycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9FWFBPUlRfREVGKCByZXR1cm5fdHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBZb3UgY2FuIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgRlRfRVhQT1JUIGFuZCAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVhQT1JUX0RFRiBoZXJlIGlmIHlvdSB3YW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUbyBleHBvcnQgYSB2YXJpYWJsZSwgdXNlIEZUX0VYUE9SVF9WQVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FWFBPUlQKLQotI2lmZGVmIEZUMl9CVUlMRF9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkKCBfV0lOMzIgKSAmJiAoIGRlZmluZWQoIF9ETEwgKSB8fCBkZWZpbmVkKCBETExfRVhQT1JUICkgKQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19kZWNsc3BlYyggZGxsZXhwb3J0ICkgIHgKLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkgJiYgX19HTlVDX18gPj0gNAotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19hdHRyaWJ1dGVfXygoIHZpc2liaWxpdHkoICJkZWZhdWx0IiApICkpICB4Ci0jZWxpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2Vsc2UKLQotI2lmIGRlZmluZWQoIEZUMl9ETExJTVBPUlQgKQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19kZWNsc3BlYyggZGxsaW1wb3J0ICkgIHgKLSNlbGlmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlQgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX0RFRiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9ERUYgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9WQVIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX1ZBUiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9WQVIgKi8KLQotICAvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgbmVlZGVkIHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgd2l0aCBhICAgKi8KLSAgLyogQysrIGNvbXBpbGVyIGFuZCB3aXRoIDE2Yml0IGNvbXBpbGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoaXMgaXMgc3BlY2lhbC4gIFdpdGhpbiBDKyssIHlvdSBtdXN0IHNwZWNpZnkgYGV4dGVybiAiQyInIGZvciAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWQgdmlhIGZ1bmN0aW9uIHBvaW50ZXJzLCBhbmQgeW91IGFsc28gICAgKi8KLSAgLyogbXVzdCBkbyB0aGF0IGZvciBzdHJ1Y3R1cmVzIHdoaWNoIGNvbnRhaW4gZnVuY3Rpb24gcG9pbnRlcnMgdG8gICovCi0gIC8qIGFzc3VyZSBDIGxpbmthZ2UgLS0gaXQncyBub3QgcG9zc2libGUgdG8gaGF2ZSAobG9jYWwpIGFub255bW91cyAqLwotICAvKiBmdW5jdGlvbnMgd2hpY2ggYXJlIGFjY2Vzc2VkIGJ5IChnbG9iYWwpIGZ1bmN0aW9uIHBvaW50ZXJzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNhbGxiYWNrIGZ1bmN0aW9uLCAgICAgICAgKi8KLSAgLyogbG9jYXRlZCBpbiB0aGUgc2FtZSBzb3VyY2UgY29kZSBmaWxlIGFzIHRoZSBzdHJ1Y3R1cmUgdGhhdCB1c2VzICovCi0gIC8qIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQkFTRV9DQUxMQkFDSyBhbmQgRlRfQkFTRV9DQUxMQkFDS19ERUYgYXJlIHVzZWQgdG8gZGVjbGFyZSAgICovCi0gIC8qIGFuZCBkZWZpbmUgYSBjYWxsYmFjayBmdW5jdGlvbiwgcmVzcGVjdGl2ZWx5LCBpbiBhIHNpbWlsYXIgd2F5ICAqLwotICAvKiBhcyBGVF9CQVNFIGFuZCBGVF9CQVNFX0RFRiB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFIGlzIHVzZWQgdG8gX2RlY2xhcmVfIGEgY29uc3RhbnQgdmFyaWFibGUgdGhhdCAqLwotICAvKiBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBpcyB1c2VkIHRvIF9kZWZpbmVfIGEgY29uc3RhbnQgdmFyaWFibGUgICAqLwotICAvKiB0aGF0IGNvbnRhaW5zIHBvaW50ZXJzIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIDE2Yml0IGNvbXBpbGVycyBoYXZlIHRvIHJlZGVmaW5lIHRoZXNlIG1hY3JvcyB0byBpbnNlcnQgICAgKi8KLSAgLyogdGhlIGluZmFtb3VzIGBfY2RlY2wnIG9yIGBfX2Zhc3RjYWxsJyBkZWNsYXJhdGlvbnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DQUxMQkFDS19ERUYKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9DQUxMQkFDS19ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIHN0YXRpYyAgeAotI2VuZGlmCi0jZW5kaWYgLyogRlRfQ0FMTEJBQ0tfREVGICovCi0KLSNpZm5kZWYgRlRfQkFTRV9DQUxMQkFDSwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0VfQ0FMTEJBQ0soIHggKSAgICAgIGV4dGVybiAiQyIgIHgKLSNkZWZpbmUgRlRfQkFTRV9DQUxMQkFDS19ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRV9DQUxMQkFDSyggeCApICAgICAgZXh0ZXJuICB4Ci0jZGVmaW5lIEZUX0JBU0VfQ0FMTEJBQ0tfREVGKCB4ICkgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0JBU0VfQ0FMTEJBQ0sgKi8KLQotI2lmbmRlZiBGVF9DQUxMQkFDS19UQUJMRQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFICAgICAgZXh0ZXJuICJDIgotI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYgIGV4dGVybiAiQyIKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFICAgICAgZXh0ZXJuCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0jZW5kaWYgLyogRlRfQ0FMTEJBQ0tfVEFCTEUgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KKyNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvaW50ZWdlci10eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9wdWJsaWMtbWFjcm9zLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL21hYy1zdXBwb3J0Lmg+CiAKICNlbmRpZiAvKiBGVENPTkZJR19IXyAqLwogCmRpZmYgLS1naXQgYS9idWlsZHMvdm1zL2Z0c3lzdGVtLmMgYi9idWlsZHMvdm1zL2Z0c3lzdGVtLmMKaW5kZXggN2Q3OWY5YS4uMTc3NDgxYSAxMDA2NDQKLS0tIGEvYnVpbGRzL3Ztcy9mdHN5c3RlbS5jCisrKyBiL2J1aWxkcy92bXMvZnRzeXN0ZW0uYwpAQCAtNCw3ICs0LDcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBWTVMtc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwpAQCAtMTksMTEgKzE5LDExIEBACiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICAgLyogd2UgdXNlIG91ciBzcGVjaWFsIGZ0Y29uZmlnLmggZmlsZSwgbm90IHRoZSBzdGFuZGFyZCBvbmUgKi8KICNpbmNsdWRlIDxmdGNvbmZpZy5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogICAvKiBtZW1vcnktbWFwcGluZyBpbmNsdWRlcyBhbmQgZGVmaW5pdGlvbnMgKi8KICNpZmRlZiBIQVZFX1VOSVNURF9ICkBAIC0xNzIsNyArMTcyLDcgQEAKICAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbworI2RlZmluZSBGVF9DT01QT05FTlQgIGlvCiAKICAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KICAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KZGlmZiAtLWdpdCBhL2J1aWxkcy92bXMvdm1zbGliLmRhdCBiL2J1aWxkcy92bXMvdm1zbGliLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzgxN2RhCi0tLSAvZGV2L251bGwKKysrIGIvYnVpbGRzL3Ztcy92bXNsaWIuZGF0CkBAIC0wLDAgKzEsMjggQEAKKyEKKyEgVGhpcyBpcyBhIHNpbXBsZSBkcml2ZXIgZmlsZSB3aXRoIGluZm9ybWF0aW9uIHVzZWQgYnkgbWFrZS5jb20gdG8KKyEgY2hlY2sgaWYgZXh0ZXJuYWwgbGlicmFyaWVzIChsaWtlIHQxbGliIGFuZCBmcmVldHlwZSkgYXJlIGF2YWlsYWJsZSBvbgorISB0aGUgc3lzdGVtLgorIQorISBMYXlvdXQgb2YgdGhlIGZpbGU6CishCishICAgIC0gTGluZXMgc3RhcnRpbmcgd2l0aCAhIGFyZSB0cmVhdGVkIGFzIGNvbW1lbnRzCishICAgIC0gRWxlbWVudHMgaW4gYSBkYXRhIGxpbmUgYXJlIHNlcGFyYXRlZCBieSAjIHNpZ25zCishICAgIC0gVGhlIGVsZW1lbnRzIG5lZWQgdG8gYmUgbGlzdGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIKKyEgICAgICAxLikgTmFtZSBvZiB0aGUgTGlicmFyeSAKKyEgICAgICAyLikgTG9jYXRpb24gd2hlcmUgdGhlIG9iamVjdCBsaWJyYXJ5IGNhbiBiZSBmb3VuZAorISAgICAgIDMuKSBMb2NhdGlvbiB3aGVyZSB0aGUgaW5jbHVkZSBmaWxlcyBmb3IgdGhlIGxpYnJhcnkgY2FuIGJlIGZvdW5kCishICAgICAgNC4pIEluY2x1ZGUgZmlsZSB1c2VkIHRvIHZlcmlmeSBsaWJyYXJ5IGxvY2F0aW9uCishICAgICAgNS4pIENQUCBkZWZpbmUgdG8gcGFzcyB0byB0aGUgYnVpbGQgdG8gaW5kaWNhdGUgYXZhaWxhYmlsaXR5IG9mCishICAgICAgICAgIHRoZSBsaWJyYXJ5CishCishIEV4YW1wbGU6IFRoZSBmb2xsb3dpbmcgIGxpbmVzIHNob3cgaG93IGRlZmluaXRpb25zCishICAgICAgICAgIG1pZ2h0IGxvb2sgbGlrZS4gVGhleSBhcmUgc2l0ZSBzcGVjaWZpYyBhbmQgdGhlIGxvY2F0aW9ucyBvZiB0aGUKKyEgICAgICAgICAgbGlicmFyeSBhbmQgaW5jbHVkZSBmaWxlcyBuZWVkIGFsbW9zdCBjZXJ0YWlubHkgdG8gYmUgY2hhbmdlZC4KKyEKKyEgTG9jYXRpb246IEFsbCBvZiB0aGUgbGliYXJpZXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBmb2xsb3dpbmcgYWRkcmVzc2VzCishCishICAgWkxJQjogICAgIGh0dHA6Ly93d3cuZGVjdXMuZGU6ODA4MC93d3cvdm1zL3N3L3psaWIuaHRtbHgKKyEKK0JaMkxJQiAjIHN5cyRsaWJyYXJ5OmxpYmJ6Mi5vbGIgIyBkZWNjJHVzZXJfaW5jbHVkZTogIyBiemxpYi5oICMgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgorUE5HTElCICMgc3lzJGxpYnJhcnk6bGlicG5nLm9sYiAjIHN5cyRsaWJyYXJ5OiAjIHBuZy5oICMgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgorWkxJQiAjIHN5cyRsaWJyYXJ5OmxpYnoub2xiICMgc3lzJGxpYnJhcnk6ICMgemxpYi5oICMgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmNlL2Z0ZGVidWcuYyBiL2J1aWxkcy93aW5jZS9mdGRlYnVnLmMKaW5kZXggODNjNWY0NC4uNzM0YzRmMCAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmNlL2Z0ZGVidWcuYworKysgYi9idWlsZHMvd2luY2UvZnRkZWJ1Zy5jCkBAIC0xLDUzICsxLDUyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCBmb3IgV2luQ0UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGRlYnVnLmMKKyAqCisgKiAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgZm9yIFdpbkNFIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGNvbXBvbmVudCBjb250YWlucyB2YXJpb3VzIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHVzZWQgdG8gZWFzZSB0aGUgKi8KLSAgLyogZGVidWdnaW5nIG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUuICBJdHMgbWFpbiBwdXJwb3NlIGlzIGluIGFzc2VydGlvbiAgICovCi0gIC8qIGNoZWNraW5nLCB0cmFjaW5nLCBhbmQgZXJyb3IgZGV0ZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlcmUgYXJlIG5vdyB0aHJlZSBkZWJ1Z2dpbmcgbW9kZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIHRyYWNlIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSAod2hpY2ggY2FuIGJlIHRoZSAqLwotICAvKiAgIHN0YW5kYXJkIGVycm9yIG91dHB1dCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZXJyb3IgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBPbmx5IGVycm9yIG1lc3NhZ2VzIGFyZSBnZW5lcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIHJlbGVhc2UgbW9kZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm8gZXJyb3IgbWVzc2FnZSBpcyBzZW50IG9yIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGlzIGZyZWUgZnJvbSBhbnkgICAqLwotICAvKiAgIGRlYnVnZ2luZyBwYXJ0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBjb21wb25lbnQgY29udGFpbnMgdmFyaW91cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB1c2VkIHRvIGVhc2UgdGhlCisgICAqIGRlYnVnZ2luZyBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLiAgSXRzIG1haW4gcHVycG9zZSBpcyBpbiBhc3NlcnRpb24KKyAgICogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uCisgICAqCisgICAqIFRoZXJlIGFyZSBub3cgdGhyZWUgZGVidWdnaW5nIG1vZGVzOgorICAgKgorICAgKiAtIHRyYWNlIG1vZGUKKyAgICoKKyAgICogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlCisgICAqICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4KKyAgICoKKyAgICogLSBlcnJvciBtb2RlCisgICAqCisgICAqICAgT25seSBlcnJvciBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLgorICAgKgorICAgKiAtIHJlbGVhc2UgbW9kZToKKyAgICoKKyAgICogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueQorICAgKiAgIGRlYnVnZ2luZyBwYXJ0cy4KKyAgICoKKyAgICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCiAKLQogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTUsMTQgKzU0LDE1IEBACiAjaW5jbHVkZSA8d2luZG93cy5oPgogCiAKLSAgdm9pZAorICBzdGF0aWMgdm9pZAogICBPdXRwdXREZWJ1Z1N0cmluZ0V4KCBjb25zdCBjaGFyKiAgc3RyICkKICAgewogICAgIHN0YXRpYyBXQ0hBUiAgYnVmWzgxOTJdOwogCisgICAgaW50ICBzeiA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgc3RyLCAtMSwgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBidWYgKSAvIHNpemVvZiAoICpidWYgKSApOwogCi0gICAgaW50IHN6ID0gTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCBzdHIsIC0xLCBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggYnVmICkgLyBzaXplb2YgKCAqYnVmICkgKTsKKwogICAgIGlmICggIXN6ICkKICAgICAgIGxzdHJjcHlXKCBidWYsIEwiT3V0cHV0RGVidWdTdHJpbmdFeDogTXVsdGlCeXRlVG9XaWRlQ2hhciBmYWlsZWQiICk7CiAKQEAgLTcwLDYgKzcwLDggQEAKICAgfQogCiAKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKwogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIEZUX01lc3NhZ2UoIGNvbnN0IGNoYXIqICBmbXQsCiAgICAgICAgICAgICAgIC4uLiApCkBAIC04Nyw2ICs4OSw4IEBACiAgIH0KIAogCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKICAgRlRfQkFTRV9ERUYoIHZvaWQgKQogICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKICAgICAgICAgICAgIC4uLiApCkBAIC0xMTEsNDkgKzExNSwxMTEgQEAKICAgICAgICAgICAgIGludCAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgY29uc3QgY2hhciogIGZpbGUgKQogICB7CisjaWYgMAorICAgIC8qIGFjdGl2YXRpbmcgdGhlIGNvZGUgaW4gdGhpcyBibG9jayBtYWtlcyBGcmVlVHlwZSB2ZXJ5IGNoYXR0eSAqLworICAgIGZwcmludGYoIHN0ZGVyciwKKyAgICAgICAgICAgICAiJXM6JWQ6IGVycm9yIDB4JTAyeDogJXNcbiIsCisgICAgICAgICAgICAgZmlsZSwKKyAgICAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgIGVycm9yLAorICAgICAgICAgICAgIEZUX0Vycm9yX1N0cmluZyggZXJyb3IgKSApOworI2Vsc2UKICAgICBGVF9VTlVTRUQoIGVycm9yICk7CiAgICAgRlRfVU5VU0VEKCBsaW5lICk7CiAgICAgRlRfVU5VU0VEKCBmaWxlICk7CisjZW5kaWYKIAogICAgIHJldHVybiAwOwogICB9CiAKKyNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLworCisKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogCisgIC8qIGFycmF5IG9mIHRyYWNlIGxldmVscywgaW5pdGlhbGl6ZWQgdG8gMDsgKi8KKyAgLyogdGhpcyBnZXRzIGFkanVzdGVkIGF0IHJ1bi10aW1lICAgICAgICAgICAqLworICBzdGF0aWMgaW50ICBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZFt0cmFjZV9jb3VudF07CiAKLSAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwICovCi0gIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKKyAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBhbHdheXMgaW5pdGlhbGl6ZWQgdG8gMCAqLworICBzdGF0aWMgaW50ICBmdF90cmFjZV9sZXZlbHNfZGlzYWJsZWRbdHJhY2VfY291bnRdOworCisgIC8qIGEgcG9pbnRlciB0byBlaXRoZXIgYGZ0X3RyYWNlX2xldmVsc19lbmFibGVkJyAqLworICAvKiBvciBgZnRfdHJhY2VfbGV2ZWxzX2Rpc2FibGVkJyAgICAgICAgICAgICAgICAgKi8KKyAgaW50KiAgZnRfdHJhY2VfbGV2ZWxzOwogCiAgIC8qIGRlZmluZSBhcnJheSBvZiB0cmFjZSB0b2dnbGUgbmFtZXMgKi8KICNkZWZpbmUgRlRfVFJBQ0VfREVGKCB4ICkgICN4ICwKIAogICBzdGF0aWMgY29uc3QgY2hhciogIGZ0X3RyYWNlX3RvZ2dsZXNbdHJhY2VfY291bnQgKyAxXSA9CiAgIHsKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSQUNFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg+CiAgICAgTlVMTAogICB9OwogCiAjdW5kZWYgRlRfVFJBQ0VfREVGCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluaXRpYWxpemUgdGhlIHRyYWNpbmcgc3ViLXN5c3RlbS4gIFRoaXMgaXMgZG9uZSBieSByZXRyaWV2aW5nIHRoZSAgICAqLwotICAvKiB2YWx1ZSBvZiB0aGUgIkZUMl9ERUJVRyIgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJdCBtdXN0IGJlIGEgbGlzdCBvZiAgKi8KLSAgLyogdG9nZ2xlcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgYDsnIG9yIGAsJy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAiYW55OjMgbWVtb3J5OjYgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgd2lsbCByZXF1ZXN0IHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCAqLwotICAvKiBmb3IgdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA2IGFuZCA1LCAgICAgICAgKi8KLSAgLyogcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGZpbGUgYGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oJyBmb3IgZGV0YWlscyBvZiB0aGUgKi8KLSAgLyogYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDY7IDAgbWVhbnMgcXVpZXQgKGV4Y2VwdCBmb3Igc2VyaW91cyAgKi8KLSAgLyogcnVudGltZSBlcnJvcnMpLCBhbmQgNiBtZWFucyBfdmVyeV8gdmVyYm9zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLworCisgIEZUX0JBU0VfREVGKCBGVF9JbnQgKQorICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQorICB7CisgICAgcmV0dXJuIHRyYWNlX2NvdW50OworICB9CisKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLworCisgIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQorICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQorICB7CisgICAgaW50ICBtYXggPSBGVF9UcmFjZV9HZXRfQ291bnQoKTsKKworCisgICAgaWYgKCBpZHggPCBtYXggKQorICAgICAgcmV0dXJuIGZ0X3RyYWNlX3RvZ2dsZXNbaWR4XTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKworICBGVF9CQVNFX0RFRiggdm9pZCApCisgIEZUX1RyYWNlX0Rpc2FibGUoIHZvaWQgKQorICB7CisgICAgZnRfdHJhY2VfbGV2ZWxzID0gZnRfdHJhY2VfbGV2ZWxzX2Rpc2FibGVkOworICB9CisKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLworCisgIEZUX0JBU0VfREVGKCB2b2lkICkKKyAgRlRfVHJhY2VfRW5hYmxlKCB2b2lkICkKKyAgeworICAgIGZ0X3RyYWNlX2xldmVscyA9IGZ0X3RyYWNlX2xldmVsc19lbmFibGVkOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSW5pdGlhbGl6ZSB0aGUgdHJhY2luZyBzdWItc3lzdGVtLiAgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlCisgICAqIHZhbHVlIG9mIHRoZSBgRlQyX0RFQlVHJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mCisgICAqIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZToKKyAgICoKKyAgICogICBleHBvcnQgRlQyX0RFQlVHPSJhbnk6MyBtZW1vcnk6NyBzdHJlYW06NSIKKyAgICoKKyAgICogVGhpcyByZXF1ZXN0cyB0aGF0IGFsbCBsZXZlbHMgYmUgc2V0IHRvIDMsIGV4Y2VwdCB0aGUgdHJhY2UgbGV2ZWwgZm9yCisgICAqIHRoZSBtZW1vcnkgYW5kIHN0cmVhbSBjb21wb25lbnRzIHdoaWNoIGFyZSBzZXQgdG8gNyBhbmQgNSwKKyAgICogcmVzcGVjdGl2ZWx5LgorICAgKgorICAgKiBTZWUgdGhlIGZpbGUgYGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oJyBmb3IgZGV0YWlscyBvZgorICAgKiB0aGUgYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4KKyAgICoKKyAgICogVGhlIGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3OyAwIG1lYW5zIHF1aWV0IChleGNlcHQgZm9yIHNlcmlvdXMKKyAgICogcnVudGltZSBlcnJvcnMpLCBhbmQgNyBtZWFucyBfdmVyeV8gdmVyYm9zZS4KKyAgICovCiAgIEZUX0JBU0VfREVGKCB2b2lkICkKICAgZnRfZGVidWdfaW5pdCggdm9pZCApCiAgIHsKQEAgLTE4OSw4ICsyNTUsOCBAQAogCiAgICAgICAgIGlmICggKnAgPT0gJzonICYmIHAgPiBxICkKICAgICAgICAgewotICAgICAgICAgIGludCAgbiwgaSwgbGVuID0gKGludCkoIHAgLSBxICk7Ci0gICAgICAgICAgaW50ICBsZXZlbCA9IC0xLCBmb3VuZCA9IC0xOworICAgICAgICAgIEZUX0ludCAgbiwgaSwgbGVuID0gKEZUX0ludCkoIHAgLSBxICk7CisgICAgICAgICAgRlRfSW50ICBsZXZlbCA9IC0xLCBmb3VuZCA9IC0xOwogCiAKICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRyYWNlX2NvdW50OyBuKysgKQpAQCAtMjI0LDE2ICsyOTAsMTggQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIGZvdW5kID09IHRyYWNlX2FueSApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgImFueSIgKi8KKyAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciBgYW55JyAqLwogICAgICAgICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRyYWNlX2NvdW50OyBuKysgKQotICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOworICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc19lbmFibGVkW25dID0gbGV2ZWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tmb3VuZF0gPSBsZXZlbDsKKyAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWRbZm91bmRdID0gbGV2ZWw7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQorCisgICAgZnRfdHJhY2VfbGV2ZWxzID0gZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQ7CiAgIH0KIAogCkBAIC0yNDcsOSArMzE1LDM5IEBACiAgIH0KIAogCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCisgIEZUX0JBU0VfREVGKCBGVF9JbnQgKQorICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQorICB7CisgICAgcmV0dXJuIDA7CisgIH0KIAotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCisKKyAgRlRfQkFTRV9ERUYoIGNvbnN0IGNoYXIgKiApCisgIEZUX1RyYWNlX0dldF9OYW1lKCBGVF9JbnQgIGlkeCApCisgIHsKKyAgICBGVF9VTlVTRUQoIGlkeCApOworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworCisgIEZUX0JBU0VfREVGKCB2b2lkICkKKyAgRlRfVHJhY2VfRGlzYWJsZSggdm9pZCApCisgIHsKKyAgICAvKiBub3RoaW5nICovCisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9FbmFibGUoIHZvaWQgKQorICB7CisgICAgLyogbm90aGluZyAqLworICB9CisKKworI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwogCiAKIC8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9mcmVldHlwZS52Y3Byb2ogYi9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvagppbmRleCAxY2E0NWE4Li5lZmRiNTg3IDEwMDY0NAotLS0gYS9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvagorKysgYi9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2ZyZWV0eXBlLnZjcHJvagpAQCAtMjEsNyArMjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MS5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlLmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxLmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTEubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZS5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtODEsNyArODEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MS5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlLmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTEubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZS5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxLmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxTVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC0xODEsNyArMTgxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlTVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxTVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlTVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTI2MSw3ICsyNjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNULmxpYiIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlU1QubGliIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC0yODEsNyArMjgxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFTVC5saWIiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNULmxpYiIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtMzAxLDcgKzMwMSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxU1QubGliIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVTVC5saWIiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTMyMSw3ICszMjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNULmxpYiIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlU1QubGliIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC0zNDEsNyArMzQxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFTVC5saWIiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNULmxpYiIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtMzYxLDcgKzM2MSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxU1QubGliIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVTVC5saWIiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTM4MSw3ICszODEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MV9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtNDAxLDcgKzQwMSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZV9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTQ0MSw3ICs0NDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MV9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZV9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCkBAIC00ODEsNyArNDgxLDcgQEAKICAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGUyOTFfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTUwMSw3ICs1MDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTUyMSw3ICs1MjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTU0MSw3ICs1NDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTU2MSw3ICs1NjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTU4MSw3ICs1ODEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTYwMSw3ICs2MDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZVNUX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTYyMSw3ICs2MjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTY0MSw3ICs2NDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTY4MSw3ICs2ODEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTcwMSw3ICs3MDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTcyMSw3ICs3MjEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQorICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZU1UX0QubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KQEAgLTc0MSw3ICs3NDEsNyBAQAogICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQogICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwNS1jZVxmcmVldHlwZTI5MU1ULmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KKyAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDUtY2VcZnJlZXR5cGVNVC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlMjkxTVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCisgICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA1LWNlXGZyZWV0eXBlTVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCiAgICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KICAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQpAQCAtODY4LDYgKzg2OCwxMCBAQAogICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdHN0ZGxpYi5oIj4NCiAgICAgICA8L0ZpbGU+DQogICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIE5hbWU9IlJlc291cmNlIEZpbGVzIiBGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4Ij4NCisgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dmVyLnJjIj4NCisgICAgICA8L0ZpbGU+DQorICAgIDwvRmlsdGVyPg0KICAgPC9GaWxlcz4NCiAgIDxHbG9iYWxzPg0KICAgPC9HbG9iYWxzPg0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbCBiL2J1aWxkcy93aW5jZS92YzIwMDUtY2UvaW5kZXguaHRtbAppbmRleCAwMmExY2FmLi42OTM2YTg5IDEwMDY0NAotLS0gYS9idWlsZHMvd2luY2UvdmMyMDA1LWNlL2luZGV4Lmh0bWwKKysrIGIvYnVpbGRzL3dpbmNlL3ZjMjAwNS1jZS9pbmRleC5odG1sCkBAIC0yMSwyMSArMjEsMjEgQEAKICAgPGxpPlBQQy9TUCBXTTYgKFdpbmRvd3MgTW9iaWxlIDYpPC9saT4KIDwvdWw+CiAKLUl0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOS4xIHNvdXJjZXM6PC9wPgorSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi4xMC40IHNvdXJjZXM6PC9wPgogCiA8dWw+CiAgIDxwcmU+Ci0gICAgZnJlZXR5cGUyOTEubGliICAgICAtIHJlbGVhc2UgYnVpbGQ7IHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxX0QubGliICAgLSBkZWJ1ZyBidWlsZDsgICBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1UX0QubGliIC0gZGVidWcgYnVpbGQ7ICAgbXVsdGktdGhyZWFkZWQ8L3ByZT4KKyAgICBmcmVldHlwZS5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCisgICAgZnJlZXR5cGVfRC5saWIgICAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAorICAgIGZyZWV0eXBlTVQubGliICAgLSByZWxlYXNlIGJ1aWxkOyBtdWx0aS10aHJlYWRlZAorICAgIGZyZWV0eXBlTVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgogPC91bD4KIAogPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCiBhcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKIHlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKIHRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgoraHJlZj0iaHR0cHM6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgogZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgogdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKIGFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvZnJlZXR5cGUudmNwcm9qIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2oKaW5kZXggN2E1NDQ1ZS4uZDAxYzViNSAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2oKKysrIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9mcmVldHlwZS52Y3Byb2oKQEAgLTg4LDcgKzg4LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yNjYsNyArMjY2LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC00NDQsNyArNDQ0LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC01MzMsNyArNTMzLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC02MjEsNyArNjIxLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVNVC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtNzA5LDcgKzcwOSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTc5Nyw3ICs3OTcsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxTVQubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC04ODUsNyArODg1LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVNVC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtOTczLDcgKzk3Myw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTEwNjEsNyArMTA2MSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTExNDksNyArMTE0OSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlU1QubGliIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQpAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MVNULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0xMzIzLDcgKzEzMjMsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxU1QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZVNULmxpYiINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KQEAgLTE0MTAsNyArMTQxMCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlU1QubGliIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQpAQCAtMTQ5Nyw3ICsxNDk3LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MVNULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxU1QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZVNULmxpYiINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KQEAgLTE2NjgsNyArMTY2OCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE3NTMsNyArMTc1Myw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE4MzgsNyArMTgzOCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE5MjMsNyArMTkyMyw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIwMDgsNyArMjAwOCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIwOTMsNyArMjA5Myw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIxNzgsNyArMjE3OCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFTVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yMjYzLDcgKzIyNjMsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlU1RfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjM0OCw3ICsyMzQ4LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MVNUX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZVNUX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTI0MzMsNyArMjQzMyw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFTVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yNTE4LDcgKzI1MTgsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlU1RfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjYwMyw3ICsyNjAzLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MVNUX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZVNUX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTI2ODksNyArMjY4OSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVNVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yNzc1LDcgKzI3NzUsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxTVRfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVRfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjg2MSw3ICsyODYxLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MU1UX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTI5NDcsNyArMjk0Nyw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVNVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0zMDMzLDcgKzMwMzMsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlMjkxTVRfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVRfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMzExOSw3ICszMTE5LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZTI5MU1UX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbmNlXHZjMjAwOC1jZVxmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTMyMDUsNyArMzIwNSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luY2VcdmMyMDA4LWNlXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTMyNzksNyArMzI3OSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW5jZVx2YzIwMDgtY2VcZnJlZXR5cGVNVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0zNTAyLDYgKzM1MDIsMTUgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJPC9GaWx0ZXI+DQorCQk8RmlsdGVyDQorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiDQorCQkJRmlsdGVyPSJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeCINCisJCQk+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHZlci5yYyINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCTwvRmlsdGVyPg0KIAk8L0ZpbGVzPg0KIAk8R2xvYmFscz4NCiAJPC9HbG9iYWxzPg0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbCBiL2J1aWxkcy93aW5jZS92YzIwMDgtY2UvaW5kZXguaHRtbAppbmRleCBmN2EzNTgzLi5lZTM4NWFmIDEwMDY0NAotLS0gYS9idWlsZHMvd2luY2UvdmMyMDA4LWNlL2luZGV4Lmh0bWwKKysrIGIvYnVpbGRzL3dpbmNlL3ZjMjAwOC1jZS9pbmRleC5odG1sCkBAIC0yMSwyMSArMjEsMjEgQEAKICAgPGxpPlBQQy9TUCBXTTYgKFdpbmRvd3MgTW9iaWxlIDYpPC9saT4KIDwvdWw+CiAKLUl0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOS4xIHNvdXJjZXM6PC9wPgorSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi4xMC40IHNvdXJjZXM6PC9wPgogCiA8dWw+CiAgIDxwcmU+Ci0gICAgZnJlZXR5cGUyOTEubGliICAgICAtIHJlbGVhc2UgYnVpbGQ7IHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxX0QubGliICAgLSBkZWJ1ZyBidWlsZDsgICBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1UX0QubGliIC0gZGVidWcgYnVpbGQ7ICAgbXVsdGktdGhyZWFkZWQ8L3ByZT4KKyAgICBmcmVldHlwZS5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCisgICAgZnJlZXR5cGVfRC5saWIgICAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAorICAgIGZyZWV0eXBlTVQubGliICAgLSByZWxlYXNlIGJ1aWxkOyBtdWx0aS10aHJlYWRlZAorICAgIGZyZWV0eXBlTVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgogPC91bD4KIAogPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCiBhcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKIHlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKIHRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgoraHJlZj0iaHR0cHM6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgogZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgogdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKIGFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL2RldGVjdC5tayBiL2J1aWxkcy93aW5kb3dzL2RldGVjdC5tawppbmRleCBkZDU2NjljLi4zMDNkYzhiIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy9kZXRlY3QubWsKKysrIGIvYnVpbGRzL3dpbmRvd3MvZGV0ZWN0Lm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xMTgsNjQgKzExOCw4MiBAQAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGMsJChNQUtFQ01ER09BTFMpKSwpICAgICAjIFZpc3VhbCBDL0MrKwogICAgIENPTkZJR19GSUxFIDo9IHczMi12Y2MubWsKICAgICBDQyAgICAgICAgICA6PSBjbAotICAgIHZpc3VhbGM6IHNldHVwCisKICAgICAuUEhPTlk6IHZpc3VhbGMKKyAgICB2aXN1YWxjOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgaW50ZWxjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICMgSW50ZWwgQy9DKysKICAgICBDT05GSUdfRklMRSA6PSB3MzItaW50bC5tawogICAgIENDICAgICAgICAgIDo9IGNsCi0gICAgdmlzdWFsYzogc2V0dXAKKwogICAgIC5QSE9OWTogaW50ZWxjCisgICAgdmlzdWFsYzogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHdhdGNvbSwkKE1BS0VDTURHT0FMUykpLCkgICAgICAjIFdhdGNvbSBDL0MrKwogICAgIENPTkZJR19GSUxFIDo9IHczMi13YXQubWsKICAgICBDQyAgICAgICAgICA6PSB3Y2MzODYKLSAgICB3YXRjb206IHNldHVwCisKICAgICAuUEhPTlk6IHdhdGNvbQorICAgIHdhdGNvbTogc2V0dXAKKwkgICAgQGNkIC4KICAgZW5kaWYKIAogICBpZm5lcSAoJChmaW5kc3RyaW5nIHZpc3VhbGFnZSwkKE1BS0VDTURHT0FMUykpLCkgICAjIFZpc3VhbCBBZ2UgQysrCiAgICAgQ09ORklHX0ZJTEUgOj0gdzMyLWljYy5tawogICAgIENDICAgICAgICAgIDo9IGljYwotICAgIHZpc3VhbGFnZTogc2V0dXAKKwogICAgIC5QSE9OWTogdmlzdWFsYWdlCisgICAgdmlzdWFsYWdlOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgbGNjLCQoTUFLRUNNREdPQUxTKSksKSAgICAgICAgICMgTENDLVdpbjMyCiAgICAgQ09ORklHX0ZJTEUgOj0gdzMyLWxjYy5tawogICAgIENDICAgICAgICAgIDo9IGxjYwotICAgIGxjYzogc2V0dXAKKwogICAgIC5QSE9OWTogbGNjCisgICAgbGNjOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgbWluZ3czMiwkKE1BS0VDTURHT0FMUykpLCkgICAgICMgbWluZ3czMgogICAgIENPTkZJR19GSUxFIDo9IHczMi1taW5ndzMyLm1rCiAgICAgQ0MgICAgICAgICAgOj0gZ2NjCi0gICAgbWluZ3czMjogc2V0dXAKKwogICAgIC5QSE9OWTogbWluZ3czMgorICAgIG1pbmd3MzI6IHNldHVwCisJICAgIEBjZCAuCiAgIGVuZGlmCiAKICAgaWZuZXEgKCQoZmluZHN0cmluZyBiY2MzMiwkKE1BS0VDTURHT0FMUykpLCkgICAgICAgIyBCb3JsYW5kIEMrKwogICAgIENPTkZJR19GSUxFIDo9IHczMi1iY2MubWsKICAgICBDQyAgICAgICAgICA6PSBiY2MzMgotICAgIGJjYzMyOiBzZXR1cAorCiAgICAgLlBIT05ZOiBiY2MzMgorICAgIGJjYzMyOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgZGV2ZWwtYmNjLCQoTUFLRUNNREdPQUxTKSksKSAgICMgZGV2ZWxvcG1lbnQgdGFyZ2V0CiAgICAgQ09ORklHX0ZJTEUgOj0gdzMyLWJjY2QubWsKICAgICBDQyAgICAgICAgICA6PSBiY2MzMgotICAgIGRldmVsLWJjYzogc2V0dXAKKwogICAgIC5QSE9OWTogZGV2ZWwtYmNjCisgICAgZGV2ZWwtYmNjOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiAgIGlmbmVxICgkKGZpbmRzdHJpbmcgZGV2ZWwtZ2NjLCQoTUFLRUNNREdPQUxTKSksKSAgICMgZGV2ZWxvcG1lbnQgdGFyZ2V0CiAgICAgQ09ORklHX0ZJTEUgOj0gdzMyLWRldi5tawogICAgIENDICAgICAgICAgIDo9IGdjYwotICAgIGRldmVsLWdjYzogc2V0dXAKKwogICAgIC5QSE9OWTogZGV2ZWwtZ2NjCisgICAgZGV2ZWwtZ2NjOiBzZXR1cAorCSAgICBAY2QgLgogICBlbmRpZgogCiBlbmRpZiAgICMgdGVzdCBQTEFURk9STSB3aW5kb3dzCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy9mdGRlYnVnLmMgYi9idWlsZHMvd2luZG93cy9mdGRlYnVnLmMKaW5kZXggZWM3MGEwZS4uZDU4OTQ5MCAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvZnRkZWJ1Zy5jCisrKyBiL2J1aWxkcy93aW5kb3dzL2Z0ZGVidWcuYwpAQCAtMSw0OCArMSw0OCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkZWJ1Zy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgZm9yIFdpbjMyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRkZWJ1Zy5jCisgKgorICogICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IGZvciBXaW4zMiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBjb21wb25lbnQgY29udGFpbnMgdmFyaW91cyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB1c2VkIHRvIGVhc2UgdGhlICovCi0gIC8qIGRlYnVnZ2luZyBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLiAgSXRzIG1haW4gcHVycG9zZSBpcyBpbiBhc3NlcnRpb24gICAqLwotICAvKiBjaGVja2luZywgdHJhY2luZywgYW5kIGVycm9yIGRldGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSBub3cgdGhyZWUgZGVidWdnaW5nIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSB0cmFjZSBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgbG9nIGZpbGUgKHdoaWNoIGNhbiBiZSB0aGUgKi8KLSAgLyogICBzdGFuZGFyZCBlcnJvciBvdXRwdXQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGVycm9yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT25seSBlcnJvciBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSByZWxlYXNlIG1vZGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vIGVycm9yIG1lc3NhZ2UgaXMgc2VudCBvciBnZW5lcmF0ZWQuICBUaGUgY29kZSBpcyBmcmVlIGZyb20gYW55ICAgKi8KLSAgLyogICBkZWJ1Z2dpbmcgcGFydHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZQorICAgKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uCisgICAqIGNoZWNraW5nLCB0cmFjaW5nLCBhbmQgZXJyb3IgZGV0ZWN0aW9uLgorICAgKgorICAgKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczoKKyAgICoKKyAgICogLSB0cmFjZSBtb2RlCisgICAqCisgICAqICAgRXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSAod2hpY2ggY2FuIGJlIHRoZQorICAgKiAgIHN0YW5kYXJkIGVycm9yIG91dHB1dCkuCisgICAqCisgICAqIC0gZXJyb3IgbW9kZQorICAgKgorICAgKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4KKyAgICoKKyAgICogLSByZWxlYXNlIG1vZGU6CisgICAqCisgICAqICAgTm8gZXJyb3IgbWVzc2FnZSBpcyBzZW50IG9yIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGlzIGZyZWUgZnJvbSBhbnkKKyAgICogICBkZWJ1Z2dpbmcgcGFydHMuCisgICAqCisgICAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgpAQCAtOTksNTAgKzk5LDExMSBAQAogICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCiAgIHsKKyNpZiAwCisgICAgLyogYWN0aXZhdGluZyB0aGUgY29kZSBpbiB0aGlzIGJsb2NrIG1ha2VzIEZyZWVUeXBlIHZlcnkgY2hhdHR5ICovCisgICAgZnByaW50Ziggc3RkZXJyLAorICAgICAgICAgICAgICIlczolZDogZXJyb3IgMHglMDJ4OiAlc1xuIiwKKyAgICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgIGxpbmUsCisgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgRlRfRXJyb3JfU3RyaW5nKCBlcnJvciApICk7CisjZWxzZQogICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKICAgICBGVF9VTlVTRUQoIGxpbmUgKTsKICAgICBGVF9VTlVTRUQoIGZpbGUgKTsKKyNlbmRpZgogCiAgICAgcmV0dXJuIDA7CiAgIH0KIAorI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCisKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKKyAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwOyAqLworICAvKiB0aGlzIGdldHMgYWRqdXN0ZWQgYXQgcnVuLXRpbWUgICAgICAgICAgICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19lbmFibGVkW3RyYWNlX2NvdW50XTsKIAotICAvKiBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIGluaXRpYWxpemVkIHRvIDAgKi8KLSAgaW50ICBmdF90cmFjZV9sZXZlbHNbdHJhY2VfY291bnRdOworICAvKiBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIGFsd2F5cyBpbml0aWFsaXplZCB0byAwICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19kaXNhYmxlZFt0cmFjZV9jb3VudF07CisKKyAgLyogYSBwb2ludGVyIHRvIGVpdGhlciBgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQnICovCisgIC8qIG9yIGBmdF90cmFjZV9sZXZlbHNfZGlzYWJsZWQnICAgICAgICAgICAgICAgICAqLworICBpbnQqICBmdF90cmFjZV9sZXZlbHM7CiAKICAgLyogZGVmaW5lIGFycmF5IG9mIHRyYWNlIHRvZ2dsZSBuYW1lcyAqLwogI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgI3ggLAogCiAgIHN0YXRpYyBjb25zdCBjaGFyKiAgZnRfdHJhY2VfdG9nZ2xlc1t0cmFjZV9jb3VudCArIDFdID0KICAgewotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJBQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KICAgICBOVUxMCiAgIH07CiAKICN1bmRlZiBGVF9UUkFDRV9ERUYKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhY2luZyBzdWItc3lzdGVtLiAgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlICAgICovCi0gIC8qIHZhbHVlIG9mIHRoZSAiRlQyX0RFQlVHIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mICAqLwotICAvKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICJhbnk6MyBtZW1vcnk6NiBzdHJlYW06NSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyB3aWxsIHJlcXVlc3QgdGhhdCBhbGwgbGV2ZWxzIGJlIHNldCB0byAzLCBleGNlcHQgdGhlIHRyYWNlIGxldmVsICovCi0gIC8qIGZvciB0aGUgbWVtb3J5IGFuZCBzdHJlYW0gY29tcG9uZW50cyB3aGljaCBhcmUgc2V0IHRvIDYgYW5kIDUsICAgICAgICAqLwotICAvKiByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mIHRoZSAqLwotICAvKiBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNjsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwotICAvKiBydW50aW1lIGVycm9ycyksIGFuZCA2IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIEZUX0ludCApCisgIEZUX1RyYWNlX0dldF9Db3VudCggdm9pZCApCisgIHsKKyAgICByZXR1cm4gdHJhY2VfY291bnQ7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIGNvbnN0IGNoYXIgKiApCisgIEZUX1RyYWNlX0dldF9OYW1lKCBGVF9JbnQgIGlkeCApCisgIHsKKyAgICBpbnQgIG1heCA9IEZUX1RyYWNlX0dldF9Db3VudCgpOworCisKKyAgICBpZiAoIGlkeCA8IG1heCApCisgICAgICByZXR1cm4gZnRfdHJhY2VfdG9nZ2xlc1tpZHhdOworICAgIGVsc2UKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLworCisgIEZUX0JBU0VfREVGKCB2b2lkICkKKyAgRlRfVHJhY2VfRGlzYWJsZSggdm9pZCApCisgIHsKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZGlzYWJsZWQ7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9FbmFibGUoIHZvaWQgKQorICB7CisgICAgZnRfdHJhY2VfbGV2ZWxzID0gZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQ7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJbml0aWFsaXplIHRoZSB0cmFjaW5nIHN1Yi1zeXN0ZW0uICBUaGlzIGlzIGRvbmUgYnkgcmV0cmlldmluZyB0aGUKKyAgICogdmFsdWUgb2YgdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSXQgbXVzdCBiZSBhIGxpc3Qgb2YKKyAgICogdG9nZ2xlcywgc2VwYXJhdGVkIGJ5IHNwYWNlcywgYDsnLCBvciBgLCcuICBFeGFtcGxlOgorICAgKgorICAgKiAgIGV4cG9ydCBGVDJfREVCVUc9ImFueTozIG1lbW9yeTo3IHN0cmVhbTo1IgorICAgKgorICAgKiBUaGlzIHJlcXVlc3RzIHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCBmb3IKKyAgICogdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA3IGFuZCA1LAorICAgKiByZXNwZWN0aXZlbHkuCisgICAqCisgICAqIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mCisgICAqIHRoZSBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLgorICAgKgorICAgKiBUaGUgbGV2ZWwgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDc7IDAgbWVhbnMgcXVpZXQgKGV4Y2VwdCBmb3Igc2VyaW91cworICAgKiBydW50aW1lIGVycm9ycyksIGFuZCA3IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLgorICAgKi8KICAgRlRfQkFTRV9ERUYoIHZvaWQgKQogICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKICAgewpAQCAtMTcxLDggKzIzMiw4IEBACiAKICAgICAgICAgaWYgKCAqcCA9PSAnOicgJiYgcCA+IHEgKQogICAgICAgICB7Ci0gICAgICAgICAgaW50ICBuLCBpLCBsZW4gPSAoaW50KSggcCAtIHEgKTsKLSAgICAgICAgICBpbnQgIGxldmVsID0gLTEsIGZvdW5kID0gLTE7CisgICAgICAgICAgRlRfSW50ICBuLCBpLCBsZW4gPSAoRlRfSW50KSggcCAtIHEgKTsKKyAgICAgICAgICBGVF9JbnQgIGxldmVsID0gLTEsIGZvdW5kID0gLTE7CiAKIAogICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCkBAIC0yMDYsMTYgKzI2NywxOCBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggZm91bmQgPT0gdHJhY2VfYW55ICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc3BlY2lhbCBjYXNlIGZvciAiYW55IiAqLworICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGBhbnknICovCiAgICAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW25dID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWRbbl0gPSBsZXZlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW2ZvdW5kXSA9IGxldmVsOworICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZFtmb3VuZF0gPSBsZXZlbDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZDsKICAgfQogCiAKQEAgLTIyOSw5ICsyOTIsMzkgQEAKICAgfQogCiAKLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KKyAgRlRfQkFTRV9ERUYoIEZUX0ludCApCisgIEZUX1RyYWNlX0dldF9Db3VudCggdm9pZCApCisgIHsKKyAgICByZXR1cm4gMDsKKyAgfQogCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KKworICBGVF9CQVNFX0RFRiggY29uc3QgY2hhciAqICkKKyAgRlRfVHJhY2VfR2V0X05hbWUoIEZUX0ludCAgaWR4ICkKKyAgeworICAgIEZUX1VOVVNFRCggaWR4ICk7CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9EaXNhYmxlKCB2b2lkICkKKyAgeworICAgIC8qIG5vdGhpbmcgKi8KKyAgfQorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKworICBGVF9CQVNFX0RFRiggdm9pZCApCisgIEZUX1RyYWNlX0VuYWJsZSggdm9pZCApCisgIHsKKyAgICAvKiBub3RoaW5nICovCisgIH0KKworCisjZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUuc2xuIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnNsbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzMzQ1ZC4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMDUvZnJlZXR5cGUuc2xuCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gOS4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDA1DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJmcmVldHlwZSIsICJmcmVldHlwZS52Y3Byb2oiLCAiezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgRGVidWd8V2luMzIgPSBMSUIgRGVidWd8V2luMzINCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZXxXaW4zMiA9IExJQiBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvaiBiL2J1aWxkcy93aW5kb3dzL3ZjMjAwNS9mcmVldHlwZS52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZTJhZTYuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2ZyZWV0eXBlLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdCBQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIgVmVyc2lvbj0iOC4wMCIgTmFtZT0iZnJlZXR5cGUiIFByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSIgVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIj4NCi0gIDxQbGF0Zm9ybXM+DQotICAgIDxQbGF0Zm9ybSBOYW1lPSJXaW4zMiIgLz4NCi0gIDwvUGxhdGZvcm1zPg0KLSAgPFRvb2xGaWxlcz4NCi0gIDwvVG9vbEZpbGVzPg0KLSAgPENvbmZpZ3VyYXRpb25zPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZWxlYXNlfFdpbjMyIiBPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjIiIElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiIFN0cmluZ1Bvb2xpbmc9InRydWUiIFJ1bnRpbWVMaWJyYXJ5PSIyIiBFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giIEFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iIFdhcm5pbmdMZXZlbD0iNCIgRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCIgQ29tcGlsZUFzPSIwIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciIEN1bHR1cmU9IjEwMzMiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTGlicmFyaWFuVG9vbCIgT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDVcZnJlZXR5cGUyOTEubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiIgT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCIgSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIyIiBJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSIgQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUMl9CVUlMRF9MSUJSQVJZIiBTdHJpbmdQb29saW5nPSJ0cnVlIiBSdW50aW1lTGlicmFyeT0iMCIgRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyIgT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA1XGZyZWV0eXBlMjkxTVQubGliIiBTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNBTGlua1Rvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYRENNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0JzY01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDRnhDb3BUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICA8L0NvbmZpZ3VyYXRpb24+DQotICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiIENvbmZpZ3VyYXRpb25UeXBlPSI0IiBJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiIFVzZU9mTUZDPSIwIiBBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiIENoYXJhY3RlclNldD0iMiI+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01JRExUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ0xDb21waWxlclRvb2wiIE9wdGltaXphdGlvbj0iMiIgSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWSIgU3RyaW5nUG9vbGluZz0idHJ1ZSIgUnVudGltZUxpYnJhcnk9IjAiIEVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIiBQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbjMyXHZjMjAwNVxmcmVldHlwZTI5MVNULmxpYiIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWd8V2luMzIiIE91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnIiBJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyIgQ29uZmlndXJhdGlvblR5cGU9IjQiIEluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIgVXNlT2ZNRkM9IjAiIEFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIgQ2hhcmFjdGVyU2V0PSIyIj4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDTUlETFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIgT3B0aW1pemF0aW9uPSIwIiBBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiIEJhc2ljUnVudGltZUNoZWNrcz0iMyIgUnVudGltZUxpYnJhcnk9IjMiIERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiIFByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCIgQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIiBQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyIgV2FybmluZ0xldmVsPSI0IiBEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIiBDb21waWxlQXM9IjAiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIgUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIgQ3VsdHVyZT0iMTAzMyIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNMaWJyYXJpYW5Ub29sIiBPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbjMyXHZjMjAwNVxmcmVldHlwZTI5MV9ELmxpYiIgU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQUxpbmtUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDWERDTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNCc2NNYWtlVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0Z4Q29wVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIgLz4NCi0gICAgPC9Db25maWd1cmF0aW9uPg0KLSAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiIgT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0IiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA1XGZyZWV0eXBlMjkxU1RfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiIgT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQiIEludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210IiBDb25maWd1cmF0aW9uVHlwZT0iNCIgSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIiBVc2VPZk1GQz0iMCIgQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIiBDaGFyYWN0ZXJTZXQ9IjIiPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNNSURMVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBPcHRpbWl6YXRpb249IjAiIEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiIFByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiIEdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCIgQmFzaWNSdW50aW1lQ2hlY2tzPSIzIiBSdW50aW1lTGlicmFyeT0iMSIgRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIgUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIiBBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIE9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iIFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIiBXYXJuaW5nTGV2ZWw9IjQiIERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiIENvbXBpbGVBcz0iMCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIiBQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIiBDdWx0dXJlPSIxMDMzIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0xpYnJhcmlhblRvb2wiIE91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA1XGZyZWV0eXBlMjkxTVRfRC5saWIiIFN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ0FMaW5rVG9vbCIgLz4NCi0gICAgICA8VG9vbCBOYW1lPSJWQ1hEQ01ha2VUb29sIiAvPg0KLSAgICAgIDxUb29sIE5hbWU9IlZDQnNjTWFrZVRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNGeENvcFRvb2wiIC8+DQotICAgICAgPFRvb2wgTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiIC8+DQotICAgIDwvQ29uZmlndXJhdGlvbj4NCi0gIDwvQ29uZmlndXJhdGlvbnM+DQotICA8UmVmZXJlbmNlcz4NCi0gIDwvUmVmZXJlbmNlcz4NCi0gIDxGaWxlcz4NCi0gICAgPEZpbHRlciBOYW1lPSJTb3VyY2UgRmlsZXMiIEZpbHRlcj0iY3BwO2M7Y3h4O3JjO2RlZjtyO29kbDtpZGw7aHBqO2JhdCI+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYXV0b2ZpdFxhdXRvZml0LmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiZGZcYmRmLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjZmZcY2ZmLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0YmFzZS5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJpdG1hcC5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2FjaGVcZnRjYWNoZS5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlxmdGRlYnVnLmMiPg0KLSAgICAgICAgPEZpbGVDb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8VG9vbCBOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIiBEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSIgLz4NCi0gICAgICAgIDwvRmlsZUNvbmZpZ3VyYXRpb24+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnYXNwLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGd6aXBcZnRnemlwLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0aW5pdC5jIj4NCi0gICAgICA8L0ZpbGU+DQotICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcbHp3XGZ0bHp3LmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3Ryb2tlLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3lzdGVtLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xzbW9vdGhcc21vb3RoLmMiPg0KLSAgICAgIDwvRmlsZT4NCi0gICAgICA8RmlsdGVyIE5hbWU9IkZUX01PRFVMRVMiPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJkZi5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGNpZC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRtbS5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwZnIuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dHlwZTEuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0d2luZm50LmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGd4dmFsLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG90dmFsLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBjZlxwY2YuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwZnJccGZyLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccHNhdXhccHNhdXguYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2hpbnRlclxwc2hpbnRlci5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBzbmFtZXNccHNtb2R1bGUuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xyYXN0ZXJccmFzdGVyLmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc2ZudFxzZm50LmMiPg0KLSAgICAgICAgPC9GaWxlPg0KLSAgICAgICAgPEZpbGUgUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcdHJ1ZXR5cGVcdHJ1ZXR5cGUuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlMVx0eXBlMS5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNpZFx0eXBlMWNpZC5jIj4NCi0gICAgICAgIDwvRmlsZT4NCi0gICAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGU0Mlx0eXBlNDIuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x3aW5mb250c1x3aW5mbnQuYyI+DQotICAgICAgICA8L0ZpbGU+DQotICAgICAgPC9GaWx0ZXI+DQotICAgIDwvRmlsdGVyPg0KLSAgICA8RmlsdGVyIE5hbWU9IkhlYWRlciBGaWxlcyIgRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIj4NCi0gICAgICA8RmlsZSBSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnQyYnVpbGQuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRjb25maWcuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRoZWFkZXIuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRtb2R1bGUuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRvcHRpb24uaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICAgIDxGaWxlIFJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRzdGRsaWIuaCI+DQotICAgICAgPC9GaWxlPg0KLSAgICA8L0ZpbHRlcj4NCi0gIDwvRmlsZXM+DQotICA8R2xvYmFscz4NCi0gIDwvR2xvYmFscz4NCi08L1Zpc3VhbFN0dWRpb1Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA1L2luZGV4Lmh0bWwgYi9idWlsZHMvd2luZG93cy92YzIwMDUvaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlMTgyZS4uMDAwMDAwMAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMDUvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTxodG1sPgotPGhlYWRlcj4KLTx0aXRsZT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDUKLTwvdGl0bGU+Ci0KLTxib2R5PgotPGgxPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVlMuTkVUJm5ic3A7MjAwNQotPC9oMT4KLQotPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgVmlzdWFsIEMrKywgbmFtZWQKLTx0dD5mcmVldHlwZS52Y3Byb2o8L3R0PiwgYW5kIFZpc3VhbCBTdHVkaW8sIGNhbGxlZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4uICBJdAotY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi45LjEgc291cmNlczo8L3A+Ci0KLTx1bD4KLSAgPHByZT4KLSAgICBmcmVldHlwZTI5MS5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOTFfRC5saWIgICAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxTVQubGliICAgLSByZWxlYXNlIGJ1aWxkOyBtdWx0aS10aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxTVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgotPC91bD4KLQotPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCi1hcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKLXlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKLXRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgotZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgotdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKLWFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KLQotPHA+QnVpbGQgZGlyZWN0b3JpZXMgYXJlIHBsYWNlZCBpbiB0aGUgdG9wLWxldmVsIDx0dD5vYmpzPC90dD4KLWRpcmVjdG9yeS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS5zbG4gYi9idWlsZHMvd2luZG93cy92YzIwMDgvZnJlZXR5cGUuc2xuCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzUyMmY5Li4wMDAwMDAwCi0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS5zbG4KKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiAxMC4wMA0KLSMgVmlzdWFsIFN0dWRpbyAyMDA4DQotUHJvamVjdCgiezhCQzlDRUI4LThCNEEtMTFEMC04RDExLTAwQTBDOTFCQzk0Mn0iKSA9ICJmcmVldHlwZSIsICJmcmVldHlwZS52Y3Byb2oiLCAiezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0iDQotRW5kUHJvamVjdA0KLUdsb2JhbA0KLQlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KLQkJTElCIERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyID0gTElCIERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgRGVidWd8V2luMzIgPSBMSUIgRGVidWd8V2luMzINCi0JCUxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIgPSBMSUIgUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IExJQiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyDQotCQlMSUIgUmVsZWFzZXxXaW4zMiA9IExJQiBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5MSUIgRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBEZWJ1Z3xXaW4zMi5BY3RpdmVDZmcgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIERlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uTElCIFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2V8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkxJQiBSZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyDQotCUVuZEdsb2JhbFNlY3Rpb24NCi0JR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCi0JCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KLQlFbmRHbG9iYWxTZWN0aW9uDQotRW5kR2xvYmFsDQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvaiBiL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9mcmVldHlwZS52Y3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjZjZDIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2ZyZWV0eXBlLnZjcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4NCi08VmlzdWFsU3R1ZGlvUHJvamVjdA0KLQlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyINCi0JVmVyc2lvbj0iOSwwMCINCi0JTmFtZT0iZnJlZXR5cGUiDQotCVByb2plY3RHVUlEPSJ7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfSINCi0JVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIg0KLQk+DQotCTxQbGF0Zm9ybXM+DQotCQk8UGxhdGZvcm0NCi0JCQlOYW1lPSJXaW4zMiINCi0JCS8+DQotCTwvUGxhdGZvcm1zPg0KLQk8VG9vbEZpbGVzPg0KLQk8L1Rvb2xGaWxlcz4NCi0JPENvbmZpZ3VyYXRpb25zPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZS8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXHdpbjMyXHZjMjAwOFxmcmVldHlwZTI5MS5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIyIg0KLQkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCi0JCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUMl9CVUlMRF9MSUJSQVJZIg0KLQkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMCINCi0JCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDhcZnJlZXR5cGUyOTFNVC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLQkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCi0JCQlVc2VPZk1GQz0iMCINCi0JCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KLQkJCT4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNSURMVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQotCQkJCU9wdGltaXphdGlvbj0iMiINCi0JCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSINCi0JCQkJUnVudGltZUxpYnJhcnk9IjAiDQotCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIg0KLQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIwIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjkxU1QubGliIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWd8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWciDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWciDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjMiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcd2luMzJcdmMyMDA4XGZyZWV0eXBlMjkxX0QubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfc3QvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDhcZnJlZXR5cGUyOTFTVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JCTxDb25maWd1cmF0aW9uDQotCQkJTmFtZT0iRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjAiDQotCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTtfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiDQotCQkJCUdlbmVyYXRlUHJlcHJvY2Vzc2VkRmlsZT0iMCINCi0JCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIg0KLQkJCQlSdW50aW1lTGlicmFyeT0iMSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCU9iamVjdEZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlXYXJuaW5nTGV2ZWw9IjQiDQotCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiDQotCQkJCUNvbXBpbGVBcz0iMCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyINCi0JCQkJQ3VsdHVyZT0iMTAzMyINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1x3aW4zMlx2YzIwMDhcZnJlZXR5cGUyOTFNVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCTwvQ29uZmlndXJhdGlvbj4NCi0JPC9Db25maWd1cmF0aW9ucz4NCi0JPFJlZmVyZW5jZXM+DQotCTwvUmVmZXJlbmNlcz4NCi0JPEZpbGVzPg0KLQkJPEZpbHRlcg0KLQkJCU5hbWU9IlNvdXJjZSBGaWxlcyINCi0JCQlGaWx0ZXI9ImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQotCQkJPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGF1dG9maXRcYXV0b2ZpdC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJkZlxiZGYuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xjZmZcY2ZmLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGJhc2UuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Yml0bWFwLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcY2FjaGVcZnRjYWNoZS5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cZnRkZWJ1Zy5jIg0KLQkJCQk+DQotCQkJCTxGaWxlQ29uZmlndXJhdGlvbj4NCi0JCQkJCTxUb29sDQotCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCi0JCQkJCS8+DQotCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2FzcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRnbHlwaC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGd6aXBcZnRnemlwLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGluaXQuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xsendcZnRsencuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3Ryb2tlLmMiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHN5c3RlbS5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHNtb290aFxzbW9vdGguYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsdGVyDQotCQkJCU5hbWU9IkZUX01PRFVMRVMiDQotCQkJCT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiYm94LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRiZGYuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGNpZC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bW0uYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBmci5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0c3ludGguYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnR3aW5mbnQuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGd4dmFsLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRvdHZhbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0cGF0ZW50LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHBjZlxwY2YuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNccGZyXHBmci5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2F1eFxwc2F1eC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc2hpbnRlclxwc2hpbnRlci5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwc25hbWVzXHBzbW9kdWxlLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHJhc3RlclxyYXN0ZXIuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcc2ZudFxzZm50LmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHRydWV0eXBlXHRydWV0eXBlLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHR5cGUxXHR5cGUxLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNpZFx0eXBlMWNpZC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1x0eXBlNDJcdHlwZTQyLmMiDQotCQkJCQk+DQotCQkJCTwvRmlsZT4NCi0JCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXHdpbmZvbnRzXHdpbmZudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJPC9GaWx0ZXI+DQotCQk8L0ZpbHRlcj4NCi0JCTxGaWx0ZXINCi0JCQlOYW1lPSJIZWFkZXIgRmlsZXMiDQotCQkJRmlsdGVyPSJoO2hwcDtoeHg7aG07aW5sIg0KLQkJCT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnQyYnVpbGQuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0Y29uZmlnLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdGhlYWRlci5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5caW5jbHVkZVxmcmVldHlwZVxjb25maWdcZnRtb2R1bGUuaCINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0b3B0aW9uLmgiDQotCQkJCT4NCi0JCQk8L0ZpbGU+DQotCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxpbmNsdWRlXGZyZWV0eXBlXGNvbmZpZ1xmdHN0ZGxpYi5oIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJPC9GaWx0ZXI+DQotCTwvRmlsZXM+DQotCTxHbG9iYWxzPg0KLQk8L0dsb2JhbHM+DQotPC9WaXN1YWxTdHVkaW9Qcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3ZjMjAwOC9pbmRleC5odG1sIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YzZmOWIuLjAwMDAwMDAKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmMyMDA4L2luZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08aHRtbD4KLTxoZWFkZXI+Ci08dGl0bGU+Ci0gIEZyZWVUeXBlJm5ic3A7MiBQcm9qZWN0IEZpbGVzIGZvciBWUy5ORVQmbmJzcDsyMDA4Ci08L3RpdGxlPgotCi08Ym9keT4KLTxoMT4KLSAgRnJlZVR5cGUmbmJzcDsyIFByb2plY3QgRmlsZXMgZm9yIFZTLk5FVCZuYnNwOzIwMDgKLTwvaDE+Ci0KLTxwPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBDKyssIG5hbWVkCi08dHQ+ZnJlZXR5cGUudmNwcm9qPC90dD4sIGFuZCBWaXN1YWwgU3R1ZGlvLCBjYWxsZWQgPHR0PmZyZWV0eXBlLnNsbjwvdHQ+LiAgSXQKLWNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOS4xIHNvdXJjZXM6PC9wPgotCi08dWw+Ci0gIDxwcmU+Ci0gICAgZnJlZXR5cGUyOTEubGliICAgICAtIHJlbGVhc2UgYnVpbGQ7IHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxX0QubGliICAgLSBkZWJ1ZyBidWlsZDsgICBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1UX0QubGliIC0gZGVidWcgYnVpbGQ7ICAgbXVsdGktdGhyZWFkZWQ8L3ByZT4KLTwvdWw+Ci0KLTxwPkJlIHN1cmUgdG8gZXh0cmFjdCB0aGUgZmlsZXMgd2l0aCB0aGUgV2luZG93cyAoQ1IrTEYpIGxpbmUgZW5kaW5ncy4gIFpJUAotYXJjaGl2ZXMgYXJlIGFscmVhZHkgc3RvcmVkIHRoaXMgd2F5LCBzbyBubyBmdXJ0aGVyIGFjdGlvbiBpcyByZXF1aXJlZC4gIElmCi15b3UgdXNlIHNvbWUgPHR0Pi50YXIuKno8L3R0PiBhcmNoaXZlcywgYmUgc3VyZSB0byBjb25maWd1cmUgeW91ciBleHRyYWN0aW5nCi10b29sIHRvIGNvbnZlcnQgdGhlIGxpbmUgZW5kaW5ncy4gIEZvciBleGFtcGxlLCB3aXRoIDxhCi1ocmVmPSJodHRwOi8vd3d3LndpbnppcC5jb20iPldpblppcDwvYT4sIHlvdSBzaG91bGQgYWN0aXZhdGUgdGhlIDxlbT5UQVIKLWZpbGUgc21hcnQgQ1IvTEYgQ29udmVyc2lvbjwvZW0+IG9wdGlvbi4gIEFsdGVybmF0aXZlbHksIHlvdSBtYXkgY29uc2lkZXIKLXVzaW5nIHRoZSA8dHQ+dW5peDJkb3M8L3R0PiBvciA8dHQ+dTJkPC90dD4gdXRpbGl0aWVzIHRoYXQgYXJlIGZsb2F0aW5nCi1hcm91bmQsIHdoaWNoIHNwZWNpZmljYWxseSBkZWFsIHdpdGggdGhpcyBwYXJ0aWN1bGFyIHByb2JsZW0uCi0KLTxwPkJ1aWxkIGRpcmVjdG9yaWVzIGFyZSBwbGFjZWQgaW4gdGhlIHRvcC1sZXZlbCA8dHQ+b2JqczwvdHQ+Ci1kaXJlY3RvcnkuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvaiBiL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qCmluZGV4IDUyMWU4NDcuLmQ2MWVlZWMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qCisrKyBiL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qCkBAIC0zNCw3NSArMzQsNDQgQEAKICAgICAgIDxQbGF0Zm9ybT54NjQ8L1BsYXRmb3JtPg0KICAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KICAgPC9JdGVtR3JvdXA+DQotICAgIDwhLS0NCi0gICAgU3dpdGNoIHRoZSBQbGF0Zm9ybVRvb2xzZXQgYmFzZWQgb24gdGhlIFZpc3VhbCBTdHVkaW8gVmVyc2lvbg0KLS0tPg0KLTxQcm9wZXJ0eUdyb3VwPg0KLSAgICA8IS0tIEFzc3VtZSBWaXN1YWwgU3R1ZGlvIDIwMTAgLyA0LjAgYXMgdGhlIGRlZmF1bHQgLS0+DQotICAgIDxWaXN1YWxTdHVkaW9WZXJzaW9uIENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICcnIj40LjA8L1Zpc3VhbFN0dWRpb1ZlcnNpb24+DQotPC9Qcm9wZXJ0eUdyb3VwPg0KLTwhLS0gVmlzdWFsIFN0dWRpbyAyMDEwICg0LjApIC0tPg0KLTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICc0LjAnIj4NCi0gICAgPFBsYXRmb3JtVG9vbHNldD52MTAwPC9QbGF0Zm9ybVRvb2xzZXQ+DQotPC9Qcm9wZXJ0eUdyb3VwPg0KLTwhLS0gVmlzdWFsIFN0dWRpbyAyMDEzICgxMi4wKSAtLT4NCi08UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKFZpc3VhbFN0dWRpb1ZlcnNpb24pJyA9PSAnMTIuMCciPg0KLSAgICA8UGxhdGZvcm1Ub29sc2V0PnYxMjA8L1BsYXRmb3JtVG9vbHNldD4NCi08L1Byb3BlcnR5R3JvdXA+DQotPCEtLSBWaXN1YWwgU3R1ZGlvIDIwMTUgKDE0LjApIC0tPg0KLTxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoVmlzdWFsU3R1ZGlvVmVyc2lvbiknID09ICcxNC4wJyI+DQotICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djE0MDwvUGxhdGZvcm1Ub29sc2V0Pg0KLTwvUHJvcGVydHlHcm91cD4NCi08IS0tIFZpc3VhbCBTdHVkaW8gMjAxNyAoMTUuMCkgLS0+DQotPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChWaXN1YWxTdHVkaW9WZXJzaW9uKScgPT0gJzE1LjAnIj4NCi0gICAgPFBsYXRmb3JtVG9vbHNldD52MTQxPC9QbGF0Zm9ybVRvb2xzZXQ+DQotPC9Qcm9wZXJ0eUdyb3VwPg0KLTwhLS0NCi0gICAgRW5kIG9mOiBTd2l0Y2ggdGhlIFBsYXRmb3JtVG9vbHNldCBiYXNlZCBvbiB0aGUgVmlzdWFsIFN0dWRpbyBWZXJzaW9uDQotLS0+DQogICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQotICAgICA8UHJvamVjdEd1aWQ+ezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn08L1Byb2plY3RHdWlkPg0KLSAgICAgPFJvb3ROYW1lc3BhY2U+RnJlZVR5cGU8L1Jvb3ROYW1lc3BhY2U+DQorICAgIDxQcm9qZWN0R3VpZD57NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfTwvUHJvamVjdEd1aWQ+DQorICAgIDxSb290TmFtZXNwYWNlPkZyZWVUeXBlPC9Sb290TmFtZXNwYWNlPg0KICAgPC9Qcm9wZXJ0eUdyb3VwPg0KICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAuRGVmYXVsdC5wcm9wcyIgLz4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJQbGF0Zm9ybVRvb2xzZXQiPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PiQoRGVmYXVsdFBsYXRmb3JtVG9vbHNldCk8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCiAgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQogICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KICAgPC9Qcm9wZXJ0eUdyb3VwPg0KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQogICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KICAgPC9Qcm9wZXJ0eUdyb3VwPg0KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1ZyBTdGF0aWN8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCiAgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQogICA8L1Byb3BlcnR5R3JvdXA+DQogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnIFN0YXRpY3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCiAgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQogICA8L1Byb3BlcnR5R3JvdXA+DQogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQogICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KICAgPC9Qcm9wZXJ0eUdyb3VwPg0KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfHg2NCciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCiAgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCiAgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQogICA8L1Byb3BlcnR5R3JvdXA+DQogICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2UgU3RhdGljfFdpbjMyJyIgTGFiZWw9IkNvbmZpZ3VyYXRpb24iPg0KICAgICA8Q29uZmlndXJhdGlvblR5cGU+U3RhdGljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQotICAgIDxVc2VPZk1mYz5mYWxzZTwvVXNlT2ZNZmM+DQogICAgIDxDaGFyYWN0ZXJTZXQ+VW5pY29kZTwvQ2hhcmFjdGVyU2V0Pg0KICAgPC9Qcm9wZXJ0eUdyb3VwPg0KICAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlIFN0YXRpY3x4NjQnIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQogICAgIDxDb25maWd1cmF0aW9uVHlwZT5TdGF0aWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCi0gICAgPFVzZU9mTWZjPmZhbHNlPC9Vc2VPZk1mYz4NCiAgICAgPENoYXJhY3RlclNldD5Vbmljb2RlPC9DaGFyYWN0ZXJTZXQ+DQogICA8L1Byb3BlcnR5R3JvdXA+DQogICA8SW1wb3J0IFByb2plY3Q9IiQoVkNUYXJnZXRzUGF0aClcTWljcm9zb2Z0LkNwcC5wcm9wcyIgLz4NCkBAIC0xMjEsNyArOTAsNyBAQAogICAgIDxDbENvbXBpbGU+DQogICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KICAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPiQoVXNlck9wdGlvbkRpcmVjdG9yeSk7Li5cLi5cLi5caW5jbHVkZTskKFVzZXJJbmNsdWRlRGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7X0RFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7RExMX0VYUE9SVDskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQogICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5FbmFibGVGYXN0Q2hlY2tzPC9CYXNpY1J1bnRpbWVDaGVja3M+DQogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1Z0RMTDwvUnVudGltZUxpYnJhcnk+DQogICAgICAgPERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+dHJ1ZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCkBAIC0xMzAsMTYgKzk5LDE0IEBACiAgICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCiAgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQogICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCiAgICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+JChPdXREaXIpJChUYXJnZXROYW1lKS5wZGI8L1Byb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EaXNhYmxlZDwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQogICAgIDwvQ2xDb21waWxlPg0KICAgICA8UmVzb3VyY2VDb21waWxlPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5fREVCVUc7X0RMTDskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRztETExfRVhQT1JUOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCiAgICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQogICAgIDwvUmVzb3VyY2VDb21waWxlPg0KICAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KICAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQogICAgICAgPEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+JChVc2VyTGlicmFyeURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPg0KICAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPiQoVXNlckRlcGVuZGVuY2llcyk7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCkBAIC0xNDksNyArMTE2LDcgQEAKICAgICA8Q2xDb21waWxlPg0KICAgICAgIDxPcHRpbWl6YXRpb24+RGlzYWJsZWQ8L09wdGltaXphdGlvbj4NCiAgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO19ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO0RMTF9FWFBPUlQ7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxCYXNpY1J1bnRpbWVDaGVja3M+RW5hYmxlRmFzdENoZWNrczwvQmFzaWNSdW50aW1lQ2hlY2tzPg0KICAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRGVidWdETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KICAgICAgIDxEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPnRydWU8L0Rpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+DQpAQCAtMTU4LDE2ICsxMjUsMTQgQEAKICAgICAgIDxDb21waWxlQXM+RGVmYXVsdDwvQ29tcGlsZUFzPg0KICAgICAgIDxEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz40MDAxPC9EaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz4NCiAgICAgICA8TXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj50cnVlPC9NdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPg0KLSAgICAgIDxDb21waWxlQXNNYW5hZ2VkPmZhbHNlPC9Db21waWxlQXNNYW5hZ2VkPg0KICAgICAgIDxQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4kKE91dERpcikkKFRhcmdldE5hbWUpLnBkYjwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQogICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkRpc2FibGVkPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCiAgICAgPC9DbENvbXBpbGU+DQogICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPl9ERUJVRztfRExMOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+X0RFQlVHO0RMTF9FWFBPUlQ7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCiAgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KQEAgLTE4Niw3ICsxNTEsNiBAQAogICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQogICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KICAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoVGFyZ2V0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCiAgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+RGlzYWJsZWQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KICAgICA8L0NsQ29tcGlsZT4NCkBAIC0xOTUsNyArMTU5LDYgQEAKICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCiAgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KQEAgLTIxNCw3ICsxNzcsNiBAQAogICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQogICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KICAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQogICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPiQoT3V0RGlyKSQoVGFyZ2V0TmFtZSkucGRiPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCiAgICAgICA8SW5saW5lRnVuY3Rpb25FeHBhbnNpb24+RGlzYWJsZWQ8L0lubGluZUZ1bmN0aW9uRXhwYW5zaW9uPg0KICAgICA8L0NsQ29tcGlsZT4NCkBAIC0yMjMsNyArMTg1LDYgQEAKICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg2NDwvVGFyZ2V0TWFjaGluZT4NCiAgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+JChVc2VyRGVwZW5kZW5jaWVzKTslKEFkZGl0aW9uYWxEZXBlbmRlbmNpZXMpPC9BZGRpdGlvbmFsRGVwZW5kZW5jaWVzPg0KQEAgLTIzNCw4ICsxOTUsNyBAQAogICAgICAgPE9wdGltaXphdGlvbj5NYXhTcGVlZDwvT3B0aW1pemF0aW9uPg0KICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQogICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCi0gICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUMl9CVUlMRF9MSUJSQVJZO0RMTF9FWFBPUlQ7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxSdW50aW1lTGlicmFyeT5NdWx0aVRocmVhZGVkRExMPC9SdW50aW1lTGlicmFyeT4NCiAgICAgICA8RnVuY3Rpb25MZXZlbExpbmtpbmc+dHJ1ZTwvRnVuY3Rpb25MZXZlbExpbmtpbmc+DQogICAgICAgPERpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM+dHJ1ZTwvRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz4NCkBAIC0yNDMsMjYgKzIwMywxNCBAQAogICAgICAgPENvbXBpbGVBcz5EZWZhdWx0PC9Db21waWxlQXM+DQogICAgICAgPERpc2FibGVTcGVjaWZpY1dhcm5pbmdzPjQwMDE8L0Rpc2FibGVTcGVjaWZpY1dhcm5pbmdzPg0KICAgICAgIDxNdWx0aVByb2Nlc3NvckNvbXBpbGF0aW9uPnRydWU8L011bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+DQotICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KICAgICAgIDxFbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0PlN0cmVhbWluZ1NJTURFeHRlbnNpb25zMjwvRW5hYmxlRW5oYW5jZWRJbnN0cnVjdGlvblNldD4NCi0gICAgICA8RmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+ZmFsc2U8L0Zsb2F0aW5nUG9pbnRFeGNlcHRpb25zPg0KLSAgICAgIDxDcmVhdGVIb3RwYXRjaGFibGVJbWFnZT5mYWxzZTwvQ3JlYXRlSG90cGF0Y2hhYmxlSW1hZ2U+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQotICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+TmVpdGhlcjwvRmF2b3JTaXplT3JTcGVlZD4NCi0gICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQogICAgIDwvQ2xDb21waWxlPg0KICAgICA8UmVzb3VyY2VDb21waWxlPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7X0RMTDskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRztETExfRVhQT1JUOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCiAgICAgICA8Q3VsdHVyZT4weDA0MDk8L0N1bHR1cmU+DQogICAgIDwvUmVzb3VyY2VDb21waWxlPg0KICAgICA8TGliPg0KLSAgICAgIDxTdXBwcmVzc1N0YXJ0dXBCYW5uZXI+dHJ1ZTwvU3VwcHJlc3NTdGFydHVwQmFubmVyPg0KICAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPnRydWU8L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQogICAgICAgPFRhcmdldE1hY2hpbmU+TWFjaGluZVg4NjwvVGFyZ2V0TWFjaGluZT4NCiAgICAgICA8QWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4kKFVzZXJMaWJyYXJ5RGlyZWN0b3JpZXMpOyUoQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxMaWJyYXJ5RGlyZWN0b3JpZXM+DQpAQCAtMjc0LDggKzIyMiw3IEBACiAgICAgICA8T3B0aW1pemF0aW9uPk1heFNwZWVkPC9PcHRpbWl6YXRpb24+DQogICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCiAgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4kKFVzZXJPcHRpb25EaXJlY3RvcnkpOy4uXC4uXC4uXGluY2x1ZGU7JChVc2VySW5jbHVkZURpcmVjdG9yaWVzKTslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWTskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQotICAgICAgPFN0cmluZ1Bvb2xpbmc+dHJ1ZTwvU3RyaW5nUG9vbGluZz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7RExMX0VYUE9SVDskKFVzZXJEZWZpbmVzKTslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWRETEw8L1J1bnRpbWVMaWJyYXJ5Pg0KICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCiAgICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KQEAgLTI4MywyNiArMjMwLDE0IEBACiAgICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCiAgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQogICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQogICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8Q29tcGlsZUFzTWFuYWdlZD5mYWxzZTwvQ29tcGlsZUFzTWFuYWdlZD4NCi0gICAgICA8UHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPC9Qcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT4NCi0gICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KLSAgICAgIDxEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KLSAgICAgIDwvRGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCiAgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCi0gICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KLSAgICAgIDxPbWl0RnJhbWVQb2ludGVycz50cnVlPC9PbWl0RnJhbWVQb2ludGVycz4NCiAgICAgPC9DbENvbXBpbGU+DQogICAgIDxSZXNvdXJjZUNvbXBpbGU+DQotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPk5ERUJVRztfRExMOyQoVXNlckRlZmluZXMpOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+TkRFQlVHO0RMTF9FWFBPUlQ7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+dHJ1ZTwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCiAgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KICAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCkBAIC0zMTUsNyArMjUwLDYgQEAKICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQogICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCiAgICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KQEAgLTMyMywyNyArMjU3LDE0IEBACiAgICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCiAgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQogICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQogICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8UnVudGltZVR5cGVJbmZvPmZhbHNlPC9SdW50aW1lVHlwZUluZm8+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQotICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+TmVpdGhlcjwvRmF2b3JTaXplT3JTcGVlZD4NCi0gICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQogICAgIDwvQ2xDb21waWxlPg0KICAgICA8UmVzb3VyY2VDb21waWxlPg0KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+dHJ1ZTwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCiAgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KICAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCkBAIC0zNTYsNyArMjc3LDYgQEAKICAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5BbnlTdWl0YWJsZTwvSW5saW5lRnVuY3Rpb25FeHBhbnNpb24+DQogICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+JChVc2VyT3B0aW9uRGlyZWN0b3J5KTsuLlwuLlwuLlxpbmNsdWRlOyQoVXNlckluY2x1ZGVEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4NCiAgICAgICA8UHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+V0lOMzI7TkRFQlVHO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlk7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KLSAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQogICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KICAgICAgIDxGdW5jdGlvbkxldmVsTGlua2luZz50cnVlPC9GdW5jdGlvbkxldmVsTGlua2luZz4NCiAgICAgICA8RGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz50cnVlPC9EaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPg0KQEAgLTM2NCwyNyArMjg0LDE0IEBACiAgICAgICA8Q29tcGlsZUFzPkRlZmF1bHQ8L0NvbXBpbGVBcz4NCiAgICAgICA8RGlzYWJsZVNwZWNpZmljV2FybmluZ3M+NDAwMTwvRGlzYWJsZVNwZWNpZmljV2FybmluZ3M+DQogICAgICAgPE11bHRpUHJvY2Vzc29yQ29tcGlsYXRpb24+dHJ1ZTwvTXVsdGlQcm9jZXNzb3JDb21waWxhdGlvbj4NCi0gICAgICA8V2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPmZhbHNlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQogICAgICAgPEVuYWJsZUVuaGFuY2VkSW5zdHJ1Y3Rpb25TZXQ+U3RyZWFtaW5nU0lNREV4dGVuc2lvbnMyPC9FbmFibGVFbmhhbmNlZEluc3RydWN0aW9uU2V0Pg0KLSAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQotICAgICAgPENyZWF0ZUhvdHBhdGNoYWJsZUltYWdlPmZhbHNlPC9DcmVhdGVIb3RwYXRjaGFibGVJbWFnZT4NCi0gICAgICA8UnVudGltZVR5cGVJbmZvPmZhbHNlPC9SdW50aW1lVHlwZUluZm8+DQotICAgICAgPENvbXBpbGVBc01hbmFnZWQ+ZmFsc2U8L0NvbXBpbGVBc01hbmFnZWQ+DQotICAgICAgPFByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPg0KLSAgICAgIDwvUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU+DQotICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCi0gICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD4NCi0gICAgICA8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQogICAgICAgPEludHJpbnNpY0Z1bmN0aW9ucz50cnVlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQotICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+TmVpdGhlcjwvRmF2b3JTaXplT3JTcGVlZD4NCi0gICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQogICAgIDwvQ2xDb21waWxlPg0KICAgICA8UmVzb3VyY2VDb21waWxlPg0KICAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5OREVCVUc7JChVc2VyRGVmaW5lcyk7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KICAgICAgIDxDdWx0dXJlPjB4MDQwOTwvQ3VsdHVyZT4NCiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+DQogICAgIDxMaWI+DQotICAgICAgPFN1cHByZXNzU3RhcnR1cEJhbm5lcj50cnVlPC9TdXBwcmVzc1N0YXJ0dXBCYW5uZXI+DQogICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+dHJ1ZTwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCiAgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDY0PC9UYXJnZXRNYWNoaW5lPg0KICAgICAgIDxBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzPiQoVXNlckxpYnJhcnlEaXJlY3Rvcmllcyk7JShBZGRpdGlvbmFsTGlicmFyeURpcmVjdG9yaWVzKTwvQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz4NCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvai5maWx0ZXJzIGIvYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2ZyZWV0eXBlLnZjeHByb2ouZmlsdGVycwppbmRleCA4YmEzNjczLi4zNDVlMWYxIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMTAvZnJlZXR5cGUudmN4cHJvai5maWx0ZXJzCisrKyBiL2J1aWxkcy93aW5kb3dzL3ZjMjAxMC9mcmVldHlwZS52Y3hwcm9qLmZpbHRlcnMKQEAgLTEzMywyMyArMTMzLDggQEAKICAgICA8L0NsQ29tcGlsZT4NCiAgIDwvSXRlbUdyb3VwPg0KICAgPEl0ZW1Hcm91cD4NCi0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlwuLlwuLlxpbmNsdWRlXGZ0MmJ1aWxkLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0Y29uZmlnLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0aGVhZGVyLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0bW9kdWxlLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0b3B0aW9uLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgiPg0KLSAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQotICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8UmVzb3VyY2VDb21waWxlIEluY2x1ZGU9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dmVyLnJjIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCiAgIDwvSXRlbUdyb3VwPg0KLTwvUHJvamVjdD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmMyMDEwL2luZGV4Lmh0bWwgYi9idWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbAppbmRleCBjM2U2MDQwLi4zYjYwYzVmIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbAorKysgYi9idWlsZHMvd2luZG93cy92YzIwMTAvaW5kZXguaHRtbApAQCAtMTIsNyArMTIsNyBAQAogPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc29sdXRpb24gYW5kIHByb2plY3QgZmlsZXMgZm9yCiBWaXN1YWwmbmJzcDtDKysmbmJzcDsyMDEwIG9yIG5ld2VyLCBuYW1lZCA8dHQ+ZnJlZXR5cGUuc2xuPC90dD4sCiBhbmQgPHR0PmZyZWV0eXBlLnZjeHByb2o8L3R0Pi4gIEl0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzCi1mcm9tIHRoZSBGcmVlVHlwZSAyLjkuMSBzb3VyY2VzOjwvcD4KK2Zyb20gdGhlIEZyZWVUeXBlIDIuMTAuNCBzb3VyY2VzOjwvcD4KIAogPHVsPgogICA8bGk+ZnJlZXR5cGUuZGxsIHVzaW5nICdSZWxlYXNlJyBvciAnRGVidWcnIGNvbmZpZ3VyYXRpb25zPC9saT4KQEAgLTMwLDEwICszMCwxMCBAQAogPHA+VG8gY29uZmlndXJlIGxpYnJhcnkgZGVwZW5kZW5jaWVzIGxpa2UgPGVtPnpsaWI8L2VtPiBhbmQgPGVtPmxpYnBuZzwvZW0+LAogZWRpdCB0aGUgPHR0PmZyZWV0eXBlLnVzZXJzLnByb3BzPC90dD4gZmlsZSBpbiB0aGlzIGRpcmVjdG9yeS4gIEl0IGFsc28KIHNpbXBsaWZpZXMgYXV0b21hdGVkIChjb21tYW5kLWxpbmUpIGJ1aWxkcyB1c2luZyA8YQotaHJlZj0iaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RkMzkzNTc0JTI4dj12cy4xMDAlMjkuYXNweCI+bXNidWlsZDwvYT4uPC9wPgoraHJlZj0iaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZDM5MzU3NCUyOHY9dnMuMTAwJTI5LmFzcHgiPm1zYnVpbGQ8L2E+LjwvcD4KIAogPHA+VG8gbGluayB5b3VyIGV4ZWN1dGFibGUgd2l0aCBGcmVlVHlwZSBETEwsIHlvdSBtYXkgd2FudCB0byBkZWZpbmUKLUZUMl9ETExJTVBPUlQgc28gdGhhdCB0aGUgaW1wb3J0ZWQgZnVuY3Rpb25zIGFyZSBhcHByb3ByaWF0ZWx5CitETExfSU1QT1JUIHNvIHRoYXQgdGhlIGltcG9ydGVkIGZ1bmN0aW9ucyBhcmUgYXBwcm9wcmlhdGVseQogYXR0cmlidXRlZCB3aXRoIDx0dD5kbGxpbXBvcnQ8dHQ+LjwvcD4KIAogPC9ib2R5PgpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS5kc3AgYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcAppbmRleCBkYWMzZDI1Li4wMjhkZDdiIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcAorKysgYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLmRzcApAQCAtMiw5ICsyLDEwIEBACiAjIE1pY3Jvc29mdCBEZXZlbG9wZXIgU3R1ZGlvIEdlbmVyYXRlZCBCdWlsZCBGaWxlLCBGb3JtYXQgVmVyc2lvbiA2LjAwDQogIyAqKiBETyBOT1QgRURJVCAqKg0KIA0KKyMgVEFSR1RZUEUgIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IiAweDAxMDINCiAjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0DQogDQotQ0ZHPWZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQNCitDRkc9ZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlDQogIU1FU1NBR0UgVGhpcyBpcyBub3QgYSB2YWxpZCBtYWtlZmlsZS4gVG8gYnVpbGQgdGhpcyBwcm9qZWN0IHVzaW5nIE5NQUtFLA0KICFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bg0KICFNRVNTQUdFDQpAQCAtMTMsMjQgKzE0LDIwIEBACiAhTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQ0KICFNRVNTQUdFIGJ5IGRlZmluaW5nIHRoZSBtYWNybyBDRkcgb24gdGhlIGNvbW1hbmQgbGluZS4gRm9yIGV4YW1wbGU6DQogIU1FU1NBR0UNCi0hTUVTU0FHRSBOTUFLRSAvZiAiZnJlZXR5cGUubWFrIiBDRkc9ImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQiDQorIU1FU1NBR0UgTk1BS0UgL2YgImZyZWV0eXBlLm1hayIgQ0ZHPSJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiDQogIU1FU1NBR0UNCiAhTUVTU0FHRSBQb3NzaWJsZSBjaG9pY2VzIGZvciBjb25maWd1cmF0aW9uIGFyZToNCiAhTUVTU0FHRQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCi0hTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIE11bHRpdGhyZWFkZWQiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KLSFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikNCishTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIER5bmFtaWMtTGluayBMaWJyYXJ5IikNCishTUVTU0FHRSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBEeW5hbWljLUxpbmsgTGlicmFyeSIpDQorIU1FU1NBR0UgImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBTdGF0aWMiIChiYXNlZCBvbiAiV2luMzIgKHg4NikgU3RhdGljIExpYnJhcnkiKQ0KKyFNRVNTQUdFICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFN0YXRpYyIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpDQogIU1FU1NBR0UNCiANCiAjIEJlZ2luIFByb2plY3QNCiAjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMA0KICMgUFJPUCBTY2NfUHJvak5hbWUgIiINCiAjIFBST1AgU2NjX0xvY2FsUGF0aCAiIg0KLUNQUD1jbC5leGUNCi1SU0M9cmMuZXhlDQogDQogIUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIg0KIA0KQEAgLTQxLDIwICszOCwyNyBAQAogIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KICMgUFJPUCBVc2VfTUZDIDANCiAjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNccmVsZWFzZSINCi0jIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlIg0KKyMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXFdpbjMyXFJlbGVhc2UiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcUmVsZWFzZSINCisjIFBST1AgSWdub3JlX0V4cG9ydF9MaWIgMA0KICMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dYIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL2MNCi0jIEFERCBDUFAgL01EIC9aYSAvVzQgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlQyX0JVSUxEX0xJQlJBUlkiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1o8bm9uZT4gL1lYDQorQ1BQPWNsLmV4ZQ0KKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL01EIC9XMyAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRkQgL2MNCisjIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1DQorIyBBREQgQ1BQIC9ub2xvZ28gL1phIC9NRCAvVzMgL08yIC9PaSAvRCAiV0lOMzIiIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiIC9EICJOREVCVUciIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0QgIkRMTF9FWFBPUlQiIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorTVRMPW1pZGwuZXhlDQorIyBBREQgQkFTRSBNVEwgL25vbG9nbyAvRCAiTkRFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorIyBBREQgTVRMIC9ub2xvZ28gL0QgIk5ERUJVRyIgL21rdHlwbGliMjAzIC93aW4zMg0KK1JTQz1yYy5leGUNCiAjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIiAvZCAiRExMX0VYUE9SVCINCiBCU0MzMj1ic2NtYWtlLmV4ZQ0KICMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KICMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxLmxpYiINCitMSU5LMzI9bGluay5leGUNCisjIEFERCBCQVNFIExJTkszMiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4Ng0KKyMgQUREIExJTkszMiAvbm9sb2dvIC9kbGwgL21hY2hpbmU6STM4NiAvb3V0OiIkKE91dERpcilcZnJlZXR5cGUuZGxsIg0KIA0KICFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIg0KIA0KQEAgLTY1LDEyICs2OSw3MyBAQAogIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KICMgUFJPUCBVc2VfTUZDIDANCiAjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWciDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWciDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcRGVidWciDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcRGVidWciDQorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDANCiAjIFBST1AgVGFyZ2V0X0RpciAiIg0KLSMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HbSAvR1ggL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9ZWCAvRkQgL0daIC9jDQotIyBBREQgQ1BQIC9NRGQgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCitDUFA9Y2wuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9XMyAvR20gL1pJIC9PZCAvRCAiV0lOMzIiIC9EICJfREVCVUciIC9GRCAvR1ogL2MNCisjIFNVQlRSQUNUIEJBU0UgQ1BQIC9ZWCAvWWMgL1l1DQorIyBBREQgQ1BQIC9ub2xvZ28gL1phIC9NRGQgL1czIC9HbSAvWkkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiV0lOMzIiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJGVDJfQlVJTERfTElCUkFSWSIgL0QgIkRMTF9FWFBPUlQiIC9GUiAvRkQgL0daIC9jDQorIyBTVUJUUkFDVCBDUFAgL1lYIC9ZYyAvWXUNCitNVEw9bWlkbC5leGUNCisjIEFERCBCQVNFIE1UTCAvbm9sb2dvIC9EICJfREVCVUciIC9ta3R5cGxpYjIwMyAvd2luMzINCisjIEFERCBNVEwgL25vbG9nbyAvRCAiX0RFQlVHIiAvbWt0eXBsaWIyMDMgL3dpbjMyDQorUlNDPXJjLmV4ZQ0KKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciIC9kICJETExfRVhQT1JUIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJTkszMj1saW5rLmV4ZQ0KKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvcGRidHlwZTpzZXB0DQorIyBBREQgTElOSzMyIC9ub2xvZ28gL2RsbCAvZGVidWcgL21hY2hpbmU6STM4NiAvb3V0OiIkKE91dERpcilcZnJlZXR5cGUuZGxsIiAvcGRidHlwZTpzZXB0DQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgUmVsZWFzZSBTdGF0aWMiDQorDQorIyBQUk9QIEJBU0UgVXNlX01GQyAwDQorIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSBTdGF0aWMiDQorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSBTdGF0aWMiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcUmVsZWFzZSBTdGF0aWMiDQorIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcUmVsZWFzZSBTdGF0aWMiDQorIyBQUk9QIFRhcmdldF9EaXIgIiINCitDUFA9Y2wuZXhlDQorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTUQgL1czIC9PMiAvRCAiV0lOMzIiIC9EICJOREVCVUciIC9GRCAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUNCisjIEFERCBDUFAgL25vbG9nbyAvWmEgL01EIC9XMyAvTzIgL09pIC9EICJXSU4zMiIgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIgL0QgIk5ERUJVRyIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL2MNCisjIFNVQlRSQUNUIENQUCAvWVggL1ljIC9ZdQ0KK1JTQz1yYy5leGUNCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KKyMgQUREIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIg0KK0JTQzMyPWJzY21ha2UuZXhlDQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQorIyBBREQgQlNDMzIgL25vbG9nbw0KK0xJQjMyPWxpbmsuZXhlIC1saWINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28NCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6IiQoT3V0RGlyKVxmcmVldHlwZS5saWIiDQorDQorIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU3RhdGljIg0KKw0KKyMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIFN0YXRpYyINCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyBTdGF0aWMiDQorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KKyMgUFJPUCBVc2VfTUZDIDANCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQorIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcV2luMzJcRGVidWcgU3RhdGljIg0KKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXFdpbjMyXERlYnVnIFN0YXRpYyINCisjIFBST1AgVGFyZ2V0X0RpciAiIg0KK0NQUD1jbC5leGUNCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRGQgL1czIC9HbSAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0ZEIC9HWiAvYw0KKyMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYIC9ZYyAvWXUNCisjIEFERCBDUFAgL25vbG9nbyAvWmEgL01EZCAvVzMgL0dtIC9aSSAvT2QgL0kgIi4uXC4uXC4uXGluY2x1ZGUiIC9EICJXSU4zMiIgL0QgIl9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiAvRCAiX0RFQlVHIiAvRCAiRlRfREVCVUdfTEVWRUxfRVJST1IiIC9EICJGVF9ERUJVR19MRVZFTF9UUkFDRSIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRlIgL0ZEIC9HWiAvYw0KKyMgU1VCVFJBQ1QgQ1BQIC9ZWCAvWWMgL1l1DQorUlNDPXJjLmV4ZQ0KICMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQogIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciDQogQlNDMzI9YnNjbWFrZS5leGUNCkBAIC03OCwxMDcgKzE0Myw3IEBACiAjIEFERCBCU0MzMiAvbm9sb2dvDQogTElCMzI9bGluay5leGUgLWxpYg0KICMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MV9ELmxpYiINCi0NCi0hRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIg0KLQ0KLSMgUFJPUCBCQVNFIFVzZV9NRkMgMA0KLSMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBCQVNFIE91dHB1dF9EaXIgImZyZWV0eXBlX19fV2luMzJfRGVidWdfTXVsdGl0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJmcmVldHlwZV9fX1dpbjMyX0RlYnVnX011bHRpdGhyZWFkZWQiDQotIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIg0KLSMgUFJPUCBVc2VfTUZDIDANCi0jIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIE91dHB1dF9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotIyBQUk9QIEludGVybWVkaWF0ZV9EaXIgIi4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9aYSAvVzMgL0dtIC9HWCAvWkkgL09kIC9JICIuLlxpbmNsdWRlXFwiIC9EICJfREVCVUciIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUX0ZMQVRfQ09NUElMRSIgL1lYIC9GRCAvR1ogL2MNCi0jIFNVQlRSQUNUIEJBU0UgQ1BQIC9YDQotIyBBREQgQ1BQIC9NVGQgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoibGliXGZyZWV0eXBlMjkxX0QubGliIg0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1UX0QubGliIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgTXVsdGl0aHJlYWRlZCINCi0NCi0jIFBST1AgQkFTRSBVc2VfTUZDIDANCi0jIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgQkFTRSBPdXRwdXRfRGlyICJmcmVldHlwZV9fX1dpbjMyX1JlbGVhc2VfTXVsdGl0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJmcmVldHlwZV9fX1dpbjMyX1JlbGVhc2VfTXVsdGl0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9aYSAvVzMgL0dYIC9PMiAvSSAiLi5caW5jbHVkZVxcIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVF9GTEFUX0NPTVBJTEUiIC9ZWCAvRkQgL2MNCi0jIEFERCBDUFAgL01UIC9aYSAvVzQgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlQyX0JVSUxEX0xJQlJBUlkiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1o8bm9uZT4gL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6ImxpYlxmcmVldHlwZTI5MS5saWIiDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxTVQubGliIg0KLQ0KLSFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAwDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZnJlZXR5cGVfX19XaW4zMl9SZWxlYXNlX1NpbmdsZXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgImZyZWV0eXBlX19fV2luMzJfUmVsZWFzZV9TaW5nbGV0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiDQotIyBQUk9QIFVzZV9NRkMgMA0KLSMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDANCi0jIFBST1AgT3V0cHV0X0RpciAiLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX3N0Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiDQotIyBQUk9QIFRhcmdldF9EaXIgIiINCi0jIEFERCBCQVNFIENQUCAvbm9sb2dvIC9NRCAvWmEgL1c0IC9HWCAvWmkgL08yIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiTkRFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQkFTRSBDUFAgL1lYDQotIyBBREQgQ1BQIC9aYSAvVzQgL0dYIC9PMiAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIk5ERUJVRyIgL0QgIldJTjMyIiAvRCAiX01CQ1MiIC9EICJfTElCIiAvRCAiRlQyX0JVSUxEX0xJQlJBUlkiIC9GRCAvYw0KLSMgU1VCVFJBQ1QgQ1BQIC9ub2xvZ28gL1o8bm9uZT4gL1lYDQotIyBBREQgQkFTRSBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi0jIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyINCi1CU0MzMj1ic2NtYWtlLmV4ZQ0KLSMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KLSMgQUREIEJTQzMyIC9ub2xvZ28NCi1MSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTEubGliIg0KLSMgQUREIExJQjMyIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQotIyBTVUJUUkFDVCBMSUIzMiAvbm9sb2dvDQotDQotIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU2luZ2xldGhyZWFkZWQiDQotDQotIyBQUk9QIEJBU0UgVXNlX01GQyAwDQotIyBQUk9QIEJBU0UgVXNlX0RlYnVnX0xpYnJhcmllcyAxDQotIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiZnJlZXR5cGVfX19XaW4zMl9EZWJ1Z19TaW5nbGV0aHJlYWRlZCINCi0jIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJmcmVldHlwZV9fX1dpbjMyX0RlYnVnX1NpbmdsZXRocmVhZGVkIg0KLSMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiINCi0jIFBST1AgVXNlX01GQyAwDQotIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQ0KLSMgUFJPUCBPdXRwdXRfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLSMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICIuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLSMgUFJPUCBUYXJnZXRfRGlyICIiDQotIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvTURkIC9aYSAvVzQgL0dtIC9HWCAvWmkgL09kIC9JICIuLlwuLlwuLlxpbmNsdWRlIiAvRCAiX0RFQlVHIiAvRCAiV0lOMzIiIC9EICJfTUJDUyIgL0QgIl9MSUIiIC9EICJGVF9ERUJVR19MRVZFTF9FUlJPUiIgL0QgIkZUX0RFQlVHX0xFVkVMX1RSQUNFIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBCQVNFIENQUCAvWCAvWVgNCi0jIEFERCBDUFAgL1phIC9XNCAvR1ggL1o3IC9PZCAvSSAiLi5cLi5cLi5caW5jbHVkZSIgL0QgIl9ERUJVRyIgL0QgIkZUX0RFQlVHX0xFVkVMX0VSUk9SIiAvRCAiRlRfREVCVUdfTEVWRUxfVFJBQ0UiIC9EICJXSU4zMiIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL0QgIkZUMl9CVUlMRF9MSUJSQVJZIiAvRkQgL0daIC9jDQotIyBTVUJUUkFDVCBDUFAgL25vbG9nbyAvWCAvWVgNCi0jIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLSMgQUREIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIg0KLUJTQzMyPWJzY21ha2UuZXhlDQotIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQotIyBBREQgQlNDMzIgL25vbG9nbw0KLUxJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MV9ELmxpYiINCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVF9ELmxpYiINCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6IiQoT3V0RGlyKVxmcmVldHlwZS5saWIiDQogDQogIUVORElGDQogDQpAQCAtMTg2LDEwICsxNTEsOCBAQAogDQogIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UiDQogIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIg0KLSMgTmFtZSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBNdWx0aXRocmVhZGVkIg0KLSMgTmFtZSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIE11bHRpdGhyZWFkZWQiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgU2luZ2xldGhyZWFkZWQiDQotIyBOYW1lICJmcmVldHlwZSAtIFdpbjMyIERlYnVnIFNpbmdsZXRocmVhZGVkIg0KKyMgTmFtZSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIFN0YXRpYyINCisjIE5hbWUgImZyZWV0eXBlIC0gV2luMzIgRGVidWcgU3RhdGljIg0KICMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyINCiANCiAjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImNwcDtjO2N4eDtyYztkZWY7cjtvZGw7aWRsO2hwajtiYXQiDQpAQCAtMzc5LDUgKzM0MiwxMyBAQAogU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgNCiAjIEVuZCBTb3VyY2UgRmlsZQ0KICMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0dmVyLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KICMgRW5kIFRhcmdldA0KICMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnNsbiBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuc2xuCmluZGV4IDFmNjRiZTIuLjkwNTRkMGEgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuc2xuCisrKyBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvZnJlZXR5cGUuc2xuCkBAIC0xLDI3ICsxLDIxIEBACi1NaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA5LjAwDQotIyBWaXN1YWwgU3R1ZGlvIDIwMDUNCitNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTb2x1dGlvbiBGaWxlLCBGb3JtYXQgVmVyc2lvbiA3LjAwDQorIyBWaXN1YWwgQysrIDIwMDItMjAwOA0KIFByb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiZnJlZXR5cGUiLCAiZnJlZXR5cGUudmNwcm9qIiwgIns3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KIEVuZFByb2plY3QNCiBHbG9iYWwNCiAJR2xvYmFsU2VjdGlvbihTb2x1dGlvbkNvbmZpZ3VyYXRpb25QbGF0Zm9ybXMpID0gcHJlU29sdXRpb24NCi0JCURlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIgPSBEZWJ1ZyBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQlEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IERlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyDQorCQlEZWJ1ZyBTdGF0aWN8V2luMzIgPSBEZWJ1ZyBTdGF0aWN8V2luMzINCiAJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzINCi0JCVJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMiA9IFJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJUmVsZWFzZSBTaW5nbGV0aHJlYWRlZHxXaW4zMiA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCisJCVJlbGVhc2UgU3RhdGljfFdpbjMyID0gUmVsZWFzZSBTdGF0aWN8V2luMzINCiAJCVJlbGVhc2V8V2luMzIgPSBSZWxlYXNlfFdpbjMyDQogCUVuZEdsb2JhbFNlY3Rpb24NCiAJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gRGVidWcgTXVsdGl0aHJlYWRlZHxXaW4zMg0KLQkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWcgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBTaW5nbGV0aHJlYWRlZHxXaW4zMg0KKwkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgU3RhdGljfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnIFN0YXRpY3xXaW4zMg0KKwkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uRGVidWcgU3RhdGljfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1ZyBTdGF0aWN8V2luMzINCiAJCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LkRlYnVnfFdpbjMyLkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQogCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5EZWJ1Z3xXaW4zMi5CdWlsZC4wID0gRGVidWd8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMi5BY3RpdmVDZmcgPSBSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgTXVsdGl0aHJlYWRlZHxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBNdWx0aXRocmVhZGVkfFdpbjMyDQotCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCi0JCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzIuQnVpbGQuMCA9IFJlbGVhc2UgU2luZ2xldGhyZWFkZWR8V2luMzINCisJCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2UgU3RhdGljfFdpbjMyLkFjdGl2ZUNmZyA9IFJlbGVhc2UgU3RhdGljfFdpbjMyDQorCQl7NzhCMDc5QkQtOUZDNy00QjlFLUI0QTYtOTZEQTBGMDAyNDhCfS5SZWxlYXNlIFN0YXRpY3xXaW4zMi5CdWlsZC4wID0gUmVsZWFzZSBTdGF0aWN8V2luMzINCiAJCXs3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KIAkJezc4QjA3OUJELTlGQzctNEI5RS1CNEE2LTk2REEwRjAwMjQ4Qn0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KIAlFbmRHbG9iYWxTZWN0aW9uDQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9mcmVldHlwZS52Y3Byb2ogYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvagppbmRleCBkZDBjNDE4Li5lY2I1YjA1IDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvagorKysgYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2ZyZWV0eXBlLnZjcHJvagpAQCAtMSw3ICsxLDYgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/Pg0KIDxWaXN1YWxTdHVkaW9Qcm9qZWN0DQogCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIg0KLQlWZXJzaW9uPSI4LjAwIg0KIAlOYW1lPSJmcmVldHlwZSINCiAJUHJvamVjdEdVSUQ9Ins3OEIwNzlCRC05RkM3LTRCOUUtQjRBNi05NkRBMEYwMDI0OEJ9Ig0KIAk+DQpAQCAtMTUsMTMgKzE0LDEyIEBACiAJPENvbmZpZ3VyYXRpb25zPg0KIAkJPENvbmZpZ3VyYXRpb24NCiAJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZSINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuLlwuLlwuLlxvYmpzXCQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVwiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuLlwuLlwuLlxvYmpzXCQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVwiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQogCQkJVXNlT2ZNRkM9IjAiDQogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQogCQkJPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQpAQCAtNDIsNDAgKzQwLDM5IEBACiAJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCiAJCQkJT3B0aW1pemF0aW9uPSIyIg0KIAkJCQlJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj0iMSINCisJCQkJRW5hYmxlSW50cmluc2ljRnVuY3Rpb25zPSJ0cnVlIg0KIAkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7V0lOMzI7X0xJQjtfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUztGVDJfQlVJTERfTElCUkFSWTtETExfRVhQT1JUIg0KIAkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIg0KIAkJCQlSdW50aW1lTGlicmFyeT0iMiINCiAJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiDQogCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvZnJlZXR5cGUucGNoIg0KLQkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlLyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2UvIg0KIAkJCQlXYXJuaW5nTGV2ZWw9IjQiDQogCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjAiDQogCQkJCUNvbXBpbGVBcz0iMCINCisJCQkJRGlzYWJsZVNwZWNpZmljV2FybmluZ3M9IjQwMDEiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciDQorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUc7RExMX0VYUE9SVCINCiAJCQkJQ3VsdHVyZT0iMTAzMyINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCINCiAJCQkvPg0KIAkJCTxUb29sDQotCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQogCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTg1LDE4ICs4MiwyMCBAQAogCQkJCU5hbWU9IlZDRnhDb3BUb29sIg0KIAkJCS8+DQogCQkJPFRvb2wNCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiDQorCQkJLz4NCisJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCiAJCQkvPg0KIAkJPC9Db25maWd1cmF0aW9uPg0KIAkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdCINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xyZWxlYXNlX210Ig0KKwkJCU5hbWU9IlJlbGVhc2UgU3RhdGljfFdpbjMyIg0KKwkJCU91dHB1dERpcmVjdG9yeT0iLi5cLi5cLi5cb2Jqc1wkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSlcIg0KKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLi5cLi5cLi5cb2Jqc1wkKFBsYXRmb3JtTmFtZSlcJChDb25maWd1cmF0aW9uTmFtZSlcIg0KIAkJCUNvbmZpZ3VyYXRpb25UeXBlPSI0Ig0KLQkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyINCiAJCQlVc2VPZk1GQz0iMCINCiAJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiDQotCQkJQ2hhcmFjdGVyU2V0PSIyIg0KKwkJCUNoYXJhY3RlclNldD0iMSINCiAJCQk+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCkBAIC0xMTcsMTkgKzExNiwxNyBAQAogCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQogCQkJCU9wdGltaXphdGlvbj0iMiINCiAJCQkJSW5saW5lRnVuY3Rpb25FeHBhbnNpb249IjEiDQorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSINCiAJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5caW5jbHVkZSINCi0JCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRztXSU4zMjtfTElCO0ZUMl9CVUlMRF9MSUJSQVJZIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7X0NSVF9TRUNVUkVfTk9fV0FSTklOR1M7RlQyX0JVSUxEX0xJQlJBUlkiDQogCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQogCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KIAkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCiAJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2VfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9tdC8iDQogCQkJCVdhcm5pbmdMZXZlbD0iNCINCiAJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCiAJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDAwMSINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KQEAgLTE0NCw4MiArMTQxLDYgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxTVQubGliIg0KLQkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNGeENvcFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJPC9Db25maWd1cmF0aW9uPg0KLQkJPENvbmZpZ3VyYXRpb24NCi0JCQlOYW1lPSJSZWxlYXNlIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdCINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQotCQkJVXNlT2ZNRkM9IjAiDQotCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCi0JCQk+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDTUlETFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KLQkJCQlPcHRpbWl6YXRpb249IjIiDQotCQkJCUlubGluZUZ1bmN0aW9uRXhwYW5zaW9uPSIxIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHO1dJTjMyO19MSUI7RlQyX0JVSUxEX0xJQlJBUlkiDQotCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiDQotCQkJCVJ1bnRpbWVMaWJyYXJ5PSIwIg0KLQkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSINCi0JCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSINCi0JCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXHJlbGVhc2Vfc3QvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXC4uXC4uXC4uXG9ianNccmVsZWFzZV9zdC8iDQotCQkJCVdhcm5pbmdMZXZlbD0iNCINCi0JCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMCINCi0JCQkJQ29tcGlsZUFzPSIwIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIg0KLQkJCQlDdWx0dXJlPSIxMDMzIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1QubGliIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQpAQCAtMjM5LDEzICsxNjAsMTIgQEAKIAkJPC9Db25maWd1cmF0aW9uPg0KIAkJPENvbmZpZ3VyYXRpb24NCiAJCQlOYW1lPSJEZWJ1Z3xXaW4zMiINCi0JCQlPdXRwdXREaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0JCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1ZyINCi0JCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQorCQkJT3V0cHV0RGlyZWN0b3J5PSIuLlwuLlwuLlxvYmpzXCQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVwiDQorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuLlwuLlwuLlxvYmpzXCQoUGxhdGZvcm1OYW1lKVwkKENvbmZpZ3VyYXRpb25OYW1lKVwiDQorCQkJQ29uZmlndXJhdGlvblR5cGU9IjIiDQogCQkJVXNlT2ZNRkM9IjAiDQogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQogCQkJPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQpAQCAtMjY2LDM4ICsxODYsMzYgQEAKIAkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KIAkJCQlPcHRpbWl6YXRpb249IjAiDQogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZO0RMTF9FWFBPUlQiDQogCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCiAJCQkJUnVudGltZUxpYnJhcnk9IjMiDQogCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnL2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWcvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnLyINCiAJCQkJV2FybmluZ0xldmVsPSI0Ig0KIAkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KIAkJCQlDb21waWxlQXM9IjAiDQorCQkJCURpc2FibGVTcGVjaWZpY1dhcm5pbmdzPSI0MDAxIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIg0KKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO0RMTF9FWFBPUlQiDQogCQkJCUN1bHR1cmU9IjEwMzMiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQogCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTMwNywxOCArMjI1LDIwIEBACiAJCQkJTmFtZT0iVkNGeENvcFRvb2wiDQogCQkJLz4NCiAJCQk8VG9vbA0KKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCINCisJCQkvPg0KKwkJCTxUb29sDQogCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KIAkJCS8+DQogCQk8L0NvbmZpZ3VyYXRpb24+DQogCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIFNpbmdsZXRocmVhZGVkfFdpbjMyIg0KLQkJCU91dHB1dERpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KLQkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0Ig0KKwkJCU5hbWU9IkRlYnVnIFN0YXRpY3xXaW4zMiINCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii4uXC4uXC4uXG9ianNcJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpXCINCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii4uXC4uXC4uXG9ianNcJChQbGF0Zm9ybU5hbWUpXCQoQ29uZmlndXJhdGlvbk5hbWUpXCINCiAJCQlDb25maWd1cmF0aW9uVHlwZT0iNCINCi0JCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiDQogCQkJVXNlT2ZNRkM9IjAiDQogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIg0KLQkJCUNoYXJhY3RlclNldD0iMiINCisJCQlDaGFyYWN0ZXJTZXQ9IjEiDQogCQkJPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQpAQCAtMzM5LDE3ICsyNTksMTQgQEAKIAkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KIAkJCQlPcHRpbWl6YXRpb249IjAiDQogCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXC4uXGluY2x1ZGUiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUc7V0lOMzI7X0xJQjtGVF9ERUJVR19MRVZFTF9FUlJPUjtGVF9ERUJVR19MRVZFTF9UUkFDRTtGVDJfQlVJTERfTElCUkFSWSINCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRztXSU4zMjtfTElCO19DUlRfU0VDVVJFX05PX1dBUk5JTkdTO0ZUX0RFQlVHX0xFVkVMX0VSUk9SO0ZUX0RFQlVHX0xFVkVMX1RSQUNFO0ZUMl9CVUlMRF9MSUJSQVJZIg0KIAkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiDQogCQkJCVJ1bnRpbWVMaWJyYXJ5PSIxIg0KIAkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIg0KLQkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC9mcmVldHlwZS5wY2giDQotCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJT2JqZWN0RmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX3N0LyINCi0JCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5cLi5cLi5cLi5cb2Jqc1xkZWJ1Z19zdC8iDQogCQkJCVdhcm5pbmdMZXZlbD0iNCINCiAJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyINCiAJCQkJQ29tcGlsZUFzPSIwIg0KKwkJCQlEaXNhYmxlU3BlY2lmaWNXYXJuaW5ncz0iNDAwMSINCiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIg0KQEAgLTM2NCw4MiArMjgxLDYgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQotCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQUxpbmtUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNYRENNYWtlVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIg0KLQkJCS8+DQotCQk8L0NvbmZpZ3VyYXRpb24+DQotCQk8Q29uZmlndXJhdGlvbg0KLQkJCU5hbWU9IkRlYnVnIE11bHRpdGhyZWFkZWR8V2luMzIiDQotCQkJT3V0cHV0RGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQiDQotCQkJQ29uZmlndXJhdGlvblR5cGU9IjQiDQotCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIg0KLQkJCVVzZU9mTUZDPSIwIg0KLQkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSINCi0JCQlDaGFyYWN0ZXJTZXQ9IjIiDQotCQkJPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01JRExUb29sIg0KLQkJCS8+DQotCQkJPFRvb2wNCi0JCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCi0JCQkJT3B0aW1pemF0aW9uPSIwIg0KLQkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlxpbmNsdWRlIg0KLQkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHO1dJTjMyO19MSUI7RlRfREVCVUdfTEVWRUxfRVJST1I7RlRfREVCVUdfTEVWRUxfVFJBQ0U7RlQyX0JVSUxEX0xJQlJBUlk7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIg0KLQkJCQlHZW5lcmF0ZVByZXByb2Nlc3NlZEZpbGU9IjAiDQotCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyINCi0JCQkJUnVudGltZUxpYnJhcnk9IjEiDQotCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiDQotCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210L2ZyZWV0eXBlLnBjaCINCi0JCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlPYmplY3RGaWxlPSIuXC4uXC4uXC4uXG9ianNcZGVidWdfbXQvIg0KLQkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlwuLlwuLlwuLlxvYmpzXGRlYnVnX210LyINCi0JCQkJV2FybmluZ0xldmVsPSI0Ig0KLQkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIg0KLQkJCQlDb21waWxlQXM9IjAiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCINCi0JCQkvPg0KLQkJCTxUb29sDQotCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiDQotCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciDQotCQkJCUN1bHR1cmU9IjEwMzMiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiDQotCQkJLz4NCi0JCQk8VG9vbA0KLQkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCi0JCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNBTGlua1Rvb2wiDQpAQCAtNDg2LDI2ICszMjcsNTIgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRmc3R5cGUuYyINCi0JCQkJPg0KLQkJCTwvRmlsZT4NCi0JCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2FzcC5jIg0KLQkJCQk+DQotCQkJPC9GaWxlPg0KLQkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGNhY2hlXGZ0Y2FjaGUuYyINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGZ0ZGVidWcuYyINCiAJCQkJPg0KLQkJCQk8RmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiINCisJCQkJCT4NCiAJCQkJCTxUb29sDQogCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCiAJCQkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJmYWxzZSINCiAJCQkJCS8+DQogCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZSBTdGF0aWN8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCQk8RmlsZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IkRlYnVnfFdpbjMyIg0KKwkJCQkJPg0KKwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9ImZhbHNlIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxlQ29uZmlndXJhdGlvbj4NCisJCQkJPEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJEZWJ1ZyBTdGF0aWN8V2luMzIiDQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0iZmFsc2UiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0ZnN0eXBlLmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdGdhc3AuYyINCisJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0Z2x5cGguYyINCkBAIC01NTEsMTAgKzQxOCwyMiBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIg0KKwkJCQkJPg0KKwkJCQk8L0ZpbGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0bW0uYyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdG90dmFsLmMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUNCisJCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRwYXRlbnQuYyINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBmci5jIg0KIAkJCQkJPg0KIAkJCQk8L0ZpbGU+DQpAQCAtNTcxLDE4ICs0NTAsNiBAQAogCQkJCQk+DQogCQkJCTwvRmlsZT4NCiAJCQkJPEZpbGUNCi0JCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnRneHZhbC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQotCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0b3R2YWwuYyINCi0JCQkJCT4NCi0JCQkJPC9GaWxlPg0KLQkJCQk8RmlsZQ0KLQkJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlwuLlxzcmNcYmFzZVxmdHBhdGVudC5jIg0KLQkJCQkJPg0KLQkJCQk8L0ZpbGU+DQotCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xwY2ZccGNmLmMiDQogCQkJCQk+DQogCQkJCTwvRmlsZT4NCkBAIC02NjEsNiArNTI4LDE1IEBACiAJCQkJPg0KIAkJCTwvRmlsZT4NCiAJCTwvRmlsdGVyPg0KKwkJPEZpbHRlcg0KKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIg0KKwkJCUZpbHRlcj0icmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3giDQorCQkJPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5cLi5cLi5cc3JjXGJhc2VcZnR2ZXIucmMiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQk8L0ZpbHRlcj4NCiAJPC9GaWxlcz4NCiAJPEdsb2JhbHM+DQogCTwvR2xvYmFscz4NCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwgYi9idWlsZHMvd2luZG93cy92aXN1YWxjL2luZGV4Lmh0bWwKaW5kZXggYzA2MTFkMi4uY2VjMjZkMiAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsYy9pbmRleC5odG1sCisrKyBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGMvaW5kZXguaHRtbApAQCAtMSwzMSArMSwzMiBAQAogPGh0bWw+CiA8aGVhZGVyPgogPHRpdGxlPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVmlzdWFsJm5ic3A7QysrIGFuZCBWUy5ORVQmbmJzcDsyMDA1CisgIEZyZWVUeXBlJm5ic3A7MiBQcm9qZWN0IEZpbGVzIGZvciBWaXN1YWwmbmJzcDtDKysgNi4wIGFuZCAyMDAyLTIwMDgKIDwvdGl0bGU+CiAKIDxib2R5PgogPGgxPgotICBGcmVlVHlwZSZuYnNwOzIgUHJvamVjdCBGaWxlcyBmb3IgVmlzdWFsJm5ic3A7QysrIGFuZCBWUy5ORVQmbmJzcDsyMDA1CisgIEZyZWVUeXBlJm5ic3A7MiBQcm9qZWN0IEZpbGVzIGZvciBWaXN1YWwmbmJzcDtDKysgNi4wIGFuZCAyMDAyLTIwMDgKIDwvaDE+CiAKLTxwPlRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHByb2plY3QgZmlsZXMgZm9yIFZpc3VhbCBDKyssIG5hbWVkCi08dHQ+ZnJlZXR5cGUuZHNwPC90dD4sIGFuZCBWaXN1YWwgU3R1ZGlvLCBjYWxsZWQgPHR0PmZyZWV0eXBlLnNsbjwvdHQ+LiAgSXQKLWNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOS4xIHNvdXJjZXM6PC9wPgorPHA+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyA8dHQ+ZnJlZXR5cGUuZHNwPC90dD4gZm9yCitWaXN1YWwgQysrIDYuMCwgYW5kIDx0dD5mcmVldHlwZS52Y3Byb2o8L3R0PiBmb3IgVmlzdWFsIEMrKyAyMDAyCit0aHJvdWdoIDIwMDgsIHdoaWNoIHlvdSBtaWdodCBuZWVkIHRvIHVwZ3JhZGUgYXV0b21hdGljYWxseS4KK0l0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuMTAuNCBzb3VyY2VzOjwvcD4KIAogPHVsPgotICA8cHJlPgotICAgIGZyZWV0eXBlMjkxLmxpYiAgICAgLSByZWxlYXNlIGJ1aWxkOyBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MV9ELmxpYiAgIC0gZGVidWcgYnVpbGQ7ICAgc2luZ2xlIHRocmVhZGVkCi0gICAgZnJlZXR5cGUyOTFNVC5saWIgICAtIHJlbGVhc2UgYnVpbGQ7IG11bHRpLXRocmVhZGVkCi0gICAgZnJlZXR5cGUyOTFNVF9ELmxpYiAtIGRlYnVnIGJ1aWxkOyAgIG11bHRpLXRocmVhZGVkPC9wcmU+CisgIDxsaT5mcmVldHlwZS5kbGwgdXNpbmcgJ1JlbGVhc2UnIG9yICdEZWJ1ZycgY29uZmlndXJhdGlvbnM8L2xpPgorICA8bGk+ZnJlZXR5cGUubGliIHVzaW5nICdSZWxlYXNlIFN0YXRpYycgb3IgJ0RlYnVnIFN0YXRpYycgY29uZmlndXJhdGlvbnM8L2xpPgogPC91bD4KIAorPHA+QnVpbGQgZGlyZWN0b3JpZXMgYW5kIHRhcmdldCBmaWxlcyBhcmUgcGxhY2VkIGluIHRoZSB0b3AtbGV2ZWwKKzx0dD5vYmpzPC90dD4gZGlyZWN0b3J5LjwvcD4KKwogPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCiBhcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKIHlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKIHRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgoraHJlZj0iaHR0cHM6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgogZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgogdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKIGFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcCBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLmRzcAppbmRleCA1ZmUyYjVhLi43MTRjNDIyIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS5kc3AKKysrIGIvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUuZHNwCkBAIC01NCw3ICs1NCw3IEBACiAjIEFERCBCU0MzMiAvbm9sb2dvDQogTElCMzI9bGluay5leGUgLWxpYg0KICMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlLmxpYiINCiANCiAhRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyINCiANCkBAIC03OCw3ICs3OCw3IEBACiAjIEFERCBCU0MzMiAvbm9sb2dvDQogTElCMzI9bGluay5leGUgLWxpYg0KICMgQUREIEJBU0UgTElCMzIgL25vbG9nbw0KLSMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MV9ELmxpYiINCisjIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogDQogIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImZyZWV0eXBlIC0gV2luMzIgRGVidWcgTXVsdGl0aHJlYWRlZCINCiANCkBAIC0xMDIsOCArMTAyLDggQEAKICMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KICMgQUREIEJTQzMyIC9ub2xvZ28NCiBMSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6ImxpYlxmcmVldHlwZTI5MV9ELmxpYiINCi0jIEFERCBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoibGliXGZyZWV0eXBlX0QubGliIg0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIA0KICFFTFNFSUYgICIkKENGRykiID09ICJmcmVldHlwZSAtIFdpbjMyIFJlbGVhc2UgTXVsdGl0aHJlYWRlZCINCiANCkBAIC0xMjYsOCArMTI2LDggQEAKICMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KICMgQUREIEJTQzMyIC9ub2xvZ28NCiBMSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6ImxpYlxmcmVldHlwZTI5MS5saWIiDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxTVQubGliIg0KKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbyAvb3V0OiJsaWJcZnJlZXR5cGUubGliIg0KKyMgQUREIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiANCiAhRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBSZWxlYXNlIFNpbmdsZXRocmVhZGVkIg0KIA0KQEAgLTE1MSw4ICsxNTEsOCBAQAogIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvDQogIyBBREQgQlNDMzIgL25vbG9nbw0KIExJQjMyPWxpbmsuZXhlIC1saWINCi0jIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQotIyBBREQgTElCMzIgL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MVNULmxpYiINCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28gL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZS5saWIiDQorIyBBREQgTElCMzIgL291dDoiLi5cLi5cLi5cb2Jqc1xmcmVldHlwZVNULmxpYiINCiAjIFNVQlRSQUNUIExJQjMyIC9ub2xvZ28NCiANCiAhRUxTRUlGICAiJChDRkcpIiA9PSAiZnJlZXR5cGUgLSBXaW4zMiBEZWJ1ZyBTaW5nbGV0aHJlYWRlZCINCkBAIC0xNzcsOCArMTc3LDggQEAKICMgQUREIEJBU0UgQlNDMzIgL25vbG9nbw0KICMgQUREIEJTQzMyIC9ub2xvZ28NCiBMSUIzMj1saW5rLmV4ZSAtbGliDQotIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQotIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorIyBBREQgQkFTRSBMSUIzMiAvbm9sb2dvIC9vdXQ6Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQorIyBBREQgTElCMzIgL25vbG9nbyAvb3V0OiIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlU1RfRC5saWIiDQogDQogIUVORElGDQogDQpAQCAtMzc5LDUgKzM3OSwxMyBAQAogU09VUkNFPS4uXC4uXC4uXGluY2x1ZGVcZnJlZXR5cGVcY29uZmlnXGZ0c3RkbGliLmgNCiAjIEVuZCBTb3VyY2UgRmlsZQ0KICMgRW5kIEdyb3VwDQorIyBCZWdpbiBHcm91cCAiUmVzb3VyY2UgRmlsZXMiDQorDQorIyBQUk9QIERlZmF1bHRfRmlsdGVyICJyYztpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGU7cmVzeCINCisjIEJlZ2luIFNvdXJjZSBGaWxlDQorDQorU09VUkNFPS4uXC4uXC4uXHNyY1xiYXNlXGZ0dmVyLnJjDQorIyBFbmQgU291cmNlIEZpbGUNCisjIEVuZCBHcm91cA0KICMgRW5kIFRhcmdldA0KICMgRW5kIFByb2plY3QNCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2ogYi9idWlsZHMvd2luZG93cy92aXN1YWxjZS9mcmVldHlwZS52Y3Byb2oKaW5kZXggYjc5NzMxMS4uZTI3MTQ2MiAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvZnJlZXR5cGUudmNwcm9qCisrKyBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2ZyZWV0eXBlLnZjcHJvagpAQCAtODcsNyArODcsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTEubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxTVQubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIzNyw3ICsyMzcsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0zMDksNyArMzA5LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTM4Miw3ICszODIsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZVNUX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTQ1Niw3ICs0NTYsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTUzNCw3ICs1MzQsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTEubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlLmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC02MTksNyArNjE5LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxTVQubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlTVQubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTcwNCw3ICs3MDQsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC03ODUsNyArNzg1LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxX0QubGliIg0KKwkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTg2Nyw3ICs4NjcsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZVNUX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTk1MCw3ICs5NTAsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTEwMzYsNyArMTAzNiw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTExMjEsNyArMTEyMSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xMjA2LDcgKzEyMDYsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0xMjg3LDcgKzEyODcsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMTM2OSw3ICsxMzY5LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xNDUyLDcgKzE0NTIsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE1MzgsNyArMTUzOCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTE2MjMsNyArMTYyMyw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xNzA4LDcgKzE3MDgsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0xNzg5LDcgKzE3ODksNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMTg3MSw3ICsxODcxLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0xOTU0LDcgKzE5NTQsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIwNDAsNyArMjA0MCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTIxMjUsNyArMjEyNSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yMjEwLDcgKzIyMTAsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0yMjkxLDcgKzIyOTEsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjM3Myw3ICsyMzczLDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yNDU2LDcgKzI0NTYsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTI1NDIsNyArMjU0Miw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTI2MjcsNyArMjYyNyw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yNzEyLDcgKzI3MTIsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0yNzkzLDcgKzI3OTMsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMjg3NSw3ICsyODc1LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0yOTU4LDcgKzI5NTgsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTMwNDQsNyArMzA0NCw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MS5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTMxMjksNyArMzEyOSw3IEBACiAJCQkvPg0KIAkJCTxUb29sDQogCQkJCU5hbWU9IlZDTGlicmFyaWFuVG9vbCINCi0JCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZTI5MU1ULmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1ULmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0zMjE0LDcgKzMyMTQsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFTVC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVC5saWIiDQogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0FMaW5rVG9vbCINCkBAIC0zMjk1LDcgKzMyOTUsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVfRC5saWIiDQogCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSINCiAJCQkvPg0KIAkJCTxUb29sDQpAQCAtMzM3Nyw3ICszMzc3LDcgQEAKIAkJCS8+DQogCQkJPFRvb2wNCiAJCQkJTmFtZT0iVkNMaWJyYXJpYW5Ub29sIg0KLQkJCQlPdXRwdXRGaWxlPSIuLlwuLlwuLlxvYmpzXGZyZWV0eXBlMjkxU1RfRC5saWIiDQorCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGVTVF9ELmxpYiINCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIg0KIAkJCS8+DQogCQkJPFRvb2wNCkBAIC0zNDYwLDcgKzM0NjAsNyBAQAogCQkJLz4NCiAJCQk8VG9vbA0KIAkJCQlOYW1lPSJWQ0xpYnJhcmlhblRvb2wiDQotCQkJCU91dHB1dEZpbGU9Ii4uXC4uXC4uXG9ianNcZnJlZXR5cGUyOTFNVF9ELmxpYiINCisJCQkJT3V0cHV0RmlsZT0iLi5cLi5cLi5cb2Jqc1xmcmVldHlwZU1UX0QubGliIg0KIAkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiDQogCQkJLz4NCiAJCQk8VG9vbA0KQEAgLTM2OTEsNiArMzY5MSwxNSBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQk8L0ZpbHRlcj4NCisJCTxGaWx0ZXINCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyINCisJCQlGaWx0ZXI9InJjO2ljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZTtyZXN4Ig0KKwkJCT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXC4uXHNyY1xiYXNlXGZ0dmVyLnJjIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJPC9GaWx0ZXI+DQogCTwvRmlsZXM+DQogCTxHbG9iYWxzPg0KIAk8L0dsb2JhbHM+DQpkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbCBiL2J1aWxkcy93aW5kb3dzL3Zpc3VhbGNlL2luZGV4Lmh0bWwKaW5kZXggZDVhM2NhMy4uNDc0ZTg1YyAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdmlzdWFsY2UvaW5kZXguaHRtbAorKysgYi9idWlsZHMvd2luZG93cy92aXN1YWxjZS9pbmRleC5odG1sCkBAIC0yMSwyMSArMjEsMjEgQEAKICAgPGxpPlBQQy9TUCBXTTYgKFdpbmRvd3MgTW9iaWxlIDYpPC9saT4KIDwvdWw+CiAKLUl0IGNvbXBpbGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIGZyb20gdGhlIEZyZWVUeXBlIDIuOS4xIHNvdXJjZXM6PC9wPgorSXQgY29tcGlsZXMgdGhlIGZvbGxvd2luZyBsaWJyYXJpZXMgZnJvbSB0aGUgRnJlZVR5cGUgMi4xMC40IHNvdXJjZXM6PC9wPgogCiA8dWw+CiAgIDxwcmU+Ci0gICAgZnJlZXR5cGUyOTEubGliICAgICAtIHJlbGVhc2UgYnVpbGQ7IHNpbmdsZSB0aHJlYWRlZAotICAgIGZyZWV0eXBlMjkxX0QubGliICAgLSBkZWJ1ZyBidWlsZDsgICBzaW5nbGUgdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1ULmxpYiAgIC0gcmVsZWFzZSBidWlsZDsgbXVsdGktdGhyZWFkZWQKLSAgICBmcmVldHlwZTI5MU1UX0QubGliIC0gZGVidWcgYnVpbGQ7ICAgbXVsdGktdGhyZWFkZWQ8L3ByZT4KKyAgICBmcmVldHlwZS5saWIgICAgIC0gcmVsZWFzZSBidWlsZDsgc2luZ2xlIHRocmVhZGVkCisgICAgZnJlZXR5cGVfRC5saWIgICAtIGRlYnVnIGJ1aWxkOyAgIHNpbmdsZSB0aHJlYWRlZAorICAgIGZyZWV0eXBlTVQubGliICAgLSByZWxlYXNlIGJ1aWxkOyBtdWx0aS10aHJlYWRlZAorICAgIGZyZWV0eXBlTVRfRC5saWIgLSBkZWJ1ZyBidWlsZDsgICBtdWx0aS10aHJlYWRlZDwvcHJlPgogPC91bD4KIAogPHA+QmUgc3VyZSB0byBleHRyYWN0IHRoZSBmaWxlcyB3aXRoIHRoZSBXaW5kb3dzIChDUitMRikgbGluZSBlbmRpbmdzLiAgWklQCiBhcmNoaXZlcyBhcmUgYWxyZWFkeSBzdG9yZWQgdGhpcyB3YXksIHNvIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIHJlcXVpcmVkLiAgSWYKIHlvdSB1c2Ugc29tZSA8dHQ+LnRhci4qejwvdHQ+IGFyY2hpdmVzLCBiZSBzdXJlIHRvIGNvbmZpZ3VyZSB5b3VyIGV4dHJhY3RpbmcKIHRvb2wgdG8gY29udmVydCB0aGUgbGluZSBlbmRpbmdzLiAgRm9yIGV4YW1wbGUsIHdpdGggPGEKLWhyZWY9Imh0dHA6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgoraHJlZj0iaHR0cHM6Ly93d3cud2luemlwLmNvbSI+V2luWmlwPC9hPiwgeW91IHNob3VsZCBhY3RpdmF0ZSB0aGUgPGVtPlRBUgogZmlsZSBzbWFydCBDUi9MRiBDb252ZXJzaW9uPC9lbT4gb3B0aW9uLiAgQWx0ZXJuYXRpdmVseSwgeW91IG1heSBjb25zaWRlcgogdXNpbmcgdGhlIDx0dD51bml4MmRvczwvdHQ+IG9yIDx0dD51MmQ8L3R0PiB1dGlsaXRpZXMgdGhhdCBhcmUgZmxvYXRpbmcKIGFyb3VuZCwgd2hpY2ggc3BlY2lmaWNhbGx5IGRlYWwgd2l0aCB0aGlzIHBhcnRpY3VsYXIgcHJvYmxlbS4KZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1iY2MubWsgYi9idWlsZHMvd2luZG93cy93MzItYmNjLm1rCmluZGV4IDAxYWFiMWMuLmM4MDcxMGUgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1iY2MubWsKKysrIGIvYnVpbGRzL3dpbmRvd3MvdzMyLWJjYy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWJjY2QubWsgYi9idWlsZHMvd2luZG93cy93MzItYmNjZC5tawppbmRleCAyYzE0ZDZjLi45NjZiZGI1IDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy93MzItYmNjZC5taworKysgYi9idWlsZHMvd2luZG93cy93MzItYmNjZC5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWRldi5tayBiL2J1aWxkcy93aW5kb3dzL3czMi1kZXYubWsKaW5kZXggMjc5ZDVmOS4uYjJhZjY2NyAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdzMyLWRldi5taworKysgYi9idWlsZHMvd2luZG93cy93MzItZGV2Lm1rCkBAIC01LDcgKzUsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy93MzItZ2NjLm1rIGIvYnVpbGRzL3dpbmRvd3MvdzMyLWdjYy5tawppbmRleCA5ZTM0NzZiLi5mMjdlNmIxIDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy93MzItZ2NjLm1rCisrKyBiL2J1aWxkcy93aW5kb3dzL3czMi1nY2MubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi1pY2MubWsgYi9idWlsZHMvd2luZG93cy93MzItaWNjLm1rCmluZGV4IGU2OTVjMTIuLjJlNjk2MDkgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1pY2MubWsKKysrIGIvYnVpbGRzL3dpbmRvd3MvdzMyLWljYy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWludGwubWsgYi9idWlsZHMvd2luZG93cy93MzItaW50bC5tawppbmRleCAxZTM2NjYyLi44OGU2MjY5IDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy93MzItaW50bC5taworKysgYi9idWlsZHMvd2luZG93cy93MzItaW50bC5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3MvdzMyLWxjYy5tayBiL2J1aWxkcy93aW5kb3dzL3czMi1sY2MubWsKaW5kZXggNTcyOWQzNi4uNmNmNjQ2MCAxMDA2NDQKLS0tIGEvYnVpbGRzL3dpbmRvd3MvdzMyLWxjYy5taworKysgYi9idWlsZHMvd2luZG93cy93MzItbGNjLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy93MzItbWluZ3czMi5tayBiL2J1aWxkcy93aW5kb3dzL3czMi1taW5ndzMyLm1rCmluZGV4IGIzYTIxMGQuLmYyZWIwMjEgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi1taW5ndzMyLm1rCisrKyBiL2J1aWxkcy93aW5kb3dzL3czMi1taW5ndzMyLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9idWlsZHMvd2luZG93cy93MzItdmNjLm1rIGIvYnVpbGRzL3dpbmRvd3MvdzMyLXZjYy5tawppbmRleCAzNDJjOGFhLi5lODAwZDI3IDEwMDY0NAotLS0gYS9idWlsZHMvd2luZG93cy93MzItdmNjLm1rCisrKyBiL2J1aWxkcy93aW5kb3dzL3czMi12Y2MubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL2J1aWxkcy93aW5kb3dzL3czMi13YXQubWsgYi9idWlsZHMvd2luZG93cy93MzItd2F0Lm1rCmluZGV4IDM3ZWNjODguLmEwZGU0YmIgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3czMi13YXQubWsKKysrIGIvYnVpbGRzL3dpbmRvd3MvdzMyLXdhdC5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rIGIvYnVpbGRzL3dpbmRvd3Mvd2luMzItZGVmLm1rCmluZGV4IGY4M2Q0NDQuLmY3NTk4NTMgMTAwNjQ0Ci0tLSBhL2J1aWxkcy93aW5kb3dzL3dpbjMyLWRlZi5taworKysgYi9idWlsZHMvd2luZG93cy93aW4zMi1kZWYubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE5LDYgKzE5LDEwIEBACiBCVUlMRF9ESVIgOj0gJChUT1BfRElSKS9idWlsZHMvd2luZG93cwogUExBVEZPUk0gIDo9IHdpbmRvd3MKIAorIyBUaGlzIGlzIHVzZWQgZm9yIGBtYWtlIHJlZmRvYycgYW5kIGBtYWtlIHJlZmRvYy12ZW52JworIworQklOIDo9IFNjcmlwdHMKKwogIyBUaGUgZXhlY3V0YWJsZSBmaWxlIGV4dGVuc2lvbiAoZm9yIHRvb2xzKS4gTk9URTogV0UgSU5DTFVERSBUSEUgRE9UIEhFUkUgISEKICMKIEUgOj0gLmV4ZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IGY5ZDIxODYuLmFjOTFhOGUgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTEsNiArMSw2IEBACiAjIS9iaW4vc2gKICMKLSMgQ29weXJpZ2h0IDIwMDItMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC05NCw4ICs5NCwxMCBAQAogaW5vZGVfZHN0PWBscyAtaWQgJGFic19jdXJyX2RpciB8IGF3ayAne3ByaW50ICQxfSdgCiAKIGlmIHRlc3QgJGlub2RlX3NyYyAtbmUgJGlub2RlX2RzdDsgdGhlbgotICBpZiB0ZXN0ICEgLWQgcmVmZXJlbmNlOyB0aGVuCi0gICAgbWtkaXIgcmVmZXJlbmNlCisgIGlmIHRlc3QgISAtZCBkb2NzOyB0aGVuCisgICAgbWtkaXIgZG9jcworICAgIGVjaG8gIkNvcHlpbmcgZG9jdW1lbnRhdGlvbiBhc3NldHMiCisgICAgY3AgLVIgJGFic19mdDJfZGlyL2RvY3MvbWFya2Rvd24gJGFic19jdXJyX2Rpci9kb2NzCiAgIGZpCiAgIGlmIHRlc3QgISAtciAkYWJzX2N1cnJfZGlyL21vZHVsZXMuY2ZnOyB0aGVuCiAgICAgZWNobyAiQ29weWluZyBcYG1vZHVsZXMuY2ZnJyIKQEAgLTEwNSw3ICsxMDcsNyBAQAogICBlY2hvICJUT1BfRElSICAgICAgICA6PSAkYWJzX2Z0Ml9kaXIiICAgICAgICAgICA+IE1ha2VmaWxlCiAgIGVjaG8gIk9CSl9ESVIgICAgICAgIDo9ICRhYnNfY3Vycl9kaXIiICAgICAgICAgPj4gTWFrZWZpbGUKICAgZWNobyAiT0JKX0JVSUxEICAgICAgOj0gXCQoT0JKX0RJUikiICAgICAgICAgICA+PiBNYWtlZmlsZQotICBlY2hvICJET0NfRElSICAgICAgICA6PSBcJChPQkpfRElSKS9yZWZlcmVuY2UiID4+IE1ha2VmaWxlCisgIGVjaG8gIkRPQ19ESVIgICAgICAgIDo9IFwkKE9CSl9ESVIpL2RvY3MiICAgICAgPj4gTWFrZWZpbGUKICAgZWNobyAiRlRfTElCVE9PTF9ESVIgOj0gXCQoT0JKX0RJUikiICAgICAgICAgICA+PiBNYWtlZmlsZQogICBlY2hvICJpZm5kZWYgRlQyREVNT1MiICAgICAgICAgICAgICAgICAgICAgICAgID4+IE1ha2VmaWxlCiAgIGVjaG8gIiAgaW5jbHVkZSBcJChUT1BfRElSKS9NYWtlZmlsZSIgICAgICAgICAgPj4gTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RldmVsL2Z0MmJ1aWxkLmggYi9kZXZlbC9mdDJidWlsZC5oCmluZGV4IDFkMTcxNDEuLjBhYjhiYTAgMTAwNjQ0Ci0tLSBhL2RldmVsL2Z0MmJ1aWxkLmgKKysrIGIvZGV2ZWwvZnQyYnVpbGQuaApAQCAtMSwzNSArMSwzNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnQyYnVpbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIDIgYnVpbGQgYW5kIHNldHVwIG1hY3JvcyAoZGV2ZWxvcG1lbnQgdmVyc2lvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnQyYnVpbGQuaAorICoKKyAqICAgRnJlZVR5cGUgMiBidWlsZCBhbmQgc2V0dXAgbWFjcm9zIChkZXZlbG9wbWVudCB2ZXJzaW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICAvKgotICAqICBUaGlzIGlzIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiA8ZnQyYnVpbGQuaD4gdG8gYnVpbGQgdGhlIGxpYnJhcnkgaW4KLSAgKiAgZGVidWcgbW9kZS4gIEl0cyBvbmx5IGRpZmZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgdmVyc2lvbiBpcyB0aGF0IGl0Ci0gICogIGluY2x1ZGVzIGEgbG9jYWwgYGZ0b3B0aW9uLmgnIGhlYWRlciBmaWxlIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIGZvcgotICAqICBtYW55IGNvbmZpZ3VyYXRpb24gbWFjcm9zLgorICAqIFRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIDxmdDJidWlsZC5oPiB0byBidWlsZCB0aGUgbGlicmFyeSBpbgorICAqIGRlYnVnIG1vZGUuICBJdHMgb25seSBkaWZmZXJlbmNlIHRvIHRoZSBkZWZhdWx0IHZlcnNpb24gaXMgdGhhdCBpdAorICAqIGluY2x1ZGVzIGEgbG9jYWwgYGZ0b3B0aW9uLmgnIGhlYWRlciBmaWxlIHdpdGggZGlmZmVyZW50IHNldHRpbmdzIGZvcgorICAqIG1hbnkgY29uZmlndXJhdGlvbiBtYWNyb3MuCiAgICoKLSAgKiAgVG8gdXNlIGl0LCBzaW1wbHkgZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgZmlsZSBpcwotICAqICBzY2FubmVkIGJ5IHRoZSBjb21waWxlciBiZWZvcmUgdGhlIGRlZmF1bHQgRnJlZVR5cGUgaGVhZGVyIGRpcmVjdG9yeS4KKyAgKiBUbyB1c2UgaXQsIHNpbXBseSBlbnN1cmUgdGhhdCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBmaWxlIGlzCisgICogc2Nhbm5lZCBieSB0aGUgY29tcGlsZXIgYmVmb3JlIHRoZSBkZWZhdWx0IEZyZWVUeXBlIGhlYWRlciBkaXJlY3RvcnkuCiAgICoKICAgKi8KIAogI2lmbmRlZiBGVDJCVUlMRF9IXwogI2RlZmluZSBGVDJCVUlMRF9IXwogCisjZGVmaW5lIEZUX0NPTkZJR19NT0RVTEVTX0ggIDxmdG1vZHVsZS5oPgogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8ZnRvcHRpb24uaD4KIAogI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPgpkaWZmIC0tZ2l0IGEvZGV2ZWwvZnRvcHRpb24uaCBiL2RldmVsL2Z0b3B0aW9uLmgKaW5kZXggMWI0NjE5ZS4uMzA3ZDFhMyAxMDA2NDQKLS0tIGEvZGV2ZWwvZnRvcHRpb24uaAorKysgYi9kZXZlbC9mdG9wdGlvbi5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9wdGlvbi5oIChmb3IgZGV2ZWxvcG1lbnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVXNlci1zZWxlY3RhYmxlIGNvbmZpZ3VyYXRpb24gbWFjcm9zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG9wdGlvbi5oIChmb3IgZGV2ZWxvcG1lbnQpCisgKgorICogICBVc2VyLXNlbGVjdGFibGUgY29uZmlndXJhdGlvbiBtYWNyb3MgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUT1BUSU9OX0hfCkBAIC0yNSw0NSArMjUsNDcgQEAKIAogRlRfQkVHSU5fSEVBREVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgVVNFUi1TRUxFQ1RBQkxFIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1hY3JvIGRlZmluaXRpb25zIGZvciAgICAqLwotICAvKiBhIHN0YW5kYXJkIGJ1aWxkIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gICAgKi8KLSAgLyogdXNlIHRoaXMgZmlsZSB0byBidWlsZCBwcm9qZWN0LXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5OiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIG1vZGlmeSB0aGlzIGZpbGUgYnkgaGFuZCwgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGluICAgKi8KLSAgLyogICAgY2FzZXMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgZnJvbSBhIHNpbmdsZSBzb3VyY2UgZGlyZWN0b3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gWW91IGNhbiBwdXQgYSBjb3B5IG9mIHRoaXMgZmlsZSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeSwgbW9yZSAgICAgICovCi0gIC8qICAgIHByZWNpc2VseSBpbiBgJEJVSUxEL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oJywgd2hlcmUgYCRCVUlMRCcgICAqLwotICAvKiAgICBpcyB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSB0aGF0IGlzIGluY2x1ZGVkIF9iZWZvcmVfIHRoZSBGcmVlVHlwZSAgKi8KLSAgLyogICAgaW5jbHVkZSBwYXRoIGR1cmluZyBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVmYXVsdCBGcmVlVHlwZSBNYWtlZmlsZXMgYW5kIEphbWZpbGVzIHVzZSB0aGUgYnVpbGQgICAgICAgICAgKi8KLSAgLyogICAgZGlyZWN0b3J5IGBidWlsZHMvPHN5c3RlbT4nIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgICovCi0gIC8qICAgIHRoYXQgZm9yIHlvdXIgb3duIHByb2plY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gQ29weSB0aGUgZmlsZSA8ZnQyYnVpbGQuaD4gdG8gYCRCVUlMRC9mdDJidWlsZC5oJyBhbmQgbW9kaWZ5IGl0ICAgICovCi0gIC8qICAgIHNsaWdodGx5IHRvIHByZS1kZWZpbmUgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05TX0ggdXNlZCB0byAgICAgICAqLwotICAvKiAgICBsb2NhdGUgdGhpcyBmaWxlIGR1cmluZyB0aGUgYnVpbGQuICBGb3IgZXhhbXBsZSwgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8bXlmdG9wdGlvbnMuaD4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpbGwgdXNlIGAkQlVJTEQvbXlmdG9wdGlvbnMuaCcgaW5zdGVhZCBvZiB0aGlzIGZpbGUgZm9yIG1hY3JvICAgICAqLwotICAvKiAgICBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc2ltaWxhcmx5IHByZS1kZWZpbmUgdGhlIG1hY3JvICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DT05GSUdfTU9EVUxFU19IIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGxpc3Rpbmcgb2YgdGhlIG1vZHVsZXMgKi8KLSAgLyogICAgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgQnkgICAgICovCi0gIC8qICAgIGRlZmF1bHQsIHRoaXMgZmlsZSBpcyA8ZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg+LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgaGlnaGx5IHJlY29tbWVuZCB1c2luZyB0aGUgdGhpcmQgbWV0aG9kIHdoZW5ldmVyIHBvc3NpYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUworICAgKgorICAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtYWNybyBkZWZpbml0aW9ucyBmb3IgYQorICAgKiBzdGFuZGFyZCBidWlsZCBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeS4gIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIHVzZQorICAgKiB0aGlzIGZpbGUgdG8gYnVpbGQgcHJvamVjdC1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeToKKyAgICoKKyAgICogLSBZb3UgY2FuIG1vZGlmeSB0aGlzIGZpbGUgYnkgaGFuZCwgYnV0IHRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGluCisgICAqICAgY2FzZXMgd2hlcmUgeW91IHdvdWxkIGxpa2UgdG8gYnVpbGQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeQorICAgKiAgIGZyb20gYSBzaW5nbGUgc291cmNlIGRpcmVjdG9yeS4KKyAgICoKKyAgICogLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlCisgICAqICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmhgLCB3aGVyZSBgJEJVSUxEYCBpcworICAgKiAgIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRoYXQgaXMgaW5jbHVkZWQgX2JlZm9yZV8gdGhlIEZyZWVUeXBlIGluY2x1ZGUKKyAgICogICBwYXRoIGR1cmluZyBjb21waWxhdGlvbi4KKyAgICoKKyAgICogICBUaGUgZGVmYXVsdCBGcmVlVHlwZSBNYWtlZmlsZXMgdXNlIHRoZSBidWlsZCBkaXJlY3RvcnkKKyAgICogICBgYnVpbGRzLzxzeXN0ZW0+YCBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBlYXNpbHkgY2hhbmdlIHRoYXQgZm9yIHlvdXIKKyAgICogICBvd24gcHJvamVjdHMuCisgICAqCisgICAqIC0gQ29weSB0aGUgZmlsZSA8ZnQyYnVpbGQuaD4gdG8gYCRCVUlMRC9mdDJidWlsZC5oYCBhbmQgbW9kaWZ5IGl0CisgICAqICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gYEZUX0NPTkZJR19PUFRJT05TX0hgIHVzZWQgdG8gbG9jYXRlCisgICAqICAgdGhpcyBmaWxlIGR1cmluZyB0aGUgYnVpbGQuICBGb3IgZXhhbXBsZSwKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgICNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPG15ZnRvcHRpb25zLmg+CisgICAqICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+CisgICAqICAgYGBgCisgICAqCisgICAqICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oYCBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8KKyAgICogICBkZWZpbml0aW9ucy4KKyAgICoKKyAgICogICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHNpbWlsYXJseSBwcmUtZGVmaW5lIHRoZSBtYWNybworICAgKiAgIGBGVF9DT05GSUdfTU9EVUxFU19IYCB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBsaXN0aW5nIG9mIHRoZSBtb2R1bGVzCisgICAqICAgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gdGhlIGxpYnJhcnkgYXQgY29tcGlsZSB0aW1lLiAgQnkKKyAgICogICBkZWZhdWx0LCB0aGlzIGZpbGUgaXMgYDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD5gLgorICAgKgorICAgKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuCisgICAqCisgICAqLwogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03NSw0MjUgKzc3LDQ0NyBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgeW91IGVuYWJsZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBGcmVlVHlwZSByZWNvZ25pemVzIGFuICAgICAgICovCi0gIC8qIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxlZCBgRlJFRVRZUEVfUFJPUEVSVElFUycsIHdoaWNoIGNhbiBiZSB1c2VkICAqLwotICAvKiB0byBjb250cm9sIHRoZSB2YXJpb3VzIGZvbnQgZHJpdmVycyBhbmQgbW9kdWxlcy4gIFRoZSBjb250cm9sbGFibGUgICAgKi8KLSAgLyogcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIHRoZSBzZWN0aW9uIGBDb250cm9sbGluZyBGcmVlVHlwZSBNb2R1bGVzJyAgICovCi0gIC8qIGluIHRoZSByZWZlcmVuY2UncyB0YWJsZSBvZiBjb250ZW50czsgY3VycmVudGx5IHRoZXJlIGFyZSBwcm9wZXJ0aWVzICAqLwotICAvKiBmb3IgdGhlIGF1dG8taGludGVyIChmaWxlIGBmdGF1dG9oLmgnKSwgQ0ZGIChmaWxlIGBmdGNmZmRydi5oJyksICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgKGZpbGUgYGZ0dHRkcnYuaCcpLCBhbmQgUENGIChmaWxlIGBmdHBjZmRydi5oJykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgRlJFRVRZUEVfUFJPUEVSVElFUycgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlIGludG8gKi8KLSAgLyogbXVsdGlwbGUgbGluZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxvcHRpb25hbCB3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8bW9kdWxlLW5hbWUxPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPHByb3BlcnR5LW5hbWUxPiAnPScgPHByb3BlcnR5LXZhbHVlMT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDx3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8bW9kdWxlLW5hbWUyPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPHByb3BlcnR5LW5hbWUyPiAnPScgPHByb3BlcnR5LXZhbHVlMj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGUkVFVFlQRV9QUk9QRVJUSUVTPXRydWV0eXBlOmludGVycHJldGVyLXZlcnNpb249MzUgXCAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBjZmY6bm8tc3RlbS1kYXJrZW5pbmc9MSBcICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZpdHRlcjp3YXJwaW5nPTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJZiB5b3UgZW5hYmxlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24sIEZyZWVUeXBlIHJlY29nbml6ZXMgYW4KKyAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbGVkIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAgICogY29udHJvbCB0aGUgdmFyaW91cyBmb250IGRyaXZlcnMgYW5kIG1vZHVsZXMuICBUaGUgY29udHJvbGxhYmxlCisgICAqIHByb3BlcnRpZXMgYXJlIGxpc3RlZCBpbiB0aGUgc2VjdGlvbiBAcHJvcGVydGllcy4KKyAgICoKKyAgICogWW91IGhhdmUgdG8gdW5kZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBvbiBwbGF0Zm9ybXMgdGhhdCBsYWNrCisgICAqIHRoZSBjb25jZXB0IG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyAoYW5kIHRodXMgZG9uJ3QgaGF2ZSB0aGUgYGdldGVudmAKKyAgICogZnVuY3Rpb24pLCBmb3IgZXhhbXBsZSBXaW5kb3dzIENFLgorICAgKgorICAgKiBgRlJFRVRZUEVfUFJPUEVSVElFU2AgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlIGludG8KKyAgICogbXVsdGlwbGUgbGluZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eSkuCisgICAqCisgICAqIGBgYAorICAgKiAgIDxvcHRpb25hbCB3aGl0ZXNwYWNlPgorICAgKiAgIDxtb2R1bGUtbmFtZTE+ICc6JworICAgKiAgIDxwcm9wZXJ0eS1uYW1lMT4gJz0nIDxwcm9wZXJ0eS12YWx1ZTE+CisgICAqICAgPHdoaXRlc3BhY2U+CisgICAqICAgPG1vZHVsZS1uYW1lMj4gJzonCisgICAqICAgPHByb3BlcnR5LW5hbWUyPiAnPScgPHByb3BlcnR5LXZhbHVlMj4KKyAgICogICAuLi4KKyAgICogYGBgCisgICAqCisgICAqIEV4YW1wbGU6CisgICAqCisgICAqIGBgYAorICAgKiAgIEZSRUVUWVBFX1BST1BFUlRJRVM9dHJ1ZXR5cGU6aW50ZXJwcmV0ZXItdmVyc2lvbj0zNSBcCisgICAqICAgICAgICAgICAgICAgICAgICAgICBjZmY6bm8tc3RlbS1kYXJrZW5pbmc9MSBcCisgICAqICAgICAgICAgICAgICAgICAgICAgICBhdXRvZml0dGVyOndhcnBpbmc9MQorICAgKiBgYGAKKyAgICoKKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgTENEIHJlbmRlcmluZyAgICAgICAgKi8KLSAgLyogdGVjaG5vbG9neSBzaW1pbGFyIHRvIENsZWFyVHlwZSBpbiB0aGlzIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgVGhpcyAgICovCi0gIC8qIHRlY2hub2xvZ3kgdHJpcGxlcyB0aGUgcmVzb2x1dGlvbiBpbiB0aGUgZGlyZWN0aW9uIGNvbG9yIHN1YnBpeGVscy4gICAqLwotICAvKiBUbyBtaXRpZ2F0ZSBjb2xvciBmcmluZ2VzIGluaGVyZW50IHRvIHRoaXMgdGVjaG5vbG9neSwgeW91IGFsc28gbmVlZCAgKi8KLSAgLyogdG8gZXhwbGljaXRseSBzZXQgdXAgTENEIGZpbHRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGNvdmVyZWQgYnkgc2V2ZXJhbCBNaWNyb3NvZnQgcGF0ZW50cyAgICAgICAgKi8KLSAgLyogYW5kIHNob3VsZCBub3QgYmUgYWN0aXZhdGVkIGluIGFueSBkZWZhdWx0IGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAgICovCi0gIC8qIFdoZW4gdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwgRnJlZVR5cGUgb2ZmZXJzIGFsdGVybmF0aXZlIExDRCAgICAgICAqLwotICAvKiByZW5kZXJpbmcgdGVjaG5vbG9neSB0aGF0IHByb2R1Y2VzIGV4Y2VsbGVudCBvdXRwdXQgd2l0aG91dCBMQ0QgICAgICAgKi8KLSAgLyogZmlsdGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IGlmIHlvdSB3YW50IHRvIGFjdGl2YXRlIExDRCByZW5kZXJpbmcKKyAgICogdGVjaG5vbG9neSBzaW1pbGFyIHRvIENsZWFyVHlwZSBpbiB0aGlzIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgVGhpcworICAgKiB0ZWNobm9sb2d5IHRyaXBsZXMgdGhlIHJlc29sdXRpb24gaW4gdGhlIGRpcmVjdGlvbiBjb2xvciBzdWJwaXhlbHMuICBUbworICAgKiBtaXRpZ2F0ZSBjb2xvciBmcmluZ2VzIGluaGVyZW50IHRvIHRoaXMgdGVjaG5vbG9neSwgeW91IGFsc28gbmVlZCB0bworICAgKiBleHBsaWNpdGx5IHNldCB1cCBMQ0QgZmlsdGVyaW5nLgorICAgKgorICAgKiBXaGVuIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsIEZyZWVUeXBlIG9mZmVycyBhbHRlcm5hdGl2ZSBMQ0QKKyAgICogcmVuZGVyaW5nIHRlY2hub2xvZ3kgdGhhdCBwcm9kdWNlcyBleGNlbGxlbnQgb3V0cHV0LgorICAgKi8KIC8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFueSBjb21waWxlcnMgcHJvdmlkZSBhIG5vbi1BTlNJIDY0LWJpdCBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCAgICovCi0gIC8qIGJ5IEZyZWVUeXBlIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zLiAgSG93ZXZlciwgdGhpcyB3aWxsIGNyZWF0ZSAqLwotICAvKiBzb21lIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGluIHN0cmljdCBBTlNJIG1vZGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciB0aGlzIHJlYXNvbiwgdGhlIHVzZSBvZiA2NC1iaXQgaW50ZWdlcnMgaXMgbm9ybWFsbHkgZGlzYWJsZWQgd2hlbiAqLwotICAvKiB0aGUgX19TVERDX18gbWFjcm8gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBkaXNhYmxlIHRoaXMgYnkgICAgICAgKi8KLSAgLyogZGVmaW5pbmcgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgaGVyZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgbW9zdCBjb21waWxlcnMsIHRoaXMgd2lsbCBvbmx5IGNyZWF0ZSBjb21waWxhdGlvbiB3YXJuaW5ncyB3aGVuICAgKi8KLSAgLyogYnVpbGRpbmcgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPYk5vdGU6IFRoZSBjb21waWxlci1zcGVjaWZpYyA2NC1iaXQgaW50ZWdlcnMgYXJlIGRldGVjdGVkIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICBmaWxlIGBmdGNvbmZpZy5oJyBlaXRoZXIgc3RhdGljYWxseSBvciB0aHJvdWdoIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgYGNvbmZpZ3VyZScgc2NyaXB0IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1hbnkgY29tcGlsZXJzIHByb3ZpZGUgYSBub24tQU5TSSA2NC1iaXQgZGF0YSB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgYnkKKyAgICogRnJlZVR5cGUgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMuICBIb3dldmVyLCB0aGlzIHdpbGwgY3JlYXRlIHNvbWUKKyAgICogcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkgaW4gc3RyaWN0IEFOU0kgbW9kZS4KKyAgICoKKyAgICogRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIDY0LWJpdCBpbnRlZ2VycyBpcyBub3JtYWxseSBkaXNhYmxlZCB3aGVuCisgICAqIHRoZSBgX19TVERDX19gIG1hY3JvIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgZGlzYWJsZSB0aGlzIGJ5CisgICAqIGRlZmluaW5nIHRoZSBtYWNybyBgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NGAgaGVyZS4KKyAgICoKKyAgICogRm9yIG1vc3QgY29tcGlsZXJzLCB0aGlzIHdpbGwgb25seSBjcmVhdGUgY29tcGlsYXRpb24gd2FybmluZ3Mgd2hlbgorICAgKiBidWlsZGluZyB0aGUgbGlicmFyeS4KKyAgICoKKyAgICogT2JOb3RlOiBUaGUgY29tcGlsZXItc3BlY2lmaWMgNjQtYml0IGludGVnZXJzIGFyZSBkZXRlY3RlZCBpbiB0aGUKKyAgICogICAgICAgICBmaWxlIGBmdGNvbmZpZy5oYCBlaXRoZXIgc3RhdGljYWxseSBvciB0aHJvdWdoIHRoZSBgY29uZmlndXJlYAorICAgKiAgICAgICAgIHNjcmlwdCBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zLgorICAgKi8KICN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgZG8gbm90IHRyeSB0byB1c2UgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgICAqLwotICAvKiBwZXJmb3JtYW5jZS1jcml0aWNhbCBmdW5jdGlvbnMgKGUuZy4gRlRfTXVsRml4KS4gIFlvdSBzaG91bGQgb25seSBkbyAgKi8KLSAgLyogdGhhdCB0byB2ZXJpZnkgdGhhdCB0aGUgYXNzZW1ibGVyIGZ1bmN0aW9uIHdvcmtzIHByb3Blcmx5LCBvciB0byAgICAgICovCi0gIC8qIGV4ZWN1dGUgYmVuY2htYXJrIHRlc3RzIG9mIHRoZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucy4gICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBkbyBub3QgdHJ5IHRvIHVzZSBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZgorICAgKiBwZXJmb3JtYW5jZS1jcml0aWNhbCBmdW5jdGlvbnMgKGUuZy4sIEBGVF9NdWxGaXgpLiAgWW91IHNob3VsZCBvbmx5IGRvCisgICAqIHRoYXQgdG8gdmVyaWZ5IHRoYXQgdGhlIGFzc2VtYmxlciBmdW5jdGlvbiB3b3JrcyBwcm9wZXJseSwgb3IgdG8gZXhlY3V0ZQorICAgKiBiZW5jaG1hcmsgdGVzdHMgb2YgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zLgorICAgKi8KIC8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCB0cnkgdG8gdXNlIGFuIGlubGluZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgICovCi0gIC8qIHRoZSBgRlRfTXVsRml4JyBmdW5jdGlvbiwgd2hpY2ggaXMgYSBgaG90c3BvdCcgd2hlbiBsb2FkaW5nIGFuZCAgICAgICAqLwotICAvKiBoaW50aW5nIGdseXBocywgYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBpZiB5b3VyIGNvbXBpbGVyIG9yIENQVSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgZGVmYXVsdCAqLwotICAvKiB0byB0aGUgc3RhbmRhcmQgYW5kIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIGZvdW5kIGluIGBmdGNhbGMuYycuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIHRyeSB0byB1c2UgYW4gaW5saW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiB0aGUKKyAgICogQEZUX011bEZpeCBmdW5jdGlvbiwgd2hpY2ggaXMgYSAnaG90c3BvdCcgd2hlbiBsb2FkaW5nIGFuZCBoaW50aW5nCisgICAqIGdseXBocywgYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBhcyBmYXN0IGFzIHBvc3NpYmxlLgorICAgKgorICAgKiBOb3RlIHRoYXQgaWYgeW91ciBjb21waWxlciBvciBDUFUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8KKyAgICogdGhlIHN0YW5kYXJkIGFuZCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbiBgZnRjYWxjLmNgLgorICAgKi8KICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9JTkxJTkVfTVVMRklYCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExaVy1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGNvbXByZXNzJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIHZhcmlvdXMgWDExIGRpc3RyaWJ1dGlvbnMuICBUaGUgaW1wbGVtZW50YXRpb24gKi8KLSAgLyogICB1c2VzIE5ldEJTRCdzIGB6b3BlbicgdG8gcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAgICovCi0gIC8qICAgKHNlZSBzcmMvbHp3L2Z0Z3ppcC5jKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LgorICAgKgorICAgKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZQorICAgKiAgIGBjb21wcmVzc2AgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGCisgICAqICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbgorICAgKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuYCB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUKKyAgICogICBgc3JjL2x6dy9mdGd6aXAuY2ApLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHemlwLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLwotICAvKiAgIGBnemlwJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgZmlsZXMgKi8KLSAgLyogICB0aGF0IGNvbWUgd2l0aCBYRnJlZTg2LiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYHpsaWInIHRvICAgICAgICAgICovCi0gIC8qICAgcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIHNyYy9nemlwL2Z0Z3ppcC5jKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCi0gIC8qICAgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEd6aXAtY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuCisgICAqCisgICAqICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlCisgICAqICAgYGd6aXBgIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiBmaWxlcworICAgKiAgIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyAnemxpYicgdG8gcGFydGlhbGx5CisgICAqICAgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgYHNyYy9nemlwL2Z0Z3ppcC5jYCkuCisgICAqCisgICAqICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgJ2ZlYXR1cmUnLiAgU2VlIGFsc28gdGhlCisgICAqICAgbWFjcm8gYEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUJgIGJlbG93LgorICAgKi8KICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBaTGliIGxpYnJhcnkgc2VsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBtYWNybyBpcyBvbmx5IHVzZWQgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCIGlzIGRlZmluZWQuICAqLwotICAvKiAgIEl0IGFsbG93cyBGcmVlVHlwZSdzIGBmdGd6aXAnIGNvbXBvbmVudCB0byBsaW5rIHRvIHRoZSBzeXN0ZW0ncyAgICAgKi8KLSAgLyogICBpbnN0YWxsYXRpb24gb2YgdGhlIFpMaWIgbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIG9uIHN5c3RlbXMgbGlrZSAgICovCi0gIC8qICAgVW5peCBvciBWTVMgd2hlcmUgaXQgZ2VuZXJhbGx5IGlzIGFscmVhZHkgYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB5b3UgbGV0IGl0IHVuZGVmaW5lZCwgdGhlIGNvbXBvbmVudCB3aWxsIHVzZSBpdHMgb3duIGNvcHkgICAgICAgICovCi0gIC8qICAgb2YgdGhlIHpsaWIgc291cmNlcyBpbnN0ZWFkLiAgVGhlc2UgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGJlICAgICAgICAqLwotICAvKiAgIGluY2x1ZGVkIGRpcmVjdGx5IHdpdGhpbiB0aGUgY29tcG9uZW50IGFuZCAqbm90KiBleHBvcnQgZXh0ZXJuYWwgICAgKi8KLSAgLyogICBmdW5jdGlvbiBuYW1lcy4gIFRoaXMgYWxsb3dzIHlvdSB0byBsaW5rIGFueSBwcm9ncmFtIHdpdGggRnJlZVR5cGUgICovCi0gIC8qICAgX2FuZF8gWkxpYiB3aXRob3V0IGxpbmtpbmcgY29uZmxpY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24KKyAgICoKKyAgICogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIGBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCYCBpcyBkZWZpbmVkLgorICAgKiAgIEl0IGFsbG93cyBGcmVlVHlwZSdzICdmdGd6aXAnIGNvbXBvbmVudCB0byBsaW5rIHRvIHRoZSBzeXN0ZW0ncworICAgKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlCisgICAqICAgVW5peCBvciBWTVMgd2hlcmUgaXQgZ2VuZXJhbGx5IGlzIGFscmVhZHkgYXZhaWxhYmxlLgorICAgKgorICAgKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSBvZiB0aGUKKyAgICogICB6bGliIHNvdXJjZXMgaW5zdGVhZC4gIFRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZSBpbmNsdWRlZAorICAgKiAgIGRpcmVjdGx5IHdpdGhpbiB0aGUgY29tcG9uZW50IGFuZCAqKm5vdCoqIGV4cG9ydCBleHRlcm5hbCBmdW5jdGlvbgorICAgKiAgIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSBfYW5kXyBaTGliCisgICAqICAgd2l0aG91dCBsaW5raW5nIGNvbmZsaWN0cy4KKyAgICoKKyAgICogICBEbyBub3QgYCN1bmRlZmAgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lCisgICAqICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGJ6aXAyJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyJyB0byAgKi8KLSAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2J6aXAyL2Z0YnppcDIuYykuICovCi0gIC8qICAgQ29udHJhcnkgdG8gZ3ppcCwgYnppcDIgY3VycmVudGx5IGlzIG5vdCBpbmNsdWRlZCBhbmQgbmVlZCB0byB1c2UgICAqLwotICAvKiAgIHRoZSBzeXN0ZW0gYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LgorICAgKgorICAgKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZQorICAgKiAgIGBiemlwMmAgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGIGZpbGVzCisgICAqICAgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGBsaWJiejJgIHRvIHBhcnRpYWxseQorICAgKiAgIHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIGBzcmMvYnppcDIvZnRiemlwMi5jYCkuICBDb250cmFyeQorICAgKiAgIHRvIGd6aXAsIGJ6aXAyIGN1cnJlbnRseSBpcyBub3QgaW5jbHVkZWQgYW5kIG5lZWQgdG8gdXNlIHRoZSBzeXN0ZW0KKyAgICogICBhdmFpbGFibGUgYnppcDIgaW1wbGVtZW50YXRpb24uCisgICAqCisgICAqICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgJ2ZlYXR1cmUnLgorICAgKgorICAgKiAgIElmIHlvdSB1c2UgYSBidWlsZCBzeXN0ZW0gbGlrZSBjbWFrZSBvciB0aGUgYGNvbmZpZ3VyZWAgc2NyaXB0LAorICAgKiAgIG9wdGlvbnMgc2V0IGJ5IHRob3NlIHByb2dyYW1zIGhhdmUgcHJlY2VkZW5jZSwgb3ZlcndyaXRpbmcgdGhlIHZhbHVlCisgICAqICAgaGVyZSB3aXRoIHRoZSBjb25maWd1cmVkIG9uZS4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0JaSVAyCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgZmlsZSBzdHJlYW0gZnVuY3Rpb25zIGFuZCB0eXBlcywgRklMRSwgICAqLwotICAvKiBmb3BlbigpIGV0Yy4gIEVuYWJsZXMgdGhlIHVzZSBvZiBzbWFsbGVyIHN5c3RlbSBsaWJyYXJpZXMgb24gZW1iZWRkZWQgKi8KLSAgLyogc3lzdGVtcyB0aGF0IGhhdmUgbXVsdGlwbGUgc3lzdGVtIGxpYnJhcmllcywgc29tZSB3aXRoIG9yIHdpdGhvdXQgICAgICovCi0gIC8qIGZpbGUgc3RyZWFtIHN1cHBvcnQsIGluIHRoZSBjYXNlcyB3aGVyZSBmaWxlIHN0cmVhbSBzdXBwb3J0IGlzIG5vdCAgICAqLwotICAvKiBuZWNlc3Nhcnkgc3VjaCBhcyBtZW1vcnkgbG9hZGluZyBvZiBmb250IGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGZpbGUgc3RyZWFtIGZ1bmN0aW9ucyBhbmQgdHlwZXMsIGBGSUxFYCwKKyAgICogYGZvcGVuYCwgZXRjLiAgRW5hYmxlcyB0aGUgdXNlIG9mIHNtYWxsZXIgc3lzdGVtIGxpYnJhcmllcyBvbiBlbWJlZGRlZAorICAgKiBzeXN0ZW1zIHRoYXQgaGF2ZSBtdWx0aXBsZSBzeXN0ZW0gbGlicmFyaWVzLCBzb21lIHdpdGggb3Igd2l0aG91dCBmaWxlCisgICAqIHN0cmVhbSBzdXBwb3J0LCBpbiB0aGUgY2FzZXMgd2hlcmUgZmlsZSBzdHJlYW0gc3VwcG9ydCBpcyBub3QgbmVjZXNzYXJ5CisgICAqIHN1Y2ggYXMgbWVtb3J5IGxvYWRpbmcgb2YgZm9udCBmaWxlcy4KKyAgICovCiAvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fRElTQUJMRV9TVFJFQU1fU1VQUE9SVCAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQTkcgYml0bWFwIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgbG9hZGluZyBjb2xvciBiaXRtYXAgZ2x5cGhzIGluIHRoZSBQTkcgZm9ybWF0LiAqLwotICAvKiAgIFRoaXMgcmVxdWlyZXMgaGVscCBmcm9tIHRoZSBleHRlcm5hbCBsaWJwbmcgbGlicmFyeS4gIFVuY29tcHJlc3NlZCAgKi8KLSAgLyogICBjb2xvciBiaXRtYXBzIGRvIG5vdCBuZWVkIGFueSBleHRlcm5hbCBsaWJyYXJpZXMgYW5kIHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgc3VwcG9ydGVkIHJlZ2FyZGxlc3Mgb2YgdGhpcyBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUE5HIGJpdG1hcCBzdXBwb3J0LgorICAgKgorICAgKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGxvYWRpbmcgY29sb3IgYml0bWFwIGdseXBocyBpbiB0aGUgUE5HIGZvcm1hdC4KKyAgICogICBUaGlzIHJlcXVpcmVzIGhlbHAgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicG5nIGxpYnJhcnkuICBVbmNvbXByZXNzZWQKKyAgICogICBjb2xvciBiaXRtYXBzIGRvIG5vdCBuZWVkIGFueSBleHRlcm5hbCBsaWJyYXJpZXMgYW5kIHdpbGwgYmUgc3VwcG9ydGVkCisgICAqICAgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAqCisgICAqICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgJ2ZlYXR1cmUnLgorICAgKgorICAgKiAgIElmIHlvdSB1c2UgYSBidWlsZCBzeXN0ZW0gbGlrZSBjbWFrZSBvciB0aGUgYGNvbmZpZ3VyZWAgc2NyaXB0LAorICAgKiAgIG9wdGlvbnMgc2V0IGJ5IHRob3NlIHByb2dyYW1zIGhhdmUgcHJlY2VkZW5jZSwgb3ZlcndyaXRpbmcgdGhlIHZhbHVlCisgICAqICAgaGVyZSB3aXRoIHRoZSBjb25maWd1cmVkIG9uZS4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIYXJmQnV6eiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgdXNlcyB0aGUgSGFyZkJ1enogbGlicmFyeSB0byBpbXByb3ZlIGF1dG8taGludGluZyBvZiAgICAgICAqLwotICAvKiAgIE9wZW5UeXBlIGZvbnRzLiAgSWYgYXZhaWxhYmxlLCBtYW55IGdseXBocyBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KLSAgLyogICBieSBhIGZvbnQncyBjaGFyYWN0ZXIgbWFwIHdpbGwgYmUgaGludGVkIGFsc28uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBIYXJmQnV6eiBzdXBwb3J0LgorICAgKgorICAgKiAgIEZyZWVUeXBlIHVzZXMgdGhlIEhhcmZCdXp6IGxpYnJhcnkgdG8gaW1wcm92ZSBhdXRvLWhpbnRpbmcgb2YgT3BlblR5cGUKKyAgICogICBmb250cy4gIElmIGF2YWlsYWJsZSwgbWFueSBnbHlwaHMgbm90IGRpcmVjdGx5IGFkZHJlc3NhYmxlIGJ5IGEgZm9udCdzCisgICAqICAgY2hhcmFjdGVyIG1hcCB3aWxsIGJlIGhpbnRlZCBhbHNvLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLwogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgVGhpcyAqLwotICAvKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSAgICAgICAgKi8KLSAgLyogICBVbmljb2RlIHZhbHVlLCBvciByZXR1cm4gYSBNYWNpbnRvc2ggc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3IgdGhlICAgICovCi0gIC8qICAgdXNlIHdpdGggdGhlIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCBgcHNuYW1lcycgY29tcGlsZWQgaW4geW91ciAgICovCi0gIC8qICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2lsbCBwcm92aWRlIGl0cyBvd24gc2V0IG9mIGdseXBoIG5hbWVzLCAgICAgICovCi0gIC8qICAgICBpZiB5b3UgYnVpbGQgaXQgdG8gc3VwcG9ydCBwb3N0c2NyaXB0IG5hbWVzIGluIHRoZSBUcnVlVHlwZSAgICAgICAqLwotICAvKiAgICAgYHBvc3QnIHRhYmxlLCBidXQgd2lsbCBub3Qgc3ludGhlc2l6ZSBhIG1pc3NpbmcgVW5pY29kZSBjaGFybWFwLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlICAgICAgICAqLwotICAvKiAgICAgY2hhcm1hcCBvdXQgb2YgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IHdvdWxkIG5vcm1hbGx5IHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuIGJ1aWxkaW5nICAqLwotICAvKiAgIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIFR5cGUgMSBvciBDRkYgZHJpdmVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBCcm90bGkgc3VwcG9ydC4KKyAgICoKKyAgICogICBGcmVlVHlwZSB1c2VzIHRoZSBCcm90bGkgbGlicmFyeSB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGRlY29tcHJlc3NpbmcKKyAgICogICBXT0ZGMiBzdHJlYW1zLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CUk9UTEkKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nCisgICAqCisgICAqICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSAncHNuYW1lcycgbW9kdWxlLiAgVGhpcworICAgKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSBVbmljb2RlCisgICAqICAgdmFsdWUsIG9yIHJldHVybiBhIE1hY2ludG9zaCBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvciB0aGUgdXNlIHdpdGggdGhlCisgICAqICAgVHJ1ZVR5cGUgJ3Bvc3QnIHRhYmxlLgorICAgKgorICAgKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50ICdwc25hbWVzJyBjb21waWxlZCBpbiB5b3VyCisgICAqICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisgICAqCisgICAqICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgaWYgeW91CisgICAqICAgICBidWlsZCBpdCB0byBzdXBwb3J0IHBvc3RzY3JpcHQgbmFtZXMgaW4gdGhlIFRydWVUeXBlICdwb3N0JyB0YWJsZSwKKyAgICogICAgIGJ1dCB3aWxsIG5vdCBzeW50aGVzaXplIGEgbWlzc2luZyBVbmljb2RlIGNoYXJtYXAuCisgICAqCisgICAqICAgLSBUaGUgVHlwZX4xIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAKKyAgICogICAgIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250cy4KKyAgICoKKyAgICogICBZb3Ugd291bGQgbm9ybWFsbHkgdW5kZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIHdoZW4gYnVpbGRpbmcgYQorICAgKiAgIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlfjEgb3IgQ0ZGIGRyaXZlci4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3N0c2NyaXB0IE5hbWVzIHRvIFVuaWNvZGUgVmFsdWVzIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBidWlsdCB3aXRoIHRoZSBgUFNOYW1lcycgbW9kdWxlIGNvbXBpbGVkICAqLwotICAvKiAgIGluLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgbW9kdWxlIGlzIHVzZWQgdG8gY29udmVydCBhIGdseXBoIG5hbWUgKi8KLSAgLyogICBpbnRvIGEgVW5pY29kZSB2YWx1ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qICAgc3ludGhlc2l6ZSBvbiB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwIGZyb20gdGhlIENGRi9UeXBlIDEgZHJpdmVyICAqLwotICAvKiAgIHRocm91Z2ggYSBiaWcgdGFibGUgbmFtZWQgdGhlIGBBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIEFkb2JlIEdseXBoIExpc3QgICAgICAgICAqLwotICAvKiAgIGNvbXBpbGVkIGluIHlvdXIgYFBTTmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlIDEgZHJpdmVyIHdpbGwgbm90IGJlICAgKi8KLSAgLyogICBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlICovCi0gIC8qICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFBvc3RzY3JpcHQgTmFtZXMgdG8gVW5pY29kZSBWYWx1ZXMgc3VwcG9ydAorICAgKgorICAgKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlfjIgaXMgYnVpbHQgd2l0aCB0aGUgJ3BzbmFtZXMnIG1vZHVsZSBjb21waWxlZCBpbi4KKyAgICogICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBtb2R1bGUgaXMgdXNlZCB0byBjb252ZXJ0IGEgZ2x5cGggbmFtZSBpbnRvIGEKKyAgICogICBVbmljb2RlIHZhbHVlLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBvcmRlciB0byBzeW50aGVzaXplIG9uCisgICAqICAgdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZX4xIGRyaXZlciB0aHJvdWdoIGEgYmlnCisgICAqICAgdGFibGUgbmFtZWQgdGhlICdBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4KKyAgICoKKyAgICogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCB0aGUgQWRvYmUgR2x5cGggTGlzdCBjb21waWxlZAorICAgKiAgIGluIHlvdXIgJ3BzbmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlfjEgZHJpdmVyIHdpbGwgbm90IGJlIGFibGUgdG8KKyAgICogICBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250cy4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLwotICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KLSAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTdXBwb3J0IGZvciBNYWMgZm9udHMKKyAgICoKKyAgICogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvdXRsaW5lIGZvbnRzIGluIE1hYyBmb3JtYXQKKyAgICogICAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjIHJlc291cmNlKSBvbgorICAgKiAgIG5vbi1NYWMgcGxhdGZvcm1zLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgJ0ZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuCisgICAqLwogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHdWVzc2luZyBtZXRob2RzIHRvIGFjY2VzcyBlbWJlZGRlZCByZXNvdXJjZSBmb3JrcyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRW5hYmxlIGV4dHJhIE1hYyBmb250cyBzdXBwb3J0IG9uIG5vbi1NYWMgcGxhdGZvcm1zIChlLmcuICAgICAgICAgICAqLwotICAvKiAgIEdOVS9MaW51eCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmVzb3VyY2UgZm9ya3Mgd2hpY2ggaW5jbHVkZSBmb250cyBkYXRhIGFyZSBzdG9yZWQgc29tZXRpbWVzIGluICAgICAqLwotICAvKiAgIGxvY2F0aW9ucyB3aGljaCB1c2VycyBvciBkZXZlbG9wZXJzIGRvbid0IGV4cGVjdGVkLiAgSW4gc29tZSBjYXNlcywgKi8KLSAgLyogICByZXNvdXJjZSBmb3JrcyBzdGFydCB3aXRoIHNvbWUgb2Zmc2V0IGZyb20gdGhlIGhlYWQgb2YgYSBmaWxlLiAgSW4gICovCi0gIC8qICAgb3RoZXIgY2FzZXMsIHRoZSBhY3R1YWwgcmVzb3VyY2UgZm9yayBpcyBzdG9yZWQgaW4gZmlsZSBkaWZmZXJlbnQgICAqLwotICAvKiAgIGZyb20gd2hhdCB0aGUgdXNlciBzcGVjaWZpZXMuICBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB0cmllcyB0byBndWVzcyB3aGV0aGVyIHN1Y2ggb2Zmc2V0cyBvciBkaWZmZXJlbnQgZmlsZSAgICAgICovCi0gIC8qICAgbmFtZXMgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgbm9ybWFsLCBkaXJlY3QgYWNjZXNzIG9mIHJlc291cmNlIGZvcmtzIGlzIGNvbnRyb2xsZWQgdmlhICovCi0gIC8qICAgdGhlIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTIG9wdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEd1ZXNzaW5nIG1ldGhvZHMgdG8gYWNjZXNzIGVtYmVkZGVkIHJlc291cmNlIGZvcmtzCisgICAqCisgICAqICAgRW5hYmxlIGV4dHJhIE1hYyBmb250cyBzdXBwb3J0IG9uIG5vbi1NYWMgcGxhdGZvcm1zIChlLmcuLCBHTlUvTGludXgpLgorICAgKgorICAgKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbgorICAgKiAgIGxvY2F0aW9ucyB3aGljaCB1c2VycyBvciBkZXZlbG9wZXJzIGRvbid0IGV4cGVjdGVkLiAgSW4gc29tZSBjYXNlcywKKyAgICogICByZXNvdXJjZSBmb3JrcyBzdGFydCB3aXRoIHNvbWUgb2Zmc2V0IGZyb20gdGhlIGhlYWQgb2YgYSBmaWxlLiAgSW4KKyAgICogICBvdGhlciBjYXNlcywgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3JrIGlzIHN0b3JlZCBpbiBmaWxlIGRpZmZlcmVudCBmcm9tCisgICAqICAgd2hhdCB0aGUgdXNlciBzcGVjaWZpZXMuICBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIEZyZWVUeXBlIHRyaWVzCisgICAqICAgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgbmFtZXMgbXVzdCBiZSB1c2VkLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBub3JtYWwsIGRpcmVjdCBhY2Nlc3Mgb2YgcmVzb3VyY2UgZm9ya3MgaXMgY29udHJvbGxlZCB2aWEKKyAgICogICB0aGUgYEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTYCBvcHRpb24uCisgICAqLwogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGxvdyB0aGUgdXNlIG9mIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSB0byBsb2FkIHR5cGVmYWNlcyB0aGF0ICAgICAgKi8KLSAgLyogY29udGFpbiBubyBnbHlwaCBkYXRhLCBidXQgc3VwcGx5IGl0IHZpYSBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgcmVxdWlyZWQgYnkgY2xpZW50cyBzdXBwb3J0aW5nIGRvY3VtZW50IGZvcm1hdHMgd2hpY2ggICAgICAgICAqLwotICAvKiBzdXBwbHkgZm9udCBkYXRhIGluY3JlbWVudGFsbHkgYXMgdGhlIGRvY3VtZW50IGlzIHBhcnNlZCwgc3VjaCAgICAgICAgKi8KLSAgLyogYXMgdGhlIEdob3N0c2NyaXB0IGludGVycHJldGVyIGZvciB0aGUgUG9zdFNjcmlwdCBsYW5ndWFnZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQWxsb3cgdGhlIHVzZSBvZiBgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlYCB0byBsb2FkIHR5cGVmYWNlcyB0aGF0CisgICAqIGNvbnRhaW4gbm8gZ2x5cGggZGF0YSwgYnV0IHN1cHBseSBpdCB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbi4gIFRoaXMgaXMKKyAgICogcmVxdWlyZWQgYnkgY2xpZW50cyBzdXBwb3J0aW5nIGRvY3VtZW50IGZvcm1hdHMgd2hpY2ggc3VwcGx5IGZvbnQgZGF0YQorICAgKiBpbmNyZW1lbnRhbGx5IGFzIHRoZSBkb2N1bWVudCBpcyBwYXJzZWQsIHN1Y2ggYXMgdGhlIEdob3N0c2NyaXB0CisgICAqIGludGVycHJldGVyIGZvciB0aGUgUG9zdFNjcmlwdCBsYW5ndWFnZS4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgY29udmVydGVyIHRvCisgICAqIGRvIGFsbCBvZiBpdHMgd29yay4KKyAgICovCiAjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgIDE2Mzg0TAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9NQVhfTU9EVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhIHNpbmdsZSAgICAqLwotICAvKiAgIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgMzIgaXMgdGhlIGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGVF9NQVhfTU9EVUxFUworICAgKgorICAgKiAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSBzaW5nbGUKKyAgICogICBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDMyfmlzIHRoZSBkZWZhdWx0LgorICAgKi8KICNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCi0gIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLwotICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KLSAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWJ1ZyBsZXZlbAorICAgKgorICAgKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwKKyAgICogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlICdmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSBtb2RlLAorICAgKiAgIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgZXhlY3V0aW9uLgorICAgKgorICAgKiAgIERlZmluZSBgRlRfREVCVUdfTEVWRUxfRVJST1JgIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuCisgICAqICAgRGVmaW5lIGBGVF9ERUJVR19MRVZFTF9UUkFDRWAgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4KKyAgICoKKyAgICogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluICdyZWxlYXNlJyBtb2RlIQorICAgKgorICAgKiAgIERvIG5vdCBgI3VuZGVmYCB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZQorICAgKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SCiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCi0gIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLwotICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KLSAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCi0gIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLwotICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBdXRvZml0dGVyIGRlYnVnZ2luZworICAgKgorICAgKiAgIElmIGBGVF9ERUJVR19BVVRPRklUYCBpcyBkZWZpbmVkLCBGcmVlVHlwZSBwcm92aWRlcyBzb21lIG1lYW5zIHRvCisgICAqICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbAorICAgKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKipuZXZlcioqIGVuYWJsZSB0aGlzCisgICAqICAgd2hpbGUgY29tcGlsaW5nIGluICdyZWxlYXNlJyBtb2RlKToKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHMKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2JsdWVfaGludHMKKyAgICogICBgYGAKKyAgICoKKyAgICogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cworICAgKiAgIGludGVybmFsIGF1dG9maXQgc3RydWN0dXJlcyB0byBzdGRvdXQgKHVzaW5nIGBwcmludGZgKToKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19nZXRfbnVtX3NlZ21lbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQKKyAgICogICBgYGAKKyAgICoKKyAgICogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6CisgICAqCisgICAqICAgYGBgCisgICAqICAgICBfYWZfZGVidWdfaGludHMKKyAgICogICBgYGAKKyAgICoKKyAgICogICBQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGBmdGdyaWRgIGRlbW8gcHJvZ3JhbSB0byBzZWUgaG93IHRob3NlCisgICAqICAgdmFyaWFibGVzIGFuZCBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQuCisgICAqCisgICAqICAgRG8gbm90IGAjdW5kZWZgIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lCisgICAqICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LgorICAgKi8KICNkZWZpbmUgRlRfREVCVUdfQVVUT0ZJVAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNZW1vcnkgRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGNvbWVzIHdpdGggYW4gaW50ZWdyYXRlZCBtZW1vcnkgZGVidWdnZXIgdGhhdCBpcyAgICAgICAqLwotICAvKiAgIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNpbXBsZSBlcnJvcnMgbGlrZSBtZW1vcnkgbGVha3Mgb3IgZG91YmxlICAgICAgKi8KLSAgLyogICBkZWxldGVzLiAgVG8gY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91ICAgICAgICovCi0gIC8qICAgc2hvdWxkIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBkZWJ1Z2dlciBpcyBvbmx5IGFjdGl2YXRlZCBhdCBydW50aW1lIHdoZW4gICAgICovCi0gIC8qICAgd2hlbiB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBgRlQyX0RFQlVHX01FTU9SWScgaXMgZGVmaW5lZCBhbHNvISAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1lbW9yeSBEZWJ1Z2dpbmcKKyAgICoKKyAgICogICBGcmVlVHlwZSBub3cgY29tZXMgd2l0aCBhbiBpbnRlZ3JhdGVkIG1lbW9yeSBkZWJ1Z2dlciB0aGF0IGlzIGNhcGFibGUKKyAgICogICBvZiBkZXRlY3Rpbmcgc2ltcGxlIGVycm9ycyBsaWtlIG1lbW9yeSBsZWFrcyBvciBkb3VibGUgZGVsZXRlcy4gIFRvCisgICAqICAgY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91IHNob3VsZCBkZWZpbmUKKyAgICogICBgRlRfREVCVUdfTUVNT1JZYCBoZXJlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGRlYnVnZ2VyIGlzIG9ubHkgYWN0aXZhdGVkIGF0IHJ1bnRpbWUgd2hlbiB3aGVuCisgICAqICAgdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUllgIGlzIGRlZmluZWQgYWxzbyEKKyAgICoKKyAgICogICBEbyBub3QgYCN1bmRlZmAgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lIGl0CisgICAqICAgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAjZGVmaW5lIEZUX0RFQlVHX01FTU9SWQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLwotICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KLSAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KLSAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCi0gIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTW9kdWxlIGVycm9ycworICAgKgorICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIHRoZSBoaWdoZXIgYnl0ZSBvZgorICAgKiAgIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCB3aGlsZQorICAgKiAgIHRoZSBsb3dlciBieXRlIGlzIHRoZSByZWFsIGVycm9yIGNvZGUuCisgICAqCisgICAqICAgU2V0dGluZyB0aGlzIG1hY3JvIG1ha2VzIHNlbnNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgc2luY2UgaXQKKyAgICogICB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlCisgICAqICAgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBgZnRtb2RlcnIuaGAgYW5kIGBmdGVycm9ycy5oYC4KKyAgICovCiAjdW5kZWYgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgRnJlZVR5cGUyIHdpbGwgICAqLwotICAvKiAgIGF2b2lkIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0IHJlcXVpcmUgYWRkcmVzcyBmaXh1cHMuICBJbnN0ZWFkIHRoZSAgKi8KLSAgLyogICBjb25zdGFudHMgd2lsbCBiZSBtb3ZlZCBpbnRvIGEgc3RydWN0IGFuZCBhZGRpdGlvbmFsIGludGlhbGl6YXRpb24gICovCi0gIC8qICAgY29kZSB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTZXR0aW5nIHRoaXMgbWFjcm8gaXMgbmVlZGVkIGZvciBzeXN0ZW1zIHRoYXQgcHJvaGliaXQgYWRkcmVzcyAgICAgICovCi0gIC8qICAgZml4dXBzLCBzdWNoIGFzIEJSRVcuICBbTm90ZSB0aGF0IHN0YW5kYXJkIGNvbXBpbGVycyBsaWtlIGdjYyBvciAgICAqLwotICAvKiAgIGNsYW5nIGhhbmRsZSBQSUMgZ2VuZXJhdGlvbiBhdXRvbWF0aWNhbGx5OyB5b3UgZG9uJ3QgaGF2ZSB0byBzZXQgICAgKi8KLSAgLyogICBGVF9DT05GSUdfT1BUSU9OX1BJQywgd2hpY2ggaXMgb25seSBuZWNlc3NhcnkgZm9yIHZlcnkgc3BlY2lhbCAgICAgICovCi0gIC8qICAgY29tcGlsZXJzLl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIGZvciBhbGwgICAgICovCi0gIC8qICAgbW9kdWxlcyAoc2VlIGBtb2R1bGVzLmNmZycgZm9yIGEgY29tcGxldGUgbGlzdCkuICBGb3IgYnVpbGRpbmcgd2l0aCAqLwotICAvKiAgIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQsIGRvIHRoZSBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAwLiBDbG9uZSB0aGUgcmVwb3NpdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMS4gRGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUElDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDIuIFJlbW92ZSBhbGwgc3ViZGlyZWN0b3JpZXMgaW4gYHNyYycgdGhhdCBkb24ndCBoYXZlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMy4gQ29tbWVudCBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlcyBpbiBgbW9kdWxlcy5jZmcnLiAgICAgICAgKi8KLSAgLyogICAgIDQuIENvbXBpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRXJyb3IgU3RyaW5ncworICAgKgorICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0LCBgRlRfRXJyb3JfU3RyaW5nYCB3aWxsIHJldHVybiBtZWFuaW5nZnVsCisgICAqICAgZGVzY3JpcHRpb25zLiAgVGhpcyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0IHRvIHJlZHVjZSB0aGUgb3ZlcmFsbAorICAgKiAgIHNpemUgb2YgRnJlZVR5cGUuCisgICAqCisgICAqICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSBgZnRlcnJvcnMuaGAuCisgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0VSUk9SX1NUUklOR1MgKi8KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTA1LDUwICs1MjksNjAgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCAgICAgICAqLwotICAvKiBlbWJlZGRlZCBiaXRtYXBzIGluIGFsbCBmb3JtYXRzIHVzaW5nIHRoZSBTRk5UIG1vZHVsZSAobmFtZWx5ICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgJiBPcGVuVHlwZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFNgIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQKKyAgICogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgJ3NmbnQnIG1vZHVsZSAobmFtZWx5CisgICAqIFRydWVUeXBlfiYgT3BlblR5cGUpLgorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLwotICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KLSAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgd2hlbiB5b3UgZG8gbm90IGNvbXBpbGUgdGhlIGBQU05hbWVzJyBtb2R1bGUgYnkgdW5kZWZpbmluZyAgKi8KLSAgLyogdGhlIGFib3ZlIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUywgdGhlIGBzZm50JyBtb2R1bGUgd2lsbCAgICovCi0gIC8qIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKEJ5IGRlZmF1bHQsIHRoZSBtb2R1bGUgdXNlcyBgUFNOYW1lcycgdG8gZXh0cmFjdCBnbHlwaCBuYW1lcy4pICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSU2AgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBjb2xvcmVkCisgICAqIG91dGxpbmVzIChmcm9tIHRoZSAnQ09MUicvJ0NQQUwnIHRhYmxlcykgaW4gYWxsIGZvcm1hdHMgdXNpbmcgdGhlICdzZm50JworICAgKiBtb2R1bGUgKG5hbWVseSBUcnVlVHlwZX4mIE9wZW5UeXBlKS4KKyAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVNgIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8KKyAgICogbG9hZCBhbmQgZW51bWVyYXRlIHRoZSBnbHlwaCBQb3N0c2NyaXB0IG5hbWVzIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUKKyAgICogZmlsZS4KKyAgICoKKyAgICogTm90ZSB0aGF0IHdoZW4geW91IGRvIG5vdCBjb21waWxlIHRoZSAncHNuYW1lcycgbW9kdWxlIGJ5IHVuZGVmaW5pbmcgdGhlCisgICAqIGFib3ZlIGBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVNgLCB0aGUgJ3NmbnQnIG1vZHVsZSB3aWxsCisgICAqIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuCisgICAqCisgICAqIChCeSBkZWZhdWx0LCB0aGUgbW9kdWxlIHVzZXMgJ3BzbmFtZXMnIHRvIGV4dHJhY3QgZ2x5cGggbmFtZXMuKQorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMgaWYgeW91ciBhcHBsaWNhdGlvbnMgbmVlZCB0byAgICAgICAqLwotICAvKiBhY2Nlc3MgdGhlIGludGVybmFsIG5hbWUgdGFibGUgaW4gYSBTRk5ULWJhc2VkIGZvcm1hdCBsaWtlIFRydWVUeXBlICAgKi8KLSAgLyogb3IgT3BlblR5cGUuICBUaGUgbmFtZSB0YWJsZSBjb250YWlucyB2YXJpb3VzIHN0cmluZ3MgdXNlZCB0byAgICAgICAgICovCi0gIC8qIGRlc2NyaWJlIHRoZSBmb250LCBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gIEl0ICAgICAqLwotICAvKiBkb2VzIG5vdCBjb250YWluIGFueSBnbHlwaCBuYW1lIHRob3VnaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFjY2Vzc2luZyBTRk5UIG5hbWVzIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICAgICAgICAqLwotICAvKiBgZnRzbmFtZXMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgYFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FU2AgaWYgeW91ciBhcHBsaWNhdGlvbnMgbmVlZCB0byBhY2Nlc3MKKyAgICogdGhlIGludGVybmFsIG5hbWUgdGFibGUgaW4gYSBTRk5ULWJhc2VkIGZvcm1hdCBsaWtlIFRydWVUeXBlIG9yCisgICAqIE9wZW5UeXBlLiAgVGhlIG5hbWUgdGFibGUgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAqIGZvbnQsIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgSXQgZG9lcyBub3QgY29udGFpbgorICAgKiBhbnkgZ2x5cGggbmFtZSB0aG91Z2guCisgICAqCisgICAqIEFjY2Vzc2luZyBTRk5UIG5hbWVzIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluCisgICAqIGBmdHNuYW1lcy5oYC4KKyAgICovCiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBDTWFwIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSB5b3UgY2FuIGZpbmUtdHVuZSB3aGljaCBUcnVlVHlwZSBDTWFwIHRhYmxlIGZvcm1hdCBzaGFsbCBiZSAgICAqLwotICAvKiAgIHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRydWVUeXBlIENNYXAgc3VwcG9ydAorICAgKgorICAgKiAgIEhlcmUgeW91IGNhbiBmaW5lLXR1bmUgd2hpY2ggVHJ1ZVR5cGUgQ01hcCB0YWJsZSBmb3JtYXQgc2hhbGwgYmUKKyAgICogICBzdXBwb3J0ZWQuCisgICAqLwogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNApAQCAtNTY4LDEyMiArNjAyLDEzMCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgKi8KLSAgLyogYSBieXRlY29kZSBpbnRlcnByZXRlciBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoaXMsIHlvdSB3aWxsIG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gbG9hZCAgKi8KLSAgLyogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlLCBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0ICAgICAgICAgKi8KLSAgLyogICBkZWZpbmUgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSYCBpZiB5b3Ugd2FudCB0byBjb21waWxlIGEKKyAgICogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4KKyAgICoKKyAgICogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugd2lsbCBvbmx5IGNvbXBpbGUgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxvYWQKKyAgICogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4KKyAgICoKKyAgICogRG8gbm90IGAjdW5kZWZgIHRoaXMgbWFjcm8gaGVyZSwgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgaXQKKyAgICogZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgICAgICovCi0gIC8qIHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydCBpbnRvIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGlzIG1vZGlmaWVzIHRoZSAqLwotICAvKiBUcnVlVHlwZSBoaW50aW5nIG1lY2hhbmlzbSB3aGVuIGFueXRoaW5nIGJ1dCBGVF9SRU5ERVJfTU9ERV9NT05PIGlzICAgKi8KLSAgLyogcmVxdWVzdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbiBwYXJ0aWN1bGFyLCBpdCBtb2RpZmllcyB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gaW50ZXJwcmV0IChvciAgKi8KLSAgLyogbm90KSBpbnN0cnVjdGlvbnMgaW4gYSBjZXJ0YWluIHdheSBzbyB0aGF0IGFsbCBUcnVlVHlwZSBmb250cyBsb29rICAgICovCi0gIC8qIGxpa2UgdGhleSBkbyBpbiBhIFdpbmRvd3MgQ2xlYXJUeXBlIChEaXJlY3RXcml0ZSkgZW52aXJvbm1lbnQuICBTZWUgICAqLwotICAvKiBbMV0gZm9yIGEgdGVjaG5pY2FsIG92ZXJ2aWV3IG9uIHdoYXQgdGhpcyBtZWFucy4gIFNlZSBgdHRpbnRlcnAuaCcgICAgKi8KLSAgLyogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgTEVBTiBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgdGhyZWUgb3B0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDEuIFRoaXMgb3B0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYEluZmluYWxpdHknIG1vbmlrZXIuICAgICAgICAgICAqLwotICAvKiAgICBDb250cmlidXRlZCBieSBhbiBpbmRpdmlkdWFsIG5pY2tuYW1lZCBJbmZpbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgKi8KLSAgLyogICAgbWFraW5nIFRydWVUeXBlIGZvbnRzIHJlbmRlciBiZXR0ZXIgdGhhbiBvbiBXaW5kb3dzLiAgQSBoaWdoICAgICAgICovCi0gIC8qICAgIGFtb3VudCBvZiBjb25maWd1cmFiaWxpdHkgYW5kIGZsZXhpYmlsaXR5LCBkb3duIHRvIHJ1bGVzIGZvciAgICAgICAqLwotICAvKiAgICBzaW5nbGUgZ2x5cGhzIGluIGZvbnRzLCBidXQgYWxzbyB2ZXJ5IHNsb3cuICBJdHMgZXhwZXJpbWVudGFsIGFuZCAgKi8KLSAgLyogICAgc2xvdyBuYXR1cmUgYW5kIHRoZSBvcmlnaW5hbCBkZXZlbG9wZXIgbG9zaW5nIGludGVyZXN0IG1lYW50IHRoYXQgICovCi0gIC8qICAgIHRoaXMgb3B0aW9uIHdhcyBuZXZlciBlbmFibGVkIGluIGRlZmF1bHQgYnVpbGRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogMi4gVGhlIG5ldyBkZWZhdWx0IG1vZGUgZm9yIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGUgSW5maW5hbGl0eSBjb2RlICovCi0gIC8qICAgIGJhc2Ugd2FzIHN0cmlwcGVkIHRvIHRoZSBiYXJlIG1pbmltdW0gYW5kIGFsbCBjb25maWd1cmFiaWxpdHkgICAgICAqLwotICAvKiAgICByZW1vdmVkIGluIHRoZSBuYW1lIG9mIHNwZWVkIGFuZCBzaW1wbGljaXR5LiAgVGhlIGNvbmZpZ3VyYWJpbGl0eSAgKi8KLSAgLyogICAgd2FzIG1haW5seSBhaW1lZCBhdCBsZWdhY3kgZm9udHMgbGlrZSBBcmlhbCwgVGltZXMgTmV3IFJvbWFuLCBvciAgICovCi0gIC8qICAgIENvdXJpZXIuICBMZWdhY3kgZm9udHMgYXJlIGZvbnRzIHRoYXQgbW9kaWZ5IHZlcnRpY2FsIHN0ZW1zIHRvICAgICAqLwotICAvKiAgICBhY2hpZXZlIGNsZWFuIGJsYWNrLWFuZC13aGl0ZSBiaXRtYXBzLiAgVGhlIG5ldyBtb2RlIGZvY3VzZXMgb24gICAgKi8KLSAgLyogICAgYXBwbHlpbmcgYSBtaW5pbWFsIHNldCBvZiBydWxlcyB0byBhbGwgZm9udHMgaW5kaXNjcmltaW5hdGVseSBzbyAgICovCi0gIC8qICAgIHRoYXQgbW9kZXJuIGFuZCB3ZWIgZm9udHMgcmVuZGVyIHdlbGwgd2hpbGUgbGVnYWN5IGZvbnRzIHJlbmRlciAgICAqLwotICAvKiAgICBva2F5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDMuIENvbXBpbGUgYm90aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnkgdW5kZWZpbmluZyB0aGVzZSwgeW91IGdldCByZW5kZXJpbmcgYmVoYXZpb3IgbGlrZSBvbiBXaW5kb3dzICAgICAgICovCi0gIC8qIHdpdGhvdXQgQ2xlYXJUeXBlLCBpLmUuLCBXaW5kb3dzIFhQIHdpdGhvdXQgQ2xlYXJUeXBlIGVuYWJsZWQgYW5kICAgICAqLwotICAvKiBXaW45eCAoaW50ZXJwcmV0ZXIgdmVyc2lvbiB2MzUpLiAgT3Igbm90LCBkZXBlbmRpbmcgb24gaG93IG11Y2ggICAgICAgKi8KLSAgLyogaGludGluZyBibG9vZCBhbmQgdGVzdGluZyB0ZWFycyB0aGUgZm9udCBkZXNpZ25lciBwdXQgaW50byBhIGdpdmVuICAgICovCi0gIC8qIGZvbnQuICBJZiB5b3UgZGVmaW5lIG9uZSBvciBib3RoIHN1YnBpeGVsIGhpbnRpbmcgb3B0aW9ucywgeW91IGNhbiAgICAqLwotICAvKiBzd2l0Y2ggYmV0d2VlbiBiZXR3ZWVuIHYzNSBhbmQgdGhlIG9uZXMgeW91IGRlZmluZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgb3B0aW9uIHJlcXVpcmVzIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgdG8gYmUgICAgICAqLwotICAvKiBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFsxXSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgYFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElOR2AgaWYgeW91IHdhbnQgdG8gY29tcGlsZQorICAgKiBzdWJwaXhlbCBoaW50aW5nIHN1cHBvcnQgaW50byB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgVGhpcyBtb2RpZmllcyB0aGUKKyAgICogVHJ1ZVR5cGUgaGludGluZyBtZWNoYW5pc20gd2hlbiBhbnl0aGluZyBidXQgYEZUX1JFTkRFUl9NT0RFX01PTk9gIGlzCisgICAqIHJlcXVlc3RlZC4KKyAgICoKKyAgICogSW4gcGFydGljdWxhciwgaXQgbW9kaWZpZXMgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIGludGVycHJldCAob3IKKyAgICogbm90KSBpbnN0cnVjdGlvbnMgaW4gYSBjZXJ0YWluIHdheSBzbyB0aGF0IGFsbCBUcnVlVHlwZSBmb250cyBsb29rIGxpa2UKKyAgICogdGhleSBkbyBpbiBhIFdpbmRvd3MgQ2xlYXJUeXBlIChEaXJlY3RXcml0ZSkgZW52aXJvbm1lbnQuICBTZWUgWzFdIGZvciBhCisgICAqIHRlY2huaWNhbCBvdmVydmlldyBvbiB3aGF0IHRoaXMgbWVhbnMuICBTZWUgYHR0aW50ZXJwLmhgIGZvciBtb3JlCisgICAqIGRldGFpbHMgb24gdGhlIExFQU4gb3B0aW9uLgorICAgKgorICAgKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgdmFsdWVzLgorICAgKgorICAgKiBWYWx1ZSAxOgorICAgKiAgIFRoaXMgdmFsdWUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAnSW5maW5hbGl0eScgbW9uaWtlciwgY29udHJpYnV0ZWQgYnkKKyAgICogICBhbiBpbmRpdmlkdWFsIG5pY2tuYW1lZCBJbmZpbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIFRydWVUeXBlCisgICAqICAgZm9udHMgcmVuZGVyIGJldHRlciB0aGFuIG9uIFdpbmRvd3MuICBBIGhpZ2ggYW1vdW50IG9mIGNvbmZpZ3VyYWJpbGl0eQorICAgKiAgIGFuZCBmbGV4aWJpbGl0eSwgZG93biB0byBydWxlcyBmb3Igc2luZ2xlIGdseXBocyBpbiBmb250cywgYnV0IGFsc28KKyAgICogICB2ZXJ5IHNsb3cuICBJdHMgZXhwZXJpbWVudGFsIGFuZCBzbG93IG5hdHVyZSBhbmQgdGhlIG9yaWdpbmFsCisgICAqICAgZGV2ZWxvcGVyIGxvc2luZyBpbnRlcmVzdCBtZWFudCB0aGF0IHRoaXMgb3B0aW9uIHdhcyBuZXZlciBlbmFibGVkIGluCisgICAqICAgZGVmYXVsdCBidWlsZHMuCisgICAqCisgICAqICAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpcyB2MzguCisgICAqCisgICAqIFZhbHVlIDI6CisgICAqICAgVGhlIG5ldyBkZWZhdWx0IG1vZGUgZm9yIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGUgSW5maW5hbGl0eSBjb2RlCisgICAqICAgYmFzZSB3YXMgc3RyaXBwZWQgdG8gdGhlIGJhcmUgbWluaW11bSBhbmQgYWxsIGNvbmZpZ3VyYWJpbGl0eSByZW1vdmVkCisgICAqICAgaW4gdGhlIG5hbWUgb2Ygc3BlZWQgYW5kIHNpbXBsaWNpdHkuICBUaGUgY29uZmlndXJhYmlsaXR5IHdhcyBtYWlubHkKKyAgICogICBhaW1lZCBhdCBsZWdhY3kgZm9udHMgbGlrZSAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgb3IgJ0NvdXJpZXInLgorICAgKiAgIExlZ2FjeSBmb250cyBhcmUgZm9udHMgdGhhdCBtb2RpZnkgdmVydGljYWwgc3RlbXMgdG8gYWNoaWV2ZSBjbGVhbgorICAgKiAgIGJsYWNrLWFuZC13aGl0ZSBiaXRtYXBzLiAgVGhlIG5ldyBtb2RlIGZvY3VzZXMgb24gYXBwbHlpbmcgYSBtaW5pbWFsCisgICAqICAgc2V0IG9mIHJ1bGVzIHRvIGFsbCBmb250cyBpbmRpc2NyaW1pbmF0ZWx5IHNvIHRoYXQgbW9kZXJuIGFuZCB3ZWIKKyAgICogICBmb250cyByZW5kZXIgd2VsbCB3aGlsZSBsZWdhY3kgZm9udHMgcmVuZGVyIG9rYXkuCisgICAqCisgICAqICAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpcyB2NDAuCisgICAqCisgICAqIFZhbHVlIDM6CisgICAqICAgQ29tcGlsZSBib3RoLCBtYWtpbmcgYm90aCB2MzggYW5kIHY0MCBhdmFpbGFibGUgKHRoZSBsYXR0ZXIgaXMgdGhlCisgICAqICAgZGVmYXVsdCkuCisgICAqCisgICAqIEJ5IHVuZGVmaW5pbmcgdGhlc2UsIHlvdSBnZXQgcmVuZGVyaW5nIGJlaGF2aW9yIGxpa2Ugb24gV2luZG93cyB3aXRob3V0CisgICAqIENsZWFyVHlwZSwgaS5lLiwgV2luZG93cyBYUCB3aXRob3V0IENsZWFyVHlwZSBlbmFibGVkIGFuZCBXaW45eAorICAgKiAoaW50ZXJwcmV0ZXIgdmVyc2lvbiB2MzUpLiAgT3Igbm90LCBkZXBlbmRpbmcgb24gaG93IG11Y2ggaGludGluZyBibG9vZAorICAgKiBhbmQgdGVzdGluZyB0ZWFycyB0aGUgZm9udCBkZXNpZ25lciBwdXQgaW50byBhIGdpdmVuIGZvbnQuICBJZiB5b3UKKyAgICogZGVmaW5lIG9uZSBvciBib3RoIHN1YnBpeGVsIGhpbnRpbmcgb3B0aW9ucywgeW91IGNhbiBzd2l0Y2ggYmV0d2VlbgorICAgKiBiZXR3ZWVuIHYzNSBhbmQgdGhlIG9uZXMgeW91IGRlZmluZSAodXNpbmcgYEZUX1Byb3BlcnR5X1NldGApLgorICAgKgorICAgKiBUaGlzIG9wdGlvbiByZXF1aXJlcyBgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUmAgdG8gYmUKKyAgICogZGVmaW5lZC4KKyAgICoKKyAgICogWzFdCisgICAqIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweAorICAgKi8KIC8qICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICAxICAgICAqLwogLyogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgIDIgICAgICovCiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAgICAgKCAxIHwgMiApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVEIHRvIGNvbXBpbGUgdGhlICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgdG8gdXNlIEFwcGxlJ3MgZGVmaW5pdGlvbiBvZiBob3cgdG8gaGFuZGxlICAgICAgKi8KLSAgLyogY29tcG9uZW50IG9mZnNldHMgaW4gY29tcG9zaXRlIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBcHBsZSBhbmQgTVMgZGlzYWdyZWUgb24gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY29tcG9uZW50IG9mZnNldHMgICAgKi8KLSAgLyogaW4gY29tcG9zaXRlcy4gIEFwcGxlIHNheXMgdGhhdCB0aGV5IHNob3VsZCBiZSBzY2FsZWQgYnkgdGhlIHNjYWxpbmcgICovCi0gIC8qIGZhY3RvcnMgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAocm91Z2hseSwgaXQncyBtb3JlIGNvbXBsZXgpICAgICAqLwotICAvKiB3aGlsZSBNUyBzYXlzIHRoZXkgc2hvdWxkIG5vdC4gIE9wZW5UeXBlIGRlZmluZXMgdHdvIGJpdHMgaW4gdGhlICAgICAgKi8KLSAgLyogY29tcG9zaXRlIGZsYWdzIGFycmF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FtYmlndWF0ZSwgYnV0IG9sZCAgICAgICovCi0gIC8qIGZvbnRzIHdpbGwgbm90IGhhdmUgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtICAgICAgICAgICAgICAgICovCi0gIC8qICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmdseWYuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSBgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRGAgdG8gY29tcGlsZSB0aGUKKyAgICogVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIHRvIHVzZSBBcHBsZSdzIGRlZmluaXRpb24gb2YgaG93IHRvIGhhbmRsZQorICAgKiBjb21wb25lbnQgb2Zmc2V0cyBpbiBjb21wb3NpdGUgZ2x5cGhzLgorICAgKgorICAgKiBBcHBsZSBhbmQgTVMgZGlzYWdyZWUgb24gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY29tcG9uZW50IG9mZnNldHMgaW4KKyAgICogY29tcG9zaXRlcy4gIEFwcGxlIHNheXMgdGhhdCB0aGV5IHNob3VsZCBiZSBzY2FsZWQgYnkgdGhlIHNjYWxpbmcKKyAgICogZmFjdG9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IChyb3VnaGx5LCBpdCdzIG1vcmUgY29tcGxleCkgd2hpbGUKKyAgICogTVMgc2F5cyB0aGV5IHNob3VsZCBub3QuICBPcGVuVHlwZSBkZWZpbmVzIHR3byBiaXRzIGluIHRoZSBjb21wb3NpdGUKKyAgICogZmxhZ3MgYXJyYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzYW1iaWd1YXRlLCBidXQgb2xkIGZvbnRzIHdpbGwgbm90CisgICAqIGhhdmUgdGhlbS4KKyAgICoKKyAgICogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtCisgICAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmdseWYuaHRtbAorICAgKi8KICN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVECiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgICAgICAgICAqLwotICAvKiBzdXBwb3J0IGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoZnZhciwgZ3ZhciwgY3ZhciwgICAgKi8KLSAgLyogYW5kIGF2YXIgdGFibGVzKS4gIFRoaXMgaGFzIG1hbnkgc2ltaWxhcml0aWVzIHRvIFR5cGUgMSBNdWx0aXBsZSAgICAgICovCi0gIC8qIE1hc3RlcnMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSBgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVGAgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0CisgICAqIGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoJ2Z2YXInLCAnZ3ZhcicsICdjdmFyJywgYW5kCisgICAqICdhdmFyJyB0YWJsZXMpLiAgVGFnZ2VkICdGb250IFZhcmlhdGlvbnMnLCB0aGlzIGlzIG5vdyBwYXJ0IG9mIE9wZW5UeXBlCisgICAqIGFsc28uICBUaGlzIGhhcyBtYW55IHNpbWlsYXJpdGllcyB0byBUeXBlfjEgTXVsdGlwbGUgTWFzdGVycyBzdXBwb3J0LgorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CREYgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciAgICAgICAgKi8KLSAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0JERmAgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBhbgorICAgKiBlbWJlZGRlZCAnQkRGficgdGFibGUgd2l0aGluIFNGTlQtYmFzZWQgYml0bWFwIGZvcm1hdHMuCisgICAqLwogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcHRpb24gVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUyBjb250cm9scyB0aGUgbWF4aW11bSAgICAgKi8KLSAgLyogbnVtYmVyIG9mIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBleGVjdXRlZCBmb3IgYSBzaW5nbGUgcnVuIG9mIHRoZSAgICAgICovCi0gIC8qIGJ5dGVjb2RlIGludGVycHJldGVyLCBuZWVkZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy4gIFlvdSBkb24ndCAgICAqLwotICAvKiB3YW50IHRvIGNoYW5nZSB0aGlzIGV4Y2VwdCBmb3IgdmVyeSBzcGVjaWFsIHNpdHVhdGlvbnMgKGUuZy4sIG1ha2luZyAgKi8KLSAgLyogYSBsaWJyYXJ5IGZ1enplciBzcGVuZCBsZXNzIHRpbWUgdG8gaGFuZGxlIGJyb2tlbiBmb250cykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBpcyBub3QgZXhwZWN0ZWQgdGhhdCB0aGlzIHZhbHVlIGlzIGV2ZXIgbW9kaWZpZWQgYnkgYSBjb25maWd1cmluZyAgKi8KLSAgLyogc2NyaXB0OyBpbnN0ZWFkLCBpdCBnZXRzIHN1cnJvdW5kZWQgd2l0aCAjaWZuZGVmIC4uLiAjZW5kaWYgc28gdGhhdCAgICovCi0gIC8qIHRoZSB2YWx1ZSBjYW4gYmUgc2V0IGFzIGEgcHJlcHJvY2Vzc29yIG9wdGlvbiBvbiB0aGUgY29tcGlsZXIncyAgICAgICAqLwotICAvKiBjb21tYW5kIGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBPcHRpb24gYFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVNgIGNvbnRyb2xzIHRoZSBtYXhpbXVtCisgICAqIG51bWJlciBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQgZm9yIGEgc2luZ2xlIHJ1biBvZiB0aGUKKyAgICogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLiAgWW91IGRvbid0IHdhbnQKKyAgICogdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5IHNwZWNpYWwgc2l0dWF0aW9ucyAoZS5nLiwgbWFraW5nIGEKKyAgICogbGlicmFyeSBmdXp6ZXIgc3BlbmQgbGVzcyB0aW1lIHRvIGhhbmRsZSBicm9rZW4gZm9udHMpLgorICAgKgorICAgKiBJdCBpcyBub3QgZXhwZWN0ZWQgdGhhdCB0aGlzIHZhbHVlIGlzIGV2ZXIgbW9kaWZpZWQgYnkgYSBjb25maWd1cmluZworICAgKiBzY3JpcHQ7IGluc3RlYWQsIGl0IGdldHMgc3Vycm91bmRlZCB3aXRoIGAjaWZuZGVmIC4uLiAjZW5kaWZgIHNvIHRoYXQKKyAgICogdGhlIHZhbHVlIGNhbiBiZSBzZXQgYXMgYSBwcmVwcm9jZXNzb3Igb3B0aW9uIG9uIHRoZSBjb21waWxlcidzIGNvbW1hbmQKKyAgICogbGluZS4KKyAgICovCiAjaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVMKICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUyAgMTAwMDAwMEwKICNlbmRpZgpAQCAtNjk4LDU5ICs3NDAsNTggQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9ESUNUX0RFUFRIIGlzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3QgZGljdGlvbmFyaWVzIGFuZCAgICAgICAqLwotICAvKiBhcnJheXMgaW4gdGhlIFR5cGUgMSBzdHJlYW0gKHNlZSB0MWxvYWQuYykuICBBIG1pbmltdW0gb2YgNCBpcyAgICAgICAgKi8KLSAgLyogcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogYFQxX01BWF9ESUNUX0RFUFRIYCBpcyB0aGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0IGRpY3Rpb25hcmllcyBhbmQgYXJyYXlzCisgICAqIGluIHRoZSBUeXBlfjEgc3RyZWFtIChzZWUgYHQxbG9hZC5jYCkuICBBIG1pbmltdW0gb2Z+NCBpcyByZXF1aXJlZC4KKyAgICovCiAjZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBgVDFfTUFYX1NVQlJTX0NBTExTYCBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUKKyAgICogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuCisgICAqLwogI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDE2CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9DSEFSU1RSSU5HX09QRVJBTkRTIGlzIHRoZSBjaGFyc3RyaW5nIHN0YWNrJ3MgY2FwYWNpdHkuICBBICAgICAqLwotICAvKiBtaW5pbXVtIG9mIDE2IGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBDaGluZXNlIGZvbnQgTWluZ1RpRUctTWVkaXVtIChDTlMgMTE2NDMgY2hhcmFjdGVyIHNldCkgbmVlZHMgMjU2LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIGBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EU2AgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEKKyAgICogbWluaW11bSBvZn4xNiBpcyByZXF1aXJlZC4KKyAgICoKKyAgICogVGhlIENoaW5lc2UgZm9udCAnTWluZ1RpRUctTWVkaXVtJyAoY292ZXJpbmcgdGhlIENOUyAxMTY0MyBjaGFyYWN0ZXIKKyAgICogc2V0KSBuZWVkcyAyNTYuCisgICAqLwogI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDI1NgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCi0gIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLwotICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlIGNvbXBpbGF0aW9uCisgICAqIG9mIHRoZSAndDFhZm0nIG1vZHVsZSwgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZX4xIEFGTSBmaWxlcworICAgKiBpbnRvIGFuIGV4aXN0aW5nIGZhY2UuICBOb3RlIHRoYXQgaWYgc2V0LCB0aGUgVHlwZX4xIGRyaXZlciB3aWxsIGJlCisgICAqIHVuYWJsZSB0byBwcm9kdWNlIGtlcm5pbmcgZGlzdGFuY2VzLgorICAgKi8KICN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlIDEgICAgICAgICovCi0gIC8qIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgY29tcGlsYXRpb24KKyAgICogb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlfjEgZHJpdmVyLgorICAgKi8KICN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHByZS1BZG9iZSBUeXBlIDEgICAgICovCi0gIC8qIGVuZ2luZSBnZXRzIGNvbXBpbGVkIGludG8gRnJlZVR5cGUuICBJZiBkZWZpbmVkLCBpdCBpcyBwb3NzaWJsZSB0byAgICAqLwotICAvKiBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIGVuZ2luZXMgdXNpbmcgdGhlIGBoaW50aW5nLWVuZ2luZScgcHJvcGVydHkgb2YgKi8KLSAgLyogdGhlIHR5cGUxIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogYFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIFR5cGV+MQorICAgKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8KKyAgICogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmVgIHByb3BlcnR5IG9mCisgICAqIHRoZSAndHlwZTEnIGRyaXZlciBtb2R1bGUuCisgICAqLwogI2RlZmluZSBUMV9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKIAogCkBAIC03NjMsMTcgKzgwNCwxNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCi0gIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLwotICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KLSAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgb2YgdGhlIGNmZiBkcml2ZXIgbW9kdWxlIChmaWxlICAgICAgICAqLwotICAvKiBgZnRjZmZkcnYuaCcpLCB3aGljaCBhbGxvd3MgdGhlIGNvbnRyb2wgYXQgcnVuLXRpbWUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFVzaW5nIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX3tYLFl9ezEsMiwzLDR9YCBpdCBpcworICAgKiBwb3NzaWJsZSB0byBzZXQgdXAgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBmb3VyIGNvbnRyb2wgcG9pbnRzIHRoYXQKKyAgICogZGVmaW5lIHRoZSBzdGVtIGRhcmtlbmluZyBiZWhhdmlvdXIgb2YgdGhlIChuZXcpIENGRiBlbmdpbmUuICBGb3IgbW9yZQorICAgKiBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBgZGFya2VuaW5nLXBhcmFtZXRlcnNgCisgICAqIHByb3BlcnR5IChmaWxlIGBmdGRyaXZlci5oYCksIHdoaWNoIGFsbG93cyB0aGUgY29udHJvbCBhdCBydW4tdGltZS4KKyAgICoKKyAgICogRG8gKipub3QqKiB1bmRlZmluZSB0aGVzZSBtYWNyb3MhCisgICAqLwogI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxICAgNTAwCiAjZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgICA0MDAKIApAQCAtNzg3LDEzICs4MjcsMTMgQEAKICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNCAgICAgMAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHByZS1BZG9iZSBDRkYgICAgICAgKi8KLSAgLyogZW5naW5lIGdldHMgY29tcGlsZWQgaW50byBGcmVlVHlwZS4gIElmIGRlZmluZWQsIGl0IGlzIHBvc3NpYmxlIHRvICAgICovCi0gIC8qIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gZW5naW5lcyB1c2luZyB0aGUgYGhpbnRpbmctZW5naW5lJyBwcm9wZXJ0eSBvZiAqLwotICAvKiB0aGUgY2ZmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiBlbmdpbmUKKyAgICogZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gc3dpdGNoCisgICAqIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmVgIHByb3BlcnR5IG9mIHRoZSAnY2ZmJworICAgKiBkcml2ZXIgbW9kdWxlLgorICAgKi8KICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQogCiAKQEAgLTgwNiwyMSArODQ2LDIxIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbWFueSBQQ0YgZm9udHMganVzdCBjYWxsZWQgYEZpeGVkJyB3aGljaCBsb29rIGNvbXBsZXRlbHkgICAgKi8KLSAgLyogZGlmZmVyZW50LCBhbmQgd2hpY2ggaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggZWFjaCBvdGhlci4gIFdoZW4gICAgICAgICovCi0gIC8qIHNlbGVjdGluZyBgRml4ZWQnIGluIEtERSBvciBHbm9tZSBvbmUgZ2V0cyByZXN1bHRzIHRoYXQgYXBwZWFyIHJhdGhlciAqLwotICAvKiByYW5kb20sIHRoZSBzdHlsZSBjaGFuZ2VzIG9mdGVuIGlmIG9uZSBjaGFuZ2VzIHRoZSBzaXplIGFuZCBvbmUgICAgICAgKi8KLSAgLyogY2Fubm90IHNlbGVjdCBzb21lIGZvbnRzIGF0IGFsbC4gIFRoaXMgb3B0aW9uIG1ha2VzIHRoZSBQQ0YgbW9kdWxlICAgICovCi0gIC8qIHByZXBlbmQgdGhlIGZvdW5kcnkgbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgYWxzbyBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYHdpZGUnIGNoYXJhY3RlcnM7IGFsbCBwdXQgdG9nZXRoZXIsIHdlICovCi0gIC8qIGdldCBmYW1pbHkgbmFtZXMgbGlrZSBgU29ueSBGaXhlZCcgb3IgYE1pc2MgRml4ZWQgV2lkZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCBpdCBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSAgICAgICAgICAgICovCi0gIC8qIGBuby1sb25nLWZhbWlseS1uYW1lcycgcHJvcGVydHkgb2YgdGhlIHBjZiBkcml2ZXIgbW9kdWxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCAnRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseQorICAgKiBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiBzZWxlY3RpbmcKKyAgICogJ0ZpeGVkJyBpbiBLREUgb3IgR25vbWUgb25lIGdldHMgcmVzdWx0cyB0aGF0IGFwcGVhciByYXRoZXIgcmFuZG9tLCB0aGUKKyAgICogc3R5bGUgY2hhbmdlcyBvZnRlbiBpZiBvbmUgY2hhbmdlcyB0aGUgc2l6ZSBhbmQgb25lIGNhbm5vdCBzZWxlY3Qgc29tZQorICAgKiBmb250cyBhdCBhbGwuICBUaGlzIG9wdGlvbiBtYWtlcyB0aGUgJ3BjZicgbW9kdWxlIHByZXBlbmQgdGhlIGZvdW5kcnkKKyAgICogbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuCisgICAqCisgICAqIFdlIGFsc28gY2hlY2sgd2hldGhlciB3ZSBoYXZlICd3aWRlJyBjaGFyYWN0ZXJzOyBhbGwgcHV0IHRvZ2V0aGVyLCB3ZQorICAgKiBnZXQgZmFtaWx5IG5hbWVzIGxpa2UgJ1NvbnkgRml4ZWQnIG9yICdNaXNjIEZpeGVkIFdpZGUnLgorICAgKgorICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIGl0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlCisgICAqIGBuby1sb25nLWZhbWlseS1uYW1lc2AgcHJvcGVydHkgb2YgdGhlICdwY2YnIGRyaXZlciBtb2R1bGUuCisgICAqLwogI2RlZmluZSBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUwogCiAKQEAgLTgzMyw0NyArODczLDc4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQgICAgKi8KLSAgLyogc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ29tcGlsZSAnYXV0b2ZpdCcgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQKKyAgICogc3VwcG9ydC4KKyAgICovCiAjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggSW5kaWMgc2NyaXB0IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fSU5ESUMKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCB3YXJwIGhpbnRpbmcuICBUaGUgaWRlYSBvZiB0aGUgd2FycGluZyAgICAqLwotICAvKiBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoIHdpdGhpbiBhIHNpbmdsZSBkaW1lbnNpb24gKi8KLSAgLyogc28gdGhhdCBhcyBtdWNoIG9mIGl0cyBzZWdtZW50cyBhcmUgYWxpZ25lZCAobW9yZSBvciBsZXNzKSBvbiB0aGUgICAgICovCi0gIC8qIGdyaWQuICBUbyBmaW5kIG91dCB0aGUgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cyAgICAqLwotICAvKiBwYXJhbWV0ZXIgY29tYmluYXRpb25zIGFyZSB0cmllZCBhbmQgc2NvcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZXhwZXJpbWVudGFsIG9wdGlvbiBpcyBhY3RpdmUgb25seSBpZiB0aGUgcmVuZGVyaW5nIG1vZGUgaXMgICAgICAqLwotICAvKiBGVF9SRU5ERVJfTU9ERV9MSUdIVDsgeW91IGNhbiBzd2l0Y2ggd2FycGluZyBvbiBhbmQgb2ZmIHdpdGggdGhlICAgICAgKi8KLSAgLyogYHdhcnBpbmcnIHByb3BlcnR5IG9mIHRoZSBhdXRvLWhpbnRlciAoc2VlIGZpbGUgYGZ0YXV0b2guaCcgZm9yIG1vcmUgICovCi0gIC8qIGluZm9ybWF0aW9uOyBieSBkZWZhdWx0IGl0IGlzIHN3aXRjaGVkIG9mZikuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIENvbXBpbGUgJ2F1dG9maXQnIG1vZHVsZSB3aXRoIGZhbGxiYWNrIEluZGljIHNjcmlwdCBzdXBwb3J0LCBjb3ZlcmluZworICAgKiBzb21lIHNjcmlwdHMgdGhhdCB0aGUgJ2xhdGluJyBzdWJtb2R1bGUgb2YgdGhlICdhdXRvZml0JyBtb2R1bGUgZG9lc24ndAorICAgKiAoeWV0KSBoYW5kbGUuICBDdXJyZW50bHksIHRoaXMgbmVlZHMgb3B0aW9uIGBBRl9DT05GSUdfT1BUSU9OX0NKS2AuCisgICAqLworI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fQ0pLCisjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fSU5ESUMKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIENvbXBpbGUgJ2F1dG9maXQnIG1vZHVsZSB3aXRoIHdhcnAgaGludGluZy4gIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nCisgICAqIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiBzbworICAgKiB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIG9uIHRoZSBncmlkLiAgVG8KKyAgICogZmluZCBvdXQgdGhlIG9wdGltYWwgc2NhbGluZyBhbmQgc2hpZnRpbmcgdmFsdWUsIHZhcmlvdXMgcGFyYW1ldGVyCisgICAqIGNvbWJpbmF0aW9ucyBhcmUgdHJpZWQgYW5kIHNjb3JlZC4KKyAgICoKKyAgICogWW91IGNhbiBzd2l0Y2ggd2FycGluZyBvbiBhbmQgb2ZmIHdpdGggdGhlIGB3YXJwaW5nYCBwcm9wZXJ0eSBvZiB0aGUKKyAgICogYXV0by1oaW50ZXIgKHNlZSBmaWxlIGBmdGRyaXZlci5oYCBmb3IgbW9yZSBpbmZvcm1hdGlvbjsgYnkgZGVmYXVsdCBpdAorICAgKiBpcyBzd2l0Y2hlZCBvZmYpLgorICAgKgorICAgKiBUaGlzIGV4cGVyaW1lbnRhbCBvcHRpb24gaXMgbm90IGFjdGl2ZSBpZiB0aGUgcmVuZGVyaW5nIG1vZGUgaXMKKyAgICogYEZUX1JFTkRFUl9NT0RFX0xJR0hUYC4KKyAgICovCiAjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgogCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFVzZSBUcnVlVHlwZS1saWtlIHNpemUgbWV0cmljcyBmb3IgJ2xpZ2h0JyBhdXRvLWhpbnRpbmcuCisgICAqCisgICAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGF2b2lkIHRoaXMgb3B0aW9uLCB3aGljaCBleGlzdHMgb25seSB0bworICAgKiBoZWxwIHNvbWUgbGVnYWN5IGFwcGxpY2F0aW9ucyByZXRhaW4gaXRzIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW91ciB3aXRoCisgICAqIHJlc3BlY3QgdG8gYXV0by1oaW50ZWQgVHJ1ZVR5cGUgZm9udHMuCisgICAqCisgICAqIFRoZSB2ZXJ5IHJlYXNvbiB0aGlzIG9wdGlvbiBleGlzdHMgYXQgYWxsIGFyZSBHTlUvTGludXggZGlzdHJpYnV0aW9ucworICAgKiBsaWtlIEZlZG9yYSB0aGF0IGRpZCBub3QgdW4tcGF0Y2ggdGhlIGZvbGxvd2luZyBjaGFuZ2UgKHdoaWNoIHdhcworICAgKiBwcmVzZW50IGluIEZyZWVUeXBlIGJldHdlZW4gdmVyc2lvbnMgMi40LjYgYW5kIDIuNy4xLCBpbmNsdXNpdmUpLgorICAgKgorICAgKiBgYGAKKyAgICogICAyMDExLTA3LTE2ICBTdGV2ZW4gQ2h1ICA8c3RldmVuLmYuY2h1QGdtYWlsLmNvbT4KKyAgICoKKyAgICogICAgIFt0cnVldHlwZV0gRml4IG1ldHJpY3Mgb24gc2l6ZSByZXF1ZXN0IGZvciBzY2FsYWJsZSBmb250cy4KKyAgICogYGBgCisgICAqCisgICAqIFRoaXMgcHJvYmxlbWF0aWMgY29tbWl0IGlzIG5vdyByZXZlcnRlZCAobW9yZSBvciBsZXNzKS4KKyAgICovCisvKiAjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTICovCisKICAgLyogKi8KIAogCiAgIC8qCi0gICAqIFRoaXMgbWFjcm8gaXMgb2Jzb2xldGUuICBTdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQgaW4gRnJlZVR5cGUKLSAgICogdmVyc2lvbiAyLjUuCisgICAqIFRoaXMgbWFjcm8gaXMgb2Jzb2xldGUuICBTdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQgaW4gRnJlZVR5cGUgdmVyc2lvbgorICAgKiAyLjUuCiAgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX09MRF9JTlRFUk5BTFMgKi8KIAogCiAgIC8qCi0gICAqIFRoaXMgbWFjcm8gaXMgZGVmaW5lZCBpZiBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBpcyByZXF1ZXN0ZWQgYnkgdGhlCi0gICAqIGRlZmluaXRpb25zIGFib3ZlLgorICAgKiBUaGUgbmV4dCB0aHJlZSBtYWNyb3MgYXJlIGRlZmluZWQgaWYgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgaXMKKyAgICogcmVxdWVzdGVkIGJ5IHRoZSBkZWZpbml0aW9ucyBhYm92ZS4gIERvbid0IGNoYW5nZSB0aGlzLgogICAgKi8KICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCiAjZGVmaW5lICBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKQEAgLTg5Miw3ICs5NjMsNyBAQAogCiAgIC8qCiAgICAqIENoZWNrIENGRiBkYXJrZW5pbmcgcGFyYW1ldGVycy4gIFRoZSBjaGVja3MgYXJlIHRoZSBzYW1lIGFzIGluIGZ1bmN0aW9uCi0gICAqIGBjZmZfcHJvcGVydHlfc2V0JyBpbiBmaWxlIGBjZmZkcml2ci5jJy4KKyAgICogYGNmZl9wcm9wZXJ0eV9zZXRgIGluIGZpbGUgYGNmZmRyaXZyLmNgLgogICAgKi8KICNpZiBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxIDwgMCAgIHx8IFwKICAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyIDwgMCAgIHx8IFwKZGlmZiAtLWdpdCBhL2RvY3MvLmdpdGlnbm9yZSBiL2RvY3MvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQwNWQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTIgQEAKKyMgU3RhdGljIHNpdGUgZm9sZGVyCityZWZlcmVuY2UvCisKKyMgSFRNTCBhbmQgTWFya2Rvd24gZmlsZXMKKyouaHRtbAorKi5tZAorCisjIE1rRG9jcyBDb25maWcgZmlsZQorbWtkb2NzLnltbAorCisjIFB5dGhvbiB2aXJ0dWFsZW52CitlbnYvCmRpZmYgLS1naXQgYS9kb2NzL0NIQU5HRVMgYi9kb2NzL0NIQU5HRVMKaW5kZXggYTZkMDg4YS4uM2JkNTI5MSAxMDA2NDQKLS0tIGEvZG9jcy9DSEFOR0VTCisrKyBiL2RvY3MvQ0hBTkdFUwpAQCAtMSwzICsxLDI4NSBAQAorQ0hBTkdFUyBCRVRXRUVOIDIuMTAuMyBhbmQgMi4xMC40CisKKyAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUworCisgIC0gQSBoZWFwIGJ1ZmZlciBvdmVyZmxvdyBoYXMgYmVlbiBmb3VuZCAgaW4gdGhlIGhhbmRsaW5nIG9mIGVtYmVkZGVkCisgICAgUE5HIGJpdG1hcHMsIGludHJvZHVjZWQgaW4gRnJlZVR5cGUgdmVyc2lvbiAyLjYuCisKKyAgICAgIGh0dHBzOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Q1ZFLTIwMjAtMTU5OTkKKworICAgIElmIHlvdSAgdXNlIG9wdGlvbiAgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HICB5b3UgIHNob3VsZCAgdXBncmFkZQorICAgIGltbWVkaWF0ZWx5LgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ0hBTkdFUyBCRVRXRUVOIDIuMTAuMiBhbmQgMi4xMC4zCisKKyAgSS4gSU1QT1JUQU5UIENIQU5HRVMKKworICAtIE5ldyBmbGFnIGBGVF9PVVRMSU5FX09WRVJMQVAnLiAgSWYgc2V0LCBtYWtlIHRoZSBzbW9vdGggcmFzdGVyaXplcgorICAgIGRvICA0eDQgb3ZlcnNhbXBsaW5nICB0byAgbWl0aWdhdGUgYXJ0aWZhY3RzICBpbiBwaXhlbHMgIHBhcnRpYWxseQorICAgIGNvdmVyZWQgIGJ5ICBvdmVybGFwcGluZyAgY29udG91cnMuICAgIE5vdGUgIHRoYXQgIHRoaXMgIGF0ICBsZWFzdAorICAgIHF1YWRydXBsZXMgdGhlIHJlbmRlcmluZyB0aW1lLgorCisgICAgSWYgIGEgIGdseXBoICBpbiAgYSAgVHJ1ZVR5cGUgZm9udCAgaGFzICB0aGUgIGBPVkVSTEFQX1NJTVBMRScgIG9yCisgICAgYE9WRVJMQVBfQ09NUE9VTkQnICBiaXQgc2V0LCAgRnJlZVR5cGUgYXV0b21hdGljYWxseSAgc2VsZWN0cyB0aGlzCisgICAgcmVuZGVyaW5nIG1vZGUuCisKKworICBJSS4gTUlTQ0VMTEFORU9VUworCisgIC0gVXNpbmcgdGhlICBhcmNhbmUgbWV0aG9kIG9mICBpbmNsdWRpbmcgRnJlZVR5cGUgaGVhZGVyICBmaWxlcyB3aXRoCisgICAgbWFjcm9zIGxpa2UgIGBGVF9GUkVFVFlQRV9IJyBpcyBubyBsb25nZXIgIG1hbmRhdG9yeSAoYnV0IHJldGFpbmVkCisgICAgYXMgYW4gb3B0aW9uYWwgZmVhdHVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCisKKyAgLSBTdXBwb3J0IGZvciAgYnVpbGRpbmcgdGhlIGxpYnJhcnkgIHdpdGggTWVzb24uICBCdWlsZGluZyAgdGhlIGRlbW8KKyAgICBwcm9ncmFtcyB3aXRoIE1lc29uIHdpbGwgZm9sbG93IGluIGEgZm9ydGhjb21pbmcgcmVsZWFzZS4KKworICAtIE1pbm9yIGltcHJvdmVtZW50cyB0byB0aGUgQi9XIHJhc3Rlcml6ZXIuCisKKyAgLSBBdXRvLWhpbnRlciBzdXBwb3J0IGZvciBNZWRlZmFpZHJpbiBzY3JpcHQuCisKKyAgLSBGaXggdmFyaW91cyAgbWVtb3J5IGxlYWtzIChtYWlubHkgIGZvciBDRkYpIGFuZCBvdGhlciAgaXNzdWVzIHRoYXQKKyAgICBtaWdodCBjYXVzZSBjcmFzaGVzIGluIHJhcmUgY2lyY3Vtc3RhbmNlcy4KKworICAtIEphbSBzdXBwb3J0IGhhcyBiZWVuIHJlbW92ZWQuCisKKyAgLSBJbiAgYGZ0dmlldycsIGN1c3RvbSAgTENEICBmaWx0ZXIgdmFsdWVzICBhcmUgIG5vdyBub3JtYWxpemVkICBhbmQKKyAgICBiYWxhbmNlZC4gIFVub3J0aG9kb3ggZmlsdGVycyBhcmUgc3RpbGwgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGAtTCcKKyAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgorCisgIC0gVGhlIEdVSSBkZW1vIHByb2dyYW1zIGNhbiBub3cgYmUgcmVzaXplZC4KKworICAtIERlbW8gcHJvZ3JhbXMgdGhhdCBhY2NlcHQgY29tbWFuZCAgbGluZSBvcHRpb24gYC1rJyBjYW4gbm93IGhhbmRsZQorICAgIGZ1bmN0aW9uIGtleXMsIHRvby4gIFRoZSAgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgY29kZXMgc3RhcnQgd2l0aAorICAgIDB4RjEuICBBcyAgYW4gZXhhbXBsZSwgdGhlICBQT1NJWCBzaGVsbCBzeW50YXggKGFjY2VwdGVkICBieSBiYXNoLAorICAgIGtzaCwgYW5kIHpzaCkKKworICAgICAgLWsgJCdceEYzcScKKworICAgIGVtdWxhdGVzIHRoZSBwcmVzc2luZyBvZiBmdW5jdGlvbiBrZXkgYEYzJyBmb2xsb3dlZCBieSBrZXkgYHEnLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ0hBTkdFUyBCRVRXRUVOIDIuMTAuMSBhbmQgMi4xMC4yCisKKyAgSS4gSU1QT1JUQU5UIENIQU5HRVMKKworICAtIFN1cHBvcnQgIG9mICBXT0ZGMiAgZm9udHMuICAgVGhpcyAgY29kZSAgY29udHJpYnV0aW9uICB3YXMgIE5pa2hpbAorICAgIFJhbWFrcmlzaG5hbidzIEdTb0MgMjAxOSBwcm9qZWN0LgorCisKKyAgSUkuIE1JU0NFTExBTkVPVVMKKworICAtIEZ1bmN0aW9uICBgRlRfR2V0X1Zhcl9BeGlzX0ZsYWdzJyByZXR1cm5lZCByYW5kb20gZGF0YSBmb3IgIFR5cGUgMQorICAgIE1NIGZvbnRzLgorCisgIC0gVHlwZSAxIGZvbnRzIHdpdGggbm9uLWludGVnZXIgbWV0cmljcyBhcmUgbm93IHN1cHBvcnRlZCBieSB0aGUgbmV3CisgICAgKENGRikgZW5naW5lIGludHJvZHVjZWQgaW4gRnJlZVR5cGUgMi45LgorCisgIC0gRHJvcCAgc3VwcG9ydCAgZm9yIFB5dGhvbiAyIGluIEZyZWV0eXBlJ3MgQVBJIHJlZmVyZW5jZSAgZ2VuZXJhdG9yCisgICAgYGRvY3dyaXRlcicgIChQeXRob24gPj0gMy41IGlzIHJlcXVpcmVkIGZvciB0YXJnZXRzICBgbWFrZSByZWZkb2MnCisgICAgYW5kIGBtYWtlIHJlZmRvYy12ZW52JykuCisKKyAgLSBBdXRvLWhpbnRlciBzdXBwb3J0IGZvciBIYW5pZmkgUm9oaW5neWEuCisKKyAgLSBEb2N1bWVudCB0aGUgYEZUMl9LRUVQX0FMSVZFJyBkZWJ1Z2dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUuCisKKyAgLSBUaGUgVmlzdWFsIEMrKyAoYW5kIFZpc3VhbCBDKSAgcHJvamVjdCBmaWxlcyBmb3IgV2luZG93cyBidWlsZHMgbm8KKyAgICBsb25nZXIgZ2VuZXJhdGUgbGlicmFyaWVzIHRoYXQgY29udGFpbiB0aGUgRnJlZVR5cGUgdmVyc2lvbiBpbiBpdHMKKyAgICBmaWxlbmFtZXMuICAgSW5zdGVhZCwgIGEgIHJlc291cmNlICBmaWxlIGdldHMgIHVzZWQgIHRvICBtYWtlICB0aGUKKyAgICBsaWJyYXJpZXMgY29udGFpbiB0aGUgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbi4KKworICAtIFRoZSBuZXh0IHJlbGVhc2Ugd2lsbCByZW1vdmUgSmFtIGJ1aWxkIHN1cHBvcnQuCisKKyAgLSBUaGUgIGBmdGJlbmNoJyAgZGVtbyAgcHJvZ3JhbSAgaGFzICBhIG5ldyAgdGVzdCAgZm9yICB0ZXN0aW5nICB0aGUKKyAgICBgRlRfR2x5cGhfU3Ryb2tlJyBmdW5jdGlvbmFsaXR5LgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ0hBTkdFUyBCRVRXRUVOIDIuMTAuMCBhbmQgMi4xMC4xCisKKyAgSS4gSU1QT1JUQU5UIEJVRyBGSVhFUworCisgIC0gVGhlIGJ5dGVjb2RlIGhpbnRpbmcgb2YgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzIHdhcyBmbGF3ZWQsIHNpbmNlCisgICAgdGhlIGRhdGEgaW4gdGhlIGBDVkFSJyB0YWJsZSB3YXNuJ3QgY29ycmVjdGx5IGFwcGxpZWQuCisKKworICBJSS4gTUlTQ0VMTEFORU9VUworCisgIC0gQXV0by1oaW50ZXIgc3VwcG9ydCBmb3IgTW9uZ29saWFuLgorCisgIC0gRm9yIGRpc3RyaWJ1dGlvbiwgIGAudGFyLmJ6MicgcGFja2FnZXMgYXJlIHJlcGxhY2VkIHdpdGggYC50YXIueHonCisgICAgYnVuZGxlcy4KKworICAtIFRoZSBoYW5kbGluZyBvZiAgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGluIFBDRiBmb250cyBhcyAgaW50cm9kdWNlZAorICAgIGluIHZlcnNpb24gMi4xMC4wIHdhcyBwYXJ0aWFsbHkgYnJva2VuLCBjYXVzaW5nIHByZW1hdHVyZSBhYm9ydGlvbgorICAgIG9mIGNoYXJtYXAgaXRlcmF0aW9uIGZvciBtYW55IGZvbnRzLgorCisgIC0gSWYgIGBGVF9TZXRfTmFtZWRfSW5zdGFuY2UnIHdhcyAgY2FsbGVkICB3aXRoICB0aGUgc2FtZSAgYXJndW1lbnRzCisgICAgdHdpY2UgaW4gYSByb3csIHRoZSBmdW5jdGlvbiAgcmV0dXJuZWQgYW4gaW5jb3JyZWN0IGVycm9yIGNvZGUgdGhlCisgICAgc2Vjb25kIHRpbWUuCisKKyAgLSBEaXJlY3QgICByZW5kZXJpbmcgICB1c2luZyAgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICAgY3Jhc2hlZCAgIChidWcKKyAgICBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xMC4wKS4KKworICAtIEluY3JlYXNlZCAgcHJlY2lzaW9uICB3aGlsZSAgY29tcHV0aW5nICBPcGVuVHlwZSAgZm9udCAgIHZhcmlhdGlvbgorICAgIGluc3RhbmNlcy4KKworICAtIFRoZSAgZmxhdHRlbmluZyAgYWxnb3JpdGhtIG9mICBjdWJpYyAgQmV6aWVyICBjdXJ2ZXMgd2FzICBzbGlnaHRseQorICAgIGNoYW5nZWQgdG8gbWFrZSAgaXQgZmFzdGVyLiAgVGhpcyBjYW4gY2F1c2UgIHZlcnkgc3VidGxlIHJlbmRlcmluZworICAgIGNoYW5nZXMsIHdoaWNoIGFyZW4ndCBub3RpY2VhYmxlIGJ5IHRoZSBleWUsIGhvd2V2ZXIuCisKKyAgLSBUaGUgIGF1dG8taGludGVyICBub3cgIGRpc2FibGVzIGhpbnRpbmcgIGlmIHRoZXJlICBhcmUgYmx1ZSAgem9uZXMKKyAgICBkZWZpbmVkIGZvciBhIGBzdHlsZScgKGkuZS4sIGEgY2VydGFpbiBjb21iaW5hdGlvbiBvZiBhIHNjcmlwdCBhbmQKKyAgICBpdHMgcmVsYXRlZCB0eXBvZ3JhcGhpYyBmZWF0dXJlcykgYnV0IHRoZSBmb250IGRvZXNuJ3QgY29udGFpbiBhbnkKKyAgICBjaGFyYWN0ZXJzIG5lZWRlZCB0byBzZXQgdXAgYXQgbGVhc3Qgb25lIGJsdWUgem9uZS4KKworICAtIFRoZSBgZnRtdWx0aScgZGVtbyBwcm9ncmFtIG5vdyAgc3VwcG9ydHMgbXVsdGlwbGUgaGlkZGVuIGF4ZXMgd2l0aAorICAgIHRoZSBzYW1lIG5hbWUgdGFnLgorCisgIC0gYGZ0dmlldycsIGBmdHN0cmluZycsIGFuZCBgZnRncmlkJyBnb3QgIGEgYC1rJyBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9mIGtleXN0cm9rZXMgYXQgc3RhcnQtdXAuCisKKyAgLSBgZnR2aWV3JywgYGZ0c3RyaW5nJywgYW5kIGBmdGdyaWQnIG5vdyBzdXBwb3J0IHNjcmVlbiBkdW1waW5nIHRvIGEKKyAgICBQTkcgZmlsZS4KKworICAtIFRoZSBieXRlY29kZSBkZWJ1Z2dlciwgYHR0ZGVidWcnLCAgbm93IHN1cHBvcnRzIHZhcmlhdGlvbiBUcnVlVHlwZQorICAgIGZvbnRzOyBhIHZhcmlhdGlvbiBmb250IGluc3RhbmNlIGNhbiBiZSBzZWxlY3RlZCB3aXRoIHRoZSBuZXcgYC1kJworICAgIGNvbW1hbmQgbGluZSBvcHRpb24uCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDSEFOR0VTIEJFVFdFRU4gMi45LjEgYW5kIDIuMTAuMAorCisgIEkuIElNUE9SVEFOVCBDSEFOR0VTCisKKyAgICAtIEEgYnVuY2ggIG9mIG5ldyBmdW5jdGlvbnMgaGFzICBiZWVuIGFkZGVkIHRvIGFjY2VzcyAgYW5kIHByb2Nlc3MKKyAgICAgIENPTFIvQ1BBTCBkYXRhIG9mIE9wZW5UeXBlIGZvbnRzIHdpdGggY29sb3ItbGF5ZXJlZCBnbHlwaHMuCisKKyAgICAgICAgRlRfUGFsZXR0ZV9EYXRhX0dldAorICAgICAgICAgIFJldHJpZXZlIGNvbG9yIHBhbGV0dGUgZGF0YS4KKyAgICAgICAgRlRfUGFsZXR0ZV9TZWxlY3QKKyAgICAgICAgICBTZWxlY3QgYW5kIGFjdGl2YXRlIGEgY29sb3IgcGFsZXR0ZSBmb3IgY29sb3ItbGF5ZXJlZAorICAgICAgICAgIGdseXBocy4KKyAgICAgICAgRlRfUGFsZXR0ZV9TZXRfRm9yZWdyb3VuZF9Db2xvcgorICAgICAgICAgIFNldCB0ZXh0IGZvcmVncm91bmQgY29sb3IgZm9yIHBhbGV0dGUgaW5kZXggMHhGRkZGLgorCisgICAgICAgIEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcgorICAgICAgICAgIEdldCBjb2xvciBsYXllcnMgZm9yIGEgZ2l2ZW4gZ2x5cGggKHVzaW5nIGFuIGludGVyYXRvcgorICAgICAgICAgIG9iamVjdCkuCisKKyAgICAgICAgRlRfQml0bWFwX0JsZW5kCisgICAgICAgICAgQmxlbmQgb25lIGJpdG1hcCBvbnRvIGFub3RoZXIgd2l0aCBhIGdpdmVuIGNvbG9yLgorCisgICAgLSBBbiAgIGV4cGVyaW1lbnRhbCAgZmVhdHVyZSAgIGlzICAgdGhlICBuZXcgICBiZWhhdmlvdXIgIG9mICAgdGhlCisgICAgICBgRlRfTE9BRF9DT0xPUicgbG9hZCAgZmxhZyBmb3IgY29sb3ItbGF5ZXJlZCAgZ2x5cGhzOiBJbnRlcm5hbGx5CisgICAgICBpdCAgc2V0cyBhICBmbGFnIHNvICB0aGF0ICBpZiBgRlRfUmVuZGVyX0dseXBoJyAgaXMgY2FsbGVkICB3aXRoCisgICAgICBgRlRfUkVOREVSX01PREVfTk9STUFMJyAgICAgIChvciAgICAgICBgRlRfTG9hZF9HbHlwaCcgICAgICB3aXRoCisgICAgICBgRlRfTE9BRF9SRU5ERVInKSwgYSBkZWZhdWx0IGJsZW5kaW5nICBvZiB0aGUgY29sb3IgZ2x5cGggbGF5ZXJzCisgICAgICB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGZvciBjb252ZW5pZW5jZS4KKworICAgIC0gQXMgIGEgICBHU29DICAyMDE4ICAgcHJvamVjdCwgIE5pa2hpbCAgIFJhbWFrcmlzaG5hbiAgY29tcGxldGVseQorICAgICAgb3ZlcmhhdWxlZCBhbmQgbW9kZXJuaXplZCB0aGUgQVBJIHJlZmVyZW5jZS4KKworCisgIElJLiBNSVNDRUxMQU5FT1VTCisKKyAgICAtIFRoZSAgbG9naWMgZm9yICBjb21wdXRpbmcgIHRoZSBnbG9iYWwgIGFzY2VuZGVyLCBkZXNjZW5kZXIsICBhbmQKKyAgICAgIGhlaWdodCAgb2YgIE9wZW5UeXBlICBmb250cyAgIGhhcyAgYmVlbiAgc2xpZ2h0bHkgIGFkanVzdGVkICBmb3IKKyAgICAgIGNvbnNpc3RlbmN5LgorCisgICAgICAuIElmIHRoZSBgdXNlVHlwb01ldHJpY3MnIGZsYWcgKGkuZS4sIGJpdCA3IGluIHRoZSBgZnNTZWxlY3Rpb24nCisgICAgICAgIGZpZWxkKSBpbiB0aGUgIGBPUy8yJyB0YWJsZSBpcyBzZXQsIHVzZSB0aGUgIGBzVHlwbycgZmllbGRzIGluCisgICAgICAgIGBPUy8yJyB1bmNvbmRpdGlvbmFsbHkuCisgICAgICAuIE90aGVyd2lzZSB1c2UgIHRoZSBtZXRyaWNzIGRhdGEgZnJvbSB0aGUgYGhoZWEnICB0YWJsZSAoaWYgbm90CisgICAgICAgIHplcm8pLgorICAgICAgLiBPdGhlcndpc2UgdXNlIHRoZSBgc1R5cG8nIGZpZWxkcyBmcm9tIHRoZSBgT1MvMicgdGFibGUgKGlmIG5vdAorICAgICAgICB6ZXJvKS4KKyAgICAgIC4gT3RoZXJ3aXNlIHVzZSB0aGUgYHVzV2luJyBkYXRhIGZyb20gdGhlIGBPUy8yJyB0YWJsZSBhcyBhIGxhc3QKKyAgICAgICAgcmVzb3J0LgorCisgICAgICBWYXJpYWJsZSBmb250cyB3aWxsIGFwcGx5IHRoZSBgTVZBUicgZGVsdGFzIHRvIHdoaWNoZXZlciBtZXRyaWNzCisgICAgICB3ZXJlIHBpY2tlZC4KKworICAgIC0gYFRUX1NldF9NTV9CbGVuZCcgY291bGQgIGZhaWwgaWYgIGNhbGwgcmVwZWF0ZWRseSB3aXRoICB0aGUgc2FtZQorICAgICAgYXJndW1lbnRzLgorCisgICAgLSBUaGUgcHJlY2lzaW9uICBvZiBoYW5kbGluZyAgZGVsdGFzIGluICBWYXJpYXRpb24gRm9udHMgIGhhcyBiZWVuCisgICAgICBpbmNyZWFzZWQuICBUaGUgIHByb2JsZW0gZGlkIG9ubHkgc2hvdyAgdXAgd2l0aCBtdWx0aWRpbWVuc2lvbmFsCisgICAgICBkZXNpZ25zcGFjZXMuCisKKyAgICAtIE5ldyBmdW5jdGlvbiBgRlRfTGlicmFyeV9TZXRMY2RHZW9tZXRyeScgdG8gIHNldCB1cCB0aGUgZ2VvbWV0cnkKKyAgICAgIG9mIExDRCBzdWJwaXhlbHMuCisKKyAgICAtIEZyZWVUeXBlIG5vdyB1c2VzIHRoZSBgZGVmYXVsdENoYXInIHByb3BlcnR5IG9mIFBDRiBmb250cyB0byBzZXQKKyAgICAgIHRoZSAgZ2x5cGggZm9yICB0aGUgdW5kZWZpbmVkICBjaGFyYWN0ZXIgIGF0IGdseXBoICBpbmRleCAwICAoYXMKKyAgICAgIEZyZWVUeXBlIGFscmVhZHkgZG9lcyBmb3IgYWxsIG90aGVyIHN1cHBvcnRlZCBmb250IGZvcm1hdHMpLiAgQXMKKyAgICAgIGEgY29uc2VxdWVuY2UsICB0aGUgb3JkZXIgb2YgIGdseXBocyBvZiAgYSBQQ0YgZm9udCAgaWYgYWNjZXNzZWQKKyAgICAgIHdpdGggIEZyZWVUeXBlICBjYW4gIGJlICAgZGlmZmVyZW50ICBub3cgIGNvbXBhcmVkICB0byAgcHJldmlvdXMKKyAgICAgIHZlcnNpb25zLgorCisgICAgICBUaGlzIGNoYW5nZSBkb2Vzbid0IGFmZmVjdCBQQ0YgZm9udCBhY2Nlc3Mgd2l0aCBjbWFwcy4KKworICAgIC0gYEZUX1NlbGVjdF9DaGFybWFwJyBoYXMgIGJlZW4gY2hhbmdlZCAgdG8gYWxsb3cgIHBhcmFtZXRlciB2YWx1ZQorICAgICAgYEZUX0VOQ09ESU5HX05PTkUnLCB3aGljaCBpcyB2YWxpZCBmb3IgQkRGLCBQQ0YsIGFuZCBXaW5kb3dzIEZOVAorICAgICAgZm9ybWF0cyB0byAgYWNjZXNzIGJ1aWx0LWluIGNtYXBzICB0aGF0IGRvbid0IGhhdmUgIGEgcHJlZGVmaW5lZAorICAgICAgYEZUX0VuY29kaW5nJyB2YWx1ZS4KKworICAgIC0gQSBwcmV2aW91c2x5ICByZXNlcnZlZCBmaWVsZCBpbiB0aGUgIGBGVF9HbHlwaFNsb3RSZWMnIHN0cnVjdHVyZQorICAgICAgbm93IGhvbGRzIHRoZSBnbHlwaCBpbmRleC4KKworICAgIC0gT24gV2luMzIgcGxhdGZvcm1zLCAgdGhlIHVzZSBvZiBgX0RMTCcgdG8gYnVpbGQgIHRoZSBsaWJyYXJ5IGhhcworICAgICAgYmVlbiByZXBsYWNlZCB3aXRoIGBETExfRVhQT1JUJyBhbmQgYERMTF9JTVBPUlQnLgorCisgICAgLSBUaGUgdXN1YWwgcm91bmQgIG9mIGZ1enplciBidWcgZml4ZXMgdG8gIGJldHRlciByZWplY3QgbWFsZm9ybWVkCisgICAgICBmb250cy4KKworICAgIC0gYEZUX091dGxpbmVfTmV3X0ludGVybmFsJyAgYW5kICBgRlRfT3V0bGluZV9Eb25lX0ludGVybmFsJyAgaGF2ZQorICAgICAgYmVlbiByZW1vdmVkLiAgVGhlc2UgdHdvIGZ1bmN0aW9ucyB3ZXJlIHB1YmxpYyBieSBvdmVyc2lnaHQgb25seQorICAgICAgYW5kIHdlcmUgbmV2ZXIgZG9jdW1lbnRlZC4KKworICAgIC0gQSBuZXcgIGZ1bmN0aW9uIGBGVF9FcnJvcl9TdHJpbmcnIHJldHVybnMgZGVzY3JpcHRpb25zICBvZiBlcnJvcgorICAgICAgY29kZXMgaWYgIGNvbmZpZ3VyYXRpb24gbWFjcm8gIEZUX0NPTkZJR19PUFRJT05fRVJST1JfU1RSSU5HUyBpcworICAgICAgZGVmaW5lZC4KKworICAgIC0gYEZUX1NldF9NTV9XZWlnaHRWZWN0b3InICBhbmQgIGBGVF9HZXRfTU1fV2VpZ2h0VmVjdG9yJyBhcmUgIG5ldworICAgICAgZnVuY3Rpb25zIGxpbWl0ZWQgdG8gQWRvYmUgTXVsdGlNYXN0ZXIgZm9udHMgdG8gZGlyZWN0bHkgc2V0IGFuZAorICAgICAgZ2V0IHRoZSB3ZWlnaHQgdmVjdG9yLgorCisgICAgLSBTdXBwb3J0IGZvciBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIGFzIG5lZWRlZCBieSAgc3lzdGVtcyB0aGF0CisgICAgICBwcm9oaWJpdCAgYXV0b21hdGljICBhZGRyZXNzICBmaXh1cHMsICBzdWNoICBhcyBCUkVXLCAgaGFzICBiZWVuCisgICAgICByZW1vdmVkLiAgW0NvbXBpbGF0aW9uIHdpdGggbW9kZXJuIGNvbXBpbGVycyB0aGF0IHVzZSBmbGFncyBsaWtlCisgICAgICBgLWZQSUMnIG9yIGAtZlBJRScgaXMgbm90IGFmZmVjdGVkLl0KKworICAgIC0gVGhlICBgZnRkdW1wJyBkZW1vICBwcm9ncmFtIGhhcyAgbmV3ICBvcHRpb25zIGAtYycgIGFuZCBgLUMnICB0bworICAgICAgZGlzcGxheSBjaGFybWFwcyAgaW4gY29tcGFjdCBhbmQgZGV0YWlsZWQgIGZvcm1hdCwgcmVzcGVjdGl2ZWx5LgorICAgICAgT3B0aW9uIGAtVicgaGFzIGJlZW4gcmVtb3ZlZC4KKworICAgIC0gVGhlIGBmdHZpZXcnLCBgZnRzdHJpbmcnLCAgYW5kIGBmdGdyaWQnIGRlbW8gcHJvZ3JhbXMgIHVzZSBhIG5ldworICAgICAgY29tbWFuZCBsaW5lIG9wdGlvbiBgLWQnIHRvICBzcGVjaWZ5IHRoZSBwcm9ncmFtIHdpbmRvdydzIHdpZHRoLAorICAgICAgaGVpZ2h0LCBhbmQgY29sb3IgZGVwdGguCisKKyAgICAtIFRoZSBgZnR2aWV3JyBkZW1vIHByb2dyYW0gbm93ICBkaXNwbGF5cyByZWQgYm94ZXMgZm9yIHplcm8td2lkdGgKKyAgICAgIGdseXBocy4KKworICAgIC0gYGZ0Z2x5cGgnICAgaGFzICAgbGltaXRlZCAgIHN1cHBvcnQgIHRvICAgZGlzcGxheSAgIGZvbnRzICAgd2l0aAorICAgICAgY29sb3ItbGF5ZXJlZCBnbHlwaHMuICBUaGlzIHdpbGwgYmUgaW1wcm92ZWQgbGF0ZXIgb24uCisKKyAgICAtIGBmdGdyaWQnIGNhbiBub3cgZGlzcGxheSBiaXRtYXAgZm9udHMgYWxzby4KKworICAgIC0gVGhlIGB0dGRlYnVnJyAgZGVtbyBwcm9ncmFtIGhhcyAgYSBuZXcgIG9wdGlvbiBgLWYnIHRvICBzZWxlY3QgYQorICAgICAgbWVtYmVyIG9mIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbiAoVFRDKS4KKworICAgIC0gT3RoZXIgdmFyaW91cyBpbXByb3ZlbWVudHMgdG8gdGhlIGRlbW8gcHJvZ3JhbXMuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiBDSEFOR0VTIEJFVFdFRU4gMi45IGFuZCAyLjkuMQogCiAgIEkuIElNUE9SVEFOVCBCVUcgRklYRVMKQEAgLTgsNyArMjkwLDcgQEAKICAgICAtIENWRS0yMDE4LTY5NDI6IE9sZGVyICBGcmVlVHlwZSB2ZXJzaW9ucyAgY2FuIGNyYXNoICB3aXRoIGNlcnRhaW4KICAgICAgIG1hbGZvcm1lZCB2YXJpYXRpb24gZm9udHMuCiAKLSAgICAgICAgaHR0cDovL2N2ZS5taXRyZS5vcmcvY2dpLWJpbi9jdmVuYW1lLmNnaT9uYW1lPUNWRS0yMDE4LTY5NDIKKyAgICAgICAgaHR0cHM6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DVkUtMjAxOC02OTQyCiAKIAogICBJSS4gTUlTQ0VMTEFORU9VUwpAQCAtMjgsNyArMzEwLDcgQEAKICAgICAgIHVzZSB0aGUgYHBrZy1jb25maWcnIGludGVyZmFjZS4KIAogICAgICAgVGhlIGBjb25maWd1cmUnICBzY3JpcHQgbm8gbG9uZ2VyIGluc3RhbGxzICBgZnJlZXR5cGUtY29uZmlnJyBieQotICAgICAgZGVmYXVsdC4gIEZvciAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksICBhIG5ldyAgY29uZmlndXJlIG9wdGlvbgorICAgICAgZGVmYXVsdC4gIEZvciAgYmFja3dhcmQgIGNvbXBhdGliaWxpdHksICBhIG5ldyAgY29uZmlndXJlIG9wdGlvbgogICAgICAgYC0tZW5hYmxlLWZyZWV0eXBlLWNvbmZpZycgICBpcyAgcHJvdmlkZWQgICB0aGF0ICByZXZlcnRzICAgdGhpcwogICAgICAgZGVjaXNpb24uCiAKQEAgLTIzMiw3ICs1MTQsNyBAQAogICAgICAgZm9sbG93aW5nIHByb3BlcnRpZXMgY2FuIGJlICBoYW5kbGVkOiBzdGVtIGRhcmtlbmluZywgTENEIGZpbHRlcgogICAgICAgd2VpZ2h0cywgYW5kIHRoZSByYW5kb20gc2VlZCBmb3IgdGhlIGByYW5kb20nIENGRiBvcGVyYXRvci4KIAotICAgIC0gVGhlIFBDRiBjaGFuZ2UgdG8gc2hvdyBtb3JlIGBjb2xvdXJmdWwnIGZhbWlseSBuYW1lcyAoaW50cm9kdWNlZAorICAgIC0gVGhlIFBDRiBjaGFuZ2UgdG8gc2hvdyBtb3JlIGBjb2xvcmZ1bCcgIGZhbWlseSBuYW1lcyAoaW50cm9kdWNlZAogICAgICAgaW4gdmVyc2lvbiAyLjcuMSkgd2FzIHRvbyByYWRpY2FsOyBpdCBjYW4gbm93IGJlIGNvbmZpZ3VyZWQgd2l0aAogICAgICAgUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMgICBhdCAgIGNvbXBpbGUgICB0aW1lLiAgICBJZgogICAgICAgYWN0aXZhdGVkLCBpdCBjYW4gIGJlIHN3aXRjaGVkIG9mZiBhdCBydW4gdGltZSAgd2l0aCB0aGUgbmV3IHBjZgpAQCAtMzgzLDcgKzY2NSw3IEBACiAgICAgICBhbmQgdGhlIG51bWJlciBvZiBDVlQgZW50cmllcy4gIFBsZWFzZSByZXBvcnQgaWYgeW91IGVuY291bnRlciBhCiAgICAgICBmb250IHdoZXJlIHRoZSBzZWxlY3RlZCB2YWx1ZXMgYXJlIG5vdCBhZGVxdWF0ZS4KIAotICAgIC0gUENGIGZhbWlseSBuYW1lcyBhcmUgbWFkZSBtb3JlIGBjb2xvdXJmdWwnOyB0aGV5IG5vdyBpbmNsdWRlIHRoZQorICAgIC0gUENGIGZhbWlseSBuYW1lcyBhcmUgbWFkZSBtb3JlIGBjb2xvcmZ1bCc7ICB0aGV5IG5vdyBpbmNsdWRlIHRoZQogICAgICAgZm91bmRyeSAgYW5kIGluZm9ybWF0aW9uICB3aGV0aGVyIHRoZXkgY29udGFpbiAgd2lkZSBjaGFyYWN0ZXJzLgogICAgICAgRm9yIGV4YW1wbGUsICB5b3Ugbm8gbG9uZ2VyIGdldCBgRml4ZWQnIGJ1dCAgcmF0aGVyIGBTb255IEZpeGVkJwogICAgICAgb3IgYE1pc2MgRml4ZWQgV2lkZScuCkBAIC02NjcsOCArOTQ5LDggQEAKICAgICAtIFRoZSBgZnRzdHJpbmcnIGRlbW8gcHJvZ3JhbSBub3cgc3VwcG9ydHMgc3VicGl4ZWwgcmVuZGVyaW5nOyB1c2UKICAgICAgIGtleSBgbCcgdG8gY3ljbGUgdGhyb3VnaCB0aGUgTENEIG1vZGVzLgogCi0gICAgLSBUaGUgYGZ0c3RyaW5nJyAgZGVtbyBwcm9ncmFtIG5vdyBzdXBwb3J0cyAgY29sb3VyIHJlbmRlcmluZzsgdXNlCi0gICAgICB0aGUgYHNwYWNlJyBrZXkgdG8gY3ljbGUgdGhyb3VnaCB2YXJpb3VzIGNvbG91ciBjb21iaW5hdGlvbnMuCisgICAgLSBUaGUgYGZ0c3RyaW5nJyAgZGVtbyBwcm9ncmFtIG5vdyBzdXBwb3J0cyAgY29sb3IgcmVuZGVyaW5nOyAgdXNlCisgICAgICB0aGUgYHNwYWNlJyBrZXkgdG8gY3ljbGUgdGhyb3VnaCB2YXJpb3VzIGNvbG9yIGNvbWJpbmF0aW9ucy4KIAogICAgIC0gVGhlIGdyYXBoaWNhbCBkZW1vIHByb2dyYW1zIG5vdyB1c2UgYSBkZWZhdWx0IGdhbW1hIHZhbHVlIG9mIDEuOAogICAgICAgKGluc3RlYWQgb2YgMS4yKS4KQEAgLTEzMjUsNyArMTYwNyw3IEBACiAKICAgICAgIE9yaWdpbmFsbHksIGl0IHdhcyBhIHNlcGFyYXRlIHBhdGNoIGF2YWlsYWJsZSBmcm9tCiAKLSAgICAgICAgaHR0cDovL3d3dy5pbmZpbmFsaXR5Lm5ldC9ibG9nLworICAgICAgICBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNTA3MTAwNzM5NTEvaHR0cDovL3d3dy5pbmZpbmFsaXR5Lm5ldDo4MC9ibG9nLwogCiAgICAgICBhbmQgd2hpY2ggaGFzIGJlZW4gaW50ZWdyYXRlZC4KIApAQCAtNDA0Nyw3ICs0MzI5LDcgQEAKICAgICB1bnRlc3RlZCBmb3Igbm93LgogCiAgIC0gVXBkYXRlZCBgZG9jcy9kb2NtYWtlci5weScsIGEgZHJhZnQgIEFQSSByZWZlcmVuY2UgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5mcmVldHlwZS5vcmcvZnQyYXBpLmh0bWwuCisgICAgaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDAxMjE1MTczNDAwL2h0dHA6Ly93d3cuZnJlZXR5cGUub3JnOjgwL2Z0MmFwaS5odG1sLgogCiAgIC0gQ2hhbmdlZCBgdHlwZTEnIHRvIHVzZSBgcHNhdXgnLgogCkBAIC01MDE3LDcgKzUyOTksNyBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDAtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyAgZmlsZSAgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCBtYXkgIG9ubHkgYmUgIHVzZWQsCmRpZmYgLS1naXQgYS9kb2NzL0NVU1RPTUlaRSBiL2RvY3MvQ1VTVE9NSVpFCmluZGV4IDkxNmJlMzIuLjBmOTJlNzAgMTAwNjQ0Ci0tLSBhL2RvY3MvQ1VTVE9NSVpFCisrKyBiL2RvY3MvQ1VTVE9NSVpFCkBAIC0xMzksNyArMTM5LDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwMy0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCmRpZmYgLS1naXQgYS9kb2NzL0RFQlVHIGIvZG9jcy9ERUJVRwppbmRleCA3NTFlYWYwLi5hOTZiNWUyIDEwMDY0NAotLS0gYS9kb2NzL0RFQlVHCisrKyBiL2RvY3MvREVCVUcKQEAgLTExLDIwICsxMSwyMCBAQAogCiAgIEZUX0RFQlVHX0xFVkVMX0VSUk9SCiAKLSAgICAjZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgRlRfRVJST1IgbWFjcm8gY2FsbHMKLSAgICB0byBwcmludCBlcnJvciAgbWVzc2FnZXMgZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLiAgIFRoaXMgd2lsbCBub3QKLSAgICBzdG9wICB0aGUgIHByb2dyYW0uICBWZXJ5ICB1c2VmdWwgIHRvICBzcG90IGludmFsaWQgIGZvbnRzICBkdXJpbmcKKyAgICAjZGVmaW5lIHRoaXMgIG1hY3JvIGlmICB5b3Ugd2FudCB0byAgY29tcGlsZSB0aGUgIGBGVF9FUlJPUicgbWFjcm8KKyAgICBjYWxscyB0byBwcmludCBlcnJvciBtZXNzYWdlcyBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBUaGlzIGRvZXMKKyAgICBub3Qgc3RvcCAgdGhlIHByb2dyYW0uICBWZXJ5ICB1c2VmdWwgdG8gc3BvdCBpbnZhbGlkICBmb250cyBkdXJpbmcKICAgICBkZXZlbG9wbWVudCBhbmQgdG8gY29kZSB3b3JrYXJvdW5kcyBmb3IgdGhlbS4KIAogICBGVF9ERUJVR19MRVZFTF9UUkFDRQogCi0gICAgI2RlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgYm90aCBtYWNyb3MgRlRfRVJST1IgYW5kCi0gICAgRlRfVFJBQ0UuICBUaGlzICBhbHNvIGluY2x1ZGVzIHRoZSB2YXJpYW50cyAgRlRfVFJBQ0UwLCBGVF9UUkFDRTEsCi0gICAgRlRfVFJBQ0UyLCAuLi4sIEZUX1RSQUNFNy4KKyAgICAjZGVmaW5lIHRoaXMgbWFjcm8gIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgIGJvdGggbWFjcm9zIGBGVF9FUlJPUicKKyAgICBhbmQgIGBGVF9UUkFDRScuICBUaGlzICBhbHNvICBpbmNsdWRlcyAgdGhlIHZhcmlhbnRzICBgRlRfVFJBQ0UwJywKKyAgICBgRlRfVFJBQ0UxJywgYEZUX1RSQUNFMicsIC4uLiwgYEZUX1RSQUNFNycuCiAKICAgICBUaGUgIHRyYWNlIG1hY3JvcyAgYXJlIHVzZWQgIHRvICBzZW5kIGRlYnVnZ2luZyAgbWVzc2FnZXMgd2hlbiAgYW4KICAgICBhcHByb3ByaWF0ZSAgYGRlYnVnIGxldmVsJyAgaXMgY29uZmlndXJlZCAgYXQgcnVudGltZSAgdGhyb3VnaCB0aGUKLSAgICBGVDJfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUgKG1vcmUgb24gdGhpcyBsYXRlcikuCisgICAgYEZUMl9ERUJVRycgZW52aXJvbm1lbnQgdmFyaWFibGUgKG1vcmUgb24gdGhpcyBsYXRlcikuCiAKICAgRlRfREVCVUdfTUVNT1JZCiAKQEAgLTMyLDE2ICszMiwxNiBAQAogICAgIHNtYWxsICBidXQgIGVmZmVjdGl2ZSBkZWJ1Z2dpbmcgIG1lbW9yeSAgbWFuYWdlciAgdGhhdCB0cmFja3MgIGFsbAogICAgIGFsbG9jYXRpb25zIGFuZCBmcmVlcyB0aGF0IGFyZSBwZXJmb3JtZWQgd2l0aGluIHRoZSBmb250IGVuZ2luZS4KIAotICAgIFdoZW4gIHRoZSAgRlQyX0RFQlVHX01FTU9SWSAgZW52aXJvbm1lbnQgdmFyaWFibGUgIGlzICBkZWZpbmVkICBhdAotICAgIHJ1bnRpbWUsIGEgIGNhbGwgdG8gRlRfRG9uZV9GcmVlVHlwZSB3aWxsICBkdW1wIG1lbW9yeSBzdGF0aXN0aWNzLAotICAgIGluY2x1ZGluZyAgdGhlICBsaXN0ICBvZiAgbGVha2VkIG1lbW9yeSAgYmxvY2tzICB3aXRoICB0aGUgIHNvdXJjZQotICAgIGxvY2F0aW9ucyB3aGVyZSAgdGhlc2Ugd2VyZSBhbGxvY2F0ZWQuICAgSXQgaXMgYWx3YXlzIGEgIHZlcnkgZ29vZAotICAgIGlkZWEgdG8gZGVmaW5lIHRoaXMgaW4gIGRldmVsb3BtZW50IGJ1aWxkcy4gIFRoaXMgd29ya3Mgd2l0aCBfYW55XwotICAgIHByb2dyYW0gbGlua2VkIHRvIEZyZWVUeXBlLCBidXQgcmVxdWlyZXMgYSBiaWcgZGVhbCBvZiBtZW1vcnkgKHRoZQotICAgIGRlYnVnZ2luZyBtZW1vcnkgIG1hbmFnZXIgbmV2ZXIgIGZyZWVzIHRoZSBibG9ja3MgIHRvIHRoZSAgaGVhcCBpbgotICAgIG9yZGVyIHRvIGRldGVjdCBkb3VibGUgZnJlZXMpLgorICAgIFdoZW4gIHRoZSBgRlQyX0RFQlVHX01FTU9SWScgIGVudmlyb25tZW50IHZhcmlhYmxlICBpcyBkZWZpbmVkICBhdAorICAgIHJ1bnRpbWUsICBhIGNhbGwgIHRvIGBGVF9Eb25lX0ZyZWVUeXBlJyAgZHVtcHMgbWVtb3J5ICBzdGF0aXN0aWNzLAorICAgIGluY2x1ZGluZyB0aGUgbGlzdCBvZiBsZWFrZWQgbWVtb3J5IGJsb2NrcyBhbmQgb3B0aW9uYWxseSB3aXRoIHRoZQorICAgIHNvdXJjZSBsb2NhdGlvbnMgd2hlcmUgdGhlc2Ugd2VyZSAgYWxsb2NhdGVkLiAgSXQgaXMgYWx3YXlzIGEgdmVyeQorICAgIGdvb2QgaWRlYSB0byAgZGVmaW5lIHRoaXMgaW4gZGV2ZWxvcG1lbnQgYnVpbGRzLiAgIFRoaXMgd29ya3Mgd2l0aAorICAgIF9hbnlfICBwcm9ncmFtIGxpbmtlZCAgdG8gRnJlZVR5cGUsICBidXQgIHJlcXVpcmVzIGEgIGJpZyBkZWFsICBvZgorICAgIG1lbW9yeSAodGhlIGRlYnVnZ2luZyBtZW1vcnkgbWFuYWdlciBuZXZlciBmcmVlcyB0aGUgYmxvY2tzIHRvIHRoZQorICAgIGhlYXAgaW4gb3JkZXIgdG8gZGV0ZWN0IGRvdWJsZSBmcmVlcykuCiAKLSAgICBXaGVuICBGVDJfREVCVUdfTUVNT1JZIGlzbid0ICBkZWZpbmVkICBhdCAgcnVudGltZSwgdGhlICBkZWJ1Z2dpbmcKKyAgICBXaGVuIGBGVDJfREVCVUdfTUVNT1JZJyAgaXNuJ3QgZGVmaW5lZCAgYXQgcnVudGltZSwgIHRoZSBkZWJ1Z2dpbmcKICAgICBtZW1vcnkgbWFuYWdlciBpcyBpZ25vcmVkLCBhbmQgcGVyZm9ybWFuY2UgaXMgdW5hZmZlY3RlZC4KIAogCkBAIC01NSwxMCArNTUsMTAgQEAKICAgMS4gRlRfRVJST1IoKCAuLi4gKSkKIAogICAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBzZW5kIGRlYnVnIG1lc3NhZ2VzIHRoYXQgaW5kaWNhdGUgcmVsYXRpdmVseQotICAgIHNlcmlvdXMgZXJyb3JzICAobGlrZSBicm9rZW4gIGZvbnQgZmlsZXMpLCBidXQgIHdpbGwgbm90ICBzdG9wIHRoZQorICAgIHNlcmlvdXMgIGVycm9ycyAgKGxpa2UgYnJva2VuICBmb250ICBmaWxlcykgIHdpdGhvdXQgc3RvcHBpbmcgIHRoZQogICAgIGV4ZWN1dGlvbiBvZiB0aGUgcnVubmluZyBwcm9ncmFtLiAgIEl0cyBjb2RlIGlzIGNvbXBpbGVkIG9ubHkgd2hlbgotICAgIGVpdGhlciBGVF9ERUJVR19MRVZFTF9FUlJPUiBvciBGVF9ERUJVR19MRVZFTF9UUkFDRSBhcmUgZGVmaW5lZCBpbgotICAgIGBmdG9wdGlvbi5oJy4KKyAgICBlaXRoZXIgICBgRlRfREVCVUdfTEVWRUxfRVJST1InICAgb3IgIGBGVF9ERUJVR19MRVZFTF9UUkFDRScgICBhcmUKKyAgICBkZWZpbmVkIGluIGBmdG9wdGlvbi5oJy4KIAogICAgIE5vdGUgdGhhdCB5b3UgaGF2ZSB0byB1c2UgYSBwcmludGYtbGlrZSBzaWduYXR1cmUsIGJ1dCB3aXRoIGRvdWJsZQogICAgIHBhcmVudGhlc2VzLCBsaWtlIGluCkBAIC02OSw1NCArNjksNTMgQEAKICAgMi4gRlRfQVNTRVJUKCBjb25kaXRpb24gKQogCiAgICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGNoZWNrICBzdHJvbmcgYXNzZXJ0aW9ucyBhdCBydW50aW1lLiAgSWYgaXRzCi0gICAgY29uZGl0aW9uIGlzbid0IFRSVUUsIHRoZSBwcm9ncmFtIHdpbGwgYWJvcnQgd2l0aCBhIHBhbmljIG1lc3NhZ2UuCi0gICAgSXRzICBjb2RlICAgaXMgIGNvbXBpbGVkICAgd2hlbiAgZWl0aGVyICAgRlRfREVCVUdfTEVWRUxfRVJST1IgIG9yCi0gICAgRlRfREVCVUdfTEVWRUxfVFJBQ0UgICBhcmUgIGRlZmluZWQuICAgIFlvdSAgIGRvbid0ICBuZWVkICAgZG91YmxlCi0gICAgcGFyZW50aGVzZXMgaGVyZS4gIEZvciBleGFtcGxlCisgICAgY29uZGl0aW9uIGlzbid0ICBUUlVFLCB0aGUgIHByb2dyYW0gYWJvcnRzICB3aXRoIGEgIHBhbmljIG1lc3NhZ2UuCisgICAgSXRzICBjb2RlICBpcyAgY29tcGlsZWQgICB3aGVuICBlaXRoZXIgIGBGVF9ERUJVR19MRVZFTF9FUlJPUicgIG9yCisgICAgYEZUX0RFQlVHX0xFVkVMX1RSQUNFJyAgYXJlICAgZGVmaW5lZC4gICBZb3UgIGRvbid0ICAgbmVlZCAgZG91YmxlCisgICAgcGFyZW50aGVzZXMgaGVyZS4gIEV4YW1wbGU6CiAKICAgICAgIEZUX0FTU0VSVCggcHRyICE9IE5VTEwgKTsKIAogCiAgIDMuIEZUX1RSQUNFKCBsZXZlbCwgKG1lc3NhZ2UuLi4pICkKIAotICAgIFRoZSAgRlRfVFJBQ0UgIG1hY3JvIGlzICB1c2VkICB0byAgc2VuZCBnZW5lcmFsLXB1cnBvc2UgIGRlYnVnZ2luZworICAgIFRoZSAgYEZUX1RSQUNFJyBtYWNybyAgaXMgdXNlZCAgdG8gc2VuZCAgZ2VuZXJhbC1wdXJwb3NlIGRlYnVnZ2luZwogICAgIG1lc3NhZ2VzIGR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gICBUaGlzIG1hY3JvIHVzZXMgYW4gKmltcGxpY2l0KgotICAgIG1hY3JvICBuYW1lZCAgRlRfQ09NUE9ORU5UICB1c2VkICB0byAgbmFtZSAgdGhlICBjdXJyZW50ICBGcmVlVHlwZQorICAgIG1hY3JvICBuYW1lZCAgYEZUX0NPTVBPTkVOVCcsICB3aGljaCBuYW1lcyAgdGhlICBjdXJyZW50ICBGcmVlVHlwZQogICAgIGNvbXBvbmVudCBiZWluZyBydW4uCiAKLSAgICBUaGUgZGV2ZWxvcGVyICBzaG91bGQgYWx3YXlzICBkZWZpbmUgRlRfQ09NUE9ORU5UICBhcyBhcHByb3ByaWF0ZSwKKyAgICBUaGUgZGV2ZWxvcGVyIHNob3VsZCBhbHdheXMgIGRlZmluZSBgRlRfQ09NUE9ORU5UJyBhcyBhcHByb3ByaWF0ZSwKICAgICBmb3IgZXhhbXBsZSBhcyBpbgogCiAgICAgICAjdW5kZWYgIEZUX0NPTVBPTkVOVAotICAgICAgI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2lvCisgICAgICAjZGVmaW5lIEZUX0NPTVBPTkVOVCAgaW8KIAotICAgIFRoZSAgdmFsdWUgIG9mIHRoZSAgRlRfQ09NUE9ORU5UICBtYWNybyAgaXMgYW4gIGVudW1lcmF0aW9uICBuYW1lZAotICAgIGB0cmFjZV9YWFhYJyB3aGVyZSBgWFhYWCcgaXMgb25lIG9mIHRoZSBjb21wb25lbnQgbmFtZXMgZGVmaW5lZCBpbgotICAgIHRoZSBpbnRlcm5hbCAgZmlsZSBgaW50ZXJuYWwvZnR0cmFjZS5oJy4gICBJZiB5b3UgIG1vZGlmeSBGcmVlVHlwZQotICAgIHNvdXJjZSBhbmQgaW5zZXJ0IG5ldyBgdHJhY2VfWFhYWCcgIG1hY3JvLCB5b3UgbXVzdCByZWdpc3RlciBpdCBpbgotICAgIGBmdHRyYWNlLmgnLiBJZiAgeW91IGluc2VydCBvciAgcmVtb3ZlIG1hbnkgdHJhY2UgbWFjcm9zLCAgeW91IGNhbgotICAgIGNoZWNrICAgdGhlICAgIHVuZGVmaW5lZCAgIG9yICAgdGhlICAgdW51c2VkICAgIHRyYWNlICAgbWFjcm8gICBieQotICAgIGBzcmMvdG9vbHMvY2hrdHJjbXAucHknLgorICAgIFRoZSAgdmFsdWUgb2YgIHRoZSBgRlRfQ09NUE9ORU5UJyAgbWFjcm8gaXMgIG9uZSBvZiAgdGhlIGNvbXBvbmVudAorICAgIG5hbWVzIGRlZmluZWQgIGluIHRoZSBpbnRlcm5hbCBmaWxlICBgaW50ZXJuYWwvZnR0cmFjZS5oJy4gIElmIHlvdQorICAgIG1vZGlmeSB0aGUgIEZyZWVUeXBlIHNvdXJjZSBjb2RlICBhbmQgaW5zZXJ0IGEgIG5ldyBgRlRfQ09NUE9ORU5UJworICAgIG1hY3JvLCAgeW91IG11c3QgIHJlZ2lzdGVyIGl0ICBpbiBgZnR0cmFjZS5oJy4gICBJZiB5b3UgIGluc2VydCBvcgorICAgIHJlbW92ZSBtYW55ICB0cmFjZSBtYWNyb3MsICB5b3UgY2FuIHRlc3QgIGZvciB1bmRlZmluZWQgIG9yIHVudXNlZAorICAgIHRyYWNlIG1hY3JvcyB3aXRoIHRoZSBzY3JpcHQgYHNyYy90b29scy9jaGt0cmNtcC5weScuCiAKLSAgICBFYWNoIHN1Y2ggY29tcG9uZW50IGlzIGFzc2lnbmVkIGEgYGRlYnVnIGxldmVsJywgcmFuZ2luZyBmcm9tIDAgdG8KLSAgICA3LCAgdGhyb3VnaCAgIHRoZSAgdXNlICBvZiAgdGhlICAgRlQyX0RFQlVHICBlbnZpcm9ubWVudCAgdmFyaWFibGUKLSAgICAoZGVzY3JpYmVkIGJlbG93KSB3aGVuIGEgcHJvZ3JhbSBsaW5rZWQgd2l0aCBGcmVlVHlwZSBzdGFydHMuCisgICAgRWFjaCAgc3VjaCBjb21wb25lbnQgIGlzIGFzc2lnbmVkICBhIGBkZWJ1ZyAgbGV2ZWwnLCByYW5naW5nICBmcm9tCisgICAgdmFsdWUgIDAgdG8gIDcsIHRocm91Z2ggIHRoZSAgdXNlIG9mICB0aGUgYEZUMl9ERUJVRycgIGVudmlyb25tZW50CisgICAgdmFyaWFibGUgIChkZXNjcmliZWQgYmVsb3cpICB3aGVuIGEgIHByb2dyYW0gbGlua2VkICB3aXRoIEZyZWVUeXBlCisgICAgc3RhcnRzLgogCi0gICAgV2hlbiBGVF9UUkFDRSBpcyAgY2FsbGVkLCBpdHMgbGV2ZWwgaXMgY29tcGFyZWQgdG8gIHRoZSBvbmUgb2YgdGhlCisgICAgV2hlbiBgRlRfVFJBQ0UnIGlzIGNhbGxlZCwgaXRzIGxldmVsIGlzIGNvbXBhcmVkIHRvIHRoZSBvbmUgb2YgdGhlCiAgICAgY29ycmVzcG9uZGluZyBjb21wb25lbnQuICBNZXNzYWdlcyB3aXRoIHRyYWNlIGxldmVscyAqaGlnaGVyKiB0aGFuCi0gICAgdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50IGxldmVsIGFyZSBmaWx0ZXJlZCBhbmQgbmV2ZXIgcHJpbnRlZC4KKyAgICB0aGUgIGNvcnJlc3BvbmRpbmcgIGNvbXBvbmVudCBsZXZlbCAgYXJlICBmaWx0ZXJlZCAgb3V0IGFuZCAgbmV2ZXIKKyAgICBwcmludGVkLiAgVGhpcyBtZWFucyAgdGhhdCB0cmFjZSBtZXNzYWdlcyB3aXRoIGxldmVsICAwIGFyZSBhbHdheXMKKyAgICBwcmludGVkLCB0aG9zZSAgd2l0aCBsZXZlbCAyICBhcmUgb25seSBwcmludGVkIHdoZW4gIHRoZSBjb21wb25lbnQKKyAgICBsZXZlbCBpcyAqYXQgbGVhc3QqIDIsIGV0Yy4KIAotICAgIFRoaXMgbWVhbnMgIHRoYXQgdHJhY2UgbWVzc2FnZXMgIHdpdGggbGV2ZWwgMCBhcmUgIGFsd2F5cyBwcmludGVkLAotICAgIHRob3NlIHdpdGggIGxldmVsIDIgYXJlIG9ubHkgIHByaW50ZWQgd2hlbiB0aGUgY29tcG9uZW50ICBsZXZlbCBpcwotICAgICphdCBsZWFzdCogMi4KLQotICAgIFRoZSAgc2Vjb25kIHBhcmFtZXRlciAgdG8gIEZUX1RSQUNFIG11c3QgIGNvbnRhaW4gcGFyZW50aGVzZXMgIGFuZAotICAgIGNvcnJlc3BvbmQgdG8gYSBwcmludGYtbGlrZSBjYWxsLCBhcyBpbgorICAgIFRoZSBzZWNvbmQgIHBhcmFtZXRlciB0byAgYEZUX1RSQUNFJyBtdXN0IGNvbnRhaW4gIHBhcmVudGhlc2VzIGFuZAorICAgIGNvcnJlc3BvbmRzIHRvIGEgcHJpbnRmLWxpa2UgY2FsbCwgYXMgaW4KIAogICAgICAgRlRfVFJBQ0UoIDIsICggInlvdXIgJXMgaXMgbm90ICVzXG4iLCAiZm9vIiwgImJhciIgKSApCiAKLSAgICBUaGUgICBzaG9ydGN1dCAgbWFjcm9zICAgRlRfVFJBQ0UwLCAgRlRfVFJBQ0UxLCAgIEZUX1RSQUNFMiwgIC4uLiwKLSAgICBGVF9UUkFDRTcgY2FuICBiZSB1c2VkIHdpdGggIGNvbnN0YW50IGxldmVsIGluZGljZXMsIGFuZCAgYXJlIG11Y2gKKyAgICBUaGUgIHNob3J0Y3V0IG1hY3JvcyAgYEZUX1RSQUNFMCcsIGBGVF9UUkFDRTEnLCAgYEZUX1RSQUNFMicsIC4uLiwKKyAgICBgRlRfVFJBQ0U3JyBjYW4gYmUgdXNlZCB3aXRoICBjb25zdGFudCBsZXZlbCBpbmRpY2VzLCBhbmQgYXJlIG11Y2gKICAgICBjbGVhbmVyIHRvIHVzZSwgYXMgaW4KIAogICAgICAgRlRfVFJBQ0UyKCggInlvdXIgJXMgaXMgbm90ICVzXG4iLCAiZm9vIiwgImJhciIgKSk7CkBAIC0xMzIsNjYgKzEzMSw3OSBAQAogICBGVDJfREVCVUcKIAogICAgIFRoaXMgIHZhcmlhYmxlICAgaXMgIG9ubHkgIHVzZWQgICB3aGVuICBGcmVlVHlwZSAgaXMgICBidWlsdCAgd2l0aAotICAgIEZUX0RFQlVHX0xFVkVMX1RSQUNFICBkZWZpbmVkLiAgSXQgIGNvbnRhaW5zIGEgIGxpc3Qgb2YgIGNvbXBvbmVudAorICAgIGBGVF9ERUJVR19MRVZFTF9UUkFDRScgZGVmaW5lZC4gICBJdCBjb250YWlucyBhIGxpc3QgIG9mIGNvbXBvbmVudAogICAgIGxldmVsIGRlZmluaXRpb25zLCBmb2xsb3dpbmcgdGhpcyBmb3JtYXQ6CiAKICAgICAgIGNvbXBvbmVudDE6bGV2ZWwxIGNvbXBvbmVudDI6bGV2ZWwyIGNvbXBvbmVudDM6bGV2ZWwzIC4uLgogCiAgICAgd2hlcmUgYGNvbXBvbmVudFgnIGlzIHRoZSBuYW1lICBvZiBhIHRyYWNpbmcgY29tcG9uZW50LCBhcyBkZWZpbmVkCi0gICAgaW4gYGZ0dHJhY2UuaCcsIGJ1dCB3aXRob3V0IHRoZSAgYHRyYWNlXycgcHJlZml4LiAgYGxldmVsWCcgaXMgdGhlCi0gICAgY29ycmVzcG9uZGluZyBsZXZlbCB0byB1c2UgYXQgcnVudGltZS4KKyAgICBpbiBgZnR0cmFjZS5oJy4gIGBsZXZlbFgnIGlzICB0aGUgY29ycmVzcG9uZGluZyBsZXZlbCAgdG8gIHVzZSAgYXQKKyAgICBydW50aW1lLgogCi0gICAgYGFueScgIGlzIGEgIHNwZWNpYWwgY29tcG9uZW50ICBuYW1lIHRoYXQgIHdpbGwgYmUgIGludGVycHJldGVkIGFzCi0gICAgYGFueS9hbGwgY29tcG9uZW50cycuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucworICAgIGBhbnknIGlzIGEgc3BlY2lhbCBjb21wb25lbnQgIG5hbWUgdGhhdCBpcyBpbnRlcnByZXRlZCBhcyBgYW55L2FsbAorICAgIGNvbXBvbmVudHMnLiAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMKIAogICAgICAgc2V0IEZUMl9ERUJVRz1hbnk6MiBtZW1vcnk6NSBpbzo0ICAgICAgICAob24gV2luZG93cykKICAgICAgIGV4cG9ydCBGVDJfREVCVUc9ImFueToyIG1lbW9yeTo1IGlvOjQiICAgKG9uIExpbnV4IHdpdGggYmFzaCkKIAogICAgIGJvdGggc3RpcHVsYXRlIHRoYXQgYWxsIGNvbXBvbmVudHMgc2hvdWxkIGhhdmUgbGV2ZWwgMiwgZXhjZXB0IGZvcgotICAgIHRoZSBtZW1vcnkgYW5kICBpbyBjb21wb25lbnRzIHdoaWNoIHdpbGwgYmUgc2V0ICB0byB0cmFjZSBsZXZlbHMgNQorICAgIHRoZSBtZW1vcnkgYW5kIGlvIGNvbXBvbmVudHMsIHdoaWNoICBhcmUgc2V0IHRvIHRoZSB0cmFjZSBsZXZlbHMgNQogICAgIGFuZCA0LCByZXNwZWN0aXZlbHkuCiAKIAogICBGVDJfREVCVUdfTUVNT1JZCiAKICAgICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlLCAgd2hlbiBkZWZpbmVkLCB0ZWxscyBGcmVlVHlwZSAgdG8gdXNlIGEKLSAgICBkZWJ1Z2dpbmcgbWVtb3J5IG1hbmFnZXIgdGhhdCB3aWxsICB0cmFjayBsZWFraW5nIG1lbW9yeSBibG9ja3MgYXMKLSAgICB3ZWxsIGFzIG90aGVyIGNvbW1vbiBlcnJvcnMgbGlrZSBkb3VibGUgZnJlZXMuICBJdCBpcyBhbHNvIGNhcGFibGUKLSAgICBvZiAgcmVwb3J0aW5nIF93aGVyZV8gIHRoZSAgbGVha2luZyBibG9ja3MgIHdlcmUgYWxsb2NhdGVkLCAgd2hpY2gKKyAgICBkZWJ1Z2dpbmcgbWVtb3J5IG1hbmFnZXIgdGhhdCB0cmFja3MgbGVha2luZyBtZW1vcnkgYmxvY2tzIGFzIHdlbGwKKyAgICBhcyBvdGhlciBjb21tb24gIGVycm9ycyBsaWtlIGRvdWJsZSBmcmVlcy4gIEl0IGlzICBhbHNvIGNhcGFibGUgb2YKKyAgICByZXBvcnRpbmcgIF93aGVyZV8gIHRoZSAgbGVha2luZyAgIGJsb2NrcyAgd2VyZSAgYWxsb2NhdGVkLCAgd2hpY2gKICAgICBjb25zaWRlcmFibHkgIHNhdmVzICB0aW1lICB3aGVuICBkZWJ1Z2dpbmcgbmV3ICBhZGRpdGlvbnMgIHRvICB0aGUKICAgICBsaWJyYXJ5LgogCiAgICAgVGhpcyAgY29kZSAgaXMgb25seSAgY29tcGlsZWQgIHdoZW4gIEZyZWVUeXBlICBpcyBidWlsdCAgd2l0aCAgdGhlCi0gICAgRlRfREVCVUdfTUVNT1JZIG1hY3JvICNkZWZpbmVkIGluICBgZnRvcHRpb24uaCcgdGhvdWdoLCBpdCB3aWxsIGJlCisgICAgYEZUX0RFQlVHX01FTU9SWScgIG1hY3JvICNkZWZpbmVkICBpbiBgZnRvcHRpb24uaCcgIHRob3VnaCwgaXQgIGlzCiAgICAgaWdub3JlZCBpbiBvdGhlciBidWlsZHMuCiAKIAogICBGVDJfQUxMT0NfVE9UQUxfTUFYCiAKLSAgICBUaGlzIHZhcmlhYmxlIGlzICBpZ25vcmVkIGlmIEZUMl9ERUJVR19NRU1PUlkgaXMgIG5vdCBkZWZpbmVkLiAgSXQKKyAgICBUaGlzIHZhcmlhYmxlIGlzIGlnbm9yZWQgaWYgYEZUMl9ERUJVR19NRU1PUlknIGlzIG5vdCBkZWZpbmVkLiAgSXQKICAgICBhbGxvd3MgIHlvdSAgdG8gIHNwZWNpZnkgIGEgIG1heGltdW0gIGhlYXAgIHNpemUgIGZvciAgYWxsICBtZW1vcnkKICAgICBhbGxvY2F0aW9ucyBwZXJmb3JtZWQgIGJ5IEZyZWVUeXBlLiAgVGhpcyAgaXMgdmVyeSB1c2VmdWwgIHRvIHRlc3QKICAgICB0aGUgcm9idXN0bmVzcyAgb2YgdGhlICBmb250IGVuZ2luZSAgYW5kIHByb2dyYW1zICB0aGF0IHVzZSAgaXQgaW4KICAgICB0aWdodCBtZW1vcnkgY29uZGl0aW9ucy4KIAotICAgIElmIGl0IGlzIHVuZGVmaW5lZCwgb3IgaWYgaXRzIHZhbHVlIGlzIG5vdCBzdHJpY3RseSBwb3NpdGl2ZSwgdGhlbgotICAgIG5vIGFsbG9jYXRpb24gYm91bmRzIGFyZSBjaGVja2VkIGF0IHJ1bnRpbWUuCisgICAgSWYgaXQgaXMgIHVuZGVmaW5lZCwgb3IgaWYgaXRzIHZhbHVlIGlzICBub3Qgc3RyaWN0bHkgcG9zaXRpdmUsIG5vCisgICAgYWxsb2NhdGlvbiBib3VuZHMgYXJlIGNoZWNrZWQgYXQgcnVudGltZS4KIAogCiAgIEZUMl9BTExPQ19DT1VOVF9NQVgKIAotICAgIFRoaXMgdmFyaWFibGUgaXMgIGlnbm9yZWQgaWYgRlQyX0RFQlVHX01FTU9SWSBpcyAgbm90IGRlZmluZWQuICBJdAorICAgIFRoaXMgdmFyaWFibGUgaXMgaWdub3JlZCBpZiBgRlQyX0RFQlVHX01FTU9SWScgaXMgbm90IGRlZmluZWQuICBJdAogICAgIGFsbG93cyAgeW91IHRvICBzcGVjaWZ5ICBhIG1heGltdW0gIG51bWJlciAgb2YgbWVtb3J5ICBhbGxvY2F0aW9ucwogICAgIHBlcmZvcm1lZCAgICBieSAgICBGcmVlVHlwZSAgICBiZWZvcmUgICAgcmV0dXJuaW5nICAgIHRoZSAgICBlcnJvcgotICAgIEZUX0Vycl9PdXRfT2ZfTWVtb3J5LiAgVGhpcyAgaXMgdXNlZnVsICBmb3IgZGVidWdnaW5nICBhbmQgdGVzdGluZworICAgIGBGVF9FcnJfT3V0X09mX01lbW9yeScuICBUaGlzIGlzIHVzZWZ1bCAgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZwogICAgIHRoZSBlbmdpbmUncyByb2J1c3RuZXNzLgogCi0gICAgSWYgaXQgaXMgdW5kZWZpbmVkLCBvciBpZiBpdHMgdmFsdWUgaXMgbm90IHN0cmljdGx5IHBvc2l0aXZlLCB0aGVuCi0gICAgbm8gYWxsb2NhdGlvbiBib3VuZHMgYXJlIGNoZWNrZWQgYXQgcnVudGltZS4KKyAgICBJZiBpdCBpcyAgdW5kZWZpbmVkLCBvciBpZiBpdHMgdmFsdWUgaXMgIG5vdCBzdHJpY3RseSBwb3NpdGl2ZSwgbm8KKyAgICBhbGxvY2F0aW9uIGJvdW5kcyBhcmUgY2hlY2tlZCBhdCBydW50aW1lLgorCisKKyAgRlQyX0tFRVBfQUxJVkUKKworICAgIFRoaXMgIHZhcmlhYmxlIGlzICBpZ25vcmVkIGlmICBgRlQyX0RFQlVHX01FTU9SWScgaXMgIG5vdCBkZWZpbmVkLgorICAgIGBLZWVwIGFsaXZlJyBtZWFucyB0aGF0IGZyZWVkICBibG9ja3MgYXJlbid0IHJlbGVhc2VkIHRvIHRoZSBoZWFwLgorICAgIFRoaXMgaXMgIHVzZWZ1bCB0byBkZXRlY3QgIGRvdWJsZS1mcmVlcyBvciB3ZWlyZCAgaGVhcCBjb3JydXB0aW9uLAorICAgIHJlcG9ydGluZyB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24gIG9mIHRoZSBvcmlnaW5hbCBhbGxvY2F0aW9uIGFuZAorICAgIGRlYWxsb2NhdGlvbiAgaW4gY2FzZSAgb2YgYSAgcHJvYmxlbS4gICBJdCB1c2VzICBsYXJnZSBhbW91bnRzICBvZgorICAgIG1lbW9yeSwgaG93ZXZlci4KKworICAgIElmIGl0ICBpcyB1bmRlZmluZWQsICBvciBpZiAgaXRzIHZhbHVlICBpcyBub3QgIHN0cmljdGx5IHBvc2l0aXZlLAorICAgIGZyZWVkIGJsb2NrcyBhcmUgcmVsZWFzZWQgYXQgcnVudGltZS4KIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAyLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5ICBvbmx5IGJlICB1c2VkLApkaWZmIC0tZ2l0IGEvZG9jcy9ET0NHVUlERSBiL2RvY3MvRE9DR1VJREUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2MTdiNAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvRE9DR1VJREUKQEAgLTAsMCArMSwyOTggQEAKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK0RvY3VtZW50YXRpb24gaXMgYW4gZXh0cmVtZWx5IGltcG9ydGFudCBwYXJ0IG9mIGFueSBwcm9qZWN0LCBhbmQgaXQKK2hlbHBzIGEgbG90IGlmIGl0IHVzZXMgY29uc2lzdGVudCBzeW50YXggYW5kIGxheW91dC4KKworVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IGlzIG1haW50YWluZWQgaW4gaGVhZGVyCitmaWxlcyBpbiB0aGUgYGluY2x1ZGUvYCBkaXJlY3RvcnkgaW4gdGhlIGZvcm0gb2YgY29kZSBjb21tZW50cy4gIFRoZXNlCitjb21tZW50cyBhcmUgZXh0cmFjdGVkIGFuZCBvcmdhbml6ZWQgYnkgJ2RvY3dyaXRlcicgKHByZXZpb3VzbHkKKydkb2NtYWtlcicpLiAgVGhlIGdlbmVyYXRlZCBkb2NzIGNhbiBiZSB2aWV3ZWQgaW4gdGhlCitgZG9jcy9yZWZlcmVuY2Uvc2l0ZS9gIGRpcmVjdG9yeSBhZnRlciBydW5uaW5nIGBtYWtlIHJlZmRvY2AuCisKK0RvY3VtZW50YXRpb24gY29tbWVudHMgZm9sbG93IGEgc3BlY2lmaWMgc3RydWN0dXJlIGFuZCBmb3JtYXQgYXMKK2Rlc2NyaWJlZCBiZWxvdy4KKworCitEb2N1bWVudGF0aW9uIFN0cnVjdHVyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRvY3VtZW50YXRpb24gaXMgZGl2aWRlZCBpbnRvIG11bHRpcGxlIGNoYXB0ZXJzLCB3aGljaCBjb250YWluCitzZWN0aW9ucyByZWxldmFudCB0byBpdC4gIFRoZSBjaGFwdGVyIGRldGFpbHMgYW5kIHNlY3Rpb25zIGNvbnRhaW5lZAoraW4gdGhlbSBhcmUgbGlzdGVkIGluIGBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaGAuICBBbnkgdW5saXN0ZWQKK3NlY3Rpb24gaXMgYWRkZWQgdG8gdGhlICdNaXNjZWxsYW5lb3VzJyBjaGFwdGVyLgorCitTZWN0aW9ucyBtYXkgY29udGFpbiBzdWItc2VjdGlvbnMgd2hpY2ggY29uc2lzdCBvZiBwcm9wZXJ0aWVzLAorZW51bWVyYXRpb25zLCBhbmQgb3RoZXIgZGF0YSB0eXBlcy4KKworCitDb21tZW50IEJsb2NrcworLS0tLS0tLS0tLS0tLS0KKworRG9jdW1lbnRhdGlvbiBibG9ja3MgZm9sbG93IGEgc3BlY2lmaWMgZm9ybWF0OgorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIChzaG91bGQgZW5kIG9uIGNvbHVtbiA3NykKKyAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSBhc3RlcmlzaywgMSBzcGFjZSwgdGhlbiBjb250ZW50KQorICAgICAqCisgICAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmQgb2YgYmxvY2spCisKK1RvIG1ha2UgJ2RvY3dyaXRlcicgcmVjb2duaXplIGEgY29tbWVudCBibG9jaywgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdAordHdvIGFzdGVyaXNrcyBpbiB0aGUgZmlyc3QgbGluZS4gIEFzIGEgY29uc2VxdWVuY2UsIHlvdSBzaG91bGQgY2hhbmdlCit0aGUgc2Vjb25kIGFzdGVyaXNrIHRvIHNvbWV0aGluZyBlbHNlIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgYSBjb21tZW50CitibG9jayBiZWluZyBoYW5kbGVkIGJ5ICdkb2N3cml0ZXInIChmb3IgZXhhbXBsZSwgY2hhbmdlIGAvKioqKi9gIHRvCitgLyojKiovYCkuCisKKworTWFya3VwIFRhZ3MKKy0tLS0tLS0tLS0tCisKK01hcmt1cCB0YWdzIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoYXQgY29tZXMgbmV4dC4gIFRoZSBzeW50YXggZm9yIGEKK3RhZyBpczoKKworICAgIEBmb286CisKK0FuIGBAYCwgZm9sbG93ZWQgYnkgdGhlIHRhZywgYW5kIHRoZW4gYDpgLgorCisKK1Jlc2VydmVkIFRhZ3MKKy0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIHNvbWUga2V5d29yZHMgdGhhdCBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIHRvIGRvY3dyaXRlci4KK0FzIGEgY29udmVudGlvbiwgYWxsIGtleXdvcmRzIGFyZSB3cml0dGVuIGluIGxvd2VyY2FzZS4KKworKiBgY2hhcHRlcmA6IERlZmluZXMgYSBjaGFwdGVyLiAgVXN1YWxseSB0aGUgdGl0bGUgd2l0aCB1bmRlcnNjb3Jlcy4KKyogYHNlY3Rpb25zYDogTGlzdCBvZiBzZWN0aW9ucyBpbiB0aGUgY2hhcHRlciwgaW4gb3JkZXIuCisqIGBzZWN0aW9uYDogRGVmaW5lcyB0aGUgc3RhcnQgb3IgY29udGludWF0aW9uIG9mIGEgc2VjdGlvbi4KKyogYHRpdGxlYDogVGl0bGUgZm9yIGEgY2hhcHRlciBvciBzZWN0aW9uLiAgTWF5IGNvbnRhaW4gc3BhY2VzLgorKiBgYWJzdHJhY3RgOiBUaGUgYWJzdHJhY3QgZm9yIGEgc2VjdGlvbiwgdmlzaWJsZSBpbiB0aGUgVGFibGUgb2YKKyAgICAgICAgICAgICAgQ29udGVudHMgKFRPQykuCisqIGBkZXNjcmlwdGlvbmA6IERldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGEgdGFnIChleGNlcHQgY2hhcHRlcnMpLAorICAgICAgICAgICAgICAgICBzaG93biBhcyBzeW5vcHNpcy4KKyogYHZhbHVlc2A6IEEgbGlzdCBvZiAndmFsdWVzJyBmb3IgdGhlIHRhZy4gIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBmb3IKKyAgICAgICAgICAgIGNyb3NzLXJlZmVyZW5jaW5nLgorCisKK090aGVyIFRhZ3MKKy0tLS0tLS0tLS0KKworRXhjZXB0IHRoZSBvbmVzIGdpdmVuIGFib3ZlLCBhbnkgb3RoZXIgdGFncyB3aWxsIGJlIGFkZGVkIGFzIGEgcGFydCBvZgorYSBzdWJzZWN0aW9uLiAgQWxsIHRhZ3MgYXJlIGxvd2VyY2FzZSBieSBjb252ZW50aW9uLgorCisKK1B1YmxpYyBIZWFkZXIgRGVmaW5pdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHB1YmxpYyBoZWFkZXJzIGZvciBGcmVlVHlwZSBoYXZlIHRoZWlyIG5hbWVzIGRlZmluZWQgaW4KK2BpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oYC4gIEFueSBuZXcgcHVibGljIGhlYWRlciBmaWxlIG11c3QKK2JlIGRlZmluZWQgaW4gdGhpcyBmaWxlLCBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworICAgICNkZWZpbmUgRlRfTkVXTkFNRV9IICA8ZnJlZXR5cGUvbmV3bmFtZS5oPgorCitXaGVyZSBgbmV3bmFtZWAgaXMgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlLgorCitUaGlzIG1hY3JvIGlzIGNvbWJpbmVkIHdpdGggdGhlIGZpbGUgbG9jYXRpb24gb2YgYSBzdWItc2VjdGlvbiBhbmQKK3ByaW50ZWQgd2l0aCB0aGUgb2JqZWN0LgorCisKK05vdGUgb24gY29kZSBibG9ja3MgY2FwdHVyZWQgYWZ0ZXIgY29tbWVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQWxsIG5vbi1kb2N1bWVudGF0aW9uIGxpbmVzIGFmdGVyIGEgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2NrIGFyZQorY2FwdHVyZWQgdG8gYmUgZGlzcGxheWVkIGFzIHRoZSBjb2RlIGZvciB0aGUgc3ViLXNlY3Rpb24uICBUbyBzdG9wCitjb2xsZWN0aW9uLCBhIGxpbmUgd2l0aCBgLyogKi9gIHNob3VsZCBiZSBhZGRlZC4KKworCitHZW5lcmFsIEZvcm1hdHRpbmcgQ29udmVudGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFVzZSB0d28gc3BhY2VzIGFmdGVyIGEgZnVsbCBzdG9wIGVuZGluZyBhIHNlbnRlbmNlLgorKiBVc2UgYXBwcm9wcmlhdGUgdXBwZXJjYXNpbmcgaW4gdGl0bGVzLiAgUmVmZXIKKworICBodHRwczovL2VuZ2xpc2guc3RhY2tleGNoYW5nZS5jb20vYS8zNAorCisgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorKiBEbyBub3QgYWRkIHRyYWlsaW5nIHBhcmVudGhlc2VzIHdoZW4gY2l0aW5nIGEgQyBmdW5jdGlvbi4KKworCitNYXJrZG93biBVc2FnZQorLS0tLS0tLS0tLS0tLS0KKworQWxsIHRhZ3MsIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGRlZmluZSB0aGUgbmFtZSBhbmQgdGl0bGUgZm9yIGEgYmxvY2sKK3N1cHBvcnQgbWFya2Rvd24gaW4gdGhlbS4gIERvY3dyaXRlciB1c2VzIGEgbWFya2Rvd24gcGFyc2VyIHRoYXQKK2ZvbGxvd3MgcnVsZXMgZ2l2ZW4gaW4gSm9obiBHcnViZXIncyBtYXJrZG93biBndWlkZToKKworICBodHRwczovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgKKword2l0aCBhIGZldyBleGNlcHRpb25zIGFuZCBleHRlbnNpb25zLCBkZXRhaWxlZCBiZWxvdy4gIFRoaXMgbWF5IGFsc28KK2JlIHJlZmVycmVkIHRvIGFzIHRoZSAqKkZyZWVUeXBlIEZsYXZvcmVkIE1hcmtkb3duKiouCisKKworSGVhZGVycworLS0tLS0tLQorCitNYXJrZG93biBoZWFkZXJzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSwgYmVjYXVzZSB0aGVzZSBhcmUgYWRkZWQKK2Jhc2VkIG9uIHNlY3Rpb24gdGl0bGVzLCBzdWItc2VjdGlvbiBuYW1lcywgYW5kIHRhZ3MuICBIb3dldmVyLCBpZiBhCitoZWFkZXIgbmVlZHMgdG8gYmUgYWRkZWQsIG5vdGUgdGhlIGZvbGxvd2luZyBjb3JyZXNwb25kZW5jZSB0byBIVE1MIHRhZ3M6CisKKyogU2VjdGlvbiB0aXRsZSBvbiB0b3Agb2YgdGhlIHBhZ2UgaXMgYEgxYC4KKyogU3ViLXNlY3Rpb24gdGl0bGVzIGFyZSBgSDJgLgorKiBQYXJ0cyBvZiBzdWItc2VjdGlvbnMgYXJlIGBINGAuCisqIEFueSBoZWFkZXIgYWRkZWQgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBUYWJsZSBvZiBDb250ZW50cyAoVE9DKSBvZgorICB0aGUgcGFnZS4KKworCitFbXBoYXNpcworLS0tLS0tLS0KKworKiBVc2UgYF91bmRlcnNjb3Jlc19gIGZvciBpdGFsaWNzLgorKiBVc2UgYCoqZG91YmxlIGFzdGVyaXNrcyoqYCBmb3IgYm9sZC4KKworQWx0aG91Z2ggdGhlIG90aGVyIG5vdGF0aW9ucyAoZG91YmxlIHVuZGVyc2NvcmUgZm9yIGJvbGQsIHNpbmdsZQorYXN0ZXJpc2sgZm9yIGl0YWxpY3MpIGFyZSBzdXBwb3J0ZWQsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUKK2Fib3ZlIGZvciBjb25zaXN0ZW5jeS4KKworTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBjYXNlcyB3aGVyZSBoYXZpbmcgdHdvIGFzdGVyaXNrcyBvciB1bmRlcnNjb3JlcworaW4gYSBsaW5lIG1heSBsZWFkIHRvIHRleHQgYmVpbmcgcGlja2VkIHVwIGFzIGl0YWxpY3Mgb3IgYm9sZC4KK0FsdGhvdWdoIHVuaW50ZW50aW9uYWwsIHRoaXMgaXMgY29ycmVjdCBtYXJrZG93biBiZWhhdmlvci4gCisKK0ZvciBpbmxpbmUgY29kZSwgd3JhcCB0aGUgc2VxdWVuY2Ugd2l0aCBiYWNrdGlja3MgKHNlZSBiZWxvdykuICBUaGlzCityZW5kZXJzIHN5bWJvbHMgY29ycmVjdGx5IHdpdGhvdXQgbW9kaWZpY2F0aW9ucy4gIElmIGEgc3ltYm9sIGlzCithYnNvbHV0ZWx5IHJlcXVpcmVkIG91dHNpZGUgb2YgYW4gaW5saW5lIGNvZGUgYmxvY2sgb3IgY29kZSBzZXF1ZW5jZSwKK2VzY2FwZSBpdCB3aXRoIGEgYmFja3NsYXNoIChsaWtlIGBcKmAgb3IgYFxfYCkuCisKKworTGlzdHMKKy0tLS0tCisKK1Vub3JkZXJlZCBsaXN0cyBjYW4gYmUgY3JlYXRlZCB3aXRoIGFzdGVyaXNrczoKKworICAgICogVW5vcmRlcmVkIGxpc3QgaXRlbXMgY2FuIHVzZSBhc3Rlcmlza3MuCisgICAgKiBBbm90aGVyIGxpc3QgaXRlbS4KKworT3JkZXJlZCBsaXN0cyBzdGFydCB3aXRoIG51bWJlcnM6CisKKyAgICAxLiBUaGlzIGlzIGFuIG9yZGVyZWQgbGlzdCBpdGVtLgorICAgIDIuIEJyYWNrZXRzIGFmdGVyIG51bWJlcnMgd29uJ3Qgd29yay4KKworVG8gY29udGludWUgYSBsaXN0IG92ZXIgbXVsdGlwbGUgcGFyYWdyYXBocywgaW5kZW50IHRoZW0gd2l0aCBhdCBsZWFzdAorZm91ciBzcGFjZXMuICBGb3IgZXhhbXBsZToKKworICAgIDEuICBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dWVyIGFkaXBpc2NpbmcgZWxpdC4KKyAgICAgICAgQWxpcXVhbSBoZW5kcmVyaXQgbWkgcG9zdWVyZSBsZWN0dXMuICBWZXN0aWJ1bHVtIGVuaW0gd2lzaSwKKyAgICAgICAgdml2ZXJyYSBuZWMsIGZyaW5naWxsYSBpbiwgbGFvcmVldCB2aXRhZSwgcmlzdXMuCisKKyAgICAgICAgRG9uZWMgc2l0IGFtZXQgbmlzbC4gIEFsaXF1YW0gc2VtcGVyIGlwc3VtIHNpdCBhbWV0IHZlbGl0LgorICAgICAgICBTdXNwZW5kaXNzZSBpZCBzZW0gY29uc2VjdGV0dWVyIGxpYmVybyBsdWN0dXMgYWRpcGlzY2luZy4KKworICAgIDIuICBUaGlzIGlzIHRoZSBzZWNvbmQgbGlzdCBpdGVtLgorCisgICAgVGhpcyBwYXJhZ3JhcGggaXMgbm90IGEgcGFydCBvZiB0aGUgbGlzdC4KKworTW9yZSBpbmZvcm1hdGlvbiBvbiBsaXN0cyBpbiBtYXJrZG93biBpcyBhdmFpbGFibGUgYXQKKworICBodHRwczovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjbGlzdAorCisKK0Nyb3NzLXJlZmVyZW5jZXMKKy0tLS0tLS0tLS0tLS0tLS0KKworT3RoZXIgc3ViLXNlY3Rpb25zIGNhbiBiZSBsaW5rZWQgd2l0aCB0aGUgYEBgIHN5bWJvbDoKKworICAgIEBkZXNjcmlwdGlvbjoKKyAgICAgIFdoaWxlIEZyZWVUeXBlJ3MgQ0ZGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5CisgICAgICBpdHNlbGYsIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW91ciB3aXRoIAorICAgICAgQEZUX1Byb3BlcnR5X1NldCBhbmQgQEZUX1Byb3BlcnR5X0dldC4KKworSWYgYSBmaWVsZCBpbiB0aGUgYHZhbHVlc2AgdGFibGUgb2YgYW5vdGhlciBzdWItc2VjdGlvbiBpcyBsaW5rZWQsIHRoZQorbGluayBsZWFkcyB0byBpdHMgcGFyZW50IHN1Yi1zZWN0aW9uLgorCisKK0xpbmtzIGFuZCBJbWFnZXMKKy0tLS0tLS0tLS0tLS0tLS0KKworQWxsIFVSTHMgYXJlIGNvbnZlcnRlZCB0byBsaW5rcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLgorCitNYXJrZG93biBzeW50YXggZm9yIGxpbmtzIGFuZCBpbWFnZXMgYXJlIGZ1bGx5IHN1cHBvcnRlZC4KKworCitJbmxpbmUgQ29kZQorLS0tLS0tLS0tLS0KKworVG8gaW5kaWNhdGUgYSBzcGFuIG9mIGNvZGUsIHdyYXAgaXQgd2l0aCBiYWNrdGljayBxdW90ZXMgKGBgIGAgYGApOgorCisgICAgVXNlIHRoZSBgcHJpbnRmKClgIGZ1bmN0aW9uLgorCitDcm9zcy1yZWZlcmVuY2VzLCBtYXJrZG93biwgYW5kIGh0bWwgc3R5bGluZyBkbyBub3Qgd29yayBpbiBpbmxpbmUgY29kZQorc2VxdWVuY2VzLgorCisKK0NvZGUgYW5kIFN5bnRheCBIaWdobGlnaHRpbmcKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQmxvY2tzIG9mIGNvZGUgYXJlIGZlbmNlZCBieSBsaW5lcyB3aXRoIHRocmVlIGJhY2stdGlja3MgYGAgYGBgIGBgCitmb2xsb3dlZCBieSB0aGUgbGFuZ3VhZ2UgbmFtZSwgaWYgYW55ICh1c2VkIGZvciBzeW50YXggaGlnaGxpZ2h0aW5nKSwKK2FzIGRlbW9uc3RyYXRlZCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisKKyAgICBgYGBjCisgICAgICB4ID0geSArIHo7CisgICAgICBpZiAoIHpvb2tvbyA9PSAyICkKKyAgICAgIHsKKyAgICAgICAgZm9vYmFyKCk7CisgICAgICB9CisgICAgYGBgCisKK05vdGUgdGhhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIG9wZW5pbmcgbGluZSBhbmQgdGhlIGNsb3NpbmcgbGluZQorbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lLiAgVGhlIGNvZGUgc2VxdWVuY2UgaXRzZWxmIHNob3VsZCBoYXZlIGEKK2xhcmdlciBpbmRlbnRhdGlvbiB0aGFuIHRoZSBzdXJyb3VuZGluZyBiYWNrLXRpY2tzLgorCitMaWtlIGlubGluZSBjb2RlLCBtYXJrZG93biBhbmQgaHRtbCBzdHlsaW5nIGlzICpub3QqIHN1cHBvcnRlZCBpbnNpZGUKK2NvZGUgYmxvY2tzLgorCisKK1RhYmxlcworLS0tLS0tCisKK1RhYmxlcyBhcmUgdXNlZCB0byBsaXN0IHZhbHVlcywgaW5wdXQsIGFuZCBvdGhlciBmaWVsZHMuICBUaGUgRnJlZVR5cGUKK0ZsYXZvcmVkIE1hcmtkb3duIGFkb3B0cyBhIHNpbXBsZSBhcHByb2FjaCB0byB0YWJsZXMgd2l0aCB0d28gY29sdW1ucywKK29yIGZpZWxkIGRlZmluaXRpb24gdGFibGVzLgorCitGaWVsZCBkZWZpbml0aW9uIG5hbWVzIG1heSBjb250YWluIGFscGhhbnVtZXJpYywgdW5kZXJzY29yZSwgYW5kIHRoZQorYC5gIGNoYXJhY3RlcnMuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGA6OmAuICBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZQordGhlIHNlY29uZCBjb2x1bW4gb2YgdGhlIHRhYmxlLiAgQSBmaWVsZCBkZWZpbml0aW9uIGVuZHMgd2l0aCB0aGUKK3N0YXJ0IG9mIGFub3RoZXIgZmllbGQgZGVmaW5pdGlvbiwgb3IgYSBtYXJrdXAgdGFnLgorCisgICAgQElucHV0OgorICAgICAgcGF0aG5hbWUgOjoKKyAgICAgICAgQSBwYXRoIHRvIHRoZSBmb250IGZpbGUuCisKKyAgICAgIGZhY2VfaW5kZXggOjoKKyAgICAgICAgU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcworICAgICAgICBwYXJhbWV0ZXIuCisKKworTm9uLWJyZWFraW5nIFNwYWNlCistLS0tLS0tLS0tLS0tLS0tLS0KKworQSB0aWxkZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBub24tYnJlYWtpbmcgc3BhY2UuICBUaGUgZXhhbXBsZQorCisgICAgVGhlIGVuY29kaW5nIHZhbHVlfjAgaXMgcmVzZXJ2ZWQuCisKK2lzIGNvbnZlcnRlZCB0bworCisgICAgVGhlIGVuY29kaW5nIHZhbHVlJm5ic3A7MCBpcyByZXNlcnZlZC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcHlyaWdodCAoQykgMjAxOC0yMDIwIGJ5CitOaWtoaWwgUmFtYWtyaXNobmFuLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisKK1RoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKK21vZGlmaWVkLCAgYW5kIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIHRlcm1zIG9mICB0aGUgIEZyZWVUeXBlIHByb2plY3QKK2xpY2Vuc2UsICBMSUNFTlNFLlRYVC4gIEJ5ICBjb250aW51aW5nIHRvICB1c2UsIG1vZGlmeSwgIG9yIGRpc3RyaWJ1dGUKK3RoaXMgZmlsZSB5b3UgIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCAgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQKK2FuZCBhY2NlcHQgaXQgZnVsbHkuCisKKworLS0tIGVuZCBvZiBET0NHVUlERSAtLS0KZGlmZiAtLWdpdCBhL2RvY3MvSU5TVEFMTCBiL2RvY3MvSU5TVEFMTAppbmRleCA3MWQ0YTA1Li44MTRmYzdiIDEwMDY0NAotLS0gYS9kb2NzL0lOU1RBTEwKKysrIGIvZG9jcy9JTlNUQUxMCkBAIC03MCwxNCArNzAsMTQgQEAKIFsxXSBtYWtlKyssIGEgbWFrZSB0b29sIHdyaXR0ZW4gaW4gUGVybCwgaGFzIHN1ZmZpY2llbnQgc3VwcG9ydCBvZiBHTlUKICAgICBtYWtlIGV4dGVuc2lvbnMgdG8gYnVpbGQgRnJlZVR5cGUuICBTZWUKIAotICAgICAgaHR0cDovL21ha2VwcC5zb3VyY2Vmb3JnZS5uZXQKKyAgICAgIGh0dHBzOi8vbWFrZXBwLnNvdXJjZWZvcmdlLm5ldAogCiAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb247ICB5b3UgbmVlZCB2ZXJzaW9uIDIuMCBvciBuZXdlciwgYW5kIHlvdSBtdXN0CiAgICAgcGFzcyBvcHRpb24gYC0tbm9yYy1zdWJzdGl0dXRpb24nLgogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAwLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgaXMgIHBhcnQgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdCwgYW5kICBtYXkgb25seSAgYmUgdXNlZCwKZGlmZiAtLWdpdCBhL2RvY3MvSU5TVEFMTC5BTlkgYi9kb2NzL0lOU1RBTEwuQU5ZCmluZGV4IGZkZGFjOWEuLjg3OWRkZGIgMTAwNjQ0Ci0tLSBhL2RvY3MvSU5TVEFMTC5BTlkKKysrIGIvZG9jcy9JTlNUQUxMLkFOWQpAQCAtOCwxMyArOCwxNSBAQAogSS4gU3RhbmRhcmQgcHJvY2VkdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAqIERJU0FCTEUgUFJFLUNPTVBJTEVEICBIRUFERVJTISAgVGhpcyBpcyB2ZXJ5ICBpbXBvcnRhbnQgZm9yIFZpc3VhbAotICAgIEMrKywgYmVjYXVzZSBGcmVlVHlwZSB1c2VzIGxpbmVzIGxpa2U6CisgICogSWYgeW91IHVzZSBtYWNybyBuYW1lcyAgZm9yIEZyZWVUeXBlIGhlYWRlciBmaWxlcyAod2hpbGUgbWFuZGF0b3J5CisgICAgaW4gZWFybGllciB2ZXJzaW9ucywgIHRoaXMgaXMgbm93IG9wdGlvbmFsICBzaW5jZSBGcmVlVHlwZSB2ZXJzaW9uCisgICAgMi4xMC4zKSBpdCAgaXMgbmVjZXNzYXJ5IHRvIGRpc2FibGUgcHJlLWNvbXBpbGVkIGhlYWRlcnMuICBUaGlzIGlzCisgICAgdmVyeSBpbXBvcnRhbnQgZm9yIFZpc3VhbCBDKyssIGJlY2F1c2UgbGluZXMgbGlrZQogCiAgICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9ICiAKLSAgICB3aGljaCBhcmUgbm90IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgdGhpcyBjb21waWxlciB3aGlsZSBiZWluZyBJU08KLSAgICBDIGNvbXBsaWFudCEKKyAgICBhcmUgbm90ICBjb3JyZWN0bHkgc3VwcG9ydGVkICBieSB0aGlzIGNvbXBpbGVyICB3aGlsZSBiZWluZyAgSVNPIEMKKyAgICBjb21wbGlhbnQhCiAKICAgKiBZb3UgbmVlZCB0byBhZGQgdGhlIGRpcmVjdG9yeSBgaW5jbHVkZScgdG8geW91ciAgaW5jbHVkZSBwYXRoIHdoZW4KICAgICBjb21waWxpbmcgdGhlIGxpYnJhcnkuCkBAIC0xNDEsNyArMTQzLDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwMy0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCmRpZmYgLS1naXQgYS9kb2NzL0lOU1RBTEwuQ1JPU1MgYi9kb2NzL0lOU1RBTEwuQ1JPU1MKaW5kZXggMjM5ZTFhOS4uODUxMTgwNSAxMDA2NDQKLS0tIGEvZG9jcy9JTlNUQUxMLkNST1NTCisrKyBiL2RvY3MvSU5TVEFMTC5DUk9TUwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDYtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKIHN1enVraSB0b3NoaXlhLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIApkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLkdOVSBiL2RvY3MvSU5TVEFMTC5HTlUKaW5kZXggZTMxNGVjZi4uOGZkYmI4MiAxMDA2NDQKLS0tIGEvZG9jcy9JTlNUQUxMLkdOVQorKysgYi9kb2NzL0lOU1RBTEwuR05VCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgTm90ZSB0aGF0ICBtYWtlKyssIGEgIG1ha2UgdG9vbCB3cml0dGVuICBpbiBQZXJsLCAgc3VwcG9ydHMgZW5vdWdoCiAgICAgZmVhdHVyZXMgb2YgR05VIG1ha2UgdG8gY29tcGlsZSBGcmVlVHlwZS4gIFNlZQogCi0gICAgICBodHRwOi8vbWFrZXBwLnNvdXJjZWZvcmdlLm5ldAorICAgICAgaHR0cHM6Ly9tYWtlcHAuc291cmNlZm9yZ2UubmV0CiAKICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbjsgIHlvdSBuZWVkIHZlcnNpb24gMi4wIG9yIG5ld2VyLCBhbmQgeW91IG11c3QKICAgICBwYXNzIG9wdGlvbiBgLS1ub3JjLXN1YnN0aXR1dGlvbicuCkBAIC02Myw3ICs2Myw3IEBACiAKICAgICAgIE90aGVyd2lzZSwgc2ltcGx5IHR5cGUgJ21ha2UnIGFnYWluIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5CiAgICAgICBvciAnbWFrZSByZWZkb2MnIHRvIGJ1aWxkIHRoZSBBUEkgcmVmZXJlbmNlICh0aGUgbGF0dGVyIG5lZWRzCi0gICAgICBweXRob24pLgorICAgICAgUHl0aG9uID49IDMuNSkuCiAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIApAQCAtMTQ4LDcgKzE0OCw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDMtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLApkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLlVOSVggYi9kb2NzL0lOU1RBTEwuVU5JWAppbmRleCBmOTJkODI4Li5mOGQyMjBhIDEwMDY0NAotLS0gYS9kb2NzL0lOU1RBTEwuVU5JWAorKysgYi9kb2NzL0lOU1RBTEwuVU5JWApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQ29weXJpZ2h0IDIwMDMtMjAxOCBieQorQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIAogVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLApkaWZmIC0tZ2l0IGEvZG9jcy9JTlNUQUxMLlZNUyBiL2RvY3MvSU5TVEFMTC5WTVMKaW5kZXggYzFkMzBlMC4uZTE4MTdlYyAxMDA2NDQKLS0tIGEvZG9jcy9JTlNUQUxMLlZNUworKysgYi9kb2NzL0lOU1RBTEwuVk1TCkBAIC00OSw3ICs0OSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwMC0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzICBmaWxlICBpcyAgcGFydCAgb2YgdGhlICBGcmVlVHlwZSAgcHJvamVjdCwgYW5kIG1heSAgb25seSBiZSAgdXNlZCwKZGlmZiAtLWdpdCBhL2RvY3MvTUFLRVBQIGIvZG9jcy9NQUtFUFAKaW5kZXggYTRkNDRiNy4uNDQ1MGU0NyAxMDA2NDQKLS0tIGEvZG9jcy9NQUtFUFAKKysrIGIvZG9jcy9NQUtFUFAKQEAgLTEsNSArMSw1IEBACiBBcyBhIHNwZWNpYWwgIGV4Y2VwdGlvbiwgRnJlZVR5cGUgY2FuIGFsc28gYmUgIGJ1aWx0IHdpdGggdGhlICdtYWtlcHAnCi1idWlsZCB0b29sLCBhdmFpbGFibGUgZnJvbSBodHRwOi8vbWFrZXBwLnNvdXJjZWZvcmdlLm5ldC4KK2J1aWxkIHRvb2wsIGF2YWlsYWJsZSBmcm9tIGh0dHBzOi8vbWFrZXBwLnNvdXJjZWZvcmdlLm5ldC4KIAogTm90ZSwgaG93ZXZlciwgIHRoYXQgIHlvdSB3aWxsIG5lZWQgYXQgbGVhc3QgdmVyc2lvbiAyLjAgIGFuZCBwYXNzIHRoZQogb3B0aW9uIC0tbm9yYy1zdWJzdGl0dXRpb24gdG8gaGF2ZSBpdCB3b3JrIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL2RvY3MvUkVBRE1FIGIvZG9jcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxZmQzNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvUkVBRE1FCkBAIC0wLDAgKzEsMzUgQEAKK0FmdGVyIHNheWluZyBgbWFrZSByZWZkb2MnIG9yIGBtYWtlIHJlZmRvYy12ZW52JyB0aGUgYHJlZmVyZW5jZS8nIGRpcmVjdG9yeQorY29udGFpbnMgdGhlIEZyZWVUeXBlIEFQSSByZWZlcmVuY2UuICBZb3UgbmVlZCBQeXRob24gPj0gMy41IGFuZCBwaXAgdG8gbWFrZQordGhpcyB0YXJnZXQuCisKK1RoZXJlIGFyZSB0d28gd2F5cyB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbjoKKworMS4gVXNpbmcgYG1ha2UgcmVmZG9jJzoKKworICAgIC0gRW5zdXJlIGBweXRob24nIGFuZCBgcGlwJyBhcmUgYXZhaWxhYmxlLgorICAgIC0gSW5zdGFsbCBwaXAgcGFja2FnZSBgZG9jd3JpdGVyJyB3aXRoIGBwaXAgaW5zdGFsbCAtLXVzZXIgZG9jd3JpdGVyJy4KKyAgICAtIE1ha2UgdGFyZ2V0IHdpdGggYG1ha2UgcmVmZG9jJy4KKyAgICAtIFRoaXMgdGFyZ2V0IGNhbiBiZSBydW4gb2ZmbGluZSBvbmNlIHJlcXVpcmVkIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQuCisKKzIuIFVzaW5nIGBtYWtlIHJlZmRvYy12ZW52JyAocmVxdWlyZXMgaW50ZXJuZXQgYWNjZXNzKToKKworICAgIC0gRW5zdXJlIGBweXRob24nLCBgcGlwJyBhbmQgUHl0aG9uIHBhY2thZ2UgYHZpcnR1YWxlbnYnIGFyZSBhdmFpbGFibGUuCisgICAgLSBNYWtlIHRhcmdldCB3aXRoIGBtYWtlIHJlZmRvYy12ZW52Jy4KKyAgICAtIFRoaXMgbWF5IG9yIG1heSBub3QgcmVxdWlyZSBpbnRlcm5ldCBhY2Nlc3MgZXZlcnkgdGltZSBkZXBlbmRpbmcgb24KKyAgICBwaXAgYW5kIHN5c3RlbSBjYWNoaW5nLgorCitUaGlzIGFsc28gd29ya3Mgd2l0aCBKYW06IEp1c3QgdHlwZSBgamFtIHJlZmRvYycgaW4gdGhlIG1haW4gZGlyZWN0b3J5LgorCitTb21lIHRyb3VibGVzaG9vdGluZyB0aXBzOgorCisqIFJlZ3VsYXJseSBydW4gYHBpcCBpbnN0YWxsIC0tdXBncmFkZSBkb2N3cml0ZXInIHRvIGNoZWNrIGZvciB1cGRhdGVzIHdoaWNoCittYXkgaW5jbHVkZSBidWcgZml4ZXMuCisKKyogYERvY3dyaXRlcicgZG9lcyBub3Qgc3VwcG9ydCBQeXRob24gMi4gIEVuc3VyZSB0aGF0IFB5dGhvbiA+PSAzLjUgaXMKK2luc3RhbGxlZCBhbmQgYXZhaWxhYmxlIGFzIGBweXRob24zJy9gcHl0aG9uJy4KKworKiBFbnN1cmUgdGhhdCBgZG9jd3JpdGVyJyBpcyBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgUHl0aG9uIHRhcmdldCB0aGF0CitgbWFrZSByZWZkb2MnIHVzZXMgKHB5dGhvbjMvcHl0aG9uKS4KKworKiBJZiBub25lIG9mIHRoaXMgd29ya3MsIHNlbmQgYSBtYWlsIHRvIGBmcmVldHlwZS1kZXZlbEBub25nbnUub3JnJyBvciBmaWxlCithbiBpc3N1ZSBhdCBgaHR0cHM6Ly9naXRodWIuY29tL2ZyZWV0eXBlL2RvY3dyaXRlci9pc3N1ZXMnLgpkaWZmIC0tZ2l0IGEvZG9jcy9UT0RPIGIvZG9jcy9UT0RPCmluZGV4IDFhNDQzYTIuLjhiMjdlMjYgMTAwNjQ0Ci0tLSBhL2RvY3MvVE9ETworKysgYi9kb2NzL1RPRE8KQEAgLTI3LDcgKzI3LDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAxLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgbWF5ICBvbmx5IGJlICB1c2VkLApkaWZmIC0tZ2l0IGEvZG9jcy9WRVJTSU9OUy5UWFQgYi9kb2NzL1ZFUlNJT05TLlRYVAppbmRleCAzNzc0MTU3Li40ZTI4MWE3IDEwMDY0NAotLS0gYS9kb2NzL1ZFUlNJT05TLlRYVAorKysgYi9kb2NzL1ZFUlNJT05TLlRYVApAQCAtMSwzNiArMSw0NCBAQAotRHVlICB0byBvdXIgIHVzZSBvZiAgYGxpYnRvb2wnIHRvICBnZW5lcmF0ZSBhbmQgIGluc3RhbGwgdGhlICBGcmVlVHlwZSAyCi1saWJyYXJpZXMgb24gIFVuaXggc3lzdGVtcywgYXMgIHdlbGwgYXMgIG90aGVyIGhpc3RvcmljYWwgZXZlbnRzLCAgaXQgaXMKLWdlbmVyYWxseSB2ZXJ5ICBkaWZmaWN1bHQgdG8gIGtub3cgcHJlY2lzZWx5IHdoaWNoICByZWxlYXNlIG9mICB0aGUgZm9udAorRHVlIHRvICBvdXIgdXNlIG9mICBgbGlidG9vbCcgdG8gZ2VuZXJhdGUgIGFuZCBpbnN0YWxsIHRoZSAgRnJlZVR5cGUgMgorbGlicmFyaWVzIG9uIFVuaXggIHN5c3RlbXMsIGFzIHdlbGwgYXMgb3RoZXIgaGlzdG9yaWNhbCAgZXZlbnRzLCBpdCBpcworZ2VuZXJhbGx5IHZlcnkgZGlmZmljdWx0ICB0byBrbm93IHByZWNpc2VseSB3aGljaCByZWxlYXNlICBvZiB0aGUgZm9udAogZW5naW5lIGlzIGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbS4KIAotVGhpcyBmaWxlIHRyaWVzICB0byBleHBsYWluIHdoeSBhbmQgdG8gZG9jdW1lbnQgIHdheXMgdG8gcHJvcGVybHkgZGV0ZWN0CitUaGlzIGZpbGUgdHJpZXMgdG8gZXhwbGFpbiB3aHkgYW5kIHRvIGRvY3VtZW50IHdheXMgdG8gcHJvcGVybHkgZGV0ZWN0CiBGcmVlVHlwZSBvbiBVbml4LgogCiAKIDEuIFZlcnNpb24gYW5kIFJlbGVhc2UgbnVtYmVycwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUZvciBlYWNoIG5ldyAgcHVibGljIHJlbGVhc2Ugb2YgRnJlZVR5cGUgMiwgdGhlcmUgIGFyZSBnZW5lcmFsbHkgKnRocmVlKgorRm9yIGVhY2ggbmV3IHB1YmxpYyByZWxlYXNlIG9mIEZyZWVUeXBlIDIsIHRoZXJlIGFyZSBnZW5lcmFsbHkgKnRocmVlKgogZGlzdGluY3QgYHZlcnNpb24nIG51bWJlcnMgdG8gY29uc2lkZXI6CiAKLSAgKiBUaGUgb2ZmaWNpYWwgRnJlZVR5cGUgMiByZWxlYXNlIG51bWJlciwgbGlrZSAyLjMuMSBvciAyLjQuMTAuCisgICogVGhlIG9mZmljaWFsIEZyZWVUeXBlIDIgcmVsZWFzZSBudW1iZXIsIGxpa2UgMi43LjAgb3IgMi4xMC4yLgogCi0gICogVGhlIGxpYnRvb2wgKGFuZCAgVW5peCkgc3BlY2lmaWMgdmVyc2lvbiBudW1iZXIsICBsaWtlIDEzLjAuNy4gIFRoaXMKLSAgICBpcyB3aGF0IGBmcmVldHlwZS1jb25maWcgLS12ZXJzaW9uJyByZXR1cm5zLgorICAqIFRoZSAgbGlidG9vbCAoYW5kICBVbml4KSAgc3BlY2lmaWMgdmVyc2lvbiAgbnVtYmVyLCBsaWtlICAyMy4yLjE3LgorICAgIFRoaXMgaXMgd2hhdAogCi0gICogVGhlIHBsYXRmb3JtLXNwZWNpZmljICBzaGFyZWQgb2JqZWN0ICBudW1iZXIsIHVzZWQgZm9yICBleGFtcGxlIHdoZW4KLSAgICB0aGUgbGlicmFyeSBpcyBpbnN0YWxsZWQgYXMgYC91c3IvbGliL2xpYmZyZWV0eXBlLnNvLjYuNy4xJy4KKyAgICAgIHBrZy1jb25maWcgZnJlZXR5cGUyIC0tbW9kdmVyc2lvbgogCi1UaGUgcGxhdGZvcm0tc3BlY2lmaWMgIG51bWJlciBpcywgdW5zdXJwcmlzaW5nbHksICBwbGF0Zm9ybS1zcGVjaWZpYyBhbmQKLXZhcmllcyAgd2l0aCB0aGUgIG9wZXJhdGluZyBzeXN0ZW0gIHlvdSBhcmUgIHVzaW5nIChzZXZlcmFsICB2YXJpYW50cyBvZgotTGludXgsIEZyZWVCU0QsICBTb2xhcmlzLCBldGMuKS4gIFlvdSAgc2hvdWxkIHRodXMgX25ldmVyXyB1c2UgIGl0LCBldmVuCisgICAgb3IKKworICAgICAgZnJlZXR5cGUtY29uZmlnIC0tdmVyc2lvbgorCisgICAgcmV0dXJucy4KKworICAqIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBzaGFyZWQgb2JqZWN0ICBudW1iZXIsIHVzZWQgZm9yIGV4YW1wbGUgd2hlbgorICAgIHRoZSBsaWJyYXJ5IGlzIGluc3RhbGxlZCBhcyBgL3Vzci9saWIvbGliZnJlZXR5cGUuc28uNi4xNy4yJy4KKworVGhlIHBsYXRmb3JtLXNwZWNpZmljIG51bWJlciBpcywgdW5zdXJwcmlzaW5nbHksIHBsYXRmb3JtLXNwZWNpZmljIGFuZAordmFyaWVzIHdpdGggIHRoZSBvcGVyYXRpbmcgc3lzdGVtICB5b3UgYXJlIHVzaW5nIChzZXZlcmFsICB2YXJpYW50cyBvZgorTGludXgsIEZyZWVCU0QsIFNvbGFyaXMsIGV0Yy4pLiAgWW91ICBzaG91bGQgdGh1cyBfbmV2ZXJfIHVzZSBpdCwgZXZlbgogZm9yIHNpbXBsZSB0ZXN0cy4KIAotVGhlIGxpYnRvb2wtc3BlY2lmaWMgIG51bWJlciBkb2VzICBub3QgZXF1YWwgdGhlICByZWxlYXNlIG51bWJlciAgYnV0IGlzCitUaGUgbGlidG9vbC1zcGVjaWZpYyBudW1iZXIgIGRvZXMgbm90IGVxdWFsIHRoZSByZWxlYXNlICBudW1iZXIgYnV0IGlzCiB0aWVkIHRvIGl0LgogCi1UaGUgcmVsZWFzZSBudW1iZXIgaXMgYXZhaWxhYmxlICBhdCAqY29tcGlsZSogdGltZSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKLW1hY3JvcyBkZWZpbmVkIGluIEZUX0ZSRUVUWVBFX0g6CitUaGUgIHJlbGVhc2UgIG51bWJlciAgaXMgIGF2YWlsYWJsZSAgYXQgICpjb21waWxlKiAgdGltZSAgdGhyb3VnaCAgdGhlCitmb2xsb3dpbmcgbWFjcm9zIGRlZmluZWQgaW4gYGZyZWV0eXBlLmgnOgogCiAgIC0gRlJFRVRZUEVfTUFKT1I6IG1ham9yIHJlbGVhc2UgbnVtYmVyCiAgIC0gRlJFRVRZUEVfTUlOT1I6IG1pbm9yIHJlbGVhc2UgbnVtYmVyCkBAIC0zOCwyMCArNDYsMjUgQEAKIAogU2VlIGJlbG93IGZvciBhIHNtYWxsIGF1dG9jb25mIGZyYWdtZW50LgogCi1UaGUgIHJlbGVhc2UgIG51bWJlciAgIGlzICBhbHNvICBhdmFpbGFibGUgIGF0ICAgKnJ1bnRpbWUqICB0aHJvdWdoICB0aGUKK1RoZSAgcmVsZWFzZSAgbnVtYmVyICBpcyAgYWxzbyAgYXZhaWxhYmxlICBhdCAgKnJ1bnRpbWUqICB0aHJvdWdoICB0aGUKIGBGVF9MaWJyYXJ5X1ZlcnNpb24nIEFQSS4KIAogCiAyLiBIaXN0b3J5CiAtLS0tLS0tLS0tCiAKLVRoZSAgZm9sbG93aW5nICAgdGFibGUgIGdpdmVzLCAgZm9yICAgYWxsICByZWxlYXNlcyAgc2luY2UgICAyLjQuMCwgIHRoZQotY29ycmVzcG9uZGluZyBsaWJ0b29sIG51bWJlciwgYXMgd2VsbCAgYXMgdGhlIHNoYXJlZCBvYmplY3QgbnVtYmVyIGZvdW5kCi1vbiBfbW9zdF8gc3lzdGVtcywgYnV0IG5vdCBhbGwgb2YgdGhlbToKK1RoZSAgZm9sbG93aW5nICB0YWJsZSAgZ2l2ZXMsICBmb3IgICBhbGwgIHJlbGVhc2VzICBzaW5jZSAgMi41LjAsICB0aGUKK2NvcnJlc3BvbmRpbmcgIGxpYnRvb2wgbnVtYmVyLCAgYXMgd2VsbCAgYXMgdGhlICBzaGFyZWQgb2JqZWN0ICBudW1iZXIKK2ZvdW5kIG9uIF9tb3N0XyBzeXN0ZW1zLCBidXQgbm90IGFsbCBvZiB0aGVtOgogCiAKICAgICByZWxlYXNlICAgICBsaWJ0b29sICAgICBzbwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDIuMTAuNCAgICAgMjMuNC4xNyAgIDYuMTcuNAorICAgICAyLjEwLjMgICAgIDIzLjMuMTcgICA2LjE3LjMKKyAgICAgMi4xMC4yICAgICAyMy4yLjE3ICAgNi4xNy4yCisgICAgIDIuMTAuMSAgICAgMjMuMS4xNyAgIDYuMTcuMQorICAgICAyLjEwLjAgICAgIDIzLjAuMTcgICA2LjE3LjAKICAgICAgMi45LjEgICAgICAyMi4xLjE2ICAgNi4xNi4xCiAgICAgIDIuOS4wICAgICAgMjIuMC4xNiAgIDYuMTYuMAogICAgICAyLjguMSAgICAgIDIxLjAuMTUgICA2LjE1LjAKQEAgLTcwLDU4ICs4Myw0OCBAQAogICAgICAyLjUuMiAgICAgIDE3LjEuMTEgICA2LjExLjEKICAgICAgMi41LjEgICAgICAxNy4wLjExICAgNi4xMS4wCiAgICAgIDIuNS4wICAgICAgMTYuMi4xMCAgIDYuMTAuMgotICAgICAyLjQuMTIgICAgIDE2LjEuMTAgICA2LjEwLjEKLSAgICAgMi40LjExICAgICAxNi4wLjEwICAgNi4xMC4wCi0gICAgIDIuNC4xMCAgICAgMTUuMC45ICAgIDYuOS4wCi0gICAgIDIuNC45ICAgICAgMTQuMS44ICAgIDYuOC4xCi0gICAgIDIuNC44ICAgICAgMTQuMC44ICAgIDYuOC4wCi0gICAgIDIuNC43ICAgICAgMTMuMi43ICAgIDYuNy4yCi0gICAgIDIuNC42ICAgICAgMTMuMS43ICAgIDYuNy4xCi0gICAgIDIuNC41ICAgICAgMTMuMC43ICAgIDYuNy4wCi0gICAgIDIuNC40ICAgICAgMTIuMi42ICAgIDYuNi4yCi0gICAgIDIuNC4zICAgICAgMTIuMS42ICAgIDYuNi4xCi0gICAgIDIuNC4yICAgICAgMTIuMC42ICAgIDYuNi4wCi0gICAgIDIuNC4xICAgICAgMTEuMS41ICAgIDYuNS4xCi0gICAgIDIuNC4wICAgICAgMTEuMC41ICAgIDYuNS4wCiAKIAogMy4gQXV0b2NvbmYgQ29kZSBGcmFnbWVudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1MYXJzIENsYXVzZW4gY29udHJpYnV0ZWQgdGhlIGZvbGxvd2luZyBhdXRvY29uZiBmcmFnbWVudCB0byBkZXRlY3Qgd2hpY2gKLXZlcnNpb24gb2YgIEZyZWVUeXBlIGlzICBpbnN0YWxsZWQgb24gIGEgc3lzdGVtLiAgVGhpcyAgb25lIHRlc3RzICBmb3IgYQotdmVyc2lvbiB0aGF0ICBpcyBhdCBsZWFzdCAyLjAuOTsgIHlvdSBzaG91bGQgY2hhbmdlIGl0ICB0byBjaGVjayBhZ2FpbnN0CitMYXJzICBDbGF1c2VuIGNvbnRyaWJ1dGVkICB0aGUgIGZvbGxvd2luZyBhdXRvY29uZiAgZnJhZ21lbnQgdG8gIGNoZWNrCit3aGljaCB2ZXJzaW9uIG9mIEZyZWVUeXBlIGlzIGluc3RhbGxlZCBvbiBhIHN5c3RlbSAobm93IHVwZGF0ZWQgdG8gdXNlCitgcGtnLWNvbmZpZycgIGluc3RlYWQgb2YgIGBmcmVldHlwZS1jb25maWcnKS4gICBUaGlzIG9uZSAgdGVzdHMgZm9yICBhCit2ZXJzaW9uIHRoYXQgaXMgYXQgbGVhc3QgMi4xMC4yOyB5b3Ugc2hvdWxkIGNoYW5nZSBpdCB0byBjaGVjayBhZ2FpbnN0CiBvdGhlciByZWxlYXNlIG51bWJlcnMuCiAKIAotICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgRnJlZVR5cGUgdmVyc2lvbiBpcyAyLjAuOSBvciBoaWdoZXJdKQorICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgRnJlZVR5cGUgdmVyc2lvbiBpcyAyLjEwLjIgb3IgaGlnaGVyXSkKICAgb2xkX0NQUEZMQUdTPSIkQ1BQRkxBR1MiCi0gIENQUEZMQUdTPWBmcmVldHlwZS1jb25maWcgLS1jZmxhZ3NgCisgIENQUEZMQUdTPWBwa2ctY29uZmlnIGZyZWV0eXBlMiAtLWNmbGFnc2AKICAgQUNfVFJZX0NQUChbCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2lmIChGUkVFVFlQRV9NQUpPUioxMDAwICsgRlJFRVRZUEVfTUlOT1IpKjEwMDAgKyBGUkVFVFlQRV9QQVRDSCA8IDIwMDAwMDkKLSNlcnJvciBGcmVlVHlwZSB2ZXJzaW9uIHRvbyBsb3cuCisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKworI2lmIEZSRUVUWVBFX01BSk9SKjEwMDAwICsgRlJFRVRZUEVfTUlOT1IqMTAwICsgRlJFRVRZUEVfUEFUQ0ggPCAyMTAwMgorIyAgZXJyb3IgRnJlZVR5cGUgdmVyc2lvbiB0b28gbG93LgogI2VuZGlmCisKICAgXSwKICAgW0FDX01TR19SRVNVTFQoeWVzKQotICAgRlJFRVRZUEVfTElCUz1gZnJlZXR5cGUtY29uZmlnIC0tbGlic2AKKyAgIEZSRUVUWVBFX0xJQlM9YHBrZy1jb25maWcgZnJlZXR5cGUyIC0tbGlic2AKICAgIEFDX1NVQlNUKEZSRUVUWVBFX0xJQlMpCiAgICBBQ19ERUZJTkUoSEFWRV9GUkVFVFlQRSwxLFtEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEZyZWVUeXBlMiBsaWJyYXJ5XSkKICAgIENQUEZMQUdTPSIkb2xkX0NQUEZMQUdTIl0sCi0gIFtBQ19NU0dfRVJST1IoW05lZWQgRnJlZVR5cGUgbGlicmFyeSB2ZXJzaW9uIDIuMC45IG9yIGhpZ2hlcl0pXSkKKyAgW0FDX01TR19FUlJPUihbTmVlZCBGcmVlVHlwZSBsaWJyYXJ5IHZlcnNpb24gMi4xMC4yIG9yIGhpZ2hlcl0pXSkKIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAyLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKLVRoaXMgIGZpbGUgaXMgIHBhcnQgIG9mIHRoZSAgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5ICBvbmx5IGJlICB1c2VkLAotbW9kaWZpZWQsICBhbmQgIGRpc3RyaWJ1dGVkIHVuZGVyICB0aGUgIHRlcm1zICBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0Ci1saWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMKLWZpbGUgIHlvdSBpbmRpY2F0ZSB0aGF0ICB5b3UgaGF2ZSAgcmVhZCB0aGUgIGxpY2Vuc2UgYW5kICB1bmRlcnN0YW5kIGFuZAotYWNjZXB0IGl0IGZ1bGx5LgorVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLAorbW9kaWZpZWQsICBhbmQgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgdGVybXMgb2YgIHRoZSBGcmVlVHlwZSAgcHJvamVjdAorbGljZW5zZSwgIExJQ0VOU0UuVFhULiAgQnkgIGNvbnRpbnVpbmcgdG8gIHVzZSwgbW9kaWZ5LCAgb3IgZGlzdHJpYnV0ZQordGhpcyBmaWxlIHlvdSAgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSAgbGljZW5zZSBhbmQgdW5kZXJzdGFuZAorYW5kIGFjY2VwdCBpdCBmdWxseS4KIAogCiAtLS0gZW5kIG9mIFZFUlNJT05TLlRYVCAtLS0KZGlmZiAtLWdpdCBhL2RvY3MvZm9ybWF0cy50eHQgYi9kb2NzL2Zvcm1hdHMudHh0CmluZGV4IDc1YWJhOTIuLmU2NDBmYWIgMTAwNjQ0Ci0tLSBhL2RvY3MvZm9ybWF0cy50eHQKKysrIGIvZG9jcy9mb3JtYXRzLnR4dApAQCAtMTY1LDggKzE2NSw4IEBACiAgICAgcGFydGlhbGx5IGRlZmluZWQgaW4gTUhQIDEuMC4zIChhbHNvIGNhbGxlZCBFVFNJIFRTIDEwMTgxMiBWMS4zLjEpCiAgICAgc2VjdGlvbiA3LjQuCiAKLSAgICAgIGh0dHA6Ly93d3cuZXRzaS5vcmcvCi0gICAgICBodHRwOi8vd2ViYXBwLmV0c2kub3JnL3dvcmtwcm9ncmFtL1JlcG9ydF9Xb3JrSXRlbS5hc3A/V0tJX0lEPTE4Nzk5CisgICAgICBodHRwczovL3d3dy5ldHNpLm9yZy8KKyAgICAgIGh0dHBzOi8vd2ViYXBwLmV0c2kub3JnL3dvcmtwcm9ncmFtL1JlcG9ydF9Xb3JrSXRlbS5hc3A/V0tJX0lEPTE4Nzk5CiAKIFszXSBTdXBwb3J0ICBpcyBydWRpbWVudGFyeSAgY3VycmVudGx5OyBzb21lICB0YWJsZXMgb3IgIGRhdGEgYXJlICBub3QKICAgICBsb2FkZWQgeWV0LgpAQCAtMTkxLDcgKzE5MSw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwNC0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzICBmaWxlIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSAgb25seSBiZSAgdXNlZCwKZGlmZiAtLWdpdCBhL2RvY3MvZnJlZXR5cGUtY29uZmlnLjEgYi9kb2NzL2ZyZWV0eXBlLWNvbmZpZy4xCmluZGV4IDE2NGI4ZmYuLjdkZWE2NmEgMTAwNjQ0Ci0tLSBhL2RvY3MvZnJlZXR5cGUtY29uZmlnLjEKKysrIGIvZG9jcy9mcmVldHlwZS1jb25maWcuMQpAQCAtMSw0ICsxLDQgQEAKLS5USCBGUkVFVFlQRS1DT05GSUcgMSAiTWF5IDIwMTgiICJGcmVlVHlwZSAyLjkuMSIKKy5USCBGUkVFVFlQRS1DT05GSUcgMSAiT2N0b2JlciAyMDIwIiAiRnJlZVR5cGUgMi4xMC40IgogLgogLgogLlNIIE5BTUUKZGlmZiAtLWdpdCBhL2RvY3MvbWFya2Rvd24vaW1hZ2VzL2Zhdmljby5pY28gYi9kb2NzL21hcmtkb3duL2ltYWdlcy9mYXZpY28uaWNvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYTIyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL21hcmtkb3duL2ltYWdlcy9mYXZpY28uaWNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvbWFya2Rvd24vamF2YXNjcmlwdHMvZXh0cmEuanMgYi9kb2NzL21hcmtkb3duL2phdmFzY3JpcHRzL2V4dHJhLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZjE2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL21hcmtkb3duL2phdmFzY3JpcHRzL2V4dHJhLmpzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCitJbnRlcm5hbCBsaW5rIHRvcGJhciBvZmZlc3QgYWRqdXN0IEphdmFzY3JpcHQKK0NvZGUgcHJvdmlkZWQgYnkgQG1ha3NoaCBvbiBHaXRIdWIKKworQnVnIHJlcG9ydCBvbiBtYXRlcmlhbC1ta2RvY3MKKyAgaHR0cHM6Ly9naXRodWIuY29tL3NxdWlkZnVuay9ta2RvY3MtbWF0ZXJpYWwvaXNzdWVzLzc5MQorKi8KKworLy8gT2Zmc2V0IHRvcCBoZWxwZXIKK2Z1bmN0aW9uIG9mZnNldFkoZWxlbSkgeworICAgIGlmKCFlbGVtKSBlbGVtID0gdGhpczsKKyAgICB2YXIgeSA9IGVsZW0ub2Zmc2V0VG9wOworICAgIHdoaWxlIChlbGVtID0gZWxlbS5vZmZzZXRQYXJlbnQpIHsKKyAgICAgICAgeSArPSBlbGVtLm9mZnNldFRvcDsKKyAgICB9CisgICAgcmV0dXJuIHk7Cit9CisKKy8vIElmIGEgbGluayBvbiB0aGUgc2FtZSBwYWdlIGlzIGNsaWNrZWQsIGNhbGN1bGF0ZSB0aGUKKy8vIGNvcnJlY3Qgb2Zmc2V0IGFuZCBzY3JvbGwgdG8gdGhhdCBwYXJ0IG9mIHRoZSBwYWdlLgorLy8KK3ZhciBsaW5rcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhJyk7Citmb3IodmFyIGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsKKyAgICBsaW5rc1tpXS5vbmNsaWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgIGlmICh0aGlzLnBhdGhuYW1lID09IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAmJgorICAgICAgICAgICAgdGhpcy5wcm90b2NvbCA9PSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgJiYKKyAgICAgICAgICAgIHRoaXMuaG9zdCA9PSB3aW5kb3cubG9jYXRpb24uaG9zdCkgeworICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgICAgICAgICAgaWYodGhpcy5oYXNoLnN1YnN0cigxKSl7CisgICAgICAgICAgICAgICAgICAgIHZhciBvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5oYXNoLnN1YnN0cigxKSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBzVCA9IG9mZnNldFkobykgLSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdtZC1oZWFkZXInKVswXS5jbGllbnRIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gdGhpcy5oYXNoOworICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgc1QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLy8gU2x1Z2lmeSBzdXBwbGllZCB0ZXh0CitmdW5jdGlvbiBzbHVnaWZ5KHRleHQpeworICAgIHRleHQgPSB0ZXh0LnRvTG93ZXJDYXNlKCk7CisgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiICIsICItIik7CisgICAgcmV0dXJuIHRleHQ7Cit9CisKKy8vIElmIHRoZXJlIGlzIGEgaGFzaCBpbiB0aGUgdXJsLCBzbHVnaWZ5IGl0CisvLyBhbmQgcmVwbGFjZQoraWYod2luZG93LmxvY2F0aW9uLmhhc2gpIHsKKyAgICAvLyBGcmFnbWVudCBleGlzdHMKKyAgICBzbHVnID0gc2x1Z2lmeSh3aW5kb3cubG9jYXRpb24uaGFzaCk7CisgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHNsdWcpCisgICAgLy93aW5kb3cubG9jYXRpb24uaGFzaCA9IHNsdWc7CisgICAgZG9jdW1lbnQubG9jYXRpb24ucmVwbGFjZSh3aW5kb3cubG9jYXRpb24uaHJlZik7Cit9CmRpZmYgLS1naXQgYS9kb2NzL21hcmtkb3duL3N0eWxlc2hlZXRzL2V4dHJhLmNzcyBiL2RvY3MvbWFya2Rvd24vc3R5bGVzaGVldHMvZXh0cmEuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWU3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL21hcmtkb3duL3N0eWxlc2hlZXRzL2V4dHJhLmNzcwpAQCAtMCwwICsxLDE4MyBAQAorLyogQm9keSBhbmQgcGFnZSAqLworLnd5LW5hdi1jb250ZW50IHsKKyAgICBtYXgtd2lkdGg6IDkwJTsKK30KKy5tZC1ncmlkIHsKKyAgICBtYXgtd2lkdGg6IDkwJTsKK30KKy5tZC1zaWRlYmFyLS1zZWNvbmRhcnkgeworICAgIG1hcmdpbi1sZWZ0OiA5MCU7Cit9CitwIHsKKyAgICB0ZXh0LWFsaWduOiBqdXN0aWZ5OworfQorCisvKiBjb2RlIGJsb2NrcyAqLworcHJlLmNvbG9yZWQgeworICAgIGNvbG9yOiBibHVlOworfQorcHJlPmNvZGUgeworICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI0Q2RThGRjsKKyAgICBwYWRkaW5nOiAyZXggMCAyZXggMSU7CisgICAgb3ZlcmZsb3cteDphdXRvOworfQorc3Bhbi5rZXl3b3JkIHsKKyAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOworICAgIHRleHQtYWxpZ246IGxlZnQ7CisgICAgd2hpdGUtc3BhY2U6IHByZTsKKyAgICBjb2xvcjogI2Q3M2E0OTsKK30KKy5tZC10eXBlc2V0IHByZT5jb2RlIHsKKyAgICB3aGl0ZS1zcGFjZTogcHJlOworfQorLyogSDQgSGVhZGluZyAqLworaDQgeworICAgIGJhY2tncm91bmQtY29sb3I6ICNFRUVFRkY7CisgICAgZm9udC1zaXplOiBtZWRpdW07CisgICAgZm9udC1zdHlsZTogb2JsaXF1ZTsKKyAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICBwYWRkaW5nOiAwLjNlbSAwIDAuM2VtIDElOworfQorCisvKiBGaWVsZHMgdGFibGUgKi8KK3RhYmxlLmZpZWxkcyB7CisgICAgd2lkdGg6IDkwJTsKKyAgICBtYXJnaW46IDEuNWV4IDAgMS41ZXggMTAlOworfQordGFibGUuZmllbGRzIHRkLnZhbCB7CisgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgd2lkdGg6IDMwJTsKKyAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7CisgICAgcGFkZGluZzogMWVtIDFlbSAwIDA7Cit9Cit0YWJsZS5maWVsZHMgdGQuZGVzYyB7CisgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworICAgIHBhZGRpbmc6IDFleCAwIDAgMWVtOworfQordGFibGUuZmllbGRzIHRkLmRlc2MgcDpmaXJzdC1jaGlsZCB7CisgICAgbWFyZ2luOiAwOworfQorCit0YWJsZS5maWVsZHMgdGQuZGVzYyBwIHsKKyAgICBtYXJnaW46IDEuNWV4IDAgMCAwOworfQorCisvKiBEZWZpbmUgJ2xvbmcnIHRhYmxlcyAqLwordGFibGUubG9uZyB7CisgICAgZGlzcGxheTogYmxvY2s7CisgICAgd2lkdGg6IDkzJTsKK30KK3RhYmxlLmxvbmcgdGhlYWQsCit0YWJsZS5sb25nIHRib2R5LAordGFibGUubG9uZyB0aCwKK3RhYmxlLmxvbmcgdGQsCit0YWJsZS5sb25nIHRyIHsKKyAgICBkaXNwbGF5OiBibG9jazsKK30KKy8qIEhpZGUgdGFibGUgaGVhZGVycyAoYnV0IG5vdCBkaXNwbGF5OiBub25lOworLCBmb3IgYWNjZXNzaWJpbGl0eSkgKi8KK3RhYmxlLmxvbmcgdGhlYWQgdHIgeworICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKKyAgICB0b3A6IC05OTk5cHg7CisgICAgbGVmdDogLTk5OTlweDsKK30KK3RhYmxlLmxvbmcgdHIgeworICAgIGJvcmRlcjogMDsKK30KK3RhYmxlLmxvbmcgeworICAgIG1hcmdpbjogMS41ZXggMyUgMS41ZXggMyU7Cit9Cit0YWJsZS5sb25nIHRkLnZhbCB7CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KK3RhYmxlLmxvbmcgdGQgeworICAgLyogQmVoYXZlIGxpa2UgYSAicm93IiAqLworICAgIGJvcmRlcjogbm9uZTsKKyAgICBib3JkZXItYm90dG9tOiAwOworICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICBwYWRkaW5nLWxlZnQ6IDUwJTsKK30KK3RhYmxlLmxvbmcgdGQ6YmVmb3JlIHsKKyAgIC8qIE5vdyBsaWtlIGEgdGFibGUgaGVhZGVyICovCisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgLyogVG9wL2xlZnQgdmFsdWVzIG1pbWljIHBhZGRpbmcgKi8KKyAgICB0b3A6IDZweDsKKyAgICBsZWZ0OiA2cHg7CisgICAgd2lkdGg6IDQ1JTsKKyAgICBwYWRkaW5nLXJpZ2h0OiAxMHB4OworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisvKiBFbmQgJ2xvbmcnIHRhYmxlIGRlZmluaXRpb24gKi8KKworLyogdG9jIHRhYmxlICovCit0YWJsZS50b2MgeworICAgIHdpZHRoOiA5NSU7CisgICAgbWFyZ2luOiAxLjVleCAwIDEuNWV4IDUlOworfQordGFibGUudG9jIHRkLmxpbmsgeworICAgIHdpZHRoOiAzMCU7CisgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworICAgIHBhZGRpbmc6IDFleCAxZW0gMWV4IDA7Cit9Cit0YWJsZS50b2MgdGQuZGVzYyB7CisgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOworICAgIHBhZGRpbmc6IDFleCAwIDFleCAxZW07CisgICAgdGV4dC1hbGlnbjogbGVmdDsKK30KK3RhYmxlLnRvYyB0ZC5kZXNjIHA6Zmlyc3QtY2hpbGQgeworICAgIG1hcmdpbjogMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQordGFibGUudG9jIHRkLmRlc2MgcCB7CisgICAgbWFyZ2luOiAxLjVleCAwIDAgMDsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorZGl2LnRpbWVzdGFtcCB7CisgICAgZm9udC1zaXplOiBzbWFsbDsKK30KKworLyogQ2hhbmdlIHRhYmxlIGxheW91dCBmb3Igc21hbGxlciBzY3JlZW5zLiBUaGlzIHF1ZXJ5IHdpbGwgdGFrZSBlZmZlY3QgZm9yIGFueSBzY3JlZW4gc21hbGxlciB0aGFuCisgICA3NjBweCBhbmQgYWxzbyBpUGFkcyBzcGVjaWZpY2FsbHkuICovCitAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2MHB4KSwgKG1pbi1kZXZpY2Utd2lkdGg6IDc2OHB4KSBhbmQgKG1heC1kZXZpY2Utd2lkdGg6IDEwMjRweCkgeworICAgLyogRm9yY2UgdGFibGUgdG8gbm90IGJlIGxpa2UgdGFibGVzIGFueW1vcmUgKi8KKyAgICB0YWJsZSwgdGhlYWQsIHRib2R5LCB0aCwgdGQsIHRyIHsKKyAgICAgICAgZGlzcGxheTogYmxvY2s7CisgICB9CisgICAvKiBIaWRlIHRhYmxlIGhlYWRlcnMgKGJ1dCBub3QgZGlzcGxheTogbm9uZTsKKyAgICAsIGZvciBhY2Nlc3NpYmlsaXR5KSAqLworICAgIHRoZWFkIHRyIHsKKyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOworICAgICAgICB0b3A6IC05OTk5cHg7CisgICAgICAgIGxlZnQ6IC05OTk5cHg7CisgICB9CisgICAgdHIgeworICAgICAgICBib3JkZXI6IDA7CisgICB9CisgICAgdGFibGUuZmllbGRzIHsKKyAgICAgICAgd2lkdGg6IDkzJTsKKyAgICAgICAgbWFyZ2luOiAxLjVleCAzJSAxLjVleCAzJTsKKyAgIH0KKyAgICB0YWJsZS5maWVsZHMgdGQudmFsIHsKKyAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKKyAgIH0KKyAgICB0ZCB7CisgICAgICAgLyogQmVoYXZlIGxpa2UgYSAicm93IiAqLworICAgICAgICBib3JkZXI6IG5vbmU7CisgICAgICAgIGJvcmRlci1ib3R0b206IDA7CisgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiA1MCU7CisgICB9CisgICAgdGQ6YmVmb3JlIHsKKyAgICAgICAvKiBOb3cgbGlrZSBhIHRhYmxlIGhlYWRlciAqLworICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CisgICAgICAgLyogVG9wL2xlZnQgdmFsdWVzIG1pbWljIHBhZGRpbmcgKi8KKyAgICAgICAgdG9wOiA2cHg7CisgICAgICAgIGxlZnQ6IDZweDsKKyAgICAgICAgd2lkdGg6IDQ1JTsKKyAgICAgICAgcGFkZGluZy1yaWdodDogMTBweDsKKyAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3MvcmFzdGVyLnR4dCBiL2RvY3MvcmFzdGVyLnR4dAppbmRleCA4ZWY0NjZlLi4xYmY0ZjY3IDEwMDY0NAotLS0gYS9kb2NzL3Jhc3Rlci50eHQKKysrIGIvZG9jcy9yYXN0ZXIudHh0CkBAIC02MTgsNyArNjE4LDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNvcHlyaWdodCAyMDAzLTIwMTggYnkKK0NvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAKIFRoaXMgIGZpbGUgIGlzICBwYXJ0ICBvZiB0aGUgIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgbWF5ICBvbmx5IGJlICB1c2VkLApkaWZmIC0tZ2l0IGEvZG9jcy9yZWZlcmVuY2UvLmdpdGlnbm9yZSBiL2RvY3MvcmVmZXJlbmNlLy5naXRpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTlmYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9yZWZlcmVuY2UvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSouaHRtbApkaWZmIC0tZ2l0IGEvZG9jcy9yZWZlcmVuY2UvUkVBRE1FIGIvZG9jcy9yZWZlcmVuY2UvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWIwNGQ2Li4wMDAwMDAwCi0tLSBhL2RvY3MvcmVmZXJlbmNlL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotQWZ0ZXIgc2F5aW5nIGBtYWtlIHJlZmRvYycgdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIEZyZWVUeXBlIEFQSQotcmVmZXJlbmNlLiAgWW91IG5lZWQgcHl0aG9uIHRvIG1ha2UgdGhpcyB0YXJnZXQuCi0KLVRoaXMgYWxzbyB3b3JrcyB3aXRoIEphbTogSnVzdCB0eXBlIGBqYW0gcmVmZG9jJyBpbiB0aGUgbWFpbiBkaXJlY3RvcnkuCi0KZGlmZiAtLWdpdCBhL2RvY3MvcmVsZWFzZSBiL2RvY3MvcmVsZWFzZQppbmRleCA0NGI0Y2IxLi42MjhkZGVkIDEwMDY0NAotLS0gYS9kb2NzL3JlbGVhc2UKKysrIGIvZG9jcy9yZWxlYXNlCkBAIC01OCwxMCArNTgsMTAgQEAKICAgaWYgbmVjZXNzYXJ5KS4KIAogLiBTYXkgYG1ha2UgIGRpc3QnIGluIGJvdGggdGhlICBmcmVldHlwZTIgYW5kIGZyZWV0eXBlMi1kZW1vcyAgbW9kdWxlcwotICB0byBnZW5lcmF0ZSB0aGUgLnRhci5neiwgLnRhci5iejIsIGFuZCAuemlwIGZpbGVzLgorICB0byBnZW5lcmF0ZSB0aGUgLnRhci5neiwgLnRhci54eiwgYW5kIC56aXAgZmlsZXMuCiAKIC4gQ3JlYXRlICAgICB0aGUgICAgIGRvYyAgICBidW5kbGVzICAgIChmcmVldHlwZS1kb2MtPHZlcnNpb24+LnRhci5neiwKLSAgZnJlZXR5cGUtZG9jLTx2ZXJzaW9uPi50YXIuYnoyLCAgICBmdGRvYzx2ZXJzaW9uPi56aXApLiAgICBUaGlzICAgaXMKKyAgZnJlZXR5cGUtZG9jLTx2ZXJzaW9uPi50YXIueHosICAgIGZ0ZG9jPHZlcnNpb24+LnppcCkuICAgIFRoaXMgICAgaXMKICAgZXZlcnl0aGluZyBpbgogCiAgICAgPGZyZWV0eXBlLXdlYiBnaXQgcmVwb3NpdG9yeT4vZnJlZXR5cGUyL2RvY3MKQEAgLTg3LDEzICs4NywxMyBAQAogICAgIHZlcnNpb249YGVjaG8gJFZFUlNJT04gfCBzZWQgInMvXFwuLy9nImAKIAogICAgIEZSRUVUWVBFX1BBQ0tBR0VTPSJmcmVldHlwZS0kVkVSU0lPTi50YXIuZ3ogXAotICAgICAgICAgICAgICAgICAgICAgICBmcmVldHlwZS0kVkVSU0lPTi50YXIuYnoyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlZXR5cGUtJFZFUlNJT04udGFyLnh6IFwKICAgICAgICAgICAgICAgICAgICAgICAgZnQkdmVyc2lvbi56aXAiCiAgICAgRlQyREVNT1NfUEFDS0FHRVM9ImZ0MmRlbW9zLSRWRVJTSU9OLnRhci5neiBcCi0gICAgICAgICAgICAgICAgICAgICAgIGZ0MmRlbW9zLSRWRVJTSU9OLnRhci5iejIgXAorICAgICAgICAgICAgICAgICAgICAgICBmdDJkZW1vcy0kVkVSU0lPTi50YXIueHogXAogICAgICAgICAgICAgICAgICAgICAgICBmdGRtbyR2ZXJzaW9uLnppcCIKICAgICBGVERPQ19QQUNLQUdFUz0iZnJlZXR5cGUtZG9jLSRWRVJTSU9OLnRhci5neiBcCi0gICAgICAgICAgICAgICAgICAgIGZyZWV0eXBlLWRvYy0kVkVSU0lPTi50YXIuYnoyIFwKKyAgICAgICAgICAgICAgICAgICAgZnJlZXR5cGUtZG9jLSRWRVJTSU9OLnRhci54eiBcCiAgICAgICAgICAgICAgICAgICAgIGZ0ZG9jJHZlcnNpb24uemlwIgogCiAgICAgUEFDS0FHRV9MSVNUPSIkRlJFRVRZUEVfUEFDS0FHRVMgXApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgIyBFT0YKIAogLiBPbiAgIFNvdXJjZUZvcmdlLCAgIHRhZyAgIHRoZSAgICBqdXN0ICAgdXBsb2FkZWQgICBgZnRYWFguemlwJyAgIGFuZAotICBgZnJlZXR5cGUtWFhYLnRhci5iejInICBmaWxlcyBhcyB0aGUgIGRlZmF1bHQgZmlsZXMgdG8gIGRvd25sb2FkIGZvcgorICBgZnJlZXR5cGUtWFhYLnRhci54eicgIGZpbGVzIGFzIHRoZSAgZGVmYXVsdCBmaWxlcyB0byAgZG93bmxvYWQgIGZvcgogICBgV2luZG93cycgYW5kIGBPdGhlcnMnLCByZXNwZWN0aXZlbHkuCiAKIC4gQ29weSB0aGUgcmVmZXJlbmNlIGZpbGVzIChnZW5lcmF0ZWQgYnkgYG1ha2UgZGlzdCcpIHRvCkBAIC0xODksNyArMTg5LDcgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwMy0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCiBUaGlzICBmaWxlIGlzICBwYXJ0IG9mICB0aGUgRnJlZVR5cGUgIHByb2plY3QsIGFuZCAgbWF5IG9ubHkgIGJlIHVzZWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlLWZ1Y2hzaWEtY29uZmlnL2Z0bW9kdWxlLmggYi9pbmNsdWRlL2ZyZWV0eXBlLWZ1Y2hzaWEtY29uZmlnL2Z0bW9kdWxlLmgKaW5kZXggNmZmOGIwNS4uMTgxMzg0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS1mdWNoc2lhLWNvbmZpZy9mdG1vZHVsZS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUtZnVjaHNpYS1jb25maWcvZnRtb2R1bGUuaApAQCAtMjMsOCArMjMsNiBAQAogRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc2hpbnRlcl9tb2R1bGVfY2xhc3MgKQogRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBzZm50X21vZHVsZV9jbGFzcyApCiBGVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyApCiAKIAogLy8gT3V0ZGF0ZWQgb3IgYml0bWFwLWJhc2VkIGZvbnQgZm9ybWF0IHVuc3VwcG9ydGVkIGJ5IEZsdXR0ZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaAppbmRleCBlZWRlYmY0Li5iNDY0ZTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGNvbmZpZy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKQEAgLTEsMzkgKzEsMzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBTlNJLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y29uZmlnLmgKKyAqCisgKiAgIEFOU0ktc3BlY2lmaWMgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgdXNlZCAqLwotICAvKiBieSB0aGUgcmVzdCBvZiB0aGUgZW5naW5lLiAgTW9zdCBvZiB0aGUgbWFjcm9zIGhlcmUgYXJlIGF1dG9tYXRpY2FsbHkgKi8KLSAgLyogZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUsIGFuZCB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNoYW5nZSBpdCB0byAgICovCi0gIC8qIHBvcnQgRnJlZVR5cGUsIGV4Y2VwdCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSBub24tQU5TSSAgICAgICAgICAqLwotICAvKiBjb21waWxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgaG93ZXZlciB0aGF0IGlmIHNvbWUgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkLCB3ZSAgICAgICAqLwotICAvKiBhZHZpc2UgeW91IHRvIHBsYWNlIGEgbW9kaWZpZWQgY29weSBpbiB5b3VyIGJ1aWxkIGRpcmVjdG9yeS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBidWlsZCBkaXJlY3RvcnkgaXMgdXN1YWxseSBgYnVpbGRzLzxzeXN0ZW0+JywgYW5kIGNvbnRhaW5zICAgICAgICAqLwotICAvKiBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluY2x1ZGVkIGZpcnN0IHdoZW4gYnVpbGRpbmcgICAgKi8KLSAgLyogdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIEFOU0kgdmVyc2lvbiBzaG91bGQgc3RheSBpbiBgaW5jbHVkZS9jb25maWcvJy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBoZWFkZXIgZmlsZSBjb250YWlucyBhIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5CisgICAqIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUuICBNb3N0IG9mIHRoZSBtYWNyb3MgaGVyZSBhcmUgYXV0b21hdGljYWxseQorICAgKiBkZXRlcm1pbmVkIGF0IGNvbXBpbGUgdGltZSwgYW5kIHlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2hhbmdlIGl0IHRvIHBvcnQKKyAgICogRnJlZVR5cGUsIGV4Y2VwdCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSBub24tQU5TSSBjb21waWxlci4KKyAgICoKKyAgICogTm90ZSBob3dldmVyIHRoYXQgaWYgc29tZSBzcGVjaWZpYyBtb2RpZmljYXRpb25zIGFyZSBuZWVkZWQsIHdlIGFkdmlzZQorICAgKiB5b3UgdG8gcGxhY2UgYSBtb2RpZmllZCBjb3B5IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LgorICAgKgorICAgKiBUaGUgYnVpbGQgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYGJ1aWxkcy88c3lzdGVtPmAsIGFuZCBjb250YWlucworICAgKiBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgdGhhdCBhcmUgYWx3YXlzIGluY2x1ZGVkIGZpcnN0IHdoZW4gYnVpbGRpbmcgdGhlCisgICAqIGxpYnJhcnkuCisgICAqCisgICAqIFRoaXMgQU5TSSB2ZXJzaW9uIHNob3VsZCBzdGF5IGluIGBpbmNsdWRlL2NvbmZpZy9gLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBGVENPTkZJR19IXwogI2RlZmluZSBGVENPTkZJR19IXwpAQCAtNDIsNTI4ICs0MSw5IEBACiAjaW5jbHVkZSBGVF9DT05GSUdfT1BUSU9OU19ICiAjaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICiAKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgUExBVEZPUk0tU1BFQ0lGSUMgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB0b2dnbGVkIHRvIHN1aXQgYSBzcGVjaWZpYyBzeXN0ZW0uICBUaGUgY3VycmVudCAgICovCi0gIC8qIG9uZXMgYXJlIGRlZmF1bHRzIHVzZWQgdG8gY29tcGlsZSBGcmVlVHlwZSBpbiBhbiBBTlNJIEMgZW52aXJvbm1lbnQgICAqLwotICAvKiAoMTZiaXQgY29tcGlsZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCkuICBDb3B5IHRoaXMgZmlsZSB0byB5b3VyIG93biAgICAgKi8KLSAgLyogYGJ1aWxkcy88c3lzdGVtPicgZGlyZWN0b3J5LCBhbmQgZWRpdCBpdCB0byBwb3J0IHRoZSBlbmdpbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoZXJlIGFyZSBzeXN0ZW1zIChsaWtlIHRoZSBUZXhhcyBJbnN0cnVtZW50cyAnQzU0eCkgd2hlcmUgYSBgY2hhcicgKi8KLSAgLyogaGFzIDE2IGJpdHMuICBBTlNJIEMgc2F5cyB0aGF0IHNpemVvZihjaGFyKSBpcyBhbHdheXMgMS4gIFNpbmNlIGFuICAqLwotICAvKiBgaW50JyBoYXMgMTYgYml0cyBhbHNvIGZvciB0aGlzIHN5c3RlbSwgc2l6ZW9mKGludCkgZ2l2ZXMgMSB3aGljaCAgICovCi0gIC8qIGlzIHByb2JhYmx5IHVuZXhwZWN0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgQ0hBUl9CSVQnIChkZWZpbmVkIGluIGxpbWl0cy5oKSBnaXZlcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSAgICAgICovCi0gIC8qIGBjaGFyJyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmbmRlZiBGVF9DSEFSX0JJVAotI2RlZmluZSBGVF9DSEFSX0JJVCAgQ0hBUl9CSVQKLSNlbmRpZgotCi0KLSAgLyogVGhlIHNpemUgb2YgYW4gYGludCcgdHlwZS4gICovCi0jaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoIDE2IC8gRlRfQ0hBUl9CSVQgKQotI2VsaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICggMzIgLyBGVF9DSEFSX0JJVCApCi0jZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoIDY0IC8gRlRfQ0hBUl9CSVQgKQotI2Vsc2UKLSNlcnJvciAiVW5zdXBwb3J0ZWQgc2l6ZSBvZiBgaW50JyB0eXBlISIKLSNlbmRpZgotCi0gIC8qIFRoZSBzaXplIG9mIGEgYGxvbmcnIHR5cGUuICBBIGZpdmUtYnl0ZSBgbG9uZycgKGFzIHVzZWQgZS5nLiBvbiB0aGUgKi8KLSAgLyogRE02NDIpIGlzIHJlY29nbml6ZWQgYnV0IGF2b2lkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICggMzIgLyBGVF9DSEFSX0JJVCApCi0jZWxpZiBGVF9VTE9OR19NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoIDMyIC8gRlRfQ0hBUl9CSVQgKQotI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKCA2NCAvIEZUX0NIQVJfQklUICkKLSNlbHNlCi0jZXJyb3IgIlVuc3VwcG9ydGVkIHNpemUgb2YgYGxvbmcnIHR5cGUhIgotI2VuZGlmCi0KLQotICAvKiBGVF9VTlVTRUQgaXMgYSBtYWNybyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSBnaXZlbiBwYXJhbWV0ZXIgaXMgbm90ICAqLwotICAvKiB1c2VkIC0tIHRoaXMgaXMgb25seSB1c2VkIHRvIGdldCByaWQgb2YgdW5wbGVhc2FudCBjb21waWxlciB3YXJuaW5ncyAqLwotI2lmbmRlZiBGVF9VTlVTRUQKLSNkZWZpbmUgRlRfVU5VU0VEKCBhcmcgKSAgKCAoYXJnKSA9IChhcmcpICkKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIEFVVE9NQVRJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIG1hY3JvcyBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgb25lcyBkZWZpbmVkIGFib3ZlLiAgRG9uJ3QgdG91Y2ggICAqLwotICAvKiB0aGVpciBkZWZpbml0aW9uLCB1bmxlc3MgeW91IGtub3cgcHJlY2lzZWx5IHdoYXQgeW91IGFyZSBkb2luZy4gIE5vICAgKi8KLSAgLyogcG9ydGVyIHNob3VsZCBuZWVkIHRvIG1lc3Mgd2l0aCB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWFjIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgaXMgdGhlIG9ubHkgbmVjZXNzYXJ5IGNoYW5nZSwgc28gaXQgaXMgZGVmaW5lZCBoZXJlIGluc3RlYWQgICAgKi8KLSAgLyogICBwcm92aWRpbmcgYSBuZXcgY29uZmlndXJhdGlvbiBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIGRlZmluZWQoIF9fQVBQTEVfXyApIHx8ICggZGVmaW5lZCggX19NV0VSS1NfXyApICYmIGRlZmluZWQoIG1hY2ludG9zaCApICkKLSAgLyogbm8gQ2FyYm9uIGZyYW1ld29ya3MgZm9yIDY0Yml0IDEwLjQueCAqLwotICAvKiBBdmFpbGFiaWxpdHlNYWNyb3MuaCBpcyBhdmFpbGFibGUgc2luY2UgTWFjIE9TIFggMTAuMiwgICAgICAgICovCi0gIC8qIHNvIGd1ZXNzIHRoZSBzeXN0ZW0gdmVyc2lvbiBieSBtYXhpbXVtIGVycm5vIGJlZm9yZSBpbmNsdXNpb24gKi8KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIEVDQU5DRUxFRCAvKiBkZWZpbmVkIHNpbmNlIDEwLjIgKi8KLSNpbmNsdWRlICJBdmFpbGFiaWxpdHlNYWNyb3MuaCIKLSNlbmRpZgotI2lmIGRlZmluZWQoIF9fTFA2NF9fICkgJiYgXAotICAgICggTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPD0gTUFDX09TX1hfVkVSU0lPTl8xMF80ICkKLSN1bmRlZiBGVF9NQUNJTlRPU0gKLSNlbmRpZgotCi0jZWxpZiBkZWZpbmVkKCBfX1NDX18gKSB8fCBkZWZpbmVkKCBfX01SQ19fICkKLSAgLyogQ2xhc3NpYyBNYWNPUyBjb21waWxlcnMgKi8KLSNpbmNsdWRlICJDb25kaXRpb25hbE1hY3Jvcy5oIgotI2lmIFRBUkdFVF9PU19NQUMKLSNkZWZpbmUgRlRfTUFDSU5UT1NIIDEKLSNlbmRpZgotCi0jZW5kaWYKLQotCi0gIC8qIEZpeCBjb21waWxlciB3YXJuaW5nIHdpdGggc2dpIGNvbXBpbGVyICovCi0jaWYgZGVmaW5lZCggX19zZ2kgKSAmJiAhZGVmaW5lZCggX19HTlVDX18gKQotI2lmIGRlZmluZWQoIF9DT01QSUxFUl9WRVJTSU9OICkgJiYgKCBfQ09NUElMRVJfVkVSU0lPTiA+PSA3MzAgKQotI3ByYWdtYSBzZXQgd29mZiAzNTA1Ci0jZW5kaWYKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0ludDE2OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VSW50MTY7Ci0KLSAgLyogKi8KLQotCi0gIC8qIHRoaXMgI2lmIDAgLi4uICNlbmRpZiBjbGF1c2UgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgKi8KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50NjQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KLSAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDY0OwotCi0gIC8qICovCi0KLSNlbmRpZgotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSAoIDMyIC8gRlRfQ0hBUl9CSVQgKQotCi0gIHR5cGVkZWYgc2lnbmVkIGludCAgICAgIEZUX0ludDMyOwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICBGVF9VSW50MzI7Ci0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID09ICggMzIgLyBGVF9DSEFSX0JJVCApCi0KLSAgdHlwZWRlZiBzaWduZWQgbG9uZyAgICAgRlRfSW50MzI7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIEZUX1VJbnQzMjsKLQotI2Vsc2UKLSNlcnJvciAibm8gMzJiaXQgdHlwZSBmb3VuZCAtLSBwbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGVzIgotI2VuZGlmCi0KLQotICAvKiBsb29rIHVwIGFuIGludGVnZXIgdHlwZSB0aGF0IGlzIGF0IGxlYXN0IDMyIGJpdHMgKi8KLSNpZiBGVF9TSVpFT0ZfSU5UID49ICggMzIgLyBGVF9DSEFSX0JJVCApCi0KLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9GYXN0OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1VGYXN0OwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA+PSAoIDMyIC8gRlRfQ0hBUl9CSVQgKQotCi0gIHR5cGVkZWYgbG9uZyAgICAgICAgICAgRlRfRmFzdDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VRmFzdDsKLQotI2VuZGlmCi0KLQotICAvKiBkZXRlcm1pbmUgd2hldGhlciB3ZSBoYXZlIGEgNjQtYml0IGludCB0eXBlIGZvciBwbGF0Zm9ybXMgd2l0aG91dCAqLwotICAvKiBBdXRvY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIEZUX1NJWkVPRl9MT05HID09ICggNjQgLyBGVF9DSEFSX0JJVCApCi0KLSAgLyogRlRfTE9ORzY0IG11c3QgYmUgZGVmaW5lZCBpZiBhIDY0LWJpdCB0eXBlIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nCi0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSA2NC1iaXQgZGF0YSB0eXBlIG1heSBjcmVhdGUgY29tcGlsYXRpb24gcHJvYmxlbXMgaWYgeW91IGNvbXBpbGUgICAgICovCi0gIC8qIGluIHN0cmljdCBBTlNJIG1vZGUuICBUbyBhdm9pZCB0aGVtLCB3ZSBkaXNhYmxlIG90aGVyIDY0LWJpdCBkYXRhICAgICAqLwotICAvKiB0eXBlcyBpZiBfX1NURENfXyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGlnbm9yZSB0aGlzIHJ1bGUgICAgICAgKi8KLSAgLyogYnkgZGVmaW5pbmcgdGhlIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgY29uZmlndXJhdGlvbiBtYWNyby4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2VsaWYgIWRlZmluZWQoIF9fU1REQ19fICkgfHwgZGVmaW5lZCggRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCApCi0KLSNpZiBkZWZpbmVkKCBfX1NURENfVkVSU0lPTl9fICkgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VsaWYgZGVmaW5lZCggX01TQ19WRVIgKSAmJiBfTVNDX1ZFUiA+PSA5MDAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fQk9STEFORENfXyApICAvKiBCb3JsYW5kIEMrKyAqLwotCi0gIC8qIFhYWFg6IFdlIHNob3VsZCBwcm9iYWJseSBjaGVjayB0aGUgdmFsdWUgb2YgX19CT1JMQU5EQ19fIGluIG9yZGVyICovCi0gIC8qICAgICAgIHRvIHRlc3QgdGhlIGNvbXBpbGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgX19pbnQ2NCB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIF9faW50NjQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBfX2ludDY0Ci0KLSNlbGlmIGRlZmluZWQoIF9fV0FUQ09NQ19fICkgICAvKiBXYXRjb20gQysrICovCi0KLSAgLyogV2F0Y29tIGRvZXNuJ3QgcHJvdmlkZSA2NC1iaXQgZGF0YSB0eXBlcyAqLwotCi0jZWxpZiBkZWZpbmVkKCBfX01XRVJLU19fICkgICAgLyogTWV0cm93ZXJrcyBDb2RlV2FycmlvciAqLwotCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkKLQotICAvKiBHQ0MgcHJvdmlkZXMgdGhlIGBsb25nIGxvbmcnIHR5cGUgKi8KLSNkZWZpbmUgRlRfTE9ORzY0Ci0jZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAotI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKLQotI2VuZGlmIC8qIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCi0KLSNpZmRlZiBGVF9MT05HNjQKLSAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OwotICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OwotI2VuZGlmCi0KLQotI2lmZGVmIF9XSU42NAotICAvKiBvbmx5IDY0Yml0IFdpbmRvd3MgdXNlcyB0aGUgTExQNjQgZGF0YSBtb2RlbCwgaS5lLiwgKi8KLSAgLyogMzJiaXQgaW50ZWdlcnMsIDY0Yml0IHBvaW50ZXJzICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgX19pbnQ2NCkoeCkKLSNlbHNlCi0jZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICh2b2lkKikodW5zaWduZWQgbG9uZykoeCkKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKLSNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKLSNkZWZpbmUgRlRfRFVNTVlfU1RNTlQgIEZUX0JFR0lOX1NUTU5UIEZUX0VORF9TVE1OVAotCi0KLSAgLyogdHlwZW9mIGNvbmRpdGlvbiB0YWtlbiBmcm9tIGdudWxpYidzIGBpbnRwcm9wcy5oJyBoZWFkZXIgZmlsZSAqLwotI2lmICggKCBkZWZpbmVkKCBfX0dOVUNfXyApICYmIF9fR05VQ19fID49IDIgKSAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX0lCTUNfXyApICYmIF9fSUJNQ19fID49IDEyMTAgJiYgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkZWZpbmVkKCBfX0lCTV9fVFlQRU9GX18gKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgXAotICAgICAgKCBkZWZpbmVkKCBfX1NVTlBST19DICkgJiYgX19TVU5QUk9fQyA+PSAweDUxMTAgJiYgIV9fU1REQ19fICkgKQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgKCBfX3R5cGVvZl9fICggdHlwZSApICkKLSNlbHNlCi0jZGVmaW5lIEZUX1RZUEVPRiggdHlwZSApICAvKiBlbXB0eSAqLwotI2VuZGlmCi0KLQotICAvKiBVc2UgRlRfTE9DQUwgYW5kIEZUX0xPQ0FMX0RFRiB0byBkZWNsYXJlIGFuZCBkZWZpbmUsIHJlc3BlY3RpdmVseSwgKi8KLSAgLyogYSBmdW5jdGlvbiB0aGF0IGdldHMgdXNlZCBvbmx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBtb2R1bGUuICAgICAgICovCi0gIC8qIE5vcm1hbGx5LCBib3RoIHRoZSBoZWFkZXIgYW5kIHNvdXJjZSBjb2RlIGZpbGVzIGZvciBzdWNoIGEgICAgICAgICAqLwotICAvKiBmdW5jdGlvbiBhcmUgd2l0aGluIGEgc2luZ2xlIG1vZHVsZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEludHJhLW1vZHVsZSBhcnJheXMgc2hvdWxkIGJlIHRhZ2dlZCB3aXRoIEZUX0xPQ0FMX0FSUkFZIGFuZCAgICAgICAqLwotICAvKiBGVF9MT0NBTF9BUlJBWV9ERUYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBzdGF0aWMgIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIHN0YXRpYyAgeAotCi0jZWxzZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAiQyIgIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBleHRlcm4gIHgKLSNkZWZpbmUgRlRfTE9DQUxfREVGKCB4ICkgIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVCAqLwotCi0jZGVmaW5lIEZUX0xPQ0FMX0FSUkFZKCB4ICkgICAgICBleHRlcm4gY29uc3QgIHgKLSNkZWZpbmUgRlRfTE9DQUxfQVJSQVlfREVGKCB4ICkgIGNvbnN0ICB4Ci0KLQotICAvKiBVc2UgRlRfQkFTRSBhbmQgRlRfQkFTRV9ERUYgdG8gZGVjbGFyZSBhbmQgZGVmaW5lLCByZXNwZWN0aXZlbHksICovCi0gIC8qIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGluIG1vcmUgdGhhbiBhIHNpbmdsZSBtb2R1bGUuICBJbiB0aGUgICAgKi8KLSAgLyogY3VycmVudCBzZXR1cCB0aGlzIGltcGxpZXMgdGhhdCB0aGUgZGVjbGFyYXRpb24gaXMgaW4gYSBoZWFkZXIgICAqLwotICAvKiBmaWxlIGluIHRoZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbCcgZGlyZWN0b3J5LCBhbmQgdGhlICAgICAgICovCi0gIC8qIGZ1bmN0aW9uIGJvZHkgaXMgaW4gYSBmaWxlIGluIGBzcmMvYmFzZScuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9CQVNFCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFICovCi0KLQotI2lmbmRlZiBGVF9CQVNFX0RFRgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfQkFTRV9ERUYgKi8KLQotCi0gIC8qICAgV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwgb3IgRFNPIHdpdGggaGlkZGVuIHZpc2liaWxpdHkgICAgICAqLwotICAvKiAgIHNvbWUgc3lzdGVtcy9jb21waWxlcnMgbmVlZCBhIHNwZWNpYWwgYXR0cmlidXRlIGluIGZyb250IE9SIGFmdGVyICAgKi8KLSAgLyogICB0aGUgcmV0dXJuIHR5cGUgb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFR3byBtYWNyb3MgYXJlIHVzZWQgd2l0aGluIHRoZSBGcmVlVHlwZSBzb3VyY2UgY29kZSB0byBkZWZpbmUgICAgICAgKi8KLSAgLyogICBleHBvcnRlZCBsaWJyYXJ5IGZ1bmN0aW9uczogRlRfRVhQT1JUIGFuZCBGVF9FWFBPUlRfREVGLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUKCByZXR1cm5fdHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlQoIEZUX0Vycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9FWFBPUlRfREVGKCByZXR1cm5fdHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBZb3UgY2FuIHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gb2YgRlRfRVhQT1JUIGFuZCAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVhQT1JUX0RFRiBoZXJlIGlmIHlvdSB3YW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUbyBleHBvcnQgYSB2YXJpYWJsZSwgdXNlIEZUX0VYUE9SVF9WQVIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FWFBPUlQKLQotI2lmZGVmIEZUMl9CVUlMRF9MSUJSQVJZCi0KLSNpZiBkZWZpbmVkKCBfV0lOMzIgKSAmJiAoIGRlZmluZWQoIF9ETEwgKSB8fCBkZWZpbmVkKCBETExfRVhQT1JUICkgKQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19kZWNsc3BlYyggZGxsZXhwb3J0ICkgIHgKLSNlbGlmIGRlZmluZWQoIF9fR05VQ19fICkgJiYgX19HTlVDX18gPj0gNAotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19hdHRyaWJ1dGVfXygoIHZpc2liaWxpdHkoICJkZWZhdWx0IiApICkpICB4Ci0jZWxpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2Vsc2UKLQotI2lmIGRlZmluZWQoIEZUMl9ETExJTVBPUlQgKQotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgX19kZWNsc3BlYyggZGxsaW1wb3J0ICkgIHgKLSNlbGlmIGRlZmluZWQoIF9fY3BsdXNwbHVzICkKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVCggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlQgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9ERUYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX0RFRiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9ERUYgKi8KLQotCi0jaWZuZGVmIEZUX0VYUE9SVF9WQVIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUX1ZBUiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0VYUE9SVF9WQVIgKi8KLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBuZWVkZWQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIGEgICAqLwotICAvKiBDKysgY29tcGlsZXIgYW5kIHdpdGggMTZiaXQgY29tcGlsZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogVGhpcyBpcyBzcGVjaWFsLiAgV2l0aGluIEMrKywgeW91IG11c3Qgc3BlY2lmeSBgZXh0ZXJuICJDIicgZm9yICovCi0gIC8qIGZ1bmN0aW9ucyB3aGljaCBhcmUgdXNlZCB2aWEgZnVuY3Rpb24gcG9pbnRlcnMsIGFuZCB5b3UgYWxzbyAgICAqLwotICAvKiBtdXN0IGRvIHRoYXQgZm9yIHN0cnVjdHVyZXMgd2hpY2ggY29udGFpbiBmdW5jdGlvbiBwb2ludGVycyB0byAgKi8KLSAgLyogYXNzdXJlIEMgbGlua2FnZSAtLSBpdCdzIG5vdCBwb3NzaWJsZSB0byBoYXZlIChsb2NhbCkgYW5vbnltb3VzICovCi0gIC8qIGZ1bmN0aW9ucyB3aGljaCBhcmUgYWNjZXNzZWQgYnkgKGdsb2JhbCkgZnVuY3Rpb24gcG9pbnRlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX0NBTExCQUNLX0RFRiBpcyB1c2VkIHRvIF9kZWZpbmVfIGEgY2FsbGJhY2sgZnVuY3Rpb24sICAgICAgICAqLwotICAvKiBsb2NhdGVkIGluIHRoZSBzYW1lIHNvdXJjZSBjb2RlIGZpbGUgYXMgdGhlIHN0cnVjdHVyZSB0aGF0IHVzZXMgKi8KLSAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9CQVNFX0NBTExCQUNLIGFuZCBGVF9CQVNFX0NBTExCQUNLX0RFRiBhcmUgdXNlZCB0byBkZWNsYXJlICAgKi8KLSAgLyogYW5kIGRlZmluZSBhIGNhbGxiYWNrIGZ1bmN0aW9uLCByZXNwZWN0aXZlbHksIGluIGEgc2ltaWxhciB3YXkgICovCi0gIC8qIGFzIEZUX0JBU0UgYW5kIEZUX0JBU0VfREVGIHdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfVEFCTEUgaXMgdXNlZCB0byBfZGVjbGFyZV8gYSBjb25zdGFudCB2YXJpYWJsZSB0aGF0ICovCi0gIC8qIGNvbnRhaW5zIHBvaW50ZXJzIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjb25zdGFudCB2YXJpYWJsZSAgICovCi0gIC8qIHRoYXQgY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgMTZiaXQgY29tcGlsZXJzIGhhdmUgdG8gcmVkZWZpbmUgdGhlc2UgbWFjcm9zIHRvIGluc2VydCAgICAqLwotICAvKiB0aGUgaW5mYW1vdXMgYF9jZGVjbCcgb3IgYF9fZmFzdGNhbGwnIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NBTExCQUNLX0RFRgotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9DQUxMQkFDS19ERUYoIHggKSAgc3RhdGljICB4Ci0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19ERUYgKi8KLQotI2lmbmRlZiBGVF9CQVNFX0NBTExCQUNLCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkFTRV9DQUxMQkFDSyggeCApICAgICAgZXh0ZXJuICJDIiAgeAotI2RlZmluZSBGVF9CQVNFX0NBTExCQUNLX0RFRiggeCApICBleHRlcm4gIkMiICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFX0NBTExCQUNLKCB4ICkgICAgICBleHRlcm4gIHgKLSNkZWZpbmUgRlRfQkFTRV9DQUxMQkFDS19ERUYoIHggKSAgeAotI2VuZGlmCi0jZW5kaWYgLyogRlRfQkFTRV9DQUxMQkFDSyAqLwotCi0jaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCi0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLwotCi0KLUZUX0VORF9IRUFERVIKLQorI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9pbnRlZ2VyLXR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvbWFjLXN1cHBvcnQuaD4KIAogI2VuZGlmIC8qIEZUQ09ORklHX0hfICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oCmluZGV4IDcwMmY3N2MuLjI4YjVjYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRoZWFkZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJ1aWxkIG1hY3JvcyBvZiB0aGUgRnJlZVR5cGUgMiBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRoZWFkZXIuaAorICoKKyAqICAgQnVpbGQgbWFjcm9zIG9mIHRoZSBGcmVlVHlwZSAyIGxpYnJhcnkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogI2lmbmRlZiBGVEhFQURFUl9IXwogI2RlZmluZSBGVEhFQURFUl9IXwpAQCAtMjcsMTMgKzI3LDE1IEBACiAgIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfRU5EX0hFQURFUiBpbiBoZWFkZXIgICAgKi8KICAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLworICAvKiAgICBlbmNhcHN1bGF0ZWQgaW4gYW4gYGV4dGVybiAiQyIgeyAuLiB9YCBibG9jayB3aGVuIGluY2x1ZGVkIGZyb20gYSAgKi8KICAgLyogICAgQysrIGNvbXBpbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUiAgZXh0ZXJuICJDIiB7Ci0jZWxzZQotI2RlZmluZSBGVF9CRUdJTl9IRUFERVIgIC8qIG5vdGhpbmcgKi8KKyNpZm5kZWYgRlRfQkVHSU5fSEVBREVSCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgICBkZWZpbmUgRlRfQkVHSU5fSEVBREVSICBleHRlcm4gIkMiIHsKKyMgIGVsc2UKKyMgIGRlZmluZSBGVF9CRUdJTl9IRUFERVIgIC8qIG5vdGhpbmcgKi8KKyMgIGVuZGlmCiAjZW5kaWYKIAogCkBAIC00NSw2NCArNDcsNjkgQEAKICAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBhc3NvY2lhdGlvbiB3aXRoIEBGVF9CRUdJTl9IRUFERVIgaW4gaGVhZGVyICAqLwogICAvKiAgICBmaWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIHdpdGhpbiBhcmUgcHJvcGVybHkgICAgICAgICAgKi8KLSAgLyogICAgZW5jYXBzdWxhdGVkIGluIGFuIGBleHRlcm4gIkMiIHsgLi4gfScgYmxvY2sgd2hlbiBpbmNsdWRlZCBmcm9tIGEgICovCisgIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH1gIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwogICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgfQotI2Vsc2UKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgLyogbm90aGluZyAqLworI2lmbmRlZiBGVF9FTkRfSEVBREVSCisjICBpZmRlZiBfX2NwbHVzcGx1cworIyAgICBkZWZpbmUgRlRfRU5EX0hFQURFUiAgfQorIyAgZWxzZQorIyAgIGRlZmluZSBGVF9FTkRfSEVBREVSICAvKiBub3RoaW5nICovCisjICBlbmRpZgogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsaWFzZXMgZm9yIHRoZSBGcmVlVHlwZSAyIHB1YmxpYyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBbGlhc2VzIGZvciB0aGUgRnJlZVR5cGUgMiBwdWJsaWMgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAqCisgICAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlcl9maWxlX21hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhlYWRlciBGaWxlIE1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hY3JvIGRlZmluaXRpb25zIHVzZWQgdG8gI2luY2x1ZGUgc3BlY2lmaWMgaGVhZGVyIGZpbGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIHRvIHRoZSBuYW1lIG9mIHNwZWNpZmljICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZX4yIGhlYWRlciBmaWxlcy4gIFRoZXkgY2FuIGJlIHVzZWQgZGlyZWN0bHkgaW4gI2luY2x1ZGUgICAgKi8KLSAgLyogICAgc3RhdGVtZW50cyBhcyBpbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9GUkVFVFlQRV9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0dMWVBIX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVyZSBhcmUgc2V2ZXJhbCByZWFzb25zIHdoeSB3ZSBhcmUgbm93IHVzaW5nIG1hY3JvcyB0byBuYW1lICAgICAgKi8KLSAgLyogICAgcHVibGljIGhlYWRlciBmaWxlcy4gIFRoZSBmaXJzdCBvbmUgaXMgdGhhdCBzdWNoIG1hY3JvcyBhcmUgbm90ICAgICovCi0gIC8qICAgIGxpbWl0ZWQgdG8gdGhlIGluZmFtb3VzIDguM35uYW1pbmcgcnVsZSByZXF1aXJlZCBieSBET1MgKGFuZCAgICAgICAqLwotICAvKiAgICBgRlRfTVVMVElQTEVfTUFTVEVSU19IJyBpcyBhIGxvdCBtb3JlIG1lYW5pbmdmdWwgdGhhbiBgZnRtbS5oJykuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzZWNvbmQgcmVhc29uIGlzIHRoYXQgaXQgYWxsb3dzIGZvciBtb3JlIGZsZXhpYmlsaXR5IGluIHRoZSAgICAqLwotICAvKiAgICB3YXkgRnJlZVR5cGV+MiBpcyBpbnN0YWxsZWQgb24gYSBnaXZlbiBzeXN0ZW0uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgaGVhZGVyX2ZpbGVfbWFjcm9zCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBIZWFkZXIgRmlsZSBNYWNyb3MKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIE1hY3JvIGRlZmluaXRpb25zIHVzZWQgdG8gYCNpbmNsdWRlYCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsIHNjaGVtZSBvZiBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzIGxpa2UKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgICNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorICAgKiAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KKyAgICogICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CisgICAqICAgYGBgCisgICAqCisgICAqICAgaXQgaXMgcG9zc2libGUgdG8gdXNlZCBuYW1lZCBtYWNyb3MgaW5zdGVhZC4gIFRoZXkgY2FuIGJlIHVzZWQKKyAgICogICBkaXJlY3RseSBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgYXMgaW4KKyAgICoKKyAgICogICBgYGAKKyAgICogICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyAgICogICAgICNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAorICAgKiAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSAorICAgKiAgIGBgYAorICAgKgorICAgKiAgIFRoZXNlIG1hY3JvcyB3ZXJlIGludHJvZHVjZWQgdG8gb3ZlcmNvbWUgdGhlIGluZmFtb3VzIDguM35uYW1pbmcgcnVsZQorICAgKiAgIHJlcXVpcmVkIGJ5IERPUyAoYW5kIGBGVF9NVUxUSVBMRV9NQVNURVJTX0hgIGlzIGEgbG90IG1vcmUgbWVhbmluZ2Z1bAorICAgKiAgIHRoYW4gYGZ0bW0uaGApLgorICAgKgorICAgKi8KIAogCiAgIC8qIGNvbmZpZ3VyYXRpb24gZmlsZXMgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0NPTkZJR19DT05GSUdfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKICAgICogICBGcmVlVHlwZX4yIGNvbmZpZ3VyYXRpb24gZGF0YS4KICAgICoKICAgICovCkBAIC0xMTEsMTMgKzExOCwxMyBAQAogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZworICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCiAgICAqICAgRnJlZVR5cGV+MiBpbnRlcmZhY2UgdG8gdGhlIHN0YW5kYXJkIEMgbGlicmFyeSBmdW5jdGlvbnMuCiAgICAqCiAgICAqLwpAQCAtMTI2LDEzICsxMzMsMTMgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9DT05GSUdfT1BUSU9OU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwogICAgKiAgIEZyZWVUeXBlfjIgcHJvamVjdC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAgICAqCiAgICAqLwpAQCAtMTQxLDEzICsxNDgsMTMgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9DT05GSUdfTU9EVUxFU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgdG8gbmV3IGxpYnJhcnkKICAgICogICBpbnN0YW5jZXMgaW4gQEZUX0luaXRfRnJlZVR5cGUuCiAgICAqCkBAIC0xNjAsMjYgKzE2NywyNiBAQAogCiAgIC8qIHB1YmxpYyBoZWFkZXJzICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9GUkVFVFlQRV9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgYmFzZSBGcmVlVHlwZX4yIEFQSS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0ZSRUVUWVBFX0ggIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9FUlJPUlNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGV+MiBlcnJvciBjb2RlcyAoYW5kIG1lc3NhZ2VzKS4KICAgICoKICAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KQEAgLTE4OCwyNiArMTk1LDI2IEBACiAjZGVmaW5lIEZUX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfTU9EVUxFX0VSUk9SU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZSBlcnJvciBvZmZzZXRzIChhbmQgbWVzc2FnZXMpLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfTU9EVUxFX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfU1lTVEVNX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBGcmVlVHlwZX4yIGludGVyZmFjZSB0byBsb3ctbGV2ZWwgb3BlcmF0aW9ucyAoaS5lLiwgbWVtb3J5IG1hbmFnZW1lbnQKICAgICogICBhbmQgc3RyZWFtIGkvbykuCiAgICAqCkBAIC0yMTcsMTMgKzIyNCwxMyBAQAogI2RlZmluZSBGVF9TWVNURU1fSCAgPGZyZWV0eXBlL2Z0c3lzdGVtLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0lNQUdFX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0eXBlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdHlwZQogICAgKiAgIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gZ2x5cGggaW1hZ2VzIChpLmUuLCBiaXRtYXBzLCBvdXRsaW5lcywKICAgICogICBzY2FuLWNvbnZlcnRlciBwYXJhbWV0ZXJzKS4KICAgICoKQEAgLTIzMywxMyArMjQwLDEzIEBACiAjZGVmaW5lIEZUX0lNQUdFX0ggIDxmcmVldHlwZS9mdGltYWdlLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1RZUEVTX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgRnJlZVR5cGV+Mi4KICAgICoKICAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KQEAgLTI0OCwxMyArMjU1LDEzIEBACiAjZGVmaW5lIEZUX1RZUEVTX0ggIDxmcmVldHlwZS9mdHR5cGVzLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0xJU1RfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIGxpc3QgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KICAgICoKICAgICogICAoTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCBuZXZlciBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLikKQEAgLTI2MywxNTEgKzI3MCwxNTEgQEAKICNkZWZpbmUgRlRfTElTVF9IICA8ZnJlZXR5cGUvZnRsaXN0Lmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX09VVExJTkVfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIHNjYWxhYmxlIG91dGxpbmUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX09VVExJTkVfSCAgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfU0laRVNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIEFQSSB3aGljaCBtYW5hZ2VzIG11bHRpcGxlIEBGVF9TaXplIG9iamVjdHMgcGVyIGZhY2UuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9TSVpFU19IICA8ZnJlZXR5cGUvZnRzaXplcy5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9NT0RVTEVfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIG1vZHVsZSBtYW5hZ2VtZW50IEFQSSBvZiBGcmVlVHlwZX4yLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfTU9EVUxFX0ggIDxmcmVldHlwZS9mdG1vZGFwaS5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9SRU5ERVJfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIHJlbmRlcmVyIG1vZHVsZSBtYW5hZ2VtZW50IEFQSSBvZiBGcmVlVHlwZX4yLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfUkVOREVSX0ggIDxmcmVldHlwZS9mdHJlbmRlci5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9EUklWRVJfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKICAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgZHJpdmVyIG1vZHVsZXMuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9EUklWRVJfSCAgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0FVVE9ISU5URVJfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKICAgICogICBzdHJ1Y3R1cmVzIGFuZCBtYWNyb3MgcmVsYXRlZCB0byB0aGUgYXV0by1oaW50aW5nIG1vZHVsZS4KICAgICoKLSAgICogICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi45OyB1c2UgQEZUX0RSSVZFUl9IIGluc3RlYWQuCisgICAqICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9ufjIuOTsgdXNlIEBGVF9EUklWRVJfSCBpbnN0ZWFkLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfQVVUT0hJTlRFUl9IICBGVF9EUklWRVJfSAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9DRkZfRFJJVkVSX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZworICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCiAgICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIENGRiBkcml2ZXIgbW9kdWxlLgogICAgKgotICAgKiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjk7IHVzZSBARlRfRFJJVkVSX0ggaW5zdGVhZC4KKyAgICogICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb25+Mi45OyB1c2UgQEZUX0RSSVZFUl9IIGluc3RlYWQuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9DRkZfRFJJVkVSX0ggIEZUX0RSSVZFUl9ICiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1RSVUVUWVBFX0RSSVZFUl9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwogICAgKiAgIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRoZSBUcnVlVHlwZSBkcml2ZXIgbW9kdWxlLgogICAgKgotICAgKiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjk7IHVzZSBARlRfRFJJVkVSX0ggaW5zdGVhZC4KKyAgICogICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb25+Mi45OyB1c2UgQEZUX0RSSVZFUl9IIGluc3RlYWQuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9UUlVFVFlQRV9EUklWRVJfSCAgRlRfRFJJVkVSX0gKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfUENGX0RSSVZFUl9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwogICAgKiAgIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRoZSBQQ0YgZHJpdmVyIG1vZHVsZS4KICAgICoKLSAgICogICBEZXByZWNhdGVkIHNpbmNlIHZlcnNpb24gMi45OyB1c2UgQEZUX0RSSVZFUl9IIGluc3RlYWQuCisgICAqICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9ufjIuOTsgdXNlIEBGVF9EUklWRVJfSCBpbnN0ZWFkLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfUENGX0RSSVZFUl9IICBGVF9EUklWRVJfSAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9UWVBFMV9UQUJMRVNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIHR5cGVzIGFuZCBBUEkgc3BlY2lmaWMgdG8gdGhlIFR5cGV+MSBmb3JtYXQuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9UWVBFMV9UQUJMRVNfSCAgPGZyZWV0eXBlL3QxdGFibGVzLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1RSVUVUWVBFX0lEU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgZW51bWVyYXRpb24gdmFsdWVzIHdoaWNoIGlkZW50aWZ5IG5hbWUgc3RyaW5ncywgbGFuZ3VhZ2VzLCBlbmNvZGluZ3MsCiAgICAqICAgZXRjLiAgVGhpcyBmaWxlIHJlYWxseSBjb250YWlucyBhIF9sYXJnZV8gc2V0IG9mIGNvbnN0YW50IG1hY3JvCiAgICAqICAgZGVmaW5pdGlvbnMsIHRha2VuIGZyb20gdGhlIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBzcGVjaWZpY2F0aW9ucy4KQEAgLTQxNiwxNzQgKzQyMywxNzIgQEAKICNkZWZpbmUgRlRfVFJVRVRZUEVfSURTX0ggIDxmcmVldHlwZS90dG5hbWVpZC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9UUlVFVFlQRV9UQUJMRVNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIHR5cGVzIGFuZCBBUEkgc3BlY2lmaWMgdG8gdGhlIFRydWVUeXBlIChhcyB3ZWxsIGFzIE9wZW5UeXBlKSBmb3JtYXQuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9UUlVFVFlQRV9UQUJMRVNfSCAgPGZyZWV0eXBlL3R0dGFibGVzLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1RSVUVUWVBFX1RBR1NfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIFRydWVUeXBlIGZvdXItYnl0ZSBgdGFncycgd2hpY2ggaWRlbnRpZnkgYmxvY2tzIGluCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZGVmaW5pdGlvbnMgb2YgVHJ1ZVR5cGUgZm91ci1ieXRlICd0YWdzJyB3aGljaCBpZGVudGlmeSBibG9ja3MgaW4KICAgICogICBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyAoaS5lLiwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlKS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX1RSVUVUWVBFX1RBR1NfSCAgPGZyZWV0eXBlL3R0dGFncy5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9CREZfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBhY2Nlc3NlcyBCREYtc3BlY2lmaWMgc3RyaW5ncyBmcm9tIGEKLSAgICogICBmYWNlLgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBhY2Nlc3NlcyBCREYtc3BlY2lmaWMgc3RyaW5ncyBmcm9tIGEgZmFjZS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0JERl9IICA8ZnJlZXR5cGUvZnRiZGYuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfQ0lEX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggYWNjZXNzIENJRCBmb250IGluZm9ybWF0aW9uIGZyb20gYQotICAgKiAgIGZhY2UuCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIGFjY2VzcyBDSUQgZm9udCBpbmZvcm1hdGlvbiBmcm9tIGEgZmFjZS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0NJRF9IICA8ZnJlZXR5cGUvZnRjaWQuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfR1pJUF9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIGd6aXAtY29tcHJlc3NlZCBmaWxlcy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0daSVBfSCAgPGZyZWV0eXBlL2Z0Z3ppcC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9MWldfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBMWlctY29tcHJlc3NlZCBmaWxlcy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0xaV19IICA8ZnJlZXR5cGUvZnRsencuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfQlpJUDJfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBiemlwMi1jb21wcmVzc2VkIGZpbGVzLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfQlpJUDJfSCAgPGZyZWV0eXBlL2Z0YnppcDIuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfV0lORk9OVFNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBXaW5kb3dzIEZOVCBmaWxlcy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX1dJTkZPTlRTX0ggICA8ZnJlZXR5cGUvZnR3aW5mbnQuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfR0xZUEhfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgZ2x5cGggbWFuYWdlbWVudCBjb21wb25lbnQuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9HTFlQSF9IICA8ZnJlZXR5cGUvZnRnbHlwaC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9CSVRNQVBfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgYml0bWFwIGNvbnZlcnNpb24gY29tcG9uZW50LgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfQklUTUFQX0ggIDxmcmVldHlwZS9mdGJpdG1hcC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9CQk9YX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIGV4YWN0IGJvdW5kaW5nIGJveCBjb21wdXRhdGlvbiByb3V0aW5lcy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0JCT1hfSCAgPGZyZWV0eXBlL2Z0YmJveC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9DQUNIRV9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgQVBJIG9mIHRoZSBvcHRpb25hbCBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0uCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9DQUNIRV9IICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9NQUNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIE1hY2ludG9zaC1zcGVjaWZpYyBGcmVlVHlwZX4yIEFQSS4gIFRoZSBsYXR0ZXIgaXMgdXNlZCB0byBhY2Nlc3MKLSAgICogICBmb250cyBlbWJlZGRlZCBpbiByZXNvdXJjZSBmb3Jrcy4KKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBNYWNpbnRvc2gtc3BlY2lmaWMgRnJlZVR5cGV+MiBBUEkuICBUaGUgbGF0dGVyIGlzIHVzZWQgdG8gYWNjZXNzIGZvbnRzCisgICAqICAgZW1iZWRkZWQgaW4gcmVzb3VyY2UgZm9ya3MuCiAgICAqCiAgICAqICAgVGhpcyBoZWFkZXIgZmlsZSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5jbHVkZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucwogICAgKiAgIGNvbXBpbGVkIG9uIHRoZSBNYWMgKG5vdGUgdGhhdCB0aGUgYmFzZSBBUEkgc3RpbGwgd29ya3MgdGhvdWdoKS4KQEAgLTU5MiwxMDUgKzU5NywxMDUgQEAKICNkZWZpbmUgRlRfTUFDX0ggIDxmcmVldHlwZS9mdG1hYy5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9NVUxUSVBMRV9NQVNURVJTX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBvcHRpb25hbCBtdWx0aXBsZS1tYXN0ZXJzIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggIDxmcmVldHlwZS9mdG1tLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1NGTlRfTkFNRVNfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIGFjY2Vzc2VzIGVtYmVkZGVkIGBuYW1lJyBzdHJpbmdzIGluCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggYWNjZXNzZXMgZW1iZWRkZWQgJ25hbWUnIHN0cmluZ3MgaW4KICAgICogICBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyAoaS5lLiwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlKS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX1NGTlRfTkFNRVNfSCAgPGZyZWV0eXBlL2Z0c25hbWVzLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBGcmVlVHlwZX4yIEFQSSB3aGljaCB2YWxpZGF0ZXMgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLAotICAgKiAgIEdQT1MsIEdTVUIsIEpTVEYpLgorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHZhbGlkYXRlcyBPcGVuVHlwZSB0YWJsZXMgKCdCQVNFJywKKyAgICogICAnR0RFRicsICdHUE9TJywgJ0dTVUInLCAnSlNURicpLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfT1BFTlRZUEVfVkFMSURBVEVfSCAgPGZyZWV0eXBlL2Z0b3R2YWwuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfR1hfVkFMSURBVEVfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHZhbGlkYXRlcyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGZlYXQsCi0gICAqICAgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgdHJhaywgcHJvcCkuCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggdmFsaWRhdGVzIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoJ2ZlYXQnLAorICAgKiAgICdtb3J0JywgJ21vcngnLCAnYnNsbicsICdqdXN0JywgJ2tlcm4nLCAnb3BiZCcsICd0cmFrJywgJ3Byb3AnKS4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0dYX1ZBTElEQVRFX0ggIDxmcmVldHlwZS9mdGd4dmFsLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1BGUl9ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggYWNjZXNzZXMgUEZSLXNwZWNpZmljIGRhdGEuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9QRlJfSCAgPGZyZWV0eXBlL2Z0cGZyLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1NUUk9LRVJfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzdHJva2Ugb3V0bGluZSBwYXRocy4KICAgICovCiAjZGVmaW5lIEZUX1NUUk9LRVJfSCAgPGZyZWV0eXBlL2Z0c3Ryb2tlLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX1NZTlRIRVNJU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcGVyZm9ybXMgYXJ0aWZpY2lhbCBvYmxpcXVpbmcgYW5kIGVtYm9sZGVuaW5nLgogICAgKi8KICNkZWZpbmUgRlRfU1lOVEhFU0lTX0ggIDxmcmVldHlwZS9mdHN5bnRoLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0ZPTlRfRk9STUFUU19ICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisgICAqICAgQSBtYWNybyB1c2VkIGluIGAjaW5jbHVkZWAgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcHJvdmlkZXMgZnVuY3Rpb25zIHNwZWNpZmljIHRvIGZvbnQgZm9ybWF0cy4KICAgICovCiAjZGVmaW5lIEZUX0ZPTlRfRk9STUFUU19IICA8ZnJlZXR5cGUvZnRmbnRmbXQuaD4KQEAgLTY5OSw2NyArNzA0LDc5IEBACiAjZGVmaW5lIEZUX1hGUkVFODZfSCAgRlRfRk9OVF9GT1JNQVRTX0gKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfVFJJR09OT01FVFJZX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyB0cmlnb25vbWV0cmljIGNvbXB1dGF0aW9ucyAoZS5nLiwKICAgICogICBjb3NpbmVzIGFuZCBhcmMgdGFuZ2VudHMpLgogICAgKi8KICNkZWZpbmUgRlRfVFJJR09OT01FVFJZX0ggIDxmcmVldHlwZS9mdHRyaWdvbi5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9MQ0RfRklMVEVSX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBjb2xvciBmaWx0ZXJpbmcgZm9yIHN1YnBpeGVsIHJlbmRlcmluZy4KICAgICovCiAjZGVmaW5lIEZUX0xDRF9GSUxURVJfSCAgPGZyZWV0eXBlL2Z0bGNkZmlsLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0lOQ1JFTUVOVEFMX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBpbmNyZW1lbnRhbCBnbHlwaCBsb2FkaW5nLgogICAgKi8KICNkZWZpbmUgRlRfSU5DUkVNRU5UQUxfSCAgPGZyZWV0eXBlL2Z0aW5jcmVtLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0dBU1BfSAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQorICAgKiAgIEEgbWFjcm8gdXNlZCBpbiBgI2luY2x1ZGVgIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHJldHVybnMgZW50cmllcyBmcm9tIHRoZSBUcnVlVHlwZSBHQVNQIHRhYmxlLgogICAgKi8KICNkZWZpbmUgRlRfR0FTUF9IICA8ZnJlZXR5cGUvZnRnYXNwLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0FEVkFOQ0VTX0gKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCByZXR1cm5zIGluZGl2aWR1YWwgYW5kIHJhbmdlZCBnbHlwaCBhZHZhbmNlcy4KICAgICovCiAjZGVmaW5lIEZUX0FEVkFOQ0VTX0ggIDxmcmVldHlwZS9mdGFkdmFuYy5oPgogCiAKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9DT0xPUl9ICisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIG1hY3JvIHVzZWQgaW4gYCNpbmNsdWRlYCBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKKyAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBoYW5kbGVzIHRoZSBPcGVuVHlwZSAnQ1BBTCcgdGFibGUuCisgICAqLworI2RlZmluZSBGVF9DT0xPUl9IICA8ZnJlZXR5cGUvZnRjb2xvci5oPgorCisKICAgLyogKi8KIAogICAvKiBUaGVzZSBoZWFkZXIgZmlsZXMgZG9uJ3QgbmVlZCB0byBiZSBpbmNsdWRlZCBieSB0aGUgdXNlci4gKi8KQEAgLTc3MCwxNCArNzg3LDE0IEBACiAjZGVmaW5lIEZUX1VOUEFURU5URURfSElOVElOR19IICAgPGZyZWV0eXBlL2Z0cGFyYW1zLmg+CiAjZGVmaW5lIEZUX1RSVUVUWVBFX1VOUEFURU5URURfSCAgPGZyZWV0eXBlL2Z0cGFyYW1zLmg+CiAKLSAgLyogRlRfQ0FDSEVfSCBpcyB0aGUgb25seSBoZWFkZXIgZmlsZSBuZWVkZWQgZm9yIHRoZSBjYWNoZSBzdWJzeXN0ZW0uICovCisgIC8qIGBGVF9DQUNIRV9IYCBpcyB0aGUgb25seSBoZWFkZXIgZmlsZSBuZWVkZWQgZm9yIHRoZSBjYWNoZSBzdWJzeXN0ZW0uICovCiAjZGVmaW5lIEZUX0NBQ0hFX0lNQUdFX0ggICAgICAgICAgRlRfQ0FDSEVfSAogI2RlZmluZSBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0ggIEZUX0NBQ0hFX0gKICNkZWZpbmUgRlRfQ0FDSEVfQ0hBUk1BUF9IICAgICAgICBGVF9DQUNIRV9ICiAKICAgLyogVGhlIGludGVybmFscyBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSBhcmUgbm8gbG9uZ2VyIGV4cG9zZWQuICBXZSAqLwotICAvKiBkZWZhdWx0IHRvIEZUX0NBQ0hFX0ggYXQgdGhlIG1vbWVudCBqdXN0IGluIGNhc2UsIGJ1dCB3ZSBrbm93IG9mICovCi0gIC8qIG5vIHJvZ3VlIGNsaWVudCB0aGF0IHVzZXMgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogZGVmYXVsdCB0byBgRlRfQ0FDSEVfSGAgYXQgdGhlIG1vbWVudCBqdXN0IGluIGNhc2UsIGJ1dCB3ZSBrbm93ICAqLworICAvKiBvZiBubyByb2d1ZSBjbGllbnQgdGhhdCB1c2VzIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRlRfQ0FDSEVfTUFOQUdFUl9IICAgICAgICAgICBGVF9DQUNIRV9ICiAjZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX01SVV9IICAgICAgRlRfQ0FDSEVfSApAQCAtNzg3LDE2ICs4MDQsMTkgQEAKICNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfSU1BR0VfSCAgICBGVF9DQUNIRV9ICiAjZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX1NCSVRTX0ggICAgRlRfQ0FDSEVfSAogCi0KLSAgLyoKLSAgICogSW5jbHVkZSBpbnRlcm5hbCBoZWFkZXJzIGRlZmluaXRpb25zIGZyb20gPGludGVybmFsLy4uLj4KLSAgICogb25seSB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgotICAgKi8KKy8qIFRPRE8oZGF2aWQpOiBNb3ZlIHRoaXMgc2VjdGlvbiBiZWxvdyB0byBhIGRpZmZlcmVudCBoZWFkZXIgKi8KICNpZmRlZiBGVDJfQlVJTERfTElCUkFSWQotI2RlZmluZSAgRlRfSU5URVJOQUxfSU5URVJOQUxfSCAgPGZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9JTlRFUk5BTF9ICi0jZW5kaWYgLyogRlQyX0JVSUxEX0xJQlJBUlkgKi8KKyNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KIAorICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50JyBoZXJlICovCisgIC8qIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgKi8KKyAgLyogSW4gcGFydGljdWxhciwgdGhlIHdhcm5pbmcgY29tcGxhaW5zIGFib3V0IHN0dWZmIGxpa2UgYHdoaWxlKDApJyAqLworICAvKiB3aGljaCBpcyB2ZXJ5IHVzZWZ1bCBpbiBtYWNybyBkZWZpbml0aW9ucy4gIFRoZXJlIGlzIG5vIGJlbmVmaXQgICovCisgIC8qIGluIGhhdmluZyBpdCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQorCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKyNlbmRpZiAvKiBGVDJfQlVJTERfTElCUkFSWSAqLwogCiAjZW5kaWYgLyogRlRIRUFERVJfSF8gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgKaW5kZXggNzZkMjcxYS4uYjVjNGIxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCkBAIC0xLDEyICsxLDEyIEBACiAvKgotICogIFRoaXMgZmlsZSByZWdpc3RlcnMgdGhlIEZyZWVUeXBlIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgbGlicmFyeS4KKyAqIFRoaXMgZmlsZSByZWdpc3RlcnMgdGhlIEZyZWVUeXBlIG1vZHVsZXMgY29tcGlsZWQgaW50byB0aGUgbGlicmFyeS4KICAqCi0gKiAgSWYgeW91IHVzZSBHTlUgbWFrZSwgdGhpcyBmaWxlIElTIE5PVCBVU0VEISAgSW5zdGVhZCwgaXQgaXMgY3JlYXRlZCBpbgotICogIHRoZSBvYmplY3RzIGRpcmVjdG9yeSAobm9ybWFsbHkgYDx0b3BkaXI+L29ianMvJykgYmFzZWQgb24gaW5mb3JtYXRpb24KLSAqICBmcm9tIGA8dG9wZGlyPi9tb2R1bGVzLmNmZycuCisgKiBJZiB5b3UgdXNlIEdOVSBtYWtlLCB0aGlzIGZpbGUgSVMgTk9UIFVTRUQhICBJbnN0ZWFkLCBpdCBpcyBjcmVhdGVkIGluCisgKiB0aGUgb2JqZWN0cyBkaXJlY3RvcnkgKG5vcm1hbGx5IGA8dG9wZGlyPi9vYmpzL2ApIGJhc2VkIG9uIGluZm9ybWF0aW9uCisgKiBmcm9tIGA8dG9wZGlyPi9tb2R1bGVzLmNmZ2AuCiAgKgotICogIFBsZWFzZSByZWFkIGBkb2NzL0lOU1RBTEwuQU5ZJyBhbmQgYGRvY3MvQ1VTVE9NSVpFJyBob3cgdG8gY29tcGlsZQotICogIEZyZWVUeXBlIHdpdGhvdXQgR05VIG1ha2UuCisgKiBQbGVhc2UgcmVhZCBgZG9jcy9JTlNUQUxMLkFOWWAgYW5kIGBkb2NzL0NVU1RPTUlaRWAgaG93IHRvIGNvbXBpbGUKKyAqIEZyZWVUeXBlIHdpdGhvdXQgR05VIG1ha2UuCiAgKgogICovCiAKQEAgLTI1LDggKzI1LDYgQEAKIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzICkKIEZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgc2ZudF9tb2R1bGVfY2xhc3MgKQogRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MgKQogRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBiZGZfZHJpdmVyX2NsYXNzICkKIAogLyogRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAppbmRleCA0YmNhYjJhLi4wOTdmMTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3B0aW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBVc2VyLXNlbGVjdGFibGUgY29uZmlndXJhdGlvbiBtYWNyb3MgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0b3B0aW9uLmgKKyAqCisgKiAgIFVzZXItc2VsZWN0YWJsZSBjb25maWd1cmF0aW9uIG1hY3JvcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRPUFRJT05fSF8KQEAgLTI1LDQ1ICsyNSw0NyBAQAogCiBGVF9CRUdJTl9IRUFERVIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWFjcm8gZGVmaW5pdGlvbnMgZm9yICAgICovCi0gIC8qIGEgc3RhbmRhcmQgYnVpbGQgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byAgICAqLwotICAvKiB1c2UgdGhpcyBmaWxlIHRvIGJ1aWxkIHByb2plY3Qtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnk6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4gICAqLwotICAvKiAgICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBmcm9tIGEgc2luZ2xlIHNvdXJjZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlICAgICAgKi8KLSAgLyogICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgnLCB3aGVyZSBgJEJVSUxEJyAgICovCi0gIC8qICAgIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRoYXQgaXMgaW5jbHVkZWQgX2JlZm9yZV8gdGhlIEZyZWVUeXBlICAqLwotICAvKiAgICBpbmNsdWRlIHBhdGggZHVyaW5nIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyBhbmQgSmFtZmlsZXMgdXNlIHRoZSBidWlsZCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3RvcnkgYGJ1aWxkcy88c3lzdGVtPicgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSAgKi8KLSAgLyogICAgdGhhdCBmb3IgeW91ciBvd24gcHJvamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmgnIGFuZCBtb2RpZnkgaXQgICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTlNfSCB1c2VkIHRvICAgICAgICovCi0gIC8qICAgIGxvY2F0ZSB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxteWZ0b3B0aW9ucy5oPiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oJyBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8gICAgICovCi0gIC8qICAgIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzaW1pbGFybHkgcHJlLWRlZmluZSB0aGUgbWFjcm8gICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NPTkZJR19NT0RVTEVTX0ggdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgbGlzdGluZyBvZiB0aGUgbW9kdWxlcyAqLwotICAvKiAgICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeSAgICAgKi8KLSAgLyogICAgZGVmYXVsdCwgdGhpcyBmaWxlIGlzIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgVVNFUi1TRUxFQ1RBQkxFIENPTkZJR1VSQVRJT04gTUFDUk9TCisgICAqCisgICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1hY3JvIGRlZmluaXRpb25zIGZvciBhCisgICAqIHN0YW5kYXJkIGJ1aWxkIG9mIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gdXNlCisgICAqIHRoaXMgZmlsZSB0byBidWlsZCBwcm9qZWN0LXNwZWNpZmljIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5OgorICAgKgorICAgKiAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4KKyAgICogICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5CisgICAqICAgZnJvbSBhIHNpbmdsZSBzb3VyY2UgZGlyZWN0b3J5LgorICAgKgorICAgKiAtIFlvdSBjYW4gcHV0IGEgY29weSBvZiB0aGlzIGZpbGUgaW4geW91ciBidWlsZCBkaXJlY3RvcnksIG1vcmUKKyAgICogICBwcmVjaXNlbHkgaW4gYCRCVUlMRC9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaGAsIHdoZXJlIGAkQlVJTERgIGlzCisgICAqICAgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdGhhdCBpcyBpbmNsdWRlZCBfYmVmb3JlXyB0aGUgRnJlZVR5cGUgaW5jbHVkZQorICAgKiAgIHBhdGggZHVyaW5nIGNvbXBpbGF0aW9uLgorICAgKgorICAgKiAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyB1c2UgdGhlIGJ1aWxkIGRpcmVjdG9yeQorICAgKiAgIGBidWlsZHMvPHN5c3RlbT5gIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhhdCBmb3IgeW91cgorICAgKiAgIG93biBwcm9qZWN0cy4KKyAgICoKKyAgICogLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmhgIGFuZCBtb2RpZnkgaXQKKyAgICogICBzbGlnaHRseSB0byBwcmUtZGVmaW5lIHRoZSBtYWNybyBgRlRfQ09ORklHX09QVElPTlNfSGAgdXNlZCB0byBsb2NhdGUKKyAgICogICB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLAorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OU19IICA8bXlmdG9wdGlvbnMuaD4KKyAgICogICAgICNpbmNsdWRlIDxmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaD4KKyAgICogICBgYGAKKyAgICoKKyAgICogICB3aWxsIHVzZSBgJEJVSUxEL215ZnRvcHRpb25zLmhgIGluc3RlYWQgb2YgdGhpcyBmaWxlIGZvciBtYWNybworICAgKiAgIGRlZmluaXRpb25zLgorICAgKgorICAgKiAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gc2ltaWxhcmx5IHByZS1kZWZpbmUgdGhlIG1hY3JvCisgICAqICAgYEZUX0NPTkZJR19NT0RVTEVTX0hgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGxpc3Rpbmcgb2YgdGhlIG1vZHVsZXMKKyAgICogICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeQorICAgKiAgIGRlZmF1bHQsIHRoaXMgZmlsZSBpcyBgPGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oPmAuCisgICAqCisgICAqIFdlIGhpZ2hseSByZWNvbW1lbmQgdXNpbmcgdGhlIHRoaXJkIG1ldGhvZCB3aGVuZXZlciBwb3NzaWJsZS4KKyAgICoKKyAgICovCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc1LDQ0NCArNzcsNDQ3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyojKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB5b3UgZW5hYmxlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24sIEZyZWVUeXBlIHJlY29nbml6ZXMgYW4gICAgICAgKi8KLSAgLyogZW52aXJvbm1lbnQgdmFyaWFibGUgY2FsbGVkIGBGUkVFVFlQRV9QUk9QRVJUSUVTJywgd2hpY2ggY2FuIGJlIHVzZWQgICovCi0gIC8qIHRvIGNvbnRyb2wgdGhlIHZhcmlvdXMgZm9udCBkcml2ZXJzIGFuZCBtb2R1bGVzLiAgVGhlIGNvbnRyb2xsYWJsZSAgICAqLwotICAvKiBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgaW4gdGhlIHNlY3Rpb24gQHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFlvdSBoYXZlIHRvIHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gb24gcGxhdGZvcm1zIHRoYXQgbGFjayAqLwotICAvKiB0aGUgY29uY2VwdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGFuZCB0aHVzIGRvbid0IGhhdmUgdGhlICAgICAgICAgKi8KLSAgLyogYGdldGVudicgZnVuY3Rpb24pLCBmb3IgZXhhbXBsZSBXaW5kb3dzIENFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgRlJFRVRZUEVfUFJPUEVSVElFUycgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlIGludG8gKi8KLSAgLyogbXVsdGlwbGUgbGluZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMT4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMT4gJz0nIDxwcm9wZXJ0eS12YWx1ZTE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICA8d2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgPG1vZHVsZS1uYW1lMj4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDxwcm9wZXJ0eS1uYW1lMj4gJz0nIDxwcm9wZXJ0eS12YWx1ZTI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZSRUVUWVBFX1BST1BFUlRJRVM9dHJ1ZXR5cGU6aW50ZXJwcmV0ZXItdmVyc2lvbj0zNSBcICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGNmZjpuby1zdGVtLWRhcmtlbmluZz0xIFwgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhdXRvZml0dGVyOndhcnBpbmc9MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyojKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIElmIHlvdSBlbmFibGUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiwgRnJlZVR5cGUgcmVjb2duaXplcyBhbgorICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYWxsZWQgYEZSRUVUWVBFX1BST1BFUlRJRVNgLCB3aGljaCBjYW4gYmUgdXNlZCB0bworICAgKiBjb250cm9sIHRoZSB2YXJpb3VzIGZvbnQgZHJpdmVycyBhbmQgbW9kdWxlcy4gIFRoZSBjb250cm9sbGFibGUKKyAgICogcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIHRoZSBzZWN0aW9uIEBwcm9wZXJ0aWVzLgorICAgKgorICAgKiBZb3UgaGF2ZSB0byB1bmRlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIG9uIHBsYXRmb3JtcyB0aGF0IGxhY2sKKyAgICogdGhlIGNvbmNlcHQgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChhbmQgdGh1cyBkb24ndCBoYXZlIHRoZSBgZ2V0ZW52YAorICAgKiBmdW5jdGlvbiksIGZvciBleGFtcGxlIFdpbmRvd3MgQ0UuCisgICAqCisgICAqIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXggZm9ybSAoYnJva2VuIGhlcmUgaW50bworICAgKiBtdWx0aXBsZSBsaW5lcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5KS4KKyAgICoKKyAgICogYGBgCisgICAqICAgPG9wdGlvbmFsIHdoaXRlc3BhY2U+CisgICAqICAgPG1vZHVsZS1uYW1lMT4gJzonCisgICAqICAgPHByb3BlcnR5LW5hbWUxPiAnPScgPHByb3BlcnR5LXZhbHVlMT4KKyAgICogICA8d2hpdGVzcGFjZT4KKyAgICogICA8bW9kdWxlLW5hbWUyPiAnOicKKyAgICogICA8cHJvcGVydHktbmFtZTI+ICc9JyA8cHJvcGVydHktdmFsdWUyPgorICAgKiAgIC4uLgorICAgKiBgYGAKKyAgICoKKyAgICogRXhhbXBsZToKKyAgICoKKyAgICogYGBgCisgICAqICAgRlJFRVRZUEVfUFJPUEVSVElFUz10cnVldHlwZTppbnRlcnByZXRlci12ZXJzaW9uPTM1IFwKKyAgICogICAgICAgICAgICAgICAgICAgICAgIGNmZjpuby1zdGVtLWRhcmtlbmluZz0xIFwKKyAgICogICAgICAgICAgICAgICAgICAgICAgIGF1dG9maXR0ZXI6d2FycGluZz0xCisgICAqIGBgYAorICAgKgorICAgKi8KICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3Ugd2FudCB0byBhY3RpdmF0ZSBMQ0QgcmVuZGVyaW5nICAgICAgICAqLwotICAvKiB0ZWNobm9sb2d5IHNpbWlsYXIgdG8gQ2xlYXJUeXBlIGluIHRoaXMgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICBUaGlzICAgKi8KLSAgLyogdGVjaG5vbG9neSB0cmlwbGVzIHRoZSByZXNvbHV0aW9uIGluIHRoZSBkaXJlY3Rpb24gY29sb3Igc3VicGl4ZWxzLiAgICovCi0gIC8qIFRvIG1pdGlnYXRlIGNvbG9yIGZyaW5nZXMgaW5oZXJlbnQgdG8gdGhpcyB0ZWNobm9sb2d5LCB5b3UgYWxzbyBuZWVkICAqLwotICAvKiB0byBleHBsaWNpdGx5IHNldCB1cCBMQ0QgZmlsdGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgY292ZXJlZCBieSBzZXZlcmFsIE1pY3Jvc29mdCBwYXRlbnRzICAgICAgICAqLwotICAvKiBhbmQgc2hvdWxkIG5vdCBiZSBhY3RpdmF0ZWQgaW4gYW55IGRlZmF1bHQgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICAgICAgKi8KLSAgLyogV2hlbiB0aGlzIG1hY3JvIGlzIG5vdCBkZWZpbmVkLCBGcmVlVHlwZSBvZmZlcnMgYWx0ZXJuYXRpdmUgTENEICAgICAgICovCi0gIC8qIHJlbmRlcmluZyB0ZWNobm9sb2d5IHRoYXQgcHJvZHVjZXMgZXhjZWxsZW50IG91dHB1dCB3aXRob3V0IExDRCAgICAgICAqLwotICAvKiBmaWx0ZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgTENEIHJlbmRlcmluZworICAgKiB0ZWNobm9sb2d5IHNpbWlsYXIgdG8gQ2xlYXJUeXBlIGluIHRoaXMgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICBUaGlzCisgICAqIHRlY2hub2xvZ3kgdHJpcGxlcyB0aGUgcmVzb2x1dGlvbiBpbiB0aGUgZGlyZWN0aW9uIGNvbG9yIHN1YnBpeGVscy4gIFRvCisgICAqIG1pdGlnYXRlIGNvbG9yIGZyaW5nZXMgaW5oZXJlbnQgdG8gdGhpcyB0ZWNobm9sb2d5LCB5b3UgYWxzbyBuZWVkIHRvCisgICAqIGV4cGxpY2l0bHkgc2V0IHVwIExDRCBmaWx0ZXJpbmcuCisgICAqCisgICAqIFdoZW4gdGhpcyBtYWNybyBpcyBub3QgZGVmaW5lZCwgRnJlZVR5cGUgb2ZmZXJzIGFsdGVybmF0aXZlIExDRAorICAgKiByZW5kZXJpbmcgdGVjaG5vbG9neSB0aGF0IHByb2R1Y2VzIGV4Y2VsbGVudCBvdXRwdXQuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYW55IGNvbXBpbGVycyBwcm92aWRlIGEgbm9uLUFOU0kgNjQtYml0IGRhdGEgdHlwZSB0aGF0IGNhbiBiZSB1c2VkICAgKi8KLSAgLyogYnkgRnJlZVR5cGUgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMuICBIb3dldmVyLCB0aGlzIHdpbGwgY3JlYXRlICovCi0gIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkgaW4gc3RyaWN0IEFOU0kgbW9kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIDY0LWJpdCBpbnRlZ2VycyBpcyBub3JtYWxseSBkaXNhYmxlZCB3aGVuICovCi0gIC8qIHRoZSBfX1NURENfXyBtYWNybyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGRpc2FibGUgdGhpcyBieSAgICAgICAqLwotICAvKiBkZWZpbmluZyB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBoZXJlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciBtb3N0IGNvbXBpbGVycywgdGhpcyB3aWxsIG9ubHkgY3JlYXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzIHdoZW4gICAqLwotICAvKiBidWlsZGluZyB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9iTm90ZTogVGhlIGNvbXBpbGVyLXNwZWNpZmljIDY0LWJpdCBpbnRlZ2VycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgIGZpbGUgYGZ0Y29uZmlnLmgnIGVpdGhlciBzdGF0aWNhbGx5IG9yIHRocm91Z2ggdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTWFueSBjb21waWxlcnMgcHJvdmlkZSBhIG5vbi1BTlNJIDY0LWJpdCBkYXRhIHR5cGUgdGhhdCBjYW4gYmUgdXNlZCBieQorICAgKiBGcmVlVHlwZSB0byBzcGVlZCB1cCBzb21lIGNvbXB1dGF0aW9ucy4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBjcmVhdGUgc29tZQorICAgKiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgbGlicmFyeSBpbiBzdHJpY3QgQU5TSSBtb2RlLgorICAgKgorICAgKiBGb3IgdGhpcyByZWFzb24sIHRoZSB1c2Ugb2YgNjQtYml0IGludGVnZXJzIGlzIG5vcm1hbGx5IGRpc2FibGVkIHdoZW4KKyAgICogdGhlIGBfX1NURENfX2AgbWFjcm8gaXMgZGVmaW5lZC4gIFlvdSBjYW4gaG93ZXZlciBkaXNhYmxlIHRoaXMgYnkKKyAgICogZGVmaW5pbmcgdGhlIG1hY3JvIGBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0YCBoZXJlLgorICAgKgorICAgKiBGb3IgbW9zdCBjb21waWxlcnMsIHRoaXMgd2lsbCBvbmx5IGNyZWF0ZSBjb21waWxhdGlvbiB3YXJuaW5ncyB3aGVuCisgICAqIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgorICAgKgorICAgKiBPYk5vdGU6IFRoZSBjb21waWxlci1zcGVjaWZpYyA2NC1iaXQgaW50ZWdlcnMgYXJlIGRldGVjdGVkIGluIHRoZQorICAgKiAgICAgICAgIGZpbGUgYGZ0Y29uZmlnLmhgIGVpdGhlciBzdGF0aWNhbGx5IG9yIHRocm91Z2ggdGhlIGBjb25maWd1cmVgCisgICAqICAgICAgICAgc2NyaXB0IG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuCisgICAqLwogI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBkbyBub3QgdHJ5IHRvIHVzZSBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgICovCi0gIC8qIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiBGVF9NdWxGaXgpLiAgWW91IHNob3VsZCBvbmx5IGRvICAqLwotICAvKiB0aGF0IHRvIHZlcmlmeSB0aGF0IHRoZSBhc3NlbWJsZXIgZnVuY3Rpb24gd29ya3MgcHJvcGVybHksIG9yIHRvICAgICAgKi8KLSAgLyogZXhlY3V0ZSBiZW5jaG1hcmsgdGVzdHMgb2YgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIGRvIG5vdCB0cnkgdG8gdXNlIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mCisgICAqIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiwgQEZUX011bEZpeCkuICBZb3Ugc2hvdWxkIG9ubHkgZG8KKyAgICogdGhhdCB0byB2ZXJpZnkgdGhhdCB0aGUgYXNzZW1ibGVyIGZ1bmN0aW9uIHdvcmtzIHByb3Blcmx5LCBvciB0byBleGVjdXRlCisgICAqIGJlbmNobWFyayB0ZXN0cyBvZiB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIHRyeSB0byB1c2UgYW4gaW5saW5lZCBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgKi8KLSAgLyogdGhlIGBGVF9NdWxGaXgnIGZ1bmN0aW9uLCB3aGljaCBpcyBhIGBob3RzcG90JyB3aGVuIGxvYWRpbmcgYW5kICAgICAgICovCi0gIC8qIGhpbnRpbmcgZ2x5cGhzLCBhbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkIGFzIGZhc3QgYXMgcG9zc2libGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGlmIHlvdXIgY29tcGlsZXIgb3IgQ1BVIGlzIG5vdCBzdXBwb3J0ZWQsIHRoaXMgd2lsbCBkZWZhdWx0ICovCi0gIC8qIHRvIHRoZSBzdGFuZGFyZCBhbmQgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gZm91bmQgaW4gYGZ0Y2FsYy5jJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgdHJ5IHRvIHVzZSBhbiBpbmxpbmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mIHRoZQorICAgKiBARlRfTXVsRml4IGZ1bmN0aW9uLCB3aGljaCBpcyBhICdob3RzcG90JyB3aGVuIGxvYWRpbmcgYW5kIGhpbnRpbmcKKyAgICogZ2x5cGhzLCBhbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkIGFzIGZhc3QgYXMgcG9zc2libGUuCisgICAqCisgICAqIE5vdGUgdGhhdCBpZiB5b3VyIGNvbXBpbGVyIG9yIENQVSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgZGVmYXVsdCB0bworICAgKiB0aGUgc3RhbmRhcmQgYW5kIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIGZvdW5kIGluIGBmdGNhbGMuY2AuCisgICAqLwogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgY29tcHJlc3MnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICAvKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuJyB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5ICAgKi8KLSAgLyogICAoc2VlIHNyYy9sencvZnRnemlwLmMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBMWlctY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuCisgICAqCisgICAqICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlCisgICAqICAgYGNvbXByZXNzYCBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YKKyAgICogICBmaWxlcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIFgxMSBkaXN0cmlidXRpb25zLiAgVGhlIGltcGxlbWVudGF0aW9uCisgICAqICAgdXNlcyBOZXRCU0QncyBgem9wZW5gIHRvIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZQorICAgKiAgIGBzcmMvbHp3L2Z0Z3ppcC5jYCkuCisgICAqCisgICAqICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgJ2ZlYXR1cmUnLgorICAgKi8KICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfTFpXCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEd6aXAtY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGd6aXAnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiBmaWxlcyAqLwotICAvKiAgIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgemxpYicgdG8gICAgICAgICAgKi8KLSAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2d6aXAvZnRnemlwLmMpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gIFNlZSBhbHNvICAgKi8KLSAgLyogICB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogR3ppcC1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4KKyAgICoKKyAgICogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUKKyAgICogICBgZ3ppcGAgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGIGZpbGVzCisgICAqICAgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzICd6bGliJyB0byBwYXJ0aWFsbHkKKyAgICogICB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBgc3JjL2d6aXAvZnRnemlwLmNgKS4KKyAgICoKKyAgICogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyAnZmVhdHVyZScuICBTZWUgYWxzbyB0aGUKKyAgICogICBtYWNybyBgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQmAgYmVsb3cuCisgICAqLwogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgaXMgZGVmaW5lZC4gICovCi0gIC8qICAgSXQgYWxsb3dzIEZyZWVUeXBlJ3MgYGZ0Z3ppcCcgY29tcG9uZW50IHRvIGxpbmsgdG8gdGhlIHN5c3RlbSdzICAgICAqLwotICAvKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlICAgKi8KLSAgLyogICBVbml4IG9yIFZNUyB3aGVyZSBpdCBnZW5lcmFsbHkgaXMgYWxyZWFkeSBhdmFpbGFibGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSAgICAgICAgKi8KLSAgLyogICBvZiB0aGUgemxpYiBzb3VyY2VzIGluc3RlYWQuICBUaGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gYmUgICAgICAgICovCi0gIC8qICAgaW5jbHVkZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21wb25lbnQgYW5kICpub3QqIGV4cG9ydCBleHRlcm5hbCAgICAqLwotICAvKiAgIGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSAgKi8KLSAgLyogICBfYW5kXyBaTGliIHdpdGhvdXQgbGlua2luZyBjb25mbGljdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICAgKi8KLSAgLyogICBpdCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIHlvdSB1c2UgYSBidWlsZCBzeXN0ZW0gbGlrZSBjbWFrZSBvciB0aGUgYGNvbmZpZ3VyZScgc2NyaXB0LCAgICAgKi8KLSAgLyogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlbmRlbmNlLCBvdmVyd3JpdGluZyB0aGUgICAgICovCi0gIC8qICAgdmFsdWUgaGVyZSB3aXRoIHRoZSBjb25maWd1cmVkIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24KKyAgICoKKyAgICogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIGBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCYCBpcyBkZWZpbmVkLgorICAgKiAgIEl0IGFsbG93cyBGcmVlVHlwZSdzICdmdGd6aXAnIGNvbXBvbmVudCB0byBsaW5rIHRvIHRoZSBzeXN0ZW0ncworICAgKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlCisgICAqICAgVW5peCBvciBWTVMgd2hlcmUgaXQgZ2VuZXJhbGx5IGlzIGFscmVhZHkgYXZhaWxhYmxlLgorICAgKgorICAgKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSBvZiB0aGUKKyAgICogICB6bGliIHNvdXJjZXMgaW5zdGVhZC4gIFRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZSBpbmNsdWRlZAorICAgKiAgIGRpcmVjdGx5IHdpdGhpbiB0aGUgY29tcG9uZW50IGFuZCAqKm5vdCoqIGV4cG9ydCBleHRlcm5hbCBmdW5jdGlvbgorICAgKiAgIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSBfYW5kXyBaTGliCisgICAqICAgd2l0aG91dCBsaW5raW5nIGNvbmZsaWN0cy4KKyAgICoKKyAgICogICBEbyBub3QgYCN1bmRlZmAgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lCisgICAqICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGJ6aXAyJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAgICAqLwotICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyJyB0byAgKi8KLSAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2J6aXAyL2Z0YnppcDIuYykuICovCi0gIC8qICAgQ29udHJhcnkgdG8gZ3ppcCwgYnppcDIgY3VycmVudGx5IGlzIG5vdCBpbmNsdWRlZCBhbmQgbmVlZCB0byB1c2UgICAqLwotICAvKiAgIHRoZSBzeXN0ZW0gYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmUnIHNjcmlwdCwgICAgICovCi0gIC8qICAgb3B0aW9ucyBzZXQgYnkgdGhvc2UgcHJvZ3JhbXMgaGF2ZSBwcmVjZW5kZW5jZSwgb3ZlcndyaXRpbmcgdGhlICAgICAqLwotICAvKiAgIHZhbHVlIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBCemlwMi1jb21wcmVzc2VkIGZpbGUgc3VwcG9ydC4KKyAgICoKKyAgICogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUKKyAgICogICBgYnppcDJgIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiBmaWxlcworICAgKiAgIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyYCB0byBwYXJ0aWFsbHkKKyAgICogICB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBgc3JjL2J6aXAyL2Z0YnppcDIuY2ApLiAgQ29udHJhcnkKKyAgICogICB0byBnemlwLCBiemlwMiBjdXJyZW50bHkgaXMgbm90IGluY2x1ZGVkIGFuZCBuZWVkIHRvIHVzZSB0aGUgc3lzdGVtCisgICAqICAgYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGZpbGUgc3RyZWFtIGZ1bmN0aW9ucyBhbmQgdHlwZXMsIEZJTEUsICAgKi8KLSAgLyogZm9wZW4oKSBldGMuICBFbmFibGVzIHRoZSB1c2Ugb2Ygc21hbGxlciBzeXN0ZW0gbGlicmFyaWVzIG9uIGVtYmVkZGVkICovCi0gIC8qIHN5c3RlbXMgdGhhdCBoYXZlIG11bHRpcGxlIHN5c3RlbSBsaWJyYXJpZXMsIHNvbWUgd2l0aCBvciB3aXRob3V0ICAgICAqLwotICAvKiBmaWxlIHN0cmVhbSBzdXBwb3J0LCBpbiB0aGUgY2FzZXMgd2hlcmUgZmlsZSBzdHJlYW0gc3VwcG9ydCBpcyBub3QgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHN1Y2ggYXMgbWVtb3J5IGxvYWRpbmcgb2YgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBmaWxlIHN0cmVhbSBmdW5jdGlvbnMgYW5kIHR5cGVzLCBgRklMRWAsCisgICAqIGBmb3BlbmAsIGV0Yy4gIEVuYWJsZXMgdGhlIHVzZSBvZiBzbWFsbGVyIHN5c3RlbSBsaWJyYXJpZXMgb24gZW1iZWRkZWQKKyAgICogc3lzdGVtcyB0aGF0IGhhdmUgbXVsdGlwbGUgc3lzdGVtIGxpYnJhcmllcywgc29tZSB3aXRoIG9yIHdpdGhvdXQgZmlsZQorICAgKiBzdHJlYW0gc3VwcG9ydCwgaW4gdGhlIGNhc2VzIHdoZXJlIGZpbGUgc3RyZWFtIHN1cHBvcnQgaXMgbm90IG5lY2Vzc2FyeQorICAgKiBzdWNoIGFzIG1lbW9yeSBsb2FkaW5nIG9mIGZvbnQgZmlsZXMuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUE5HIGJpdG1hcCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGxvYWRpbmcgY29sb3IgYml0bWFwIGdseXBocyBpbiB0aGUgUE5HIGZvcm1hdC4gKi8KLSAgLyogICBUaGlzIHJlcXVpcmVzIGhlbHAgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicG5nIGxpYnJhcnkuICBVbmNvbXByZXNzZWQgICovCi0gIC8qICAgY29sb3IgYml0bWFwcyBkbyBub3QgbmVlZCBhbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGFuZCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgIHN1cHBvcnRlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmUnIHNjcmlwdCwgICAgICovCi0gIC8qICAgb3B0aW9ucyBzZXQgYnkgdGhvc2UgcHJvZ3JhbXMgaGF2ZSBwcmVjZW5kZW5jZSwgb3ZlcndyaXRpbmcgdGhlICAgICAqLwotICAvKiAgIHZhbHVlIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBQTkcgYml0bWFwIHN1cHBvcnQuCisgICAqCisgICAqICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgbG9hZGluZyBjb2xvciBiaXRtYXAgZ2x5cGhzIGluIHRoZSBQTkcgZm9ybWF0LgorICAgKiAgIFRoaXMgcmVxdWlyZXMgaGVscCBmcm9tIHRoZSBleHRlcm5hbCBsaWJwbmcgbGlicmFyeS4gIFVuY29tcHJlc3NlZAorICAgKiAgIGNvbG9yIGJpdG1hcHMgZG8gbm90IG5lZWQgYW55IGV4dGVybmFsIGxpYnJhcmllcyBhbmQgd2lsbCBiZSBzdXBwb3J0ZWQKKyAgICogICByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KKyAgICoKKyAgICogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyAnZmVhdHVyZScuCisgICAqCisgICAqICAgSWYgeW91IHVzZSBhIGJ1aWxkIHN5c3RlbSBsaWtlIGNtYWtlIG9yIHRoZSBgY29uZmlndXJlYCBzY3JpcHQsCisgICAqICAgb3B0aW9ucyBzZXQgYnkgdGhvc2UgcHJvZ3JhbXMgaGF2ZSBwcmVjZWRlbmNlLCBvdmVyd3JpdGluZyB0aGUgdmFsdWUKKyAgICogICBoZXJlIHdpdGggdGhlIGNvbmZpZ3VyZWQgb25lLgorICAgKi8KIC8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhhcmZCdXp6IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB1c2VzIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IHRvIGltcHJvdmUgYXV0by1oaW50aW5nIG9mICAgICAgICovCi0gIC8qICAgT3BlblR5cGUgZm9udHMuICBJZiBhdmFpbGFibGUsIG1hbnkgZ2x5cGhzIG5vdCBkaXJlY3RseSBhZGRyZXNzYWJsZSAqLwotICAvKiAgIGJ5IGEgZm9udCdzIGNoYXJhY3RlciBtYXAgd2lsbCBiZSBoaW50ZWQgYWxzby4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmUnIHNjcmlwdCwgICAgICovCi0gIC8qICAgb3B0aW9ucyBzZXQgYnkgdGhvc2UgcHJvZ3JhbXMgaGF2ZSBwcmVjZW5kZW5jZSwgb3ZlcndyaXRpbmcgdGhlICAgICAqLwotICAvKiAgIHZhbHVlIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBIYXJmQnV6eiBzdXBwb3J0LgorICAgKgorICAgKiAgIEZyZWVUeXBlIHVzZXMgdGhlIEhhcmZCdXp6IGxpYnJhcnkgdG8gaW1wcm92ZSBhdXRvLWhpbnRpbmcgb2YgT3BlblR5cGUKKyAgICogICBmb250cy4gIElmIGF2YWlsYWJsZSwgbWFueSBnbHlwaHMgbm90IGRpcmVjdGx5IGFkZHJlc3NhYmxlIGJ5IGEgZm9udCdzCisgICAqICAgY2hhcmFjdGVyIG1hcCB3aWxsIGJlIGhpbnRlZCBhbHNvLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLwogLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWiAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgVGhpcyAqLwotICAvKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSAgICAgICAgKi8KLSAgLyogICBVbmljb2RlIHZhbHVlLCBvciByZXR1cm4gYSBNYWNpbnRvc2ggc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3IgdGhlICAgICovCi0gIC8qICAgdXNlIHdpdGggdGhlIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCBgcHNuYW1lcycgY29tcGlsZWQgaW4geW91ciAgICovCi0gIC8qICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2lsbCBwcm92aWRlIGl0cyBvd24gc2V0IG9mIGdseXBoIG5hbWVzLCAgICAgICovCi0gIC8qICAgICBpZiB5b3UgYnVpbGQgaXQgdG8gc3VwcG9ydCBwb3N0c2NyaXB0IG5hbWVzIGluIHRoZSBUcnVlVHlwZSAgICAgICAqLwotICAvKiAgICAgYHBvc3QnIHRhYmxlLCBidXQgd2lsbCBub3Qgc3ludGhlc2l6ZSBhIG1pc3NpbmcgVW5pY29kZSBjaGFybWFwLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlICAgICAgICAqLwotICAvKiAgICAgY2hhcm1hcCBvdXQgb2YgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IHdvdWxkIG5vcm1hbGx5IHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuIGJ1aWxkaW5nICAqLwotICAvKiAgIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIFR5cGUgMSBvciBDRkYgZHJpdmVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBCcm90bGkgc3VwcG9ydC4KKyAgICoKKyAgICogICBGcmVlVHlwZSB1c2VzIHRoZSBCcm90bGkgbGlicmFyeSB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGRlY29tcHJlc3NpbmcKKyAgICogICBXT0ZGMiBzdHJlYW1zLgorICAgKgorICAgKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzICdmZWF0dXJlJy4KKyAgICoKKyAgICogICBJZiB5b3UgdXNlIGEgYnVpbGQgc3lzdGVtIGxpa2UgY21ha2Ugb3IgdGhlIGBjb25maWd1cmVgIHNjcmlwdCwKKyAgICogICBvcHRpb25zIHNldCBieSB0aG9zZSBwcm9ncmFtcyBoYXZlIHByZWNlZGVuY2UsIG92ZXJ3cml0aW5nIHRoZSB2YWx1ZQorICAgKiAgIGhlcmUgd2l0aCB0aGUgY29uZmlndXJlZCBvbmUuCisgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CUk9UTEkgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nCisgICAqCisgICAqICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSAncHNuYW1lcycgbW9kdWxlLiAgVGhpcworICAgKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSBVbmljb2RlCisgICAqICAgdmFsdWUsIG9yIHJldHVybiBhIE1hY2ludG9zaCBzdGFuZGFyZCBnbHlwaCBuYW1lIGZvciB0aGUgdXNlIHdpdGggdGhlCisgICAqICAgVHJ1ZVR5cGUgJ3Bvc3QnIHRhYmxlLgorICAgKgorICAgKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50ICdwc25hbWVzJyBjb21waWxlZCBpbiB5b3VyCisgICAqICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisgICAqCisgICAqICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgaWYgeW91CisgICAqICAgICBidWlsZCBpdCB0byBzdXBwb3J0IHBvc3RzY3JpcHQgbmFtZXMgaW4gdGhlIFRydWVUeXBlICdwb3N0JyB0YWJsZSwKKyAgICogICAgIGJ1dCB3aWxsIG5vdCBzeW50aGVzaXplIGEgbWlzc2luZyBVbmljb2RlIGNoYXJtYXAuCisgICAqCisgICAqICAgLSBUaGUgVHlwZX4xIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAKKyAgICogICAgIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250cy4KKyAgICoKKyAgICogICBZb3Ugd291bGQgbm9ybWFsbHkgdW5kZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIHdoZW4gYnVpbGRpbmcgYQorICAgKiAgIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlfjEgb3IgQ0ZGIGRyaXZlci4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3N0c2NyaXB0IE5hbWVzIHRvIFVuaWNvZGUgVmFsdWVzIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBidWlsdCB3aXRoIHRoZSBgUFNOYW1lcycgbW9kdWxlIGNvbXBpbGVkICAqLwotICAvKiAgIGluLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgbW9kdWxlIGlzIHVzZWQgdG8gY29udmVydCBhIGdseXBoIG5hbWUgKi8KLSAgLyogICBpbnRvIGEgVW5pY29kZSB2YWx1ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qICAgc3ludGhlc2l6ZSBvbiB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwIGZyb20gdGhlIENGRi9UeXBlIDEgZHJpdmVyICAqLwotICAvKiAgIHRocm91Z2ggYSBiaWcgdGFibGUgbmFtZWQgdGhlIGBBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIEFkb2JlIEdseXBoIExpc3QgICAgICAgICAqLwotICAvKiAgIGNvbXBpbGVkIGluIHlvdXIgYFBTTmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlIDEgZHJpdmVyIHdpbGwgbm90IGJlICAgKi8KLSAgLyogICBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlICovCi0gIC8qICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFBvc3RzY3JpcHQgTmFtZXMgdG8gVW5pY29kZSBWYWx1ZXMgc3VwcG9ydAorICAgKgorICAgKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlfjIgaXMgYnVpbHQgd2l0aCB0aGUgJ3BzbmFtZXMnIG1vZHVsZSBjb21waWxlZCBpbi4KKyAgICogICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBtb2R1bGUgaXMgdXNlZCB0byBjb252ZXJ0IGEgZ2x5cGggbmFtZSBpbnRvIGEKKyAgICogICBVbmljb2RlIHZhbHVlLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBvcmRlciB0byBzeW50aGVzaXplIG9uCisgICAqICAgdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZX4xIGRyaXZlciB0aHJvdWdoIGEgYmlnCisgICAqICAgdGFibGUgbmFtZWQgdGhlICdBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4KKyAgICoKKyAgICogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCB0aGUgQWRvYmUgR2x5cGggTGlzdCBjb21waWxlZAorICAgKiAgIGluIHlvdXIgJ3BzbmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlfjEgZHJpdmVyIHdpbGwgbm90IGJlIGFibGUgdG8KKyAgICogICBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250cy4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLwotICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KLSAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTdXBwb3J0IGZvciBNYWMgZm9udHMKKyAgICoKKyAgICogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvdXRsaW5lIGZvbnRzIGluIE1hYyBmb3JtYXQKKyAgICogICAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjIHJlc291cmNlKSBvbgorICAgKiAgIG5vbi1NYWMgcGxhdGZvcm1zLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgJ0ZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuCisgICAqLwogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHdWVzc2luZyBtZXRob2RzIHRvIGFjY2VzcyBlbWJlZGRlZCByZXNvdXJjZSBmb3JrcyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRW5hYmxlIGV4dHJhIE1hYyBmb250cyBzdXBwb3J0IG9uIG5vbi1NYWMgcGxhdGZvcm1zIChlLmcuICAgICAgICAgICAqLwotICAvKiAgIEdOVS9MaW51eCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmVzb3VyY2UgZm9ya3Mgd2hpY2ggaW5jbHVkZSBmb250cyBkYXRhIGFyZSBzdG9yZWQgc29tZXRpbWVzIGluICAgICAqLwotICAvKiAgIGxvY2F0aW9ucyB3aGljaCB1c2VycyBvciBkZXZlbG9wZXJzIGRvbid0IGV4cGVjdGVkLiAgSW4gc29tZSBjYXNlcywgKi8KLSAgLyogICByZXNvdXJjZSBmb3JrcyBzdGFydCB3aXRoIHNvbWUgb2Zmc2V0IGZyb20gdGhlIGhlYWQgb2YgYSBmaWxlLiAgSW4gICovCi0gIC8qICAgb3RoZXIgY2FzZXMsIHRoZSBhY3R1YWwgcmVzb3VyY2UgZm9yayBpcyBzdG9yZWQgaW4gZmlsZSBkaWZmZXJlbnQgICAqLwotICAvKiAgIGZyb20gd2hhdCB0aGUgdXNlciBzcGVjaWZpZXMuICBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB0cmllcyB0byBndWVzcyB3aGV0aGVyIHN1Y2ggb2Zmc2V0cyBvciBkaWZmZXJlbnQgZmlsZSAgICAgICovCi0gIC8qICAgbmFtZXMgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgbm9ybWFsLCBkaXJlY3QgYWNjZXNzIG9mIHJlc291cmNlIGZvcmtzIGlzIGNvbnRyb2xsZWQgdmlhICovCi0gIC8qICAgdGhlIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTIG9wdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEd1ZXNzaW5nIG1ldGhvZHMgdG8gYWNjZXNzIGVtYmVkZGVkIHJlc291cmNlIGZvcmtzCisgICAqCisgICAqICAgRW5hYmxlIGV4dHJhIE1hYyBmb250cyBzdXBwb3J0IG9uIG5vbi1NYWMgcGxhdGZvcm1zIChlLmcuLCBHTlUvTGludXgpLgorICAgKgorICAgKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbgorICAgKiAgIGxvY2F0aW9ucyB3aGljaCB1c2VycyBvciBkZXZlbG9wZXJzIGRvbid0IGV4cGVjdGVkLiAgSW4gc29tZSBjYXNlcywKKyAgICogICByZXNvdXJjZSBmb3JrcyBzdGFydCB3aXRoIHNvbWUgb2Zmc2V0IGZyb20gdGhlIGhlYWQgb2YgYSBmaWxlLiAgSW4KKyAgICogICBvdGhlciBjYXNlcywgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3JrIGlzIHN0b3JlZCBpbiBmaWxlIGRpZmZlcmVudCBmcm9tCisgICAqICAgd2hhdCB0aGUgdXNlciBzcGVjaWZpZXMuICBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIEZyZWVUeXBlIHRyaWVzCisgICAqICAgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgbmFtZXMgbXVzdCBiZSB1c2VkLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBub3JtYWwsIGRpcmVjdCBhY2Nlc3Mgb2YgcmVzb3VyY2UgZm9ya3MgaXMgY29udHJvbGxlZCB2aWEKKyAgICogICB0aGUgYEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTYCBvcHRpb24uCisgICAqLwogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGxvdyB0aGUgdXNlIG9mIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSB0byBsb2FkIHR5cGVmYWNlcyB0aGF0ICAgICAgKi8KLSAgLyogY29udGFpbiBubyBnbHlwaCBkYXRhLCBidXQgc3VwcGx5IGl0IHZpYSBhIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgcmVxdWlyZWQgYnkgY2xpZW50cyBzdXBwb3J0aW5nIGRvY3VtZW50IGZvcm1hdHMgd2hpY2ggICAgICAgICAqLwotICAvKiBzdXBwbHkgZm9udCBkYXRhIGluY3JlbWVudGFsbHkgYXMgdGhlIGRvY3VtZW50IGlzIHBhcnNlZCwgc3VjaCAgICAgICAgKi8KLSAgLyogYXMgdGhlIEdob3N0c2NyaXB0IGludGVycHJldGVyIGZvciB0aGUgUG9zdFNjcmlwdCBsYW5ndWFnZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQWxsb3cgdGhlIHVzZSBvZiBgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlYCB0byBsb2FkIHR5cGVmYWNlcyB0aGF0CisgICAqIGNvbnRhaW4gbm8gZ2x5cGggZGF0YSwgYnV0IHN1cHBseSBpdCB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbi4gIFRoaXMgaXMKKyAgICogcmVxdWlyZWQgYnkgY2xpZW50cyBzdXBwb3J0aW5nIGRvY3VtZW50IGZvcm1hdHMgd2hpY2ggc3VwcGx5IGZvbnQgZGF0YQorICAgKiBpbmNyZW1lbnRhbGx5IGFzIHRoZSBkb2N1bWVudCBpcyBwYXJzZWQsIHN1Y2ggYXMgdGhlIEdob3N0c2NyaXB0CisgICAqIGludGVycHJldGVyIGZvciB0aGUgUG9zdFNjcmlwdCBsYW5ndWFnZS4KKyAgICovCiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbCB1c2VkIGJ5IHRoZSBzY2FuLWxpbmUgY29udmVydGVyIHRvCisgICAqIGRvIGFsbCBvZiBpdHMgd29yay4KKyAgICovCiAjZGVmaW5lIEZUX1JFTkRFUl9QT09MX1NJWkUgIDE2Mzg0TAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9NQVhfTU9EVUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIG1vZHVsZXMgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhIHNpbmdsZSAgICAqLwotICAvKiAgIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgMzIgaXMgdGhlIGRlZmF1bHQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGVF9NQVhfTU9EVUxFUworICAgKgorICAgKiAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSBzaW5nbGUKKyAgICogICBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDMyfmlzIHRoZSBkZWZhdWx0LgorICAgKi8KICNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCi0gIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLwotICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KLSAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KLSAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWJ1ZyBsZXZlbAorICAgKgorICAgKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwKKyAgICogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlICdmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSBtb2RlLAorICAgKiAgIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgZXhlY3V0aW9uLgorICAgKgorICAgKiAgIERlZmluZSBgRlRfREVCVUdfTEVWRUxfRVJST1JgIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuCisgICAqICAgRGVmaW5lIGBGVF9ERUJVR19MRVZFTF9UUkFDRWAgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4KKyAgICoKKyAgICogICBEb24ndCBkZWZpbmUgYW55IG9mIHRoZXNlIG1hY3JvcyB0byBjb21waWxlIGluICdyZWxlYXNlJyBtb2RlIQorICAgKgorICAgKiAgIERvIG5vdCBgI3VuZGVmYCB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZQorICAgKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCiAvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCi0gIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLwotICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KLSAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCi0gIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLwotICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLwotICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBdXRvZml0dGVyIGRlYnVnZ2luZworICAgKgorICAgKiAgIElmIGBGVF9ERUJVR19BVVRPRklUYCBpcyBkZWZpbmVkLCBGcmVlVHlwZSBwcm92aWRlcyBzb21lIG1lYW5zIHRvCisgICAqICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbAorICAgKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKipuZXZlcioqIGVuYWJsZSB0aGlzCisgICAqICAgd2hpbGUgY29tcGlsaW5nIGluICdyZWxlYXNlJyBtb2RlKToKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2hvcnpfaGludHMKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMKKyAgICogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2JsdWVfaGludHMKKyAgICogICBgYGAKKyAgICoKKyAgICogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cworICAgKiAgIGludGVybmFsIGF1dG9maXQgc3RydWN0dXJlcyB0byBzdGRvdXQgKHVzaW5nIGBwcmludGZgKToKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19nZXRfbnVtX3NlZ21lbnRzCisgICAqICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQKKyAgICogICBgYGAKKyAgICoKKyAgICogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6CisgICAqCisgICAqICAgYGBgCisgICAqICAgICBfYWZfZGVidWdfaGludHMKKyAgICogICBgYGAKKyAgICoKKyAgICogICBQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGBmdGdyaWRgIGRlbW8gcHJvZ3JhbSB0byBzZWUgaG93IHRob3NlCisgICAqICAgdmFyaWFibGVzIGFuZCBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQuCisgICAqCisgICAqICAgRG8gbm90IGAjdW5kZWZgIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lCisgICAqICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LgorICAgKi8KIC8qICNkZWZpbmUgRlRfREVCVUdfQVVUT0ZJVCAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNZW1vcnkgRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGNvbWVzIHdpdGggYW4gaW50ZWdyYXRlZCBtZW1vcnkgZGVidWdnZXIgdGhhdCBpcyAgICAgICAqLwotICAvKiAgIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNpbXBsZSBlcnJvcnMgbGlrZSBtZW1vcnkgbGVha3Mgb3IgZG91YmxlICAgICAgKi8KLSAgLyogICBkZWxldGVzLiAgVG8gY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91ICAgICAgICovCi0gIC8qICAgc2hvdWxkIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBkZWJ1Z2dlciBpcyBvbmx5IGFjdGl2YXRlZCBhdCBydW50aW1lIHdoZW4gICAgICovCi0gIC8qICAgd2hlbiB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBgRlQyX0RFQlVHX01FTU9SWScgaXMgZGVmaW5lZCBhbHNvISAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1lbW9yeSBEZWJ1Z2dpbmcKKyAgICoKKyAgICogICBGcmVlVHlwZSBub3cgY29tZXMgd2l0aCBhbiBpbnRlZ3JhdGVkIG1lbW9yeSBkZWJ1Z2dlciB0aGF0IGlzIGNhcGFibGUKKyAgICogICBvZiBkZXRlY3Rpbmcgc2ltcGxlIGVycm9ycyBsaWtlIG1lbW9yeSBsZWFrcyBvciBkb3VibGUgZGVsZXRlcy4gIFRvCisgICAqICAgY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91IHNob3VsZCBkZWZpbmUKKyAgICogICBgRlRfREVCVUdfTUVNT1JZYCBoZXJlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGRlYnVnZ2VyIGlzIG9ubHkgYWN0aXZhdGVkIGF0IHJ1bnRpbWUgd2hlbiB3aGVuCisgICAqICAgdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUllgIGlzIGRlZmluZWQgYWxzbyEKKyAgICoKKyAgICogICBEbyBub3QgYCN1bmRlZmAgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lIGl0CisgICAqICAgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAvKiAjZGVmaW5lIEZUX0RFQlVHX01FTU9SWSAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLwotICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KLSAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KLSAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCi0gIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTW9kdWxlIGVycm9ycworICAgKgorICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIHRoZSBoaWdoZXIgYnl0ZSBvZgorICAgKiAgIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCB3aGlsZQorICAgKiAgIHRoZSBsb3dlciBieXRlIGlzIHRoZSByZWFsIGVycm9yIGNvZGUuCisgICAqCisgICAqICAgU2V0dGluZyB0aGlzIG1hY3JvIG1ha2VzIHNlbnNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgc2luY2UgaXQKKyAgICogICB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlCisgICAqICAgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBgZnRtb2RlcnIuaGAgYW5kIGBmdGVycm9ycy5oYC4KKyAgICovCiAjdW5kZWYgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgRnJlZVR5cGUyIHdpbGwgICAqLwotICAvKiAgIGF2b2lkIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0IHJlcXVpcmUgYWRkcmVzcyBmaXh1cHMuICBJbnN0ZWFkIHRoZSAgKi8KLSAgLyogICBjb25zdGFudHMgd2lsbCBiZSBtb3ZlZCBpbnRvIGEgc3RydWN0IGFuZCBhZGRpdGlvbmFsIGludGlhbGl6YXRpb24gICovCi0gIC8qICAgY29kZSB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTZXR0aW5nIHRoaXMgbWFjcm8gaXMgbmVlZGVkIGZvciBzeXN0ZW1zIHRoYXQgcHJvaGliaXQgYWRkcmVzcyAgICAgICovCi0gIC8qICAgZml4dXBzLCBzdWNoIGFzIEJSRVcuICBbTm90ZSB0aGF0IHN0YW5kYXJkIGNvbXBpbGVycyBsaWtlIGdjYyBvciAgICAqLwotICAvKiAgIGNsYW5nIGhhbmRsZSBQSUMgZ2VuZXJhdGlvbiBhdXRvbWF0aWNhbGx5OyB5b3UgZG9uJ3QgaGF2ZSB0byBzZXQgICAgKi8KLSAgLyogICBGVF9DT05GSUdfT1BUSU9OX1BJQywgd2hpY2ggaXMgb25seSBuZWNlc3NhcnkgZm9yIHZlcnkgc3BlY2lhbCAgICAgICovCi0gIC8qICAgY29tcGlsZXJzLl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIGZvciBhbGwgICAgICovCi0gIC8qICAgbW9kdWxlcyAoc2VlIGBtb2R1bGVzLmNmZycgZm9yIGEgY29tcGxldGUgbGlzdCkuICBGb3IgYnVpbGRpbmcgd2l0aCAqLwotICAvKiAgIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQsIGRvIHRoZSBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAwLiBDbG9uZSB0aGUgcmVwb3NpdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMS4gRGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUElDLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIDIuIFJlbW92ZSBhbGwgc3ViZGlyZWN0b3JpZXMgaW4gYHNyYycgdGhhdCBkb24ndCBoYXZlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgMy4gQ29tbWVudCBvdXQgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlcyBpbiBgbW9kdWxlcy5jZmcnLiAgICAgICAgKi8KLSAgLyogICAgIDQuIENvbXBpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRXJyb3IgU3RyaW5ncworICAgKgorICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0LCBgRlRfRXJyb3JfU3RyaW5nYCB3aWxsIHJldHVybiBtZWFuaW5nZnVsCisgICAqICAgZGVzY3JpcHRpb25zLiAgVGhpcyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0IHRvIHJlZHVjZSB0aGUgb3ZlcmFsbAorICAgKiAgIHNpemUgb2YgRnJlZVR5cGUuCisgICAqCisgICAqICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSBgZnRlcnJvcnMuaGAuCisgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0VSUk9SX1NUUklOR1MgKi8KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTI0LDUwICs1MjksNjAgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCAgICAgICAqLwotICAvKiBlbWJlZGRlZCBiaXRtYXBzIGluIGFsbCBmb3JtYXRzIHVzaW5nIHRoZSBTRk5UIG1vZHVsZSAobmFtZWx5ICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgJiBPcGVuVHlwZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFNgIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQKKyAgICogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgJ3NmbnQnIG1vZHVsZSAobmFtZWx5CisgICAqIFRydWVUeXBlfiYgT3BlblR5cGUpLgorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byAgICAqLwotICAvKiBsb2FkIGFuZCBlbnVtZXJhdGUgdGhlIGdseXBoIFBvc3RzY3JpcHQgbmFtZXMgaW4gYSBUcnVlVHlwZSBvciAgICAgICAgKi8KLSAgLyogT3BlblR5cGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgd2hlbiB5b3UgZG8gbm90IGNvbXBpbGUgdGhlIGBQU05hbWVzJyBtb2R1bGUgYnkgdW5kZWZpbmluZyAgKi8KLSAgLyogdGhlIGFib3ZlIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUywgdGhlIGBzZm50JyBtb2R1bGUgd2lsbCAgICovCi0gIC8qIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKEJ5IGRlZmF1bHQsIHRoZSBtb2R1bGUgdXNlcyBgUFNOYW1lcycgdG8gZXh0cmFjdCBnbHlwaCBuYW1lcy4pICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSU2AgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBjb2xvcmVkCisgICAqIG91dGxpbmVzIChmcm9tIHRoZSAnQ09MUicvJ0NQQUwnIHRhYmxlcykgaW4gYWxsIGZvcm1hdHMgdXNpbmcgdGhlICdzZm50JworICAgKiBtb2R1bGUgKG5hbWVseSBUcnVlVHlwZX4mIE9wZW5UeXBlKS4KKyAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVNgIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8KKyAgICogbG9hZCBhbmQgZW51bWVyYXRlIHRoZSBnbHlwaCBQb3N0c2NyaXB0IG5hbWVzIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUKKyAgICogZmlsZS4KKyAgICoKKyAgICogTm90ZSB0aGF0IHdoZW4geW91IGRvIG5vdCBjb21waWxlIHRoZSAncHNuYW1lcycgbW9kdWxlIGJ5IHVuZGVmaW5pbmcgdGhlCisgICAqIGFib3ZlIGBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVNgLCB0aGUgJ3NmbnQnIG1vZHVsZSB3aWxsCisgICAqIGNvbnRhaW4gYWRkaXRpb25hbCBjb2RlIHVzZWQgdG8gcmVhZCB0aGUgUFMgTmFtZXMgdGFibGUgZnJvbSBhIGZvbnQuCisgICAqCisgICAqIChCeSBkZWZhdWx0LCB0aGUgbW9kdWxlIHVzZXMgJ3BzbmFtZXMnIHRvIGV4dHJhY3QgZ2x5cGggbmFtZXMuKQorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMgaWYgeW91ciBhcHBsaWNhdGlvbnMgbmVlZCB0byAgICAgICAqLwotICAvKiBhY2Nlc3MgdGhlIGludGVybmFsIG5hbWUgdGFibGUgaW4gYSBTRk5ULWJhc2VkIGZvcm1hdCBsaWtlIFRydWVUeXBlICAgKi8KLSAgLyogb3IgT3BlblR5cGUuICBUaGUgbmFtZSB0YWJsZSBjb250YWlucyB2YXJpb3VzIHN0cmluZ3MgdXNlZCB0byAgICAgICAgICovCi0gIC8qIGRlc2NyaWJlIHRoZSBmb250LCBsaWtlIGZhbWlseSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4gIEl0ICAgICAqLwotICAvKiBkb2VzIG5vdCBjb250YWluIGFueSBnbHlwaCBuYW1lIHRob3VnaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFjY2Vzc2luZyBTRk5UIG5hbWVzIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluICAgICAgICAqLwotICAvKiBgZnRzbmFtZXMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgYFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FU2AgaWYgeW91ciBhcHBsaWNhdGlvbnMgbmVlZCB0byBhY2Nlc3MKKyAgICogdGhlIGludGVybmFsIG5hbWUgdGFibGUgaW4gYSBTRk5ULWJhc2VkIGZvcm1hdCBsaWtlIFRydWVUeXBlIG9yCisgICAqIE9wZW5UeXBlLiAgVGhlIG5hbWUgdGFibGUgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIHVzZWQgdG8gZGVzY3JpYmUgdGhlCisgICAqIGZvbnQsIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgSXQgZG9lcyBub3QgY29udGFpbgorICAgKiBhbnkgZ2x5cGggbmFtZSB0aG91Z2guCisgICAqCisgICAqIEFjY2Vzc2luZyBTRk5UIG5hbWVzIGlzIGRvbmUgdGhyb3VnaCB0aGUgZnVuY3Rpb25zIGRlY2xhcmVkIGluCisgICAqIGBmdHNuYW1lcy5oYC4KKyAgICovCiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBDTWFwIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSB5b3UgY2FuIGZpbmUtdHVuZSB3aGljaCBUcnVlVHlwZSBDTWFwIHRhYmxlIGZvcm1hdCBzaGFsbCBiZSAgICAqLwotICAvKiAgIHN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRydWVUeXBlIENNYXAgc3VwcG9ydAorICAgKgorICAgKiAgIEhlcmUgeW91IGNhbiBmaW5lLXR1bmUgd2hpY2ggVHJ1ZVR5cGUgQ01hcCB0YWJsZSBmb3JtYXQgc2hhbGwgYmUKKyAgICogICBzdXBwb3J0ZWQuCisgICAqLwogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMgogI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNApAQCAtNTg3LDEzMSArNjAyLDEzMCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgKi8KLSAgLyogYSBieXRlY29kZSBpbnRlcnByZXRlciBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoaXMsIHlvdSB3aWxsIG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gbG9hZCAgKi8KLSAgLyogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlLCBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0ICAgICAgICAgKi8KLSAgLyogICBkZWZpbmUgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSYCBpZiB5b3Ugd2FudCB0byBjb21waWxlIGEKKyAgICogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaW4gdGhlIFRydWVUeXBlIGRyaXZlci4KKyAgICoKKyAgICogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugd2lsbCBvbmx5IGNvbXBpbGUgdGhlIGNvZGUgbmVjZXNzYXJ5IHRvIGxvYWQKKyAgICogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4KKyAgICoKKyAgICogRG8gbm90IGAjdW5kZWZgIHRoaXMgbWFjcm8gaGVyZSwgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgaXQKKyAgICogZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4KKyAgICovCiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgICAgICovCi0gIC8qIHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydCBpbnRvIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGlzIG1vZGlmaWVzIHRoZSAqLwotICAvKiBUcnVlVHlwZSBoaW50aW5nIG1lY2hhbmlzbSB3aGVuIGFueXRoaW5nIGJ1dCBGVF9SRU5ERVJfTU9ERV9NT05PIGlzICAgKi8KLSAgLyogcmVxdWVzdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbiBwYXJ0aWN1bGFyLCBpdCBtb2RpZmllcyB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gaW50ZXJwcmV0IChvciAgKi8KLSAgLyogbm90KSBpbnN0cnVjdGlvbnMgaW4gYSBjZXJ0YWluIHdheSBzbyB0aGF0IGFsbCBUcnVlVHlwZSBmb250cyBsb29rICAgICovCi0gIC8qIGxpa2UgdGhleSBkbyBpbiBhIFdpbmRvd3MgQ2xlYXJUeXBlIChEaXJlY3RXcml0ZSkgZW52aXJvbm1lbnQuICBTZWUgICAqLwotICAvKiBbMV0gZm9yIGEgdGVjaG5pY2FsIG92ZXJ2aWV3IG9uIHdoYXQgdGhpcyBtZWFucy4gIFNlZSBgdHRpbnRlcnAuaCcgICAgKi8KLSAgLyogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgTEVBTiBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFZhbHVlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHZhbHVlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYEluZmluYWxpdHknIG1vbmlrZXIsICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJpYnV0ZWQgYnkgYW4gaW5kaXZpZHVhbCBuaWNrbmFtZWQgSW5maW5hbGl0eSB3aXRoIHRoZSBnb2FsIG9mICovCi0gIC8qICAgIG1ha2luZyBUcnVlVHlwZSBmb250cyByZW5kZXIgYmV0dGVyIHRoYW4gb24gV2luZG93cy4gIEEgaGlnaCAgICAgICAqLwotICAvKiAgICBhbW91bnQgb2YgY29uZmlndXJhYmlsaXR5IGFuZCBmbGV4aWJpbGl0eSwgZG93biB0byBydWxlcyBmb3IgICAgICAgKi8KLSAgLyogICAgc2luZ2xlIGdseXBocyBpbiBmb250cywgYnV0IGFsc28gdmVyeSBzbG93LiAgSXRzIGV4cGVyaW1lbnRhbCBhbmQgICovCi0gIC8qICAgIHNsb3cgbmF0dXJlIGFuZCB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyIGxvc2luZyBpbnRlcmVzdCBtZWFudCB0aGF0ICAqLwotICAvKiAgICB0aGlzIG9wdGlvbiB3YXMgbmV2ZXIgZW5hYmxlZCBpbiBkZWZhdWx0IGJ1aWxkcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb3JyZXNwb25kaW5nIGludGVycHJldGVyIHZlcnNpb24gaXMgdjM4LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVmFsdWUgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBuZXcgZGVmYXVsdCBtb2RlIGZvciB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgVGhlIEluZmluYWxpdHkgY29kZSAqLwotICAvKiAgICBiYXNlIHdhcyBzdHJpcHBlZCB0byB0aGUgYmFyZSBtaW5pbXVtIGFuZCBhbGwgY29uZmlndXJhYmlsaXR5ICAgICAgKi8KLSAgLyogICAgcmVtb3ZlZCBpbiB0aGUgbmFtZSBvZiBzcGVlZCBhbmQgc2ltcGxpY2l0eS4gIFRoZSBjb25maWd1cmFiaWxpdHkgICovCi0gIC8qICAgIHdhcyBtYWlubHkgYWltZWQgYXQgbGVnYWN5IGZvbnRzIGxpa2UgQXJpYWwsIFRpbWVzIE5ldyBSb21hbiwgb3IgICAqLwotICAvKiAgICBDb3VyaWVyLiAgTGVnYWN5IGZvbnRzIGFyZSBmb250cyB0aGF0IG1vZGlmeSB2ZXJ0aWNhbCBzdGVtcyB0byAgICAgKi8KLSAgLyogICAgYWNoaWV2ZSBjbGVhbiBibGFjay1hbmQtd2hpdGUgYml0bWFwcy4gIFRoZSBuZXcgbW9kZSBmb2N1c2VzIG9uICAgICovCi0gIC8qICAgIGFwcGx5aW5nIGEgbWluaW1hbCBzZXQgb2YgcnVsZXMgdG8gYWxsIGZvbnRzIGluZGlzY3JpbWluYXRlbHkgc28gICAqLwotICAvKiAgICB0aGF0IG1vZGVybiBhbmQgd2ViIGZvbnRzIHJlbmRlciB3ZWxsIHdoaWxlIGxlZ2FjeSBmb250cyByZW5kZXIgICAgKi8KLSAgLyogICAgb2theS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY29ycmVzcG9uZGluZyBpbnRlcnByZXRlciB2ZXJzaW9uIGlzIHY0MC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFZhbHVlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21waWxlIGJvdGgsIG1ha2luZyBib3RoIHYzOCBhbmQgdjQwIGF2YWlsYWJsZSAodGhlIGxhdHRlciBpcyB0aGUgKi8KLSAgLyogICAgZGVmYXVsdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoZXNlLCB5b3UgZ2V0IHJlbmRlcmluZyBiZWhhdmlvciBsaWtlIG9uIFdpbmRvd3MgICAgICAgKi8KLSAgLyogd2l0aG91dCBDbGVhclR5cGUsIGkuZS4sIFdpbmRvd3MgWFAgd2l0aG91dCBDbGVhclR5cGUgZW5hYmxlZCBhbmQgICAgICovCi0gIC8qIFdpbjl4IChpbnRlcnByZXRlciB2ZXJzaW9uIHYzNSkuICBPciBub3QsIGRlcGVuZGluZyBvbiBob3cgbXVjaCAgICAgICAqLwotICAvKiBoaW50aW5nIGJsb29kIGFuZCB0ZXN0aW5nIHRlYXJzIHRoZSBmb250IGRlc2lnbmVyIHB1dCBpbnRvIGEgZ2l2ZW4gICAgKi8KLSAgLyogZm9udC4gIElmIHlvdSBkZWZpbmUgb25lIG9yIGJvdGggc3VicGl4ZWwgaGludGluZyBvcHRpb25zLCB5b3UgY2FuICAgICovCi0gIC8qIHN3aXRjaCBiZXR3ZWVuIGJldHdlZW4gdjM1IGFuZCB0aGUgb25lcyB5b3UgZGVmaW5lICh1c2luZyAgICAgICAgICAgICAqLwotICAvKiBgRlRfUHJvcGVydHlfU2V0JykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgb3B0aW9uIHJlcXVpcmVzIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgdG8gYmUgICAgICAqLwotICAvKiBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFsxXSBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgYFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElOR2AgaWYgeW91IHdhbnQgdG8gY29tcGlsZQorICAgKiBzdWJwaXhlbCBoaW50aW5nIHN1cHBvcnQgaW50byB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgVGhpcyBtb2RpZmllcyB0aGUKKyAgICogVHJ1ZVR5cGUgaGludGluZyBtZWNoYW5pc20gd2hlbiBhbnl0aGluZyBidXQgYEZUX1JFTkRFUl9NT0RFX01PTk9gIGlzCisgICAqIHJlcXVlc3RlZC4KKyAgICoKKyAgICogSW4gcGFydGljdWxhciwgaXQgbW9kaWZpZXMgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIGludGVycHJldCAob3IKKyAgICogbm90KSBpbnN0cnVjdGlvbnMgaW4gYSBjZXJ0YWluIHdheSBzbyB0aGF0IGFsbCBUcnVlVHlwZSBmb250cyBsb29rIGxpa2UKKyAgICogdGhleSBkbyBpbiBhIFdpbmRvd3MgQ2xlYXJUeXBlIChEaXJlY3RXcml0ZSkgZW52aXJvbm1lbnQuICBTZWUgWzFdIGZvciBhCisgICAqIHRlY2huaWNhbCBvdmVydmlldyBvbiB3aGF0IHRoaXMgbWVhbnMuICBTZWUgYHR0aW50ZXJwLmhgIGZvciBtb3JlCisgICAqIGRldGFpbHMgb24gdGhlIExFQU4gb3B0aW9uLgorICAgKgorICAgKiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgdmFsdWVzLgorICAgKgorICAgKiBWYWx1ZSAxOgorICAgKiAgIFRoaXMgdmFsdWUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAnSW5maW5hbGl0eScgbW9uaWtlciwgY29udHJpYnV0ZWQgYnkKKyAgICogICBhbiBpbmRpdmlkdWFsIG5pY2tuYW1lZCBJbmZpbmFsaXR5IHdpdGggdGhlIGdvYWwgb2YgbWFraW5nIFRydWVUeXBlCisgICAqICAgZm9udHMgcmVuZGVyIGJldHRlciB0aGFuIG9uIFdpbmRvd3MuICBBIGhpZ2ggYW1vdW50IG9mIGNvbmZpZ3VyYWJpbGl0eQorICAgKiAgIGFuZCBmbGV4aWJpbGl0eSwgZG93biB0byBydWxlcyBmb3Igc2luZ2xlIGdseXBocyBpbiBmb250cywgYnV0IGFsc28KKyAgICogICB2ZXJ5IHNsb3cuICBJdHMgZXhwZXJpbWVudGFsIGFuZCBzbG93IG5hdHVyZSBhbmQgdGhlIG9yaWdpbmFsCisgICAqICAgZGV2ZWxvcGVyIGxvc2luZyBpbnRlcmVzdCBtZWFudCB0aGF0IHRoaXMgb3B0aW9uIHdhcyBuZXZlciBlbmFibGVkIGluCisgICAqICAgZGVmYXVsdCBidWlsZHMuCisgICAqCisgICAqICAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpcyB2MzguCisgICAqCisgICAqIFZhbHVlIDI6CisgICAqICAgVGhlIG5ldyBkZWZhdWx0IG1vZGUgZm9yIHRoZSBUcnVlVHlwZSBkcml2ZXIuICBUaGUgSW5maW5hbGl0eSBjb2RlCisgICAqICAgYmFzZSB3YXMgc3RyaXBwZWQgdG8gdGhlIGJhcmUgbWluaW11bSBhbmQgYWxsIGNvbmZpZ3VyYWJpbGl0eSByZW1vdmVkCisgICAqICAgaW4gdGhlIG5hbWUgb2Ygc3BlZWQgYW5kIHNpbXBsaWNpdHkuICBUaGUgY29uZmlndXJhYmlsaXR5IHdhcyBtYWlubHkKKyAgICogICBhaW1lZCBhdCBsZWdhY3kgZm9udHMgbGlrZSAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJywgb3IgJ0NvdXJpZXInLgorICAgKiAgIExlZ2FjeSBmb250cyBhcmUgZm9udHMgdGhhdCBtb2RpZnkgdmVydGljYWwgc3RlbXMgdG8gYWNoaWV2ZSBjbGVhbgorICAgKiAgIGJsYWNrLWFuZC13aGl0ZSBiaXRtYXBzLiAgVGhlIG5ldyBtb2RlIGZvY3VzZXMgb24gYXBwbHlpbmcgYSBtaW5pbWFsCisgICAqICAgc2V0IG9mIHJ1bGVzIHRvIGFsbCBmb250cyBpbmRpc2NyaW1pbmF0ZWx5IHNvIHRoYXQgbW9kZXJuIGFuZCB3ZWIKKyAgICogICBmb250cyByZW5kZXIgd2VsbCB3aGlsZSBsZWdhY3kgZm9udHMgcmVuZGVyIG9rYXkuCisgICAqCisgICAqICAgVGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJwcmV0ZXIgdmVyc2lvbiBpcyB2NDAuCisgICAqCisgICAqIFZhbHVlIDM6CisgICAqICAgQ29tcGlsZSBib3RoLCBtYWtpbmcgYm90aCB2MzggYW5kIHY0MCBhdmFpbGFibGUgKHRoZSBsYXR0ZXIgaXMgdGhlCisgICAqICAgZGVmYXVsdCkuCisgICAqCisgICAqIEJ5IHVuZGVmaW5pbmcgdGhlc2UsIHlvdSBnZXQgcmVuZGVyaW5nIGJlaGF2aW9yIGxpa2Ugb24gV2luZG93cyB3aXRob3V0CisgICAqIENsZWFyVHlwZSwgaS5lLiwgV2luZG93cyBYUCB3aXRob3V0IENsZWFyVHlwZSBlbmFibGVkIGFuZCBXaW45eAorICAgKiAoaW50ZXJwcmV0ZXIgdmVyc2lvbiB2MzUpLiAgT3Igbm90LCBkZXBlbmRpbmcgb24gaG93IG11Y2ggaGludGluZyBibG9vZAorICAgKiBhbmQgdGVzdGluZyB0ZWFycyB0aGUgZm9udCBkZXNpZ25lciBwdXQgaW50byBhIGdpdmVuIGZvbnQuICBJZiB5b3UKKyAgICogZGVmaW5lIG9uZSBvciBib3RoIHN1YnBpeGVsIGhpbnRpbmcgb3B0aW9ucywgeW91IGNhbiBzd2l0Y2ggYmV0d2VlbgorICAgKiBiZXR3ZWVuIHYzNSBhbmQgdGhlIG9uZXMgeW91IGRlZmluZSAodXNpbmcgYEZUX1Byb3BlcnR5X1NldGApLgorICAgKgorICAgKiBUaGlzIG9wdGlvbiByZXF1aXJlcyBgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUmAgdG8gYmUKKyAgICogZGVmaW5lZC4KKyAgICoKKyAgICogWzFdCisgICAqIGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweAorICAgKi8KIC8qICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICAxICAgICAgICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICAyCiAvKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAgKCAxIHwgMiApICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVEIHRvIGNvbXBpbGUgdGhlICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgdG8gdXNlIEFwcGxlJ3MgZGVmaW5pdGlvbiBvZiBob3cgdG8gaGFuZGxlICAgICAgKi8KLSAgLyogY29tcG9uZW50IG9mZnNldHMgaW4gY29tcG9zaXRlIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBcHBsZSBhbmQgTVMgZGlzYWdyZWUgb24gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY29tcG9uZW50IG9mZnNldHMgICAgKi8KLSAgLyogaW4gY29tcG9zaXRlcy4gIEFwcGxlIHNheXMgdGhhdCB0aGV5IHNob3VsZCBiZSBzY2FsZWQgYnkgdGhlIHNjYWxpbmcgICovCi0gIC8qIGZhY3RvcnMgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAocm91Z2hseSwgaXQncyBtb3JlIGNvbXBsZXgpICAgICAqLwotICAvKiB3aGlsZSBNUyBzYXlzIHRoZXkgc2hvdWxkIG5vdC4gIE9wZW5UeXBlIGRlZmluZXMgdHdvIGJpdHMgaW4gdGhlICAgICAgKi8KLSAgLyogY29tcG9zaXRlIGZsYWdzIGFycmF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FtYmlndWF0ZSwgYnV0IG9sZCAgICAgICovCi0gIC8qIGZvbnRzIHdpbGwgbm90IGhhdmUgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtICAgICAgICAgICAgICAgICovCi0gIC8qICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmdseWYuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSBgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRGAgdG8gY29tcGlsZSB0aGUKKyAgICogVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIHRvIHVzZSBBcHBsZSdzIGRlZmluaXRpb24gb2YgaG93IHRvIGhhbmRsZQorICAgKiBjb21wb25lbnQgb2Zmc2V0cyBpbiBjb21wb3NpdGUgZ2x5cGhzLgorICAgKgorICAgKiBBcHBsZSBhbmQgTVMgZGlzYWdyZWUgb24gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY29tcG9uZW50IG9mZnNldHMgaW4KKyAgICogY29tcG9zaXRlcy4gIEFwcGxlIHNheXMgdGhhdCB0aGV5IHNob3VsZCBiZSBzY2FsZWQgYnkgdGhlIHNjYWxpbmcKKyAgICogZmFjdG9ycyBpbiB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IChyb3VnaGx5LCBpdCdzIG1vcmUgY29tcGxleCkgd2hpbGUKKyAgICogTVMgc2F5cyB0aGV5IHNob3VsZCBub3QuICBPcGVuVHlwZSBkZWZpbmVzIHR3byBiaXRzIGluIHRoZSBjb21wb3NpdGUKKyAgICogZmxhZ3MgYXJyYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGlzYW1iaWd1YXRlLCBidXQgb2xkIGZvbnRzIHdpbGwgbm90CisgICAqIGhhdmUgdGhlbS4KKyAgICoKKyAgICogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtCisgICAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmdseWYuaHRtbAorICAgKi8KICN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVECiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgICAgICAgICAqLwotICAvKiBzdXBwb3J0IGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoZnZhciwgZ3ZhciwgY3ZhciwgICAgKi8KLSAgLyogYW5kIGF2YXIgdGFibGVzKS4gIFRoaXMgaGFzIG1hbnkgc2ltaWxhcml0aWVzIHRvIFR5cGUgMSBNdWx0aXBsZSAgICAgICovCi0gIC8qIE1hc3RlcnMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSBgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVGAgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0CisgICAqIGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoJ2Z2YXInLCAnZ3ZhcicsICdjdmFyJywgYW5kCisgICAqICdhdmFyJyB0YWJsZXMpLiAgVGFnZ2VkICdGb250IFZhcmlhdGlvbnMnLCB0aGlzIGlzIG5vdyBwYXJ0IG9mIE9wZW5UeXBlCisgICAqIGFsc28uICBUaGlzIGhhcyBtYW55IHNpbWlsYXJpdGllcyB0byBUeXBlfjEgTXVsdGlwbGUgTWFzdGVycyBzdXBwb3J0LgorICAgKi8KICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CREYgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciAgICAgICAgKi8KLSAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIGBUVF9DT05GSUdfT1BUSU9OX0JERmAgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBhbgorICAgKiBlbWJlZGRlZCAnQkRGficgdGFibGUgd2l0aGluIFNGTlQtYmFzZWQgYml0bWFwIGZvcm1hdHMuCisgICAqLwogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcHRpb24gVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUyBjb250cm9scyB0aGUgbWF4aW11bSAgICAgKi8KLSAgLyogbnVtYmVyIG9mIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBleGVjdXRlZCBmb3IgYSBzaW5nbGUgcnVuIG9mIHRoZSAgICAgICovCi0gIC8qIGJ5dGVjb2RlIGludGVycHJldGVyLCBuZWVkZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy4gIFlvdSBkb24ndCAgICAqLwotICAvKiB3YW50IHRvIGNoYW5nZSB0aGlzIGV4Y2VwdCBmb3IgdmVyeSBzcGVjaWFsIHNpdHVhdGlvbnMgKGUuZy4sIG1ha2luZyAgKi8KLSAgLyogYSBsaWJyYXJ5IGZ1enplciBzcGVuZCBsZXNzIHRpbWUgdG8gaGFuZGxlIGJyb2tlbiBmb250cykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBpcyBub3QgZXhwZWN0ZWQgdGhhdCB0aGlzIHZhbHVlIGlzIGV2ZXIgbW9kaWZpZWQgYnkgYSBjb25maWd1cmluZyAgKi8KLSAgLyogc2NyaXB0OyBpbnN0ZWFkLCBpdCBnZXRzIHN1cnJvdW5kZWQgd2l0aCAjaWZuZGVmIC4uLiAjZW5kaWYgc28gdGhhdCAgICovCi0gIC8qIHRoZSB2YWx1ZSBjYW4gYmUgc2V0IGFzIGEgcHJlcHJvY2Vzc29yIG9wdGlvbiBvbiB0aGUgY29tcGlsZXIncyAgICAgICAqLwotICAvKiBjb21tYW5kIGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBPcHRpb24gYFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVNgIGNvbnRyb2xzIHRoZSBtYXhpbXVtCisgICAqIG51bWJlciBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnMgZXhlY3V0ZWQgZm9yIGEgc2luZ2xlIHJ1biBvZiB0aGUKKyAgICogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLiAgWW91IGRvbid0IHdhbnQKKyAgICogdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5IHNwZWNpYWwgc2l0dWF0aW9ucyAoZS5nLiwgbWFraW5nIGEKKyAgICogbGlicmFyeSBmdXp6ZXIgc3BlbmQgbGVzcyB0aW1lIHRvIGhhbmRsZSBicm9rZW4gZm9udHMpLgorICAgKgorICAgKiBJdCBpcyBub3QgZXhwZWN0ZWQgdGhhdCB0aGlzIHZhbHVlIGlzIGV2ZXIgbW9kaWZpZWQgYnkgYSBjb25maWd1cmluZworICAgKiBzY3JpcHQ7IGluc3RlYWQsIGl0IGdldHMgc3Vycm91bmRlZCB3aXRoIGAjaWZuZGVmIC4uLiAjZW5kaWZgIHNvIHRoYXQKKyAgICogdGhlIHZhbHVlIGNhbiBiZSBzZXQgYXMgYSBwcmVwcm9jZXNzb3Igb3B0aW9uIG9uIHRoZSBjb21waWxlcidzIGNvbW1hbmQKKyAgICogbGluZS4KKyAgICovCiAjaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fTUFYX1JVTk5BQkxFX09QQ09ERVMKICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUyAgMTAwMDAwMEwKICNlbmRpZgpAQCAtNzI2LDU5ICs3NDAsNTggQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9ESUNUX0RFUFRIIGlzIHRoZSBtYXhpbXVtIGRlcHRoIG9mIG5lc3QgZGljdGlvbmFyaWVzIGFuZCAgICAgICAqLwotICAvKiBhcnJheXMgaW4gdGhlIFR5cGUgMSBzdHJlYW0gKHNlZSB0MWxvYWQuYykuICBBIG1pbmltdW0gb2YgNCBpcyAgICAgICAgKi8KLSAgLyogcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogYFQxX01BWF9ESUNUX0RFUFRIYCBpcyB0aGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0IGRpY3Rpb25hcmllcyBhbmQgYXJyYXlzCisgICAqIGluIHRoZSBUeXBlfjEgc3RyZWFtIChzZWUgYHQxbG9hZC5jYCkuICBBIG1pbmltdW0gb2Z+NCBpcyByZXF1aXJlZC4KKyAgICovCiAjZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLwotICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBgVDFfTUFYX1NVQlJTX0NBTExTYCBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUKKyAgICogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuCisgICAqLwogI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDE2CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFQxX01BWF9DSEFSU1RSSU5HX09QRVJBTkRTIGlzIHRoZSBjaGFyc3RyaW5nIHN0YWNrJ3MgY2FwYWNpdHkuICBBICAgICAqLwotICAvKiBtaW5pbXVtIG9mIDE2IGlzIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBDaGluZXNlIGZvbnQgTWluZ1RpRUctTWVkaXVtIChDTlMgMTE2NDMgY2hhcmFjdGVyIHNldCkgbmVlZHMgMjU2LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIGBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EU2AgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEKKyAgICogbWluaW11bSBvZn4xNiBpcyByZXF1aXJlZC4KKyAgICoKKyAgICogVGhlIENoaW5lc2UgZm9udCAnTWluZ1RpRUctTWVkaXVtJyAoY292ZXJpbmcgdGhlIENOUyAxMTY0MyBjaGFyYWN0ZXIKKyAgICogc2V0KSBuZWVkcyAyNTYuCisgICAqLwogI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDI1NgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCi0gIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLwotICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlIGNvbXBpbGF0aW9uCisgICAqIG9mIHRoZSAndDFhZm0nIG1vZHVsZSwgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZX4xIEFGTSBmaWxlcworICAgKiBpbnRvIGFuIGV4aXN0aW5nIGZhY2UuICBOb3RlIHRoYXQgaWYgc2V0LCB0aGUgVHlwZX4xIGRyaXZlciB3aWxsIGJlCisgICAqIHVuYWJsZSB0byBwcm9kdWNlIGtlcm5pbmcgZGlzdGFuY2VzLgorICAgKi8KICN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlIDEgICAgICAgICovCi0gIC8qIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgY29tcGlsYXRpb24KKyAgICogb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlfjEgZHJpdmVyLgorICAgKi8KICN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHByZS1BZG9iZSBUeXBlIDEgICAgICovCi0gIC8qIGVuZ2luZSBnZXRzIGNvbXBpbGVkIGludG8gRnJlZVR5cGUuICBJZiBkZWZpbmVkLCBpdCBpcyBwb3NzaWJsZSB0byAgICAqLwotICAvKiBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIGVuZ2luZXMgdXNpbmcgdGhlIGBoaW50aW5nLWVuZ2luZScgcHJvcGVydHkgb2YgKi8KLSAgLyogdGhlIHR5cGUxIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogYFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIFR5cGV+MQorICAgKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8KKyAgICogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmVgIHByb3BlcnR5IG9mCisgICAqIHRoZSAndHlwZTEnIGRyaXZlciBtb2R1bGUuCisgICAqLwogLyogI2RlZmluZSBUMV9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KIAogCkBAIC03OTEsMTcgKzgwNCwxNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCi0gIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLwotICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KLSAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgKGZpbGUgYGZ0ZHJpdmVyLmgnKSwgd2hpY2ggYWxsb3dzIHRoZSAqLwotICAvKiBjb250cm9sIGF0IHJ1bi10aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFVzaW5nIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX3tYLFl9ezEsMiwzLDR9YCBpdCBpcworICAgKiBwb3NzaWJsZSB0byBzZXQgdXAgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBmb3VyIGNvbnRyb2wgcG9pbnRzIHRoYXQKKyAgICogZGVmaW5lIHRoZSBzdGVtIGRhcmtlbmluZyBiZWhhdmlvdXIgb2YgdGhlIChuZXcpIENGRiBlbmdpbmUuICBGb3IgbW9yZQorICAgKiBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBgZGFya2VuaW5nLXBhcmFtZXRlcnNgCisgICAqIHByb3BlcnR5IChmaWxlIGBmdGRyaXZlci5oYCksIHdoaWNoIGFsbG93cyB0aGUgY29udHJvbCBhdCBydW4tdGltZS4KKyAgICoKKyAgICogRG8gKipub3QqKiB1bmRlZmluZSB0aGVzZSBtYWNyb3MhCisgICAqLwogI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxICAgNTAwCiAjZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgICA0MDAKIApAQCAtODE1LDEzICs4MjcsMTMgQEAKICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNCAgICAgMAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHByZS1BZG9iZSBDRkYgICAgICAgKi8KLSAgLyogZW5naW5lIGdldHMgY29tcGlsZWQgaW50byBGcmVlVHlwZS4gIElmIGRlZmluZWQsIGl0IGlzIHBvc3NpYmxlIHRvICAgICovCi0gIC8qIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gZW5naW5lcyB1c2luZyB0aGUgYGhpbnRpbmctZW5naW5lJyBwcm9wZXJ0eSBvZiAqLwotICAvKiB0aGUgY2ZmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiBlbmdpbmUKKyAgICogZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gc3dpdGNoCisgICAqIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmVgIHByb3BlcnR5IG9mIHRoZSAnY2ZmJworICAgKiBkcml2ZXIgbW9kdWxlLgorICAgKi8KIC8qICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLwogCiAKQEAgLTgzNCwyMSArODQ2LDIxIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbWFueSBQQ0YgZm9udHMganVzdCBjYWxsZWQgYEZpeGVkJyB3aGljaCBsb29rIGNvbXBsZXRlbHkgICAgKi8KLSAgLyogZGlmZmVyZW50LCBhbmQgd2hpY2ggaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggZWFjaCBvdGhlci4gIFdoZW4gICAgICAgICovCi0gIC8qIHNlbGVjdGluZyBgRml4ZWQnIGluIEtERSBvciBHbm9tZSBvbmUgZ2V0cyByZXN1bHRzIHRoYXQgYXBwZWFyIHJhdGhlciAqLwotICAvKiByYW5kb20sIHRoZSBzdHlsZSBjaGFuZ2VzIG9mdGVuIGlmIG9uZSBjaGFuZ2VzIHRoZSBzaXplIGFuZCBvbmUgICAgICAgKi8KLSAgLyogY2Fubm90IHNlbGVjdCBzb21lIGZvbnRzIGF0IGFsbC4gIFRoaXMgb3B0aW9uIG1ha2VzIHRoZSBQQ0YgbW9kdWxlICAgICovCi0gIC8qIHByZXBlbmQgdGhlIGZvdW5kcnkgbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgYWxzbyBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYHdpZGUnIGNoYXJhY3RlcnM7IGFsbCBwdXQgdG9nZXRoZXIsIHdlICovCi0gIC8qIGdldCBmYW1pbHkgbmFtZXMgbGlrZSBgU29ueSBGaXhlZCcgb3IgYE1pc2MgRml4ZWQgV2lkZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCBpdCBjYW4gYmUgY29udHJvbGxlZCB3aXRoIHRoZSAgICAgICAgICAgICovCi0gIC8qIGBuby1sb25nLWZhbWlseS1uYW1lcycgcHJvcGVydHkgb2YgdGhlIHBjZiBkcml2ZXIgbW9kdWxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCAnRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseQorICAgKiBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiBzZWxlY3RpbmcKKyAgICogJ0ZpeGVkJyBpbiBLREUgb3IgR25vbWUgb25lIGdldHMgcmVzdWx0cyB0aGF0IGFwcGVhciByYXRoZXIgcmFuZG9tLCB0aGUKKyAgICogc3R5bGUgY2hhbmdlcyBvZnRlbiBpZiBvbmUgY2hhbmdlcyB0aGUgc2l6ZSBhbmQgb25lIGNhbm5vdCBzZWxlY3Qgc29tZQorICAgKiBmb250cyBhdCBhbGwuICBUaGlzIG9wdGlvbiBtYWtlcyB0aGUgJ3BjZicgbW9kdWxlIHByZXBlbmQgdGhlIGZvdW5kcnkKKyAgICogbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuCisgICAqCisgICAqIFdlIGFsc28gY2hlY2sgd2hldGhlciB3ZSBoYXZlICd3aWRlJyBjaGFyYWN0ZXJzOyBhbGwgcHV0IHRvZ2V0aGVyLCB3ZQorICAgKiBnZXQgZmFtaWx5IG5hbWVzIGxpa2UgJ1NvbnkgRml4ZWQnIG9yICdNaXNjIEZpeGVkIFdpZGUnLgorICAgKgorICAgKiBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIGl0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlCisgICAqIGBuby1sb25nLWZhbWlseS1uYW1lc2AgcHJvcGVydHkgb2YgdGhlICdwY2YnIGRyaXZlciBtb2R1bGUuCisgICAqLwogLyogI2RlZmluZSBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUyAqLwogCiAKQEAgLTg2MSw2OSArODczLDc4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQgICAgKi8KLSAgLyogc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ29tcGlsZSAnYXV0b2ZpdCcgbW9kdWxlIHdpdGggQ0pLIChDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuKSBzY3JpcHQKKyAgICogc3VwcG9ydC4KKyAgICovCiAjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggZmFsbGJhY2sgSW5kaWMgc2NyaXB0IHN1cHBvcnQsIGNvdmVyaW5nICAgKi8KLSAgLyogc29tZSBzY3JpcHRzIHRoYXQgdGhlIGBsYXRpbicgc3VibW9kdWxlIG9mIHRoZSBhdXRvZml0IG1vZHVsZSBkb2Vzbid0ICovCi0gIC8qICh5ZXQpIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9JTkRJQwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIHdhcnAgaGludGluZy4gIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nICAgICovCi0gIC8qIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiAqLwotICAvKiBzbyB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIG9uIHRoZSAgICAgKi8KLSAgLyogZ3JpZC4gIFRvIGZpbmQgb3V0IHRoZSBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzICAgICovCi0gIC8qIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBleHBlcmltZW50YWwgb3B0aW9uIGlzIGFjdGl2ZSBvbmx5IGlmIHRoZSByZW5kZXJpbmcgbW9kZSBpcyAgICAgICovCi0gIC8qIEZUX1JFTkRFUl9NT0RFX0xJR0hUOyB5b3UgY2FuIHN3aXRjaCB3YXJwaW5nIG9uIGFuZCBvZmYgd2l0aCB0aGUgICAgICAqLwotICAvKiBgd2FycGluZycgcHJvcGVydHkgb2YgdGhlIGF1dG8taGludGVyIChzZWUgZmlsZSBgZnRkcml2ZXIuaCcgZm9yIG1vcmUgKi8KLSAgLyogaW5mb3JtYXRpb247IGJ5IGRlZmF1bHQgaXQgaXMgc3dpdGNoZWQgb2ZmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ29tcGlsZSAnYXV0b2ZpdCcgbW9kdWxlIHdpdGggZmFsbGJhY2sgSW5kaWMgc2NyaXB0IHN1cHBvcnQsIGNvdmVyaW5nCisgICAqIHNvbWUgc2NyaXB0cyB0aGF0IHRoZSAnbGF0aW4nIHN1Ym1vZHVsZSBvZiB0aGUgJ2F1dG9maXQnIG1vZHVsZSBkb2Vzbid0CisgICAqICh5ZXQpIGhhbmRsZS4gIEN1cnJlbnRseSwgdGhpcyBuZWVkcyBvcHRpb24gYEFGX0NPTkZJR19PUFRJT05fQ0pLYC4KKyAgICovCisjaWZkZWYgQUZfQ09ORklHX09QVElPTl9DSksKKyNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9JTkRJQworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ29tcGlsZSAnYXV0b2ZpdCcgbW9kdWxlIHdpdGggd2FycCBoaW50aW5nLiAgVGhlIGlkZWEgb2YgdGhlIHdhcnBpbmcKKyAgICogY29kZSBpcyB0byBzbGlnaHRseSBzY2FsZSBhbmQgc2hpZnQgYSBnbHlwaCB3aXRoaW4gYSBzaW5nbGUgZGltZW5zaW9uIHNvCisgICAqIHRoYXQgYXMgbXVjaCBvZiBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQgKG1vcmUgb3IgbGVzcykgb24gdGhlIGdyaWQuICBUbworICAgKiBmaW5kIG91dCB0aGUgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cyBwYXJhbWV0ZXIKKyAgICogY29tYmluYXRpb25zIGFyZSB0cmllZCBhbmQgc2NvcmVkLgorICAgKgorICAgKiBZb3UgY2FuIHN3aXRjaCB3YXJwaW5nIG9uIGFuZCBvZmYgd2l0aCB0aGUgYHdhcnBpbmdgIHByb3BlcnR5IG9mIHRoZQorICAgKiBhdXRvLWhpbnRlciAoc2VlIGZpbGUgYGZ0ZHJpdmVyLmhgIGZvciBtb3JlIGluZm9ybWF0aW9uOyBieSBkZWZhdWx0IGl0CisgICAqIGlzIHN3aXRjaGVkIG9mZikuCisgICAqCisgICAqIFRoaXMgZXhwZXJpbWVudGFsIG9wdGlvbiBpcyBub3QgYWN0aXZlIGlmIHRoZSByZW5kZXJpbmcgbW9kZSBpcworICAgKiBgRlRfUkVOREVSX01PREVfTElHSFRgLgorICAgKi8KICNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9VU0VfV0FSUEVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVc2UgVHJ1ZVR5cGUtbGlrZSBzaXplIG1ldHJpY3MgZm9yIGBsaWdodCcgYXV0by1oaW50aW5nLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGF2b2lkIHRoaXMgb3B0aW9uLCB3aGljaCBleGlzdHMgb25seSB0byAqLwotICAvKiBoZWxwIHNvbWUgbGVnYWN5IGFwcGxpY2F0aW9ucyByZXRhaW4gaXRzIGFwcGVhcmFuY2UgYW5kIGJlaGF2aW91ciAgICAgKi8KLSAgLyogd2l0aCByZXNwZWN0IHRvIGF1dG8taGludGVkIFRydWVUeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgdmVyeSByZWFzb24gdGhpcyBvcHRpb24gZXhpc3RzIGF0IGFsbCBhcmUgR05VL0xpbnV4IGRpc3RyaWJ1dGlvbnMgKi8KLSAgLyogbGlrZSBGZWRvcmEgdGhhdCBkaWQgbm90IHVuLXBhdGNoIHRoZSBmb2xsb3dpbmcgY2hhbmdlICh3aGljaCB3YXMgICAgICovCi0gIC8qIHByZXNlbnQgaW4gRnJlZVR5cGUgYmV0d2VlbiB2ZXJzaW9ucyAyLjQuNiBhbmQgMi43LjEsIGluY2x1c2l2ZSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAyMDExLTA3LTE2ICBTdGV2ZW4gQ2h1ICA8c3RldmVuLmYuY2h1QGdtYWlsLmNvbT4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgW3RydWV0eXBlXSBGaXggbWV0cmljcyBvbiBzaXplIHJlcXVlc3QgZm9yIHNjYWxhYmxlIGZvbnRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgcHJvYmxlbWF0aWMgY29tbWl0IGlzIG5vdyByZXZlcnRlZCAobW9yZSBvciBsZXNzKS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVXNlIFRydWVUeXBlLWxpa2Ugc2l6ZSBtZXRyaWNzIGZvciAnbGlnaHQnIGF1dG8taGludGluZy4KKyAgICoKKyAgICogSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYXZvaWQgdGhpcyBvcHRpb24sIHdoaWNoIGV4aXN0cyBvbmx5IHRvCisgICAqIGhlbHAgc29tZSBsZWdhY3kgYXBwbGljYXRpb25zIHJldGFpbiBpdHMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyIHdpdGgKKyAgICogcmVzcGVjdCB0byBhdXRvLWhpbnRlZCBUcnVlVHlwZSBmb250cy4KKyAgICoKKyAgICogVGhlIHZlcnkgcmVhc29uIHRoaXMgb3B0aW9uIGV4aXN0cyBhdCBhbGwgYXJlIEdOVS9MaW51eCBkaXN0cmlidXRpb25zCisgICAqIGxpa2UgRmVkb3JhIHRoYXQgZGlkIG5vdCB1bi1wYXRjaCB0aGUgZm9sbG93aW5nIGNoYW5nZSAod2hpY2ggd2FzCisgICAqIHByZXNlbnQgaW4gRnJlZVR5cGUgYmV0d2VlbiB2ZXJzaW9ucyAyLjQuNiBhbmQgMi43LjEsIGluY2x1c2l2ZSkuCisgICAqCisgICAqIGBgYAorICAgKiAgIDIwMTEtMDctMTYgIFN0ZXZlbiBDaHUgIDxzdGV2ZW4uZi5jaHVAZ21haWwuY29tPgorICAgKgorICAgKiAgICAgW3RydWV0eXBlXSBGaXggbWV0cmljcyBvbiBzaXplIHJlcXVlc3QgZm9yIHNjYWxhYmxlIGZvbnRzLgorICAgKiBgYGAKKyAgICoKKyAgICogVGhpcyBwcm9ibGVtYXRpYyBjb21taXQgaXMgbm93IHJldmVydGVkIChtb3JlIG9yIGxlc3MpLgorICAgKi8KIC8qICNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9UVF9TSVpFX01FVFJJQ1MgKi8KIAogICAvKiAqLwogCiAKICAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBvYnNvbGV0ZS4gIFN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBGcmVlVHlwZQotICAgKiB2ZXJzaW9uIDIuNS4KKyAgICogVGhpcyBtYWNybyBpcyBvYnNvbGV0ZS4gIFN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBGcmVlVHlwZSB2ZXJzaW9uCisgICAqIDIuNS4KICAgICovCiAvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwogCiAKICAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBkZWZpbmVkIGlmIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIGlzIHJlcXVlc3RlZCBieSB0aGUKLSAgICogZGVmaW5pdGlvbnMgYWJvdmUuCisgICAqIFRoZSBuZXh0IHRocmVlIG1hY3JvcyBhcmUgZGVmaW5lZCBpZiBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBpcworICAgKiByZXF1ZXN0ZWQgYnkgdGhlIGRlZmluaXRpb25zIGFib3ZlLiAgRG9uJ3QgY2hhbmdlIHRoaXMuCiAgICAqLwogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIKICNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgpAQCAtOTQyLDcgKzk2Myw3IEBACiAKICAgLyoKICAgICogQ2hlY2sgQ0ZGIGRhcmtlbmluZyBwYXJhbWV0ZXJzLiAgVGhlIGNoZWNrcyBhcmUgdGhlIHNhbWUgYXMgaW4gZnVuY3Rpb24KLSAgICogYGNmZl9wcm9wZXJ0eV9zZXQnIGluIGZpbGUgYGNmZmRyaXZyLmMnLgorICAgKiBgY2ZmX3Byb3BlcnR5X3NldGAgaW4gZmlsZSBgY2ZmZHJpdnIuY2AuCiAgICAqLwogI2lmIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPCAwICAgfHwgXAogICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPCAwICAgfHwgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmgKaW5kZXggNDJmOWEwNi4uZDYwOTFmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oCkBAIC0xLDMxICsxLDMxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0ZGxpYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQU5TSS1zcGVjaWZpYyBsaWJyYXJ5IGFuZCBoZWFkZXIgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzdGRsaWIuaAorICoKKyAqICAgQU5TSS1zcGVjaWZpYyBsaWJyYXJ5IGFuZCBoZWFkZXIgY29uZmlndXJhdGlvbiBmaWxlIChzcGVjaWZpY2F0aW9uCisgKiAgIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGFsbCAjaW5jbHVkZXMgdG8gdGhlIEFOU0kgQyBsaWJyYXJ5IHRoYXQgICAqLwotICAvKiBGcmVlVHlwZSBub3JtYWxseSByZXF1aXJlcy4gIEl0IGFsc28gZGVmaW5lcyBtYWNyb3MgdG8gcmVuYW1lIHRoZSAgICAgKi8KLSAgLyogc3RhbmRhcmQgZnVuY3Rpb25zIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIEZUU1RETElCX0hfIGJlZm9yZSB0aGlzIG9uZSB0byBvdmVycmlkZSBpdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZ3JvdXAgYWxsIGAjaW5jbHVkZXNgIHRvIHRoZSBBTlNJfkMgbGlicmFyeSB0aGF0CisgICAqIEZyZWVUeXBlIG5vcm1hbGx5IHJlcXVpcmVzLiAgSXQgYWxzbyBkZWZpbmVzIG1hY3JvcyB0byByZW5hbWUgdGhlCisgICAqIHN0YW5kYXJkIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlLgorICAgKgorICAgKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIGBGVFNURExJQl9IX2AgYmVmb3JlIHRoaXMgb25lIHRvIG92ZXJyaWRlIGl0LgorICAgKgorICAgKi8KIAogCiAjaWZuZGVmIEZUU1RETElCX0hfCkBAIC0zNywyMyArMzcsMjMgQEAKICNkZWZpbmUgZnRfcHRyZGlmZl90ICBwdHJkaWZmX3QKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIGxpbWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVSU5UX01BWCBhbmQgVUxPTkdfTUFYIGFyZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGUgc2l6ZSAgKi8KLSAgLyogb2YgYGludCcgYW5kIGBsb25nJyBpbiBieXRlcyBhdCBjb21waWxlLXRpbWUuICBTbyBmYXIsIHRoaXMgd29ya3MgICovCi0gIC8qIGZvciBhbGwgcGxhdGZvcm1zIHRoZSBsaWJyYXJ5IGhhcyBiZWVuIHRlc3RlZCBvbi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IG9uIHRoZSBleHRyZW1lbHkgcmFyZSBwbGF0Zm9ybXMgdGhhdCBkbyBub3QgcHJvdmlkZSAgICAgICovCi0gIC8qIGludGVnZXIgdHlwZXMgdGhhdCBhcmUgX2V4YWN0bHlfIDE2IGFuZCAzMiBiaXRzIHdpZGUgKGUuZy4gc29tZSAgICAqLwotICAvKiBvbGQgQ3JheXMgd2hlcmUgYGludCcgaXMgMzYgYml0cyksIHdlIGRvIG5vdCBtYWtlIGFueSBndWFyYW50ZWUgICAgKi8KLSAgLyogYWJvdXQgdGhlIGNvcnJlY3QgYmVoYXZpb3VyIG9mIEZUMiB3aXRoIGFsbCBmb250cy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbiB0aGVzZSBjYXNlLCBgZnRjb25maWcuaCcgd2lsbCByZWZ1c2UgdG8gY29tcGlsZSBhbnl3YXkgd2l0aCBhICAgKi8KLSAgLyogbWVzc2FnZSBsaWtlIGBjb3VsZG4ndCBmaW5kIDMyLWJpdCB0eXBlJyBvciBzb21ldGhpbmcgc2ltaWxhci4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIGxpbWl0cworICAgKgorICAgKiBgVUlOVF9NQVhgIGFuZCBgVUxPTkdfTUFYYCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgb2YKKyAgICogYGludGAgYW5kIGBsb25nYCBpbiBieXRlcyBhdCBjb21waWxlLXRpbWUuICBTbyBmYXIsIHRoaXMgd29ya3MgZm9yIGFsbAorICAgKiBwbGF0Zm9ybXMgdGhlIGxpYnJhcnkgaGFzIGJlZW4gdGVzdGVkIG9uLgorICAgKgorICAgKiBOb3RlIHRoYXQgb24gdGhlIGV4dHJlbWVseSByYXJlIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBwcm92aWRlIGludGVnZXIKKyAgICogdHlwZXMgdGhhdCBhcmUgX2V4YWN0bHlfIDE2IGFuZCAzMn5iaXRzIHdpZGUgKGUuZy4sIHNvbWUgb2xkIENyYXlzIHdoZXJlCisgICAqIGBpbnRgIGlzIDM2fmJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlIGFib3V0IHRoZSBjb3JyZWN0CisgICAqIGJlaGF2aW91ciBvZiBGcmVlVHlwZX4yIHdpdGggYWxsIGZvbnRzLgorICAgKgorICAgKiBJbiB0aGVzZSBjYXNlcywgYGZ0Y29uZmlnLmhgIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYQorICAgKiBtZXNzYWdlIGxpa2UgJ2NvdWxkbid0IGZpbmQgMzItYml0IHR5cGUnIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICAgKgorICAgKi8KIAogCiAjaW5jbHVkZSA8bGltaXRzLmg+CkBAIC02OCwxMSArNjgsMTEgQEAKICNkZWZpbmUgRlRfVUxPTkdfTUFYICAgVUxPTkdfTUFYCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nCisgICAqCisgICAqLwogCiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTkyLDExICs5MiwxMSBAQAogI2RlZmluZSBmdF9zdHJzdHIgICBzdHJzdHIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nCisgICAqCisgICAqLwogCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMTEwLDExICsxMTAsMTEgQEAKICNkZWZpbmUgZnRfc3ByaW50ZiAgc3ByaW50ZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGluZworICAgKgorICAgKi8KIAogCiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogI2RlZmluZSBmdF9xc29ydCAgcXNvcnQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbgorICAgKgorICAgKi8KIAogCiAjZGVmaW5lIGZ0X3NjYWxsb2MgICBjYWxsb2MKQEAgLTEzNSwzNiArMTM1LDM2IEBACiAjZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzCisgICAqCisgICAqLwogCiAKICNkZWZpbmUgZnRfc3RydG9sICBzdHJ0b2wKICNkZWZpbmUgZnRfZ2V0ZW52ICBnZXRlbnYKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGNvbnRyb2wKKyAgICoKKyAgICovCiAKIAogI2luY2x1ZGUgPHNldGptcC5oPgogCi0jZGVmaW5lIGZ0X2ptcF9idWYgICAgIGptcF9idWYgIC8qIG5vdGU6IHRoaXMgY2Fubm90IGJlIGEgdHlwZWRlZiBzaW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBqbXBfYnVmIGlzIGRlZmluZWQgYXMgYSBtYWNybyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgb24gY2VydGFpbiBwbGF0Zm9ybXMgICAgICAgICAgICovCisjZGVmaW5lIGZ0X2ptcF9idWYgICAgIGptcF9idWYgIC8qIG5vdGU6IHRoaXMgY2Fubm90IGJlIGEgdHlwZWRlZiBzaW5jZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgYGptcF9idWZgIGlzIGRlZmluZWQgYXMgYSBtYWNybyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBvbiBjZXJ0YWluIHBsYXRmb3JtcyAgICAgICAgICAgICovCiAKICNkZWZpbmUgZnRfbG9uZ2ptcCAgICAgbG9uZ2ptcAogI2RlZmluZSBmdF9zZXRqbXAoIGIgKSBzZXRqbXAoICooZnRfam1wX2J1ZiopICYoYikgKSAvKiBzYW1lIHRoaW5nIGhlcmUgKi8KIAogCi0gIC8qIHRoZSBmb2xsb3dpbmcgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGkuZS4sIGlmICovCi0gIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SIG9yIEZUX0RFQlVHX0xFVkVMX1RSQUNFIGFyZSBkZWZpbmVkICAgICovCisgIC8qIFRoZSBmb2xsb3dpbmcgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGkuZS4sIGlmICAgKi8KKyAgLyogYEZUX0RFQlVHX0xFVkVMX0VSUk9SYCBvciBgRlRfREVCVUdfTEVWRUxfVFJBQ0VgIGFyZSBkZWZpbmVkLiAqLwogCiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2ludGVnZXItdHlwZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2ludGVnZXItdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNhMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvaW50ZWdlci10eXBlcy5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNvbmZpZy9pbnRlZ2VyLXR5cGVzLmgKKyAqCisgKiAgIEZyZWVUeXBlIGludGVnZXIgdHlwZXMgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KKyNpZm5kZWYgRlJFRVRZUEVfQ09ORklHX0lOVEVHRVJfVFlQRVNfSF8KKyNkZWZpbmUgRlJFRVRZUEVfQ09ORklHX0lOVEVHRVJfVFlQRVNfSF8KKworICAvKiBUaGVyZSBhcmUgc3lzdGVtcyAobGlrZSB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgJ0M1NHgpIHdoZXJlIGEgYGNoYXJgICAqLworICAvKiBoYXMgMTZ+Yml0cy4gIEFOU0l+QyBzYXlzIHRoYXQgYHNpemVvZihjaGFyKWAgaXMgYWx3YXlzfjEuICBTaW5jZSBhbiAqLworICAvKiBgaW50YCBoYXMgMTZ+Yml0cyBhbHNvIGZvciB0aGlzIHN5c3RlbSwgYHNpemVvZihpbnQpYCBnaXZlc34xIHdoaWNoICAqLworICAvKiBpcyBwcm9iYWJseSB1bmV4cGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBgQ0hBUl9CSVRgIChkZWZpbmVkIGluIGBsaW1pdHMuaGApIGdpdmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhICAgICAqLworICAvKiBgY2hhcmAgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZuZGVmIEZUX0NIQVJfQklUCisjZGVmaW5lIEZUX0NIQVJfQklUICBDSEFSX0JJVAorI2VuZGlmCisKKyNpZm5kZWYgRlRfU0laRU9GX0lOVAorCisgIC8qIFRoZSBzaXplIG9mIGFuIGBpbnRgIHR5cGUuICovCisjaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSU5UX01BWCA9PSAweEZGRkZVTAorI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoIDE2IC8gRlRfQ0hBUl9CSVQgKQorI2VsaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRlVMCisjZGVmaW5lIEZUX1NJWkVPRl9JTlQgICggMzIgLyBGVF9DSEFSX0JJVCApCisjZWxpZiBGVF9VSU5UX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VSU5UX01BWCA9PSAweEZGRkZGRkZGRkZGRkZGRkZVTAorI2RlZmluZSBGVF9TSVpFT0ZfSU5UICAoIDY0IC8gRlRfQ0hBUl9CSVQgKQorI2Vsc2UKKyNlcnJvciAiVW5zdXBwb3J0ZWQgc2l6ZSBvZiBgaW50JyB0eXBlISIKKyNlbmRpZgorCisjZW5kaWYgIC8qICFkZWZpbmVkKEZUX1NJWkVPRl9JTlQpICovCisKKyNpZm5kZWYgRlRfU0laRU9GX0xPTkcKKworICAvKiBUaGUgc2l6ZSBvZiBhIGBsb25nYCB0eXBlLiAgQSBmaXZlLWJ5dGUgYGxvbmdgIChhcyB1c2VkIGUuZy4gb24gdGhlICovCisgIC8qIERNNjQyKSBpcyByZWNvZ25pemVkIGJ1dCBhdm9pZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRlVMCisjZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoIDMyIC8gRlRfQ0hBUl9CSVQgKQorI2VsaWYgRlRfVUxPTkdfTUFYID4gMHhGRkZGRkZGRlVMICYmIEZUX1VMT05HX01BWCA9PSAweEZGRkZGRkZGRkZVTAorI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKCAzMiAvIEZUX0NIQVJfQklUICkKKyNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKKyNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICggNjQgLyBGVF9DSEFSX0JJVCApCisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBsb25nJyB0eXBlISIKKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoRlRfU0laRU9GX0xPTkcpICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGJhc2ljX3R5cGVzCisgICAqCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0ludDE2CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHR5cGVkZWYgZm9yIGEgMTZiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4KKyAgICovCisgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9JbnQxNjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9VSW50MTYKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuCisgICAqLworICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VSW50MTY7CisKKyAgLyogKi8KKworCisgIC8qIHRoaXMgI2lmIDAgLi4uICNlbmRpZiBjbGF1c2UgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgKi8KKyNpZiAwCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0ludDMyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHR5cGVkZWYgZm9yIGEgMzJiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisgICAqICAgY29uZmlndXJhdGlvbi4KKyAgICovCisgIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50MzI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfVUludDMyCisgICAqCisgICAqICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisgICAqICAgY29uZmlndXJhdGlvbi4KKyAgICovCisgIHR5cGVkZWYgdW5zaWduZWQgWFhYICBGVF9VSW50MzI7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfSW50NjQKKyAgICoKKyAgICogICBBIHR5cGVkZWYgZm9yIGEgNjRiaXQgc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gdGhlCisgICAqICAgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7CisgICAqICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuCisgICAqLworICB0eXBlZGVmIHNpZ25lZCBYWFggIEZUX0ludDY0OworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX1VJbnQ2NAorICAgKgorICAgKiAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uIHRoZQorICAgKiAgIGNvbmZpZ3VyYXRpb24uICBPbmx5IGRlZmluZWQgaWYgdGhlcmUgaXMgcmVhbCA2NGJpdCBzdXBwb3J0OworICAgKiAgIG90aGVyd2lzZSwgaXQgZ2V0cyBlbXVsYXRlZCB3aXRoIGEgc3RydWN0dXJlIChpZiBuZWNlc3NhcnkpLgorICAgKi8KKyAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQ2NDsKKworICAvKiAqLworCisjZW5kaWYKKworI2lmIEZUX1NJWkVPRl9JTlQgPT0gKCAzMiAvIEZUX0NIQVJfQklUICkKKworICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOworCisjZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoIDMyIC8gRlRfQ0hBUl9CSVQgKQorCisgIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgIEZUX0ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBGVF9VSW50MzI7CisKKyNlbHNlCisjZXJyb3IgIm5vIDMyYml0IHR5cGUgZm91bmQgLS0gcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlcyIKKyNlbmRpZgorCisKKyAgLyogbG9vayB1cCBhbiBpbnRlZ2VyIHR5cGUgdGhhdCBpcyBhdCBsZWFzdCAzMn5iaXRzICovCisjaWYgRlRfU0laRU9GX0lOVCA+PSAoIDMyIC8gRlRfQ0hBUl9CSVQgKQorCisgIHR5cGVkZWYgaW50ICAgICAgICAgICAgRlRfRmFzdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VRmFzdDsKKworI2VsaWYgRlRfU0laRU9GX0xPTkcgPj0gKCAzMiAvIEZUX0NIQVJfQklUICkKKworICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7CisKKyNlbmRpZgorCisKKyAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBgaW50YCB0eXBlIGZvciBwbGF0Zm9ybXMgd2l0aG91dCAqLworICAvKiBBdXRvY29uZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWYgRlRfU0laRU9GX0xPTkcgPT0gKCA2NCAvIEZUX0NIQVJfQklUICkKKworICAvKiBgRlRfTE9ORzY0YCBtdXN0IGJlIGRlZmluZWQgaWYgYSA2NC1iaXQgdHlwZSBpcyBhdmFpbGFibGUgKi8KKyNkZWZpbmUgRlRfTE9ORzY0CisjZGVmaW5lIEZUX0lOVDY0ICAgbG9uZworI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQSA2NC1iaXQgZGF0YSB0eXBlIG1heSBjcmVhdGUgY29tcGlsYXRpb24gcHJvYmxlbXMgaWYgeW91IGNvbXBpbGUgaW4KKyAgICogc3RyaWN0IEFOU0kgbW9kZS4gIFRvIGF2b2lkIHRoZW0sIHdlIGRpc2FibGUgb3RoZXIgNjQtYml0IGRhdGEgdHlwZXMgaWYKKyAgICogYF9fU1REQ19fYCBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGlnbm9yZSB0aGlzIHJ1bGUgYnkgZGVmaW5pbmcgdGhlCisgICAqIGBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0YCBjb25maWd1cmF0aW9uIG1hY3JvLgorICAgKi8KKyNlbGlmICFkZWZpbmVkKCBfX1NURENfXyApIHx8IGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQgKQorCisjaWYgZGVmaW5lZCggX19TVERDX1ZFUlNJT05fXyApICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorCisjZGVmaW5lIEZUX0xPTkc2NAorI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKKyNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50CisKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCisKKyAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgYF9faW50NjRgIHR5cGUgKi8KKyNkZWZpbmUgRlRfTE9ORzY0CisjZGVmaW5lIEZUX0lOVDY0ICAgX19pbnQ2NAorI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIF9faW50NjQKKworI2VsaWYgZGVmaW5lZCggX19CT1JMQU5EQ19fICkgIC8qIEJvcmxhbmQgQysrICovCisKKyAgLyogWFhYWDogV2Ugc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoZSB2YWx1ZSBvZiBgX19CT1JMQU5EQ19fYCBpbiBvcmRlciAqLworICAvKiAgICAgICB0byB0ZXN0IHRoZSBjb21waWxlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgLyogdGhpcyBjb21waWxlciBwcm92aWRlcyB0aGUgYF9faW50NjRgIHR5cGUgKi8KKyNkZWZpbmUgRlRfTE9ORzY0CisjZGVmaW5lIEZUX0lOVDY0ICAgX19pbnQ2NAorI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIF9faW50NjQKKworI2VsaWYgZGVmaW5lZCggX19XQVRDT01DX18gKSAgIC8qIFdhdGNvbSBDKysgKi8KKworICAvKiBXYXRjb20gZG9lc24ndCBwcm92aWRlIDY0LWJpdCBkYXRhIHR5cGVzICovCisKKyNlbGlmIGRlZmluZWQoIF9fTVdFUktTX18gKSAgICAvKiBNZXRyb3dlcmtzIENvZGVXYXJyaW9yICovCisKKyNkZWZpbmUgRlRfTE9ORzY0CisjZGVmaW5lIEZUX0lOVDY0ICAgbG9uZyBsb25nIGludAorI2RlZmluZSBGVF9VSU5UNjQgIHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQKKworI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorCisgIC8qIEdDQyBwcm92aWRlcyB0aGUgYGxvbmcgbG9uZ2AgdHlwZSAqLworI2RlZmluZSBGVF9MT05HNjQKKyNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50CisjZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAorCisjZW5kaWYgLyogX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMICovCisKKyNlbmRpZiAvKiBGVF9TSVpFT0ZfTE9ORyA9PSAoNjQgLyBGVF9DSEFSX0JJVCkgKi8KKworI2lmZGVmIEZUX0xPTkc2NAorICB0eXBlZGVmIEZUX0lOVDY0ICAgRlRfSW50NjQ7CisgIHR5cGVkZWYgRlRfVUlOVDY0ICBGVF9VSW50NjQ7CisjZW5kaWYKKworCisjZW5kaWYgIC8qIEZSRUVUWVBFX0NPTkZJR19JTlRFR0VSX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9tYWMtc3VwcG9ydC5oIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvbWFjLXN1cHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg2NzA4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvbWFjLXN1cHBvcnQuaApAQCAtMCwwICsxLDQ5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNvbmZpZy9tYWMtc3VwcG9ydC5oCisgKgorICogICBNYWMvT1MgWCBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gaGVhZGVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisjaWZuZGVmIEZSRUVUWVBFX0NPTkZJR19NQUNfU1VQUE9SVF9IXworI2RlZmluZSBGUkVFVFlQRV9DT05GSUdfTUFDX1NVUFBPUlRfSF8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTWFjIHN1cHBvcnQKKyAgICoKKyAgICogICBUaGlzIGlzIHRoZSBvbmx5IG5lY2Vzc2FyeSBjaGFuZ2UsIHNvIGl0IGlzIGRlZmluZWQgaGVyZSBpbnN0ZWFkCisgICAqICAgcHJvdmlkaW5nIGEgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICovCisjaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQorICAvKiBObyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54LiAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBgQXZhaWxhYmlsaXR5TWFjcm9zLmhgIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAqLworICAvKiBzbyBndWVzcyB0aGUgc3lzdGVtIHZlcnNpb24gYnkgbWF4aW11bSBlcnJubyBiZWZvcmUgaW5jbHVzaW9uLiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLworI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgorI2VuZGlmCisjaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCisgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQorI3VuZGVmIEZUX01BQ0lOVE9TSAorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQorICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLworI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCisjaWYgVEFSR0VUX09TX01BQworI2RlZmluZSBGVF9NQUNJTlRPU0ggMQorI2VuZGlmCisKKyNlbmRpZiAgLyogTWFjIHN1cHBvcnQgKi8KKworI2VuZGlmICAvKiBGUkVFVFlQRV9DT05GSUdfTUFDX1NVUFBPUlRfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaCBiL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE2NzNlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvcHVibGljLW1hY3Jvcy5oCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNvbmZpZy9wdWJsaWMtbWFjcm9zLmgKKyAqCisgKiAgIERlZmluZSBhIHNldCBvZiBjb21waWxlciBtYWNyb3MgdXNlZCBpbiBwdWJsaWMgRnJlZVR5cGUgaGVhZGVycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KKworICAvKgorICAgKiBUaGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSB1c2VkIGJ5IHRoZSBwdWJsaWMgRnJlZVR5cGUgaGVhZGVycworICAgKiBhbmQgdGh1cyBzaG91bGQgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLgorICAgKgorICAgKiBPdGhlciBjb21waWxlci1zcGVjaWZpYyBtYWNybyBkZWZpbml0aW9ucyB0aGF0IGFyZSBub3QgZXhwb3NlZCBieSB0aGUKKyAgICogRnJlZVR5cGUgQVBJIHNob3VsZCBnbyBpbnRvCisgICAqIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oYCBpbnN0ZWFkLgorICAgKi8KKyNpZm5kZWYgRlJFRVRZUEVfQ09ORklHX1BVQkxJQ19NQUNST1NfSF8KKyNkZWZpbmUgRlJFRVRZUEVfQ09ORklHX1BVQkxJQ19NQUNST1NfSF8KKworICAvKgorICAgKiBgRlRfQkVHSU5fSEVBREVSYCBhbmQgYEZUX0VORF9IRUFERVJgIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGRlZmluZWQKKyAgICogYnkgYGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oYCwgYnV0IHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGlzCisgICAqIGhlYWRlciBoZXJlLCBzbyByZWRlZmluZSB0aGUgbWFjcm9zIGhlcmUgb25seSB3aGVuIG5lZWRlZC4gIFRoZWlyCisgICAqIGRlZmluaXRpb24gaXMgdmVyeSBzdGFibGUsIHNvIGtlZXBpbmcgdGhlbSBpbiBzeW5jIHdpdGggdGhlIG9uZXMgaW4gdGhlCisgICAqIGhlYWRlciBzaG91bGQgbm90IGJlIGEgbWFpbnRlbmFuY2UgaXNzdWUuCisgICAqLworI2lmbmRlZiBGVF9CRUdJTl9IRUFERVIKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9CRUdJTl9IRUFERVIgIGV4dGVybiAiQyIgeworI2Vsc2UKKyNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYgIC8qIEZUX0JFR0lOX0hFQURFUiAqLworCisjaWZuZGVmIEZUX0VORF9IRUFERVIKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9FTkRfSEVBREVSICB9CisjZWxzZQorI2RlZmluZSBGVF9FTkRfSEVBREVSICAvKiBlbXB0eSAqLworI2VuZGlmCisjZW5kaWYgIC8qIEZUX0VORF9IRUFERVIgKi8KKworCitGVF9CRUdJTl9IRUFERVIKKworICAvKgorICAgKiBNYXJrIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gYXMgcHVibGljLiAgVGhpcyBlbnN1cmVzIGl0IHdpbGwgYmUKKyAgICogcHJvcGVybHkgZXhwb3J0ZWQgdG8gY2xpZW50IGNvZGUuICBQbGFjZSB0aGlzIGJlZm9yZSBhIGZ1bmN0aW9uCisgICAqIGRlY2xhcmF0aW9uLgorICAgKgorICAgKiBOT1RFOiBUaGlzIG1hY3JvIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uCisgICAqIGRldGFpbCwgYW5kIG5vdCBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBBUEkuICBJdCBpcyBvbmx5IGRlZmluZWQgaGVyZQorICAgKiBiZWNhdXNlIGl0IGlzIG5lZWRlZCBieSBgRlRfRVhQT1JUYC4KKyAgICovCisKKyAgLyogVmlzdWFsIEMsIG1pbmd3ICovCisjaWYgZGVmaW5lZCggX1dJTjMyICkKKworI2lmIGRlZmluZWQoIEZUMl9CVUlMRF9MSUJSQVJZICkgJiYgZGVmaW5lZCggRExMX0VYUE9SVCApCisjZGVmaW5lIEZUX1BVQkxJQ19GVU5DVElPTl9BVFRSSUJVVEUgIF9fZGVjbHNwZWMoIGRsbGV4cG9ydCApCisjZWxpZiBkZWZpbmVkKCBETExfSU1QT1JUICkKKyNkZWZpbmUgRlRfUFVCTElDX0ZVTkNUSU9OX0FUVFJJQlVURSAgX19kZWNsc3BlYyggZGxsaW1wb3J0ICkKKyNlbmRpZgorCisgIC8qIGdjYywgY2xhbmcgKi8KKyNlbGlmICggZGVmaW5lZCggX19HTlVDX18gKSAmJiBfX0dOVUNfXyA+PSA0ICkgfHwgZGVmaW5lZCggX19jbGFuZ19fICkKKyNkZWZpbmUgRlRfUFVCTElDX0ZVTkNUSU9OX0FUVFJJQlVURSBcCisgICAgICAgICAgX19hdHRyaWJ1dGVfXygoIHZpc2liaWxpdHkoICJkZWZhdWx0IiApICkpCisKKyAgLyogU3VuICovCisjZWxpZiBkZWZpbmVkKCBfX1NVTlBST19DICkgJiYgX19TVU5QUk9fQyA+PSAweDU1MAorI2RlZmluZSBGVF9QVUJMSUNfRlVOQ1RJT05fQVRUUklCVVRFICBfX2dsb2JhbAorI2VuZGlmCisKKworI2lmbmRlZiBGVF9QVUJMSUNfRlVOQ1RJT05fQVRUUklCVVRFCisjZGVmaW5lIEZUX1BVQkxJQ19GVU5DVElPTl9BVFRSSUJVVEUgIC8qIGVtcHR5ICovCisjZW5kaWYKKworCisgIC8qCisgICAqIERlZmluZSBhIHB1YmxpYyBGcmVlVHlwZSBBUEkgZnVuY3Rpb24uICBUaGlzIGVuc3VyZXMgaXQgaXMgcHJvcGVybHkKKyAgICogZXhwb3J0ZWQgb3IgaW1wb3J0ZWQgYXQgYnVpbGQgdGltZS4gIFRoZSBtYWNybyBwYXJhbWV0ZXIgaXMgdGhlCisgICAqIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUgYXMgaW46CisgICAqCisgICAqICAgRlRfRVhQT1JUKCBGVF9Cb29sICkKKyAgICogICBGVF9PYmplY3RfTWV0aG9kKCBGVF9PYmplY3QgIG9iaiwKKyAgICogICAgICAgICAgICAgICAgICAgICAuLi4gKTsKKyAgICoKKyAgICogTk9URTogVGhpcyByZXF1aXJlcyB0aGF0IGFsbCBgRlRfRVhQT1JUYCB1c2VzIGFyZSBpbnNpZGUKKyAgICogYEZUX0JFR0lOX0hFQURFUiAuLi4gRlRfRU5EX0hFQURFUmAgYmxvY2tzLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlCisgICAqIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgd2l0aCBDIGxpbmthZ2UsIGV2ZW4gd2hlbiB0aGUgaGVhZGVyIGlzIGluY2x1ZGVkCisgICAqIGJ5IGEgQysrIHNvdXJjZSBmaWxlLgorICAgKi8KKyNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIEZUX1BVQkxJQ19GVU5DVElPTl9BVFRSSUJVVEUgZXh0ZXJuIHgKKworICAvKgorICAgKiBgRlRfVU5VU0VEYCBpbmRpY2F0ZXMgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgdXNlZCAtLSB0aGlzIGlzCisgICAqIG9ubHkgdXNlZCB0byBnZXQgcmlkIG9mIHVucGxlYXNhbnQgY29tcGlsZXIgd2FybmluZ3MuCisgICAqCisgICAqIFRlY2huaWNhbGx5LCB0aGlzIHdhcyBub3QgbWVhbnQgdG8gYmUgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgYnV0IHNvbWUKKyAgICogdGhpcmQtcGFydHkgY29kZSBkZXBlbmRzIG9uIGl0LgorICAgKi8KKyNpZm5kZWYgRlRfVU5VU0VECisjZGVmaW5lIEZUX1VOVVNFRCggYXJnICkgICggKGFyZykgPSAoYXJnKSApCisjZW5kaWYKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAgLyogRlJFRVRZUEVfQ09ORklHX1BVQkxJQ19NQUNST1NfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaAppbmRleCA5NjY0NDA0Li5iZTE5MWY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oCkBAIC0xLDk0ICsxLDc3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmcmVldHlwZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaGlnaC1sZXZlbCBBUEkgYW5kIGNvbW1vbiB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmcmVldHlwZS5oCisgKgorICogICBGcmVlVHlwZSBoaWdoLWxldmVsIEFQSSBhbmQgY29tbW9uIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGUkVFVFlQRV9IXwogI2RlZmluZSBGUkVFVFlQRV9IXwogCiAKLSNpZm5kZWYgRlRfRlJFRVRZUEVfSAotI2Vycm9yICJgZnQyYnVpbGQuaCcgaGFzbid0IGJlZW4gaW5jbHVkZWQgeWV0ISIKLSNlcnJvciAiUGxlYXNlIGFsd2F5cyB1c2UgbWFjcm9zIHRvIGluY2x1ZGUgRnJlZVR5cGUgaGVhZGVyIGZpbGVzLiIKLSNlcnJvciAiRXhhbXBsZToiCi0jZXJyb3IgIiAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+IgotI2Vycm9yICIgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0giCi0jZW5kaWYKLQotCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdHR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyX2luY2x1c2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUncyBoZWFkZXIgaW5jbHVzaW9uIHNjaGVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IGNsaWVudCBhcHBsaWNhdGlvbnMgc2hvdWxkIGluY2x1ZGUgRnJlZVR5cGUgaGVhZGVyIGZpbGVzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUgKGFuZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zKSwgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgaW5jbHVzaW9uIHNjaGVtZSB0byBsb2FkIGhlYWRlciAgICAgICAqLwotICAvKiAgICBmaWxlcywgZm9yIGV4YW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX09VVExJTkVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvbXBpbGVyIGFuZCBpdHMgcHJlcHJvY2Vzc29yIG9ubHkgbmVlZHMgYW4gaW5jbHVkZSBwYXRoIHRvIGZpbmQgKi8KLSAgLyogICAgdGhlIGZpbGUgYGZ0MmJ1aWxkLmgnOyB0aGUgZXhhY3QgbG9jYXRpb25zIGFuZCBuYW1lcyBvZiB0aGUgb3RoZXIgICovCi0gIC8qICAgIEZyZWVUeXBlIGhlYWRlciBmaWxlcyBhcmUgaGlkZGVuIGJ5IHByZXByb2Nlc3NvciBtYWNybyBuYW1lcywgICAgICAqLwotICAvKiAgICBsb2FkZWQgYnkgYGZ0MmJ1aWxkLmgnLiAgVGhlIEFQSSBkb2N1bWVudGF0aW9uIGFsd2F5cyBnaXZlcyB0aGUgICAgKi8KLSAgLyogICAgaGVhZGVyIG1hY3JvIG5hbWUgbmVlZGVkIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGhlYWRlcl9pbmNsdXNpb24KKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIEZyZWVUeXBlJ3MgaGVhZGVyIGluY2x1c2lvbiBzY2hlbWUKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIEhvdyBjbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBpbmNsdWRlIEZyZWVUeXBlIGhlYWRlciBmaWxlcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRvIGJlIGFzIGZsZXhpYmxlIGFzIHBvc3NpYmxlIChhbmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyksIHlvdSBtdXN0CisgICAqICAgbG9hZCBmaWxlIGBmdDJidWlsZC5oYCBmaXJzdCBiZWZvcmUgb3RoZXIgaGVhZGVyIGZpbGVzLCBmb3IgZXhhbXBsZQorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CisgICAqCisgICAqICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyAgICogICAgICNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisgICAqICAgYGBgCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlcl9hbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlciBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IGNsaWVudCBhcHBsaWNhdGlvbnMgc2hvdWxkIGFsbG9jYXRlIEZyZWVUeXBlIGRhdGEgc3RydWN0dXJlcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgYXNzdW1lcyB0aGF0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIGFuZCBwYXNzZWQgICovCi0gIC8qICAgIGFzIGFyZ3VtZW50cyBhcmUgemVyb2VkIG91dCBleGNlcHQgZm9yIHRoZSBhY3R1YWwgZGF0YS4gIEluIG90aGVyICAqLwotICAvKiAgICB3b3JkcywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBjYWxsb2MnIChvciB2YXJpYW50cyBvZiBpdCkgICAgICAgKi8KLSAgLyogICAgaW5zdGVhZCBvZiBgbWFsbG9jJyBmb3IgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIHVzZXJfYWxsb2NhdGlvbgorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgVXNlciBhbGxvY2F0aW9uCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBIb3cgY2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgYWxsb2NhdGUgRnJlZVR5cGUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRnJlZVR5cGUgYXNzdW1lcyB0aGF0IHN0cnVjdHVyZXMgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyIGFuZCBwYXNzZWQgYXMKKyAgICogICBhcmd1bWVudHMgYXJlIHplcm9lZCBvdXQgZXhjZXB0IGZvciB0aGUgYWN0dWFsIGRhdGEuICBJbiBvdGhlciB3b3JkcywKKyAgICogICBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgYGNhbGxvY2AgKG9yIHZhcmlhbnRzIG9mIGl0KSBpbnN0ZWFkIG9mCisgICAqICAgYG1hbGxvY2AgZm9yIGFsbG9jYXRpb24uCisgICAqCisgICAqLwogCiAKIApAQCAtMTAxLDIxOSArODQsMjE5IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmFzZSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZyZWVUeXBlfjIgYmFzZSBmb250IGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBpbXBvcnRhbnQgcHVibGljIGhpZ2gtbGV2ZWwgQVBJICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBvZiBGcmVlVHlwZX4yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ19UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19UUklDS1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19ISU5URVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0ZJWEVEX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19HTFlQSF9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX01VTFRJUExFX01BU1RFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19TRk5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfU0NBTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19DSURfS0VZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX05BTUVEX0lOU1RBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19WQVJJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfQk9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3ViR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVmZXJlbmNlX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19NZW1vcnlfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX1Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fQXJncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXR0YWNoX0ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9QaXhlbF9TaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZXF1ZXN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NoYXJfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GaXJzdF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmV4dF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05hbWVfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBVEhOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfUkVOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19CSVRNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fQVVUT0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fUkVDVVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1BFREFOVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX0xDRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGhfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ2hhcm1hcF9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GU1R5cGVfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU3ViR2x5cGhfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2xvdF9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19GQVNUX0dMWVBIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBiYXNlX2ludGVyZmFjZQorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgQmFzZSBJbnRlcmZhY2UKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFRoZSBGcmVlVHlwZX4yIGJhc2UgZm9udCBpbnRlcmZhY2UuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtb3N0IGltcG9ydGFudCBwdWJsaWMgaGlnaC1sZXZlbCBBUEkKKyAgICogICBmdW5jdGlvbnMgb2YgRnJlZVR5cGV+Mi4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgIEZUX0xpYnJhcnkKKyAgICogICBGVF9GYWNlCisgICAqICAgRlRfU2l6ZQorICAgKiAgIEZUX0dseXBoU2xvdAorICAgKiAgIEZUX0NoYXJNYXAKKyAgICogICBGVF9FbmNvZGluZworICAgKiAgIEZUX0VOQ19UQUcKKyAgICoKKyAgICogICBGVF9GYWNlUmVjCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX1NDQUxBQkxFCisgICAqICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTCisgICAqICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRICisgICAqICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwKKyAgICogICBGVF9GQUNFX0ZMQUdfVkVSVElDQUwKKyAgICogICBGVF9GQUNFX0ZMQUdfQ09MT1IKKyAgICogICBGVF9GQUNFX0ZMQUdfU0ZOVAorICAgKiAgIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQKKyAgICogICBGVF9GQUNFX0ZMQUdfVFJJQ0tZCisgICAqICAgRlRfRkFDRV9GTEFHX0tFUk5JTkcKKyAgICogICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUworICAgKiAgIEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04KKyAgICogICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMKKyAgICogICBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNCisgICAqICAgRlRfRkFDRV9GTEFHX0hJTlRFUgorICAgKgorICAgKiAgIEZUX0hBU19IT1JJWk9OVEFMCisgICAqICAgRlRfSEFTX1ZFUlRJQ0FMCisgICAqICAgRlRfSEFTX0tFUk5JTkcKKyAgICogICBGVF9IQVNfRklYRURfU0laRVMKKyAgICogICBGVF9IQVNfR0xZUEhfTkFNRVMKKyAgICogICBGVF9IQVNfQ09MT1IKKyAgICogICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUworICAgKgorICAgKiAgIEZUX0lTX1NGTlQKKyAgICogICBGVF9JU19TQ0FMQUJMRQorICAgKiAgIEZUX0lTX0ZJWEVEX1dJRFRICisgICAqICAgRlRfSVNfQ0lEX0tFWUVECisgICAqICAgRlRfSVNfVFJJQ0tZCisgICAqICAgRlRfSVNfTkFNRURfSU5TVEFOQ0UKKyAgICogICBGVF9JU19WQVJJQVRJT04KKyAgICoKKyAgICogICBGVF9TVFlMRV9GTEFHX0JPTEQKKyAgICogICBGVF9TVFlMRV9GTEFHX0lUQUxJQworICAgKgorICAgKiAgIEZUX1NpemVSZWMKKyAgICogICBGVF9TaXplX01ldHJpY3MKKyAgICoKKyAgICogICBGVF9HbHlwaFNsb3RSZWMKKyAgICogICBGVF9HbHlwaF9NZXRyaWNzCisgICAqICAgRlRfU3ViR2x5cGgKKyAgICoKKyAgICogICBGVF9CaXRtYXBfU2l6ZQorICAgKgorICAgKiAgIEZUX0luaXRfRnJlZVR5cGUKKyAgICogICBGVF9Eb25lX0ZyZWVUeXBlCisgICAqCisgICAqICAgRlRfTmV3X0ZhY2UKKyAgICogICBGVF9Eb25lX0ZhY2UKKyAgICogICBGVF9SZWZlcmVuY2VfRmFjZQorICAgKiAgIEZUX05ld19NZW1vcnlfRmFjZQorICAgKiAgIEZUX0ZhY2VfUHJvcGVydGllcworICAgKiAgIEZUX09wZW5fRmFjZQorICAgKiAgIEZUX09wZW5fQXJncworICAgKiAgIEZUX1BhcmFtZXRlcgorICAgKiAgIEZUX0F0dGFjaF9GaWxlCisgICAqICAgRlRfQXR0YWNoX1N0cmVhbQorICAgKgorICAgKiAgIEZUX1NldF9DaGFyX1NpemUKKyAgICogICBGVF9TZXRfUGl4ZWxfU2l6ZXMKKyAgICogICBGVF9SZXF1ZXN0X1NpemUKKyAgICogICBGVF9TZWxlY3RfU2l6ZQorICAgKiAgIEZUX1NpemVfUmVxdWVzdF9UeXBlCisgICAqICAgRlRfU2l6ZV9SZXF1ZXN0UmVjCisgICAqICAgRlRfU2l6ZV9SZXF1ZXN0CisgICAqICAgRlRfU2V0X1RyYW5zZm9ybQorICAgKiAgIEZUX0xvYWRfR2x5cGgKKyAgICogICBGVF9HZXRfQ2hhcl9JbmRleAorICAgKiAgIEZUX0dldF9GaXJzdF9DaGFyCisgICAqICAgRlRfR2V0X05leHRfQ2hhcgorICAgKiAgIEZUX0dldF9OYW1lX0luZGV4CisgICAqICAgRlRfTG9hZF9DaGFyCisgICAqCisgICAqICAgRlRfT1BFTl9NRU1PUlkKKyAgICogICBGVF9PUEVOX1NUUkVBTQorICAgKiAgIEZUX09QRU5fUEFUSE5BTUUKKyAgICogICBGVF9PUEVOX0RSSVZFUgorICAgKiAgIEZUX09QRU5fUEFSQU1TCisgICAqCisgICAqICAgRlRfTE9BRF9ERUZBVUxUCisgICAqICAgRlRfTE9BRF9SRU5ERVIKKyAgICogICBGVF9MT0FEX01PTk9DSFJPTUUKKyAgICogICBGVF9MT0FEX0xJTkVBUl9ERVNJR04KKyAgICogICBGVF9MT0FEX05PX1NDQUxFCisgICAqICAgRlRfTE9BRF9OT19ISU5USU5HCisgICAqICAgRlRfTE9BRF9OT19CSVRNQVAKKyAgICogICBGVF9MT0FEX05PX0FVVE9ISU5UCisgICAqICAgRlRfTE9BRF9DT0xPUgorICAgKgorICAgKiAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUCisgICAqICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNCisgICAqICAgRlRfTE9BRF9GT1JDRV9BVVRPSElOVAorICAgKiAgIEZUX0xPQURfTk9fUkVDVVJTRQorICAgKiAgIEZUX0xPQURfUEVEQU5USUMKKyAgICoKKyAgICogICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwKKyAgICogICBGVF9MT0FEX1RBUkdFVF9MSUdIVAorICAgKiAgIEZUX0xPQURfVEFSR0VUX01PTk8KKyAgICogICBGVF9MT0FEX1RBUkdFVF9MQ0QKKyAgICogICBGVF9MT0FEX1RBUkdFVF9MQ0RfVgorICAgKgorICAgKiAgIEZUX0xPQURfVEFSR0VUX01PREUKKyAgICoKKyAgICogICBGVF9SZW5kZXJfR2x5cGgKKyAgICogICBGVF9SZW5kZXJfTW9kZQorICAgKiAgIEZUX0dldF9LZXJuaW5nCisgICAqICAgRlRfS2VybmluZ19Nb2RlCisgICAqICAgRlRfR2V0X1RyYWNrX0tlcm5pbmcKKyAgICogICBGVF9HZXRfR2x5cGhfTmFtZQorICAgKiAgIEZUX0dldF9Qb3N0c2NyaXB0X05hbWUKKyAgICoKKyAgICogICBGVF9DaGFyTWFwUmVjCisgICAqICAgRlRfU2VsZWN0X0NoYXJtYXAKKyAgICogICBGVF9TZXRfQ2hhcm1hcAorICAgKiAgIEZUX0dldF9DaGFybWFwX0luZGV4CisgICAqCisgICAqICAgRlRfR2V0X0ZTVHlwZV9GbGFncworICAgKiAgIEZUX0dldF9TdWJHbHlwaF9JbmZvCisgICAqCisgICAqICAgRlRfRmFjZV9JbnRlcm5hbAorICAgKiAgIEZUX1NpemVfSW50ZXJuYWwKKyAgICogICBGVF9TbG90X0ludGVybmFsCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX1hYWAorICAgKiAgIEZUX1NUWUxFX0ZMQUdfWFhYCisgICAqICAgRlRfT1BFTl9YWFgKKyAgICogICBGVF9MT0FEX1hYWAorICAgKiAgIEZUX0xPQURfVEFSR0VUX1hYWAorICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYCisgICAqICAgRlRfRlNUWVBFX1hYWAorICAgKgorICAgKiAgIEZUX0hBU19GQVNUX0dMWVBIUworICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX01ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIHRoZSBtZXRyaWNzIG9mIGEgc2luZ2xlIGdseXBoLiAgVGhlIHZhbHVlcyAgICAqLwotICAvKiAgICBhcmUgZXhwcmVzc2VkIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQ7IGlmIHRoZSBmbGFnICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgaGFzIGJlZW4gdXNlZCB3aGlsZSBsb2FkaW5nIHRoZSBnbHlwaCwgdmFsdWVzICAgICovCi0gIC8qICAgIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCdzIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCdzIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIExlZnQgc2lkZSBiZWFyaW5nIGZvciBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRvcCBzaWRlIGJlYXJpbmcgZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlBZHZhbmNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFkdmFuY2Ugd2lkdGggZm9yIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIExlZnQgc2lkZSBiZWFyaW5nIGZvciB2ZXJ0aWNhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRvcCBzaWRlIGJlYXJpbmcgZm9yIHZlcnRpY2FsIGxheW91dC4gIExhcmdlciBwb3NpdGl2ZSB2YWx1ZXMgICAgKi8KLSAgLyogICAgICBtZWFuIGZ1cnRoZXIgYmVsb3cgdGhlIHZlcnRpY2FsIGdseXBoIG9yaWdpbi4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QWR2YW5jZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBZHZhbmNlIGhlaWdodCBmb3IgdmVydGljYWwgbGF5b3V0LiAgUG9zaXRpdmUgdmFsdWVzIG1lYW4gdGhlICAgICovCi0gIC8qICAgICAgZ2x5cGggaGFzIGEgcG9zaXRpdmUgYWR2YW5jZSBkb3dud2FyZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIG5vdCBkaXNhYmxlZCB3aXRoIEBGVF9MT0FEX05PX0hJTlRJTkcsIHRoZSB2YWx1ZXMgcmVwcmVzZW50ICAgICAqLwotICAvKiAgICBkaW1lbnNpb25zIG9mIHRoZSBoaW50ZWQgZ2x5cGggKGluIGNhc2UgaGludGluZyBpcyBhcHBsaWNhYmxlKS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN0cm9raW5nIGEgZ2x5cGggd2l0aCBhbiBvdXRzaWRlIGJvcmRlciBkb2VzIG5vdCBpbmNyZWFzZSAgICAgICAgICAqLwotICAvKiAgICBgaG9yaUFkdmFuY2UnIG9yIGB2ZXJ0QWR2YW5jZSc7IHlvdSBoYXZlIHRvIG1hbnVhbGx5IGFkanVzdCB0aGVzZSAgKi8KLSAgLyogICAgdmFsdWVzIHRvIGFjY291bnQgZm9yIHRoZSBhZGRlZCB3aWR0aCBhbmQgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBkb2Vzbid0IHVzZSB0aGUgYFZPUkcnIHRhYmxlIGRhdGEgZm9yIENGRiBmb250cyBiZWNhdXNlICAgKi8KLSAgLyogICAgaXQgZG9lc24ndCBoYXZlIGFuIGludGVyZmFjZSB0byBxdWlja2x5IHJldHJpZXZlIHRoZSBnbHlwaCBoZWlnaHQuICovCi0gIC8qICAgIFRoZSB5fmNvb3JkaW5hdGUgb2YgdGhlIHZlcnRpY2FsIG9yaWdpbiBjYW4gYmUgc2ltcGx5IGNvbXB1dGVkIGFzICAqLwotICAvKiAgICBgdmVydEJlYXJpbmdZICsgaGVpZ2h0JyBhZnRlciBsb2FkaW5nIGEgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0dseXBoX01ldHJpY3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIHRoZSBtZXRyaWNzIG9mIGEgc2luZ2xlIGdseXBoLiAgVGhlIHZhbHVlcyBhcmUKKyAgICogICBleHByZXNzZWQgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdDsgaWYgdGhlIGZsYWcKKyAgICogICBARlRfTE9BRF9OT19TQ0FMRSBoYXMgYmVlbiB1c2VkIHdoaWxlIGxvYWRpbmcgdGhlIGdseXBoLCB2YWx1ZXMgYXJlCisgICAqICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMgaW5zdGVhZC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB3aWR0aCA6OgorICAgKiAgICAgVGhlIGdseXBoJ3Mgd2lkdGguCisgICAqCisgICAqICAgaGVpZ2h0IDo6CisgICAqICAgICBUaGUgZ2x5cGgncyBoZWlnaHQuCisgICAqCisgICAqICAgaG9yaUJlYXJpbmdYIDo6CisgICAqICAgICBMZWZ0IHNpZGUgYmVhcmluZyBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuCisgICAqCisgICAqICAgaG9yaUJlYXJpbmdZIDo6CisgICAqICAgICBUb3Agc2lkZSBiZWFyaW5nIGZvciBob3Jpem9udGFsIGxheW91dC4KKyAgICoKKyAgICogICBob3JpQWR2YW5jZSA6OgorICAgKiAgICAgQWR2YW5jZSB3aWR0aCBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuCisgICAqCisgICAqICAgdmVydEJlYXJpbmdYIDo6CisgICAqICAgICBMZWZ0IHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LgorICAgKgorICAgKiAgIHZlcnRCZWFyaW5nWSA6OgorICAgKiAgICAgVG9wIHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LiAgTGFyZ2VyIHBvc2l0aXZlIHZhbHVlcyBtZWFuCisgICAqICAgICBmdXJ0aGVyIGJlbG93IHRoZSB2ZXJ0aWNhbCBnbHlwaCBvcmlnaW4uCisgICAqCisgICAqICAgdmVydEFkdmFuY2UgOjoKKyAgICogICAgIEFkdmFuY2UgaGVpZ2h0IGZvciB2ZXJ0aWNhbCBsYXlvdXQuICBQb3NpdGl2ZSB2YWx1ZXMgbWVhbiB0aGUgZ2x5cGgKKyAgICogICAgIGhhcyBhIHBvc2l0aXZlIGFkdmFuY2UgZG93bndhcmQuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIElmIG5vdCBkaXNhYmxlZCB3aXRoIEBGVF9MT0FEX05PX0hJTlRJTkcsIHRoZSB2YWx1ZXMgcmVwcmVzZW50CisgICAqICAgZGltZW5zaW9ucyBvZiB0aGUgaGludGVkIGdseXBoIChpbiBjYXNlIGhpbnRpbmcgaXMgYXBwbGljYWJsZSkuCisgICAqCisgICAqICAgU3Ryb2tpbmcgYSBnbHlwaCB3aXRoIGFuIG91dHNpZGUgYm9yZGVyIGRvZXMgbm90IGluY3JlYXNlCisgICAqICAgYGhvcmlBZHZhbmNlYCBvciBgdmVydEFkdmFuY2VgOyB5b3UgaGF2ZSB0byBtYW51YWxseSBhZGp1c3QgdGhlc2UKKyAgICogICB2YWx1ZXMgdG8gYWNjb3VudCBmb3IgdGhlIGFkZGVkIHdpZHRoIGFuZCBoZWlnaHQuCisgICAqCisgICAqICAgRnJlZVR5cGUgZG9lc24ndCB1c2UgdGhlICdWT1JHJyB0YWJsZSBkYXRhIGZvciBDRkYgZm9udHMgYmVjYXVzZSBpdAorICAgKiAgIGRvZXNuJ3QgaGF2ZSBhbiBpbnRlcmZhY2UgdG8gcXVpY2tseSByZXRyaWV2ZSB0aGUgZ2x5cGggaGVpZ2h0LiAgVGhlCisgICAqICAgeX5jb29yZGluYXRlIG9mIHRoZSB2ZXJ0aWNhbCBvcmlnaW4gY2FuIGJlIHNpbXBseSBjb21wdXRlZCBhcworICAgKiAgIGB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHRgIGFmdGVyIGxvYWRpbmcgYSBnbHlwaC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaF9NZXRyaWNzXwogICB7CiAgICAgRlRfUG9zICB3aWR0aDsKQEAgLTMzMCw0NCArMzEzLDQ1IEBACiAgIH0gRlRfR2x5cGhfTWV0cmljczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyB0aGUgbWV0cmljcyBvZiBhIGJpdG1hcCBzdHJpa2UgKGkuZS4sIGEgc2V0ICAqLwotICAvKiAgICBvZiBnbHlwaHMgZm9yIGEgZ2l2ZW4gcG9pbnQgc2l6ZSBhbmQgcmVzb2x1dGlvbikgaW4gYSBiaXRtYXAgZm9udC4gKi8KLSAgLyogICAgSXQgaXMgdXNlZCBmb3IgdGhlIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIEBGVF9GYWNlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0IDo6IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHR3byAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBjb25zZWN1dGl2ZSBiYXNlbGluZXMuICBJdCBpcyBhbHdheXMgcG9zaXRpdmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggIDo6IFRoZSBhdmVyYWdlIHdpZHRoLCBpbiBwaXhlbHMsIG9mIGFsbCBnbHlwaHMgaW4gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgIDo6IFRoZSBub21pbmFsIHNpemUgb2YgdGhlIHN0cmlrZSBpbiAyNi42IGZyYWN0aW9uYWwgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBwb2ludHMuICBUaGlzIGZpZWxkIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtIDo6IFRoZSBob3Jpem9udGFsIHBwZW0gKG5vbWluYWwgd2lkdGgpIGluIDI2LjYgZnJhY3Rpb25hbCAgICovCi0gIC8qICAgICAgICAgICAgICBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtIDo6IFRoZSB2ZXJ0aWNhbCBwcGVtIChub21pbmFsIGhlaWdodCkgaW4gMjYuNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdpbmRvd3MgRk5UOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBub21pbmFsIHNpemUgZ2l2ZW4gaW4gYSBGTlQgZm9udCBpcyBub3QgcmVsaWFibGUuICBJZiB0aGUgICAgKi8KLSAgLyogICAgICBkcml2ZXIgZmluZHMgaXQgaW5jb3JyZWN0LCBpdCBzZXRzIGBzaXplJyB0byBzb21lIGNhbGN1bGF0ZWQgICAgICovCi0gIC8qICAgICAgdmFsdWVzLCBhbmQgYHhfcHBlbScgYW5kIGB5X3BwZW0nIHRvIHRoZSBwaXhlbCB3aWR0aCBhbmQgaGVpZ2h0ICAqLwotICAvKiAgICAgIGdpdmVuIGluIHRoZSBmb250LCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVtYmVkZGVkIGJpdG1hcHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGBzaXplJywgYHdpZHRoJywgYW5kIGBoZWlnaHQnIHZhbHVlcyBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgICAgKi8KLSAgLyogICAgICBiaXRtYXAgc3RyaWtlIGl0c2VsZi4gIFRoZXkgYXJlIGNvbXB1dGVkIGZyb20gdGhlIGdsb2JhbCBmb250ICAgICovCi0gIC8qICAgICAgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfQml0bWFwX1NpemUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyB0aGUgbWV0cmljcyBvZiBhIGJpdG1hcCBzdHJpa2UgKGkuZS4sIGEgc2V0IG9mCisgICAqICAgZ2x5cGhzIGZvciBhIGdpdmVuIHBvaW50IHNpemUgYW5kIHJlc29sdXRpb24pIGluIGEgYml0bWFwIGZvbnQuICBJdCBpcworICAgKiAgIHVzZWQgZm9yIHRoZSBgYXZhaWxhYmxlX3NpemVzYCBmaWVsZCBvZiBARlRfRmFjZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBoZWlnaHQgOjoKKyAgICogICAgIFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBiYXNlbGluZXMuCisgICAqICAgICBJdCBpcyBhbHdheXMgcG9zaXRpdmUuCisgICAqCisgICAqICAgd2lkdGggOjoKKyAgICogICAgIFRoZSBhdmVyYWdlIHdpZHRoLCBpbiBwaXhlbHMsIG9mIGFsbCBnbHlwaHMgaW4gdGhlIHN0cmlrZS4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgbm9taW5hbCBzaXplIG9mIHRoZSBzdHJpa2UgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4gIFRoaXMKKyAgICogICAgIGZpZWxkIGlzIG5vdCB2ZXJ5IHVzZWZ1bC4KKyAgICoKKyAgICogICB4X3BwZW0gOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIHBwZW0gKG5vbWluYWwgd2lkdGgpIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuCisgICAqCisgICAqICAgeV9wcGVtIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgcHBlbSAobm9taW5hbCBoZWlnaHQpIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFdpbmRvd3MgRk5UOgorICAgKiAgICAgVGhlIG5vbWluYWwgc2l6ZSBnaXZlbiBpbiBhIEZOVCBmb250IGlzIG5vdCByZWxpYWJsZS4gIElmIHRoZSBkcml2ZXIKKyAgICogICAgIGZpbmRzIGl0IGluY29ycmVjdCwgaXQgc2V0cyBgc2l6ZWAgdG8gc29tZSBjYWxjdWxhdGVkIHZhbHVlcywgYW5kCisgICAqICAgICBgeF9wcGVtYCBhbmQgYHlfcHBlbWAgdG8gdGhlIHBpeGVsIHdpZHRoIGFuZCBoZWlnaHQgZ2l2ZW4gaW4gdGhlCisgICAqICAgICBmb250LCByZXNwZWN0aXZlbHkuCisgICAqCisgICAqICAgVHJ1ZVR5cGUgZW1iZWRkZWQgYml0bWFwczoKKyAgICogICAgIGBzaXplYCwgYHdpZHRoYCwgYW5kIGBoZWlnaHRgIHZhbHVlcyBhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgYml0bWFwCisgICAqICAgICBzdHJpa2UgaXRzZWxmLiAgVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgZ2xvYmFsIGZvbnQgcGFyYW1ldGVycy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBfU2l6ZV8KICAgewogICAgIEZUX1Nob3J0ICBoZWlnaHQ7CkBAIC0zODksMjI1ICszNzMsMjE4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICBFYWNoIGBsaWJyYXJ5JyBpcyAgICAgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSBgcm9vdCcgb2YgYSBzZXQgICovCi0gIC8qICAgIG9mIG9iamVjdHMgbGlrZSBmb250cywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgYWxzbyBlbWJlZHMgYSBtZW1vcnkgbWFuYWdlciAoc2VlIEBGVF9NZW1vcnkpLCBhcyB3ZWxsIGFzIGEgICAgICovCi0gIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgb2JqZWN0IChzZWUgQEZUX1Jhc3RlcikuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIGl0IGlzIGVhc2llc3QgdG8gdXNlIG9uZSAgICAgICAgICAgICovCi0gIC8qICAgIGBGVF9MaWJyYXJ5JyBvYmplY3QgcGVyIHRocmVhZC4gIEluIGNhc2UgdGhpcyBpcyB0b28gY3VtYmVyc29tZSwgICAqLwotICAvKiAgICBhIHNpbmdsZSBgRlRfTGlicmFyeScgb2JqZWN0IGFjcm9zcyB0aHJlYWRzIGlzIHBvc3NpYmxlIGFsc28gICAgICAgKi8KLSAgLyogICAgKHNpbmNlIEZyZWVUeXBlIHZlcnNpb24gMi41LjYpLCBhcyBsb25nIGFzIGEgbXV0ZXggbG9jayBpcyB1c2VkICAgICovCi0gIC8qICAgIGFyb3VuZCBARlRfTmV3X0ZhY2UgYW5kIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpYnJhcnkgb2JqZWN0cyBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieSBARlRfSW5pdF9GcmVlVHlwZSwgYW5kICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBARlRfRG9uZV9GcmVlVHlwZS4gIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZyAgKi8KLSAgLyogICAgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgQEZUX05ld19MaWJyYXJ5IGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0xpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0xpYnJhcnkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gIEVhY2ggJ2xpYnJhcnknIGlzIGNvbXBsZXRlbHkKKyAgICogICBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSAncm9vdCcgb2YgYSBzZXQgb2Ygb2JqZWN0cyBsaWtlCisgICAqICAgZm9udHMsIGZhY2VzLCBzaXplcywgZXRjLgorICAgKgorICAgKiAgIEl0IGFsc28gZW1iZWRzIGEgbWVtb3J5IG1hbmFnZXIgKHNlZSBARlRfTWVtb3J5KSwgYXMgd2VsbCBhcyBhCisgICAqICAgc2Nhbi1saW5lIGNvbnZlcnRlciBvYmplY3QgKHNlZSBARlRfUmFzdGVyKS4KKyAgICoKKyAgICogICBbU2luY2UgMi41LjZdIEluIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9ucyBpdCBpcyBlYXNpZXN0IHRvIHVzZSBvbmUKKyAgICogICBgRlRfTGlicmFyeWAgb2JqZWN0IHBlciB0aHJlYWQuICBJbiBjYXNlIHRoaXMgaXMgdG9vIGN1bWJlcnNvbWUsIGEKKyAgICogICBzaW5nbGUgYEZUX0xpYnJhcnlgIG9iamVjdCBhY3Jvc3MgdGhyZWFkcyBpcyBwb3NzaWJsZSBhbHNvLCBhcyBsb25nIGFzCisgICAqICAgYSBtdXRleCBsb2NrIGlzIHVzZWQgYXJvdW5kIEBGVF9OZXdfRmFjZSBhbmQgQEZUX0RvbmVfRmFjZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgTGlicmFyeSBvYmplY3RzIGFyZSBub3JtYWxseSBjcmVhdGVkIGJ5IEBGVF9Jbml0X0ZyZWVUeXBlLCBhbmQKKyAgICogICBkZXN0cm95ZWQgd2l0aCBARlRfRG9uZV9GcmVlVHlwZS4gIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZworICAgKiAgIChjZi4gQEZUX1JlZmVyZW5jZV9MaWJyYXJ5KSwgdXNlIEBGVF9OZXdfTGlicmFyeSBhbmQgQEZUX0RvbmVfTGlicmFyeS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0xpYnJhcnlSZWNfICAqRlRfTGlicmFyeTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBtb2R1bGVfbWFuYWdlbWVudAorICAgKgorICAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIG1vZHVsZSBvYmplY3QuICBBIG1vZHVsZSBjYW4gYmUgYSAgICAgKi8KLSAgLyogICAgZm9udCBkcml2ZXIsIGEgcmVuZGVyZXIsIG9yIGFueXRoaW5nIGVsc2UgdGhhdCBwcm92aWRlcyBzZXJ2aWNlcyAgICovCi0gIC8qICAgIHRvIHRoZSBmb3JtZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX01vZHVsZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSBtb2R1bGUgb2JqZWN0LiAgQSBtb2R1bGUgY2FuIGJlIGEgZm9udAorICAgKiAgIGRyaXZlciwgYSByZW5kZXJlciwgb3IgYW55dGhpbmcgZWxzZSB0aGF0IHByb3ZpZGVzIHNlcnZpY2VzIHRvIHRoZQorICAgKiAgIGZvcm1lci4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX01vZHVsZVJlY18qICBGVF9Nb2R1bGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIGZvbnQgZHJpdmVyIG9iamVjdC4gIEEgZm9udCBkcml2ZXIgICAgKi8KLSAgLyogICAgaXMgYSBtb2R1bGUgY2FwYWJsZSBvZiBjcmVhdGluZyBmYWNlcyBmcm9tIGZvbnQgZmlsZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfRHJpdmVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIGZvbnQgZHJpdmVyIG9iamVjdC4gIEEgZm9udCBkcml2ZXIgaXMgYQorICAgKiAgIG1vZHVsZSBjYXBhYmxlIG9mIGNyZWF0aW5nIGZhY2VzIGZyb20gZm9udCBmaWxlcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0RyaXZlclJlY18qICBGVF9Ecml2ZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIHJlbmRlcmVyLiAgQSByZW5kZXJlciBpcyBhIG1vZHVsZSBpbiAgKi8KLSAgLyogICAgY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCdzIG91dGxpbmUgaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCAgICAgICovCi0gIC8qICAgIHN1cHBvcnRzIGEgc2luZ2xlIGdseXBoIGltYWdlIGZvcm1hdCwgYW5kIG9uZSBvciBtb3JlIHRhcmdldCAgICAgICAqLwotICAvKiAgICBzdXJmYWNlIGRlcHRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9SZW5kZXJlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBGcmVlVHlwZSByZW5kZXJlci4gIEEgcmVuZGVyZXIgaXMgYSBtb2R1bGUgaW4KKyAgICogICBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoJ3Mgb3V0bGluZSBpbWFnZSB0byBhIGJpdG1hcC4gIEl0IHN1cHBvcnRzCisgICAqICAgYSBzaW5nbGUgZ2x5cGggaW1hZ2UgZm9ybWF0LCBhbmQgb25lIG9yIG1vcmUgdGFyZ2V0IHN1cmZhY2UgZGVwdGhzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmVuZGVyZXJSZWNfKiAgRlRfUmVuZGVyZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgYmFzZV9pbnRlcmZhY2UKKyAgICoKKyAgICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSB0eXBvZ3JhcGhpYyBmYWNlIG9iamVjdC4gIEEgZmFjZSBvYmplY3QgbW9kZWxzIGEgICAgICovCi0gIC8qICAgIGdpdmVuIHR5cGVmYWNlLCBpbiBhIGdpdmVuIHN0eWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZmFjZSBvYmplY3QgYWxzbyBvd25zIGEgc2luZ2xlIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LCBhcyB3ZWxsICAgICAqLwotICAvKiAgICBhcyBvbmUgb3IgbW9yZSBARlRfU2l6ZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZSB0byBjcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSAqLwotICAvKiAgICBhIGdpdmVuIGZpbGVwYXRoIG9yIGEgY3VzdG9tIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfRG9uZV9GYWNlIHRvIGRlc3Ryb3kgaXQgKGFsb25nIHdpdGggaXRzIHNsb3QgYW5kIHNpemVzKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gYEZUX0ZhY2UnIG9iamVjdCBjYW4gb25seSBiZSBzYWZlbHkgdXNlZCBmcm9tIG9uZSB0aHJlYWQgYXQgYSAgICovCi0gIC8qICAgIHRpbWUuICBTaW1pbGFybHksIGNyZWF0aW9uIGFuZCBkZXN0cnVjdGlvbiBvZiBgRlRfRmFjZScgd2l0aCB0aGUgICAqLwotICAvKiAgICBzYW1lIEBGVF9MaWJyYXJ5IG9iamVjdCBjYW4gb25seSBiZSBkb25lIGZyb20gb25lIHRocmVhZCBhdCBhICAgICAgKi8KLSAgLyogICAgdGltZS4gIE9uIHRoZSBvdGhlciBoYW5kLCBmdW5jdGlvbnMgbGlrZSBARlRfTG9hZF9HbHlwaCBhbmQgaXRzICAgICovCi0gIC8qICAgIHNpYmxpbmdzIGFyZSB0aHJlYWQtc2FmZSBhbmQgZG8gbm90IG5lZWQgdGhlIGxvY2sgdG8gYmUgaGVsZCBhcyAgICAqLwotICAvKiAgICBsb25nIGFzIHRoZSBzYW1lIGBGVF9GYWNlJyBvYmplY3QgaXMgbm90IHVzZWQgZnJvbSBtdWx0aXBsZSAgICAgICAgKi8KLSAgLyogICAgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiBmYWNlICovCi0gIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0ZhY2UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgdHlwb2dyYXBoaWMgZmFjZSBvYmplY3QuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyBhIGdpdmVuCisgICAqICAgdHlwZWZhY2UsIGluIGEgZ2l2ZW4gc3R5bGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEEgZmFjZSBvYmplY3QgYWxzbyBvd25zIGEgc2luZ2xlIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LCBhcyB3ZWxsIGFzIG9uZQorICAgKiAgIG9yIG1vcmUgQEZUX1NpemUgb2JqZWN0cy4KKyAgICoKKyAgICogICBVc2UgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UgdG8gY3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYQorICAgKiAgIGdpdmVuIGZpbGVwYXRoIG9yIGEgY3VzdG9tIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogICBVc2UgQEZUX0RvbmVfRmFjZSB0byBkZXN0cm95IGl0IChhbG9uZyB3aXRoIGl0cyBzbG90IGFuZCBzaXplcykuCisgICAqCisgICAqICAgQW4gYEZUX0ZhY2VgIG9iamVjdCBjYW4gb25seSBiZSBzYWZlbHkgdXNlZCBmcm9tIG9uZSB0aHJlYWQgYXQgYSB0aW1lLgorICAgKiAgIFNpbWlsYXJseSwgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGBGVF9GYWNlYCB3aXRoIHRoZSBzYW1lCisgICAqICAgQEZUX0xpYnJhcnkgb2JqZWN0IGNhbiBvbmx5IGJlIGRvbmUgZnJvbSBvbmUgdGhyZWFkIGF0IGEgdGltZS4gIE9uIHRoZQorICAgKiAgIG90aGVyIGhhbmQsIGZ1bmN0aW9ucyBsaWtlIEBGVF9Mb2FkX0dseXBoIGFuZCBpdHMgc2libGluZ3MgYXJlCisgICAqICAgdGhyZWFkLXNhZmUgYW5kIGRvIG5vdCBuZWVkIHRoZSBsb2NrIHRvIGJlIGhlbGQgYXMgbG9uZyBhcyB0aGUgc2FtZQorICAgKiAgIGBGVF9GYWNlYCBvYmplY3QgaXMgbm90IHVzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuCisgICAqCisgICAqIEBhbHNvOgorICAgKiAgIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gZmFjZQorICAgKiAgIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VSZWNfKiAgRlRfRmFjZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB0aGF0IG1vZGVscyBhIGZhY2Ugc2NhbGVkIHRvIGEgZ2l2ZW4gICAgICAgICAqLwotICAvKiAgICBjaGFyYWN0ZXIgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBARlRfRmFjZSBoYXMgb25lIF9hY3RpdmVfIEBGVF9TaXplIG9iamVjdCB0aGF0IGlzIHVzZWQgYnkgICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX0xvYWRfR2x5cGggdG8gZGV0ZXJtaW5lIHRoZSBzY2FsaW5nICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybWF0aW9uIHRoYXQgaW4gdHVybiBpcyB1c2VkIHRvIGxvYWQgYW5kIGhpbnQgZ2x5cGhzIGFuZCAgICAqLwotICAvKiAgICBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdXNlIEBGVF9TZXRfQ2hhcl9TaXplLCBARlRfU2V0X1BpeGVsX1NpemVzLCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfUmVxdWVzdF9TaXplIG9yIGV2ZW4gQEZUX1NlbGVjdF9TaXplIHRvIGNoYW5nZSB0aGUgY29udGVudCAgICAgKi8KLSAgLyogICAgKGkuZS4sIHRoZSBzY2FsaW5nIHZhbHVlcykgb2YgdGhlIGFjdGl2ZSBARlRfU2l6ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfTmV3X1NpemUgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2l6ZSBvYmplY3RzIGZvciBhICAgKi8KLSAgLyogICAgZ2l2ZW4gQEZUX0ZhY2UsIGJ1dCB0aGV5IHdvbid0IGJlIHVzZWQgYnkgb3RoZXIgZnVuY3Rpb25zIHVudGlsICAgICovCi0gIC8qICAgIHlvdSBhY3RpdmF0ZSBpdCB0aHJvdWdoIEBGVF9BY3RpdmF0ZV9TaXplLiAgT25seSBvbmUgc2l6ZSBjYW4gYmUgICAqLwotICAvKiAgICBhY3RpdmF0ZWQgYXQgYW55IGdpdmVuIHRpbWUgcGVyIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX1NpemVSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuIHNpemUgKi8KLSAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfU2l6ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHRoYXQgbW9kZWxzIGEgZmFjZSBzY2FsZWQgdG8gYSBnaXZlbiBjaGFyYWN0ZXIKKyAgICogICBzaXplLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBbiBARlRfRmFjZSBoYXMgb25lIF9hY3RpdmVfIEBGVF9TaXplIG9iamVjdCB0aGF0IGlzIHVzZWQgYnkgZnVuY3Rpb25zCisgICAqICAgbGlrZSBARlRfTG9hZF9HbHlwaCB0byBkZXRlcm1pbmUgdGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gdGhhdCBpbgorICAgKiAgIHR1cm4gaXMgdXNlZCB0byBsb2FkIGFuZCBoaW50IGdseXBocyBhbmQgbWV0cmljcy4KKyAgICoKKyAgICogICBZb3UgY2FuIHVzZSBARlRfU2V0X0NoYXJfU2l6ZSwgQEZUX1NldF9QaXhlbF9TaXplcywgQEZUX1JlcXVlc3RfU2l6ZQorICAgKiAgIG9yIGV2ZW4gQEZUX1NlbGVjdF9TaXplIHRvIGNoYW5nZSB0aGUgY29udGVudCAoaS5lLiwgdGhlIHNjYWxpbmcKKyAgICogICB2YWx1ZXMpIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUuCisgICAqCisgICAqICAgWW91IGNhbiB1c2UgQEZUX05ld19TaXplIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNpemUgb2JqZWN0cyBmb3IgYSBnaXZlbgorICAgKiAgIEBGVF9GYWNlLCBidXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB1bnRpbCB5b3UgYWN0aXZhdGUKKyAgICogICBpdCB0aHJvdWdoIEBGVF9BY3RpdmF0ZV9TaXplLiAgT25seSBvbmUgc2l6ZSBjYW4gYmUgYWN0aXZhdGVkIGF0IGFueQorICAgKiAgIGdpdmVuIHRpbWUgcGVyIGZhY2UuCisgICAqCisgICAqIEBhbHNvOgorICAgKiAgIFNlZSBARlRfU2l6ZVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4gc2l6ZQorICAgKiAgIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX1NpemVSZWNfKiAgRlRfU2l6ZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gYGdseXBoIHNsb3QnLiAgQSBzbG90IGlzIGEgY29udGFpbmVyIHRoYXQgY2FuICAqLwotICAvKiAgICBob2xkIGFueSBvZiB0aGUgZ2x5cGhzIGNvbnRhaW5lZCBpbiBpdHMgcGFyZW50IGZhY2UuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIG90aGVyIHdvcmRzLCBlYWNoIHRpbWUgeW91IGNhbGwgQEZUX0xvYWRfR2x5cGggb3IgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTG9hZF9DaGFyLCB0aGUgc2xvdCdzIGNvbnRlbnQgaXMgZXJhc2VkIGJ5IHRoZSBuZXcgZ2x5cGggZGF0YSwgKi8KLSAgLyogICAgaS5lLiwgdGhlIGdseXBoJ3MgbWV0cmljcywgaXRzIGltYWdlIChiaXRtYXAgb3Igb3V0bGluZSksIGFuZCAgICAgICovCi0gIC8qICAgIG90aGVyIGNvbnRyb2wgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfR2x5cGhTbG90UmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBnbHlwaCBmaWVsZHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0dseXBoU2xvdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBnaXZlbiAnZ2x5cGggc2xvdCcuICBBIHNsb3QgaXMgYSBjb250YWluZXIgdGhhdCBjYW4gaG9sZAorICAgKiAgIGFueSBvZiB0aGUgZ2x5cGhzIGNvbnRhaW5lZCBpbiBpdHMgcGFyZW50IGZhY2UuCisgICAqCisgICAqICAgSW4gb3RoZXIgd29yZHMsIGVhY2ggdGltZSB5b3UgY2FsbCBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyLAorICAgKiAgIHRoZSBzbG90J3MgY29udGVudCBpcyBlcmFzZWQgYnkgdGhlIG5ldyBnbHlwaCBkYXRhLCBpLmUuLCB0aGUgZ2x5cGgncworICAgKiAgIG1ldHJpY3MsIGl0cyBpbWFnZSAoYml0bWFwIG9yIG91dGxpbmUpLCBhbmQgb3RoZXIgY29udHJvbCBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogQGFsc286CisgICAqICAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGdseXBoIGZpZWxkcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoU2xvdFJlY18qICBGVF9HbHlwaFNsb3Q7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGNoYXJhY3RlciBtYXAgKHVzdWFsbHkgYWJicmV2aWF0ZWQgdG8gYGNoYXJtYXAnKS4gIEEgKi8KLSAgLyogICAgY2hhcm1hcCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSBjaGFyYWN0ZXIgY29kZXMgaW4gYSBnaXZlbiBlbmNvZGluZyAgICovCi0gIC8qICAgIGludG8gZ2x5cGggaW5kZXhlcyBmb3IgaXRzIHBhcmVudCdzIGZhY2UuICBTb21lIGZvbnQgZm9ybWF0cyBtYXkgICAqLwotICAvKiAgICBwcm92aWRlIHNldmVyYWwgY2hhcm1hcHMgcGVyIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggZmFjZSBvYmplY3Qgb3ducyB6ZXJvIG9yIG1vcmUgY2hhcm1hcHMsIGJ1dCBvbmx5IG9uZSBvZiB0aGVtICAqLwotICAvKiAgICBjYW4gYmUgYGFjdGl2ZScsIHByb3ZpZGluZyB0aGUgZGF0YSB1c2VkIGJ5IEBGVF9HZXRfQ2hhcl9JbmRleCBvciAgKi8KLSAgLyogICAgQEZUX0xvYWRfQ2hhci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGlzdCBvZiBhdmFpbGFibGUgY2hhcm1hcHMgaW4gYSBmYWNlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgYGZhY2UtPm51bV9jaGFybWFwcycgYW5kIGBmYWNlLT5jaGFybWFwcycgZmllbGRzIG9mIEBGVF9GYWNlUmVjLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY3VycmVudGx5IGFjdGl2ZSBjaGFybWFwIGlzIGF2YWlsYWJsZSBhcyBgZmFjZS0+Y2hhcm1hcCcuICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBjYWxsIEBGVF9TZXRfQ2hhcm1hcCB0byBjaGFuZ2UgaXQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBhIG5ldyBmYWNlIGlzIGNyZWF0ZWQgKGVpdGhlciB0aHJvdWdoIEBGVF9OZXdfRmFjZSBvciAgICAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UpLCB0aGUgbGlicmFyeSBsb29rcyBmb3IgYSBVbmljb2RlIGNoYXJtYXAgd2l0aGluICAgICAqLwotICAvKiAgICB0aGUgbGlzdCBhbmQgYXV0b21hdGljYWxseSBhY3RpdmF0ZXMgaXQuICBJZiB0aGVyZSBpcyBubyBVbmljb2RlICAgKi8KLSAgLyogICAgY2hhcm1hcCwgRnJlZVR5cGUgZG9lc24ndCBzZXQgYW4gYGFjdGl2ZScgY2hhcm1hcC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9DaGFyTWFwUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiAgICovCi0gIC8qICAgIGNoYXJhY3RlciBtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0NoYXJNYXAKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgY2hhcmFjdGVyIG1hcCAodXN1YWxseSBhYmJyZXZpYXRlZCB0byAnY2hhcm1hcCcpLiAgQQorICAgKiAgIGNoYXJtYXAgaXMgdXNlZCB0byB0cmFuc2xhdGUgY2hhcmFjdGVyIGNvZGVzIGluIGEgZ2l2ZW4gZW5jb2RpbmcgaW50bworICAgKiAgIGdseXBoIGluZGV4ZXMgZm9yIGl0cyBwYXJlbnQncyBmYWNlLiAgU29tZSBmb250IGZvcm1hdHMgbWF5IHByb3ZpZGUKKyAgICogICBzZXZlcmFsIGNoYXJtYXBzIHBlciBmb250LgorICAgKgorICAgKiAgIEVhY2ggZmFjZSBvYmplY3Qgb3ducyB6ZXJvIG9yIG1vcmUgY2hhcm1hcHMsIGJ1dCBvbmx5IG9uZSBvZiB0aGVtIGNhbgorICAgKiAgIGJlICdhY3RpdmUnLCBwcm92aWRpbmcgdGhlIGRhdGEgdXNlZCBieSBARlRfR2V0X0NoYXJfSW5kZXggb3IKKyAgICogICBARlRfTG9hZF9DaGFyLgorICAgKgorICAgKiAgIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjaGFybWFwcyBpbiBhIGZhY2UgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlCisgICAqICAgYGZhY2UtPm51bV9jaGFybWFwc2AgYW5kIGBmYWNlLT5jaGFybWFwc2AgZmllbGRzIG9mIEBGVF9GYWNlUmVjLgorICAgKgorICAgKiAgIFRoZSBjdXJyZW50bHkgYWN0aXZlIGNoYXJtYXAgaXMgYXZhaWxhYmxlIGFzIGBmYWNlLT5jaGFybWFwYC4gIFlvdQorICAgKiAgIHNob3VsZCBjYWxsIEBGVF9TZXRfQ2hhcm1hcCB0byBjaGFuZ2UgaXQuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFdoZW4gYSBuZXcgZmFjZSBpcyBjcmVhdGVkIChlaXRoZXIgdGhyb3VnaCBARlRfTmV3X0ZhY2Ugb3IKKyAgICogICBARlRfT3Blbl9GYWNlKSwgdGhlIGxpYnJhcnkgbG9va3MgZm9yIGEgVW5pY29kZSBjaGFybWFwIHdpdGhpbiB0aGUKKyAgICogICBsaXN0IGFuZCBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlcyBpdC4gIElmIHRoZXJlIGlzIG5vIFVuaWNvZGUgY2hhcm1hcCwKKyAgICogICBGcmVlVHlwZSBkb2Vzbid0IHNldCBhbiAnYWN0aXZlJyBjaGFybWFwLgorICAgKgorICAgKiBAYWxzbzoKKyAgICogICBTZWUgQEZUX0NoYXJNYXBSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuCisgICAqICAgY2hhcmFjdGVyIG1hcC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0NoYXJNYXBSZWNfKiAgRlRfQ2hhck1hcDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ19UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcuICBJdCBpcyAqLwotICAvKiAgICB1c2VkIHRvIGRlZmluZSBgZW5jb2RpbmcnIGlkZW50aWZpZXJzIChzZWUgQEZUX0VuY29kaW5nKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2LWJpdCBjb21waWxlcnMgZG9uJ3QgbGlrZSAzMi1iaXQgZW51bWVyYXRpb25zLCB5b3UgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9FTkNfVEFHKCB2YWx1ZSwgYSwgYiwgYywgZCApICB2YWx1ZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9FTkNfVEFHCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgaW50byBhbiB1bnNpZ25lZCBsb25nLiAgSXQgaXMKKyAgICogICB1c2VkIHRvIGRlZmluZSAnZW5jb2RpbmcnIGlkZW50aWZpZXJzIChzZWUgQEZUX0VuY29kaW5nKS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgU2luY2UgbWFueSAxNi1iaXQgY29tcGlsZXJzIGRvbid0IGxpa2UgMzItYml0IGVudW1lcmF0aW9ucywgeW91IHNob3VsZAorICAgKiAgIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgI2RlZmluZSBGVF9FTkNfVEFHKCB2YWx1ZSwgYSwgYiwgYywgZCApICB2YWx1ZQorICAgKiAgIGBgYAorICAgKgorICAgKiAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuCisgICAqLwogCiAjaWZuZGVmIEZUX0VOQ19UQUcKICNkZWZpbmUgRlRfRU5DX1RBRyggdmFsdWUsIGEsIGIsIGMsIGQgKSAgICAgICAgIFwKQEAgLTYxOSwxNTAgKzU5NiwxNDcgQEAKICNlbmRpZiAvKiBGVF9FTkNfVEFHICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FbmNvZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0byBzcGVjaWZ5IGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSBjaGFybWFwcy4gICAgKi8KLSAgLyogICAgVXNlZCBpbiB0aGUgQEZUX1NlbGVjdF9DaGFybWFwIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzcGl0ZSB0aGUgbmFtZSwgdGhpcyBlbnVtZXJhdGlvbiBsaXN0cyBzcGVjaWZpYyBjaGFyYWN0ZXIgICAgICAgICovCi0gIC8qICAgIHJlcGVydG9yaWVzIChpLmUuLCBjaGFyc2V0cyksIGFuZCBub3QgdGV4dCBlbmNvZGluZyBtZXRob2RzIChlLmcuLCAqLwotICAvKiAgICBVVEYtOCwgVVRGLTE2LCBldGMuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE90aGVyIGVuY29kaW5ncyBtaWdodCBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBlbmNvZGluZyB2YWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1VOSUNPREUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBVbmljb2RlIGNoYXJhY3RlciBzZXQuICBUaGlzIHZhbHVlIGNvdmVycyBhbGwgdmVyc2lvbnMgb2YgICAgKi8KLSAgLyogICAgICB0aGUgVW5pY29kZSByZXBlcnRvaXJlLCBpbmNsdWRpbmcgQVNDSUkgYW5kIExhdGluLTEuICBNb3N0IGZvbnRzICovCi0gIC8qICAgICAgaW5jbHVkZSBhIFVuaWNvZGUgY2hhcm1hcCwgYnV0IG5vdCBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIFVuaWNvZGUgdmFsdWUgVSsxRjAyOCAoYW5kICAgICovCi0gIC8qICAgICAgdGhlIGZvbnQgY29udGFpbnMgaXQpLCB1c2UgdmFsdWUgMHgxRjAyOCBhcyB0aGUgaW5wdXQgdmFsdWUgZm9yICAqLwotICAvKiAgICAgIEBGVF9HZXRfQ2hhcl9JbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE1pY3Jvc29mdCBTeW1ib2wgZW5jb2RpbmcsIHVzZWQgdG8gZW5jb2RlIG1hdGhlbWF0aWNhbCBzeW1ib2xzICAgKi8KLSAgLyogICAgICBhbmQgd2luZ2RpbmdzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdHNwZWMvcmVjb20uaHRtJywgICAgICAgICAqLwotICAvKiAgICAgIGBodHRwOi8vd3d3Lmtvc3Rpcy5uZXQvY2hhcnNldHMvc3ltYm9sLmh0bScsIGFuZCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBgaHR0cDovL3d3dy5rb3N0aXMubmV0L2NoYXJzZXRzL3dpbmdkaW5nLmh0bScuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgZW5jb2RpbmcgdXNlcyBjaGFyYWN0ZXIgY29kZXMgZnJvbSB0aGUgUFVBIChQcml2YXRlIFVuaWNvZGUgKi8KLSAgLyogICAgICBBcmVhKSBpbiB0aGUgcmFuZ2UgVStGMDIwLVUrRjBGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19TSklTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTaGlmdCBKSVMgZW5jb2RpbmcgZm9yIEphcGFuZXNlLiAgTW9yZSBpbmZvIGF0ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NoaWZ0X0pJUycuICBTZWUgbm90ZSBvbiAgICAgICAgICAqLwotICAvKiAgICAgIG11bHRpLWJ5dGUgZW5jb2RpbmdzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1BSQyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGVuY29kaW5nIHN5c3RlbXMgbWFpbmx5IGZvciBTaW1wbGlmaWVkIENoaW5lc2UgYXMgKi8KLSAgLyogICAgICB1c2VkIGluIFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hIChQUkMpLiAgVGhlIGVuY29kaW5nIGxheW91dCAgICovCi0gIC8qICAgICAgaXMgYmFzZWQgb24gR0J+MjMxMiBhbmQgaXRzIHN1cGVyc2V0cyBHQksgYW5kIEdCfjE4MDMwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYW4gZW5jb2Rpbmcgc3lzdGVtIGZvciBUcmFkaXRpb25hbCBDaGluZXNlIGFzICAgICAqLwotICAvKiAgICAgIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1dBTlNVTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBLb3JlYW4gZW5jb2Rpbmcgc3lzdGVtIGtub3duIGFzIEV4dGVuZGVkICAgICAgKi8KLSAgLyogICAgICBXYW5zdW5nIChNUyBXaW5kb3dzIGNvZGUgcGFnZSA5NDkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGBodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV2luZG93c0Jlc3RGaXQvYmVzdGZpdDk0OS50eHQnLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfSk9IQUIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIEtvcmVhbiBzdGFuZGFyZCBjaGFyYWN0ZXIgc2V0IChLU35DIDU2MDEtMTk5MiksIHdoaWNoICAgICAgICAqLwotICAvKiAgICAgIGNvcnJlc3BvbmRzIHRvIE1TIFdpbmRvd3MgY29kZSBwYWdlIDEzNjEuICBUaGlzIGNoYXJhY3RlciBzZXQgICAgKi8KLSAgLyogICAgICBpbmNsdWRlcyBhbGwgcG9zc2libGUgSGFuZ3VsIGNoYXJhY3RlciBjb21iaW5hdGlvbnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBhIExhdGluLTEgZW5jb2RpbmcgYXMgZGVmaW5lZCBpbiBhIFR5cGV+MSAgICAgICAgICovCi0gIC8qICAgICAgUG9zdFNjcmlwdCBmb250LiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWRvYmUgU3RhbmRhcmQgZW5jb2RpbmcsIGFzIGZvdW5kIGluIFR5cGV+MSwgQ0ZGLCBhbmQgICAgICAgICAgICAqLwotICAvKiAgICAgIE9wZW5UeXBlL0NGRiBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciBjb2Rlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFkb2JlIEV4cGVydCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZCBPcGVuVHlwZS9DRkYgKi8KLSAgLyogICAgICBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciBjb2Rlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBhIGN1c3RvbSBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZCAgICovCi0gIC8qICAgICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQXBwbGUgcm9tYW4gZW5jb2RpbmcuICBNYW55IFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cyBjb250YWluICAqLwotICAvKiAgICAgIGEgY2hhcm1hcCBmb3IgdGhpcyA4LWJpdCBlbmNvZGluZywgc2luY2Ugb2xkZXIgdmVyc2lvbnMgb2YgTWFjICAgKi8KLSAgLyogICAgICBPUyBhcmUgYWJsZSB0byB1c2UgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19PTERfTEFUSU5fMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIHZhbHVlIGlzIGRlcHJlY2F0ZWQgYW5kIHdhcyBuZWl0aGVyIHVzZWQgbm9yIHJlcG9ydGVkIGJ5ICAgICovCi0gIC8qICAgICAgRnJlZVR5cGUuICBEb24ndCB1c2Ugb3IgdGVzdCBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfU0pJUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19TSklTLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19QUkMuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfQklHNSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19CSUc1LiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfV0FOU1VORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19XQU5TVU5HLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTVNfSk9IQUIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19KT0hBQi4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIGVuYWJsZXMgYSBVbmljb2RlIGNoYXJtYXAgYW5kIHRhZ3MgaXQgd2l0aCAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19VTklDT0RFIHdoZW4gaXQgaXMgZWl0aGVyIHByb3ZpZGVkIG9yIGNhbiBiZSBnZW5lcmF0ZWQgKi8KLSAgLyogICAgZnJvbSBQb3N0U2NyaXB0IGdseXBoIG5hbWUgZGljdGlvbmFyaWVzIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICovCi0gIC8qICAgIEFsbCBvdGhlciBlbmNvZGluZ3MgYXJlIGNvbnNpZGVyZWQgbGVnYWN5IGFuZCB0YWdnZWQgb25seSBpZiAgICAgICAqLwotICAvKiAgICBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGZvbnQgZmlsZS4gIE90aGVyd2lzZSwgRlRfRU5DT0RJTkdfTk9ORSAgKi8KLSAgLyogICAgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19OT05FIGlzIHNldCBieSB0aGUgQkRGIGFuZCBQQ0YgZHJpdmVycyBpZiB0aGUgY2hhcm1hcCAgKi8KLSAgLyogICAgaXMgbmVpdGhlciBVbmljb2RlIG5vciBJU08tODg1OS0xIChvdGhlcndpc2UgaXQgaXMgc2V0IHRvICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1VOSUNPREUpLiAgVXNlIEBGVF9HZXRfQkRGX0NoYXJzZXRfSUQgdG8gZmluZCBvdXQgICAgICAqLwotICAvKiAgICB3aGljaCBlbmNvZGluZyBpcyByZWFsbHkgcHJlc2VudC4gIElmLCBmb3IgZXhhbXBsZSwgdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgYGNzX3JlZ2lzdHJ5JyBmaWVsZCBpcyBgS09JOCcgYW5kIHRoZSBgY3NfZW5jb2RpbmcnIGZpZWxkIGlzIGBSJywgICovCi0gIC8qICAgIHRoZSBmb250IGlzIGVuY29kZWQgaW4gS09JOC1SLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBhbHdheXMgc2V0ICh3aXRoIGEgc2luZ2xlIGV4Y2VwdGlvbikgYnkgdGhlICAgICovCi0gIC8qICAgIHdpbmZvbnRzIGRyaXZlci4gIFVzZSBARlRfR2V0X1dpbkZOVF9IZWFkZXIgYW5kIGV4YW1pbmUgdGhlICAgICAgICAqLwotICAvKiAgICBgY2hhcnNldCcgZmllbGQgb2YgdGhlIEBGVF9XaW5GTlRfSGVhZGVyUmVjIHN0cnVjdHVyZSB0byBmaW5kIG91dCAgKi8KLSAgLyogICAgd2hpY2ggZW5jb2RpbmcgaXMgcmVhbGx5IHByZXNlbnQuICBGb3IgZXhhbXBsZSwgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9XaW5GTlRfSURfQ1AxMjUxICgyMDQpIG1lYW5zIFdpbmRvd3MgY29kZSBwYWdlIDEyNTEgKGZvciAgICAgICAqLwotICAvKiAgICBSdXNzaWFuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgaXMgc2V0IGlmIGBwbGF0Zm9ybV9pZCcgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCAqLwotICAvKiAgICBhbmQgYGVuY29kaW5nX2lkJyBpcyBub3QgYFRUX01BQ19JRF9ST01BTicgKG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgcGxhdGZvcm1faWQnIGlzIEBUVF9QTEFURk9STV9NQUNJTlRPU0gsIHVzZSB0aGUgZnVuY3Rpb24gICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEIHRvIHF1ZXJ5IHRoZSBNYWMgbGFuZ3VhZ2UgSUQgdGhhdCBtYXkgICAgICovCi0gIC8qICAgIGJlIG5lZWRlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIEFwcGxlIGVuY29kaW5nIHZhcmlhbnRzLiAgU2VlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9BUFBMRS9SZWFkbWUudHh0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byBnZXQgYW4gaWRlYSBob3cgdG8gZG8gdGhhdC4gIEJhc2ljYWxseSwgaWYgdGhlIGxhbmd1YWdlIElEICAgICAgKi8KLSAgLyogICAgaXN+MCwgZG9uJ3QgdXNlIGl0LCBvdGhlcndpc2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBsYW5ndWFnZSBJRC4gICAgICovCi0gIC8qICAgIFRoZW4gZXhhbWluZSBgZW5jb2RpbmdfaWQnLiAgSWYsIGZvciBleGFtcGxlLCBgZW5jb2RpbmdfaWQnIGlzICAgICAqLwotICAvKiAgICBgVFRfTUFDX0lEX1JPTUFOJyBhbmQgdGhlIGxhbmd1YWdlIElEIChtaW51c34xKSBpcyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYFRUX01BQ19MQU5HSURfR1JFRUsnLCBpdCBpcyB0aGUgR3JlZWsgZW5jb2RpbmcsIG5vdCBSb21hbi4gICAgICAgICovCi0gIC8qICAgIGBUVF9NQUNfSURfQVJBQklDJyB3aXRoIGBUVF9NQUNfTEFOR0lEX0ZBUlNJJyBtZWFucyB0aGUgRmFyc2kgICAgICAqLwotICAvKiAgICB2YXJpYW50IHRoZSBBcmFiaWMgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9FbmNvZGluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gZW51bWVyYXRpb24gdG8gc3BlY2lmeSBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgY2hhcm1hcHMuICBVc2VkCisgICAqICAgaW4gdGhlIEBGVF9TZWxlY3RfQ2hhcm1hcCBBUEkgZnVuY3Rpb24uCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIERlc3BpdGUgdGhlIG5hbWUsIHRoaXMgZW51bWVyYXRpb24gbGlzdHMgc3BlY2lmaWMgY2hhcmFjdGVyCisgICAqICAgcmVwZXJ0b3JpZXMgKGkuZS4sIGNoYXJzZXRzKSwgYW5kIG5vdCB0ZXh0IGVuY29kaW5nIG1ldGhvZHMgKGUuZy4sCisgICAqICAgVVRGLTgsIFVURi0xNiwgZXRjLikuCisgICAqCisgICAqICAgT3RoZXIgZW5jb2RpbmdzIG1pZ2h0IGJlIGRlZmluZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9FTkNPRElOR19OT05FIDo6CisgICAqICAgICBUaGUgZW5jb2RpbmcgdmFsdWV+MCBpcyByZXNlcnZlZCBmb3IgYWxsIGZvcm1hdHMgZXhjZXB0IEJERiwgUENGLAorICAgKiAgICAgYW5kIFdpbmRvd3MgRk5UOyBzZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfVU5JQ09ERSA6OgorICAgKiAgICAgVGhlIFVuaWNvZGUgY2hhcmFjdGVyIHNldC4gIFRoaXMgdmFsdWUgY292ZXJzIGFsbCB2ZXJzaW9ucyBvZiB0aGUKKyAgICogICAgIFVuaWNvZGUgcmVwZXJ0b2lyZSwgaW5jbHVkaW5nIEFTQ0lJIGFuZCBMYXRpbi0xLiAgTW9zdCBmb250cyBpbmNsdWRlCisgICAqICAgICBhIFVuaWNvZGUgY2hhcm1hcCwgYnV0IG5vdCBhbGwgb2YgdGhlbS4KKyAgICoKKyAgICogICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgVW5pY29kZSB2YWx1ZSBVKzFGMDI4IChhbmQgdGhlCisgICAqICAgICBmb250IGNvbnRhaW5zIGl0KSwgdXNlIHZhbHVlIDB4MUYwMjggYXMgdGhlIGlucHV0IHZhbHVlIGZvcgorICAgKiAgICAgQEZUX0dldF9DaGFyX0luZGV4LgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCA6OgorICAgKiAgICAgTWljcm9zb2Z0IFN5bWJvbCBlbmNvZGluZywgdXNlZCB0byBlbmNvZGUgbWF0aGVtYXRpY2FsIHN5bWJvbHMgYW5kCisgICAqICAgICB3aW5nZGluZ3MuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisgICAqICAgICAnaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9yZWNvbS5odG0jbm9uLXN0YW5kYXJkLXN5bWJvbC1mb250cycsCisgICAqICAgICAnaHR0cDovL3d3dy5rb3N0aXMubmV0L2NoYXJzZXRzL3N5bWJvbC5odG0nLCBhbmQKKyAgICogICAgICdodHRwOi8vd3d3Lmtvc3Rpcy5uZXQvY2hhcnNldHMvd2luZ2RpbmcuaHRtJy4KKyAgICoKKyAgICogICAgIFRoaXMgZW5jb2RpbmcgdXNlcyBjaGFyYWN0ZXIgY29kZXMgZnJvbSB0aGUgUFVBIChQcml2YXRlIFVuaWNvZGUKKyAgICogICAgIEFyZWEpIGluIHRoZSByYW5nZSBVK0YwMjAtVStGMEZGLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX1NKSVMgOjoKKyAgICogICAgIFNoaWZ0IEpJUyBlbmNvZGluZyBmb3IgSmFwYW5lc2UuICBNb3JlIGluZm8gYXQKKyAgICogICAgICdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TaGlmdF9KSVMnLiAgU2VlIG5vdGUgb24gbXVsdGktYnl0ZQorICAgKiAgICAgZW5jb2RpbmdzIGJlbG93LgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX1BSQyA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gZW5jb2Rpbmcgc3lzdGVtcyBtYWlubHkgZm9yIFNpbXBsaWZpZWQgQ2hpbmVzZSBhcworICAgKiAgICAgdXNlZCBpbiBQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYSAoUFJDKS4gIFRoZSBlbmNvZGluZyBsYXlvdXQgaXMKKyAgICogICAgIGJhc2VkIG9uIEdCfjIzMTIgYW5kIGl0cyBzdXBlcnNldHMgR0JLIGFuZCBHQn4xODAzMC4KKyAgICoKKyAgICogICBGVF9FTkNPRElOR19CSUc1IDo6CisgICAqICAgICBDb3JyZXNwb25kcyB0byBhbiBlbmNvZGluZyBzeXN0ZW0gZm9yIFRyYWRpdGlvbmFsIENoaW5lc2UgYXMgdXNlZCBpbgorICAgKiAgICAgVGFpd2FuIGFuZCBIb25nIEtvbmcuCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfV0FOU1VORyA6OgorICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIEtvcmVhbiBlbmNvZGluZyBzeXN0ZW0ga25vd24gYXMgRXh0ZW5kZWQgV2Fuc3VuZworICAgKiAgICAgKE1TIFdpbmRvd3MgY29kZSBwYWdlIDk0OSkuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUKKyAgICogICAgICdodHRwczovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV2luZG93c0Jlc3RGaXQvYmVzdGZpdDk0OS50eHQnLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX0pPSEFCIDo6CisgICAqICAgICBUaGUgS29yZWFuIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQgKEtTfkMgNTYwMS0xOTkyKSwgd2hpY2gKKyAgICogICAgIGNvcnJlc3BvbmRzIHRvIE1TIFdpbmRvd3MgY29kZSBwYWdlIDEzNjEuICBUaGlzIGNoYXJhY3RlciBzZXQKKyAgICogICAgIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBIYW5ndWwgY2hhcmFjdGVyIGNvbWJpbmF0aW9ucy4KKyAgICoKKyAgICogICBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xIDo6CisgICAqICAgICBDb3JyZXNwb25kcyB0byBhIExhdGluLTEgZW5jb2RpbmcgYXMgZGVmaW5lZCBpbiBhIFR5cGV+MSBQb3N0U2NyaXB0CisgICAqICAgICBmb250LiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEIDo6CisgICAqICAgICBBZG9iZSBTdGFuZGFyZCBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZCBPcGVuVHlwZS9DRkYKKyAgICogICAgIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVCA6OgorICAgKiAgICAgQWRvYmUgRXhwZXJ0IGVuY29kaW5nLCBhcyBmb3VuZCBpbiBUeXBlfjEsIENGRiwgYW5kIE9wZW5UeXBlL0NGRgorICAgKiAgICAgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgY29kZXMuCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NIDo6CisgICAqICAgICBDb3JyZXNwb25kcyB0byBhIGN1c3RvbSBlbmNvZGluZywgYXMgZm91bmQgaW4gVHlwZX4xLCBDRkYsIGFuZAorICAgKiAgICAgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyIGNvZGVzLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOIDo6CisgICAqICAgICBBcHBsZSByb21hbiBlbmNvZGluZy4gIE1hbnkgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzIGNvbnRhaW4gYQorICAgKiAgICAgY2hhcm1hcCBmb3IgdGhpcyA4LWJpdCBlbmNvZGluZywgc2luY2Ugb2xkZXIgdmVyc2lvbnMgb2YgTWFjIE9TIGFyZQorICAgKiAgICAgYWJsZSB0byB1c2UgaXQuCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfT0xEX0xBVElOXzIgOjoKKyAgICogICAgIFRoaXMgdmFsdWUgaXMgZGVwcmVjYXRlZCBhbmQgd2FzIG5laXRoZXIgdXNlZCBub3IgcmVwb3J0ZWQgYnkKKyAgICogICAgIEZyZWVUeXBlLiAgRG9uJ3QgdXNlIG9yIHRlc3QgZm9yIGl0LgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX01TX1NKSVMgOjoKKyAgICogICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfU0pJUy4gIERlcHJlY2F0ZWQuCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfTVNfR0IyMzEyIDo6CisgICAqICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1BSQy4gIERlcHJlY2F0ZWQuCisgICAqCisgICAqICAgRlRfRU5DT0RJTkdfTVNfQklHNSA6OgorICAgKiAgICAgU2FtZSBhcyBGVF9FTkNPRElOR19CSUc1LiAgRGVwcmVjYXRlZC4KKyAgICoKKyAgICogICBGVF9FTkNPRElOR19NU19XQU5TVU5HIDo6CisgICAqICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX1dBTlNVTkcuICBEZXByZWNhdGVkLgorICAgKgorICAgKiAgIEZUX0VOQ09ESU5HX01TX0pPSEFCIDo6CisgICAqICAgICBTYW1lIGFzIEZUX0VOQ09ESU5HX0pPSEFCLiAgRGVwcmVjYXRlZC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgZW5hYmxlcyBhIFVuaWNvZGUgY2hhcm1hcCBhbmQgdGFncyBpdCB3aXRoCisgICAqICAgYEZUX0VOQ09ESU5HX1VOSUNPREVgIHdoZW4gaXQgaXMgZWl0aGVyIHByb3ZpZGVkIG9yIGNhbiBiZSBnZW5lcmF0ZWQKKyAgICogICBmcm9tIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBkaWN0aW9uYXJpZXMgaW4gdGhlIGZvbnQgZmlsZS4gIEFsbCBvdGhlcgorICAgKiAgIGVuY29kaW5ncyBhcmUgY29uc2lkZXJlZCBsZWdhY3kgYW5kIHRhZ2dlZCBvbmx5IGlmIGV4cGxpY2l0bHkgZGVmaW5lZAorICAgKiAgIGluIHRoZSBmb250IGZpbGUuICBPdGhlcndpc2UsIGBGVF9FTkNPRElOR19OT05FYCBpcyB1c2VkLgorICAgKgorICAgKiAgIGBGVF9FTkNPRElOR19OT05FYCBpcyBzZXQgYnkgdGhlIEJERiBhbmQgUENGIGRyaXZlcnMgaWYgdGhlIGNoYXJtYXAgaXMKKyAgICogICBuZWl0aGVyIFVuaWNvZGUgbm9yIElTTy04ODU5LTEgKG90aGVyd2lzZSBpdCBpcyBzZXQgdG8KKyAgICogICBgRlRfRU5DT0RJTkdfVU5JQ09ERWApLiAgVXNlIEBGVF9HZXRfQkRGX0NoYXJzZXRfSUQgdG8gZmluZCBvdXQgd2hpY2gKKyAgICogICBlbmNvZGluZyBpcyByZWFsbHkgcHJlc2VudC4gIElmLCBmb3IgZXhhbXBsZSwgdGhlIGBjc19yZWdpc3RyeWAgZmllbGQKKyAgICogICBpcyAnS09JOCcgYW5kIHRoZSBgY3NfZW5jb2RpbmdgIGZpZWxkIGlzICdSJywgdGhlIGZvbnQgaXMgZW5jb2RlZCBpbgorICAgKiAgIEtPSTgtUi4KKyAgICoKKyAgICogICBgRlRfRU5DT0RJTkdfTk9ORWAgaXMgYWx3YXlzIHNldCAod2l0aCBhIHNpbmdsZSBleGNlcHRpb24pIGJ5IHRoZQorICAgKiAgIHdpbmZvbnRzIGRyaXZlci4gIFVzZSBARlRfR2V0X1dpbkZOVF9IZWFkZXIgYW5kIGV4YW1pbmUgdGhlIGBjaGFyc2V0YAorICAgKiAgIGZpZWxkIG9mIHRoZSBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUgdG8gZmluZCBvdXQgd2hpY2ggZW5jb2RpbmcKKyAgICogICBpcyByZWFsbHkgcHJlc2VudC4gIEZvciBleGFtcGxlLCBARlRfV2luRk5UX0lEX0NQMTI1MSAoMjA0KSBtZWFucworICAgKiAgIFdpbmRvd3MgY29kZSBwYWdlIDEyNTEgKGZvciBSdXNzaWFuKS4KKyAgICoKKyAgICogICBgRlRfRU5DT0RJTkdfTk9ORWAgaXMgc2V0IGlmIGBwbGF0Zm9ybV9pZGAgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSAorICAgKiAgIGFuZCBgZW5jb2RpbmdfaWRgIGlzIG5vdCBgVFRfTUFDX0lEX1JPTUFOYCAob3RoZXJ3aXNlIGl0IGlzIHNldCB0bworICAgKiAgIGBGVF9FTkNPRElOR19BUFBMRV9ST01BTmApLgorICAgKgorICAgKiAgIElmIGBwbGF0Zm9ybV9pZGAgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCwgdXNlIHRoZSBmdW5jdGlvbgorICAgKiAgIEBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCB0byBxdWVyeSB0aGUgTWFjIGxhbmd1YWdlIElEIHRoYXQgbWF5IGJlCisgICAqICAgbmVlZGVkIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggQXBwbGUgZW5jb2RpbmcgdmFyaWFudHMuICBTZWUKKyAgICoKKyAgICogICAgIGh0dHBzOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL1JlYWRtZS50eHQKKyAgICoKKyAgICogICB0byBnZXQgYW4gaWRlYSBob3cgdG8gZG8gdGhhdC4gIEJhc2ljYWxseSwgaWYgdGhlIGxhbmd1YWdlIElEIGlzfjAsCisgICAqICAgZG9uJ3QgdXNlIGl0LCBvdGhlcndpc2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBsYW5ndWFnZSBJRC4gIFRoZW4gZXhhbWluZQorICAgKiAgIGBlbmNvZGluZ19pZGAuICBJZiwgZm9yIGV4YW1wbGUsIGBlbmNvZGluZ19pZGAgaXMgYFRUX01BQ19JRF9ST01BTmAKKyAgICogICBhbmQgdGhlIGxhbmd1YWdlIElEIChtaW51c34xKSBpcyBgVFRfTUFDX0xBTkdJRF9HUkVFS2AsIGl0IGlzIHRoZQorICAgKiAgIEdyZWVrIGVuY29kaW5nLCBub3QgUm9tYW4uICBgVFRfTUFDX0lEX0FSQUJJQ2Agd2l0aAorICAgKiAgIGBUVF9NQUNfTEFOR0lEX0ZBUlNJYCBtZWFucyB0aGUgRmFyc2kgdmFyaWFudCB0aGUgQXJhYmljIGVuY29kaW5nLgorICAgKi8KICAgdHlwZWRlZiBlbnVtICBGVF9FbmNvZGluZ18KICAgewogICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX05PTkUsIDAsIDAsIDAsIDAgKSwKQEAgLTc5Niw3ICs3NzAsNyBAQAogICB9IEZUX0VuY29kaW5nOwogCiAKLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX0VuY29kaW5nJyAqLworICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfRW5jb2RpbmdgICovCiAgIC8qIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfZW5jb2Rpbmdfbm9uZSAgICAgICAgICAgIEZUX0VOQ09ESU5HX05PTkUKICNkZWZpbmUgZnRfZW5jb2RpbmdfdW5pY29kZSAgICAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUKQEAgLTgxNSwyOSArNzg5LDMxIEBACiAjZGVmaW5lIGZ0X2VuY29kaW5nX2FwcGxlX3JvbWFuICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhck1hcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJhc2UgY2hhcm1hcCBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZyAgICA6OiBBbiBARlRfRW5jb2RpbmcgdGFnIGlkZW50aWZ5aW5nIHRoZSBjaGFybWFwLiAgVXNlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhpcyB3aXRoIEBGVF9TZWxlY3RfQ2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybV9pZCA6OiBBbiBJRCBudW1iZXIgZGVzY3JpYmluZyB0aGUgcGxhdGZvcm0gZm9yIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIGVuY29kaW5nIElELiAgVGhpcyBjb21lcyBkaXJlY3RseSBmcm9tICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGFuZCBnZXRzIGVtdWxhdGVkIGZvciAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvdGhlciBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nX2lkIDo6IEEgcGxhdGZvcm0gc3BlY2lmaWMgZW5jb2RpbmcgbnVtYmVyLiAgVGhpcyBhbHNvICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGFuZCBnZXRzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZW11bGF0ZWQgc2ltaWxhcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9DaGFyTWFwUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgYmFzZSBjaGFybWFwIHN0cnVjdHVyZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGVuY29kaW5nIDo6CisgICAqICAgICBBbiBARlRfRW5jb2RpbmcgdGFnIGlkZW50aWZ5aW5nIHRoZSBjaGFybWFwLiAgVXNlIHRoaXMgd2l0aAorICAgKiAgICAgQEZUX1NlbGVjdF9DaGFybWFwLgorICAgKgorICAgKiAgIHBsYXRmb3JtX2lkIDo6CisgICAqICAgICBBbiBJRCBudW1iZXIgZGVzY3JpYmluZyB0aGUgcGxhdGZvcm0gZm9yIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgSUQuCisgICAqICAgICBUaGlzIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gYW5kIGdldHMKKyAgICogICAgIGVtdWxhdGVkIGZvciBvdGhlciBmb3JtYXRzLgorICAgKgorICAgKiAgIGVuY29kaW5nX2lkIDo6CisgICAqICAgICBBIHBsYXRmb3JtLXNwZWNpZmljIGVuY29kaW5nIG51bWJlci4gIFRoaXMgYWxzbyBjb21lcyBmcm9tIHRoZQorICAgKiAgICAgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBhbmQgZ2V0cyBlbXVsYXRlZCBzaW1pbGFybHkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfQ2hhck1hcFJlY18KICAgewogICAgIEZUX0ZhY2UgICAgICBmYWNlOwpAQCAtODU3LDIxNSArODMzLDE5OCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX0ZhY2VfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSB0aGF0IG1vZGVscyAqLwotICAvKiAgICB0aGUgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX0ZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIEZyZWVUeXBlfjIgYW5kIGlzICAqLwotICAvKiAgICBub3QgZ2VuZXJhbGx5IGF2YWlsYWJsZSB0byBjbGllbnQgYXBwbGljYXRpb25zLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9GYWNlX0ludGVybmFsCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGBGVF9GYWNlX0ludGVybmFsUmVjYCBzdHJ1Y3R1cmUgdGhhdCBtb2RlbHMgdGhlCisgICAqICAgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX0ZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIFRoaXMgc3RydWN0dXJlIG1pZ2h0IGNoYW5nZSBiZXR3ZWVuIHJlbGVhc2VzIG9mIEZyZWVUeXBlfjIgYW5kIGlzIG5vdAorICAgKiAgIGdlbmVyYWxseSBhdmFpbGFibGUgdG8gY2xpZW50IGFwcGxpY2F0aW9ucy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0ZhY2VfSW50ZXJuYWxSZWNfKiAgRlRfRmFjZV9JbnRlcm5hbDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZmFjZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIGZhY2Ugb2JqZWN0IG1vZGVscyBhICAgICAgICAqLwotICAvKiAgICB0eXBlZmFjZSBpbiBhIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZmFjZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGZvbnQgZmlsZS4gIFNvbWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMgY2FuIGhhdmUgbXVsdGlwbGUgZmFjZXMgaW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCAgICAgICAgICA6OiBUaGlzIGZpZWxkIGhvbGRzIHR3byBkaWZmZXJlbnQgdmFsdWVzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyAwLTE1IGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZSAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4wKS4gIFRoZXkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgc2V0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgZmFjZSBpbiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBbU2luY2UgMi42LjFdIEJpdHMgMTYtMzAgYXJlIHJlbGV2YW50IHRvIEdYICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cyBvbmx5LCBob2xkaW5nICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lZCBpbnN0YW5jZSBpbmRleCBmb3IgdGhlIGN1cnJlbnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlIGluZGV4IChzdGFydGluZyB3aXRoIHZhbHVlfjE7IHZhbHVlfjAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIGZvbnQgYWNjZXNzIHdpdGhvdXQgYSBuYW1lZCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlKS4gIEZvciBub24tdmFyaWF0aW9uIGZvbnRzLCBiaXRzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAxNi0zMCBhcmUgaWdub3JlZC4gIElmIHdlIGhhdmUgdGhlIHRoaXJkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWQgaW5zdGFuY2Ugb2YgZmFjZX40LCBzYXksIGBmYWNlX2luZGV4JyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHNldCB0byAweDAwMDMwMDA0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDMxIGlzIGFsd2F5cyB6ZXJvICh0aGlzIGlzLCAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYWNlX2luZGV4JyBpcyBhbHdheXMgYSBwb3NpdGl2ZSB2YWx1ZSkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NpbmNlIDIuOV0gQ2hhbmdpbmcgdGhlIGRlc2lnbiBjb29yZGluYXRlcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIG9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyBkb2VzIG5vdCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBuYW1lZCBpbnN0YW5jZSBpbmRleCB2YWx1ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IEBGVF9TZXRfTmFtZWRfSW5zdGFuY2UgZG9lcyB0aGF0KS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfZmxhZ3MgICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgZ2l2ZSBpbXBvcnRhbnQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOyBzZWUgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX1hYWCBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9mbGFncyAgICAgICAgIDo6IFRoZSBsb3dlciAxNn5iaXRzIGNvbnRhaW4gYSBzZXQgb2YgYml0ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiB0aGUgZmFjZTsgc2VlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1NUWUxFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBbU2luY2UgMi42LjFdIEJpdHMgMTYtMzAgaG9sZCB0aGUgbnVtYmVyICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbmFtZWQgaW5zdGFuY2VzIGF2YWlsYWJsZSBmb3IgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZmFjZSBpZiB3ZSBoYXZlIGEgR1ggb3IgT3BlblR5cGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYXRpb24gKHN1Yilmb250LiAgQml0IDMxIGlzIGFsd2F5cyB6ZXJvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgaXMsIGBzdHlsZV9mbGFncycgaXMgYWx3YXlzIGEgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlIHZhbHVlKS4gIE5vdGUgdGhhdCBhIHZhcmlhdGlvbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGhhcyBhbHdheXMgYXQgbGVhc3Qgb25lIG5hbWVkICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsIG5hbWVseSB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZmFjZS4gIElmIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSBpcyBzY2FsYWJsZSBhbmQgaGFzIHNiaXRzIChzZWUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBudW1fZml4ZWRfc2l6ZXMnKSwgaXQgaXMgc2V0IHRvIHRoZSBudW1iZXIgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBvdXRsaW5lIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBDSUQta2V5ZWQgZm9udHMgKG5vdCBpbiBhbiBTRk5UICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyKSB0aGlzIHZhbHVlIGdpdmVzIHRoZSBoaWdoZXN0IENJRCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFtaWx5X25hbWUgICAgICAgICA6OiBUaGUgZmFjZSdzIGZhbWlseSBuYW1lLiAgVGhpcyBpcyBhbiBBU0NJSSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCB1c3VhbGx5IGluIEVuZ2xpc2gsIHRoYXQgZGVzY3JpYmVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlZmFjZSdzIGZhbWlseSAobGlrZSBgVGltZXMgTmV3ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBSb21hbicsIGBCb2RvbmknLCBgR2FyYW1vbmQnLCBldGMpLiAgVGhpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBsZWFzdCBjb21tb24gZGVub21pbmF0b3IgdXNlZCB0byBsaXN0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzLiAgU29tZSBmb3JtYXRzIChUcnVlVHlwZSAmIE9wZW5UeXBlKSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIGxvY2FsaXplZCBhbmQgVW5pY29kZSB2ZXJzaW9ucyBvZiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdHJpbmcuICBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgTlVMTCAoZS5nLiwgaW4gZm9udHMgZW1iZWRkZWQgaW4gYSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUERGIGZpbGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIHRoZSBmb250IGRvZXNuJ3QgcHJvdmlkZSBhIHNwZWNpZmljICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5IG5hbWUgZW50cnksIEZyZWVUeXBlIHRyaWVzIHRvICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRoZXNpemUgb25lLCBkZXJpdmluZyBpdCBmcm9tIG90aGVyIG5hbWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9uYW1lICAgICAgICAgIDo6IFRoZSBmYWNlJ3Mgc3R5bGUgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwgdGhhdCBkZXNjcmliZXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHR5cGVmYWNlJ3Mgc3R5bGUgKGxpa2UgYEl0YWxpYycsICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCb2xkJywgYENvbmRlbnNlZCcsIGV0YykuICBOb3QgYWxsIGZvbnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzIHByb3ZpZGUgYSBzdHlsZSBuYW1lLCBzbyB0aGlzIGZpZWxkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgb3B0aW9uYWwsIGFuZCBjYW4gYmUgc2V0IHRvIE5VTEwuICBBcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBgZmFtaWx5X25hbWUnLCBzb21lIGZvcm1hdHMgcHJvdmlkZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMgb2YgdGhpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGZvcm1hdCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlbS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9maXhlZF9zaXplcyAgICAgOjogVGhlIG51bWJlciBvZiBiaXRtYXAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW4gaWYgdGhlIGZhY2UgaXMgc2NhbGFibGUsIHRoZXJlIG1pZ2h0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSBiaXRtYXAgc3RyaWtlcywgd2hpY2ggYXJlIGNhbGxlZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYHNiaXRzJyBpbiB0aGF0IGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXZhaWxhYmxlX3NpemVzICAgICA6OiBBbiBhcnJheSBvZiBARlRfQml0bWFwX1NpemUgZm9yIGFsbCBiaXRtYXAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gIEl0IGlzIHNldCB0byBOVUxMIGlmICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIG5vIGJpdG1hcCBzdHJpa2UuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IEZyZWVUeXBlIHRyaWVzIHRvIHNhbml0aXplIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZSBkYXRhIHNpbmNlIHRoZXkgYXJlIHNvbWV0aW1lcyBzbG9wcHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpbmNvcnJlY3QsIGJ1dCB0aGlzIGNhbiBlYXNpbHkgZmFpbC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY2hhcm1hcHMgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgY2hhcm1hcHMgaW4gdGhlIGZhY2UuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXBzICAgICAgICAgICAgOjogQW4gYXJyYXkgb2YgdGhlIGNoYXJtYXBzIG9mIHRoZSBmYWNlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2VuZXJpYyAgICAgICAgICAgICA6OiBBIGZpZWxkIHJlc2VydmVkIGZvciBjbGllbnQgdXNlcy4gIFNlZSB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dlbmVyaWMgdHlwZSBkZXNjcmlwdGlvbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMgKHNlZSAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bml0c19wZXJfRU0nKS4gIFRoZSBib3ggaXMgbGFyZ2UgZW5vdWdoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb250YWluIGFueSBnbHlwaCBmcm9tIHRoZSBmb250LiAgVGh1cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1heCcgY2FuIGJlIHNlZW4gYXMgdGhlIGBtYXhpbXVtICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VuZGVyJywgYW5kIGBiYm94LnlNaW4nIGFzIHRoZSBgbWluaW11bSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kZXInLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBtaWdodCBiZSBvZmYgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0IGxlYXN0KSBvbmUgcGl4ZWwgZm9yIGhpbnRlZCBmb250cy4gIFNlZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9TaXplX01ldHJpY3MgZm9yIGZ1cnRoZXIgZGlzY3Vzc2lvbi4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVuaXRzX3Blcl9FTSAgICAgICAgOjogVGhlIG51bWJlciBvZiBmb250IHVuaXRzIHBlciBFTSBzcXVhcmUgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjZS4gIFRoaXMgaXMgdHlwaWNhbGx5IDIwNDggZm9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmb250cywgYW5kIDEwMDAgZm9yIFR5cGV+MSBmb250cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIgICAgICAgICAgICA6OiBUaGUgdHlwb2dyYXBoaWMgYXNjZW5kZXIgb2YgdGhlIGZhY2UsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBGb3IgZm9udCBmb3JtYXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgaXQgaXMgc2V0IHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWF4Jy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICA6OiBUaGUgdHlwb2dyYXBoaWMgZGVzY2VuZGVyIG9mIHRoZSBmYWNlLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBGb3IgZm9udCBmb3JtYXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgaXQgaXMgc2V0IHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWluJy4gIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgZm9yIHZhbHVlcyBiZWxvdyB0aGUgYmFzZWxpbmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICAgICAgICAgOjogVGhpcyB2YWx1ZSBpcyB0aGUgdmVydGljYWwgZGlzdGFuY2UgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGJhc2VsaW5lcywgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEl0IGlzIGFsd2F5cyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdsb2JhbCBnbHlwaCBoZWlnaHQsIHVzZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhc2NlbmRlciAtIGRlc2NlbmRlcicuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlX3dpZHRoICAgOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCwgaW4gZm9udCB1bml0cywgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgY2FuIGJlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIG1ha2Ugd29yZCB3cmFwcGluZyBjb21wdXRhdGlvbnMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGVyLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlX2hlaWdodCAgOjogVGhlIG1heGltdW0gYWR2YW5jZSBoZWlnaHQsIGluIGZvbnQgdW5pdHMsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgaXMgb25seSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3IgdmVydGljYWwgbGF5b3V0cywgYW5kIGlzIHNldCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYGhlaWdodCcgZm9yIGZvbnRzIHRoYXQgZG8gbm90IHByb3ZpZGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MuICBPbmx5IHJlbGV2YW50IGZvciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bmRlcmxpbmVfcG9zaXRpb24gIDo6IFRoZSBwb3NpdGlvbiwgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgbGluZSBmb3IgdGhpcyBmYWNlLiAgSXQgaXMgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIG9mIHRoZSB1bmRlcmxpbmluZyBzdGVtLiAgT25seSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVuZGVybGluZV90aGlja25lc3MgOjogVGhlIHRoaWNrbmVzcywgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSBmb3IgdGhpcyBmYWNlLiAgT25seSByZWxldmFudCBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgYXNzb2NpYXRlZCBnbHlwaCBzbG90KHMpLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgICAgICAgICAgOjogVGhlIGN1cnJlbnQgYWN0aXZlIHNpemUgZm9yIHRoaXMgZmFjZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCAgICAgICAgICAgICA6OiBUaGUgY3VycmVudCBhY3RpdmUgY2hhcm1hcCBmb3IgdGhpcyBmYWNlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmllbGRzIG1heSBiZSBjaGFuZ2VkIGFmdGVyIGEgY2FsbCB0byBARlRfQXR0YWNoX0ZpbGUgb3IgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9BdHRhY2hfU3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIGFuIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250LCB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzICovCi0gIC8qICAgIGNhbiBjaGFuZ2UgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAoYW5kICAgICAqLwotICAvKiAgICBmcmllbmRzKSBpZiB0aGUgZm9udCBjb250YWlucyBhbiBgTVZBUicgdGFibGU6IGBhc2NlbmRlcicsICAgICAgICAgKi8KLSAgLyogICAgYGRlc2NlbmRlcicsIGBoZWlnaHQnLCBgdW5kZXJsaW5lX3Bvc2l0aW9uJywgYW5kICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGB1bmRlcmxpbmVfdGhpY2tuZXNzJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXNwZWNpYWxseSBmb3IgVHJ1ZVR5cGUgZm9udHMgc2VlIGFsc28gdGhlIGRvY3VtZW50YXRpb24gZm9yICAgICAgICovCi0gIC8qICAgIEBGVF9TaXplX01ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfRmFjZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRnJlZVR5cGUgcm9vdCBmYWNlIGNsYXNzIHN0cnVjdHVyZS4gIEEgZmFjZSBvYmplY3QgbW9kZWxzIGEgdHlwZWZhY2UKKyAgICogICBpbiBhIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBudW1fZmFjZXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZmFjZXMgaW4gdGhlIGZvbnQgZmlsZS4gIFNvbWUgZm9udCBmb3JtYXRzIGNhbiBoYXZlCisgICAqICAgICBtdWx0aXBsZSBmYWNlcyBpbiBhIHNpbmdsZSBmb250IGZpbGUuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgVGhpcyBmaWVsZCBob2xkcyB0d28gZGlmZmVyZW50IHZhbHVlcy4gIEJpdHMgMC0xNSBhcmUgdGhlIGluZGV4IG9mCisgICAqICAgICB0aGUgZmFjZSBpbiB0aGUgZm9udCBmaWxlIChzdGFydGluZyB3aXRoIHZhbHVlfjApLiAgVGhleSBhcmUgc2V0CisgICAqICAgICB0b34wIGlmIHRoZXJlIGlzIG9ubHkgb25lIGZhY2UgaW4gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogICAgIFtTaW5jZSAyLjYuMV0gQml0cyAxNi0zMCBhcmUgcmVsZXZhbnQgdG8gR1ggYW5kIE9wZW5UeXBlIHZhcmlhdGlvbgorICAgKiAgICAgZm9udHMgb25seSwgaG9sZGluZyB0aGUgbmFtZWQgaW5zdGFuY2UgaW5kZXggZm9yIHRoZSBjdXJyZW50IGZhY2UKKyAgICogICAgIGluZGV4IChzdGFydGluZyB3aXRoIHZhbHVlfjE7IHZhbHVlfjAgaW5kaWNhdGVzIGZvbnQgYWNjZXNzIHdpdGhvdXQKKyAgICogICAgIGEgbmFtZWQgaW5zdGFuY2UpLiAgRm9yIG5vbi12YXJpYXRpb24gZm9udHMsIGJpdHMgMTYtMzAgYXJlIGlnbm9yZWQuCisgICAqICAgICBJZiB3ZSBoYXZlIHRoZSB0aGlyZCBuYW1lZCBpbnN0YW5jZSBvZiBmYWNlfjQsIHNheSwgYGZhY2VfaW5kZXhgIGlzCisgICAqICAgICBzZXQgdG8gMHgwMDAzMDAwNC4KKyAgICoKKyAgICogICAgIEJpdCAzMSBpcyBhbHdheXMgemVybyAodGhpcyBpcywgYGZhY2VfaW5kZXhgIGlzIGFsd2F5cyBhIHBvc2l0aXZlCisgICAqICAgICB2YWx1ZSkuCisgICAqCisgICAqICAgICBbU2luY2UgMi45XSBDaGFuZ2luZyB0aGUgZGVzaWduIGNvb3JkaW5hdGVzIHdpdGgKKyAgICogICAgIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyBvciBARlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyBkb2VzCisgICAqICAgICBub3QgaW5mbHVlbmNlIHRoZSBuYW1lZCBpbnN0YW5jZSBpbmRleCB2YWx1ZSAob25seQorICAgKiAgICAgQEZUX1NldF9OYW1lZF9JbnN0YW5jZSBkb2VzIHRoYXQpLgorICAgKgorICAgKiAgIGZhY2VfZmxhZ3MgOjoKKyAgICogICAgIEEgc2V0IG9mIGJpdCBmbGFncyB0aGF0IGdpdmUgaW1wb3J0YW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOworICAgKiAgICAgc2VlIEBGVF9GQUNFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4KKyAgICoKKyAgICogICBzdHlsZV9mbGFncyA6OgorICAgKiAgICAgVGhlIGxvd2VyIDE2fmJpdHMgY29udGFpbiBhIHNldCBvZiBiaXQgZmxhZ3MgaW5kaWNhdGluZyB0aGUgc3R5bGUgb2YKKyAgICogICAgIHRoZSBmYWNlOyBzZWUgQEZUX1NUWUxFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4KKyAgICoKKyAgICogICAgIFtTaW5jZSAyLjYuMV0gQml0cyAxNi0zMCBob2xkIHRoZSBudW1iZXIgb2YgbmFtZWQgaW5zdGFuY2VzCisgICAqICAgICBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGZhY2UgaWYgd2UgaGF2ZSBhIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbgorICAgKiAgICAgKHN1Yilmb250LiAgQml0IDMxIGlzIGFsd2F5cyB6ZXJvICh0aGlzIGlzLCBgc3R5bGVfZmxhZ3NgIGlzIGFsd2F5cworICAgKiAgICAgYSBwb3NpdGl2ZSB2YWx1ZSkuICBOb3RlIHRoYXQgYSB2YXJpYXRpb24gZm9udCBoYXMgYWx3YXlzIGF0IGxlYXN0CisgICAqICAgICBvbmUgbmFtZWQgaW5zdGFuY2UsIG5hbWVseSB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICoKKyAgICogICBudW1fZ2x5cGhzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZmFjZS4gIElmIHRoZSBmYWNlIGlzIHNjYWxhYmxlIGFuZCBoYXMKKyAgICogICAgIHNiaXRzIChzZWUgYG51bV9maXhlZF9zaXplc2ApLCBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBvdXRsaW5lCisgICAqICAgICBnbHlwaHMuCisgICAqCisgICAqICAgICBGb3IgQ0lELWtleWVkIGZvbnRzIChub3QgaW4gYW4gU0ZOVCB3cmFwcGVyKSB0aGlzIHZhbHVlIGdpdmVzIHRoZQorICAgKiAgICAgaGlnaGVzdCBDSUQgdXNlZCBpbiB0aGUgZm9udC4KKyAgICoKKyAgICogICBmYW1pbHlfbmFtZSA6OgorICAgKiAgICAgVGhlIGZhY2UncyBmYW1pbHkgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgc3RyaW5nLCB1c3VhbGx5IGluCisgICAqICAgICBFbmdsaXNoLCB0aGF0IGRlc2NyaWJlcyB0aGUgdHlwZWZhY2UncyBmYW1pbHkgKGxpa2UgJ1RpbWVzIE5ldworICAgKiAgICAgUm9tYW4nLCAnQm9kb25pJywgJ0dhcmFtb25kJywgZXRjKS4gIFRoaXMgaXMgYSBsZWFzdCBjb21tb24KKyAgICogICAgIGRlbm9taW5hdG9yIHVzZWQgdG8gbGlzdCBmb250cy4gIFNvbWUgZm9ybWF0cyAoVHJ1ZVR5cGUgJiBPcGVuVHlwZSkKKyAgICogICAgIHByb3ZpZGUgbG9jYWxpemVkIGFuZCBVbmljb2RlIHZlcnNpb25zIG9mIHRoaXMgc3RyaW5nLiAgQXBwbGljYXRpb25zCisgICAqICAgICBzaG91bGQgdXNlIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLiAgQ2FuIGJlCisgICAqICAgICBgTlVMTGAgKGUuZy4sIGluIGZvbnRzIGVtYmVkZGVkIGluIGEgUERGIGZpbGUpLgorICAgKgorICAgKiAgICAgSW4gY2FzZSB0aGUgZm9udCBkb2Vzbid0IHByb3ZpZGUgYSBzcGVjaWZpYyBmYW1pbHkgbmFtZSBlbnRyeSwKKyAgICogICAgIEZyZWVUeXBlIHRyaWVzIHRvIHN5bnRoZXNpemUgb25lLCBkZXJpdmluZyBpdCBmcm9tIG90aGVyIG5hbWUKKyAgICogICAgIGVudHJpZXMuCisgICAqCisgICAqICAgc3R5bGVfbmFtZSA6OgorICAgKiAgICAgVGhlIGZhY2UncyBzdHlsZSBuYW1lLiAgVGhpcyBpcyBhbiBBU0NJSSBzdHJpbmcsIHVzdWFsbHkgaW4gRW5nbGlzaCwKKyAgICogICAgIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlZmFjZSdzIHN0eWxlIChsaWtlICdJdGFsaWMnLCAnQm9sZCcsCisgICAqICAgICAnQ29uZGVuc2VkJywgZXRjKS4gIE5vdCBhbGwgZm9udCBmb3JtYXRzIHByb3ZpZGUgYSBzdHlsZSBuYW1lLCBzbworICAgKiAgICAgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSBzZXQgdG8gYE5VTExgLiAgQXMgZm9yCisgICAqICAgICBgZmFtaWx5X25hbWVgLCBzb21lIGZvcm1hdHMgcHJvdmlkZSBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMKKyAgICogICAgIG9mIHRoaXMgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGZvcm1hdC1zcGVjaWZpYworICAgKiAgICAgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLgorICAgKgorICAgKiAgIG51bV9maXhlZF9zaXplcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBiaXRtYXAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gIEV2ZW4gaWYgdGhlIGZhY2UgaXMKKyAgICogICAgIHNjYWxhYmxlLCB0aGVyZSBtaWdodCBzdGlsbCBiZSBiaXRtYXAgc3RyaWtlcywgd2hpY2ggYXJlIGNhbGxlZAorICAgKiAgICAgJ3NiaXRzJyBpbiB0aGF0IGNhc2UuCisgICAqCisgICAqICAgYXZhaWxhYmxlX3NpemVzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBARlRfQml0bWFwX1NpemUgZm9yIGFsbCBiaXRtYXAgc3RyaWtlcyBpbiB0aGUgZmFjZS4gIEl0CisgICAqICAgICBpcyBzZXQgdG8gYE5VTExgIGlmIHRoZXJlIGlzIG5vIGJpdG1hcCBzdHJpa2UuCisgICAqCisgICAqICAgICBOb3RlIHRoYXQgRnJlZVR5cGUgdHJpZXMgdG8gc2FuaXRpemUgdGhlIHN0cmlrZSBkYXRhIHNpbmNlIHRoZXkgYXJlCisgICAqICAgICBzb21ldGltZXMgc2xvcHB5IG9yIGluY29ycmVjdCwgYnV0IHRoaXMgY2FuIGVhc2lseSBmYWlsLgorICAgKgorICAgKiAgIG51bV9jaGFybWFwcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBjaGFybWFwcyBpbiB0aGUgZmFjZS4KKyAgICoKKyAgICogICBjaGFybWFwcyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgdGhlIGNoYXJtYXBzIG9mIHRoZSBmYWNlLgorICAgKgorICAgKiAgIGdlbmVyaWMgOjoKKyAgICogICAgIEEgZmllbGQgcmVzZXJ2ZWQgZm9yIGNsaWVudCB1c2VzLiAgU2VlIHRoZSBARlRfR2VuZXJpYyB0eXBlCisgICAqICAgICBkZXNjcmlwdGlvbi4KKyAgICoKKyAgICogICBiYm94IDo6CisgICAqICAgICBUaGUgZm9udCBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMgKHNlZQorICAgKiAgICAgYHVuaXRzX3Blcl9FTWApLiAgVGhlIGJveCBpcyBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhbnkgZ2x5cGggZnJvbQorICAgKiAgICAgdGhlIGZvbnQuICBUaHVzLCBgYmJveC55TWF4YCBjYW4gYmUgc2VlbiBhcyB0aGUgJ21heGltdW0gYXNjZW5kZXInLAorICAgKiAgICAgYW5kIGBiYm94LnlNaW5gIGFzIHRoZSAnbWluaW11bSBkZXNjZW5kZXInLiAgT25seSByZWxldmFudCBmb3IKKyAgICogICAgIHNjYWxhYmxlIGZvcm1hdHMuCisgICAqCisgICAqICAgICBOb3RlIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBtaWdodCBiZSBvZmYgYnkgKGF0IGxlYXN0KSBvbmUgcGl4ZWwgZm9yCisgICAqICAgICBoaW50ZWQgZm9udHMuICBTZWUgQEZUX1NpemVfTWV0cmljcyBmb3IgZnVydGhlciBkaXNjdXNzaW9uLgorICAgKgorICAgKiAgICAgTm90ZSB0aGF0IHRoZSBib3VuZGluZyBib3ggZG9lcyBub3QgdmFyeSBpbiBPcGVuVHlwZSB2YXJpYWJsZSBmb250cworICAgKiAgICAgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gcmVsYXRpb24gdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UuCisgICAqCisgICAqICAgdW5pdHNfcGVyX0VNIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGZvbnQgdW5pdHMgcGVyIEVNIHNxdWFyZSBmb3IgdGhpcyBmYWNlLiAgVGhpcyBpcworICAgKiAgICAgdHlwaWNhbGx5IDIwNDggZm9yIFRydWVUeXBlIGZvbnRzLCBhbmQgMTAwMCBmb3IgVHlwZX4xIGZvbnRzLiAgT25seQorICAgKiAgICAgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuCisgICAqCisgICAqICAgYXNjZW5kZXIgOjoKKyAgICogICAgIFRoZSB0eXBvZ3JhcGhpYyBhc2NlbmRlciBvZiB0aGUgZmFjZSwgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBGb3IKKyAgICogICAgIGZvbnQgZm9ybWF0cyBub3QgaGF2aW5nIHRoaXMgaW5mb3JtYXRpb24sIGl0IGlzIHNldCB0byBgYmJveC55TWF4YC4KKyAgICogICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuCisgICAqCisgICAqICAgZGVzY2VuZGVyIDo6CisgICAqICAgICBUaGUgdHlwb2dyYXBoaWMgZGVzY2VuZGVyIG9mIHRoZSBmYWNlLCBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEZvcgorICAgKiAgICAgZm9udCBmb3JtYXRzIG5vdCBoYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgaXQgaXMgc2V0IHRvIGBiYm94LnlNaW5gLgorICAgKiAgICAgTm90ZSB0aGF0IHRoaXMgZmllbGQgaXMgbmVnYXRpdmUgZm9yIHZhbHVlcyBiZWxvdyB0aGUgYmFzZWxpbmUuCisgICAqICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLgorICAgKgorICAgKiAgIGhlaWdodCA6OgorICAgKiAgICAgVGhpcyB2YWx1ZSBpcyB0aGUgdmVydGljYWwgZGlzdGFuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUKKyAgICogICAgIGJhc2VsaW5lcywgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBJdCBpcyBhbHdheXMgcG9zaXRpdmUuICBPbmx5CisgICAqICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4KKyAgICoKKyAgICogICAgIElmIHlvdSB3YW50IHRoZSBnbG9iYWwgZ2x5cGggaGVpZ2h0LCB1c2UgYGFzY2VuZGVyIC0gZGVzY2VuZGVyYC4KKyAgICoKKyAgICogICBtYXhfYWR2YW5jZV93aWR0aCA6OgorICAgKiAgICAgVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCwgaW4gZm9udCB1bml0cywgZm9yIGFsbCBnbHlwaHMgaW4gdGhpcworICAgKiAgICAgZmFjZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB3b3JkIHdyYXBwaW5nIGNvbXB1dGF0aW9ucyBmYXN0ZXIuCisgICAqICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLgorICAgKgorICAgKiAgIG1heF9hZHZhbmNlX2hlaWdodCA6OgorICAgKiAgICAgVGhlIG1heGltdW0gYWR2YW5jZSBoZWlnaHQsIGluIGZvbnQgdW5pdHMsIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMKKyAgICogICAgIGZhY2UuICBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHZlcnRpY2FsIGxheW91dHMsIGFuZCBpcyBzZXQgdG8KKyAgICogICAgIGBoZWlnaHRgIGZvciBmb250cyB0aGF0IGRvIG5vdCBwcm92aWRlIHZlcnRpY2FsIG1ldHJpY3MuICBPbmx5CisgICAqICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4KKyAgICoKKyAgICogICB1bmRlcmxpbmVfcG9zaXRpb24gOjoKKyAgICogICAgIFRoZSBwb3NpdGlvbiwgaW4gZm9udCB1bml0cywgb2YgdGhlIHVuZGVybGluZSBsaW5lIGZvciB0aGlzIGZhY2UuCisgICAqICAgICBJdCBpcyB0aGUgY2VudGVyIG9mIHRoZSB1bmRlcmxpbmluZyBzdGVtLiAgT25seSByZWxldmFudCBmb3IKKyAgICogICAgIHNjYWxhYmxlIGZvcm1hdHMuCisgICAqCisgICAqICAgdW5kZXJsaW5lX3RoaWNrbmVzcyA6OgorICAgKiAgICAgVGhlIHRoaWNrbmVzcywgaW4gZm9udCB1bml0cywgb2YgdGhlIHVuZGVybGluZSBmb3IgdGhpcyBmYWNlLiAgT25seQorICAgKiAgICAgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuCisgICAqCisgICAqICAgZ2x5cGggOjoKKyAgICogICAgIFRoZSBmYWNlJ3MgYXNzb2NpYXRlZCBnbHlwaCBzbG90KHMpLgorICAgKgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGFjdGl2ZSBzaXplIGZvciB0aGlzIGZhY2UuCisgICAqCisgICAqICAgY2hhcm1hcCA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgYWN0aXZlIGNoYXJtYXAgZm9yIHRoaXMgZmFjZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgRmllbGRzIG1heSBiZSBjaGFuZ2VkIGFmdGVyIGEgY2FsbCB0byBARlRfQXR0YWNoX0ZpbGUgb3IKKyAgICogICBARlRfQXR0YWNoX1N0cmVhbS4KKyAgICoKKyAgICogICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgY2FuCisgICAqICAgY2hhbmdlIGFmdGVyIGEgY2FsbCB0byBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgKGFuZCBmcmllbmRzKSBpZgorICAgKiAgIHRoZSBmb250IGNvbnRhaW5zIGFuICdNVkFSJyB0YWJsZTogYGFzY2VuZGVyYCwgYGRlc2NlbmRlcmAsIGBoZWlnaHRgLAorICAgKiAgIGB1bmRlcmxpbmVfcG9zaXRpb25gLCBhbmQgYHVuZGVybGluZV90aGlja25lc3NgLgorICAgKgorICAgKiAgIEVzcGVjaWFsbHkgZm9yIFRydWVUeXBlIGZvbnRzIHNlZSBhbHNvIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICAgKiAgIEBGVF9TaXplX01ldHJpY3MuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfRmFjZVJlY18KICAgewogICAgIEZUX0xvbmcgICAgICAgICAgIG51bV9mYWNlczsKQEAgLTEwODcsNyArMTA0Niw3IEBACiAKICAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOwogCi0gICAgLyojIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyAoZG93biB0byBgdW5kZXJsaW5lX3RoaWNrbmVzcycpICovCisgICAgLyojIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyAoZG93biB0byBgdW5kZXJsaW5lX3RoaWNrbmVzc2ApICovCiAgICAgLyojIGFyZSBvbmx5IHJlbGV2YW50IHRvIHNjYWxhYmxlIG91dGxpbmVzOyBjZi4gQEZUX0JpdG1hcF9TaXplICAgICovCiAgICAgLyojIGZvciBiaXRtYXAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgRlRfQkJveCAgICAgICAgICAgYmJveDsKQEAgLTExMjUsMTE3ICsxMDg0LDExNiBAQAogICB9IEZUX0ZhY2VSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGBmYWNlX2ZsYWdzJyBmaWVsZCBvZiB0aGUgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgVGhleSBpbmZvcm0gY2xpZW50IGFwcGxpY2F0aW9ucyBvZiAgICAgICAgICovCi0gIC8qICAgIHByb3BlcnRpZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGNvbnRhaW5zIG91dGxpbmUgZ2x5cGhzLiAgTm90ZSB0aGF0IGEgZmFjZSBjYW4gY29udGFpbiAgKi8KLSAgLyogICAgICBiaXRtYXAgc3RyaWtlcyBhbHNvLCBpLmUuLCBhIGZhY2UgY2FuIGhhdmUgYm90aCB0aGlzIGZsYWcgYW5kICAgICovCi0gIC8qICAgICAgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgYml0bWFwIHN0cmlrZXMuICBTZWUgYWxzbyB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGBudW1fZml4ZWRfc2l6ZXMnIGFuZCBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZHMgb2YgQEZUX0ZhY2VSZWMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGNvbnRhaW5zIGZpeGVkLXdpZHRoIGNoYXJhY3RlcnMgKGxpa2UgQ291cmllciwgTHVjaWRhLCAgKi8KLSAgLyogICAgICBNb25vVHlwZSwgZXRjLikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0ZOVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSB1c2VzIHRoZSBTRk5UIHN0b3JhZ2Ugc2NoZW1lLiAgRm9yIG5vdywgdGhpcyBtZWFucyAgICAgICovCi0gIC8qICAgICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgaG9yaXpvbnRhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyBzaG91bGQgYmUgc2V0ICAqLwotICAvKiAgICAgIGZvciBhbGwgY29tbW9uIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGNvbnRhaW5zIHZlcnRpY2FsIGdseXBoIG1ldHJpY3MuICBUaGlzIGlzIG9ubHkgICAgICAgICAgKi8KLSAgLyogICAgICBhdmFpbGFibGUgaW4gc29tZSBmb3JtYXRzLCBub3QgYWxsIG9mIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBjb250YWlucyBrZXJuaW5nIGluZm9ybWF0aW9uLiAgSWYgc2V0LCB0aGUga2VybmluZyAgICAgICovCi0gIC8qICAgICAgZGlzdGFuY2UgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgZnVuY3Rpb24gQEZUX0dldF9LZXJuaW5nLiAgICAqLwotICAvKiAgICAgIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybiB0aGUgdmVjdG9yICgwLDApLiAgTm90ZSAgICAgKi8KLSAgLyogICAgICB0aGF0IEZyZWVUeXBlIGRvZXNuJ3QgaGFuZGxlIGtlcm5pbmcgZGF0YSBmcm9tIHRoZSBTRk5UIGBHUE9TJyAgICovCi0gIC8qICAgICAgdGFibGUgKGFzIHByZXNlbnQgaW4gbWFueSBPcGVuVHlwZSBmb250cykuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVEhJUyBGTEFHIElTIERFUFJFQ0FURUQuICBETyBOT1QgVVNFIE9SIFRFU1QgSVQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgY29udGFpbnMgbXVsdGlwbGUgbWFzdGVycyBhbmQgaXMgY2FwYWJsZSBvZiAgICAgICAgICAgICAqLwotICAvKiAgICAgIGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGVtLiAgU3VwcG9ydGVkIGZvcm1hdHMgYXJlIEFkb2JlIE1NLCAgICAgKi8KLSAgLyogICAgICBUcnVlVHlwZSBHWCwgYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNlZSBzZWN0aW9uIEBtdWx0aXBsZV9tYXN0ZXJzIGZvciBBUEkgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGNvbnRhaW5zIGdseXBoIG5hbWVzLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nICAgICAgKi8KLSAgLyogICAgICBARlRfR2V0X0dseXBoX05hbWUuICBOb3RlIHRoYXQgc29tZSBUcnVlVHlwZSBmb250cyBjb250YWluICAgICAgICovCi0gIC8qICAgICAgYnJva2VuIGdseXBoIG5hbWUgdGFibGVzLiAgVXNlIHRoZSBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9IYXNfUFNfR2x5cGhfTmFtZXMgd2hlbiBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB0byBpbmRpY2F0ZSB0aGF0IGEgZmFjZSdzIHN0cmVhbSB3YXMgKi8KLSAgLyogICAgICBwcm92aWRlZCBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGFuZCBzaG91bGQgbm90IGJlIGRlc3Ryb3llZCAgICovCi0gIC8qICAgICAgd2hlbiBARlRfRG9uZV9GYWNlIGlzIGNhbGxlZC4gIERvbid0IHJlYWQgb3IgdGVzdCB0aGlzIGZsYWcuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hJTlRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZvbnQgZHJpdmVyIGhhcyBhIGhpbnRpbmcgbWFjaGluZSBvZiBpdHMgb3duLiAgRm9yIGV4YW1wbGUsICAqLwotICAvKiAgICAgIHdpdGggVHJ1ZVR5cGUgZm9udHMsIGl0IG1ha2VzIHNlbnNlIHRvIHVzZSBkYXRhIGZyb20gdGhlIFNGTlQgICAgKi8KLSAgLyogICAgICBgZ2FzcCcgdGFibGUgb25seSBpZiB0aGUgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgZW5naW5lICh3aXRoICAgICovCi0gIC8qICAgICAgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyKSBpcyBhdmFpbGFibGUgYW5kIGFjdGl2ZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZhY2UgaXMgQ0lELWtleWVkLiAgSW4gdGhhdCBjYXNlLCB0aGUgZmFjZSBpcyBub3QgYWNjZXNzZWQgICAqLwotICAvKiAgICAgIGJ5IGdseXBoIGluZGljZXMgYnV0IGJ5IENJRCB2YWx1ZXMuICBGb3Igc3Vic2V0dGVkIENJRC1rZXllZCAgICAgKi8KLSAgLyogICAgICBmb250cyB0aGlzIGhhcyB0aGUgY29uc2VxdWVuY2UgdGhhdCBub3QgYWxsIGluZGV4IHZhbHVlcyBhcmUgYSAgICovCi0gIC8qICAgICAgdmFsaWQgYXJndW1lbnQgdG8gQEZUX0xvYWRfR2x5cGguICBPbmx5IHRoZSBDSUQgdmFsdWVzIGZvciB3aGljaCAqLwotICAvKiAgICAgIGNvcnJlc3BvbmRpbmcgZ2x5cGhzIGluIHRoZSBzdWJzZXR0ZWQgZm9udCBleGlzdCBtYWtlICAgICAgICAgICAgKi8KLSAgLyogICAgICBgRlRfTG9hZF9HbHlwaCcgcmV0dXJuIHN1Y2Nlc3NmdWxseTsgaW4gYWxsIG90aGVyIGNhc2VzIHlvdSBnZXQgICovCi0gIC8qICAgICAgYW4gYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBOb3RlIHRoYXQgQ0lELWtleWVkIGZvbnRzIHRoYXQgYXJlIGluIGFuIFNGTlQgd3JhcHBlciAodGhpcyBpcywgICovCi0gIC8qICAgICAgYWxsIE9wZW5UeXBlL0NGRiBmb250cykgZG9uJ3QgaGF2ZSB0aGlzIGZsYWcgc2V0IHNpbmNlIHRoZSAgICAgICAqLwotICAvKiAgICAgIGdseXBocyBhcmUgYWNjZXNzZWQgaW4gdGhlIG5vcm1hbCB3YXkgKHVzaW5nIGNvbnRpZ3VvdXMgICAgICAgICAgKi8KLSAgLyogICAgICBpbmRpY2VzKTsgdGhlIGBDSUQtbmVzcycgaXNuJ3QgdmlzaWJsZSB0byB0aGUgYXBwbGljYXRpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfVFJJQ0tZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmFjZSBpcyBgdHJpY2t5JywgdGhpcyBpcywgaXQgYWx3YXlzIG5lZWRzIHRoZSBmb250IGZvcm1hdCdzICovCi0gIC8qICAgICAgbmF0aXZlIGhpbnRpbmcgZW5naW5lIHRvIGdldCBhIHJlYXNvbmFibGUgcmVzdWx0LiAgQSB0eXBpY2FsICAgICAqLwotICAvKiAgICAgIGV4YW1wbGUgaXMgdGhlIG9sZCBDaGluZXNlIGZvbnQgYG1pbmdsaS50dGYnIChidXQgbm90ICAgICAgICAgICAgKi8KLSAgLyogICAgICBgbWluZ2xpdS50dGMnKSB0aGF0IHVzZXMgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIHRvIG1vdmUgICovCi0gIC8qICAgICAgYW5kIHNjYWxlIGFsbCBvZiBpdHMgc3ViZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJdCBpcyBub3QgcG9zc2libGUgdG8gYXV0by1oaW50IHN1Y2ggZm9udHMgdXNpbmcgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQ7IGl0IHdpbGwgYWxzbyBpZ25vcmUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9MT0FEX05PX0hJTlRJTkcuICBZb3UgaGF2ZSB0byBzZXQgYm90aCBARlRfTE9BRF9OT19ISU5USU5HICAgKi8KLSAgLyogICAgICBhbmQgQEZUX0xPQURfTk9fQVVUT0hJTlQgdG8gcmVhbGx5IGRpc2FibGUgaGludGluZzsgaG93ZXZlciwgeW91ICovCi0gIC8qICAgICAgcHJvYmFibHkgbmV2ZXIgd2FudCB0aGlzIGV4Y2VwdCBmb3IgZGVtb25zdHJhdGlvbiBwdXJwb3Nlcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDdXJyZW50bHksIHRoZXJlIGFyZSBhYm91dCBhIGRvemVuIFRydWVUeXBlIGZvbnRzIGluIHRoZSBsaXN0IG9mICovCi0gIC8qICAgICAgdHJpY2t5IGZvbnRzOyB0aGV5IGFyZSBoYXJkLWNvZGVkIGluIGZpbGUgYHR0b2Jqcy5jJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0NPTE9SIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgW1NpbmNlIDIuNS4xXSBUaGUgZmFjZSBoYXMgY29sb3IgZ2x5cGggdGFibGVzLiAgVG8gYWNjZXNzIGNvbG9yICAqLwotICAvKiAgICAgIGdseXBocyB1c2UgQEZUX0xPQURfQ09MT1IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFtTaW5jZSAyLjldIFNldCBpZiB0aGUgY3VycmVudCBmYWNlIChvciBuYW1lZCBpbnN0YW5jZSkgaGFzIGJlZW4gKi8KLSAgLyogICAgICBhbHRlcmVkIHdpdGggQEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMsICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzLCBvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9TZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzLiAgVGhpcyBmbGFnIGlzIHVuc2V0IGJ5IGEgY2FsbCB0byAgKi8KLSAgLyogICAgICBARlRfU2V0X05hbWVkX0luc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfRkFDRV9GTEFHX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIGJpdCBmbGFncyB1c2VkIGluIHRoZSBgZmFjZV9mbGFnc2AgZmllbGQgb2YgdGhlIEBGVF9GYWNlUmVjCisgICAqICAgc3RydWN0dXJlLiAgVGhleSBpbmZvcm0gY2xpZW50IGFwcGxpY2F0aW9ucyBvZiBwcm9wZXJ0aWVzIG9mIHRoZQorICAgKiAgIGNvcnJlc3BvbmRpbmcgZmFjZS4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgOjoKKyAgICogICAgIFRoZSBmYWNlIGNvbnRhaW5zIG91dGxpbmUgZ2x5cGhzLiAgTm90ZSB0aGF0IGEgZmFjZSBjYW4gY29udGFpbgorICAgKiAgICAgYml0bWFwIHN0cmlrZXMgYWxzbywgaS5lLiwgYSBmYWNlIGNhbiBoYXZlIGJvdGggdGhpcyBmbGFnIGFuZAorICAgKiAgICAgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBzZXQuCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIDo6CisgICAqICAgICBUaGUgZmFjZSBjb250YWlucyBiaXRtYXAgc3RyaWtlcy4gIFNlZSBhbHNvIHRoZSBgbnVtX2ZpeGVkX3NpemVzYAorICAgKiAgICAgYW5kIGBhdmFpbGFibGVfc2l6ZXNgIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggOjoKKyAgICogICAgIFRoZSBmYWNlIGNvbnRhaW5zIGZpeGVkLXdpZHRoIGNoYXJhY3RlcnMgKGxpa2UgQ291cmllciwgTHVjaWRhLAorICAgKiAgICAgTW9ub1R5cGUsIGV0Yy4pLgorICAgKgorICAgKiAgIEZUX0ZBQ0VfRkxBR19TRk5UIDo6CisgICAqICAgICBUaGUgZmFjZSB1c2VzIHRoZSBTRk5UIHN0b3JhZ2Ugc2NoZW1lLiAgRm9yIG5vdywgdGhpcyBtZWFucyBUcnVlVHlwZQorICAgKiAgICAgYW5kIE9wZW5UeXBlLgorICAgKgorICAgKiAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMIDo6CisgICAqICAgICBUaGUgZmFjZSBjb250YWlucyBob3Jpem9udGFsIGdseXBoIG1ldHJpY3MuICBUaGlzIHNob3VsZCBiZSBzZXQgZm9yCisgICAqICAgICBhbGwgY29tbW9uIGZvcm1hdHMuCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMIDo6CisgICAqICAgICBUaGUgZmFjZSBjb250YWlucyB2ZXJ0aWNhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbgorICAgKiAgICAgc29tZSBmb3JtYXRzLCBub3QgYWxsIG9mIHRoZW0uCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX0tFUk5JTkcgOjoKKyAgICogICAgIFRoZSBmYWNlIGNvbnRhaW5zIGtlcm5pbmcgaW5mb3JtYXRpb24uICBJZiBzZXQsIHRoZSBrZXJuaW5nIGRpc3RhbmNlCisgICAqICAgICBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHRoZSBmdW5jdGlvbiBARlRfR2V0X0tlcm5pbmcuICBPdGhlcndpc2UgdGhlCisgICAqICAgICBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIHRoZSB2ZWN0b3IgKDAsMCkuICBOb3RlIHRoYXQgRnJlZVR5cGUgZG9lc24ndAorICAgKiAgICAgaGFuZGxlIGtlcm5pbmcgZGF0YSBmcm9tIHRoZSBTRk5UICdHUE9TJyB0YWJsZSAoYXMgcHJlc2VudCBpbiBtYW55CisgICAqICAgICBPcGVuVHlwZSBmb250cykuCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIDo6CisgICAqICAgICBUSElTIEZMQUcgSVMgREVQUkVDQVRFRC4gIERPIE5PVCBVU0UgT1IgVEVTVCBJVC4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUyA6OgorICAgKiAgICAgVGhlIGZhY2UgY29udGFpbnMgbXVsdGlwbGUgbWFzdGVycyBhbmQgaXMgY2FwYWJsZSBvZiBpbnRlcnBvbGF0aW5nCisgICAqICAgICBiZXR3ZWVuIHRoZW0uICBTdXBwb3J0ZWQgZm9ybWF0cyBhcmUgQWRvYmUgTU0sIFRydWVUeXBlIEdYLCBhbmQKKyAgICogICAgIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4KKyAgICoKKyAgICogICAgIFNlZSBzZWN0aW9uIEBtdWx0aXBsZV9tYXN0ZXJzIGZvciBBUEkgZGV0YWlscy4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgOjoKKyAgICogICAgIFRoZSBmYWNlIGNvbnRhaW5zIGdseXBoIG5hbWVzLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nCisgICAqICAgICBARlRfR2V0X0dseXBoX05hbWUuICBOb3RlIHRoYXQgc29tZSBUcnVlVHlwZSBmb250cyBjb250YWluIGJyb2tlbgorICAgKiAgICAgZ2x5cGggbmFtZSB0YWJsZXMuICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9IYXNfUFNfR2x5cGhfTmFtZXMgd2hlbgorICAgKiAgICAgbmVlZGVkLgorICAgKgorICAgKiAgIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gOjoKKyAgICogICAgIFVzZWQgaW50ZXJuYWxseSBieSBGcmVlVHlwZSB0byBpbmRpY2F0ZSB0aGF0IGEgZmFjZSdzIHN0cmVhbSB3YXMKKyAgICogICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYXBwbGljYXRpb24gYW5kIHNob3VsZCBub3QgYmUgZGVzdHJveWVkIHdoZW4KKyAgICogICAgIEBGVF9Eb25lX0ZhY2UgaXMgY2FsbGVkLiAgRG9uJ3QgcmVhZCBvciB0ZXN0IHRoaXMgZmxhZy4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfSElOVEVSIDo6CisgICAqICAgICBUaGUgZm9udCBkcml2ZXIgaGFzIGEgaGludGluZyBtYWNoaW5lIG9mIGl0cyBvd24uICBGb3IgZXhhbXBsZSwgd2l0aAorICAgKiAgICAgVHJ1ZVR5cGUgZm9udHMsIGl0IG1ha2VzIHNlbnNlIHRvIHVzZSBkYXRhIGZyb20gdGhlIFNGTlQgJ2dhc3AnCisgICAqICAgICB0YWJsZSBvbmx5IGlmIHRoZSBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyBlbmdpbmUgKHdpdGggdGhlIGJ5dGVjb2RlCisgICAqICAgICBpbnRlcnByZXRlcikgaXMgYXZhaWxhYmxlIGFuZCBhY3RpdmUuCisgICAqCisgICAqICAgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCA6OgorICAgKiAgICAgVGhlIGZhY2UgaXMgQ0lELWtleWVkLiAgSW4gdGhhdCBjYXNlLCB0aGUgZmFjZSBpcyBub3QgYWNjZXNzZWQgYnkKKyAgICogICAgIGdseXBoIGluZGljZXMgYnV0IGJ5IENJRCB2YWx1ZXMuICBGb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cyB0aGlzCisgICAqICAgICBoYXMgdGhlIGNvbnNlcXVlbmNlIHRoYXQgbm90IGFsbCBpbmRleCB2YWx1ZXMgYXJlIGEgdmFsaWQgYXJndW1lbnQKKyAgICogICAgIHRvIEBGVF9Mb2FkX0dseXBoLiAgT25seSB0aGUgQ0lEIHZhbHVlcyBmb3Igd2hpY2ggY29ycmVzcG9uZGluZworICAgKiAgICAgZ2x5cGhzIGluIHRoZSBzdWJzZXR0ZWQgZm9udCBleGlzdCBtYWtlIGBGVF9Mb2FkX0dseXBoYCByZXR1cm4KKyAgICogICAgIHN1Y2Nlc3NmdWxseTsgaW4gYWxsIG90aGVyIGNhc2VzIHlvdSBnZXQgYW4KKyAgICogICAgIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudGAgZXJyb3IuCisgICAqCisgICAqICAgICBOb3RlIHRoYXQgQ0lELWtleWVkIGZvbnRzIHRoYXQgYXJlIGluIGFuIFNGTlQgd3JhcHBlciAodGhpcyBpcywgYWxsCisgICAqICAgICBPcGVuVHlwZS9DRkYgZm9udHMpIGRvbid0IGhhdmUgdGhpcyBmbGFnIHNldCBzaW5jZSB0aGUgZ2x5cGhzIGFyZQorICAgKiAgICAgYWNjZXNzZWQgaW4gdGhlIG5vcm1hbCB3YXkgKHVzaW5nIGNvbnRpZ3VvdXMgaW5kaWNlcyk7IHRoZQorICAgKiAgICAgJ0NJRC1uZXNzJyBpc24ndCB2aXNpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfVFJJQ0tZIDo6CisgICAqICAgICBUaGUgZmFjZSBpcyAndHJpY2t5JywgdGhpcyBpcywgaXQgYWx3YXlzIG5lZWRzIHRoZSBmb250IGZvcm1hdCdzCisgICAqICAgICBuYXRpdmUgaGludGluZyBlbmdpbmUgdG8gZ2V0IGEgcmVhc29uYWJsZSByZXN1bHQuICBBIHR5cGljYWwgZXhhbXBsZQorICAgKiAgICAgaXMgdGhlIG9sZCBDaGluZXNlIGZvbnQgYG1pbmdsaS50dGZgIChidXQgbm90IGBtaW5nbGl1LnR0Y2ApIHRoYXQKKyAgICogICAgIHVzZXMgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIHRvIG1vdmUgYW5kIHNjYWxlIGFsbCBvZiBpdHMKKyAgICogICAgIHN1YmdseXBocy4KKyAgICoKKyAgICogICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBhdXRvLWhpbnQgc3VjaCBmb250cyB1c2luZworICAgKiAgICAgQEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQ7IGl0IHdpbGwgYWxzbyBpZ25vcmUgQEZUX0xPQURfTk9fSElOVElORy4KKyAgICogICAgIFlvdSBoYXZlIHRvIHNldCBib3RoIEBGVF9MT0FEX05PX0hJTlRJTkcgYW5kIEBGVF9MT0FEX05PX0FVVE9ISU5UIHRvCisgICAqICAgICByZWFsbHkgZGlzYWJsZSBoaW50aW5nOyBob3dldmVyLCB5b3UgcHJvYmFibHkgbmV2ZXIgd2FudCB0aGlzIGV4Y2VwdAorICAgKiAgICAgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuCisgICAqCisgICAqICAgICBDdXJyZW50bHksIHRoZXJlIGFyZSBhYm91dCBhIGRvemVuIFRydWVUeXBlIGZvbnRzIGluIHRoZSBsaXN0IG9mCisgICAqICAgICB0cmlja3kgZm9udHM7IHRoZXkgYXJlIGhhcmQtY29kZWQgaW4gZmlsZSBgdHRvYmpzLmNgLgorICAgKgorICAgKiAgIEZUX0ZBQ0VfRkxBR19DT0xPUiA6OgorICAgKiAgICAgW1NpbmNlIDIuNS4xXSBUaGUgZmFjZSBoYXMgY29sb3IgZ2x5cGggdGFibGVzLiAgU2VlIEBGVF9MT0FEX0NPTE9SCisgICAqICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICoKKyAgICogICBGVF9GQUNFX0ZMQUdfVkFSSUFUSU9OIDo6CisgICAqICAgICBbU2luY2UgMi45XSBTZXQgaWYgdGhlIGN1cnJlbnQgZmFjZSAob3IgbmFtZWQgaW5zdGFuY2UpIGhhcyBiZWVuCisgICAqICAgICBhbHRlcmVkIHdpdGggQEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMsCisgICAqICAgICBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMsIG9yIEBGVF9TZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzLgorICAgKiAgICAgVGhpcyBmbGFnIGlzIHVuc2V0IGJ5IGEgY2FsbCB0byBARlRfU2V0X05hbWVkX0luc3RhbmNlLgorICAgKi8KICNkZWZpbmUgRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgICAgICAgICggMUwgPDwgIDAgKQogI2RlZmluZSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgICAgICAgKCAxTCA8PCAgMSApCiAjZGVmaW5lIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAoIDFMIDw8ICAyICkKQEAgLTEyNTQsMjcgKzEyMTIsMjcgQEAKICNkZWZpbmUgRlRfRkFDRV9GTEFHX1ZBUklBVElPTiAgICAgICAgICggMUwgPDwgMTUgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfSE9SSVpPTlRBTCggZmFjZSApCisgICAqICAgRlRfSEFTX0hPUklaT05UQUwKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIGhvcml6b250YWwgbWV0cmljcyAodGhpcyBpcyB0cnVlIGZvciBhbGwgZm9udCBmb3JtYXRzIHRob3VnaCkuCisgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGhvcml6b250YWwKKyAgICogICBtZXRyaWNzICh0aGlzIGlzIHRydWUgZm9yIGFsbCBmb250IGZvcm1hdHMgdGhvdWdoKS4KICAgICoKICAgICogQGFsc286CiAgICAqICAgQEZUX0hBU19WRVJUSUNBTCBjYW4gYmUgdXNlZCB0byBjaGVjayBmb3IgdmVydGljYWwgbWV0cmljcy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0hBU19IT1JJWk9OVEFMKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgKQorICAgICAgICAgICggISEoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfVkVSVElDQUwoIGZhY2UgKQorICAgKiAgIEZUX0hBU19WRVJUSUNBTAogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHJlYWwKQEAgLTEyODIsOTEgKzEyNDAsOTEgQEAKICAgICoKICAgICovCiAjZGVmaW5lIEZUX0hBU19WRVJUSUNBTCggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCApCisgICAgICAgICAgKCAhISggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfS0VSTklORyggZmFjZSApCisgICAqICAgRlRfSEFTX0tFUk5JTkcKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBrZXJuaW5nCi0gICAqICAgZGF0YSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIEBGVF9HZXRfS2VybmluZy4KKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMga2VybmluZyBkYXRhCisgICAqICAgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCBARlRfR2V0X0tlcm5pbmcuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9IQVNfS0VSTklORyggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19LRVJOSU5HICkKKyAgICAgICAgICAoICEhKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfS0VSTklORyApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKQorICAgKiAgIEZUX0lTX1NDQUxBQkxFCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBzY2FsYWJsZQotICAgKiAgIGZvbnQgZmFjZSAodHJ1ZSBmb3IgVHJ1ZVR5cGUsIFR5cGV+MSwgVHlwZX40MiwgQ0lELCBPcGVuVHlwZS9DRkYsCi0gICAqICAgYW5kIFBGUiBmb250IGZvcm1hdHMpLgorICAgKiAgIGZvbnQgZmFjZSAodHJ1ZSBmb3IgVHJ1ZVR5cGUsIFR5cGV+MSwgVHlwZX40MiwgQ0lELCBPcGVuVHlwZS9DRkYsIGFuZAorICAgKiAgIFBGUiBmb250IGZvcm1hdHMpLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSBcCi0gICAgICAgICAgKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgKQorICAgICAgICAgICggISEoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfU0ZOVCggZmFjZSApCisgICAqICAgRlRfSVNfU0ZOVAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgZm9udAotICAgKiAgIHdob3NlIGZvcm1hdCBpcyBiYXNlZCBvbiB0aGUgU0ZOVCBzdG9yYWdlIHNjaGVtZS4gIFRoaXMgdXN1YWxseQotICAgKiAgIG1lYW5zOiBUcnVlVHlwZSBmb250cywgT3BlblR5cGUgZm9udHMsIGFzIHdlbGwgYXMgU0ZOVC1iYXNlZCBlbWJlZGRlZAotICAgKiAgIGJpdG1hcCBmb250cy4KKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBmb250IHdob3NlCisgICAqICAgZm9ybWF0IGlzIGJhc2VkIG9uIHRoZSBTRk5UIHN0b3JhZ2Ugc2NoZW1lLiAgVGhpcyB1c3VhbGx5IG1lYW5zOgorICAgKiAgIFRydWVUeXBlIGZvbnRzLCBPcGVuVHlwZSBmb250cywgYXMgd2VsbCBhcyBTRk5ULWJhc2VkIGVtYmVkZGVkIGJpdG1hcAorICAgKiAgIGZvbnRzLgogICAgKgogICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgdHJ1ZSwgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEBGVF9TRk5UX05BTUVTX0ggYW5kCiAgICAqICAgQEZUX1RSVUVUWVBFX1RBQkxFU19IIGFyZSBhdmFpbGFibGUuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9JU19TRk5UKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQgKQorICAgICAgICAgICggISEoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKLSAgICogICBGVF9JU19GSVhFRF9XSURUSCggZmFjZSApCisgICAqICAgRlRfSVNfRklYRURfV0lEVEgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIGZvbnQgZmFjZQotICAgKiAgIHRoYXQgY29udGFpbnMgZml4ZWQtd2lkdGggKG9yIGBtb25vc3BhY2UnLCBgZml4ZWQtcGl0Y2gnLCBldGMuKQorICAgKiAgIHRoYXQgY29udGFpbnMgZml4ZWQtd2lkdGggKG9yICdtb25vc3BhY2UnLCAnZml4ZWQtcGl0Y2gnLCBldGMuKQogICAgKiAgIGdseXBocy4KICAgICoKICAgICovCiAjZGVmaW5lIEZUX0lTX0ZJWEVEX1dJRFRIKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICkKKyAgICAgICAgICAoICEhKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggKSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApCisgICAqICAgRlRfSEFTX0ZJWEVEX1NJWkVTCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZQotICAgKiAgIGVtYmVkZGVkIGJpdG1hcHMuICBTZWUgdGhlIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIHRoZQotICAgKiAgIEBGVF9GYWNlUmVjIHN0cnVjdHVyZS4KKyAgICogICBlbWJlZGRlZCBiaXRtYXBzLiAgU2VlIHRoZSBgYXZhaWxhYmxlX3NpemVzYCBmaWVsZCBvZiB0aGUgQEZUX0ZhY2VSZWMKKyAgICogICBzdHJ1Y3R1cmUuCiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSBcCi0gICAgICAgICAgKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgKQorICAgICAgICAgICggISEoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0ZBU1RfR0xZUEhTKCBmYWNlICkKKyAgICogICBGVF9IQVNfRkFTVF9HTFlQSFMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIERlcHJlY2F0ZWQuCkBAIC0xMzc1LDEwICsxMzMzLDEwIEBACiAjZGVmaW5lIEZUX0hBU19GQVNUX0dMWVBIUyggZmFjZSApICAwCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19HTFlQSF9OQU1FUyggZmFjZSApCisgICAqICAgRlRfSEFTX0dMWVBIX05BTUVTCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZSBnbHlwaApAQCAtMTM4NiwxMyArMTM0NCwxMyBAQAogICAgKgogICAgKi8KICNkZWZpbmUgRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTICkKKyAgICAgICAgICAoICEhKCAoZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgKSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkKKyAgICogICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUwogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHNvbWUKQEAgLTE0MDEsMTMgKzEzNTksMTMgQEAKICAgICoKICAgICovCiAjZGVmaW5lIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgKQorICAgICAgICAgICggISEoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKLSAgICogICBGVF9JU19OQU1FRF9JTlNUQU5DRSggZmFjZSApCisgICAqICAgRlRfSVNfTkFNRURfSU5TVEFOQ0UKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBpcyBhIG5hbWVkIGluc3RhbmNlCkBAIC0xNDIzLDE3ICsxMzgxLDE3IEBACiAgICAqCiAgICAqLwogI2RlZmluZSBGVF9JU19OQU1FRF9JTlNUQU5DRSggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9pbmRleCAmIDB4N0ZGRjAwMDBMICkKKyAgICAgICAgICAoICEhKCAoZmFjZSktPmZhY2VfaW5kZXggJiAweDdGRkYwMDAwTCApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfVkFSSUFUSU9OKCBmYWNlICkKKyAgICogICBGVF9JU19WQVJJQVRJT04KICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBoYXMgYmVlbiBhbHRlcmVkCi0gICAqICAgYnkgQEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMsIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcywgb3IKKyAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgaGFzIGJlZW4gYWx0ZXJlZCBieQorICAgKiAgIEBGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzLCBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMsIG9yCiAgICAqICAgQEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMuCiAgICAqCiAgICAqIEBzaW5jZToKQEAgLTE0NDEsMjAxICsxMzk5LDE5OSBAQAogICAgKgogICAgKi8KICNkZWZpbmUgRlRfSVNfVkFSSUFUSU9OKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZBUklBVElPTiApCisgICAgICAgICAgKCAhISggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1ZBUklBVElPTiApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkKKyAgICogICBGVF9JU19DSURfS0VZRUQKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIENJRC1rZXllZAotICAgKiAgIGZvbnQuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZm9yIG1vcmUKLSAgICogICBkZXRhaWxzLgorICAgKiAgIGZvbnQuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZm9yIG1vcmUgZGV0YWlscy4KICAgICoKICAgICogICBJZiB0aGlzIG1hY3JvIGlzIHRydWUsIGFsbCBmdW5jdGlvbnMgZGVmaW5lZCBpbiBARlRfQ0lEX0ggYXJlCiAgICAqICAgYXZhaWxhYmxlLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfSVNfQ0lEX0tFWUVEKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCApCisgICAgICAgICAgKCAhISggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfVFJJQ0tZKCBmYWNlICkKKyAgICogICBGVF9JU19UUklDS1kKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIHJlcHJlc2VudHMgYSBgdHJpY2t5JyBmb250LgorICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIHJlcHJlc2VudHMgYSAndHJpY2t5JyBmb250LgogICAgKiAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgbW9yZSBkZXRhaWxzLgogICAgKgogICAgKi8KICNkZWZpbmUgRlRfSVNfVFJJQ0tZKCBmYWNlICkgXAotICAgICAgICAgICggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1RSSUNLWSApCisgICAgICAgICAgKCAhISggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1RSSUNLWSApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0NPTE9SKCBmYWNlICkKKyAgICogICBGVF9IQVNfQ09MT1IKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIHRhYmxlcyBmb3IgY29sb3IgZ2x5cGhzLgorICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyB0YWJsZXMgZm9yCisgICAqICAgY29sb3IgZ2x5cGhzLgogICAgKgogICAgKiBAc2luY2U6CiAgICAqICAgMi41LjEKICAgICoKICAgICovCiAjZGVmaW5lIEZUX0hBU19DT0xPUiggZmFjZSApIFwKLSAgICAgICAgICAoIChmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19DT0xPUiApCisgICAgICAgICAgKCAhISggKGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0NPTE9SICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgb2YgYSBnaXZlbiBmYWNlLiAgVGhlc2UgICovCi0gIC8qICAgIGFyZSB1c2VkIGluIHRoZSBgc3R5bGVfZmxhZ3MnIGZpZWxkIG9mIEBGVF9GYWNlUmVjLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfSVRBTElDIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIHN0eWxlIGlzIGl0YWxpYyBvciBvYmxpcXVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NUWUxFX0ZMQUdfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmYWNlIGlzIGJvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3R5bGUgaW5mb3JtYXRpb24gYXMgcHJvdmlkZWQgYnkgRnJlZVR5cGUgaXMgdmVyeSBiYXNpYy4gIE1vcmUgKi8KLSAgLyogICAgZGV0YWlscyBhcmUgYmV5b25kIHRoZSBzY29wZSBhbmQgc2hvdWxkIGJlIGRvbmUgb24gYSBoaWdoZXIgbGV2ZWwgICovCi0gIC8qICAgIChmb3IgZXhhbXBsZSwgYnkgYW5hbHl6aW5nIHZhcmlvdXMgZmllbGRzIG9mIHRoZSBgT1MvMicgdGFibGUgaW4gICAqLwotICAvKiAgICBTRk5UIGJhc2VkIGZvbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9TVFlMRV9GTEFHX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIGJpdCBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc3R5bGUgb2YgYSBnaXZlbiBmYWNlLiAgVGhlc2UgYXJlCisgICAqICAgdXNlZCBpbiB0aGUgYHN0eWxlX2ZsYWdzYCBmaWVsZCBvZiBARlRfRmFjZVJlYy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9TVFlMRV9GTEFHX0lUQUxJQyA6OgorICAgKiAgICAgVGhlIGZhY2Ugc3R5bGUgaXMgaXRhbGljIG9yIG9ibGlxdWUuCisgICAqCisgICAqICAgRlRfU1RZTEVfRkxBR19CT0xEIDo6CisgICAqICAgICBUaGUgZmFjZSBpcyBib2xkLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc3R5bGUgaW5mb3JtYXRpb24gYXMgcHJvdmlkZWQgYnkgRnJlZVR5cGUgaXMgdmVyeSBiYXNpYy4gIE1vcmUKKyAgICogICBkZXRhaWxzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIGFuZCBzaG91bGQgYmUgZG9uZSBvbiBhIGhpZ2hlciBsZXZlbCAoZm9yCisgICAqICAgZXhhbXBsZSwgYnkgYW5hbHl6aW5nIHZhcmlvdXMgZmllbGRzIG9mIHRoZSAnT1MvMicgdGFibGUgaW4gU0ZOVCBiYXNlZAorICAgKiAgIGZvbnRzKS4KKyAgICovCiAjZGVmaW5lIEZUX1NUWUxFX0ZMQUdfSVRBTElDICAoIDEgPDwgMCApCiAjZGVmaW5lIEZUX1NUWUxFX0ZMQUdfQk9MRCAgICAoIDEgPDwgMSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGBGVF9TaXplX0ludGVybmFsUmVjJyBzdHJ1Y3R1cmUsIHVzZWQgdG8gICAgKi8KLSAgLyogICAgbW9kZWwgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX1NpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfU2l6ZV9JbnRlcm5hbAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfU2l6ZV9JbnRlcm5hbFJlY2Agc3RydWN0dXJlLCB1c2VkIHRvIG1vZGVsCisgICAqICAgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX1NpemUgb2JqZWN0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZV9JbnRlcm5hbFJlY18qICBGVF9TaXplX0ludGVybmFsOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNpemUgbWV0cmljcyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIG1ldHJpY3Mgb2YgYSBzaXplIG9iamVjdC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtICAgICAgIDo6IFRoZSB3aWR0aCBvZiB0aGUgc2NhbGVkIEVNIHNxdWFyZSBpbiBwaXhlbHMsIGhlbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgdGVybSBgcHBlbScgKHBpeGVscyBwZXIgRU0pLiAgSXQgaXMgYWxzbyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcmVmZXJyZWQgdG8gYXMgYG5vbWluYWwgd2lkdGgnLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfcHBlbSAgICAgICA6OiBUaGUgaGVpZ2h0IG9mIHRoZSBzY2FsZWQgRU0gc3F1YXJlIGluIHBpeGVscywgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgaGVuY2UgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHJlZmVycmVkIHRvIGFzIGBub21pbmFsIGhlaWdodCcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3NjYWxlICAgICAgOjogQSAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWUgdG8gY29udmVydCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfc2NhbGUgICAgICA6OiBBIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZSB0byBjb252ZXJ0ICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgbWV0cmljcyBmcm9tIGZvbnQgdW5pdHMgdG8gMjYuNiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmb250IGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIgICAgIDo6IFRoZSBhc2NlbmRlciBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLCByb3VuZGVkIHVwICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0byBhbiBpbnRlZ2VyIHZhbHVlLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICA6OiBUaGUgZGVzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMsIHJvdW5kZWQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZG93biB0byBhbiBpbnRlZ2VyIHZhbHVlLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgOjogVGhlIGhlaWdodCBpbiAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLCByb3VuZGVkIHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGFuIGludGVnZXIgdmFsdWUuICBTZWUgQEZUX0ZhY2VSZWMgZm9yIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2FkdmFuY2UgIDo6IFRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggaW4gMjYuNiBmcmFjdGlvbmFsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHJvdW5kZWQgdG8gYW4gaW50ZWdlciB2YWx1ZS4gIFNlZSAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2NhbGluZyB2YWx1ZXMsIGlmIHJlbGV2YW50LCBhcmUgZGV0ZXJtaW5lZCBmaXJzdCBkdXJpbmcgYSAgICAgKi8KLSAgLyogICAgc2l6ZSBjaGFuZ2luZyBvcGVyYXRpb24uICBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlbiBzZXQgYnkgdGhlICovCi0gIC8qICAgIGRyaXZlci4gIEZvciBzY2FsYWJsZSBmb3JtYXRzLCB0aGV5IGFyZSB1c3VhbGx5IHNldCB0byBzY2FsZWQgICAgICAqLwotICAvKiAgICB2YWx1ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIEBGVF9GYWNlUmVjLiAgU29tZSB2YWx1ZXMgICAgKi8KLSAgLyogICAgbGlrZSBhc2NlbmRlciBvciBkZXNjZW5kZXIgYXJlIHJvdW5kZWQgZm9yIGhpc3RvcmljYWwgcmVhc29uczsgICAgICovCi0gIC8qICAgIG1vcmUgcHJlY2lzZSB2YWx1ZXMgKGZvciBvdXRsaW5lIGZvbnRzKSBjYW4gYmUgZGVyaXZlZCBieSBzY2FsaW5nICAqLwotICAvKiAgICB0aGUgY29ycmVzcG9uZGluZyBARlRfRmFjZVJlYyB2YWx1ZXMgbWFudWFsbHksIHdpdGggY29kZSBzaW1pbGFyICAgKi8KLSAgLyogICAgdG8gdGhlIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBzY2FsZWRfYXNjZW5kZXIgPSBGVF9NdWxGaXgoIGZhY2UtPmFzY2VuZGVyLCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKTsgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBkdWUgdG8gZ2x5cGggaGludGluZyBhbmQgdGhlIHNlbGVjdGVkIHJlbmRlcmluZyBtb2RlICAgICAqLwotICAvKiAgICB0aGVzZSB2YWx1ZXMgYXJlIHVzdWFsbHkgbm90IGV4YWN0OyBjb25zZXF1ZW50bHksIHRoZXkgbXVzdCBiZSAgICAgKi8KLSAgLyogICAgdHJlYXRlZCBhcyB1bnJlbGlhYmxlIHdpdGggYW4gZXJyb3IgbWFyZ2luIG9mIGF0IGxlYXN0IG9uZSBwaXhlbCEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmRlZWQsIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IG1ldHJpY3MgaXMgdG8gcmVuZGVyIF9hbGxfICAgKi8KLSAgLyogICAgZ2x5cGhzLiAgQXMgdGhpcyB3b3VsZCBiZSBhIGRlZmluaXRlIHBlcmZvcm1hbmNlIGhpdCwgaXQgaXMgdXAgdG8gICovCi0gIC8qICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBzdWNoIGNvbXB1dGF0aW9ucy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBGVF9TaXplX01ldHJpY3MnIHN0cnVjdHVyZSBpcyB2YWxpZCBmb3IgYml0bWFwIGZvbnRzIGFsc28uICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgKlRydWVUeXBlKiAqZm9udHMqICp3aXRoKiAqbmF0aXZlKiAqYnl0ZWNvZGUqICpoaW50aW5nKiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgYXBwbGljYXRpb25zIHRoYXQgaGFuZGxlIFRydWVUeXBlIGZvbnRzIHdpdGggbmF0aXZlIGhpbnRpbmcgICAgKi8KLSAgLyogICAgbXVzdCBiZSBhd2FyZSB0aGF0IFRURnMgZXhwZWN0IGRpZmZlcmVudCByb3VuZGluZyBvZiB2ZXJ0aWNhbCBmb250ICovCi0gIC8qICAgIGRpbWVuc2lvbnMuICBUaGUgYXBwbGljYXRpb24gaGFzIHRvIGNhdGVyIGZvciB0aGlzLCBlc3BlY2lhbGx5IGlmICAqLwotICAvKiAgICBpdCB3YW50cyB0byByZWx5IG9uIGEgVFRGJ3MgdmVydGljYWwgZGF0YSAoZm9yIGV4YW1wbGUsIHRvICAgICAgICAgKi8KLSAgLyogICAgcHJvcGVybHkgYWxpZ24gYm94IGNoYXJhY3RlcnMgdmVydGljYWxseSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBhcHBsaWNhdGlvbiBrbm93cyBfaW5fIF9hZHZhbmNlXyB0aGF0IGl0IGlzIGdvaW5nIHRvIHVzZSAgKi8KLSAgLyogICAgbmF0aXZlIGhpbnRpbmcgZm9yIFRURnMhICBGcmVlVHlwZSwgb24gdGhlIG90aGVyIGhhbmQsIHNlbGVjdHMgdGhlICovCi0gIC8qICAgIGhpbnRpbmcgbW9kZSBub3QgYXQgdGhlIHRpbWUgb2YgY3JlYXRpbmcgYW4gQEZUX1NpemUgb2JqZWN0IGJ1dCAgICAqLwotICAvKiAgICBtdWNoIGxhdGVyLCBuYW1lbHkgd2hpbGUgY2FsbGluZyBARlRfTG9hZF9HbHlwaC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhlcmUgaXMgc29tZSBwc2V1ZG8gY29kZSB0aGF0IGlsbHVzdHJhdGVzIGEgcG9zc2libGUgc29sdXRpb24uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9udF9mb3JtYXQgPSBGVF9HZXRfRm9udF9Gb3JtYXQoIGZhY2UgKTsgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBpZiAoICFzdHJjbXAoIGZvbnRfZm9ybWF0LCAiVHJ1ZVR5cGUiICkgJiYgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICBkb19uYXRpdmVfYnl0ZWNvZGVfaGludGluZyAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGFzY2VuZGVyICA9IFJPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPmFzY2VuZGVyLCAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOyAgICAgICAqLwotICAvKiAgICAgICAgZGVzY2VuZGVyID0gUk9VTkQoIEZUX011bEZpeCggZmFjZS0+ZGVzY2VuZGVyLCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbWV0cmljcy0+eV9zY2FsZSApICk7ICAgICAgICovCi0gIC8qICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBhc2NlbmRlciAgPSBzaXplX21ldHJpY3MtPmFzY2VuZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZGVzY2VuZGVyID0gc2l6ZV9tZXRyaWNzLT5kZXNjZW5kZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGhlaWdodCAgICAgID0gc2l6ZV9tZXRyaWNzLT5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBtYXhfYWR2YW5jZSA9IHNpemVfbWV0cmljcy0+bWF4X2FkdmFuY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfU2l6ZV9NZXRyaWNzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgc2l6ZSBtZXRyaWNzIHN0cnVjdHVyZSBnaXZlcyB0aGUgbWV0cmljcyBvZiBhIHNpemUgb2JqZWN0LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHhfcHBlbSA6OgorICAgKiAgICAgVGhlIHdpZHRoIG9mIHRoZSBzY2FsZWQgRU0gc3F1YXJlIGluIHBpeGVscywgaGVuY2UgdGhlIHRlcm0gJ3BwZW0nCisgICAqICAgICAocGl4ZWxzIHBlciBFTSkuICBJdCBpcyBhbHNvIHJlZmVycmVkIHRvIGFzICdub21pbmFsIHdpZHRoJy4KKyAgICoKKyAgICogICB5X3BwZW0gOjoKKyAgICogICAgIFRoZSBoZWlnaHQgb2YgdGhlIHNjYWxlZCBFTSBzcXVhcmUgaW4gcGl4ZWxzLCBoZW5jZSB0aGUgdGVybSAncHBlbScKKyAgICogICAgIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gcmVmZXJyZWQgdG8gYXMgJ25vbWluYWwgaGVpZ2h0Jy4KKyAgICoKKyAgICogICB4X3NjYWxlIDo6CisgICAqICAgICBBIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZSB0byBjb252ZXJ0IGhvcml6b250YWwgbWV0cmljcyBmcm9tCisgICAqICAgICBmb250IHVuaXRzIHRvIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZQorICAgKiAgICAgZm9udCBmb3JtYXRzLgorICAgKgorICAgKiAgIHlfc2NhbGUgOjoKKyAgICogICAgIEEgMTYuMTYgZnJhY3Rpb25hbCBzY2FsaW5nIHZhbHVlIHRvIGNvbnZlcnQgdmVydGljYWwgbWV0cmljcyBmcm9tCisgICAqICAgICBmb250IHVuaXRzIHRvIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZQorICAgKiAgICAgZm9udCBmb3JtYXRzLgorICAgKgorICAgKiAgIGFzY2VuZGVyIDo6CisgICAqICAgICBUaGUgYXNjZW5kZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscywgcm91bmRlZCB1cCB0byBhbiBpbnRlZ2VyCisgICAqICAgICB2YWx1ZS4gIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuCisgICAqCisgICAqICAgZGVzY2VuZGVyIDo6CisgICAqICAgICBUaGUgZGVzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMsIHJvdW5kZWQgZG93biB0byBhbiBpbnRlZ2VyCisgICAqICAgICB2YWx1ZS4gIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuCisgICAqCisgICAqICAgaGVpZ2h0IDo6CisgICAqICAgICBUaGUgaGVpZ2h0IGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMsIHJvdW5kZWQgdG8gYW4gaW50ZWdlciB2YWx1ZS4KKyAgICogICAgIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuCisgICAqCisgICAqICAgbWF4X2FkdmFuY2UgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscywgcm91bmRlZCB0byBhbgorICAgKiAgICAgaW50ZWdlciB2YWx1ZS4gIFNlZSBARlRfRmFjZVJlYyBmb3IgdGhlIGRldGFpbHMuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBzY2FsaW5nIHZhbHVlcywgaWYgcmVsZXZhbnQsIGFyZSBkZXRlcm1pbmVkIGZpcnN0IGR1cmluZyBhIHNpemUKKyAgICogICBjaGFuZ2luZyBvcGVyYXRpb24uICBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlbiBzZXQgYnkgdGhlIGRyaXZlci4KKyAgICogICBGb3Igc2NhbGFibGUgZm9ybWF0cywgdGhleSBhcmUgdXN1YWxseSBzZXQgdG8gc2NhbGVkIHZhbHVlcyBvZiB0aGUKKyAgICogICBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiBARlRfRmFjZVJlYy4gIFNvbWUgdmFsdWVzIGxpa2UgYXNjZW5kZXIgb3IKKyAgICogICBkZXNjZW5kZXIgYXJlIHJvdW5kZWQgZm9yIGhpc3RvcmljYWwgcmVhc29uczsgbW9yZSBwcmVjaXNlIHZhbHVlcyAoZm9yCisgICAqICAgb3V0bGluZSBmb250cykgY2FuIGJlIGRlcml2ZWQgYnkgc2NhbGluZyB0aGUgY29ycmVzcG9uZGluZyBARlRfRmFjZVJlYworICAgKiAgIHZhbHVlcyBtYW51YWxseSwgd2l0aCBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZy4KKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIHNjYWxlZF9hc2NlbmRlciA9IEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfbWV0cmljcy0+eV9zY2FsZSApOworICAgKiAgIGBgYAorICAgKgorICAgKiAgIE5vdGUgdGhhdCBkdWUgdG8gZ2x5cGggaGludGluZyBhbmQgdGhlIHNlbGVjdGVkIHJlbmRlcmluZyBtb2RlIHRoZXNlCisgICAqICAgdmFsdWVzIGFyZSB1c3VhbGx5IG5vdCBleGFjdDsgY29uc2VxdWVudGx5LCB0aGV5IG11c3QgYmUgdHJlYXRlZCBhcworICAgKiAgIHVucmVsaWFibGUgd2l0aCBhbiBlcnJvciBtYXJnaW4gb2YgYXQgbGVhc3Qgb25lIHBpeGVsIQorICAgKgorICAgKiAgIEluZGVlZCwgdGhlIG9ubHkgd2F5IHRvIGdldCB0aGUgZXhhY3QgbWV0cmljcyBpcyB0byByZW5kZXIgX2FsbF8KKyAgICogICBnbHlwaHMuICBBcyB0aGlzIHdvdWxkIGJlIGEgZGVmaW5pdGUgcGVyZm9ybWFuY2UgaGl0LCBpdCBpcyB1cCB0bworICAgKiAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBzdWNoIGNvbXB1dGF0aW9ucy4KKyAgICoKKyAgICogICBUaGUgYEZUX1NpemVfTWV0cmljc2Agc3RydWN0dXJlIGlzIHZhbGlkIGZvciBiaXRtYXAgZm9udHMgYWxzby4KKyAgICoKKyAgICoKKyAgICogICAqKlRydWVUeXBlIGZvbnRzIHdpdGggbmF0aXZlIGJ5dGVjb2RlIGhpbnRpbmcqKgorICAgKgorICAgKiAgIEFsbCBhcHBsaWNhdGlvbnMgdGhhdCBoYW5kbGUgVHJ1ZVR5cGUgZm9udHMgd2l0aCBuYXRpdmUgaGludGluZyBtdXN0CisgICAqICAgYmUgYXdhcmUgdGhhdCBUVEZzIGV4cGVjdCBkaWZmZXJlbnQgcm91bmRpbmcgb2YgdmVydGljYWwgZm9udAorICAgKiAgIGRpbWVuc2lvbnMuICBUaGUgYXBwbGljYXRpb24gaGFzIHRvIGNhdGVyIGZvciB0aGlzLCBlc3BlY2lhbGx5IGlmIGl0CisgICAqICAgd2FudHMgdG8gcmVseSBvbiBhIFRURidzIHZlcnRpY2FsIGRhdGEgKGZvciBleGFtcGxlLCB0byBwcm9wZXJseSBhbGlnbgorICAgKiAgIGJveCBjaGFyYWN0ZXJzIHZlcnRpY2FsbHkpLgorICAgKgorICAgKiAgIE9ubHkgdGhlIGFwcGxpY2F0aW9uIGtub3dzIF9pbiBhZHZhbmNlXyB0aGF0IGl0IGlzIGdvaW5nIHRvIHVzZSBuYXRpdmUKKyAgICogICBoaW50aW5nIGZvciBUVEZzISAgRnJlZVR5cGUsIG9uIHRoZSBvdGhlciBoYW5kLCBzZWxlY3RzIHRoZSBoaW50aW5nCisgICAqICAgbW9kZSBub3QgYXQgdGhlIHRpbWUgb2YgY3JlYXRpbmcgYW4gQEZUX1NpemUgb2JqZWN0IGJ1dCBtdWNoIGxhdGVyLAorICAgKiAgIG5hbWVseSB3aGlsZSBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLgorICAgKgorICAgKiAgIEhlcmUgaXMgc29tZSBwc2V1ZG8gY29kZSB0aGF0IGlsbHVzdHJhdGVzIGEgcG9zc2libGUgc29sdXRpb24uCisgICAqCisgICAqICAgYGBgCisgICAqICAgICBmb250X2Zvcm1hdCA9IEZUX0dldF9Gb250X0Zvcm1hdCggZmFjZSApOworICAgKgorICAgKiAgICAgaWYgKCAhc3RyY21wKCBmb250X2Zvcm1hdCwgIlRydWVUeXBlIiApICYmCisgICAqICAgICAgICAgIGRvX25hdGl2ZV9ieXRlY29kZV9oaW50aW5nICAgICAgICAgKQorICAgKiAgICAgeworICAgKiAgICAgICBhc2NlbmRlciAgPSBST1VORCggRlRfTXVsRml4KCBmYWNlLT5hc2NlbmRlciwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9tZXRyaWNzLT55X3NjYWxlICkgKTsKKyAgICogICAgICAgZGVzY2VuZGVyID0gUk9VTkQoIEZUX011bEZpeCggZmFjZS0+ZGVzY2VuZGVyLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX21ldHJpY3MtPnlfc2NhbGUgKSApOworICAgKiAgICAgfQorICAgKiAgICAgZWxzZQorICAgKiAgICAgeworICAgKiAgICAgICBhc2NlbmRlciAgPSBzaXplX21ldHJpY3MtPmFzY2VuZGVyOworICAgKiAgICAgICBkZXNjZW5kZXIgPSBzaXplX21ldHJpY3MtPmRlc2NlbmRlcjsKKyAgICogICAgIH0KKyAgICoKKyAgICogICAgIGhlaWdodCAgICAgID0gc2l6ZV9tZXRyaWNzLT5oZWlnaHQ7CisgICAqICAgICBtYXhfYWR2YW5jZSA9IHNpemVfbWV0cmljcy0+bWF4X2FkdmFuY2U7CisgICAqICAgYGBgCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9NZXRyaWNzXwogICB7CiAgICAgRlRfVVNob3J0ICB4X3BwZW07ICAgICAgLyogaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgKi8KQEAgLTE2NTIsMjUgKzE2MDgsMjcgQEAKICAgfSBGVF9TaXplX01ldHJpY3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSByb290IHNpemUgY2xhc3Mgc3RydWN0dXJlLiAgQSBzaXplIG9iamVjdCBtb2RlbHMgYSBmYWNlICAgKi8KLSAgLyogICAgb2JqZWN0IGF0IGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBIYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgdW51c2VkIGJ5IHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9yICAgKi8KLSAgLyogICAgICAgICAgICAgICBhbnkgb2YgaXRzIGRyaXZlcnMuICBJdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duIGRhdGEgdG8gZWFjaCBzaXplICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgOjogTWV0cmljcyBmb3IgdGhpcyBzaXplIG9iamVjdC4gIFRoaXMgZmllbGQgaXMgcmVhZC1vbmx5LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfU2l6ZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRnJlZVR5cGUgcm9vdCBzaXplIGNsYXNzIHN0cnVjdHVyZS4gIEEgc2l6ZSBvYmplY3QgbW9kZWxzIGEgZmFjZQorICAgKiAgIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgSGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgZ2VuZXJpYyA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyLCB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkgb3IgYW55IG9mIGl0cworICAgKiAgICAgZHJpdmVycy4gIEl0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gbGluayB0aGVpciBvd24KKyAgICogICAgIGRhdGEgdG8gZWFjaCBzaXplIG9iamVjdC4KKyAgICoKKyAgICogICBtZXRyaWNzIDo6CisgICAqICAgICBNZXRyaWNzIGZvciB0aGlzIHNpemUgb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZVJlY18KICAgewogICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7ICAgICAgLyogcGFyZW50IGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAqLwpAQCAtMTY4MSwyMzcgKzE2MzksMjQxIEBACiAgIH0gRlRfU2l6ZVJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdWJnbHlwaCBzdHJ1Y3R1cmUgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gZGVzY3JpYmUgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3ViZ2x5cGggaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCAgICAgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIGhvd2V2ZXIgcmV0cmlldmUgc3ViZ2x5cGggaW5mb3JtYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9TdWJHbHlwaF9JbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TdWJHbHlwaAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHN1YmdseXBoIHN0cnVjdHVyZSBpcyBhbiBpbnRlcm5hbCBvYmplY3QgdXNlZCB0byBkZXNjcmliZQorICAgKiAgIHN1YmdseXBocyAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc3ViZ2x5cGggaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCBoZW5jZQorICAgKiAgIHRoZSBmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbi4KKyAgICoKKyAgICogICBZb3UgY2FuIGhvd2V2ZXIgcmV0cmlldmUgc3ViZ2x5cGggaW5mb3JtYXRpb24gd2l0aAorICAgKiAgIEBGVF9HZXRfU3ViR2x5cGhfSW5mby4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX1N1YkdseXBoUmVjXyogIEZUX1N1YkdseXBoOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2xvdF9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhbiBgRlRfU2xvdF9JbnRlcm5hbFJlYycgc3RydWN0dXJlLCB1c2VkIHRvICAgICovCi0gIC8qICAgIG1vZGVsIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX1Nsb3RfSW50ZXJuYWwKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1Nsb3RfSW50ZXJuYWxSZWNgIHN0cnVjdHVyZSwgdXNlZCB0byBtb2RlbAorICAgKiAgIHByaXZhdGUgZGF0YSBvZiBhIGdpdmVuIEBGVF9HbHlwaFNsb3Qgb2JqZWN0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2xvdF9JbnRlcm5hbFJlY18qICBGVF9TbG90X0ludGVybmFsOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgcm9vdCBnbHlwaCBzbG90IGNsYXNzIHN0cnVjdHVyZS4gIEEgZ2x5cGggc2xvdCBpcyBhICAgICAgICovCi0gIC8qICAgIGNvbnRhaW5lciB3aGVyZSBpbmRpdmlkdWFsIGdseXBocyBjYW4gYmUgbG9hZGVkLCBiZSB0aGV5IGluICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIG9yIGJpdG1hcCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzbG90IGJlbG9uZ3MgdG8uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5leHQgICAgICAgICAgICAgIDo6IEluIHNvbWUgY2FzZXMgKGxpa2Ugc29tZSBmb250IHRvb2xzKSwgc2V2ZXJhbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBzbG90cyBwZXIgZmFjZSBvYmplY3QgY2FuIGJlIGEgZ29vZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcuICBBcyB0aGlzIGlzIHJhcmUsIHRoZSBnbHlwaCBzbG90cyBhcmUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZCB0aHJvdWdoIGEgZGlyZWN0LCBzaW5nbGUtbGlua2VkIGxpc3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBpdHMgYG5leHQnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdlbmVyaWMgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5IG9yIGFueSBvZiBpdHMgZHJpdmVycy4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGxpbmsgdGhlaXIgb3duICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgdG8gZWFjaCBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljcyAgICAgICAgICAgOjogVGhlIG1ldHJpY3Mgb2YgdGhlIGxhc3QgbG9hZGVkIGdseXBoIGluIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QuICBUaGUgcmV0dXJuZWQgdmFsdWVzIGRlcGVuZCBvbiB0aGUgbGFzdCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkIGZsYWdzIChzZWUgdGhlIEBGVF9Mb2FkX0dseXBoIEFQSSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24pIGFuZCBjYW4gYmUgZXhwcmVzc2VkIGVpdGhlciBpbiAyNi42ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzIG9yIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGV2ZW4gd2hlbiB0aGUgZ2x5cGggaW1hZ2UgaXMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkLCB0aGUgbWV0cmljcyBhcmUgbm90LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGluZWFySG9yaUFkdmFuY2UgOjogVGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIHVuaGludGVkIGdseXBoLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEl0cyB2YWx1ZSBpcyBleHByZXNzZWQgaW4gMTYuMTYgZnJhY3Rpb25hbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMsIHVubGVzcyBARlRfTE9BRF9MSU5FQVJfREVTSUdOIGlzIHNldCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBsb2FkaW5nIHRoZSBnbHlwaC4gIFRoaXMgZmllbGQgY2FuIGJlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCB0byBwZXJmb3JtIGNvcnJlY3QgV1lTSVdZRyBsYXlvdXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbGV2YW50IGZvciBvdXRsaW5lIGdseXBocy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVhclZlcnRBZHZhbmNlIDo6IFRoZSBhZHZhbmNlIGhlaWdodCBvZiB0aGUgdW5oaW50ZWQgZ2x5cGguICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCB1bmxlc3MgQEZUX0xPQURfTElORUFSX0RFU0lHTiBpcyBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbG9hZGluZyB0aGUgZ2x5cGguICBUaGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gcGVyZm9ybSBjb3JyZWN0IFdZU0lXWUcgbGF5b3V0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlICAgICAgICAgICA6OiBUaGlzIHNob3J0aGFuZCBpcywgZGVwZW5kaW5nIG9uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSwgdGhlIHRyYW5zZm9ybWVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIChoaW50ZWQpIGFkdmFuY2Ugd2lkdGggZm9yIHRoZSBnbHlwaCwgaW4gMjYuNiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdC4gIEFzIHNwZWNpZmllZCB3aXRoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VULCBpdCB1c2VzIGVpdGhlciB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGBob3JpQWR2YW5jZScgb3IgdGhlIGB2ZXJ0QWR2YW5jZScgdmFsdWUgb2YgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBgbWV0cmljcycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICAgICAgICAgIDo6IFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBmb3JtYXQgb2YgdGhlIGltYWdlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gdGhlIGdseXBoIHNsb3QuICBUeXBpY2FsbHkgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAsICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgb3IgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgYnV0IG90aGVyIHZhbHVlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgICAgICAgICAgICA6OiBUaGlzIGZpZWxkIGlzIHVzZWQgYXMgYSBiaXRtYXAgZGVzY3JpcHRvci4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBhZGRyZXNzIGFuZCBjb250ZW50IG9mIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBidWZmZXIgY2FuIGNoYW5nZSBiZXR3ZWVuIGNhbGxzIG9mICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfTG9hZF9HbHlwaCBhbmQgYSBmZXcgb3RoZXIgZnVuY3Rpb25zLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF9sZWZ0ICAgICAgIDo6IFRoZSBiaXRtYXAncyBsZWZ0IGJlYXJpbmcgZXhwcmVzc2VkIGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF90b3AgICAgICAgIDo6IFRoZSBiaXRtYXAncyB0b3AgYmVhcmluZyBleHByZXNzZWQgaW4gaW50ZWdlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMuICBUaGlzIGlzIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IGdseXBoIHNjYW5saW5lLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVwd2FyZHMgeX5jb29yZGluYXRlcyBiZWluZyAqcG9zaXRpdmUqLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgICAgOjogVGhlIG91dGxpbmUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGlmIGl0cyBmb3JtYXQgaXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX09VVExJTkUuICBPbmNlIGEgZ2x5cGggaXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLCBgb3V0bGluZScgY2FuIGJlIHRyYW5zZm9ybWVkLCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRlZCwgZW1ib2xkZW5lZCwgZXRjLiAgSG93ZXZlciwgaXQgbXVzdCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9zdWJnbHlwaHMgICAgIDo6IFRoZSBudW1iZXIgb2Ygc3ViZ2x5cGhzIGluIGEgY29tcG9zaXRlIGdseXBoLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjb21wb3NpdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggZm9ybWF0IHRoYXQgc2hvdWxkIG5vcm1hbGx5IG9ubHkgYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCB3aXRoIHRoZSBARlRfTE9BRF9OT19SRUNVUlNFIGZsYWcuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3ViZ2x5cGhzICAgICAgICAgOjogQW4gYXJyYXkgb2Ygc3ViZ2x5cGggZGVzY3JpcHRvcnMgZm9yICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBnbHlwaHMuICBUaGVyZSBhcmUgYG51bV9zdWJnbHlwaHMnICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGVyZS4gIEN1cnJlbnRseSBpbnRlcm5hbCB0byAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sX2RhdGEgICAgICA6OiBDZXJ0YWluIGZvbnQgZHJpdmVycyBjYW4gYWxzbyByZXR1cm4gdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBkYXRhIGZvciBhIGdpdmVuIGdseXBoIGltYWdlIChlLmcuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGJ5dGVjb2RlLCBUeXBlfjEgY2hhcnN0cmluZ3MsIGV0Yy4pLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIGEgcG9pbnRlciB0byBzdWNoIGRhdGE7IGl0IGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGludGVybmFsIHRvIEZyZWVUeXBlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sX2xlbiAgICAgICA6OiBUaGlzIGlzIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGNvbnRyb2wgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS4gIEN1cnJlbnRseSBpbnRlcm5hbCB0byBGcmVlVHlwZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdGhlciAgICAgICAgICAgICA6OiBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxzYl9kZWx0YSAgICAgICAgIDo6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHNpZGUgYmVhcmluZyB3aGlsZSBhdXRvLWhpbnRpbmcgaXMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLiAgWmVybyBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByc2JfZGVsdGEgICAgICAgICA6OiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGhpbnRlZCBhbmQgdW5oaW50ZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgc2lkZSBiZWFyaW5nIHdoaWxlIGF1dG8taGludGluZyBpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIEBGVF9Mb2FkX0dseXBoIGlzIGNhbGxlZCB3aXRoIGRlZmF1bHQgZmxhZ3MgKHNlZSAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9ERUZBVUxUKSB0aGUgZ2x5cGggaW1hZ2UgaXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IGluICAgKi8KLSAgLyogICAgaXRzIG5hdGl2ZSBmb3JtYXQgKGUuZy4sIGFuIG91dGxpbmUgZ2x5cGggZm9yIFRydWVUeXBlIGFuZCBUeXBlfjEgICovCi0gIC8qICAgIGZvcm1hdHMpLiAgW1NpbmNlIDIuOV0gVGhlIHByb3NwZWN0aXZlIGJpdG1hcCBtZXRyaWNzIGFyZSAgICAgICAgICAqLwotICAvKiAgICBjYWxjdWxhdGVkIGFjY29yZGluZyB0byBARlRfTE9BRF9UQVJHRVRfWFhYIGFuZCBvdGhlciBmbGFncyBldmVuICAgKi8KLSAgLyogICAgZm9yIHRoZSBvdXRsaW5lIGdseXBoLCBldmVuIGlmIEBGVF9MT0FEX1JFTkRFUiBpcyBub3Qgc2V0LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGltYWdlIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgaW50byBhIGJpdG1hcCBieSBjYWxsaW5nICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlbmRlcl9HbHlwaC4gIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yICovCi0gIC8qICAgIHRoZSBuYXRpdmUgaW1hZ2UncyBmb3JtYXQsIHRoZW4gaW52b2tlcyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbmRlcmVyIGlzIGluIGNoYXJnZSBvZiB0cmFuc2Zvcm1pbmcgdGhlIG5hdGl2ZSBpbWFnZSB0aHJvdWdoICovCi0gIC8qICAgIHRoZSBzbG90J3MgZmFjZSB0cmFuc2Zvcm1hdGlvbiBmaWVsZHMsIHRoZW4gY29udmVydGluZyBpdCBpbnRvIGEgICAqLwotICAvKiAgICBiaXRtYXAgdGhhdCBpcyByZXR1cm5lZCBpbiBgc2xvdC0+Yml0bWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBgc2xvdC0+Yml0bWFwX2xlZnQnIGFuZCBgc2xvdC0+Yml0bWFwX3RvcCcgYXJlIGFsc28gdXNlZCAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0bWFwIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBlbiAgKi8KLSAgLyogICAgcG9zaXRpb24gKGUuZy4sIGNvb3JkaW5hdGVzICgwLDApIG9uIHRoZSBiYXNlbGluZSkuICBPZiBjb3Vyc2UsICAgICovCi0gIC8qICAgIGBzbG90LT5mb3JtYXQnIGlzIGFsc28gY2hhbmdlZCB0byBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBpcyBhIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZSAgICAgICAgICovCi0gIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyB0byBkbyBmcmFjdGlvbmFsIHBvc2l0aW9uaW5nIG9mICAgICAgICAqLwotICAvKiAgICBnbHlwaHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCAgICAgPSBmYWNlLT5nbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgICAgICAgIG9yaWdpbl94ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBmb3IgYWxsIGdseXBocyBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8bG9hZCBnbHlwaCB3aXRoIGBGVF9Mb2FkX0dseXBoJz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBzbG90LT5vdXRsaW5lLCBvcmlnaW5feCAmIDYzLCAwICk7ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPHNhdmUgZ2x5cGggaW1hZ2UsIG9yIHJlbmRlciBnbHlwaCwgb3IgLi4uPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8Y29tcHV0ZSBrZXJuIGJldHdlZW4gY3VycmVudCBhbmQgbmV4dCBnbHlwaCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIGFuZCBhZGQgaXQgdG8gYG9yaWdpbl94Jz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBvcmlnaW5feCArPSBzbG90LT5hZHZhbmNlLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgb3JpZ2luX3ggKz0gc2xvdC0+cnNiX2RlbHRhIC0gc2xvdC0+bHNiX2RlbHRhOyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBlbmRmb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBpcyBhbm90aGVyIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZSAgICovCi0gIC8qICAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyB0byBpbXByb3ZlIGludGVnZXIgcG9zaXRpb25pbmcgb2YgICAgICAqLwotICAvKiAgICBnbHlwaHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCAgICAgICAgICAgPSBmYWNlLT5nbHlwaDsgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgICAgICAgIG9yaWdpbl94ICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfUG9zICAgICAgICBwcmV2X3JzYl9kZWx0YSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yIGFsbCBnbHlwaHMgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGNvbXB1dGUga2VybiBiZXR3ZWVuIGN1cnJlbnQgYW5kIHByZXZpb3VzIGdseXBoICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBhbmQgYWRkIGl0IHRvIGBvcmlnaW5feCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPGxvYWQgZ2x5cGggd2l0aCBgRlRfTG9hZF9HbHlwaCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIHByZXZfcnNiX2RlbHRhIC0gc2xvdC0+bHNiX2RlbHRhID4gIDMyICkgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBvcmlnaW5feCAtPSA2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIHNsb3QtPmxzYl9kZWx0YSA8IC0zMSApICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIG9yaWdpbl94ICs9IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHByZXZfcnNiX2RlbHRhID0gc2xvdC0+cnNiX2RlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgPHNhdmUgZ2x5cGggaW1hZ2UsIG9yIHJlbmRlciBnbHlwaCwgb3IgLi4uPiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBvcmlnaW5feCArPSBzbG90LT5hZHZhbmNlLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVuZGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgdXNlIHN0cm9uZyBhdXRvLWhpbnRpbmcsIHlvdSAqbXVzdCogYXBwbHkgdGhlc2UgZGVsdGEgICAgICAgKi8KLSAgLyogICAgdmFsdWVzISAgT3RoZXJ3aXNlIHlvdSB3aWxsIGV4cGVyaWVuY2UgZmFyIHRvbyBsYXJnZSBpbnRlci1nbHlwaCAgICovCi0gIC8qICAgIHNwYWNpbmcgYXQgc21hbGwgcmVuZGVyaW5nIHNpemVzIGluIG1vc3QgY2FzZXMuICBOb3RlIHRoYXQgaXQgICAgICAqLwotICAvKiAgICBkb2Vzbid0IGhhcm0gdG8gdXNlIHRoZSBhYm92ZSBjb2RlIGZvciBvdGhlciBoaW50aW5nIG1vZGVzIGFsc28sICAgKi8KLSAgLyogICAgc2luY2UgdGhlIGRlbHRhIHZhbHVlcyBhcmUgemVybyB0aGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9HbHlwaFNsb3RSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZyZWVUeXBlIHJvb3QgZ2x5cGggc2xvdCBjbGFzcyBzdHJ1Y3R1cmUuICBBIGdseXBoIHNsb3QgaXMgYSBjb250YWluZXIKKyAgICogICB3aGVyZSBpbmRpdmlkdWFsIGdseXBocyBjYW4gYmUgbG9hZGVkLCBiZSB0aGV5IGluIG91dGxpbmUgb3IgYml0bWFwCisgICAqICAgZm9ybWF0LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlIHRoaXMgc2xvdCBiZWxvbmdzIHRvLgorICAgKgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgbmV4dCA6OgorICAgKiAgICAgSW4gc29tZSBjYXNlcyAobGlrZSBzb21lIGZvbnQgdG9vbHMpLCBzZXZlcmFsIGdseXBoIHNsb3RzIHBlciBmYWNlCisgICAqICAgICBvYmplY3QgY2FuIGJlIGEgZ29vZCB0aGluZy4gIEFzIHRoaXMgaXMgcmFyZSwgdGhlIGdseXBoIHNsb3RzIGFyZQorICAgKiAgICAgbGlzdGVkIHRocm91Z2ggYSBkaXJlY3QsIHNpbmdsZS1saW5rZWQgbGlzdCB1c2luZyBpdHMgYG5leHRgIGZpZWxkLgorICAgKgorICAgKiAgIGdseXBoX2luZGV4IDo6CisgICAqICAgICBbU2luY2UgMi4xMF0gVGhlIGdseXBoIGluZGV4IHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBARlRfTG9hZF9HbHlwaAorICAgKiAgICAgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBnbHlwaCBzbG90LgorICAgKgorICAgKiAgIGdlbmVyaWMgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkgb3IgYW55IG9mIGl0cworICAgKiAgICAgZHJpdmVycy4gIEl0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gbGluayB0aGVpciBvd24KKyAgICogICAgIGRhdGEgdG8gZWFjaCBnbHlwaCBzbG90IG9iamVjdC4KKyAgICoKKyAgICogICBtZXRyaWNzIDo6CisgICAqICAgICBUaGUgbWV0cmljcyBvZiB0aGUgbGFzdCBsb2FkZWQgZ2x5cGggaW4gdGhlIHNsb3QuICBUaGUgcmV0dXJuZWQKKyAgICogICAgIHZhbHVlcyBkZXBlbmQgb24gdGhlIGxhc3QgbG9hZCBmbGFncyAoc2VlIHRoZSBARlRfTG9hZF9HbHlwaCBBUEkKKyAgICogICAgIGZ1bmN0aW9uKSBhbmQgY2FuIGJlIGV4cHJlc3NlZCBlaXRoZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscyBvcgorICAgKiAgICAgZm9udCB1bml0cy4KKyAgICoKKyAgICogICAgIE5vdGUgdGhhdCBldmVuIHdoZW4gdGhlIGdseXBoIGltYWdlIGlzIHRyYW5zZm9ybWVkLCB0aGUgbWV0cmljcyBhcmUKKyAgICogICAgIG5vdC4KKyAgICoKKyAgICogICBsaW5lYXJIb3JpQWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGFkdmFuY2Ugd2lkdGggb2YgdGhlIHVuaGludGVkIGdseXBoLiAgSXRzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbgorICAgKiAgICAgMTYuMTYgZnJhY3Rpb25hbCBwaXhlbHMsIHVubGVzcyBARlRfTE9BRF9MSU5FQVJfREVTSUdOIGlzIHNldCB3aGVuCisgICAqICAgICBsb2FkaW5nIHRoZSBnbHlwaC4gIFRoaXMgZmllbGQgY2FuIGJlIGltcG9ydGFudCB0byBwZXJmb3JtIGNvcnJlY3QKKyAgICogICAgIFdZU0lXWUcgbGF5b3V0LiAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuCisgICAqCisgICAqICAgbGluZWFyVmVydEFkdmFuY2UgOjoKKyAgICogICAgIFRoZSBhZHZhbmNlIGhlaWdodCBvZiB0aGUgdW5oaW50ZWQgZ2x5cGguICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluCisgICAqICAgICAxNi4xNiBmcmFjdGlvbmFsIHBpeGVscywgdW5sZXNzIEBGVF9MT0FEX0xJTkVBUl9ERVNJR04gaXMgc2V0IHdoZW4KKyAgICogICAgIGxvYWRpbmcgdGhlIGdseXBoLiAgVGhpcyBmaWVsZCBjYW4gYmUgaW1wb3J0YW50IHRvIHBlcmZvcm0gY29ycmVjdAorICAgKiAgICAgV1lTSVdZRyBsYXlvdXQuICBPbmx5IHJlbGV2YW50IGZvciBvdXRsaW5lIGdseXBocy4KKyAgICoKKyAgICogICBhZHZhbmNlIDo6CisgICAqICAgICBUaGlzIHNob3J0aGFuZCBpcywgZGVwZW5kaW5nIG9uIEBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0sIHRoZQorICAgKiAgICAgdHJhbnNmb3JtZWQgKGhpbnRlZCkgYWR2YW5jZSB3aWR0aCBmb3IgdGhlIGdseXBoLCBpbiAyNi42IGZyYWN0aW9uYWwKKyAgICogICAgIHBpeGVsIGZvcm1hdC4gIEFzIHNwZWNpZmllZCB3aXRoIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCwgaXQgdXNlcworICAgKiAgICAgZWl0aGVyIHRoZSBgaG9yaUFkdmFuY2VgIG9yIHRoZSBgdmVydEFkdmFuY2VgIHZhbHVlIG9mIGBtZXRyaWNzYAorICAgKiAgICAgZmllbGQuCisgICAqCisgICAqICAgZm9ybWF0IDo6CisgICAqICAgICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSBjb250YWluZWQgaW4gdGhlIGdseXBoCisgICAqICAgICBzbG90LiAgVHlwaWNhbGx5IEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCBARlRfR0xZUEhfRk9STUFUX09VVExJTkUsCisgICAqICAgICBvciBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgYnV0IG90aGVyIHZhbHVlcyBhcmUgcG9zc2libGUuCisgICAqCisgICAqICAgYml0bWFwIDo6CisgICAqICAgICBUaGlzIGZpZWxkIGlzIHVzZWQgYXMgYSBiaXRtYXAgZGVzY3JpcHRvci4gIE5vdGUgdGhhdCB0aGUgYWRkcmVzcworICAgKiAgICAgYW5kIGNvbnRlbnQgb2YgdGhlIGJpdG1hcCBidWZmZXIgY2FuIGNoYW5nZSBiZXR3ZWVuIGNhbGxzIG9mCisgICAqICAgICBARlRfTG9hZF9HbHlwaCBhbmQgYSBmZXcgb3RoZXIgZnVuY3Rpb25zLgorICAgKgorICAgKiAgIGJpdG1hcF9sZWZ0IDo6CisgICAqICAgICBUaGUgYml0bWFwJ3MgbGVmdCBiZWFyaW5nIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIHBpeGVscy4KKyAgICoKKyAgICogICBiaXRtYXBfdG9wIDo6CisgICAqICAgICBUaGUgYml0bWFwJ3MgdG9wIGJlYXJpbmcgZXhwcmVzc2VkIGluIGludGVnZXIgcGl4ZWxzLiAgVGhpcyBpcyB0aGUKKyAgICogICAgIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBnbHlwaCBzY2FubGluZSwgdXB3YXJkcworICAgKiAgICAgeX5jb29yZGluYXRlcyBiZWluZyAqKnBvc2l0aXZlKiouCisgICAqCisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgVGhlIG91dGxpbmUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZ2x5cGggaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcworICAgKiAgICAgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLiAgT25jZSBhIGdseXBoIGlzIGxvYWRlZCwgYG91dGxpbmVgIGNhbiBiZQorICAgKiAgICAgdHJhbnNmb3JtZWQsIGRpc3RvcnRlZCwgZW1ib2xkZW5lZCwgZXRjLiAgSG93ZXZlciwgaXQgbXVzdCBub3QgYmUKKyAgICogICAgIGZyZWVkLgorICAgKgorICAgKiAgICAgW1NpbmNlIDIuMTAuMV0gSWYgQEZUX0xPQURfTk9fU0NBTEUgaXMgc2V0LCBvdXRsaW5lIGNvb3JkaW5hdGVzIG9mCisgICAqICAgICBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMgZm9yIGEgc2VsZWN0ZWQgaW5zdGFuY2UgYXJlIGludGVybmFsbHkKKyAgICogICAgIGhhbmRsZWQgYXMgMjYuNiBmcmFjdGlvbmFsIGZvbnQgdW5pdHMgYnV0IHJldHVybmVkIGFzIChyb3VuZGVkKQorICAgKiAgICAgaW50ZWdlcnMsIGFzIGV4cGVjdGVkLiAgVG8gZ2V0IHVucm91bmRlZCBmb250IHVuaXRzLCBkb24ndCB1c2UKKyAgICogICAgIEBGVF9MT0FEX05PX1NDQUxFIGJ1dCBsb2FkIHRoZSBnbHlwaCB3aXRoIEBGVF9MT0FEX05PX0hJTlRJTkcgYW5kCisgICAqICAgICBzY2FsZSBpdCwgdXNpbmcgdGhlIGZvbnQncyBgdW5pdHNfcGVyX0VNYCB2YWx1ZSBhcyB0aGUgcHBlbS4KKyAgICoKKyAgICogICBudW1fc3ViZ2x5cGhzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHN1YmdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gIFRoaXMgZmllbGQgaXMgb25seQorICAgKiAgICAgdmFsaWQgZm9yIHRoZSBjb21wb3NpdGUgZ2x5cGggZm9ybWF0IHRoYXQgc2hvdWxkIG5vcm1hbGx5IG9ubHkgYmUKKyAgICogICAgIGxvYWRlZCB3aXRoIHRoZSBARlRfTE9BRF9OT19SRUNVUlNFIGZsYWcuCisgICAqCisgICAqICAgc3ViZ2x5cGhzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBzdWJnbHlwaCBkZXNjcmlwdG9ycyBmb3IgY29tcG9zaXRlIGdseXBocy4gIFRoZXJlIGFyZQorICAgKiAgICAgYG51bV9zdWJnbHlwaHNgIGVsZW1lbnRzIGluIHRoZXJlLiAgQ3VycmVudGx5IGludGVybmFsIHRvIEZyZWVUeXBlLgorICAgKgorICAgKiAgIGNvbnRyb2xfZGF0YSA6OgorICAgKiAgICAgQ2VydGFpbiBmb250IGRyaXZlcnMgY2FuIGFsc28gcmV0dXJuIHRoZSBjb250cm9sIGRhdGEgZm9yIGEgZ2l2ZW4KKyAgICogICAgIGdseXBoIGltYWdlIChlLmcuICBUcnVlVHlwZSBieXRlY29kZSwgVHlwZX4xIGNoYXJzdHJpbmdzLCBldGMuKS4KKyAgICogICAgIFRoaXMgZmllbGQgaXMgYSBwb2ludGVyIHRvIHN1Y2ggZGF0YTsgaXQgaXMgY3VycmVudGx5IGludGVybmFsIHRvCisgICAqICAgICBGcmVlVHlwZS4KKyAgICoKKyAgICogICBjb250cm9sX2xlbiA6OgorICAgKiAgICAgVGhpcyBpcyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjb250cm9sIGRhdGEuICBDdXJyZW50bHkgaW50ZXJuYWwKKyAgICogICAgIHRvIEZyZWVUeXBlLgorICAgKgorICAgKiAgIG90aGVyIDo6CisgICAqICAgICBSZXNlcnZlZC4KKyAgICoKKyAgICogICBsc2JfZGVsdGEgOjoKKyAgICogICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCBsZWZ0IHNpZGUgYmVhcmluZyB3aGlsZQorICAgKiAgICAgYXV0by1oaW50aW5nIGlzIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLgorICAgKgorICAgKiAgIHJzYl9kZWx0YSA6OgorICAgKiAgICAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW50ZWQgYW5kIHVuaGludGVkIHJpZ2h0IHNpZGUgYmVhcmluZyB3aGlsZQorICAgKiAgICAgYXV0by1oaW50aW5nIGlzIGFjdGl2ZS4gIFplcm8gb3RoZXJ3aXNlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiBARlRfTG9hZF9HbHlwaCBpcyBjYWxsZWQgd2l0aCBkZWZhdWx0IGZsYWdzIChzZWUgQEZUX0xPQURfREVGQVVMVCkKKyAgICogICB0aGUgZ2x5cGggaW1hZ2UgaXMgbG9hZGVkIGluIHRoZSBnbHlwaCBzbG90IGluIGl0cyBuYXRpdmUgZm9ybWF0CisgICAqICAgKGUuZy4sIGFuIG91dGxpbmUgZ2x5cGggZm9yIFRydWVUeXBlIGFuZCBUeXBlfjEgZm9ybWF0cykuICBbU2luY2UgMi45XQorICAgKiAgIFRoZSBwcm9zcGVjdGl2ZSBiaXRtYXAgbWV0cmljcyBhcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8KKyAgICogICBARlRfTE9BRF9UQVJHRVRfWFhYIGFuZCBvdGhlciBmbGFncyBldmVuIGZvciB0aGUgb3V0bGluZSBnbHlwaCwgZXZlbgorICAgKiAgIGlmIEBGVF9MT0FEX1JFTkRFUiBpcyBub3Qgc2V0LgorICAgKgorICAgKiAgIFRoaXMgaW1hZ2UgY2FuIGxhdGVyIGJlIGNvbnZlcnRlZCBpbnRvIGEgYml0bWFwIGJ5IGNhbGxpbmcKKyAgICogICBARlRfUmVuZGVyX0dseXBoLiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhlCisgICAqICAgbmF0aXZlIGltYWdlJ3MgZm9ybWF0LCB0aGVuIGludm9rZXMgaXQuCisgICAqCisgICAqICAgVGhlIHJlbmRlcmVyIGlzIGluIGNoYXJnZSBvZiB0cmFuc2Zvcm1pbmcgdGhlIG5hdGl2ZSBpbWFnZSB0aHJvdWdoIHRoZQorICAgKiAgIHNsb3QncyBmYWNlIHRyYW5zZm9ybWF0aW9uIGZpZWxkcywgdGhlbiBjb252ZXJ0aW5nIGl0IGludG8gYSBiaXRtYXAKKyAgICogICB0aGF0IGlzIHJldHVybmVkIGluIGBzbG90LT5iaXRtYXBgLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBgc2xvdC0+Yml0bWFwX2xlZnRgIGFuZCBgc2xvdC0+Yml0bWFwX3RvcGAgYXJlIGFsc28gdXNlZCB0bworICAgKiAgIHNwZWNpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBiaXRtYXAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcGVuCisgICAqICAgcG9zaXRpb24gKGUuZy4sIGNvb3JkaW5hdGVzICgwLDApIG9uIHRoZSBiYXNlbGluZSkuICBPZiBjb3Vyc2UsCisgICAqICAgYHNsb3QtPmZvcm1hdGAgaXMgYWxzbyBjaGFuZ2VkIHRvIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLgorICAgKgorICAgKiAgIEhlcmUgaXMgYSBzbWFsbCBwc2V1ZG8gY29kZSBmcmFnbWVudCB0aGF0IHNob3dzIGhvdyB0byB1c2UgYGxzYl9kZWx0YWAKKyAgICogICBhbmQgYHJzYl9kZWx0YWAgdG8gZG8gZnJhY3Rpb25hbCBwb3NpdGlvbmluZyBvZiBnbHlwaHM6CisgICAqCisgICAqICAgYGBgCisgICAqICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgICAgID0gZmFjZS0+Z2x5cGg7CisgICAqICAgICBGVF9Qb3MgICAgICAgIG9yaWdpbl94ID0gMDsKKyAgICoKKyAgICoKKyAgICogICAgIGZvciBhbGwgZ2x5cGhzIGRvCisgICAqICAgICAgIDxsb2FkIGdseXBoIHdpdGggYEZUX0xvYWRfR2x5cGgnPgorICAgKgorICAgKiAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggc2xvdC0+b3V0bGluZSwgb3JpZ2luX3ggJiA2MywgMCApOworICAgKgorICAgKiAgICAgICA8c2F2ZSBnbHlwaCBpbWFnZSwgb3IgcmVuZGVyIGdseXBoLCBvciAuLi4+CisgICAqCisgICAqICAgICAgIDxjb21wdXRlIGtlcm4gYmV0d2VlbiBjdXJyZW50IGFuZCBuZXh0IGdseXBoCisgICAqICAgICAgICBhbmQgYWRkIGl0IHRvIGBvcmlnaW5feCc+CisgICAqCisgICAqICAgICAgIG9yaWdpbl94ICs9IHNsb3QtPmFkdmFuY2UueDsKKyAgICogICAgICAgb3JpZ2luX3ggKz0gc2xvdC0+bHNiX2RlbHRhIC0gc2xvdC0+cnNiX2RlbHRhOworICAgKiAgICAgZW5kZm9yCisgICAqICAgYGBgCisgICAqCisgICAqICAgSGVyZSBpcyBhbm90aGVyIHNtYWxsIHBzZXVkbyBjb2RlIGZyYWdtZW50IHRoYXQgc2hvd3MgaG93IHRvIHVzZQorICAgKiAgIGBsc2JfZGVsdGFgIGFuZCBgcnNiX2RlbHRhYCB0byBpbXByb3ZlIGludGVnZXIgcG9zaXRpb25pbmcgb2YgZ2x5cGhzOgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgRlRfR2x5cGhTbG90ICBzbG90ICAgICAgICAgICA9IGZhY2UtPmdseXBoOworICAgKiAgICAgRlRfUG9zICAgICAgICBvcmlnaW5feCAgICAgICA9IDA7CisgICAqICAgICBGVF9Qb3MgICAgICAgIHByZXZfcnNiX2RlbHRhID0gMDsKKyAgICoKKyAgICoKKyAgICogICAgIGZvciBhbGwgZ2x5cGhzIGRvCisgICAqICAgICAgIDxjb21wdXRlIGtlcm4gYmV0d2VlbiBjdXJyZW50IGFuZCBwcmV2aW91cyBnbHlwaAorICAgKiAgICAgICAgYW5kIGFkZCBpdCB0byBgb3JpZ2luX3gnPgorICAgKgorICAgKiAgICAgICA8bG9hZCBnbHlwaCB3aXRoIGBGVF9Mb2FkX0dseXBoJz4KKyAgICoKKyAgICogICAgICAgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIHNsb3QtPmxzYl9kZWx0YSA+ICAzMiApCisgICAqICAgICAgICAgb3JpZ2luX3ggLT0gNjQ7CisgICAqICAgICAgIGVsc2UgaWYgKCBwcmV2X3JzYl9kZWx0YSAtIHNsb3QtPmxzYl9kZWx0YSA8IC0zMSApCisgICAqICAgICAgICAgb3JpZ2luX3ggKz0gNjQ7CisgICAqCisgICAqICAgICAgIHByZXZfcnNiX2RlbHRhID0gc2xvdC0+cnNiX2RlbHRhOworICAgKgorICAgKiAgICAgICA8c2F2ZSBnbHlwaCBpbWFnZSwgb3IgcmVuZGVyIGdseXBoLCBvciAuLi4+CisgICAqCisgICAqICAgICAgIG9yaWdpbl94ICs9IHNsb3QtPmFkdmFuY2UueDsKKyAgICogICAgIGVuZGZvcgorICAgKiAgIGBgYAorICAgKgorICAgKiAgIElmIHlvdSB1c2Ugc3Ryb25nIGF1dG8taGludGluZywgeW91ICoqbXVzdCoqIGFwcGx5IHRoZXNlIGRlbHRhIHZhbHVlcyEKKyAgICogICBPdGhlcndpc2UgeW91IHdpbGwgZXhwZXJpZW5jZSBmYXIgdG9vIGxhcmdlIGludGVyLWdseXBoIHNwYWNpbmcgYXQKKyAgICogICBzbWFsbCByZW5kZXJpbmcgc2l6ZXMgaW4gbW9zdCBjYXNlcy4gIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGhhcm0gdG8gdXNlCisgICAqICAgdGhlIGFib3ZlIGNvZGUgZm9yIG90aGVyIGhpbnRpbmcgbW9kZXMgYWxzbywgc2luY2UgdGhlIGRlbHRhIHZhbHVlcworICAgKiAgIGFyZSB6ZXJvIHRoZW4uCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhTbG90UmVjXwogICB7CiAgICAgRlRfTGlicmFyeSAgICAgICAgbGlicmFyeTsKICAgICBGVF9GYWNlICAgICAgICAgICBmYWNlOwogICAgIEZUX0dseXBoU2xvdCAgICAgIG5leHQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgcmVzZXJ2ZWQ7ICAgICAgIC8qIHJldGFpbmVkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLworICAgIEZUX1VJbnQgICAgICAgICAgIGdseXBoX2luZGV4OyAvKiBuZXcgaW4gMi4xMDsgd2FzIHJlc2VydmVkIHByZXZpb3VzbHkgKi8KICAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOwogCiAgICAgRlRfR2x5cGhfTWV0cmljcyAgbWV0cmljczsKQEAgLTE5NTIsODYgKzE5MTQsOTIgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgVGhlIHNldCBvZiBtb2R1bGVzICAgICAgKi8KLSAgLyogICAgdGhhdCBhcmUgcmVnaXN0ZXJlZCBieSB0aGlzIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYXQgYnVpbGQgdGltZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gY2FzZSB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIG1lbW9yeSBhbGxvY2F0aW5nIHJvdXRpbmVzLCAgICovCi0gIC8qICAgIHVzZSBARlRfTmV3X0xpYnJhcnkgaW5zdGVhZCwgZm9sbG93ZWQgYnkgYSBjYWxsIHRvICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAob3IgYSBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX0FkZF9Nb2R1bGUpICAgKi8KLSAgLyogICAgYW5kIEBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgQEZUX0xpYnJhcnkgYW5kIEBGVF9GYWNlIGZvciAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGktdGhyZWFkaW5nIGlzc3Vlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgbmVlZCByZWZlcmVuY2UtY291bnRpbmcgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgICAgKi8KLSAgLyogICAgQEZUX05ld19MaWJyYXJ5IGFuZCBARlRfRG9uZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBjb21waWxhdGlvbiBvcHRpb24gRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTIGlzICAgKi8KLSAgLyogICAgc2V0LCB0aGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycgZW52aXJvbm1lbnQgICAgICovCi0gIC8qICAgIHZhcmlhYmxlIHRvIGNvbnRyb2wgZHJpdmVyIHByb3BlcnRpZXMuICBTZWUgc2VjdGlvbiBAcHJvcGVydGllcyAgICAqLwotICAvKiAgICBmb3IgbW9yZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfSW5pdF9GcmVlVHlwZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgSW5pdGlhbGl6ZSBhIG5ldyBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIFRoZSBzZXQgb2YgbW9kdWxlcyB0aGF0IGFyZQorICAgKiAgIHJlZ2lzdGVyZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGF0IGJ1aWxkIHRpbWUuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYWxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEluIGNhc2UgeW91IHdhbnQgdG8gcHJvdmlkZSB5b3VyIG93biBtZW1vcnkgYWxsb2NhdGluZyByb3V0aW5lcywgdXNlCisgICAqICAgQEZUX05ld19MaWJyYXJ5IGluc3RlYWQsIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcworICAgKiAgIChvciBhIHNlcmllcyBvZiBjYWxscyB0byBARlRfQWRkX01vZHVsZSkgYW5kCisgICAqICAgQEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMuCisgICAqCisgICAqICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEBGVF9MaWJyYXJ5IGFuZCBARlRfRmFjZSBmb3IgbXVsdGktdGhyZWFkaW5nCisgICAqICAgaXNzdWVzLgorICAgKgorICAgKiAgIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZyAoY2YuIEBGVF9SZWZlcmVuY2VfTGlicmFyeSksIHVzZQorICAgKiAgIEBGVF9OZXdfTGlicmFyeSBhbmQgQEZUX0RvbmVfTGlicmFyeS4KKyAgICoKKyAgICogICBJZiBjb21waWxhdGlvbiBvcHRpb24gYEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFU2AgaXMKKyAgICogICBzZXQsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCBlbnZpcm9ubWVudAorICAgKiAgIHZhcmlhYmxlIHRvIGNvbnRyb2wgZHJpdmVyIHByb3BlcnRpZXMuICBTZWUgc2VjdGlvbiBAcHJvcGVydGllcyBmb3IKKyAgICogICBtb3JlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkgICphbGlicmFyeSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGdpdmVuIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLCAgICovCi0gIC8qICAgIGluY2x1ZGluZyByZXNvdXJjZXMsIGRyaXZlcnMsIGZhY2VzLCBzaXplcywgZXRjLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9Eb25lX0ZyZWVUeXBlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXN0cm95IGEgZ2l2ZW4gRnJlZVR5cGUgbGlicmFyeSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4sCisgICAqICAgaW5jbHVkaW5nIHJlc291cmNlcywgZHJpdmVycywgZmFjZXMsIHNpemVzLCBldGMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfRG9uZV9GcmVlVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdCBmaWVsZCBjb25zdGFudHMgdXNlZCB3aXRoaW4gdGhlIGBmbGFncycgZmllbGQgb2YgdGhlICovCi0gIC8qICAgIEBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fTUVNT1JZICAgOjogVGhpcyBpcyBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9TVFJFQU0gICA6OiBDb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgYHN0cmVhbScgZmllbGQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBVEhOQU1FIDo6IENyZWF0ZSBhIG5ldyBpbnB1dCBzdHJlYW0gZnJvbSBhIEN+cGF0aCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX0RSSVZFUiAgIDo6IFVzZSB0aGUgYGRyaXZlcicgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFSQU1TICAgOjogVXNlIHRoZSBgbnVtX3BhcmFtcycgYW5kIGBwYXJhbXMnIGZpZWxkcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgRlRfT1BFTl9NRU1PUlknLCBgRlRfT1BFTl9TVFJFQU0nLCBhbmQgYEZUX09QRU5fUEFUSE5BTUUnICAgICAqLwotICAvKiAgICBmbGFncyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9PUEVOX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIGJpdCBmaWVsZCBjb25zdGFudHMgdXNlZCB3aXRoaW4gdGhlIGBmbGFnc2AgZmllbGQgb2YgdGhlCisgICAqICAgQEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfT1BFTl9NRU1PUlkgOjoKKyAgICogICAgIFRoaXMgaXMgYSBtZW1vcnktYmFzZWQgc3RyZWFtLgorICAgKgorICAgKiAgIEZUX09QRU5fU1RSRUFNIDo6CisgICAqICAgICBDb3B5IHRoZSBzdHJlYW0gZnJvbSB0aGUgYHN0cmVhbWAgZmllbGQuCisgICAqCisgICAqICAgRlRfT1BFTl9QQVRITkFNRSA6OgorICAgKiAgICAgQ3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSBmcm9tIGEgQ35wYXRoIG5hbWUuCisgICAqCisgICAqICAgRlRfT1BFTl9EUklWRVIgOjoKKyAgICogICAgIFVzZSB0aGUgYGRyaXZlcmAgZmllbGQuCisgICAqCisgICAqICAgRlRfT1BFTl9QQVJBTVMgOjoKKyAgICogICAgIFVzZSB0aGUgYG51bV9wYXJhbXNgIGFuZCBgcGFyYW1zYCBmaWVsZHMuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBgRlRfT1BFTl9NRU1PUllgLCBgRlRfT1BFTl9TVFJFQU1gLCBhbmQgYEZUX09QRU5fUEFUSE5BTUVgIGZsYWdzCisgICAqICAgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKyAgICovCiAjZGVmaW5lIEZUX09QRU5fTUVNT1JZICAgIDB4MQogI2RlZmluZSBGVF9PUEVOX1NUUkVBTSAgICAweDIKICNkZWZpbmUgRlRfT1BFTl9QQVRITkFNRSAgMHg0CkBAIC0yMDM5LDcgKzIwMDcsNyBAQAogI2RlZmluZSBGVF9PUEVOX1BBUkFNUyAgICAweDEwCiAKIAotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfT1BFTl9YWFgnICovCisgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9PUEVOX1hYWGAgKi8KICAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBmdF9vcGVuX21lbW9yeSAgICBGVF9PUEVOX01FTU9SWQogI2RlZmluZSBmdF9vcGVuX3N0cmVhbSAgICBGVF9PUEVOX1NUUkVBTQpAQCAtMjA0OCwyNCArMjAxNiwyNiBAQAogI2RlZmluZSBmdF9vcGVuX3BhcmFtcyAgICBGVF9PUEVOX1BBUkFNUwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHRvIHBhc3MgbW9yZSBvciBsZXNzIGdlbmVyaWMgcGFyYW1ldGVycyB0byAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UgYW5kIEBGVF9GYWNlX1Byb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogQSBmb3VyLWJ5dGUgaWRlbnRpZmljYXRpb24gdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIElEIGFuZCBmdW5jdGlvbiBvZiBwYXJhbWV0ZXJzIGFyZSBkcml2ZXItc3BlY2lmaWMuICBTZWUgICAgICAgICovCi0gIC8qICAgIHNlY3Rpb24gQHBhcmFtZXRlcl90YWdzIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfUGFyYW1ldGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdG8gcGFzcyBtb3JlIG9yIGxlc3MgZ2VuZXJpYyBwYXJhbWV0ZXJzIHRvCisgICAqICAgQEZUX09wZW5fRmFjZSBhbmQgQEZUX0ZhY2VfUHJvcGVydGllcy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB0YWcgOjoKKyAgICogICAgIEEgZm91ci1ieXRlIGlkZW50aWZpY2F0aW9uIHRhZy4KKyAgICoKKyAgICogICBkYXRhIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlciBkYXRhLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgSUQgYW5kIGZ1bmN0aW9uIG9mIHBhcmFtZXRlcnMgYXJlIGRyaXZlci1zcGVjaWZpYy4gIFNlZSBzZWN0aW9uCisgICAqICAgQHBhcmFtZXRlcl90YWdzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1BhcmFtZXRlcl8KICAgewogICAgIEZUX1VMb25nICAgIHRhZzsKQEAgLTIwNzQsNjUgKzIwNDQsNzAgQEAKICAgfSBGVF9QYXJhbWV0ZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBpbmRpY2F0ZSBob3cgdG8gb3BlbiBhIG5ldyBmb250IGZpbGUgb3Igc3RyZWFtLiAgQSAgKi8KLSAgLyogICAgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlIGNhbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIGZvciB0aGUgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBARlRfT3Blbl9GYWNlIGFuZCBARlRfQXR0YWNoX1N0cmVhbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBpbmRpY2F0aW5nIGhvdyB0byB1c2UgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeV9iYXNlIDo6IFRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5X3NpemUgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRobmFtZSAgICA6OiBBIHBvaW50ZXIgdG8gYW4gOC1iaXQgZmlsZSBwYXRobmFtZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIHN0cmVhbSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyICAgICAgOjogVGhpcyBmaWVsZCBpcyBleGNsdXNpdmVseSB1c2VkIGJ5IEBGVF9PcGVuX0ZhY2U7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0IHNpbXBseSBzcGVjaWZpZXMgdGhlIGZvbnQgZHJpdmVyIHRvIHVzZSBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvcGVuaW5nIHRoZSBmYWNlLiAgSWYgc2V0IHRvIE5VTEwsIEZyZWVUeXBlIHRyaWVzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdG8gbG9hZCB0aGUgZmFjZSB3aXRoIGVhY2ggb25lIG9mIHRoZSBkcml2ZXJzIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGl0cyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyAgOjogVGhlIG51bWJlciBvZiBleHRyYSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbXMgICAgICA6OiBFeHRyYSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZm9udCBkcml2ZXIgd2hlbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3BlbmluZyBhIG5ldyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSB0eXBlIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnRzIG9mIGBmbGFncycgdGhhdCAgICAgICovCi0gIC8qICAgIGFyZSB0ZXN0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieSBARlRfT3Blbl9GYWNlOiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX01FTU9SWSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSBmaWxlIG9mIGBtZW1vcnlfc2l6ZScgYnl0ZXMsIGxvY2F0ZWQgYXQgYG1lbW9yeV9hZGRyZXNzJy4gICAqLwotICAvKiAgICBUaGUgZGF0YSBhcmUgbm90IGNvcGllZCwgYW5kIHRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yICAgICAgICAgKi8KLSAgLyogICAgcmVsZWFzaW5nIGFuZCBkZXN0cm95aW5nIHRoZW0gX2FmdGVyXyB0aGUgY29ycmVzcG9uZGluZyBjYWxsIHRvICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fU1RSRUFNIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IGEgICAgICAgICovCi0gIC8qICAgIGN1c3RvbSBpbnB1dCBzdHJlYW0gYHN0cmVhbScgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCBpZiB0aGUgQEZUX09QRU5fUEFUSE5BTUUgYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgdGhpcyAgICovCi0gIC8qICAgIGlzIGEgbm9ybWFsIGZpbGUgYW5kIHVzZSBgcGF0aG5hbWUnIHRvIG9wZW4gaXQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX0RSSVZFUiBiaXQgaXMgc2V0LCBARlRfT3Blbl9GYWNlIG9ubHkgdHJpZXMgdG8gICAgICovCi0gIC8qICAgIG9wZW4gdGhlIGZpbGUgd2l0aCB0aGUgZHJpdmVyIHdob3NlIGhhbmRsZXIgaXMgaW4gYGRyaXZlcicuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIEBGVF9PUEVOX1BBUkFNUyBiaXQgaXMgc2V0LCB0aGUgcGFyYW1ldGVycyBnaXZlbiBieSAgICAgICAgICovCi0gIC8qICAgIGBudW1fcGFyYW1zJyBhbmQgYHBhcmFtcycgaXMgdXNlZC4gIFRoZXkgYXJlIGlnbm9yZWQgb3RoZXJ3aXNlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWRlYWxseSwgYm90aCB0aGUgYHBhdGhuYW1lJyBhbmQgYHBhcmFtcycgZmllbGRzIHNob3VsZCBiZSB0YWdnZWQgICovCi0gIC8qICAgIGFzIGBjb25zdCc7IHRoaXMgaXMgbWlzc2luZyBmb3IgQVBJIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBJbiAgICAqLwotICAvKiAgICBvdGhlciB3b3JkcywgYXBwbGljYXRpb25zIHNob3VsZCB0cmVhdCB0aGVtIGFzIHJlYWQtb25seS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX09wZW5fQXJncworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdG8gaW5kaWNhdGUgaG93IHRvIG9wZW4gYSBuZXcgZm9udCBmaWxlIG9yIHN0cmVhbS4gIEEKKyAgICogICBwb2ludGVyIHRvIHN1Y2ggYSBzdHJ1Y3R1cmUgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZQorICAgKiAgIGZ1bmN0aW9ucyBARlRfT3Blbl9GYWNlIGFuZCBARlRfQXR0YWNoX1N0cmVhbS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBmbGFncyA6OgorICAgKiAgICAgQSBzZXQgb2YgYml0IGZsYWdzIGluZGljYXRpbmcgaG93IHRvIHVzZSB0aGUgc3RydWN0dXJlLgorICAgKgorICAgKiAgIG1lbW9yeV9iYXNlIDo6CisgICAqICAgICBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlsZSBpbiBtZW1vcnkuCisgICAqCisgICAqICAgbWVtb3J5X3NpemUgOjoKKyAgICogICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBmaWxlIGluIG1lbW9yeS4KKyAgICoKKyAgICogICBwYXRobmFtZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIDgtYml0IGZpbGUgcGF0aG5hbWUuICBUaGUgcG9pbnRlciBpcyBub3Qgb3duZWQgYnkKKyAgICogICAgIEZyZWVUeXBlLgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBzb3VyY2Ugc3RyZWFtIG9iamVjdC4KKyAgICoKKyAgICogICBkcml2ZXIgOjoKKyAgICogICAgIFRoaXMgZmllbGQgaXMgZXhjbHVzaXZlbHkgdXNlZCBieSBARlRfT3Blbl9GYWNlOyBpdCBzaW1wbHkgc3BlY2lmaWVzCisgICAqICAgICB0aGUgZm9udCBkcml2ZXIgdG8gdXNlIGZvciBvcGVuaW5nIHRoZSBmYWNlLiAgSWYgc2V0IHRvIGBOVUxMYCwKKyAgICogICAgIEZyZWVUeXBlIHRyaWVzIHRvIGxvYWQgdGhlIGZhY2Ugd2l0aCBlYWNoIG9uZSBvZiB0aGUgZHJpdmVycyBpbiBpdHMKKyAgICogICAgIGxpc3QuCisgICAqCisgICAqICAgbnVtX3BhcmFtcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBleHRyYSBwYXJhbWV0ZXJzLgorICAgKgorICAgKiAgIHBhcmFtcyA6OgorICAgKiAgICAgRXh0cmEgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGZvbnQgZHJpdmVyIHdoZW4gb3BlbmluZyBhIG5ldyBmYWNlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc3RyZWFtIHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudHMgb2YgYGZsYWdzYCB0aGF0IGFyZQorICAgKiAgIHRlc3RlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGJ5IEBGVF9PcGVuX0ZhY2U6CisgICAqCisgICAqICAgSWYgdGhlIEBGVF9PUEVOX01FTU9SWSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgbWVtb3J5IGZpbGUKKyAgICogICBvZiBgbWVtb3J5X3NpemVgIGJ5dGVzLCBsb2NhdGVkIGF0IGBtZW1vcnlfYWRkcmVzc2AuICBUaGUgZGF0YSBhcmUgbm90CisgICAqICAgY29waWVkLCBhbmQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIGFuZCBkZXN0cm95aW5nCisgICAqICAgdGhlbSBfYWZ0ZXJfIHRoZSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gQEZUX0RvbmVfRmFjZS4KKyAgICoKKyAgICogICBPdGhlcndpc2UsIGlmIHRoZSBARlRfT1BFTl9TVFJFQU0gYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgYSBjdXN0b20KKyAgICogICBpbnB1dCBzdHJlYW0gYHN0cmVhbWAgaXMgdXNlZC4KKyAgICoKKyAgICogICBPdGhlcndpc2UsIGlmIHRoZSBARlRfT1BFTl9QQVRITkFNRSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCB0aGlzIGlzIGEKKyAgICogICBub3JtYWwgZmlsZSBhbmQgdXNlIGBwYXRobmFtZWAgdG8gb3BlbiBpdC4KKyAgICoKKyAgICogICBJZiB0aGUgQEZUX09QRU5fRFJJVkVSIGJpdCBpcyBzZXQsIEBGVF9PcGVuX0ZhY2Ugb25seSB0cmllcyB0byBvcGVuCisgICAqICAgdGhlIGZpbGUgd2l0aCB0aGUgZHJpdmVyIHdob3NlIGhhbmRsZXIgaXMgaW4gYGRyaXZlcmAuCisgICAqCisgICAqICAgSWYgdGhlIEBGVF9PUEVOX1BBUkFNUyBiaXQgaXMgc2V0LCB0aGUgcGFyYW1ldGVycyBnaXZlbiBieQorICAgKiAgIGBudW1fcGFyYW1zYCBhbmQgYHBhcmFtc2AgaXMgdXNlZC4gIFRoZXkgYXJlIGlnbm9yZWQgb3RoZXJ3aXNlLgorICAgKgorICAgKiAgIElkZWFsbHksIGJvdGggdGhlIGBwYXRobmFtZWAgYW5kIGBwYXJhbXNgIGZpZWxkcyBzaG91bGQgYmUgdGFnZ2VkIGFzCisgICAqICAgJ2NvbnN0JzsgdGhpcyBpcyBtaXNzaW5nIGZvciBBUEkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIEluIG90aGVyCisgICAqICAgd29yZHMsIGFwcGxpY2F0aW9ucyBzaG91bGQgdHJlYXQgdGhlbSBhcyByZWFkLW9ubHkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfT3Blbl9BcmdzXwogICB7CiAgICAgRlRfVUludCAgICAgICAgIGZsYWdzOwpAQCAtMjE0NywzNCArMjEyMiwzNyBAQAogICB9IEZUX09wZW5fQXJnczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENhbGwgQEZUX09wZW5fRmFjZSB0byBvcGVuIGEgZm9udCBieSBpdHMgcGF0aG5hbWUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhuYW1lICAgOjogQSBwYXRoIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBTZWUgQEZUX09wZW5fRmFjZSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzICovCi0gIC8qICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0RvbmVfRmFjZSB0byBkZXN0cm95IHRoZSBjcmVhdGVkIEBGVF9GYWNlIG9iamVjdCAoYWxvbmcgICAgKi8KLSAgLyogICAgd2l0aCBpdHMgc2xvdCBhbmQgc2l6ZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19GYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDYWxsIEBGVF9PcGVuX0ZhY2UgdG8gb3BlbiBhIGZvbnQgYnkgaXRzIHBhdGhuYW1lLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBwYXRobmFtZSA6OgorICAgKiAgICAgQSBwYXRoIHRvIHRoZSBmb250IGZpbGUuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYWZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXhgIGlzIGdyZWF0ZXIgdGhhbiBvcgorICAgKiAgICAgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tYE5VTExgLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFVzZSBARlRfRG9uZV9GYWNlIHRvIGRlc3Ryb3kgdGhlIGNyZWF0ZWQgQEZUX0ZhY2Ugb2JqZWN0IChhbG9uZyB3aXRoCisgICAqICAgaXRzIHNsb3QgYW5kIHNpemVzKS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9OZXdfRmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lLApAQCAtMjE4MiwzNiArMjE2MCwzOSBAQAogICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDYWxsIEBGVF9PcGVuX0ZhY2UgdG8gb3BlbiBhIGZvbnQgdGhhdCBoYXMgYmVlbiBsb2FkZWQgaW50byAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlsZV9iYXNlICA6OiBBIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9udCBkYXRhLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaWxlX3NpemUgIDo6IFRoZSBzaXplIG9mIHRoZSBtZW1vcnkgY2h1bmsgdXNlZCBieSB0aGUgZm9udCBkYXRhLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogU2VlIEBGVF9PcGVuX0ZhY2UgZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgSWYgYGZhY2VfaW5kZXgnIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXQgbXVzdCBiZSBub24tTlVMTC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IG11c3Qgbm90IGRlYWxsb2NhdGUgdGhlIG1lbW9yeSBiZWZvcmUgY2FsbGluZyBARlRfRG9uZV9GYWNlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19NZW1vcnlfRmFjZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ2FsbCBARlRfT3Blbl9GYWNlIHRvIG9wZW4gYSBmb250IHRoYXQgaGFzIGJlZW4gbG9hZGVkIGludG8gbWVtb3J5LgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmaWxlX2Jhc2UgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb250IGRhdGEuCisgICAqCisgICAqICAgZmlsZV9zaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGNodW5rIHVzZWQgYnkgdGhlIGZvbnQgZGF0YS4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBTZWUgQEZUX09wZW5fRmFjZSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIHBhcmFtZXRlci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleGAgaXMgZ3JlYXRlciB0aGFuIG9yCisgICAqICAgICBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1gTlVMTGAuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IG11c3Qgbm90IGRlYWxsb2NhdGUgdGhlIG1lbW9yeSBiZWZvcmUgY2FsbGluZyBARlRfRG9uZV9GYWNlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX05ld19NZW1vcnlfRmFjZSggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGZpbGVfYmFzZSwKQEAgLTIyMjAsMTQ3ICsyMjAxLDE0MyBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICphZmFjZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGRlc2NyaWJlZCBieSAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9PcGVuX0FyZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyZ3MgICAgICAgOjogQSBwb2ludGVyIHRvIGFuIGBGVF9PcGVuX0FyZ3MnIHN0cnVjdHVyZSB0aGF0IG11c3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJlIGZpbGxlZCBieSB0aGUgY2FsbGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogVGhpcyBmaWVsZCBob2xkcyB0d28gZGlmZmVyZW50IHZhbHVlcy4gIEJpdHMgMC0xNSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFyZSB0aGUgaW5kZXggb2YgdGhlIGZhY2UgaW4gdGhlIGZvbnQgZmlsZSAoc3RhcnRpbmcgKi8KLSAgLyogICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlfjApLiAgU2V0IGl0IHRvfjAgaWYgdGhlcmUgaXMgb25seSBvbmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFjZSBpbiB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBbU2luY2UgMi42LjFdIEJpdHMgMTYtMzAgYXJlIHJlbGV2YW50IHRvIEdYIGFuZCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzIG9ubHksIHNwZWNpZnlpbmcgdGhlIG5hbWVkICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGluZGV4IGZvciB0aGUgY3VycmVudCBmYWNlIGluZGV4IChzdGFydGluZyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlfjE7IHZhbHVlfjAgbWFrZXMgRnJlZVR5cGUgaWdub3JlIG5hbWVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzKS4gIEZvciBub24tdmFyaWF0aW9uIGZvbnRzLCBiaXRzIDE2LTMwIGFyZSAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlnbm9yZWQuICBBc3N1bWluZyB0aGF0IHlvdSB3YW50IHRvIGFjY2VzcyB0aGUgdGhpcmQgKi8KLSAgLyogICAgICAgICAgICAgICAgICBuYW1lZCBpbnN0YW5jZSBpbiBmYWNlfjQsIGBmYWNlX2luZGV4JyBzaG91bGQgYmUgc2V0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgdG8gMHgwMDAzMDAwNC4gIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmYWNlfjQgd2l0aG91dCAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbiBoYW5kbGluZywgc2ltcGx5IHNldCBgZmFjZV9pbmRleCcgdG8gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZX40LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBGVF9PcGVuX0ZhY2UnIGFuZCBpdHMgc2libGluZ3MgY2FuIGJlIHVzZWQgdG8gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBxdWlja2x5IGNoZWNrIHdoZXRoZXIgdGhlIGZvbnQgZm9ybWF0IG9mIGEgZ2l2ZW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udCByZXNvdXJjZSBpcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUuICBJbiBnZW5lcmFsLCAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlmIHRoZSBgZmFjZV9pbmRleCcgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpc34wIGlmIHRoZSBmb250IGZvcm1hdCBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgcmVjb2duaXplZCwgb3Igbm9uLXplcm8gb3RoZXJ3aXNlLiAgVGhlIGZ1bmN0aW9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRlcyBhIG1vcmUgb3IgbGVzcyBlbXB0eSBmYWNlIGhhbmRsZSBpbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgKmFmYWNlJyAoaWYgYGFmYWNlJyBpc24ndCBOVUxMKTsgdGhlIG9ubHkgdHdvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlZnVsIGZpZWxkcyBpbiB0aGlzIHNwZWNpYWwgY2FzZSBhcmUgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBmYWNlLT5udW1fZmFjZXMnIGFuZCBgZmFjZS0+c3R5bGVfZmxhZ3MnLiAgRm9yIGFueSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBvZiBgZmFjZV9pbmRleCcsIGBmYWNlLT5udW1fZmFjZXMnICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIG51bWJlciBvZiBmYWNlcyB3aXRoaW4gdGhlIGZvbnQgZmlsZS4gIEZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBuZWdhdGl2ZSB2YWx1ZSBgLShOKzEpJyAod2l0aCBgTicgYSBub24tbmVnYXRpdmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi1iaXQgdmFsdWUpLCBiaXRzIDE2LTMwIGluIGBmYWNlLT5zdHlsZV9mbGFncycgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ2l2ZSB0aGUgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyBpbiBmYWNlIGBOJyBpZiB3ZSAqLwotICAvKiAgICAgICAgICAgICAgICAgIGhhdmUgYSB2YXJpYXRpb24gZm9udCAob3IgemVybyBvdGhlcndpc2UpLiAgQWZ0ZXIgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBleGFtaW5hdGlvbiwgdGhlIHJldHVybmVkIEBGVF9GYWNlIHN0cnVjdHVyZSBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYmUgZGVhbGxvY2F0ZWQgd2l0aCBhIGNhbGwgdG8gQEZUX0RvbmVfRmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVbmxpa2UgRnJlZVR5cGUgMS54LCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoICAgKi8KLSAgLyogICAgc2xvdCBmb3IgdGhlIGZhY2Ugb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgICovCi0gIC8qICAgIGBmYWNlLT5nbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBuZXcgZmFjZSBvYmplY3QgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gYWxzbyBvd25zIGEgICAgICAgICovCi0gIC8qICAgIGRlZmF1bHQgQEZUX1NpemUgb2JqZWN0LCBhY2Nlc3NpYmxlIGFzIGBmYWNlLT5zaXplJy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25lIEBGVF9MaWJyYXJ5IGluc3RhbmNlIGNhbiBoYXZlIG11bHRpcGxlIGZhY2Ugb2JqZWN0cywgdGhpcyBpcywgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UgYW5kIGl0cyBzaWJsaW5ncyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHVzaW5nICAqLwotICAvKiAgICB0aGUgc2FtZSBgbGlicmFyeScgYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGxvb3Agb3ZlciBhbGwgZmFjZXMsIHVzZSBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBzbmlwcGV0ICAqLwotICAvKiAgICAob21pdHRpbmcgdGhlIGVycm9yIGhhbmRsaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9GYWNlICBmYWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaSwgbnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksIGFyZ3MsIC0xLCAmZmFjZSApOyAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZXJyb3IgKSB7IC4uLiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgbnVtX2ZhY2VzID0gZmFjZS0+bnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fZmFjZXM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgYXJncywgaSwgJmZhY2UgKTsgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBsb29wIG92ZXIgYWxsIHZhbGlkIHZhbHVlcyBmb3IgYGZhY2VfaW5kZXgnLCB1c2Ugc29tZXRoaW5nICAgICAgKi8KLSAgLyogICAgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHNuaXBwZXQsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmcuICAgICovCi0gIC8qICAgIFRoZSBjb2RlIGFjY2Vzc2VzIGFsbCBmYWNlcyBpbW1lZGlhdGVseSAodGh1cyBvbmx5IGEgc2luZ2xlIGNhbGwgICAqLwotICAvKiAgICBvZiBgRlRfT3Blbl9GYWNlJyB3aXRoaW4gdGhlIGRvLWxvb3ApLCB3aXRoIGFuZCB3aXRob3V0IG5hbWVkICAgICAgKi8KLSAgLyogICAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfRmFjZSAgZmFjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBudW1fZmFjZXMgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgbnVtX2luc3RhbmNlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBmYWNlX2lkeCAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0xvbmcgIGlkID0gKCBpbnN0YW5jZV9pZHggPDwgMTYgKSArIGZhY2VfaWR4OyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpZCwgJmZhY2UgKTsgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIG51bV9mYWNlcyAgICAgPSBmYWNlLT5udW1fZmFjZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBudW1faW5zdGFuY2VzID0gZmFjZS0+c3R5bGVfZmxhZ3MgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGluc3RhbmNlX2lkeCA8IG51bV9pbnN0YW5jZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBpbnN0YW5jZV9pZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBmYWNlX2lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9IHdoaWxlICggZmFjZV9pZHggPCBudW1fZmFjZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PcGVuX0ZhY2UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBkZXNjcmliZWQgYnkgQEZUX09wZW5fQXJncy4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYXJncyA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIGBGVF9PcGVuX0FyZ3NgIHN0cnVjdHVyZSB0aGF0IG11c3QgYmUgZmlsbGVkIGJ5IHRoZQorICAgKiAgICAgY2FsbGVyLgorICAgKgorICAgKiAgIGZhY2VfaW5kZXggOjoKKyAgICogICAgIFRoaXMgZmllbGQgaG9sZHMgdHdvIGRpZmZlcmVudCB2YWx1ZXMuICBCaXRzIDAtMTUgYXJlIHRoZSBpbmRleCBvZgorICAgKiAgICAgdGhlIGZhY2UgaW4gdGhlIGZvbnQgZmlsZSAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4wKS4gIFNldCBpdCB0b34wIGlmCisgICAqICAgICB0aGVyZSBpcyBvbmx5IG9uZSBmYWNlIGluIHRoZSBmb250IGZpbGUuCisgICAqCisgICAqICAgICBbU2luY2UgMi42LjFdIEJpdHMgMTYtMzAgYXJlIHJlbGV2YW50IHRvIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24KKyAgICogICAgIGZvbnRzIG9ubHksIHNwZWNpZnlpbmcgdGhlIG5hbWVkIGluc3RhbmNlIGluZGV4IGZvciB0aGUgY3VycmVudCBmYWNlCisgICAqICAgICBpbmRleCAoc3RhcnRpbmcgd2l0aCB2YWx1ZX4xOyB2YWx1ZX4wIG1ha2VzIEZyZWVUeXBlIGlnbm9yZSBuYW1lZAorICAgKiAgICAgaW5zdGFuY2VzKS4gIEZvciBub24tdmFyaWF0aW9uIGZvbnRzLCBiaXRzIDE2LTMwIGFyZSBpZ25vcmVkLgorICAgKiAgICAgQXNzdW1pbmcgdGhhdCB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlIHRoaXJkIG5hbWVkIGluc3RhbmNlIGluIGZhY2V+NCwKKyAgICogICAgIGBmYWNlX2luZGV4YCBzaG91bGQgYmUgc2V0IHRvIDB4MDAwMzAwMDQuICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MKKyAgICogICAgIGZhY2V+NCB3aXRob3V0IHZhcmlhdGlvbiBoYW5kbGluZywgc2ltcGx5IHNldCBgZmFjZV9pbmRleGAgdG8KKyAgICogICAgIHZhbHVlfjQuCisgICAqCisgICAqICAgICBgRlRfT3Blbl9GYWNlYCBhbmQgaXRzIHNpYmxpbmdzIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlcgorICAgKiAgICAgdGhlIGZvbnQgZm9ybWF0IG9mIGEgZ2l2ZW4gZm9udCByZXNvdXJjZSBpcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGUuCisgICAqICAgICBJbiBnZW5lcmFsLCBpZiB0aGUgYGZhY2VfaW5kZXhgIGFyZ3VtZW50IGlzIG5lZ2F0aXZlLCB0aGUgZnVuY3Rpb24ncworICAgKiAgICAgcmV0dXJuIHZhbHVlIGlzfjAgaWYgdGhlIGZvbnQgZm9ybWF0IGlzIHJlY29nbml6ZWQsIG9yIG5vbi16ZXJvCisgICAqICAgICBvdGhlcndpc2UuICBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIGEgbW9yZSBvciBsZXNzIGVtcHR5IGZhY2UgaGFuZGxlCisgICAqICAgICBpbiBgKmFmYWNlYCAoaWYgYGFmYWNlYCBpc24ndCBgTlVMTGApOyB0aGUgb25seSB0d28gdXNlZnVsIGZpZWxkcyBpbgorICAgKiAgICAgdGhpcyBzcGVjaWFsIGNhc2UgYXJlIGBmYWNlLT5udW1fZmFjZXNgIGFuZCBgZmFjZS0+c3R5bGVfZmxhZ3NgLgorICAgKiAgICAgRm9yIGFueSBuZWdhdGl2ZSB2YWx1ZSBvZiBgZmFjZV9pbmRleGAsIGBmYWNlLT5udW1fZmFjZXNgIGdpdmVzIHRoZQorICAgKiAgICAgbnVtYmVyIG9mIGZhY2VzIHdpdGhpbiB0aGUgZm9udCBmaWxlLiAgRm9yIHRoZSBuZWdhdGl2ZSB2YWx1ZQorICAgKiAgICAgJy0oTisxKScgKHdpdGggJ04nIGEgbm9uLW5lZ2F0aXZlIDE2LWJpdCB2YWx1ZSksIGJpdHMgMTYtMzAgaW4KKyAgICogICAgIGBmYWNlLT5zdHlsZV9mbGFnc2AgZ2l2ZSB0aGUgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyBpbiBmYWNlICdOJworICAgKiAgICAgaWYgd2UgaGF2ZSBhIHZhcmlhdGlvbiBmb250IChvciB6ZXJvIG90aGVyd2lzZSkuICBBZnRlciBleGFtaW5hdGlvbiwKKyAgICogICAgIHRoZSByZXR1cm5lZCBARlRfRmFjZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGRlYWxsb2NhdGVkIHdpdGggYSBjYWxsIHRvCisgICAqICAgICBARlRfRG9uZV9GYWNlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4YCBpcyBncmVhdGVyIHRoYW4gb3IKKyAgICogICAgIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLWBOVUxMYC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBVbmxpa2UgRnJlZVR5cGUgMS54LCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoIHNsb3QKKyAgICogICBmb3IgdGhlIGZhY2Ugb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2gKKyAgICogICBgZmFjZS0+Z2x5cGhgLgorICAgKgorICAgKiAgIEVhY2ggbmV3IGZhY2Ugb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uIGFsc28gb3ducyBhIGRlZmF1bHQKKyAgICogICBARlRfU2l6ZSBvYmplY3QsIGFjY2Vzc2libGUgYXMgYGZhY2UtPnNpemVgLgorICAgKgorICAgKiAgIE9uZSBARlRfTGlicmFyeSBpbnN0YW5jZSBjYW4gaGF2ZSBtdWx0aXBsZSBmYWNlIG9iamVjdHMsIHRoaXMgaXMsCisgICAqICAgQEZUX09wZW5fRmFjZSBhbmQgaXRzIHNpYmxpbmdzIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdXNpbmcgdGhlCisgICAqICAgc2FtZSBgbGlicmFyeWAgYXJndW1lbnQuCisgICAqCisgICAqICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YKKyAgICogICBARlRfUmVmZXJlbmNlX0ZhY2UuCisgICAqCisgICAqIEBleGFtcGxlOgorICAgKiAgIFRvIGxvb3Agb3ZlciBhbGwgZmFjZXMsIHVzZSBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBzbmlwcGV0CisgICAqICAgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCisgICAqCisgICAqICAgYGBgCisgICAqICAgICAuLi4KKyAgICogICAgIEZUX0ZhY2UgIGZhY2U7CisgICAqICAgICBGVF9Mb25nICBpLCBudW1fZmFjZXM7CisgICAqCisgICAqCisgICAqICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgYXJncywgLTEsICZmYWNlICk7CisgICAqICAgICBpZiAoIGVycm9yICkgeyAuLi4gfQorICAgKgorICAgKiAgICAgbnVtX2ZhY2VzID0gZmFjZS0+bnVtX2ZhY2VzOworICAgKiAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7CisgICAqCisgICAqICAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9mYWNlczsgaSsrICkKKyAgICogICAgIHsKKyAgICogICAgICAgLi4uCisgICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpLCAmZmFjZSApOworICAgKiAgICAgICAuLi4KKyAgICogICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7CisgICAqICAgICAgIC4uLgorICAgKiAgICAgfQorICAgKiAgIGBgYAorICAgKgorICAgKiAgIFRvIGxvb3Agb3ZlciBhbGwgdmFsaWQgdmFsdWVzIGZvciBgZmFjZV9pbmRleGAsIHVzZSBzb21ldGhpbmcgc2ltaWxhcgorICAgKiAgIHRvIHRoZSBmb2xsb3dpbmcgc25pcHBldCwgYWdhaW4gd2l0aG91dCBlcnJvciBoYW5kbGluZy4gIFRoZSBjb2RlCisgICAqICAgYWNjZXNzZXMgYWxsIGZhY2VzIGltbWVkaWF0ZWx5ICh0aHVzIG9ubHkgYSBzaW5nbGUgY2FsbCBvZgorICAgKiAgIGBGVF9PcGVuX0ZhY2VgIHdpdGhpbiB0aGUgZG8tbG9vcCksIHdpdGggYW5kIHdpdGhvdXQgbmFtZWQgaW5zdGFuY2VzLgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgLi4uCisgICAqICAgICBGVF9GYWNlICBmYWNlOworICAgKgorICAgKiAgICAgRlRfTG9uZyAgbnVtX2ZhY2VzICAgICA9IDA7CisgICAqICAgICBGVF9Mb25nICBudW1faW5zdGFuY2VzID0gMDsKKyAgICoKKyAgICogICAgIEZUX0xvbmcgIGZhY2VfaWR4ICAgICA9IDA7CisgICAqICAgICBGVF9Mb25nICBpbnN0YW5jZV9pZHggPSAwOworICAgKgorICAgKgorICAgKiAgICAgZG8KKyAgICogICAgIHsKKyAgICogICAgICAgRlRfTG9uZyAgaWQgPSAoIGluc3RhbmNlX2lkeCA8PCAxNiApICsgZmFjZV9pZHg7CisgICAqCisgICAqCisgICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpZCwgJmZhY2UgKTsKKyAgICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIH0KKyAgICoKKyAgICogICAgICAgbnVtX2ZhY2VzICAgICA9IGZhY2UtPm51bV9mYWNlczsKKyAgICogICAgICAgbnVtX2luc3RhbmNlcyA9IGZhY2UtPnN0eWxlX2ZsYWdzID4+IDE2OworICAgKgorICAgKiAgICAgICAuLi4KKyAgICoKKyAgICogICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7CisgICAqCisgICAqICAgICAgIGlmICggaW5zdGFuY2VfaWR4IDwgbnVtX2luc3RhbmNlcyApCisgICAqICAgICAgICAgaW5zdGFuY2VfaWR4Kys7CisgICAqICAgICAgIGVsc2UKKyAgICogICAgICAgeworICAgKiAgICAgICAgIGZhY2VfaWR4Kys7CisgICAqICAgICAgICAgaW5zdGFuY2VfaWR4ID0gMDsKKyAgICogICAgICAgfQorICAgKgorICAgKiAgICAgfSB3aGlsZSAoIGZhY2VfaWR4IDwgbnVtX2ZhY2VzICkKKyAgICogICBgYGAKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9PcGVuX0ZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzKiAgYXJncywKQEAgLTIzNjgsMjA0ICsyMzQ1LDIwOCBAQAogICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgKmFmYWNlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdHRhY2hfRmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDYWxsIEBGVF9BdHRhY2hfU3RyZWFtIHRvIGF0dGFjaCBhIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaWxlcGF0aG5hbWUgOjogVGhlIHBhdGhuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQXR0YWNoX0ZpbGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENhbGwgQEZUX0F0dGFjaF9TdHJlYW0gdG8gYXR0YWNoIGEgZmlsZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmaWxlcGF0aG5hbWUgOjoKKyAgICogICAgIFRoZSBwYXRobmFtZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0F0dGFjaF9GaWxlKCBGVF9GYWNlICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBBdHRhY2gnIGRhdGEgdG8gYSBmYWNlIG9iamVjdC4gIE5vcm1hbGx5LCB0aGlzIGlzIHVzZWQgdG8gcmVhZCAgICAqLwotICAvKiAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmFjZSBvYmplY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiAgKi8KLSAgLyogICAgYXR0YWNoIGFuIEFGTSBmaWxlIHRoYXQgY29tZXMgd2l0aCBhIFR5cGV+MSBmb250IHRvIGdldCB0aGUgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgdmFsdWVzIGFuZCBvdGhlciBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQSBwb2ludGVyIHRvIEBGVF9PcGVuX0FyZ3MgdGhhdCBtdXN0IGJlIGZpbGxlZCBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVhbmluZyBvZiB0aGUgYGF0dGFjaCcgKGkuZS4sIHdoYXQgcmVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgICAgKi8KLSAgLyogICAgbmV3IGZpbGUgaXMgcmVhZCkgaXMgbm90IGZpeGVkIGJ5IEZyZWVUeXBlIGl0c2VsZi4gIEl0IHJlYWxseSAgICAgICovCi0gIC8qICAgIGRlcGVuZHMgb24gdGhlIGZvbnQgZm9ybWF0IChhbmQgdGh1cyB0aGUgZm9udCBkcml2ZXIpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nICAgICAgICovCi0gIC8qICAgIHdoZW4gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gIE1vc3QgZHJpdmVycyBzaW1wbHkgZG8gbm90IGltcGxlbWVudCAqLwotICAvKiAgICBmaWxlIG9yIHN0cmVhbSBhdHRhY2htZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQXR0YWNoX1N0cmVhbQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgJ0F0dGFjaCcgZGF0YSB0byBhIGZhY2Ugb2JqZWN0LiAgTm9ybWFsbHksIHRoaXMgaXMgdXNlZCB0byByZWFkCisgICAqICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZhY2Ugb2JqZWN0LiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4KKyAgICogICBhdHRhY2ggYW4gQUZNIGZpbGUgdGhhdCBjb21lcyB3aXRoIGEgVHlwZX4xIGZvbnQgdG8gZ2V0IHRoZSBrZXJuaW5nCisgICAqICAgdmFsdWVzIGFuZCBvdGhlciBtZXRyaWNzLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHBhcmFtZXRlcnMgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBARlRfT3Blbl9BcmdzIHRoYXQgbXVzdCBiZSBmaWxsZWQgYnkgdGhlIGNhbGxlci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgbWVhbmluZyBvZiB0aGUgJ2F0dGFjaCcgKGkuZS4sIHdoYXQgcmVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgbmV3CisgICAqICAgZmlsZSBpcyByZWFkKSBpcyBub3QgZml4ZWQgYnkgRnJlZVR5cGUgaXRzZWxmLiAgSXQgcmVhbGx5IGRlcGVuZHMgb24KKyAgICogICB0aGUgZm9udCBmb3JtYXQgKGFuZCB0aHVzIHRoZSBmb250IGRyaXZlcikuCisgICAqCisgICAqICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nIHdoZW4KKyAgICogICBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLiAgTW9zdCBkcml2ZXJzIHNpbXBseSBkbyBub3QgaW1wbGVtZW50IGZpbGUgb3IKKyAgICogICBzdHJlYW0gYXR0YWNobWVudHMuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfQXR0YWNoX1N0cmVhbSggRlRfRmFjZSAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgRlRfT3Blbl9BcmdzKiAgcGFyYW1ldGVycyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVmZXJlbmNlX0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjb3VudGVyIGdldHMgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgICovCi0gIC8qICAgIGlzIGNyZWF0ZWQuICBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuICBARlRfRG9uZV9GYWNlICAqLwotICAvKiAgICB0aGVuIG9ubHkgZGVzdHJveXMgYSBmYWNlIGlmIHRoZSBjb3VudGVyIGlzfjEsIG90aGVyd2lzZSBpdCBzaW1wbHkgKi8KLSAgLyogICAgZGVjcmVtZW50cyB0aGUgY291bnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhlbHBzIGluIG1hbmFnaW5nIGxpZmUtY3ljbGVzIG9mIHN0cnVjdHVyZXMgdGhhdCAgICAgKi8KLSAgLyogICAgcmVmZXJlbmNlIEBGVF9GYWNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi40LjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1JlZmVyZW5jZV9GYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBpcworICAgKiAgIGNyZWF0ZWQuICBUaGlzIGZ1bmN0aW9uIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuICBARlRfRG9uZV9GYWNlIHRoZW4KKyAgICogICBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5CisgICAqICAgZGVjcmVtZW50cyB0aGUgY291bnRlci4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGhlbHBzIGluIG1hbmFnaW5nIGxpZmUtY3ljbGVzIG9mIHN0cnVjdHVyZXMgdGhhdAorICAgKiAgIHJlZmVyZW5jZSBARlRfRmFjZSBvYmplY3RzLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNC4yCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfUmVmZXJlbmNlX0ZhY2UoIEZUX0ZhY2UgIGZhY2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpc2NhcmQgYSBnaXZlbiBmYWNlIG9iamVjdCwgYXMgd2VsbCBhcyBhbGwgb2YgaXRzIGNoaWxkIHNsb3RzIGFuZCAqLwotICAvKiAgICBzaXplcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KLSAgLyogICAgQEZUX1JlZmVyZW5jZV9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0RvbmVfRmFjZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRGlzY2FyZCBhIGdpdmVuIGZhY2Ugb2JqZWN0LCBhcyB3ZWxsIGFzIGFsbCBvZiBpdHMgY2hpbGQgc2xvdHMgYW5kCisgICAqICAgc2l6ZXMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgKiAgIEBGVF9SZWZlcmVuY2VfRmFjZS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9Eb25lX0ZhY2UoIEZUX0ZhY2UgIGZhY2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhIGJpdG1hcCBzdHJpa2UuICBUbyBiZSBtb3JlIHByZWNpc2UsIHRoaXMgZnVuY3Rpb24gc2V0cyAgICAqLwotICAvKiAgICB0aGUgc2NhbGluZyBmYWN0b3JzIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUgb2JqZWN0IGluIGEgZmFjZSBzbyAgICAgKi8KLSAgLyogICAgdGhhdCBiaXRtYXBzIGZyb20gdGhpcyBwYXJ0aWN1bGFyIHN0cmlrZSBhcmUgdGFrZW4gYnkgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoIGFuZCBmcmllbmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGJpdG1hcCBzdHJpa2UgaW4gdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYml0bWFwcyBlbWJlZGRlZCBpbiBvdXRsaW5lIGZvbnRzIGl0IGlzIGNvbW1vbiB0aGF0IG9ubHkgYSAgICAgKi8KLSAgLyogICAgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgZ2x5cGhzIGF0IGEgZ2l2ZW4gcHBlbSB2YWx1ZSBpcyBhdmFpbGFibGUuICovCi0gIC8qICAgIEZyZWVUeXBlIHNpbGVudGx5IHVzZXMgb3V0bGluZXMgaWYgdGhlcmUgaXMgbm8gYml0bWFwIGZvciBhIGdpdmVuICAqLwotICAvKiAgICBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLCBhIGJpdG1hcCBzdHJpa2UgbWFrZXMgc2Vuc2UgICAqLwotICAvKiAgICBvbmx5IGlmIHRoZSBkZWZhdWx0IGluc3RhbmNlIGlzIGFjdGl2ZSAodGhpcyBpcywgbm8gZ2x5cGggICAgICAgICAgKi8KLSAgLyogICAgdmFyaWF0aW9uIHRha2VzIHBsYWNlKTsgb3RoZXJ3aXNlLCBGcmVlVHlwZSBzaW1wbHkgaWdub3JlcyBiaXRtYXAgICovCi0gIC8qICAgIHN0cmlrZXMuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBhbGwgbmFtZWQgaW5zdGFuY2VzIHRoYXQgYXJlICAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TZWxlY3RfU2l6ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgU2VsZWN0IGEgYml0bWFwIHN0cmlrZS4gIFRvIGJlIG1vcmUgcHJlY2lzZSwgdGhpcyBmdW5jdGlvbiBzZXRzIHRoZQorICAgKiAgIHNjYWxpbmcgZmFjdG9ycyBvZiB0aGUgYWN0aXZlIEBGVF9TaXplIG9iamVjdCBpbiBhIGZhY2Ugc28gdGhhdAorICAgKiAgIGJpdG1hcHMgZnJvbSB0aGlzIHBhcnRpY3VsYXIgc3RyaWtlIGFyZSB0YWtlbiBieSBARlRfTG9hZF9HbHlwaCBhbmQKKyAgICogICBmcmllbmRzLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJpa2VfaW5kZXggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgYml0bWFwIHN0cmlrZSBpbiB0aGUgYGF2YWlsYWJsZV9zaXplc2AgZmllbGQgb2YKKyAgICogICAgIEBGVF9GYWNlUmVjIHN0cnVjdHVyZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBGb3IgYml0bWFwcyBlbWJlZGRlZCBpbiBvdXRsaW5lIGZvbnRzIGl0IGlzIGNvbW1vbiB0aGF0IG9ubHkgYSBzdWJzZXQKKyAgICogICBvZiB0aGUgYXZhaWxhYmxlIGdseXBocyBhdCBhIGdpdmVuIHBwZW0gdmFsdWUgaXMgYXZhaWxhYmxlLiAgRnJlZVR5cGUKKyAgICogICBzaWxlbnRseSB1c2VzIG91dGxpbmVzIGlmIHRoZXJlIGlzIG5vIGJpdG1hcCBmb3IgYSBnaXZlbiBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogICBGb3IgR1ggYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cywgYSBiaXRtYXAgc3RyaWtlIG1ha2VzIHNlbnNlIG9ubHkKKyAgICogICBpZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBhY3RpdmUgKHRoaXMgaXMsIG5vIGdseXBoIHZhcmlhdGlvbiB0YWtlcworICAgKiAgIHBsYWNlKTsgb3RoZXJ3aXNlLCBGcmVlVHlwZSBzaW1wbHkgaWdub3JlcyBiaXRtYXAgc3RyaWtlcy4gIFRoZSBzYW1lCisgICAqICAgaXMgdHJ1ZSBmb3IgYWxsIG5hbWVkIGluc3RhbmNlcyB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdAorICAgKiAgIGluc3RhbmNlLgorICAgKgorICAgKiAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TZWxlY3RfU2l6ZSggRlRfRmFjZSAgZmFjZSwKICAgICAgICAgICAgICAgICAgIEZUX0ludCAgIHN0cmlrZV9pbmRleCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB0aGF0IGxpc3RzIHRoZSBzdXBwb3J0ZWQgc2l6ZSByZXF1ZXN0IHR5cGVzLCAgICovCi0gIC8qICAgIGkuZS4sIHdoYXQgaW5wdXQgc2l6ZSAoaW4gZm9udCB1bml0cykgbWFwcyB0byB0aGUgcmVxdWVzdGVkIG91dHB1dCAqLwotICAvKiAgICBzaXplIChpbiBwaXhlbHMsIGFzIGNvbXB1dGVkIGZyb20gdGhlIGFyZ3VtZW50cyBvZiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1NpemVfUmVxdWVzdCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG5vbWluYWwgc2l6ZS4gIFRoZSBgdW5pdHNfcGVyX0VNJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBpcyAgICAqLwotICAvKiAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIGJvdGggc2NhbGluZyB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgc2NhbGluZyBmb3VuZCBpbiBtb3N0IGFwcGxpY2F0aW9ucy4gIEluICAgICAqLwotICAvKiAgICAgIHBhcnRpY3VsYXIsIHVzZSB0aGlzIHNpemUgcmVxdWVzdCB0eXBlIGZvciBUcnVlVHlwZSBmb250cyBpZiAgICAgKi8KLSAgLyogICAgICB0aGV5IHByb3ZpZGUgb3B0aWNhbCBzY2FsaW5nIG9yIHNvbWV0aGluZyBzaW1pbGFyLiAgTm90ZSwgICAgICAgICovCi0gIC8qICAgICAgaG93ZXZlciwgdGhhdCBgdW5pdHNfcGVyX0VNJyBpcyBhIHJhdGhlciBhYnN0cmFjdCB2YWx1ZSB3aGljaCAgICAqLwotICAvKiAgICAgIGJlYXJzIG5vIHJlbGF0aW9uIHRvIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgZ2x5cGhzIGluIGEgZm9udC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1JFQUxfRElNIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSByZWFsIGRpbWVuc2lvbi4gIFRoZSBzdW0gb2YgdGhlIGBhc2NlbmRlcicgYW5kIChtaW51cyBvZikgICAgKi8KLSAgLyogICAgICB0aGUgYGRlc2NlbmRlcicgZmllbGRzIG9mIEBGVF9GYWNlUmVjIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGJvdGggICovCi0gIC8qICAgICAgc2NhbGluZyB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQkJPWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZvbnQgYm91bmRpbmcgYm94LiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGBiYm94JyBmaWVsZCAqLwotICAvKiAgICAgIG9mIEBGVF9GYWNlUmVjIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KLSAgLyogICAgICBzY2FsaW5nIHZhbHVlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9DRUxMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgYG1heF9hZHZhbmNlX3dpZHRoJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBpcyB1c2VkIHRvICAgICAgICAgICovCi0gIC8qICAgICAgZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgdmFsdWU7IHRoZSB2ZXJ0aWNhbCBzY2FsaW5nICAgICAqLwotICAvKiAgICAgIHZhbHVlIGlzIGRldGVybWluZWQgdGhlIHNhbWUgd2F5IGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gZG9lcy4gIEZpbmFsbHksIGJvdGggc2NhbGluZyAgICAgICovCi0gIC8qICAgICAgdmFsdWVzIGFyZSBzZXQgdG8gdGhlIHNtYWxsZXIgb25lLiAgVGhpcyB0eXBlIGlzIHVzZWZ1bCBpZiB5b3UgICAqLwotICAvKiAgICAgIHdhbnQgdG8gc3BlY2lmeSB0aGUgZm9udCBzaXplIGZvciwgc2F5LCBhIHdpbmRvdyBvZiBhIGdpdmVuICAgICAgKi8KLSAgLyogICAgICBkaW1lbnNpb24gYW5kIDgweDI0IGNlbGxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9TQ0FMRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTcGVjaWZ5IHRoZSBzY2FsaW5nIHZhbHVlcyBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFib3ZlIGRlc2NyaXB0aW9ucyBvbmx5IGFwcGx5IHRvIHNjYWxhYmxlIGZvcm1hdHMuICBGb3IgYml0bWFwICovCi0gIC8qICAgIGZvcm1hdHMsIHRoZSBiZWhhdmlvdXIgaXMgdXAgdG8gdGhlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBub3RlIHNlY3Rpb24gb2YgQEZUX1NpemVfTWV0cmljcyBpZiB5b3Ugd29uZGVyIGhvdyBzaXplICAgICovCi0gIC8qICAgIHJlcXVlc3RpbmcgcmVsYXRlcyB0byBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1NpemVfUmVxdWVzdF9UeXBlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBlbnVtZXJhdGlvbiB0eXBlIHRoYXQgbGlzdHMgdGhlIHN1cHBvcnRlZCBzaXplIHJlcXVlc3QgdHlwZXMsIGkuZS4sCisgICAqICAgd2hhdCBpbnB1dCBzaXplIChpbiBmb250IHVuaXRzKSBtYXBzIHRvIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHNpemUgKGluCisgICAqICAgcGl4ZWxzLCBhcyBjb21wdXRlZCBmcm9tIHRoZSBhcmd1bWVudHMgb2YgQEZUX1NpemVfUmVxdWVzdCkuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCA6OgorICAgKiAgICAgVGhlIG5vbWluYWwgc2l6ZS4gIFRoZSBgdW5pdHNfcGVyX0VNYCBmaWVsZCBvZiBARlRfRmFjZVJlYyBpcyB1c2VkCisgICAqICAgICB0byBkZXRlcm1pbmUgYm90aCBzY2FsaW5nIHZhbHVlcy4KKyAgICoKKyAgICogICAgIFRoaXMgaXMgdGhlIHN0YW5kYXJkIHNjYWxpbmcgZm91bmQgaW4gbW9zdCBhcHBsaWNhdGlvbnMuICBJbgorICAgKiAgICAgcGFydGljdWxhciwgdXNlIHRoaXMgc2l6ZSByZXF1ZXN0IHR5cGUgZm9yIFRydWVUeXBlIGZvbnRzIGlmIHRoZXkKKyAgICogICAgIHByb3ZpZGUgb3B0aWNhbCBzY2FsaW5nIG9yIHNvbWV0aGluZyBzaW1pbGFyLiAgTm90ZSwgaG93ZXZlciwgdGhhdAorICAgKiAgICAgYHVuaXRzX3Blcl9FTWAgaXMgYSByYXRoZXIgYWJzdHJhY3QgdmFsdWUgd2hpY2ggYmVhcnMgbm8gcmVsYXRpb24gdG8KKyAgICogICAgIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgZ2x5cGhzIGluIGEgZm9udC4KKyAgICoKKyAgICogICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTSA6OgorICAgKiAgICAgVGhlIHJlYWwgZGltZW5zaW9uLiAgVGhlIHN1bSBvZiB0aGUgYGFzY2VuZGVyYCBhbmQgKG1pbnVzIG9mKSB0aGUKKyAgICogICAgIGBkZXNjZW5kZXJgIGZpZWxkcyBvZiBARlRfRmFjZVJlYyBpcyB1c2VkIHRvIGRldGVybWluZSBib3RoIHNjYWxpbmcKKyAgICogICAgIHZhbHVlcy4KKyAgICoKKyAgICogICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9CQk9YIDo6CisgICAqICAgICBUaGUgZm9udCBib3VuZGluZyBib3guICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYGJib3hgIGZpZWxkIG9mCisgICAqICAgICBARlRfRmFjZVJlYyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsCisgICAqICAgICBzY2FsaW5nIHZhbHVlLCByZXNwZWN0aXZlbHkuCisgICAqCisgICAqICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTCA6OgorICAgKiAgICAgVGhlIGBtYXhfYWR2YW5jZV93aWR0aGAgZmllbGQgb2YgQEZUX0ZhY2VSZWMgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgICogICAgIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgdmFsdWU7IHRoZSB2ZXJ0aWNhbCBzY2FsaW5nIHZhbHVlIGlzCisgICAqICAgICBkZXRlcm1pbmVkIHRoZSBzYW1lIHdheSBhcyBARlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gZG9lcy4KKyAgICogICAgIEZpbmFsbHksIGJvdGggc2NhbGluZyB2YWx1ZXMgYXJlIHNldCB0byB0aGUgc21hbGxlciBvbmUuICBUaGlzIHR5cGUKKyAgICogICAgIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBmb250IHNpemUgZm9yLCBzYXksIGEgd2luZG93IG9mCisgICAqICAgICBhIGdpdmVuIGRpbWVuc2lvbiBhbmQgODB4MjQgY2VsbHMuCisgICAqCisgICAqICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfU0NBTEVTIDo6CisgICAqICAgICBTcGVjaWZ5IHRoZSBzY2FsaW5nIHZhbHVlcyBkaXJlY3RseS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIGFib3ZlIGRlc2NyaXB0aW9ucyBvbmx5IGFwcGx5IHRvIHNjYWxhYmxlIGZvcm1hdHMuICBGb3IgYml0bWFwCisgICAqICAgZm9ybWF0cywgdGhlIGJlaGF2aW91ciBpcyB1cCB0byB0aGUgZHJpdmVyLgorICAgKgorICAgKiAgIFNlZSB0aGUgbm90ZSBzZWN0aW9uIG9mIEBGVF9TaXplX01ldHJpY3MgaWYgeW91IHdvbmRlciBob3cgc2l6ZQorICAgKiAgIHJlcXVlc3RpbmcgcmVsYXRlcyB0byBzY2FsaW5nIHZhbHVlcy4KKyAgICovCiAgIHR5cGVkZWYgZW51bSAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGVfCiAgIHsKICAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMLApAQCAtMjU3OSw0MiArMjU2MCw0NSBAQAogICB9IEZUX1NpemVfUmVxdWVzdF9UeXBlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgICAgICAgICAgOjogU2VlIEBGVF9TaXplX1JlcXVlc3RfVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgICAgICAgICA6OiBUaGUgZGVzaXJlZCB3aWR0aCwgZ2l2ZW4gYXMgYSAyNi42IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgcG9pbnQgdmFsdWUgKHdpdGggNzJwdCA9IDFpbikuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICAgICAgICA6OiBUaGUgZGVzaXJlZCBoZWlnaHQsIGdpdmVuIGFzIGEgMjYuNiBmcmFjdGlvbmFsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgcG9pbnQgdmFsdWUgKHdpdGggNzJwdCA9IDFpbikuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpUmVzb2x1dGlvbiA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIChkcGksIGkuZS4sIHBpeGVscyBwZXIgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgaW5jaCkuICBJZiBzZXQgdG8gemVybywgYHdpZHRoJyBpcyB0cmVhdGVkIGFzIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIDI2LjYgZnJhY3Rpb25hbCAqcGl4ZWwqIHZhbHVlLCB3aGljaCBnZXRzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5IHJvdW5kZWQgdG8gYW4gaW50ZWdlci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRSZXNvbHV0aW9uIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIChkcGksIGkuZS4sIHBpeGVscyBwZXIgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBpbmNoKS4gIElmIHNldCB0byB6ZXJvLCBgaGVpZ2h0JyBpcyB0cmVhdGVkIGFzIGEgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgMjYuNiBmcmFjdGlvbmFsICpwaXhlbCogdmFsdWUsIHdoaWNoIGdldHMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsbHkgcm91bmRlZCB0byBhbiBpbnRlZ2VyLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB3aWR0aCcgaXMgemVybywgdGhlIGhvcml6b250YWwgc2NhbGluZyB2YWx1ZSBpcyBzZXQgZXF1YWwgICAgICAqLwotICAvKiAgICB0byB0aGUgdmVydGljYWwgc2NhbGluZyB2YWx1ZSwgYW5kIHZpY2UgdmVyc2EuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB0eXBlJyBpcyBGVF9TSVpFX1JFUVVFU1RfVFlQRV9TQ0FMRVMsIGB3aWR0aCcgYW5kIGBoZWlnaHQnIGFyZSAqLwotICAvKiAgICBpbnRlcnByZXRlZCBkaXJlY3RseSBhcyAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWVzLCB3aXRob3V0ICAgKi8KLSAgLyogICAgYW55IGZ1cnRoZXIgbW9kaWZpY2F0aW9uLCBhbmQgYm90aCBgaG9yaVJlc29sdXRpb24nIGFuZCAgICAgICAgICAgICovCi0gIC8qICAgIGB2ZXJ0UmVzb2x1dGlvbicgYXJlIGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfU2l6ZV9SZXF1ZXN0UmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIHNpemUgcmVxdWVzdC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB0eXBlIDo6CisgICAqICAgICBTZWUgQEZUX1NpemVfUmVxdWVzdF9UeXBlLgorICAgKgorICAgKiAgIHdpZHRoIDo6CisgICAqICAgICBUaGUgZGVzaXJlZCB3aWR0aCwgZ2l2ZW4gYXMgYSAyNi42IGZyYWN0aW9uYWwgcG9pbnQgdmFsdWUgKHdpdGggNzJwdAorICAgKiAgICAgPSAxaW4pLgorICAgKgorICAgKiAgIGhlaWdodCA6OgorICAgKiAgICAgVGhlIGRlc2lyZWQgaGVpZ2h0LCBnaXZlbiBhcyBhIDI2LjYgZnJhY3Rpb25hbCBwb2ludCB2YWx1ZSAod2l0aAorICAgKiAgICAgNzJwdCA9IDFpbikuCisgICAqCisgICAqICAgaG9yaVJlc29sdXRpb24gOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gKGRwaSwgaS5lLiwgcGl4ZWxzIHBlciBpbmNoKS4gIElmIHNldCB0bworICAgKiAgICAgemVybywgYHdpZHRoYCBpcyB0cmVhdGVkIGFzIGEgMjYuNiBmcmFjdGlvbmFsICoqcGl4ZWwqKiB2YWx1ZSwgd2hpY2gKKyAgICogICAgIGdldHMgaW50ZXJuYWxseSByb3VuZGVkIHRvIGFuIGludGVnZXIuCisgICAqCisgICAqICAgdmVydFJlc29sdXRpb24gOjoKKyAgICogICAgIFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIChkcGksIGkuZS4sIHBpeGVscyBwZXIgaW5jaCkuICBJZiBzZXQgdG8KKyAgICogICAgIHplcm8sIGBoZWlnaHRgIGlzIHRyZWF0ZWQgYXMgYSAyNi42IGZyYWN0aW9uYWwgKipwaXhlbCoqIHZhbHVlLAorICAgKiAgICAgd2hpY2ggZ2V0cyBpbnRlcm5hbGx5IHJvdW5kZWQgdG8gYW4gaW50ZWdlci4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSWYgYHdpZHRoYCBpcyB6ZXJvLCB0aGUgaG9yaXpvbnRhbCBzY2FsaW5nIHZhbHVlIGlzIHNldCBlcXVhbCB0byB0aGUKKyAgICogICB2ZXJ0aWNhbCBzY2FsaW5nIHZhbHVlLCBhbmQgdmljZSB2ZXJzYS4KKyAgICoKKyAgICogICBJZiBgdHlwZWAgaXMgYEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFU2AsIGB3aWR0aGAgYW5kIGBoZWlnaHRgIGFyZQorICAgKiAgIGludGVycHJldGVkIGRpcmVjdGx5IGFzIDE2LjE2IGZyYWN0aW9uYWwgc2NhbGluZyB2YWx1ZXMsIHdpdGhvdXQgYW55CisgICAqICAgZnVydGhlciBtb2RpZmljYXRpb24sIGFuZCBib3RoIGBob3JpUmVzb2x1dGlvbmAgYW5kIGB2ZXJ0UmVzb2x1dGlvbmAKKyAgICogICBhcmUgaWdub3JlZC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX1JlcXVlc3RSZWNfCiAgIHsKICAgICBGVF9TaXplX1JlcXVlc3RfVHlwZSAgdHlwZTsKQEAgLTI2MjYsOTYgKzI2MTAsMTAyIEBACiAgIH0gRlRfU2l6ZV9SZXF1ZXN0UmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzaXplIHJlcXVlc3Qgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TaXplX1JlcXVlc3QKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgc2l6ZSByZXF1ZXN0IHN0cnVjdHVyZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX1NpemVfUmVxdWVzdFJlY18gICpGVF9TaXplX1JlcXVlc3Q7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZXF1ZXN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXNpemUgdGhlIHNjYWxlIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUgb2JqZWN0IGluIGEgZmFjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXEgIDo6IEEgcG9pbnRlciB0byBhIEBGVF9TaXplX1JlcXVlc3RSZWMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHRob3VnaCBkcml2ZXJzIG1heSBzZWxlY3QgdGhlIGJpdG1hcCBzdHJpa2UgbWF0Y2hpbmcgdGhlICAgICAgICAgKi8KLSAgLyogICAgcmVxdWVzdCwgeW91IHNob3VsZCBub3QgcmVseSBvbiB0aGlzIGlmIHlvdSBpbnRlbmQgdG8gc2VsZWN0IGEgICAgICovCi0gIC8qICAgIHBhcnRpY3VsYXIgYml0bWFwIHN0cmlrZS4gIFVzZSBARlRfU2VsZWN0X1NpemUgaW5zdGVhZCBpbiB0aGF0ICAgICAqLwotICAvKiAgICBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQgc2l6ZSBhbmQgdGhlIHJlc3VsdGluZyBnbHlwaCAgICAqLwotICAvKiAgICBzaXplIGlzIGRlcGVuZGVudCBlbnRpcmVseSBvbiBob3cgdGhlIHNpemUgaXMgZGVmaW5lZCBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgc291cmNlIGZhY2UuICBUaGUgZm9udCBkZXNpZ25lciBjaG9vc2VzIHRoZSBmaW5hbCBzaXplIG9mIGVhY2ggICAgICovCi0gIC8qICAgIGdseXBoIHJlbGF0aXZlIHRvIHRoaXMgc2l6ZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvICAgICAgICAqLwotICAvKiAgICBgaHR0cHM6Ly93d3cuZnJlZXR5cGUub3JnL2ZyZWV0eXBlMi9kb2NzL2dseXBocy9nbHlwaHMtMi5odG1sJy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnRyYXJ5IHRvIEBGVF9TZXRfQ2hhcl9TaXplLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSBzcGVjaWFsICAqLwotICAvKiAgICBjb2RlIHRvIG5vcm1hbGl6ZSB6ZXJvLXZhbHVlZCB3aWR0aHMsIGhlaWdodHMsIG9yIHJlc29sdXRpb25zICAgICAgKi8KLSAgLyogICAgKHdoaWNoIGxlYWQgdG8gZXJyb3JzIGluIG1vc3QgY2FzZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfUmVxdWVzdF9TaXplCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXNpemUgdGhlIHNjYWxlIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUgb2JqZWN0IGluIGEgZmFjZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgcmVxIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYSBARlRfU2l6ZV9SZXF1ZXN0UmVjLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEFsdGhvdWdoIGRyaXZlcnMgbWF5IHNlbGVjdCB0aGUgYml0bWFwIHN0cmlrZSBtYXRjaGluZyB0aGUgcmVxdWVzdCwKKyAgICogICB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgaWYgeW91IGludGVuZCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyCisgICAqICAgYml0bWFwIHN0cmlrZS4gIFVzZSBARlRfU2VsZWN0X1NpemUgaW5zdGVhZCBpbiB0aGF0IGNhc2UuCisgICAqCisgICAqICAgVGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIHJlcXVlc3RlZCBzaXplIGFuZCB0aGUgcmVzdWx0aW5nIGdseXBoIHNpemUKKyAgICogICBpcyBkZXBlbmRlbnQgZW50aXJlbHkgb24gaG93IHRoZSBzaXplIGlzIGRlZmluZWQgaW4gdGhlIHNvdXJjZSBmYWNlLgorICAgKiAgIFRoZSBmb250IGRlc2lnbmVyIGNob29zZXMgdGhlIGZpbmFsIHNpemUgb2YgZWFjaCBnbHlwaCByZWxhdGl2ZSB0bworICAgKiAgIHRoaXMgc2l6ZS4gIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZmVyIHRvCisgICAqICAgJ2h0dHBzOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9nbHlwaHMvZ2x5cGhzLTIuaHRtbCcuCisgICAqCisgICAqICAgQ29udHJhcnkgdG8gQEZUX1NldF9DaGFyX1NpemUsIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBoYXZlIHNwZWNpYWwgY29kZQorICAgKiAgIHRvIG5vcm1hbGl6ZSB6ZXJvLXZhbHVlZCB3aWR0aHMsIGhlaWdodHMsIG9yIHJlc29sdXRpb25zICh3aGljaCBsZWFkCisgICAqICAgdG8gZXJyb3JzIGluIG1vc3QgY2FzZXMpLgorICAgKgorICAgKiAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9SZXF1ZXN0X1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2FsbCBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAoaW4gcG9pbnRzKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl93aWR0aCAgICAgIDo6IFRoZSBub21pbmFsIHdpZHRoLCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2hlaWdodCAgICAgOjogVGhlIG5vbWluYWwgaGVpZ2h0LCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcnpfcmVzb2x1dGlvbiA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydF9yZXNvbHV0aW9uIDo6IFRoZSB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hpbGUgdGhpcyBmdW5jdGlvbiBhbGxvd3MgZnJhY3Rpb25hbCBwb2ludHMgYXMgaW5wdXQgdmFsdWVzLCB0aGUgICovCi0gIC8qICAgIHJlc3VsdGluZyBwcGVtIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcmVzb2x1dGlvbiBpcyBhbHdheXMgcm91bmRlZCB0byAqLwotICAvKiAgICB0aGUgbmVhcmVzdCBpbnRlZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGVpdGhlciB0aGUgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvLCBpdCBpcyBzZXQgZXF1YWwgICAqLwotICAvKiAgICB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGVpdGhlciB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCByZXNvbHV0aW9uIGlzIHplcm8sIGl0IGlzIHNldCAqLwotICAvKiAgICBlcXVhbCB0byB0aGUgb3RoZXIgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBzbWFsbGVyIHRoYW4gMXB0IGlzIHNldCB0byAxcHQ7IGlmICAgICAqLwotICAvKiAgICBib3RoIHJlc29sdXRpb24gdmFsdWVzIGFyZSB6ZXJvLCB0aGV5IGFyZSBzZXQgdG8gNzJkcGkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TZXRfQ2hhcl9TaXplCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDYWxsIEBGVF9SZXF1ZXN0X1NpemUgdG8gcmVxdWVzdCB0aGUgbm9taW5hbCBzaXplIChpbiBwb2ludHMpLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBjaGFyX3dpZHRoIDo6CisgICAqICAgICBUaGUgbm9taW5hbCB3aWR0aCwgaW4gMjYuNiBmcmFjdGlvbmFsIHBvaW50cy4KKyAgICoKKyAgICogICBjaGFyX2hlaWdodCA6OgorICAgKiAgICAgVGhlIG5vbWluYWwgaGVpZ2h0LCBpbiAyNi42IGZyYWN0aW9uYWwgcG9pbnRzLgorICAgKgorICAgKiAgIGhvcnpfcmVzb2x1dGlvbiA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgcmVzb2x1dGlvbiBpbiBkcGkuCisgICAqCisgICAqICAgdmVydF9yZXNvbHV0aW9uIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgV2hpbGUgdGhpcyBmdW5jdGlvbiBhbGxvd3MgZnJhY3Rpb25hbCBwb2ludHMgYXMgaW5wdXQgdmFsdWVzLCB0aGUKKyAgICogICByZXN1bHRpbmcgcHBlbSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHJlc29sdXRpb24gaXMgYWx3YXlzIHJvdW5kZWQgdG8gdGhlCisgICAqICAgbmVhcmVzdCBpbnRlZ2VyLgorICAgKgorICAgKiAgIElmIGVpdGhlciB0aGUgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBpcyB6ZXJvLCBpdCBpcyBzZXQgZXF1YWwgdG8KKyAgICogICB0aGUgb3RoZXIgdmFsdWUuCisgICAqCisgICAqICAgSWYgZWl0aGVyIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHJlc29sdXRpb24gaXMgemVybywgaXQgaXMgc2V0CisgICAqICAgZXF1YWwgdG8gdGhlIG90aGVyIHZhbHVlLgorICAgKgorICAgKiAgIEEgY2hhcmFjdGVyIHdpZHRoIG9yIGhlaWdodCBzbWFsbGVyIHRoYW4gMXB0IGlzIHNldCB0byAxcHQ7IGlmIGJvdGgKKyAgICogICByZXNvbHV0aW9uIHZhbHVlcyBhcmUgemVybywgdGhleSBhcmUgc2V0IHRvIDcyZHBpLgorICAgKgorICAgKiAgIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHlvdSBhcmUgdXNpbmcgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TZXRfQ2hhcl9TaXplKCBGVF9GYWNlICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX3dpZHRoLApAQCAtMjcyNCwxMzQgKzI3MTQsMTM4IEBACiAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1BpeGVsX1NpemVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2FsbCBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAoaW4gcGl4ZWxzKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl4ZWxfd2lkdGggIDo6IFRoZSBub21pbmFsIHdpZHRoLCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbF9oZWlnaHQgOjogVGhlIG5vbWluYWwgaGVpZ2h0LCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoZSByZXN1bHRpbmcgZ2x5cGhzIG1hdGNoaW5nIG9yIGJlaW5nICAgICAgKi8KLSAgLyogICAgY29uc3RyYWluZWQgdG8gdGhpcyBwaXhlbCBzaXplLiAgUmVmZXIgdG8gQEZUX1JlcXVlc3RfU2l6ZSB0byAgICAgICovCi0gIC8qICAgIHVuZGVyc3RhbmQgaG93IHJlcXVlc3RlZCBzaXplcyByZWxhdGUgdG8gYWN0dWFsIHNpemVzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IGFyZSB1c2luZyB0aGUgRnJlZVR5cGUgY2FjaGUgQVBJLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9QaXhlbF9TaXplcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ2FsbCBARlRfUmVxdWVzdF9TaXplIHRvIHJlcXVlc3QgdGhlIG5vbWluYWwgc2l6ZSAoaW4gcGl4ZWxzKS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBwaXhlbF93aWR0aCA6OgorICAgKiAgICAgVGhlIG5vbWluYWwgd2lkdGgsIGluIHBpeGVscy4KKyAgICoKKyAgICogICBwaXhlbF9oZWlnaHQgOjoKKyAgICogICAgIFRoZSBub21pbmFsIGhlaWdodCwgaW4gcGl4ZWxzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFlvdSBzaG91bGQgbm90IHJlbHkgb24gdGhlIHJlc3VsdGluZyBnbHlwaHMgbWF0Y2hpbmcgb3IgYmVpbmcKKyAgICogICBjb25zdHJhaW5lZCB0byB0aGlzIHBpeGVsIHNpemUuICBSZWZlciB0byBARlRfUmVxdWVzdF9TaXplIHRvCisgICAqICAgdW5kZXJzdGFuZCBob3cgcmVxdWVzdGVkIHNpemVzIHJlbGF0ZSB0byBhY3R1YWwgc2l6ZXMuCisgICAqCisgICAqICAgRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IGFyZSB1c2luZyB0aGUgRnJlZVR5cGUgY2FjaGUgQVBJLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1NldF9QaXhlbF9TaXplcyggRlRfRmFjZSAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwaXhlbF9oZWlnaHQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBnbHlwaCBpbnRvIHRoZSBnbHlwaCBzbG90IG9mIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBpcyBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICBGb3IgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQ0lELWtleWVkIGZvbnRzIChlaXRoZXIgaW4gUFMgb3IgaW4gQ0ZGIGZvcm1hdCkgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBDSUQgdmFsdWUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsb2FkZWQgZ2x5cGggbWF5IGJlIHRyYW5zZm9ybWVkLiAgU2VlIEBGVF9TZXRfVHJhbnNmb3JtIGZvciAgICAqLwotICAvKiAgICB0aGUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBzdWJzZXR0ZWQgQ0lELWtleWVkIGZvbnRzLCBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGlzICAgICAgICAqLwotICAvKiAgICByZXR1cm5lZCBmb3IgaW52YWxpZCBDSUQgdmFsdWVzICh0aGlzIGlzLCBmb3IgQ0lEIHZhbHVlcyB0aGF0ICAgICAgKi8KLSAgLyogICAgZG9uJ3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW4gdGhlIGZvbnQpLiAgU2VlIHRoZSBkaXNjdXNzaW9uICovCi0gIC8qICAgIG9mIHRoZSBARlRfRkFDRV9GTEFHX0NJRF9LRVlFRCBmbGFnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IHJlY2VpdmUgYEZUX0Vycl9HbHlwaF9Ub29fQmlnJywgdHJ5IGdldHRpbmcgdGhlIGdseXBoICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgYXQgRU0gc2l6ZSwgdGhlbiBzY2FsZSBpdCBtYW51YWxseSBhbmQgZmlsbCBpdCBhcyBhICAgICAgICAqLwotICAvKiAgICBncmFwaGljcyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTG9hZF9HbHlwaAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgTG9hZCBhIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3Qgd2hlcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGdseXBoX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICBGb3IgQ0lELWtleWVkIGZvbnRzCisgICAqICAgICAoZWl0aGVyIGluIFBTIG9yIGluIENGRiBmb3JtYXQpIHRoaXMgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBDSUQKKyAgICogICAgIHZhbHVlLgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSBARlRfTE9BRF9YWFgKKyAgICogICAgIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sCisgICAqICAgICB3aGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yCisgICAqICAgICBub3QsIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgbG9hZGVkIGdseXBoIG1heSBiZSB0cmFuc2Zvcm1lZC4gIFNlZSBARlRfU2V0X1RyYW5zZm9ybSBmb3IgdGhlCisgICAqICAgZGV0YWlscy4KKyAgICoKKyAgICogICBGb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cywgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50YCBpcyByZXR1cm5lZAorICAgKiAgIGZvciBpbnZhbGlkIENJRCB2YWx1ZXMgKHRoaXMgaXMsIGZvciBDSUQgdmFsdWVzIHRoYXQgZG9uJ3QgaGF2ZSBhCisgICAqICAgY29ycmVzcG9uZGluZyBnbHlwaCBpbiB0aGUgZm9udCkuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhlCisgICAqICAgQEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgZmxhZyBmb3IgbW9yZSBkZXRhaWxzLgorICAgKgorICAgKiAgIElmIHlvdSByZWNlaXZlIGBGVF9FcnJfR2x5cGhfVG9vX0JpZ2AsIHRyeSBnZXR0aW5nIHRoZSBnbHlwaCBvdXRsaW5lCisgICAqICAgYXQgRU0gc2l6ZSwgdGhlbiBzY2FsZSBpdCBtYW51YWxseSBhbmQgZmlsbCBpdCBhcyBhIGdyYXBoaWNzCisgICAqICAgb3BlcmF0aW9uLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0xvYWRfR2x5cGgoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCiAgICAgICAgICAgICAgICAgIEZUX0ludDMyICBsb2FkX2ZsYWdzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGEgZ2x5cGggaW50byB0aGUgZ2x5cGggc2xvdCBvZiBhIGZhY2Ugb2JqZWN0LCBhY2Nlc3NlZCBieSBpdHMgKi8KLSAgLyogICAgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3Qgd2hlcmUgdGhlIGdseXBoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGlzIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfY29kZSAgIDo6IFRoZSBnbHlwaCdzIGNoYXJhY3RlciBjb2RlLCBhY2NvcmRpbmcgdG8gdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjdXJyZW50IGNoYXJtYXAgdXNlZCBpbiB0aGUgZmFjZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBARlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBARlRfR2V0X0NoYXJfSW5kZXggYW5kIEBGVF9Mb2FkX0dseXBoLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hbnkgZm9udHMgY29udGFpbiBnbHlwaHMgdGhhdCBjYW4ndCBiZSBsb2FkZWQgYnkgdGhpcyBmdW5jdGlvbiAgICAqLwotICAvKiAgICBzaW5jZSBpdHMgZ2x5cGggaW5kaWNlcyBhcmUgbm90IGxpc3RlZCBpbiBhbnkgb2YgdGhlIGZvbnQncyAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBubyBhY3RpdmUgY21hcCBpcyBzZXQgdXAgKGkuZS4sIGBmYWNlLT5jaGFybWFwJyBpcyB6ZXJvKSwgdGhlICAgKi8KLSAgLyogICAgY2FsbCB0byBARlRfR2V0X0NoYXJfSW5kZXggaXMgb21pdHRlZCwgYW5kIHRoZSBmdW5jdGlvbiBiZWhhdmVzICAgICovCi0gIC8qICAgIGlkZW50aWNhbGx5IHRvIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9Mb2FkX0NoYXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIExvYWQgYSBnbHlwaCBpbnRvIHRoZSBnbHlwaCBzbG90IG9mIGEgZmFjZSBvYmplY3QsIGFjY2Vzc2VkIGJ5IGl0cworICAgKiAgIGNoYXJhY3RlciBjb2RlLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3Qgd2hlcmUgdGhlIGdseXBoIGlzIGxvYWRlZC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGNoYXJfY29kZSA6OgorICAgKiAgICAgVGhlIGdseXBoJ3MgY2hhcmFjdGVyIGNvZGUsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBjaGFybWFwIHVzZWQgaW4KKyAgICogICAgIHRoZSBmYWNlLgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSBARlRfTE9BRF9YWFgKKyAgICogICAgIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sCisgICAqICAgICB3aGV0aGVyIHRoZSBvdXRsaW5lIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yCisgICAqICAgICBub3QsIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIHNpbXBseSBjYWxscyBARlRfR2V0X0NoYXJfSW5kZXggYW5kIEBGVF9Mb2FkX0dseXBoLgorICAgKgorICAgKiAgIE1hbnkgZm9udHMgY29udGFpbiBnbHlwaHMgdGhhdCBjYW4ndCBiZSBsb2FkZWQgYnkgdGhpcyBmdW5jdGlvbiBzaW5jZQorICAgKiAgIGl0cyBnbHlwaCBpbmRpY2VzIGFyZSBub3QgbGlzdGVkIGluIGFueSBvZiB0aGUgZm9udCdzIGNoYXJtYXBzLgorICAgKgorICAgKiAgIElmIG5vIGFjdGl2ZSBjbWFwIGlzIHNldCB1cCAoaS5lLiwgYGZhY2UtPmNoYXJtYXBgIGlzIHplcm8pLCB0aGUgY2FsbAorICAgKiAgIHRvIEBGVF9HZXRfQ2hhcl9JbmRleCBpcyBvbWl0dGVkLCBhbmQgdGhlIGZ1bmN0aW9uIGJlaGF2ZXMgaWRlbnRpY2FsbHkKKyAgICogICB0byBARlRfTG9hZF9HbHlwaC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9Mb2FkX0NoYXIoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyX2NvZGUsCiAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGxvYWRfZmxhZ3MgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZW51bToKICAgICogICBGVF9MT0FEX1hYWAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGJpdCBmaWVsZCBjb25zdGFudHMgZm9yIEBGVF9Mb2FkX0dseXBoIHRvIGluZGljYXRlIHdoYXQKLSAgICogICBraW5kIG9mIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBkdXJpbmcgZ2x5cGggbG9hZGluZy4KKyAgICogICBBIGxpc3Qgb2YgYml0IGZpZWxkIGNvbnN0YW50cyBmb3IgQEZUX0xvYWRfR2x5cGggdG8gaW5kaWNhdGUgd2hhdCBraW5kCisgICAqICAgb2Ygb3BlcmF0aW9ucyB0byBwZXJmb3JtIGR1cmluZyBnbHlwaCBsb2FkaW5nLgogICAgKgogICAgKiBAdmFsdWVzOgogICAgKiAgIEZUX0xPQURfREVGQVVMVCA6OgpAQCAtMjg1OSwxNSArMjg1MywxNCBAQAogICAgKiAgICAgb3BlcmF0aW9uLiAgSW4gdGhpcyBjYXNlLCB0aGUgZm9sbG93aW5nIGhhcHBlbnM6CiAgICAqCiAgICAqICAgICAxLiBGcmVlVHlwZSBsb29rcyBmb3IgYSBiaXRtYXAgZm9yIHRoZSBnbHlwaCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgKiAgICAgICAgZmFjZSdzIGN1cnJlbnQgc2l6ZS4gIElmIG9uZSBpcyBmb3VuZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMuCi0gICAqICAgICAgICBUaGUgYml0bWFwIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGZyb20gdGhlIGdseXBoIHNsb3QgKHNlZSBub3RlCi0gICAqICAgICAgICBiZWxvdykuCisgICAqICAgICBmYWNlJ3MgY3VycmVudCBzaXplLiAgSWYgb25lIGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucy4gIFRoZQorICAgKiAgICAgYml0bWFwIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIGZyb20gdGhlIGdseXBoIHNsb3QgKHNlZSBub3RlIGJlbG93KS4KICAgICoKICAgICogICAgIDIuIElmIG5vIGVtYmVkZGVkIGJpdG1hcCBpcyBzZWFyY2hlZCBmb3Igb3IgZm91bmQsIEZyZWVUeXBlIGxvb2tzCi0gICAqICAgICAgICBmb3IgYSBzY2FsYWJsZSBvdXRsaW5lLiAgSWYgb25lIGlzIGZvdW5kLCBpdCBpcyBsb2FkZWQgZnJvbQotICAgKiAgICAgICAgdGhlIGZvbnQgZmlsZSwgc2NhbGVkIHRvIGRldmljZSBwaXhlbHMsIHRoZW4gYGhpbnRlZCcgdG8gdGhlCi0gICAqICAgICAgICBwaXhlbCBncmlkIGluIG9yZGVyIHRvIG9wdGltaXplIGl0LiAgVGhlIG91dGxpbmUgZGF0YSBjYW4gYmUKLSAgICogICAgICAgIGFjY2Vzc2VkIGZyb20gdGhlIGdseXBoIHNsb3QgKHNlZSBub3RlIGJlbG93KS4KKyAgICogICAgIGZvciBhIHNjYWxhYmxlIG91dGxpbmUuICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIGxvYWRlZCBmcm9tIHRoZSBmb250CisgICAqICAgICBmaWxlLCBzY2FsZWQgdG8gZGV2aWNlIHBpeGVscywgdGhlbiAnaGludGVkJyB0byB0aGUgcGl4ZWwgZ3JpZCBpbgorICAgKiAgICAgb3JkZXIgdG8gb3B0aW1pemUgaXQuICBUaGUgb3V0bGluZSBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZQorICAgKiAgICAgZ2x5cGggc2xvdCAoc2VlIG5vdGUgYmVsb3cpLgogICAgKgogICAgKiAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIGdseXBoIGxvYWRlciBkb2Vzbid0IHJlbmRlciBvdXRsaW5lcyBpbnRvCiAgICAqICAgICBiaXRtYXBzLiAgVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCB0byBtb2RpZnkgdGhpcyBkZWZhdWx0CkBAIC0yODc5LDE0ICsyODcyLDE0IEBACiAgICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19ISU5USU5HIGFuZCBARlRfTE9BRF9OT19CSVRNQVAsIGFuZAogICAgKiAgICAgdW5zZXRzIEBGVF9MT0FEX1JFTkRFUi4KICAgICoKLSAgICogICAgIElmIHRoZSBmb250IGlzIGB0cmlja3knIChzZWUgQEZUX0ZBQ0VfRkxBR19UUklDS1kgZm9yIG1vcmUpLCB1c2luZwotICAgKiAgICAgRlRfTE9BRF9OT19TQ0FMRSB1c3VhbGx5IHlpZWxkcyBtZWFuaW5nbGVzcyBvdXRsaW5lcyBiZWNhdXNlIHRoZQotICAgKiAgICAgc3ViZ2x5cGhzIG11c3QgYmUgc2NhbGVkIGFuZCBwb3NpdGlvbmVkIHdpdGggaGludGluZyBpbnN0cnVjdGlvbnMuCi0gICAqICAgICBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgbG9hZGluZyB0aGUgZm9udCB3aXRob3V0IEZUX0xPQURfTk9fU0NBTEUgYW5kCi0gICAqICAgICBzZXR0aW5nIHRoZSBjaGFyYWN0ZXIgc2l6ZSB0byBgZm9udC0+dW5pdHNfcGVyX0VNJy4KKyAgICogICAgIElmIHRoZSBmb250IGlzICd0cmlja3knIChzZWUgQEZUX0ZBQ0VfRkxBR19UUklDS1kgZm9yIG1vcmUpLCB1c2luZworICAgKiAgICAgYEZUX0xPQURfTk9fU0NBTEVgIHVzdWFsbHkgeWllbGRzIG1lYW5pbmdsZXNzIG91dGxpbmVzIGJlY2F1c2UgdGhlCisgICAqICAgICBzdWJnbHlwaHMgbXVzdCBiZSBzY2FsZWQgYW5kIHBvc2l0aW9uZWQgd2l0aCBoaW50aW5nIGluc3RydWN0aW9ucy4gCisgICAqICAgICBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgbG9hZGluZyB0aGUgZm9udCB3aXRob3V0IGBGVF9MT0FEX05PX1NDQUxFYAorICAgKiAgICAgYW5kIHNldHRpbmcgdGhlIGNoYXJhY3RlciBzaXplIHRvIGBmb250LT51bml0c19wZXJfRU1gLgogICAgKgogICAgKiAgIEZUX0xPQURfTk9fSElOVElORyA6OgotICAgKiAgICAgRGlzYWJsZSBoaW50aW5nLiAgVGhpcyBnZW5lcmFsbHkgZ2VuZXJhdGVzIGBibHVycmllcicgYml0bWFwIGdseXBocworICAgKiAgICAgRGlzYWJsZSBoaW50aW5nLiAgVGhpcyBnZW5lcmFsbHkgZ2VuZXJhdGVzICdibHVycmllcicgYml0bWFwIGdseXBocwogICAgKiAgICAgd2hlbiB0aGUgZ2x5cGggYXJlIHJlbmRlcmVkIGluIGFueSBvZiB0aGUgYW50aS1hbGlhc2VkIG1vZGVzLiAgU2VlCiAgICAqICAgICBhbHNvIHRoZSBub3RlIGJlbG93LgogICAgKgpAQCAtMjkwNywzNCArMjkwMCwzNyBAQAogICAgKgogICAgKiAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIDo6CiAgICAqICAgICBMb2FkIHRoZSBnbHlwaCBmb3IgdmVydGljYWwgdGV4dCBsYXlvdXQuICBJbiBwYXJ0aWN1bGFyLCB0aGUKLSAgICogICAgIGBhZHZhbmNlJyB2YWx1ZSBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgaXMgc2V0IHRvIHRoZQotICAgKiAgICAgYHZlcnRBZHZhbmNlJyB2YWx1ZSBvZiB0aGUgYG1ldHJpY3MnIGZpZWxkLgorICAgKiAgICAgYGFkdmFuY2VgIHZhbHVlIGluIHRoZSBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSBpcyBzZXQgdG8gdGhlCisgICAqICAgICBgdmVydEFkdmFuY2VgIHZhbHVlIG9mIHRoZSBgbWV0cmljc2AgZmllbGQuCiAgICAqCi0gICAqICAgICBJbiBjYXNlIEBGVF9IQVNfVkVSVElDQUwgZG9lc24ndCByZXR1cm4gdHJ1ZSwgeW91IHNob3VsZG4ndCB1c2UKLSAgICogICAgIHRoaXMgZmxhZyBjdXJyZW50bHkuICBSZWFzb24gaXMgdGhhdCBpbiB0aGlzIGNhc2UgdmVydGljYWwgbWV0cmljcwotICAgKiAgICAgZ2V0IHN5bnRoZXNpemVkLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBub3QgYWx3YXlzIGNvbnNpc3RlbnQgYWNyb3NzCisgICAqICAgICBJbiBjYXNlIEBGVF9IQVNfVkVSVElDQUwgZG9lc24ndCByZXR1cm4gdHJ1ZSwgeW91IHNob3VsZG4ndCB1c2UgdGhpcworICAgKiAgICAgZmxhZyBjdXJyZW50bHkuICBSZWFzb24gaXMgdGhhdCBpbiB0aGlzIGNhc2UgdmVydGljYWwgbWV0cmljcyBnZXQKKyAgICogICAgIHN5bnRoZXNpemVkLCBhbmQgdGhvc2UgdmFsdWVzIGFyZSBub3QgYWx3YXlzIGNvbnNpc3RlbnQgYWNyb3NzCiAgICAqICAgICB2YXJpb3VzIGZvbnQgZm9ybWF0cy4KICAgICoKICAgICogICBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UIDo6Ci0gICAqICAgICBQcmVmZXIgdGhlIGF1dG8taGludGVyIG92ZXIgdGhlIGZvbnQncyBuYXRpdmUgaGludGVyLiAgU2VlIGFsc28KLSAgICogICAgIHRoZSBub3RlIGJlbG93LgorICAgKiAgICAgUHJlZmVyIHRoZSBhdXRvLWhpbnRlciBvdmVyIHRoZSBmb250J3MgbmF0aXZlIGhpbnRlci4gIFNlZSBhbHNvIHRoZQorICAgKiAgICAgbm90ZSBiZWxvdy4KICAgICoKICAgICogICBGVF9MT0FEX1BFREFOVElDIDo6CiAgICAqICAgICBNYWtlIHRoZSBmb250IGRyaXZlciBwZXJmb3JtIHBlZGFudGljIHZlcmlmaWNhdGlvbnMgZHVyaW5nIGdseXBoCi0gICAqICAgICBsb2FkaW5nLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBkZXRlY3QgYnJva2VuIGdseXBocyBpbiBmb250cy4KLSAgICogICAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHRyaWVzIHRvIGhhbmRsZSBicm9rZW4gZm9udHMgYWxzby4KKyAgICogICAgIGxvYWRpbmcgYW5kIGhpbnRpbmcuICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIGRldGVjdCBicm9rZW4gZ2x5cGhzIGluCisgICAqICAgICBmb250cy4gIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIHRyaWVzIHRvIGhhbmRsZSBicm9rZW4gZm9udHMgYWxzby4KICAgICoKICAgICogICAgIEluIHBhcnRpY3VsYXIsIGVycm9ycyBmcm9tIHRoZSBUcnVlVHlwZSBieXRlY29kZSBlbmdpbmUgYXJlIG5vdAotICAgKiAgICAgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBpZiB0aGlzIGZsYWcgaXMgbm90IHNldDsgdGhpcyBtaWdodAotICAgKiAgICAgcmVzdWx0IGluIHBhcnRpYWxseSBoaW50ZWQgb3IgZGlzdG9ydGVkIGdseXBocyBpbiBjYXNlIGEgZ2x5cGgncwotICAgKiAgICAgYnl0ZWNvZGUgaXMgYnVnZ3kuCisgICAqICAgICBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGlmIHRoaXMgZmxhZyBpcyBub3Qgc2V0OyB0aGlzIG1pZ2h0IHJlc3VsdAorICAgKiAgICAgaW4gcGFydGlhbGx5IGhpbnRlZCBvciBkaXN0b3J0ZWQgZ2x5cGhzIGluIGNhc2UgYSBnbHlwaCdzIGJ5dGVjb2RlCisgICAqICAgICBpcyBidWdneS4KICAgICoKICAgICogICBGVF9MT0FEX05PX1JFQ1VSU0UgOjoKLSAgICogICAgIERvbid0IGxvYWQgY29tcG9zaXRlIGdseXBocyByZWN1cnNpdmVseS4gIEluc3RlYWQsIHRoZSBmb250Ci0gICAqICAgICBkcml2ZXIgc2hvdWxkIHNldCB0aGUgYG51bV9zdWJnbHlwaCcgYW5kIGBzdWJnbHlwaHMnIHZhbHVlcyBvZgotICAgKiAgICAgdGhlIGdseXBoIHNsb3QgYWNjb3JkaW5nbHksIGFuZCBzZXQgYGdseXBoLT5mb3JtYXQnIHRvCi0gICAqICAgICBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURS4gIFRoZSBkZXNjcmlwdGlvbiBvZiBzdWJnbHlwaHMgY2FuCi0gICAqICAgICB0aGVuIGJlIGFjY2Vzc2VkIHdpdGggQEZUX0dldF9TdWJHbHlwaF9JbmZvLgorICAgKiAgICAgRG9uJ3QgbG9hZCBjb21wb3NpdGUgZ2x5cGhzIHJlY3Vyc2l2ZWx5LiAgSW5zdGVhZCwgdGhlIGZvbnQgZHJpdmVyCisgICAqICAgICBmaWxscyB0aGUgYG51bV9zdWJnbHlwaGAgYW5kIGBzdWJnbHlwaHNgIHZhbHVlcyBvZiB0aGUgZ2x5cGggc2xvdDsKKyAgICogICAgIGl0IGFsc28gc2V0cyBgZ2x5cGgtPmZvcm1hdGAgdG8gQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUuICBUaGUKKyAgICogICAgIGRlc2NyaXB0aW9uIG9mIHN1YmdseXBocyBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB3aXRoCisgICAqICAgICBARlRfR2V0X1N1YkdseXBoX0luZm8uCisgICAqCisgICAqICAgICBEb24ndCB1c2UgdGhpcyBmbGFnIGZvciByZXRyaWV2aW5nIG1ldHJpY3MgaW5mb3JtYXRpb24gc2luY2Ugc29tZQorICAgKiAgICAgZm9udCBkcml2ZXJzIG9ubHkgcmV0dXJuIHJ1ZGltZW50YXJ5IGRhdGEuCiAgICAqCiAgICAqICAgICBUaGlzIGZsYWcgaW1wbGllcyBARlRfTE9BRF9OT19TQ0FMRSBhbmQgQEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STS4KICAgICoKQEAgLTI5NTEsMjMgKzI5NDcsMzUgQEAKICAgICogICAgIG1vbm9jaHJvbWUtb3B0aW1pemVkIGhpbnRpbmcgYWxnb3JpdGhtIGlzIHVzZWQuCiAgICAqCiAgICAqICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOIDo6Ci0gICAqICAgICBLZWVwICBgbGluZWFySG9yaUFkdmFuY2UnIGFuZCBgbGluZWFyVmVydEFkdmFuY2UnIGZpZWxkcyBvZgotICAgKiAgICAgQEZUX0dseXBoU2xvdFJlYyBpbiBmb250IHVuaXRzLiAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yCi0gICAqICAgICBkZXRhaWxzLgorICAgKiAgICAgS2VlcCBgbGluZWFySG9yaUFkdmFuY2VgIGFuZCBgbGluZWFyVmVydEFkdmFuY2VgIGZpZWxkcyBvZgorICAgKiAgICAgQEZUX0dseXBoU2xvdFJlYyBpbiBmb250IHVuaXRzLiAgU2VlIEBGVF9HbHlwaFNsb3RSZWMgZm9yIGRldGFpbHMuCiAgICAqCiAgICAqICAgRlRfTE9BRF9OT19BVVRPSElOVCA6OgogICAgKiAgICAgRGlzYWJsZSB0aGUgYXV0by1oaW50ZXIuICBTZWUgYWxzbyB0aGUgbm90ZSBiZWxvdy4KICAgICoKICAgICogICBGVF9MT0FEX0NPTE9SIDo6CisgICAqICAgICBMb2FkIGNvbG9yZWQgZ2x5cGhzLiAgVGhlcmUgYXJlIHNsaWdodCBkaWZmZXJlbmNlcyBkZXBlbmRpbmcgb24gdGhlCisgICAqICAgICBmb250IGZvcm1hdC4KKyAgICoKICAgICogICAgIFtTaW5jZSAyLjVdIExvYWQgZW1iZWRkZWQgY29sb3IgYml0bWFwIGltYWdlcy4gIFRoZSByZXN1bHRpbmcgY29sb3IKLSAgICogICAgIGJpdG1hcHMsIGlmIGF2YWlsYWJsZSwgd2lsbCBoYXZlIHRoZSBARlRfUElYRUxfTU9ERV9CR1JBIGZvcm1hdC4KLSAgICogICAgIElmIHRoZSBmbGFnIGlzIG5vdCBzZXQgYW5kIGNvbG9yIGJpdG1hcHMgYXJlIGZvdW5kLCB0aGV5IGFyZQotICAgKiAgICAgY29udmVydGVkIHRvIDI1Ni1sZXZlbCBncmF5IGJpdG1hcHMgdHJhbnNwYXJlbnRseSwgdXNpbmcgdGhlCi0gICAqICAgICBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdC4KKyAgICogICAgIGJpdG1hcHMsIGlmIGF2YWlsYWJsZSwgd2lsbCBoYXZlIHRoZSBARlRfUElYRUxfTU9ERV9CR1JBIGZvcm1hdCwKKyAgICogICAgIHdpdGggcHJlLW11bHRpcGxpZWQgY29sb3IgY2hhbm5lbHMuICBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0IGFuZAorICAgKiAgICAgY29sb3IgYml0bWFwcyBhcmUgZm91bmQsIHRoZXkgYXJlIGNvbnZlcnRlZCB0byAyNTYtbGV2ZWwgZ3JheQorICAgKiAgICAgYml0bWFwcywgdXNpbmcgdGhlIEBGVF9QSVhFTF9NT0RFX0dSQVkgZm9ybWF0LgorICAgKgorICAgKiAgICAgW1NpbmNlIDIuMTAsIGV4cGVyaW1lbnRhbF0gSWYgdGhlIGdseXBoIGluZGV4IGNvbnRhaW5zIGFuIGVudHJ5IGluCisgICAqICAgICB0aGUgZmFjZSdzICdDT0xSJyB0YWJsZSB3aXRoIGEgJ0NQQUwnIHBhbGV0dGUgdGFibGUgKGFzIGRlZmluZWQgaW4KKyAgICogICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uKSwgbWFrZSBARlRfUmVuZGVyX0dseXBoIHByb3ZpZGUgYSBkZWZhdWx0CisgICAqICAgICBibGVuZGluZyBvZiB0aGUgY29sb3IgZ2x5cGggbGF5ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2x5cGggaW5kZXgsCisgICAqICAgICB1c2luZyB0aGUgc2FtZSBiaXRtYXAgZm9ybWF0IGFzIGVtYmVkZGVkIGNvbG9yIGJpdG1hcCBpbWFnZXMuICBUaGlzCisgICAqICAgICBpcyBtYWlubHkgZm9yIGNvbnZlbmllbmNlOyBmb3IgZnVsbCBjb250cm9sIG9mIGNvbG9yIGxheWVycyB1c2UKKyAgICogICAgIEBGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIgYW5kIEZyZWVUeXBlJ3MgY29sb3IgZnVuY3Rpb25zIGxpa2UKKyAgICogICAgIEBGVF9QYWxldHRlX1NlbGVjdCBpbnN0ZWFkIG9mIHNldHRpbmcgQEZUX0xPQURfQ09MT1IgZm9yIHJlbmRlcmluZworICAgKiAgICAgc28gdGhhdCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIGNhbiBoYW5kbGUgYmxlbmRpbmcgYnkgaXRzZWxmLgogICAgKgogICAgKiAgIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTIDo6Ci0gICAqICAgICBbU2luY2UgMi42LjFdIENvbXB1dGUgZ2x5cGggbWV0cmljcyBmcm9tIHRoZSBnbHlwaCBkYXRhLCB3aXRob3V0Ci0gICAqICAgICB0aGUgdXNlIG9mIGJ1bmRsZWQgbWV0cmljcyB0YWJsZXMgKGZvciBleGFtcGxlLCB0aGUgYGhkbXgnIHRhYmxlIGluCisgICAqICAgICBbU2luY2UgMi42LjFdIENvbXB1dGUgZ2x5cGggbWV0cmljcyBmcm9tIHRoZSBnbHlwaCBkYXRhLCB3aXRob3V0IHRoZQorICAgKiAgICAgdXNlIG9mIGJ1bmRsZWQgbWV0cmljcyB0YWJsZXMgKGZvciBleGFtcGxlLCB0aGUgJ2hkbXgnIHRhYmxlIGluCiAgICAqICAgICBUcnVlVHlwZSBmb250cykuICBUaGlzIGZsYWcgaXMgbWFpbmx5IHVzZWQgYnkgZm9udCB2YWxpZGF0aW5nIG9yCiAgICAqICAgICBmb250IGVkaXRpbmcgYXBwbGljYXRpb25zLCB3aGljaCBuZWVkIHRvIGlnbm9yZSwgdmVyaWZ5LCBvciBlZGl0CiAgICAqICAgICB0aG9zZSB0YWJsZXMuCkBAIC0yOTc2LDkgKzI5ODQsOSBAQAogICAgKgogICAgKiAgIEZUX0xPQURfQklUTUFQX01FVFJJQ1NfT05MWSA6OgogICAgKiAgICAgW1NpbmNlIDIuNy4xXSBSZXF1ZXN0IGxvYWRpbmcgb2YgdGhlIG1ldHJpY3MgYW5kIGJpdG1hcCBpbWFnZQotICAgKiAgICAgaW5mb3JtYXRpb24gb2YgYSAocG9zc2libHkgZW1iZWRkZWQpIGJpdG1hcCBnbHlwaCB3aXRob3V0Ci0gICAqICAgICBhbGxvY2F0aW5nIG9yIGNvcHlpbmcgdGhlIGJpdG1hcCBpbWFnZSBkYXRhIGl0c2VsZi4gIE5vIGVmZmVjdCBpZgotICAgKiAgICAgdGhlIHRhcmdldCBnbHlwaCBpcyBub3QgYSBiaXRtYXAgaW1hZ2UuCisgICAqICAgICBpbmZvcm1hdGlvbiBvZiBhIChwb3NzaWJseSBlbWJlZGRlZCkgYml0bWFwIGdseXBoIHdpdGhvdXQgYWxsb2NhdGluZworICAgKiAgICAgb3IgY29weWluZyB0aGUgYml0bWFwIGltYWdlIGRhdGEgaXRzZWxmLiAgTm8gZWZmZWN0IGlmIHRoZSB0YXJnZXQKKyAgICogICAgIGdseXBoIGlzIG5vdCBhIGJpdG1hcCBpbWFnZS4KICAgICoKICAgICogICAgIFRoaXMgZmxhZyB1bnNldHMgQEZUX0xPQURfUkVOREVSLgogICAgKgpAQCAtMjk5Myw4ICszMDAxLDggQEAKICAgICogICBARlRfRkFDRV9GTEFHX0hJTlRFUikgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGF1dG8taGludGVyLiAgWW91IGNhbgogICAgKiAgIGRpc2FibGUgaGludGluZyBieSBzZXR0aW5nIEBGVF9MT0FEX05PX0hJTlRJTkcgb3IgY2hhbmdlIHRoZQogICAgKiAgIHByZWNlZGVuY2UgYnkgc2V0dGluZyBARlRfTE9BRF9GT1JDRV9BVVRPSElOVC4gIFlvdSBjYW4gYWxzbyBzZXQKLSAgICogICBARlRfTE9BRF9OT19BVVRPSElOVCBpbiBjYXNlIHlvdSBkb24ndCB3YW50IHRoZSBhdXRvLWhpbnRlciB0byBiZQotICAgKiAgIHVzZWQgYXQgYWxsLgorICAgKiAgIEBGVF9MT0FEX05PX0FVVE9ISU5UIGluIGNhc2UgeW91IGRvbid0IHdhbnQgdGhlIGF1dG8taGludGVyIHRvIGJlIHVzZWQKKyAgICogICBhdCBhbGwuCiAgICAqCiAgICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgYSBzcGVjaWFsIGV4Y2VwdGlvbgogICAgKiAgIChhZmZlY3Rpbmcgb25seSBhIGhhbmRmdWwgb2YgQXNpYW4gZm9udHMpLgpAQCAtMzAwNSw3ICszMDEzLDcgQEAKICAgICogICBOb3RlIHRoYXQgdGhlIGF1dG8taGludGVyIG5lZWRzIGEgdmFsaWQgVW5pY29kZSBjbWFwIChlaXRoZXIgYSBuYXRpdmUKICAgICogICBvbmUgb3Igc3ludGhlc2l6ZWQgYnkgRnJlZVR5cGUpIGZvciBwcm9kdWNpbmcgY29ycmVjdCByZXN1bHRzLiAgSWYgYQogICAgKiAgIGZvbnQgcHJvdmlkZXMgYW4gaW5jb3JyZWN0IG1hcHBpbmcgKGZvciBleGFtcGxlLCBhc3NpZ25pbmcgdGhlCi0gICAqICAgY2hhcmFjdGVyIGNvZGUgVSswMDVBLCBMQVRJTiBDQVBJVEFMIExFVFRFUiBaLCB0byBhIGdseXBoIGRlcGljdGluZyBhCisgICAqICAgY2hhcmFjdGVyIGNvZGUgVSswMDVBLCBMQVRJTiBDQVBJVEFMIExFVFRFUn5aLCB0byBhIGdseXBoIGRlcGljdGluZyBhCiAgICAqICAgbWF0aGVtYXRpY2FsIGludGVncmFsIHNpZ24pLCB0aGUgYXV0by1oaW50ZXIgbWlnaHQgcHJvZHVjZSB1c2VsZXNzCiAgICAqICAgcmVzdWx0cy4KICAgICoKQEAgLTMwMjUsNyArMzAzMyw3IEBACiAjZGVmaW5lIEZUX0xPQURfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDEyICkKICNkZWZpbmUgRlRfTE9BRF9MSU5FQVJfREVTSUdOICAgICAgICAgICAgICAgICggMUwgPDwgMTMgKQogI2RlZmluZSBGVF9MT0FEX05PX0FVVE9ISU5UICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxNSApCi0gIC8qIEJpdHMgMTYtMTkgYXJlIHVzZWQgYnkgYEZUX0xPQURfVEFSR0VUXycgKi8KKyAgLyogQml0cyAxNi0xOSBhcmUgdXNlZCBieSBgRlRfTE9BRF9UQVJHRVRfYCAqLwogI2RlZmluZSBGVF9MT0FEX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAyMCApCiAjZGVmaW5lIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTICAgICAgICAgICAgICAoIDFMIDw8IDIxICkKICNkZWZpbmUgRlRfTE9BRF9CSVRNQVBfTUVUUklDU19PTkxZICAgICAgICAgICggMUwgPDwgMjIgKQpAQCAtMzA0NCwxOSArMzA1MiwxNyBAQAogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0byBzZWxlY3QgYSBzcGVjaWZpYyBoaW50aW5nIGFsZ29yaXRobSBmb3IgdGhlCi0gICAqICAgaGludGVyLiAgWW91IHNob3VsZCBPUiBvbmUgb2YgdGhlc2UgdmFsdWVzIHRvIHlvdXIgYGxvYWRfZmxhZ3MnCi0gICAqICAgd2hlbiBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLgorICAgKiAgIGhpbnRlci4gIFlvdSBzaG91bGQgT1Igb25lIG9mIHRoZXNlIHZhbHVlcyB0byB5b3VyIGBsb2FkX2ZsYWdzYCB3aGVuCisgICAqICAgY2FsbGluZyBARlRfTG9hZF9HbHlwaC4KICAgICoKLSAgICogICBOb3RlIHRoYXQgYSBmb250J3MgbmF0aXZlIGhpbnRlcnMgbWF5IGlnbm9yZSB0aGUgaGludGluZyBhbGdvcml0aG0KLSAgICogICB5b3UgaGF2ZSBzcGVjaWZpZWQgKGUuZy4sIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlcikuICBZb3UKLSAgICogICBjYW4gc2V0IEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UIHRvIGVuc3VyZSB0aGF0IHRoZSBhdXRvLWhpbnRlciBpcwotICAgKiAgIHVzZWQuCisgICAqICAgTm90ZSB0aGF0IGEgZm9udCdzIG5hdGl2ZSBoaW50ZXJzIG1heSBpZ25vcmUgdGhlIGhpbnRpbmcgYWxnb3JpdGhtIHlvdQorICAgKiAgIGhhdmUgc3BlY2lmaWVkIChlLmcuLCB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIpLiAgWW91IGNhbiBzZXQKKyAgICogICBARlRfTE9BRF9GT1JDRV9BVVRPSElOVCB0byBlbnN1cmUgdGhhdCB0aGUgYXV0by1oaW50ZXIgaXMgdXNlZC4KICAgICoKICAgICogQHZhbHVlczoKICAgICogICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgOjoKICAgICogICAgIFRoZSBkZWZhdWx0IGhpbnRpbmcgYWxnb3JpdGhtLCBvcHRpbWl6ZWQgZm9yIHN0YW5kYXJkIGdyYXktbGV2ZWwKLSAgICogICAgIHJlbmRlcmluZy4gIEZvciBtb25vY2hyb21lIG91dHB1dCwgdXNlIEBGVF9MT0FEX1RBUkdFVF9NT05PCi0gICAqICAgICBpbnN0ZWFkLgorICAgKiAgICAgcmVuZGVyaW5nLiAgRm9yIG1vbm9jaHJvbWUgb3V0cHV0LCB1c2UgQEZUX0xPQURfVEFSR0VUX01PTk8gaW5zdGVhZC4KICAgICoKICAgICogICBGVF9MT0FEX1RBUkdFVF9MSUdIVCA6OgogICAgKiAgICAgQSBsaWdodGVyIGhpbnRpbmcgYWxnb3JpdGhtIGZvciBncmF5LWxldmVsIG1vZGVzLiAgTWFueSBnZW5lcmF0ZWQKQEAgLTMwNjksMTMgKzMwNzUsMTMgQEAKICAgICogICAgIGF1dG8taGludGVyLgogICAgKgogICAgKiAgICAgQWR2YW5jZSB3aWR0aHMgYXJlIHJvdW5kZWQgdG8gaW50ZWdlciB2YWx1ZXM7IGhvd2V2ZXIsIHVzaW5nIHRoZQotICAgKiAgICAgYGxzYl9kZWx0YScgYW5kIGByc2JfZGVsdGEnIGZpZWxkcyBvZiBARlRfR2x5cGhTbG90UmVjLCBpdCBpcworICAgKiAgICAgYGxzYl9kZWx0YWAgYW5kIGByc2JfZGVsdGFgIGZpZWxkcyBvZiBARlRfR2x5cGhTbG90UmVjLCBpdCBpcwogICAgKiAgICAgcG9zc2libGUgdG8gZ2V0IGZyYWN0aW9uYWwgYWR2YW5jZSB3aWR0aHMgZm9yIHN1YnBpeGVsIHBvc2l0aW9uaW5nCiAgICAqICAgICAod2hpY2ggaXMgcmVjb21tZW5kZWQgdG8gdXNlKS4KICAgICoKLSAgICogICAgIElmIGNvbmZpZ3VyYXRpb24gb3B0aW9uIEFGX0NPTkZJR19PUFRJT05fVFRfU0laRV9NRVRSSUNTIGlzIGFjdGl2ZSwKLSAgICogICAgIFRydWVUeXBlLWxpa2UgbWV0cmljcyBhcmUgdXNlZCB0byBtYWtlIHRoaXMgbW9kZSBiZWhhdmUgc2ltaWxhcmx5Ci0gICAqICAgICBhcyBpbiB1bnBhdGNoZWQgRnJlZVR5cGUgdmVyc2lvbnMgYmV0d2VlbiAyLjQuNiBhbmQgMi43LjEKKyAgICogICAgIElmIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGBBRl9DT05GSUdfT1BUSU9OX1RUX1NJWkVfTUVUUklDU2AgaXMKKyAgICogICAgIGFjdGl2ZSwgVHJ1ZVR5cGUtbGlrZSBtZXRyaWNzIGFyZSB1c2VkIHRvIG1ha2UgdGhpcyBtb2RlIGJlaGF2ZQorICAgKiAgICAgc2ltaWxhcmx5IGFzIGluIHVucGF0Y2hlZCBGcmVlVHlwZSB2ZXJzaW9ucyBiZXR3ZWVuIDIuNC42IGFuZCAyLjcuMQogICAgKiAgICAgKGluY2x1c2l2ZSkuCiAgICAqCiAgICAqICAgRlRfTE9BRF9UQVJHRVRfTU9OTyA6OgpAQCAtMzA4Myw2ICszMDg5LDEyIEBACiAgICAqICAgICBvdXRwdXQuICBUaGUgcmVzdWx0IGlzIHByb2JhYmx5IHVucGxlYXNhbnQgaWYgdGhlIGdseXBoIGlzIHJlbmRlcmVkCiAgICAqICAgICBpbiBub24tbW9ub2Nocm9tZSBtb2Rlcy4KICAgICoKKyAgICogICAgIE5vdGUgdGhhdCBmb3Igb3V0bGluZSBmb250cyBvbmx5IHRoZSBUcnVlVHlwZSBmb250IGRyaXZlciBoYXMgcHJvcGVyCisgICAqICAgICBtb25vY2hyb21lIGhpbnRpbmcgc3VwcG9ydCwgcHJvdmlkZWQgdGhlIFRURnMgY29udGFpbiBoaW50cyBmb3IgQi9XCisgICAqICAgICByZW5kZXJpbmcgKHdoaWNoIG1vc3QgZm9udHMgbm8gbG9uZ2VyIHByb3ZpZGUpLiAgSWYgdGhlc2UgY29uZGl0aW9ucworICAgKiAgICAgYXJlIG5vdCBtZXQgaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCB5b3UgZ2V0IHVnbHkgcmVzdWx0cyBhdCBzbWFsbGVyCisgICAqICAgICBzaXplcy4KKyAgICoKICAgICogICBGVF9MT0FEX1RBUkdFVF9MQ0QgOjoKICAgICogICAgIEEgdmFyaWFudCBvZiBARlRfTE9BRF9UQVJHRVRfTElHSFQgb3B0aW1pemVkIGZvciBob3Jpem9udGFsbHkKICAgICogICAgIGRlY2ltYXRlZCBMQ0QgZGlzcGxheXMuCkBAIC0zMDkyLDI1ICszMTA0LDI1IEBACiAgICAqICAgICBkZWNpbWF0ZWQgTENEIGRpc3BsYXlzLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIHVzZSBvbmx5IF9vbmVfIG9mIHRoZSBGVF9MT0FEX1RBUkdFVF9YWFggdmFsdWVzIGluIHlvdXIKLSAgICogICBgbG9hZF9mbGFncycuICBUaGV5IGNhbid0IGJlIE9SZWQuCisgICAqICAgWW91IHNob3VsZCB1c2Ugb25seSBfb25lXyBvZiB0aGUgYEZUX0xPQURfVEFSR0VUX1hYWGAgdmFsdWVzIGluIHlvdXIKKyAgICogICBgbG9hZF9mbGFnc2AuICBUaGV5IGNhbid0IGJlIE9SZWQuCiAgICAqCiAgICAqICAgSWYgQEZUX0xPQURfUkVOREVSIGlzIGFsc28gc2V0LCB0aGUgZ2x5cGggaXMgcmVuZGVyZWQgaW4gdGhlCiAgICAqICAgY29ycmVzcG9uZGluZyBtb2RlIChpLmUuLCB0aGUgbW9kZSB0aGF0IG1hdGNoZXMgdGhlIHVzZWQgYWxnb3JpdGhtCi0gICAqICAgYmVzdCkuICBBbiBleGNlcHRpb24gaXMgRlRfTE9BRF9UQVJHRVRfTU9OTyBzaW5jZSBpdCBpbXBsaWVzCisgICAqICAgYmVzdCkuICBBbiBleGNlcHRpb24gaXMgYEZUX0xPQURfVEFSR0VUX01PTk9gIHNpbmNlIGl0IGltcGxpZXMKICAgICogICBARlRfTE9BRF9NT05PQ0hST01FLgogICAgKgogICAgKiAgIFlvdSBjYW4gdXNlIGEgaGludGluZyBhbGdvcml0aG0gdGhhdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUKLSAgICogICByZW5kZXJpbmcgbW9kZS4gIEFzIGFuIGV4YW1wbGUsIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgYGxpZ2h0JworICAgKiAgIHJlbmRlcmluZyBtb2RlLiAgQXMgYW4gZXhhbXBsZSwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSAnbGlnaHQnCiAgICAqICAgaGludGluZyBhbGdvcml0aG0gYW5kIGhhdmUgdGhlIHJlc3VsdHMgcmVuZGVyZWQgaW4gaG9yaXpvbnRhbCBMQ0QKICAgICogICBwaXhlbCBtb2RlLCB3aXRoIGNvZGUgbGlrZQogICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICogICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncyB8IEZUX0xPQURfVEFSR0VUX0xJR0hUICk7CisgICAqICAgYGBgCisgICAqICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwKKyAgICogICAgICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgfCBGVF9MT0FEX1RBUkdFVF9MSUdIVCApOwogICAgKgotICAgKiAgICAgICBGVF9SZW5kZXJfR2x5cGgoIGZhY2UtPmdseXBoLCBGVF9SRU5ERVJfTU9ERV9MQ0QgKTsKLSAgICogICAgIH0KKyAgICogICAgIEZUX1JlbmRlcl9HbHlwaCggZmFjZS0+Z2x5cGgsIEZUX1JFTkRFUl9NT0RFX0xDRCApOworICAgKiAgIGBgYAogICAgKgogICAgKiAgIEluIGdlbmVyYWwsIHlvdSBzaG91bGQgc3RpY2sgd2l0aCBvbmUgcmVuZGVyaW5nIG1vZGUuICBGb3IgZXhhbXBsZSwKICAgICogICBzd2l0Y2hpbmcgYmV0d2VlbiBARlRfTE9BRF9UQVJHRVRfTk9STUFMIGFuZCBARlRfTE9BRF9UQVJHRVRfTU9OTwpAQCAtMzE0Miw5OCArMzE1NCw5NiBAQAogI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9NT0RFKCB4ICkgICggKEZUX1JlbmRlcl9Nb2RlKSggKCAoeCkgPj4gMTYgKSAmIDE1ICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gZ2x5cGggaW1hZ2VzIHdoZW4gdGhleSAgICovCi0gIC8qICAgIGFyZSBsb2FkZWQgaW50byBhIGdseXBoIHNsb3QgdGhyb3VnaCBARlRfTG9hZF9HbHlwaC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uJ3MgMngyIG1hdHJpeC4gIFVzZSBOVUxMICAqLwotICAvKiAgICAgICAgICAgICAgZm9yIHRoZSBpZGVudGl0eSBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNsYXRpb24gdmVjdG9yLiAgVXNlIE5VTEwgZm9yIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICBudWxsIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvbmx5IGFwcGxpZWQgdG8gc2NhbGFibGUgaW1hZ2UgZm9ybWF0cyBhZnRlciAqLwotICAvKiAgICB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkLiAgSXQgbWVhbnMgdGhhdCBoaW50aW5nIGlzIHVuYWx0ZXJlZCBieSAgKi8KLSAgLyogICAgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCBpcyBwZXJmb3JtZWQgb24gdGhlIGNoYXJhY3RlciBzaXplIGdpdmVuIGluICovCi0gIC8qICAgIHRoZSBsYXN0IGNhbGwgdG8gQEZUX1NldF9DaGFyX1NpemUgb3IgQEZUX1NldF9QaXhlbF9TaXplcy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgYWxzbyB0cmFuc2Zvcm1zIHRoZSBgZmFjZS5nbHlwaC5hZHZhbmNlJyBmaWVsZCwgYnV0ICovCi0gIC8qICAgICpub3QqIHRoZSB2YWx1ZXMgaW4gYGZhY2UuZ2x5cGgubWV0cmljcycuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TZXRfVHJhbnNmb3JtCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZXQgdGhlIHRyYW5zZm9ybWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBnbHlwaCBpbWFnZXMgd2hlbiB0aGV5IGFyZQorICAgKiAgIGxvYWRlZCBpbnRvIGEgZ2x5cGggc2xvdCB0aHJvdWdoIEBGVF9Mb2FkX0dseXBoLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hdHJpeCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbidzIDJ4MiBtYXRyaXguICBVc2UgYE5VTExgIGZvciB0aGUKKyAgICogICAgIGlkZW50aXR5IG1hdHJpeC4KKyAgICogICBkZWx0YSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3IuICBVc2UgYE5VTExgIGZvciB0aGUgbnVsbCB2ZWN0b3IuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYXMgYSBjb252ZW5pZW5jZSwgYnV0IGtlZXAgaW4gbWluZCB0aGF0CisgICAqICAgQEZUX01hdHJpeCBjb2VmZmljaWVudHMgYXJlIG9ubHkgMTYuMTYgZml4ZWQgcG9pbnQgdmFsdWVzLCB3aGljaCBjYW4KKyAgICogICBsaW1pdCB0aGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdHMuICBVc2luZyBmbG9hdGluZy1wb2ludCBjb21wdXRhdGlvbnMKKyAgICogICB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm0gZGlyZWN0bHkgaW4gY2xpZW50IGNvZGUgaW5zdGVhZCB3aWxsIGFsd2F5cworICAgKiAgIHlpZWxkIGJldHRlciBudW1iZXJzLgorICAgKgorICAgKiAgIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvbmx5IGFwcGxpZWQgdG8gc2NhbGFibGUgaW1hZ2UgZm9ybWF0cyBhZnRlciB0aGUKKyAgICogICBnbHlwaCBoYXMgYmVlbiBsb2FkZWQuICBJdCBtZWFucyB0aGF0IGhpbnRpbmcgaXMgdW5hbHRlcmVkIGJ5IHRoZQorICAgKiAgIHRyYW5zZm9ybWF0aW9uIGFuZCBpcyBwZXJmb3JtZWQgb24gdGhlIGNoYXJhY3RlciBzaXplIGdpdmVuIGluIHRoZQorICAgKiAgIGxhc3QgY2FsbCB0byBARlRfU2V0X0NoYXJfU2l6ZSBvciBARlRfU2V0X1BpeGVsX1NpemVzLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGlzIGFsc28gdHJhbnNmb3JtcyB0aGUgYGZhY2UuZ2x5cGguYWR2YW5jZWAgZmllbGQsIGJ1dAorICAgKiAgICoqbm90KiogdGhlIHZhbHVlcyBpbiBgZmFjZS5nbHlwaC5tZXRyaWNzYC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX1NldF9UcmFuc2Zvcm0oIEZUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogIG1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBtb2RlcyBzdXBwb3J0ZWQgYnkgRnJlZVR5cGV+Mi4gIEVhY2ggbW9kZSBjb3JyZXNwb25kcyB0byBhICAqLwotICAvKiAgICBzcGVjaWZpYyB0eXBlIG9mIHNjYW5saW5lIGNvbnZlcnNpb24gcGVyZm9ybWVkIG9uIHRoZSBvdXRsaW5lLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBiaXRtYXAgZm9udHMgYW5kIGVtYmVkZGVkIGJpdG1hcHMgdGhlIGBiaXRtYXAtPnBpeGVsX21vZGUnICAgICAqLwotICAvKiAgICBmaWVsZCBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGZvcm1hdCBvZiB0aGUgICAgKi8KLSAgLyogICAgcmV0dXJuZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgbW9kZXMgZXhjZXB0IEBGVF9SRU5ERVJfTU9ERV9NT05PIHVzZSAyNTYgbGV2ZWxzIG9mIG9wYWNpdHksICAgKi8KLSAgLyogICAgaW5kaWNhdGluZyBwaXhlbCBjb3ZlcmFnZS4gIFVzZSBsaW5lYXIgYWxwaGEgYmxlbmRpbmcgYW5kIGdhbW1hICAgICovCi0gIC8qICAgIGNvcnJlY3Rpb24gdG8gY29ycmVjdGx5IHJlbmRlciBub24tbW9ub2Nocm9tZSBnbHlwaCBiaXRtYXBzIG9udG8gYSAqLwotICAvKiAgICBzdXJmYWNlOyBzZWUgQEZUX1JlbmRlcl9HbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEZWZhdWx0IHJlbmRlciBtb2RlOyBpdCBjb3JyZXNwb25kcyB0byA4LWJpdCBhbnRpLWFsaWFzZWQgICAgICAgICovCi0gIC8qICAgICAgYml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTElHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwuICBJdCBpcyBvbmx5ICAgICAgICAqLwotICAvKiAgICAgIGRlZmluZWQgYXMgYSBzZXBhcmF0ZSB2YWx1ZSBiZWNhdXNlIHJlbmRlciBtb2RlcyBhcmUgYWxzbyB1c2VkICAgKi8KLSAgLyogICAgICBpbmRpcmVjdGx5IHRvIGRlZmluZSBoaW50aW5nIGFsZ29yaXRobSBzZWxlY3RvcnMuICBTZWUgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfVEFSR0VUX1hYWCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIDEtYml0IGJpdG1hcHMgKHdpdGggMn5sZXZlbHMgb2YgICAgICAgICAqLwotICAvKiAgICAgIG9wYWNpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byBob3Jpem9udGFsIFJHQiBhbmQgQkdSIHN1YnBpeGVsICAgICAgICAgKi8KLSAgLyogICAgICBkaXNwbGF5cyBsaWtlIExDRCBzY3JlZW5zLiAgSXQgcHJvZHVjZXMgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAgICovCi0gIC8qICAgICAgM350aW1lcyB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzLCBhbmQgICAqLwotICAvKiAgICAgIHdoaWNoIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB2ZXJ0aWNhbCBSR0IgYW5kIEJHUiBzdWJwaXhlbCBkaXNwbGF5cyAgKi8KLSAgLyogICAgICAobGlrZSBQREEgc2NyZWVucywgcm90YXRlZCBMQ0QgZGlzcGxheXMsIGV0Yy4pLiAgSXQgcHJvZHVjZXMgICAgICovCi0gIC8qICAgICAgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAzfnRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsICAgICAgICAqLwotICAvKiAgICAgIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzIGFuZCB1c2UgdGhlIEBGVF9QSVhFTF9NT0RFX0xDRF9WIG1vZGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaG91bGQgeW91IGRlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpbiB5b3VyICAgICAgKi8KLSAgLyogICAgYGZ0b3B0aW9uLmgnLCB3aGljaCBlbmFibGVzIHBhdGVudGVkIENsZWFyVHlwZS1zdHlsZSByZW5kZXJpbmcsICAgICovCi0gIC8qICAgIHRoZSBMQ0Qtb3B0aW1pemVkIGdseXBoIGJpdG1hcHMgc2hvdWxkIGJlIGZpbHRlcmVkIHRvIHJlZHVjZSBjb2xvciAqLwotICAvKiAgICBmcmluZ2VzIGluaGVyZW50IHRvIHRoaXMgdGVjaG5vbG9neS4gIFlvdSBjYW4gZWl0aGVyIHNldCB1cCBMQ0QgICAgKi8KLSAgLyogICAgZmlsdGVyaW5nIHdpdGggQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyIG9yIEBGVF9GYWNlX1Byb3BlcnRpZXMsICAgICovCi0gIC8qICAgIG9yIGRvIHRoZSBmaWx0ZXJpbmcgeW91cnNlbGYuICBUaGUgZGVmYXVsdCBGcmVlVHlwZSBMQ0QgcmVuZGVyaW5nICAqLwotICAvKiAgICB0ZWNobm9sb2d5IGRvZXMgbm90IHJlcXVpcmUgZmlsdGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzZWxlY3RlZCByZW5kZXIgbW9kZSBvbmx5IGFmZmVjdHMgdmVjdG9yIGdseXBocyBvZiBhIGZvbnQuICAgICAqLwotICAvKiAgICBFbWJlZGRlZCBiaXRtYXBzIG9mdGVuIGhhdmUgYSBkaWZmZXJlbnQgcGl4ZWwgbW9kZSBsaWtlICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1BJWEVMX01PREVfTU9OTy4gIFlvdSBjYW4gdXNlIEBGVF9CaXRtYXBfQ29udmVydCB0byB0cmFuc2Zvcm0gICovCi0gIC8qICAgIHRoZW0gaW50byA4LWJpdCBwaXhtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1JlbmRlcl9Nb2RlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZW5kZXIgbW9kZXMgc3VwcG9ydGVkIGJ5IEZyZWVUeXBlfjIuICBFYWNoIG1vZGUgY29ycmVzcG9uZHMgdG8gYQorICAgKiAgIHNwZWNpZmljIHR5cGUgb2Ygc2NhbmxpbmUgY29udmVyc2lvbiBwZXJmb3JtZWQgb24gdGhlIG91dGxpbmUuCisgICAqCisgICAqICAgRm9yIGJpdG1hcCBmb250cyBhbmQgZW1iZWRkZWQgYml0bWFwcyB0aGUgYGJpdG1hcC0+cGl4ZWxfbW9kZWAgZmllbGQKKyAgICogICBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQKKyAgICogICBiaXRtYXAuCisgICAqCisgICAqICAgQWxsIG1vZGVzIGV4Y2VwdCBARlRfUkVOREVSX01PREVfTU9OTyB1c2UgMjU2IGxldmVscyBvZiBvcGFjaXR5LAorICAgKiAgIGluZGljYXRpbmcgcGl4ZWwgY292ZXJhZ2UuICBVc2UgbGluZWFyIGFscGhhIGJsZW5kaW5nIGFuZCBnYW1tYQorICAgKiAgIGNvcnJlY3Rpb24gdG8gY29ycmVjdGx5IHJlbmRlciBub24tbW9ub2Nocm9tZSBnbHlwaCBiaXRtYXBzIG9udG8gYQorICAgKiAgIHN1cmZhY2U7IHNlZSBARlRfUmVuZGVyX0dseXBoLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCA6OgorICAgKiAgICAgRGVmYXVsdCByZW5kZXIgbW9kZTsgaXQgY29ycmVzcG9uZHMgdG8gOC1iaXQgYW50aS1hbGlhc2VkIGJpdG1hcHMuCisgICAqCisgICAqICAgRlRfUkVOREVSX01PREVfTElHSFQgOjoKKyAgICogICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBARlRfUkVOREVSX01PREVfTk9STUFMLiAgSXQgaXMgb25seSBkZWZpbmVkIGFzCisgICAqICAgICBhIHNlcGFyYXRlIHZhbHVlIGJlY2F1c2UgcmVuZGVyIG1vZGVzIGFyZSBhbHNvIHVzZWQgaW5kaXJlY3RseSB0bworICAgKiAgICAgZGVmaW5lIGhpbnRpbmcgYWxnb3JpdGhtIHNlbGVjdG9ycy4gIFNlZSBARlRfTE9BRF9UQVJHRVRfWFhYIGZvcgorICAgKiAgICAgZGV0YWlscy4KKyAgICoKKyAgICogICBGVF9SRU5ERVJfTU9ERV9NT05PIDo6CisgICAqICAgICBUaGlzIG1vZGUgY29ycmVzcG9uZHMgdG8gMS1iaXQgYml0bWFwcyAod2l0aCAyfmxldmVscyBvZiBvcGFjaXR5KS4KKyAgICoKKyAgICogICBGVF9SRU5ERVJfTU9ERV9MQ0QgOjoKKyAgICogICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byBob3Jpem9udGFsIFJHQiBhbmQgQkdSIHN1YnBpeGVsIGRpc3BsYXlzCisgICAqICAgICBsaWtlIExDRCBzY3JlZW5zLiAgSXQgcHJvZHVjZXMgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAzfnRpbWVzIHRoZQorICAgKiAgICAgd2lkdGggb2YgdGhlIG9yaWdpbmFsIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzLCBhbmQgd2hpY2ggdXNlIHRoZQorICAgKiAgICAgQEZUX1BJWEVMX01PREVfTENEIG1vZGUuCisgICAqCisgICAqICAgRlRfUkVOREVSX01PREVfTENEX1YgOjoKKyAgICogICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB2ZXJ0aWNhbCBSR0IgYW5kIEJHUiBzdWJwaXhlbCBkaXNwbGF5cworICAgKiAgICAgKGxpa2UgUERBIHNjcmVlbnMsIHJvdGF0ZWQgTENEIGRpc3BsYXlzLCBldGMuKS4gIEl0IHByb2R1Y2VzIDgtYml0CisgICAqICAgICBiaXRtYXBzIHRoYXQgYXJlIDN+dGltZXMgdGhlIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgZ2x5cGggb3V0bGluZSBpbgorICAgKiAgICAgcGl4ZWxzIGFuZCB1c2UgdGhlIEBGVF9QSVhFTF9NT0RFX0xDRF9WIG1vZGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBzZWxlY3RlZCByZW5kZXIgbW9kZSBvbmx5IGFmZmVjdHMgdmVjdG9yIGdseXBocyBvZiBhIGZvbnQuCisgICAqICAgRW1iZWRkZWQgYml0bWFwcyBvZnRlbiBoYXZlIGEgZGlmZmVyZW50IHBpeGVsIG1vZGUgbGlrZQorICAgKiAgIEBGVF9QSVhFTF9NT0RFX01PTk8uICBZb3UgY2FuIHVzZSBARlRfQml0bWFwX0NvbnZlcnQgdG8gdHJhbnNmb3JtIHRoZW0KKyAgICogICBpbnRvIDgtYml0IHBpeG1hcHMuCisgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX1JlbmRlcl9Nb2RlXwogICB7CiAgICAgRlRfUkVOREVSX01PREVfTk9STUFMID0gMCwKQEAgLTMyNDgsMTQ3ICszMjU4LDE0OSBAQAogCiAKICAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX1JlbmRlcl9Nb2RlJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYEZUX1JlbmRlcl9Nb2RlYCB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbm9ybWFsICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwKICNkZWZpbmUgZnRfcmVuZGVyX21vZGVfbW9ubyAgICBGVF9SRU5ERVJfTU9ERV9NT05PCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgdG8gYSBiaXRtYXAuICBJdCBkb2VzIHNvIGJ5IGluc3BlY3RpbmcgKi8KLSAgLyogICAgdGhlIGdseXBoIGltYWdlIGZvcm1hdCwgZmluZGluZyB0aGUgcmVsZXZhbnQgcmVuZGVyZXIsIGFuZCAgICAgICAgICovCi0gIC8qICAgIGludm9raW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBnbHlwaCBzbG90IGNvbnRhaW5pbmcgdGhlIGltYWdlIHRvICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb252ZXJ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZW5kZXJfbW9kZSA6OiBUaGUgcmVuZGVyIG1vZGUgdXNlZCB0byByZW5kZXIgdGhlIGdseXBoIGltYWdlIGludG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYSBiaXRtYXAuICBTZWUgQEZUX1JlbmRlcl9Nb2RlIGZvciBhIGxpc3Qgb2YgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGdldCBtZWFuaW5nZnVsIHJlc3VsdHMsIGZvbnQgc2NhbGluZyB2YWx1ZXMgbXVzdCBiZSBzZXQgd2l0aCAgICAqLwotICAvKiAgICBmdW5jdGlvbnMgbGlrZSBARlRfU2V0X0NoYXJfU2l6ZSBiZWZvcmUgY2FsbGluZyBgRlRfUmVuZGVyX0dseXBoJy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRnJlZVR5cGUgb3V0cHV0cyBhIGJpdG1hcCBvZiBhIGdseXBoLCBpdCByZWFsbHkgb3V0cHV0cyBhbiAgICAqLwotICAvKiAgICBhbHBoYSBjb3ZlcmFnZSBtYXAuICBJZiBhIHBpeGVsIGlzIGNvbXBsZXRlbHkgY292ZXJlZCBieSBhICAgICAgICAgKi8KLSAgLyogICAgZmlsbGVkLWluIG91dGxpbmUsIHRoZSBiaXRtYXAgY29udGFpbnMgMHhGRiBhdCB0aGF0IHBpeGVsLCBtZWFuaW5nICovCi0gIC8qICAgIHRoYXQgMHhGRi8weEZGIGZyYWN0aW9uIG9mIHRoYXQgcGl4ZWwgaXMgY292ZXJlZCwgbWVhbmluZyB0aGUgICAgICAqLwotICAvKiAgICBwaXhlbCBpcyAxMDAlIGJsYWNrIChvciAwJSBicmlnaHQpLiAgSWYgYSBwaXhlbCBpcyBvbmx5IDUwJSAgICAgICAgKi8KLSAgLyogICAgY292ZXJlZCAodmFsdWUgMHg4MCksIHRoZSBwaXhlbCBpcyBtYWRlIDUwJSBibGFjayAoNTAlIGJyaWdodCBvciBhICovCi0gIC8qICAgIG1pZGRsZSBzaGFkZSBvZiBncmV5KS4gIDAlIGNvdmVyZWQgbWVhbnMgMCUgYmxhY2sgKDEwMCUgYnJpZ2h0IG9yICAqLwotICAvKiAgICB3aGl0ZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9uIGhpZ2gtRFBJIHNjcmVlbnMgbGlrZSBvbiBzbWFydHBob25lcyBhbmQgdGFibGV0cywgdGhlIHBpeGVscyAgICAqLwotICAvKiAgICBhcmUgc28gc21hbGwgdGhhdCB0aGVpciBjaGFuY2Ugb2YgYmVpbmcgY29tcGxldGVseSBjb3ZlcmVkIGFuZCAgICAgKi8KLSAgLyogICAgdGhlcmVmb3JlIGNvbXBsZXRlbHkgYmxhY2sgYXJlIGZhaXJseSBnb29kLiAgT24gdGhlIGxvdy1EUEkgICAgICAgICovCi0gIC8qICAgIHNjcmVlbnMsIGhvd2V2ZXIsIHRoZSBzaXR1YXRpb24gaXMgZGlmZmVyZW50LiAgVGhlIHBpeGVscyBhcmUgdG9vICAqLwotICAvKiAgICBsYXJnZSBmb3IgbW9zdCBvZiB0aGUgZGV0YWlscyBvZiBhIGdseXBoIGFuZCBzaGFkZXMgb2YgZ3JheSBhcmUgICAgKi8KLSAgLyogICAgdGhlIG5vcm0gcmF0aGVyIHRoYW4gdGhlIGV4Y2VwdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHJlbGV2YW50IGJlY2F1c2UgYWxsIG91ciBzY3JlZW5zIGhhdmUgYSBzZWNvbmQgcHJvYmxlbTogICAgKi8KLSAgLyogICAgdGhleSBhcmUgbm90IGxpbmVhci4gIDF+K34xIGlzIG5vdH4yLiAgVHdpY2UgdGhlIHZhbHVlIGRvZXMgbm90ICAgICovCi0gIC8qICAgIHJlc3VsdCBpbiB0d2ljZSB0aGUgYnJpZ2h0bmVzcy4gIFdoZW4gYSBwaXhlbCBpcyBvbmx5IDUwJSBjb3ZlcmVkLCAqLwotICAvKiAgICB0aGUgY292ZXJhZ2UgbWFwIHNheXMgNTAlIGJsYWNrLCBhbmQgdGhpcyB0cmFuc2xhdGVzIHRvIGEgcGl4ZWwgICAgKi8KLSAgLyogICAgdmFsdWUgb2YgMTI4IHdoZW4geW91IHVzZSA4fmJpdHMgcGVyIGNoYW5uZWwgKDAtMjU1KS4gIEhvd2V2ZXIsICAgICovCi0gIC8qICAgIHRoaXMgZG9lcyBub3QgdHJhbnNsYXRlIHRvIDUwJSBicmlnaHRuZXNzIGZvciB0aGF0IHBpeGVsIG9uIG91ciAgICAqLwotICAvKiAgICBzUkdCIGFuZCBnYW1tYX4yLjIgc2NyZWVucy4gIER1ZSB0byB0aGVpciBub24tbGluZWFyaXR5LCB0aGV5ICAgICAgKi8KLSAgLyogICAgZHdlbGwgbG9uZ2VyIGluIHRoZSBkYXJrcyBhbmQgb25seSBhIHBpeGVsIHZhbHVlIG9mIGFib3V0IDE4NiAgICAgICovCi0gIC8qICAgIHJlc3VsdHMgaW4gNTAlIGJyaWdodG5lc3MgLS0gMTI4IGVuZHMgdXAgdG9vIGRhcmsgb24gYm90aCBicmlnaHQgICAqLwotICAvKiAgICBhbmQgZGFyayBiYWNrZ3JvdW5kcy4gIFRoZSBuZXQgcmVzdWx0IGlzIHRoYXQgZGFyayB0ZXh0IGxvb2tzICAgICAgKi8KLSAgLyogICAgYnVybnQtb3V0LCBwaXhlbHkgYW5kIGJsb3RjaHkgb24gYnJpZ2h0IGJhY2tncm91bmQsIGJyaWdodCB0ZXh0ICAgICovCi0gIC8qICAgIHRvbyBmcmFpbCBvbiBkYXJrIGJhY2tncm91bmRzLCBhbmQgY29sb3JlZCB0ZXh0IG9uIGNvbG9yZWQgICAgICAgICAqLwotICAvKiAgICBiYWNrZ3JvdW5kIChmb3IgZXhhbXBsZSwgcmVkIG9uIGdyZWVuKSBzZWVtcyB0byBoYXZlIGRhcmsgaGFsb3Mgb3IgKi8KLSAgLyogICAgYGRpcnQnIGFyb3VuZCBpdC4gIFRoZSBzaXR1YXRpb24gaXMgZXNwZWNpYWxseSB1Z2x5IGZvciBkaWFnb25hbCAgICovCi0gIC8qICAgIHN0ZW1zIGxpa2UgaW4gYHcnIGdseXBoIHNoYXBlcyB3aGVyZSB0aGUgcXVhbGl0eSBvZiBGcmVlVHlwZSdzICAgICAqLwotICAvKiAgICBhbnRpLWFsaWFzaW5nIGRlcGVuZHMgb24gdGhlIGNvcnJlY3QgZGlzcGxheSBvZiBncmF5cy4gIE9uICAgICAgICAgKi8KLSAgLyogICAgaGlnaC1EUEkgc2NyZWVucyB3aGVyZSBzbWFsbGVyLCBmdWxseSBibGFjayBwaXhlbHMgcmVpZ24gc3VwcmVtZSwgICovCi0gIC8qICAgIHRoaXMgZG9lc24ndCBtYXR0ZXIsIGJ1dCBvbiBvdXIgbG93LURQSSBzY3JlZW5zIHdpdGggYWxsIHRoZSBncmF5ICAqLwotICAvKiAgICBzaGFkZXMsIGl0IGRvZXMuICAwJSBhbmQgMTAwJSBicmlnaHRuZXNzIGFyZSB0aGUgc2FtZSB0aGluZ3MgaW4gICAgKi8KLSAgLyogICAgbGluZWFyIGFuZCBub24tbGluZWFyIHNwYWNlLCBqdXN0IGFsbCB0aGUgc2hhZGVzIGluLWJldHdlZW4gICAgICAgICovCi0gIC8qICAgIGFyZW4ndC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJsZW5kaW5nIGZ1bmN0aW9uIGZvciBwbGFjaW5nIHRleHQgb3ZlciBhIGJhY2tncm91bmQgaXMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBkc3QgPSBhbHBoYSAqIHNyYyArICgxIC0gYWxwaGEpICogZHN0ICAgICwgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2hpY2ggaXMga25vd24gYXMgdGhlIE9WRVIgb3BlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBjb3JyZWN0bHkgY29tcG9zaXRlIGFuIGFudGlhbGlhc2VkIHBpeGVsIG9mIGEgZ2x5cGggb250byBhICAgICAgKi8KLSAgLyogICAgc3VyZmFjZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAxLiB0YWtlIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyAoZS5nLiwgaW4gc1JHQiBzcGFjZSkgKi8KLSAgLyogICAgICAgYW5kIGFwcGx5IGdhbW1hIHRvIGdldCB0aGVtIGluIGEgbGluZWFyIHNwYWNlLCAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLiB1c2UgT1ZFUiB0byBibGVuZCB0aGUgdHdvIGxpbmVhciBjb2xvcnMgdXNpbmcgdGhlIGdseXBoIHBpeGVsICAgKi8KLSAgLyogICAgICAgYXMgdGhlIGFscGhhIHZhbHVlIChyZW1lbWJlciwgdGhlIGdseXBoIGJpdG1hcCBpcyBhbiBhbHBoYSAgICAgICovCi0gIC8qICAgICAgIGNvdmVyYWdlIGJpdG1hcCksIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMy4gYXBwbHkgaW52ZXJzZSBnYW1tYSB0byB0aGUgYmxlbmRlZCBwaXhlbCBhbmQgd3JpdGUgaXQgYmFjayB0byAgICovCi0gIC8qICAgICAgIHRoZSBpbWFnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW50ZXJuYWwgdGVzdGluZyBhdCBBZG9iZSBmb3VuZCB0aGF0IGEgdGFyZ2V0IGludmVyc2UgZ2FtbWEgb2Z+MS44ICovCi0gIC8qICAgIGZvciBzdGVwfjMgZ2l2ZXMgZ29vZCByZXN1bHRzIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZGlzcGxheXMgd2l0aCAqLwotICAvKiAgICBhbiBzUkdCIGdhbW1hIGN1cnZlIG9yIGEgc2ltaWxhciBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgcHJvY2VzcyBjYW4gY29zdCBwZXJmb3JtYW5jZS4gIFRoZXJlIGlzIGFuIGFwcHJveGltYXRpb24gdGhhdCAqLwotICAvKiAgICBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIGJhY2tncm91bmQgY29sb3I7IHNlZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgaHR0cHM6Ly9iZWwuZmkvYWxhbmtpbGEvbGNkLyBhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGh0dHBzOi8vYmVsLmZpL2FsYW5raWxhL2xjZC9hbHBjb3IuaHRtbCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgKkFUVEVOVElPTio6IExpbmVhciBibGVuZGluZyBpcyBldmVuIG1vcmUgaW1wb3J0YW50IHdoZW4gZGVhbGluZyAgICovCi0gIC8qICAgIHdpdGggc3VicGl4ZWwtcmVuZGVyZWQgZ2x5cGhzIHRvIHByZXZlbnQgY29sb3ItZnJpbmdpbmchICBBICAgICAgICAqLwotICAvKiAgICBzdWJwaXhlbC1yZW5kZXJlZCBnbHlwaCBtdXN0IGZpcnN0IGJlIGZpbHRlcmVkIHdpdGggYSBmaWx0ZXIgdGhhdCAgKi8KLSAgLyogICAgZ2l2ZXMgZXF1YWwgd2VpZ2h0IHRvIHRoZSB0aHJlZSBjb2xvciBwcmltYXJpZXMgYW5kIGRvZXMgbm90ICAgICAgICovCi0gIC8qICAgIGV4Y2VlZCBhIHN1bSBvZiAweDEwMCwgc2VlIHNlY3Rpb24gQGxjZF9maWx0ZXJpbmcuICBUaGVuIHRoZSAgICAgICAqLwotICAvKiAgICBvbmx5IGRpZmZlcmVuY2UgdG8gZ3JheSBsaW5lYXIgYmxlbmRpbmcgaXMgdGhhdCBzdWJwaXhlbC1yZW5kZXJlZCAgKi8KLSAgLyogICAgbGluZWFyIGJsZW5kaW5nIGlzIGRvbmUgM350aW1lcyBwZXIgcGl4ZWw6IHJlZCBmb3JlZ3JvdW5kIHN1YnBpeGVsICovCi0gIC8qICAgIHRvIHJlZCBiYWNrZ3JvdW5kIHN1YnBpeGVsIGFuZCBzbyBvbiBmb3IgZ3JlZW4gYW5kIGJsdWUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9SZW5kZXJfR2x5cGgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbnZlcnQgYSBnaXZlbiBnbHlwaCBpbWFnZSB0byBhIGJpdG1hcC4gIEl0IGRvZXMgc28gYnkgaW5zcGVjdGluZyB0aGUKKyAgICogICBnbHlwaCBpbWFnZSBmb3JtYXQsIGZpbmRpbmcgdGhlIHJlbGV2YW50IHJlbmRlcmVyLCBhbmQgaW52b2tpbmcgaXQuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBzbG90IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgZ2x5cGggc2xvdCBjb250YWluaW5nIHRoZSBpbWFnZSB0byBjb252ZXJ0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgcmVuZGVyX21vZGUgOjoKKyAgICogICAgIFRoZSByZW5kZXIgbW9kZSB1c2VkIHRvIHJlbmRlciB0aGUgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcC4gIFNlZQorICAgKiAgICAgQEZUX1JlbmRlcl9Nb2RlIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLgorICAgKgorICAgKiAgICAgSWYgQEZUX1JFTkRFUl9NT0RFX05PUk1BTCBpcyB1c2VkLCBhIHByZXZpb3VzIGNhbGwgb2YgQEZUX0xvYWRfR2x5cGgKKyAgICogICAgIHdpdGggZmxhZyBARlRfTE9BRF9DT0xPUiBtYWtlcyBGVF9SZW5kZXJfR2x5cGggcHJvdmlkZSBhIGRlZmF1bHQKKyAgICogICAgIGJsZW5kaW5nIG9mIGNvbG9yZWQgZ2x5cGggbGF5ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBnbHlwaAorICAgKiAgICAgc2xvdCAocHJvdmlkZWQgdGhlIGZvbnQgY29udGFpbnMgc3VjaCBsYXllcnMpIGluc3RlYWQgb2YgcmVuZGVyaW5nCisgICAqICAgICB0aGUgZ2x5cGggc2xvdCdzIG91dGxpbmUuICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlOyBzZWUKKyAgICogICAgIEBGVF9MT0FEX0NPTE9SIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRvIGdldCBtZWFuaW5nZnVsIHJlc3VsdHMsIGZvbnQgc2NhbGluZyB2YWx1ZXMgbXVzdCBiZSBzZXQgd2l0aAorICAgKiAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9TZXRfQ2hhcl9TaXplIGJlZm9yZSBjYWxsaW5nIGBGVF9SZW5kZXJfR2x5cGhgLgorICAgKgorICAgKiAgIFdoZW4gRnJlZVR5cGUgb3V0cHV0cyBhIGJpdG1hcCBvZiBhIGdseXBoLCBpdCByZWFsbHkgb3V0cHV0cyBhbiBhbHBoYQorICAgKiAgIGNvdmVyYWdlIG1hcC4gIElmIGEgcGl4ZWwgaXMgY29tcGxldGVseSBjb3ZlcmVkIGJ5IGEgZmlsbGVkLWluCisgICAqICAgb3V0bGluZSwgdGhlIGJpdG1hcCBjb250YWlucyAweEZGIGF0IHRoYXQgcGl4ZWwsIG1lYW5pbmcgdGhhdAorICAgKiAgIDB4RkYvMHhGRiBmcmFjdGlvbiBvZiB0aGF0IHBpeGVsIGlzIGNvdmVyZWQsIG1lYW5pbmcgdGhlIHBpeGVsIGlzIDEwMCUKKyAgICogICBibGFjayAob3IgMCUgYnJpZ2h0KS4gIElmIGEgcGl4ZWwgaXMgb25seSA1MCUgY292ZXJlZCAodmFsdWUgMHg4MCksCisgICAqICAgdGhlIHBpeGVsIGlzIG1hZGUgNTAlIGJsYWNrICg1MCUgYnJpZ2h0IG9yIGEgbWlkZGxlIHNoYWRlIG9mIGdyZXkpLgorICAgKiAgIDAlIGNvdmVyZWQgbWVhbnMgMCUgYmxhY2sgKDEwMCUgYnJpZ2h0IG9yIHdoaXRlKS4KKyAgICoKKyAgICogICBPbiBoaWdoLURQSSBzY3JlZW5zIGxpa2Ugb24gc21hcnRwaG9uZXMgYW5kIHRhYmxldHMsIHRoZSBwaXhlbHMgYXJlIHNvCisgICAqICAgc21hbGwgdGhhdCB0aGVpciBjaGFuY2Ugb2YgYmVpbmcgY29tcGxldGVseSBjb3ZlcmVkIGFuZCB0aGVyZWZvcmUKKyAgICogICBjb21wbGV0ZWx5IGJsYWNrIGFyZSBmYWlybHkgZ29vZC4gIE9uIHRoZSBsb3ctRFBJIHNjcmVlbnMsIGhvd2V2ZXIsCisgICAqICAgdGhlIHNpdHVhdGlvbiBpcyBkaWZmZXJlbnQuICBUaGUgcGl4ZWxzIGFyZSB0b28gbGFyZ2UgZm9yIG1vc3Qgb2YgdGhlCisgICAqICAgZGV0YWlscyBvZiBhIGdseXBoIGFuZCBzaGFkZXMgb2YgZ3JheSBhcmUgdGhlIG5vcm0gcmF0aGVyIHRoYW4gdGhlCisgICAqICAgZXhjZXB0aW9uLgorICAgKgorICAgKiAgIFRoaXMgaXMgcmVsZXZhbnQgYmVjYXVzZSBhbGwgb3VyIHNjcmVlbnMgaGF2ZSBhIHNlY29uZCBwcm9ibGVtOiB0aGV5CisgICAqICAgYXJlIG5vdCBsaW5lYXIuICAxfit+MSBpcyBub3R+Mi4gIFR3aWNlIHRoZSB2YWx1ZSBkb2VzIG5vdCByZXN1bHQgaW4KKyAgICogICB0d2ljZSB0aGUgYnJpZ2h0bmVzcy4gIFdoZW4gYSBwaXhlbCBpcyBvbmx5IDUwJSBjb3ZlcmVkLCB0aGUgY292ZXJhZ2UKKyAgICogICBtYXAgc2F5cyA1MCUgYmxhY2ssIGFuZCB0aGlzIHRyYW5zbGF0ZXMgdG8gYSBwaXhlbCB2YWx1ZSBvZiAxMjggd2hlbgorICAgKiAgIHlvdSB1c2UgOH5iaXRzIHBlciBjaGFubmVsICgwLTI1NSkuICBIb3dldmVyLCB0aGlzIGRvZXMgbm90IHRyYW5zbGF0ZQorICAgKiAgIHRvIDUwJSBicmlnaHRuZXNzIGZvciB0aGF0IHBpeGVsIG9uIG91ciBzUkdCIGFuZCBnYW1tYX4yLjIgc2NyZWVucy4KKyAgICogICBEdWUgdG8gdGhlaXIgbm9uLWxpbmVhcml0eSwgdGhleSBkd2VsbCBsb25nZXIgaW4gdGhlIGRhcmtzIGFuZCBvbmx5IGEKKyAgICogICBwaXhlbCB2YWx1ZSBvZiBhYm91dCAxODYgcmVzdWx0cyBpbiA1MCUgYnJpZ2h0bmVzcyAtLSAxMjggZW5kcyB1cCB0b28KKyAgICogICBkYXJrIG9uIGJvdGggYnJpZ2h0IGFuZCBkYXJrIGJhY2tncm91bmRzLiAgVGhlIG5ldCByZXN1bHQgaXMgdGhhdCBkYXJrCisgICAqICAgdGV4dCBsb29rcyBidXJudC1vdXQsIHBpeGVseSBhbmQgYmxvdGNoeSBvbiBicmlnaHQgYmFja2dyb3VuZCwgYnJpZ2h0CisgICAqICAgdGV4dCB0b28gZnJhaWwgb24gZGFyayBiYWNrZ3JvdW5kcywgYW5kIGNvbG9yZWQgdGV4dCBvbiBjb2xvcmVkCisgICAqICAgYmFja2dyb3VuZCAoZm9yIGV4YW1wbGUsIHJlZCBvbiBncmVlbikgc2VlbXMgdG8gaGF2ZSBkYXJrIGhhbG9zIG9yCisgICAqICAgJ2RpcnQnIGFyb3VuZCBpdC4gIFRoZSBzaXR1YXRpb24gaXMgZXNwZWNpYWxseSB1Z2x5IGZvciBkaWFnb25hbCBzdGVtcworICAgKiAgIGxpa2UgaW4gJ3cnIGdseXBoIHNoYXBlcyB3aGVyZSB0aGUgcXVhbGl0eSBvZiBGcmVlVHlwZSdzIGFudGktYWxpYXNpbmcKKyAgICogICBkZXBlbmRzIG9uIHRoZSBjb3JyZWN0IGRpc3BsYXkgb2YgZ3JheXMuICBPbiBoaWdoLURQSSBzY3JlZW5zIHdoZXJlCisgICAqICAgc21hbGxlciwgZnVsbHkgYmxhY2sgcGl4ZWxzIHJlaWduIHN1cHJlbWUsIHRoaXMgZG9lc24ndCBtYXR0ZXIsIGJ1dCBvbgorICAgKiAgIG91ciBsb3ctRFBJIHNjcmVlbnMgd2l0aCBhbGwgdGhlIGdyYXkgc2hhZGVzLCBpdCBkb2VzLiAgMCUgYW5kIDEwMCUKKyAgICogICBicmlnaHRuZXNzIGFyZSB0aGUgc2FtZSB0aGluZ3MgaW4gbGluZWFyIGFuZCBub24tbGluZWFyIHNwYWNlLCBqdXN0CisgICAqICAgYWxsIHRoZSBzaGFkZXMgaW4tYmV0d2VlbiBhcmVuJ3QuCisgICAqCisgICAqICAgVGhlIGJsZW5kaW5nIGZ1bmN0aW9uIGZvciBwbGFjaW5nIHRleHQgb3ZlciBhIGJhY2tncm91bmQgaXMKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIGRzdCA9IGFscGhhICogc3JjICsgKDEgLSBhbHBoYSkgKiBkc3QgICAgLAorICAgKiAgIGBgYAorICAgKgorICAgKiAgIHdoaWNoIGlzIGtub3duIGFzIHRoZSBPVkVSIG9wZXJhdG9yLgorICAgKgorICAgKiAgIFRvIGNvcnJlY3RseSBjb21wb3NpdGUgYW4gYW50aWFsaWFzZWQgcGl4ZWwgb2YgYSBnbHlwaCBvbnRvIGEgc3VyZmFjZSwKKyAgICoKKyAgICogICAxLiB0YWtlIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycyAoZS5nLiwgaW4gc1JHQiBzcGFjZSkKKyAgICogICAgICBhbmQgYXBwbHkgZ2FtbWEgdG8gZ2V0IHRoZW0gaW4gYSBsaW5lYXIgc3BhY2UsCisgICAqCisgICAqICAgMi4gdXNlIE9WRVIgdG8gYmxlbmQgdGhlIHR3byBsaW5lYXIgY29sb3JzIHVzaW5nIHRoZSBnbHlwaCBwaXhlbAorICAgKiAgICAgIGFzIHRoZSBhbHBoYSB2YWx1ZSAocmVtZW1iZXIsIHRoZSBnbHlwaCBiaXRtYXAgaXMgYW4gYWxwaGEgY292ZXJhZ2UKKyAgICogICAgICBiaXRtYXApLCBhbmQKKyAgICoKKyAgICogICAzLiBhcHBseSBpbnZlcnNlIGdhbW1hIHRvIHRoZSBibGVuZGVkIHBpeGVsIGFuZCB3cml0ZSBpdCBiYWNrIHRvCisgICAqICAgICAgdGhlIGltYWdlLgorICAgKgorICAgKiAgIEludGVybmFsIHRlc3RpbmcgYXQgQWRvYmUgZm91bmQgdGhhdCBhIHRhcmdldCBpbnZlcnNlIGdhbW1hIG9mfjEuOCBmb3IKKyAgICogICBzdGVwfjMgZ2l2ZXMgZ29vZCByZXN1bHRzIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZGlzcGxheXMgd2l0aCBhbiBzUkdCCisgICAqICAgZ2FtbWEgY3VydmUgb3IgYSBzaW1pbGFyIG9uZS4KKyAgICoKKyAgICogICBUaGlzIHByb2Nlc3MgY2FuIGNvc3QgcGVyZm9ybWFuY2UuICBUaGVyZSBpcyBhbiBhcHByb3hpbWF0aW9uIHRoYXQKKyAgICogICBkb2VzIG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhlIGJhY2tncm91bmQgY29sb3I7IHNlZQorICAgKiAgIGh0dHBzOi8vYmVsLmZpL2FsYW5raWxhL2xjZC8gYW5kCisgICAqICAgaHR0cHM6Ly9iZWwuZmkvYWxhbmtpbGEvbGNkL2FscGNvci5odG1sIGZvciBkZXRhaWxzLgorICAgKgorICAgKiAgICoqQVRURU5USU9OKio6IExpbmVhciBibGVuZGluZyBpcyBldmVuIG1vcmUgaW1wb3J0YW50IHdoZW4gZGVhbGluZworICAgKiAgIHdpdGggc3VicGl4ZWwtcmVuZGVyZWQgZ2x5cGhzIHRvIHByZXZlbnQgY29sb3ItZnJpbmdpbmchICBBCisgICAqICAgc3VicGl4ZWwtcmVuZGVyZWQgZ2x5cGggbXVzdCBmaXJzdCBiZSBmaWx0ZXJlZCB3aXRoIGEgZmlsdGVyIHRoYXQKKyAgICogICBnaXZlcyBlcXVhbCB3ZWlnaHQgdG8gdGhlIHRocmVlIGNvbG9yIHByaW1hcmllcyBhbmQgZG9lcyBub3QgZXhjZWVkIGEKKyAgICogICBzdW0gb2YgMHgxMDAsIHNlZSBzZWN0aW9uIEBsY2RfcmVuZGVyaW5nLiAgVGhlbiB0aGUgb25seSBkaWZmZXJlbmNlIHRvCisgICAqICAgZ3JheSBsaW5lYXIgYmxlbmRpbmcgaXMgdGhhdCBzdWJwaXhlbC1yZW5kZXJlZCBsaW5lYXIgYmxlbmRpbmcgaXMgZG9uZQorICAgKiAgIDN+dGltZXMgcGVyIHBpeGVsOiByZWQgZm9yZWdyb3VuZCBzdWJwaXhlbCB0byByZWQgYmFja2dyb3VuZCBzdWJwaXhlbAorICAgKiAgIGFuZCBzbyBvbiBmb3IgZ3JlZW4gYW5kIGJsdWUuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfUmVuZGVyX0dseXBoKCBGVF9HbHlwaFNsb3QgICAgc2xvdCwKICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tlcm5pbmdfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHRvIHNwZWNpZnkgdGhlIGZvcm1hdCBvZiBrZXJuaW5nIHZhbHVlcyByZXR1cm5lZCBieSAqLwotICAvKiAgICBARlRfR2V0X0tlcm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX0RFRkFVTFQgIDo6IFJldHVybiBncmlkLWZpdHRlZCBrZXJuaW5nIGRpc3RhbmNlcyBpbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX1VORklUVEVEIDo6IFJldHVybiB1bi1ncmlkLWZpdHRlZCBrZXJuaW5nIGRpc3RhbmNlcyBpbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX1VOU0NBTEVEIDo6IFJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgaW4gb3JpZ2luYWwgZm9udCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS0VSTklOR19ERUZBVUxUIHJldHVybnMgZnVsbCBwaXhlbCB2YWx1ZXM7IGl0IGFsc28gbWFrZXMgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGhldXJpc3RpY2FsbHkgc2NhbGUgZG93biBrZXJuaW5nIGRpc3RhbmNlcyBhdCBzbWFsbCBwcGVtICAqLwotICAvKiAgICB2YWx1ZXMgc28gdGhhdCB0aGV5IGRvbid0IGJlY29tZSB0b28gYmlnLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJvdGggRlRfS0VSTklOR19ERUZBVUxUIGFuZCBGVF9LRVJOSU5HX1VORklUVEVEIHVzZSB0aGUgY3VycmVudCAgICAqLwotICAvKiAgICBob3Jpem9udGFsIHNjYWxpbmcgZmFjdG9yIChhcyBzZXQgZS5nLiB3aXRoIEBGVF9TZXRfQ2hhcl9TaXplKSB0byAgKi8KLSAgLyogICAgY29udmVydCBmb250IHVuaXRzIHRvIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfS2VybmluZ19Nb2RlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBlbnVtZXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBmb3JtYXQgb2Yga2VybmluZyB2YWx1ZXMgcmV0dXJuZWQgYnkKKyAgICogICBARlRfR2V0X0tlcm5pbmcuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfS0VSTklOR19ERUZBVUxUIDo6CisgICAqICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQga2VybmluZyBkaXN0YW5jZXMgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4KKyAgICoKKyAgICogICBGVF9LRVJOSU5HX1VORklUVEVEIDo6CisgICAqICAgICBSZXR1cm4gdW4tZ3JpZC1maXR0ZWQga2VybmluZyBkaXN0YW5jZXMgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4KKyAgICoKKyAgICogICBGVF9LRVJOSU5HX1VOU0NBTEVEIDo6CisgICAqICAgICBSZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGluIG9yaWdpbmFsIGZvbnQgdW5pdHMuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIGBGVF9LRVJOSU5HX0RFRkFVTFRgIHJldHVybnMgZnVsbCBwaXhlbCB2YWx1ZXM7IGl0IGFsc28gbWFrZXMgRnJlZVR5cGUKKyAgICogICBoZXVyaXN0aWNhbGx5IHNjYWxlIGRvd24ga2VybmluZyBkaXN0YW5jZXMgYXQgc21hbGwgcHBlbSB2YWx1ZXMgc28KKyAgICogICB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIHRvbyBiaWcuCisgICAqCisgICAqICAgQm90aCBgRlRfS0VSTklOR19ERUZBVUxUYCBhbmQgYEZUX0tFUk5JTkdfVU5GSVRURURgIHVzZSB0aGUgY3VycmVudAorICAgKiAgIGhvcml6b250YWwgc2NhbGluZyBmYWN0b3IgKGFzIHNldCBlLmcuIHdpdGggQEZUX1NldF9DaGFyX1NpemUpIHRvCisgICAqICAgY29udmVydCBmb250IHVuaXRzIHRvIHBpeGVscy4KKyAgICovCiAgIHR5cGVkZWYgZW51bSAgRlRfS2VybmluZ19Nb2RlXwogICB7CiAgICAgRlRfS0VSTklOR19ERUZBVUxUID0gMCwKQEAgLTMzOTksNTAgKzM0MTEsNTMgQEAKIAogCiAgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9LZXJuaW5nX01vZGUnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBGVF9LZXJuaW5nX01vZGVgIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIGZ0X2tlcm5pbmdfZGVmYXVsdCAgIEZUX0tFUk5JTkdfREVGQVVMVAogI2RlZmluZSBmdF9rZXJuaW5nX3VuZml0dGVkICBGVF9LRVJOSU5HX1VORklUVEVECiAjZGVmaW5lIGZ0X2tlcm5pbmdfdW5zY2FsZWQgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gZ2x5cGhzIG9mIHRoZSBzYW1lIGZhY2UuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9nbHlwaCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByaWdodF9nbHlwaCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5fbW9kZSAgIDo6IFNlZSBARlRfS2VybmluZ19Nb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBzY2FsZSBhbmQgZGltZW5zaW9uIG9mIHRoZSByZXR1cm5lZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAga2VybmluZyB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWtlcm5pbmcgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBlaXRoZXIgaW4gZm9udCB1bml0cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzICgyNi42IGZvcm1hdCksIG9yIHBpeGVscyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZC4gIE90aGVyIGxheW91dHMsIG9yIG1vcmUgc29waGlzdGljYXRlZCAgICAqLwotICAvKiAgICBrZXJuaW5ncywgYXJlIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBBUEkgZnVuY3Rpb24gLS0gdGhleSBjYW4gYmUgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBLZXJuaW5nIGZvciBPcGVuVHlwZSBmb250cyBpbXBsZW1lbnRlZCBpbiBhIGBHUE9TJyB0YWJsZSBpcyBub3QgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkOyB1c2UgQEZUX0hBU19LRVJOSU5HIHRvIGZpbmQgb3V0IHdoZXRoZXIgYSBmb250IGhhcyBkYXRhICovCi0gIC8qICAgIHRoYXQgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGBGVF9HZXRfS2VybmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfS2VybmluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3byBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGxlZnRfZ2x5cGggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLgorICAgKgorICAgKiAgIHJpZ2h0X2dseXBoIDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuCisgICAqCisgICAqICAga2Vybl9tb2RlIDo6CisgICAqICAgICBTZWUgQEZUX0tlcm5pbmdfTW9kZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIERldGVybWluZXMgdGhlIHNjYWxlIGFuZAorICAgKiAgICAgZGltZW5zaW9uIG9mIHRoZSByZXR1cm5lZCBrZXJuaW5nIHZlY3Rvci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBha2VybmluZyA6OgorICAgKiAgICAgVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBlaXRoZXIgaW4gZm9udCB1bml0cywgZnJhY3Rpb25hbCBwaXhlbHMKKyAgICogICAgICgyNi42IGZvcm1hdCksIG9yIHBpeGVscyBmb3Igc2NhbGFibGUgZm9ybWF0cywgYW5kIGluIHBpeGVscyBmb3IKKyAgICogICAgIGZpeGVkLXNpemVzIGZvcm1hdHMuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgc3VwcG9ydGVkCisgICAqICAgYnkgdGhpcyBtZXRob2QuICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQga2VybmluZ3MsIGFyZQorICAgKiAgIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBBUEkgZnVuY3Rpb24gLS0gdGhleSBjYW4gYmUgaW1wbGVtZW50ZWQKKyAgICogICB0aHJvdWdoIGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLgorICAgKgorICAgKiAgIEtlcm5pbmcgZm9yIE9wZW5UeXBlIGZvbnRzIGltcGxlbWVudGVkIGluIGEgJ0dQT1MnIHRhYmxlIGlzIG5vdAorICAgKiAgIHN1cHBvcnRlZDsgdXNlIEBGVF9IQVNfS0VSTklORyB0byBmaW5kIG91dCB3aGV0aGVyIGEgZm9udCBoYXMgZGF0YQorICAgKiAgIHRoYXQgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGBGVF9HZXRfS2VybmluZ2AuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLApAQCAtMzQ1MSwzOSArMzQ2Niw0MiBAQAogICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYWtlcm5pbmcgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdHJhY2sga2VybmluZyBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRfc2l6ZSA6OiBUaGUgcG9pbnQgc2l6ZSBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICAgIDo6IFRoZSBkZWdyZWUgb2YgdGlnaHRuZXNzLiAgSW5jcmVhc2luZ2x5IG5lZ2F0aXZlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgcmVwcmVzZW50IHRpZ2h0ZXIgdHJhY2sga2VybmluZywgd2hpbGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5jcmVhc2luZ2x5IHBvc2l0aXZlIHZhbHVlcyByZXByZXNlbnQgbG9vc2VyIHRyYWNrICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGtlcm5pbmcuICBWYWx1ZSB6ZXJvIG1lYW5zIG5vIHRyYWNrIGtlcm5pbmcuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBha2VybmluZyAgIDo6IFRoZSBrZXJuaW5nIGluIDE2LjE2IGZyYWN0aW9uYWwgcG9pbnRzLCB0byBiZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1bmlmb3JtbHkgYXBwbGllZCBiZXR3ZWVuIGFsbCBnbHlwaHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3VycmVudGx5LCBvbmx5IHRoZSBUeXBlfjEgZm9udCBkcml2ZXIgc3VwcG9ydHMgdHJhY2sga2VybmluZywgICAgICovCi0gIC8qICAgIHVzaW5nIGRhdGEgZnJvbSBBRk0gZmlsZXMgKGlmIGF0dGFjaGVkIHdpdGggQEZUX0F0dGFjaF9GaWxlIG9yICAgICAqLwotICAvKiAgICBARlRfQXR0YWNoX1N0cmVhbSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdmVyeSBmZXcgQUZNIGZpbGVzIGNvbWUgd2l0aCB0cmFjayBrZXJuaW5nIGRhdGE7IHBsZWFzZSByZWZlciAqLwotICAvKiAgICB0byBBZG9iZSdzIEFGTSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X1RyYWNrX0tlcm5pbmcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgdHJhY2sga2VybmluZyBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdCBhdCBhIGdpdmVuIHNpemUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBwb2ludF9zaXplIDo6CisgICAqICAgICBUaGUgcG9pbnQgc2l6ZSBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cy4KKyAgICoKKyAgICogICBkZWdyZWUgOjoKKyAgICogICAgIFRoZSBkZWdyZWUgb2YgdGlnaHRuZXNzLiAgSW5jcmVhc2luZ2x5IG5lZ2F0aXZlIHZhbHVlcyByZXByZXNlbnQKKyAgICogICAgIHRpZ2h0ZXIgdHJhY2sga2VybmluZywgd2hpbGUgaW5jcmVhc2luZ2x5IHBvc2l0aXZlIHZhbHVlcyByZXByZXNlbnQKKyAgICogICAgIGxvb3NlciB0cmFjayBrZXJuaW5nLiAgVmFsdWUgemVybyBtZWFucyBubyB0cmFjayBrZXJuaW5nLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFrZXJuaW5nIDo6CisgICAqICAgICBUaGUga2VybmluZyBpbiAxNi4xNiBmcmFjdGlvbmFsIHBvaW50cywgdG8gYmUgdW5pZm9ybWx5IGFwcGxpZWQKKyAgICogICAgIGJldHdlZW4gYWxsIGdseXBocy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBDdXJyZW50bHksIG9ubHkgdGhlIFR5cGV+MSBmb250IGRyaXZlciBzdXBwb3J0cyB0cmFjayBrZXJuaW5nLCB1c2luZworICAgKiAgIGRhdGEgZnJvbSBBRk0gZmlsZXMgKGlmIGF0dGFjaGVkIHdpdGggQEZUX0F0dGFjaF9GaWxlIG9yCisgICAqICAgQEZUX0F0dGFjaF9TdHJlYW0pLgorICAgKgorICAgKiAgIE9ubHkgdmVyeSBmZXcgQUZNIGZpbGVzIGNvbWUgd2l0aCB0cmFjayBrZXJuaW5nIGRhdGE7IHBsZWFzZSByZWZlciB0bworICAgKiAgIEFkb2JlJ3MgQUZNIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfVHJhY2tfS2VybmluZyggRlRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwb2ludF9zaXplLApAQCAtMzQ5MSw0NSArMzUwOSw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBha2VybmluZyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0dseXBoX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEFTQ0lJIG5hbWUgb2YgYSBnaXZlbiBnbHlwaCBpbiBhIGZhY2UuICBUaGlzIG9ubHkgICAgICovCi0gIC8qICAgIHdvcmtzIGZvciB0aG9zZSBmYWNlcyB3aGVyZSBARlRfSEFTX0dMWVBIX05BTUVTKGZhY2UpIHJldHVybnN+MS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXJfbWF4ICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyICAgICAgOjogQSBwb2ludGVyIHRvIGEgdGFyZ2V0IGJ1ZmZlciB3aGVyZSB0aGUgbmFtZSBpcyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGNvcGllZCB0by4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBmYWNlIGRvZXNuJ3QgcHJvdmlkZSBnbHlwaCBuYW1lcyBvciBpZiAqLwotICAvKiAgICB0aGUgZ2x5cGggaW5kZXggaXMgaW52YWxpZC4gIEluIGFsbCBjYXNlcyBvZiBmYWlsdXJlLCB0aGUgZmlyc3QgICAgKi8KLSAgLyogICAgYnl0ZSBvZiBgYnVmZmVyJyBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhbiBlbXB0eSBuYW1lLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggbmFtZSBpcyB0cnVuY2F0ZWQgdG8gZml0IHdpdGhpbiB0aGUgYnVmZmVyIGlmIGl0IGlzIHRvbyAgKi8KLSAgLyogICAgbG9uZy4gIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYWx3YXlzIHplcm8tdGVybWluYXRlZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZSBhd2FyZSB0aGF0IEZyZWVUeXBlIHJlb3JkZXJzIGdseXBoIGluZGljZXMgaW50ZXJuYWxseSBzbyB0aGF0ICAgKi8KLSAgLyogICAgZ2x5cGggaW5kZXh+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gdGhlIGBtaXNzaW5nIGdseXBoJyAoY2FsbGVkICAgICovCi0gIC8qICAgIGAubm90ZGVmJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY29uZmlnIG1hY3JvICAgICAgICAgICovCi0gIC8qICAgIGBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTJyBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfR2x5cGhfTmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIEFTQ0lJIG5hbWUgb2YgYSBnaXZlbiBnbHlwaCBpbiBhIGZhY2UuICBUaGlzIG9ubHkgd29ya3MKKyAgICogICBmb3IgdGhvc2UgZmFjZXMgd2hlcmUgQEZUX0hBU19HTFlQSF9OQU1FUyhmYWNlKSByZXR1cm5zfjEuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBnbHlwaF9pbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIGJ1ZmZlcl9tYXggOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gdGhlIGJ1ZmZlci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBidWZmZXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBhIHRhcmdldCBidWZmZXIgd2hlcmUgdGhlIG5hbWUgaXMgY29waWVkIHRvLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIHRoZSBmYWNlIGRvZXNuJ3QgcHJvdmlkZSBnbHlwaCBuYW1lcyBvciBpZiB0aGUKKyAgICogICBnbHlwaCBpbmRleCBpcyBpbnZhbGlkLiAgSW4gYWxsIGNhc2VzIG9mIGZhaWx1cmUsIHRoZSBmaXJzdCBieXRlIG9mCisgICAqICAgYGJ1ZmZlcmAgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYW4gZW1wdHkgbmFtZS4KKyAgICoKKyAgICogICBUaGUgZ2x5cGggbmFtZSBpcyB0cnVuY2F0ZWQgdG8gZml0IHdpdGhpbiB0aGUgYnVmZmVyIGlmIGl0IGlzIHRvbworICAgKiAgIGxvbmcuICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGFsd2F5cyB6ZXJvLXRlcm1pbmF0ZWQuCisgICAqCisgICAqICAgQmUgYXdhcmUgdGhhdCBGcmVlVHlwZSByZW9yZGVycyBnbHlwaCBpbmRpY2VzIGludGVybmFsbHkgc28gdGhhdCBnbHlwaAorICAgKiAgIGluZGV4fjAgYWx3YXlzIGNvcnJlc3BvbmRzIHRvIHRoZSAnbWlzc2luZyBnbHlwaCcgKGNhbGxlZCAnLm5vdGRlZicpLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGNvbmZpZyBtYWNybworICAgKiAgIGBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTYCBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X0dseXBoX05hbWUoIEZUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKQEAgLTM1MzcsMTA3ICszNTU2LDEwOSBAQAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEFTQ0lJIFBvc3RTY3JpcHQgbmFtZSBvZiBhIGdpdmVuIGZhY2UsIGlmIGF2YWlsYWJsZS4gICovCi0gIC8qICAgIFRoaXMgb25seSB3b3JrcyB3aXRoIFBvc3RTY3JpcHQsIFRydWVUeXBlLCBhbmQgT3BlblR5cGUgZm9udHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgZmFjZSdzIFBvc3RTY3JpcHQgbmFtZS4gIE5VTEwgaWYgdW5hdmFpbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCBpcyBkZXN0cm95ZWQgd2l0aCAgICAqLwotICAvKiAgICBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciB2YXJpYXRpb24gZm9udHMsIHRoaXMgc3RyaW5nIGNoYW5nZXMgaWYgeW91IHNlbGVjdCBhIGRpZmZlcmVudCAqLwotICAvKiAgICBpbnN0YW5jZSwgYW5kIHlvdSBoYXZlIHRvIGNhbGwgYEZUX0dldF9Qb3N0U2NyaXB0X05hbWUnIGFnYWluIHRvICAgKi8KLSAgLyogICAgcmV0cmlldmUgaXQuICBGcmVlVHlwZSBmb2xsb3dzIEFkb2JlIFRlY2hOb3RlICM1OTAyLCBgR2VuZXJhdGluZyAgICovCi0gIC8qICAgIFBvc3RTY3JpcHQgTmFtZXMgZm9yIEZvbnRzIFVzaW5nIE9wZW5UeXBlIEZvbnQgVmFyaWF0aW9ucycuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwczovL2Rvd25sb2FkLm1hY3JvbWVkaWEuY29tL3B1Yi9kZXZlbG9wZXIvb3BlbnR5cGUvdGVjaC1ub3Rlcy81OTAyLkFkb2JlUFNOYW1lR2VuZXJhdGlvbi5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBbU2luY2UgMi45XSBTcGVjaWFsIFBvc3RTY3JpcHQgbmFtZXMgZm9yIG5hbWVkIGluc3RhbmNlcyBhcmUgb25seSAgKi8KLSAgLyogICAgcmV0dXJuZWQgaWYgdGhlIG5hbWVkIGluc3RhbmNlIGlzIHNldCB3aXRoIEBGVF9TZXRfTmFtZWRfSW5zdGFuY2UgICovCi0gIC8qICAgIChhbmQgdGhlIGZvbnQgaGFzIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiBpdHMgYGZ2YXInIHRhYmxlKS4gIElmICAqLwotICAvKiAgICBARlRfSVNfVkFSSUFUSU9OIHJldHVybnMgdHJ1ZSwgdGhlIGFsZ29yaXRobWljYWxseSBkZXJpdmVkICAgICAgICAgKi8KLSAgLyogICAgUG9zdFNjcmlwdCBuYW1lIGlzIHByb3ZpZGVkLCBub3QgbG9va2luZyB1cCBzcGVjaWFsIGVudHJpZXMgZm9yICAgICovCi0gIC8qICAgIG5hbWVkIGluc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSB0aGUgQVNDSUkgUG9zdFNjcmlwdCBuYW1lIG9mIGEgZ2l2ZW4gZmFjZSwgaWYgYXZhaWxhYmxlLgorICAgKiAgIFRoaXMgb25seSB3b3JrcyB3aXRoIFBvc3RTY3JpcHQsIFRydWVUeXBlLCBhbmQgT3BlblR5cGUgZm9udHMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEEgcG9pbnRlciB0byB0aGUgZmFjZSdzIFBvc3RTY3JpcHQgbmFtZS4gIGBOVUxMYCBpZiB1bmF2YWlsYWJsZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGZhY2UgYW5kIGlzIGRlc3Ryb3llZCB3aXRoIGl0LgorICAgKgorICAgKiAgIEZvciB2YXJpYXRpb24gZm9udHMsIHRoaXMgc3RyaW5nIGNoYW5nZXMgaWYgeW91IHNlbGVjdCBhIGRpZmZlcmVudAorICAgKiAgIGluc3RhbmNlLCBhbmQgeW91IGhhdmUgdG8gY2FsbCBgRlRfR2V0X1Bvc3RTY3JpcHRfTmFtZWAgYWdhaW4gdG8KKyAgICogICByZXRyaWV2ZSBpdC4gIEZyZWVUeXBlIGZvbGxvd3MgQWRvYmUgVGVjaE5vdGUgIzU5MDIsICdHZW5lcmF0aW5nCisgICAqICAgUG9zdFNjcmlwdCBOYW1lcyBmb3IgRm9udHMgVXNpbmcgT3BlblR5cGUgRm9udCBWYXJpYXRpb25zJy4KKyAgICoKKyAgICogICAgIGh0dHBzOi8vZG93bmxvYWQubWFjcm9tZWRpYS5jb20vcHViL2RldmVsb3Blci9vcGVudHlwZS90ZWNoLW5vdGVzLzU5MDIuQWRvYmVQU05hbWVHZW5lcmF0aW9uLmh0bWwKKyAgICoKKyAgICogICBbU2luY2UgMi45XSBTcGVjaWFsIFBvc3RTY3JpcHQgbmFtZXMgZm9yIG5hbWVkIGluc3RhbmNlcyBhcmUgb25seQorICAgKiAgIHJldHVybmVkIGlmIHRoZSBuYW1lZCBpbnN0YW5jZSBpcyBzZXQgd2l0aCBARlRfU2V0X05hbWVkX0luc3RhbmNlIChhbmQKKyAgICogICB0aGUgZm9udCBoYXMgY29ycmVzcG9uZGluZyBlbnRyaWVzIGluIGl0cyAnZnZhcicgdGFibGUpLiAgSWYKKyAgICogICBARlRfSVNfVkFSSUFUSU9OIHJldHVybnMgdHJ1ZSwgdGhlIGFsZ29yaXRobWljYWxseSBkZXJpdmVkIFBvc3RTY3JpcHQKKyAgICogICBuYW1lIGlzIHByb3ZpZGVkLCBub3QgbG9va2luZyB1cCBzcGVjaWFsIGVudHJpZXMgZm9yIG5hbWVkIGluc3RhbmNlcy4KKyAgICovCiAgIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQogICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKCBGVF9GYWNlICBmYWNlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZWxlY3RfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYSBnaXZlbiBjaGFybWFwIGJ5IGl0cyBlbmNvZGluZyB0YWcgKGFzIGxpc3RlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgYGZyZWV0eXBlLmgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmcgOjogQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIG5vIGNoYXJtYXAgaW4gdGhlIGZhY2UgICAgICAgICAgICovCi0gIC8qICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmNvZGluZyBxdWVyaWVkIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmVjYXVzZSBtYW55IGZvbnRzIGNvbnRhaW4gbW9yZSB0aGFuIGEgc2luZ2xlIGNtYXAgZm9yIFVuaWNvZGUgICAgICovCi0gIC8qICAgIGVuY29kaW5nLCB0aGlzIGZ1bmN0aW9uIGhhcyBzb21lIHNwZWNpYWwgY29kZSB0byBzZWxlY3QgdGhlIG9uZSAgICAqLwotICAvKiAgICB0aGF0IGNvdmVycyBVbmljb2RlIGJlc3QgKGBiZXN0JyBpbiB0aGUgc2Vuc2UgdGhhdCBhIFVDUy00IGNtYXAgaXMgKi8KLSAgLyogICAgcHJlZmVycmVkIHRvIGEgVUNTLTIgY21hcCkuICBJdCBpcyB0aHVzIHByZWZlcmFibGUgdG8gICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9TZXRfQ2hhcm1hcCBpbiB0aGlzIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TZWxlY3RfQ2hhcm1hcAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBieSBpdHMgZW5jb2RpbmcgdGFnIChhcyBsaXN0ZWQgaW4KKyAgICogICBgZnJlZXR5cGUuaGApLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGVuY29kaW5nIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIG5vIGNoYXJtYXAgaW4gdGhlIGZhY2UgY29ycmVzcG9uZHMKKyAgICogICB0byB0aGUgZW5jb2RpbmcgcXVlcmllZCBoZXJlLgorICAgKgorICAgKiAgIEJlY2F1c2UgbWFueSBmb250cyBjb250YWluIG1vcmUgdGhhbiBhIHNpbmdsZSBjbWFwIGZvciBVbmljb2RlCisgICAqICAgZW5jb2RpbmcsIHRoaXMgZnVuY3Rpb24gaGFzIHNvbWUgc3BlY2lhbCBjb2RlIHRvIHNlbGVjdCB0aGUgb25lIHRoYXQKKyAgICogICBjb3ZlcnMgVW5pY29kZSBiZXN0ICgnYmVzdCcgaW4gdGhlIHNlbnNlIHRoYXQgYSBVQ1MtNCBjbWFwIGlzCisgICAqICAgcHJlZmVycmVkIHRvIGEgVUNTLTIgY21hcCkuICBJdCBpcyB0aHVzIHByZWZlcmFibGUgdG8gQEZUX1NldF9DaGFybWFwCisgICAqICAgaW4gdGhpcyBjYXNlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBmb3IgY2hhcmFjdGVyIGNvZGUgdG8gZ2x5cGggaW5kZXggbWFwcGluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiBBIGhhbmRsZSB0byB0aGUgc2VsZWN0ZWQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjaGFybWFwIGlzIG5vdCBwYXJ0IG9mICAgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIChpLmUuLCBpZiBpdCBpcyBub3QgbGlzdGVkIGluIHRoZSBgZmFjZS0+Y2hhcm1hcHMnICAgICAgICAqLwotICAvKiAgICB0YWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGFsc28gZmFpbHMgaWYgYW4gT3BlblR5cGUgdHlwZX4xNCBjaGFybWFwIGlzIHNlbGVjdGVkICh3aGljaCAgICAqLwotICAvKiAgICBkb2Vzbid0IG1hcCBjaGFyYWN0ZXIgY29kZXMgdG8gZ2x5cGggaW5kaWNlcyBhdCBhbGwpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2V0X0NoYXJtYXAKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFNlbGVjdCBhIGdpdmVuIGNoYXJtYXAgZm9yIGNoYXJhY3RlciBjb2RlIHRvIGdseXBoIGluZGV4IG1hcHBpbmcuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY2hhcm1hcCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGNoYXJtYXAuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjaGFybWFwIGlzIG5vdCBwYXJ0IG9mIHRoZSBmYWNlCisgICAqICAgKGkuZS4sIGlmIGl0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGBmYWNlLT5jaGFybWFwc2AgdGFibGUpLgorICAgKgorICAgKiAgIEl0IGFsc28gZmFpbHMgaWYgYW4gT3BlblR5cGUgdHlwZX4xNCBjaGFybWFwIGlzIHNlbGVjdGVkICh3aGljaAorICAgKiAgIGRvZXNuJ3QgbWFwIGNoYXJhY3RlciBjb2RlcyB0byBnbHlwaCBpbmRpY2VzIGF0IGFsbCkuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU2V0X0NoYXJtYXAoIEZUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICBGVF9DaGFyTWFwICBjaGFybWFwICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX0dldF9DaGFybWFwX0luZGV4CkBAIC0zNjUxLDEzOSArMzY3MiwxNDMgQEAKICAgICoKICAgICogQHJldHVybjoKICAgICogICBUaGUgaW5kZXggaW50byB0aGUgYXJyYXkgb2YgY2hhcmFjdGVyIG1hcHMgd2l0aGluIHRoZSBmYWNlIHRvIHdoaWNoCi0gICAqICAgYGNoYXJtYXAnIGJlbG9uZ3MuICBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIGlzIHJldHVybmVkLgorICAgKiAgIGBjaGFybWFwYCBiZWxvbmdzLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSBpcyByZXR1cm5lZC4KICAgICoKICAgICovCiAgIEZUX0VYUE9SVCggRlRfSW50ICkKICAgRlRfR2V0X0NoYXJtYXBfSW5kZXgoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFRoaXMgZnVuY3Rpb24gICAqLwotICAvKiAgICB1c2VzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2hhcm1hcCB0byBkbyB0aGUgbWFwcGluZy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB1c2UgRnJlZVR5cGUgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgZm9udCBmaWxlcyAgICAgICAqLwotICAvKiAgICBkaXJlY3RseSwgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAgKi8KLSAgLyogICAgZG9lc24ndCBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgaW5kaWNlcyB1c2VkIHdpdGhpbiB0aGUgICovCi0gIC8qICAgIGZpbGUuICBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gICAqLwotICAvKiAgICB0aGUgYG1pc3NpbmcgZ2x5cGgnLiAgSWYgdGhlIGZpcnN0IGdseXBoIGlzIG5vdCBuYW1lZCBgLm5vdGRlZicsICAgKi8KLSAgLyogICAgdGhlbiBmb3IgVHlwZX4xIGFuZCBUeXBlfjQyIGZvbnRzLCBgLm5vdGRlZicgd2lsbCBiZSBtb3ZlZCBpbnRvICAgICovCi0gIC8qICAgIHRoZSBnbHlwaCBJRH4wIHBvc2l0aW9uLCBhbmQgd2hhdGV2ZXIgd2FzIHRoZXJlIHdpbGwgYmUgbW92ZWQgdG8gICAqLwotICAvKiAgICB0aGUgcG9zaXRpb24gYC5ub3RkZWYnIGhhZC4gIEZvciBUeXBlfjEgZm9udHMsIGlmIHRoZXJlIGlzIG5vICAgICAgKi8KLSAgLyogICAgYC5ub3RkZWYnIGdseXBoIGF0IGFsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkIGF0IGluZGV4fjAgYW5kICAgICovCi0gIC8qICAgIHdoYXRldmVyIHdhcyB0aGVyZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSBsYXN0IGluZGV4IC0tIFR5cGV+NDIgICAgICAqLwotICAvKiAgICBmb250cyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkIHVuZGVyIHRoaXMgY29uZGl0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X0NoYXJfSW5kZXgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFRoaXMgZnVuY3Rpb24gdXNlcworICAgKiAgIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY2hhcm1hcCB0byBkbyB0aGUgbWFwcGluZy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgY2hhcmNvZGUgOjoKKyAgICogICAgIFRoZSBjaGFyYWN0ZXIgY29kZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgZ2x5cGggaW5kZXguICAwfm1lYW5zICd1bmRlZmluZWQgY2hhcmFjdGVyIGNvZGUnLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB5b3UgdXNlIEZyZWVUeXBlIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIGZvbnQgZmlsZXMgZGlyZWN0bHksCisgICAqICAgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFsd2F5cworICAgKiAgIGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIGluZGljZXMgdXNlZCB3aXRoaW4gdGhlIGZpbGUuICBUaGlzIGlzIGRvbmUKKyAgICogICB0byBlbnN1cmUgdGhhdCB2YWx1ZX4wIGFsd2F5cyBjb3JyZXNwb25kcyB0byB0aGUgJ21pc3NpbmcgZ2x5cGgnLiAgSWYKKyAgICogICB0aGUgZmlyc3QgZ2x5cGggaXMgbm90IG5hbWVkICcubm90ZGVmJywgdGhlbiBmb3IgVHlwZX4xIGFuZCBUeXBlfjQyCisgICAqICAgZm9udHMsICcubm90ZGVmJyB3aWxsIGJlIG1vdmVkIGludG8gdGhlIGdseXBoIElEfjAgcG9zaXRpb24sIGFuZAorICAgKiAgIHdoYXRldmVyIHdhcyB0aGVyZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSBwb3NpdGlvbiAnLm5vdGRlZicgaGFkLiAgRm9yCisgICAqICAgVHlwZX4xIGZvbnRzLCBpZiB0aGVyZSBpcyBubyAnLm5vdGRlZicgZ2x5cGggYXQgYWxsLCB0aGVuIG9uZSB3aWxsIGJlCisgICAqICAgY3JlYXRlZCBhdCBpbmRleH4wIGFuZCB3aGF0ZXZlciB3YXMgdGhlcmUgd2lsbCBiZSBtb3ZlZCB0byB0aGUgbGFzdAorICAgKiAgIGluZGV4IC0tIFR5cGV+NDIgZm9udHMgYXJlIGNvbnNpZGVyZWQgaW52YWxpZCB1bmRlciB0aGlzIGNvbmRpdGlvbi4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfVUludCApCiAgIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0ZpcnN0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgY3VycmVudCBjaGFybWFwIG9mIGEgZ2l2ZW4gICovCi0gIC8qICAgIGZhY2UsIHRvZ2V0aGVyIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnaW5kZXggOjogR2x5cGggaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY2hhcm1hcCdzIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHRvZ2V0aGVyIHdpdGggQEZUX0dldF9OZXh0X0NoYXIgdG8gICAgKi8KLSAgLyogICAgcGFyc2UgYWxsIGNoYXJhY3RlciBjb2RlcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBjaGFybWFwLiAgVGhlIGNvZGUgICovCi0gIC8qICAgIHNob3VsZCBsb29rIGxpa2UgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1VJbnQgICBnaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGNoYXJjb2RlID0gRlRfR2V0X0ZpcnN0X0NoYXIoIGZhY2UsICZnaW5kZXggKTsgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB3aGlsZSAoIGdpbmRleCAhPSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIChjaGFyY29kZSxnaW5kZXgpIHBhaXIgLi4uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoIGZhY2UsIGNoYXJjb2RlLCAmZ2luZGV4ICk7ICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZSBhd2FyZSB0aGF0IGNoYXJhY3RlciBjb2RlcyBjYW4gaGF2ZSB2YWx1ZXMgdXAgdG8gMHhGRkZGRkZGRjsgICAgKi8KLSAgLyogICAgdGhpcyBtaWdodCBoYXBwZW4gZm9yIG5vbi1Vbmljb2RlIG9yIG1hbGZvcm1lZCBjbWFwcy4gIEhvd2V2ZXIsICAgICovCi0gIC8qICAgIGV2ZW4gd2l0aCByZWd1bGFyIFVuaWNvZGUgZW5jb2RpbmcsIHNvLWNhbGxlZCBgbGFzdCByZXNvcnQgZm9udHMnICAqLwotICAvKiAgICAodXNpbmcgU0ZOVCBjbWFwIGZvcm1hdCAxMywgc2VlIGZ1bmN0aW9uIEBGVF9HZXRfQ01hcF9Gb3JtYXQpICAgICAgKi8KLSAgLyogICAgbm9ybWFsbHkgaGF2ZSBlbnRyaWVzIGZvciBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzIHVwIHRvIDB4MUZGRkZGLCAgICovCi0gIC8qICAgIHdoaWNoIGNhbiBjYXVzZSAqYSBsb3QqIG9mIGl0ZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGAqYWdpbmRleCcgaXMgc2V0IHRvfjAgaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkuICBUaGUgICAgICovCi0gIC8qICAgIHJlc3VsdCBpdHNlbGYgY2FuIGJlfjAgaW4gdHdvIGNhc2VzOiBpZiB0aGUgY2hhcm1hcCBpcyBlbXB0eSBvciAgICAqLwotICAvKiAgICBpZiB0aGUgdmFsdWV+MCBpcyB0aGUgZmlyc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X0ZpcnN0X0NoYXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuCisgICAqICAgZmFjZSwgdG9nZXRoZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYWdpbmRleCA6OgorICAgKiAgICAgR2x5cGggaW5kZXggb2YgZmlyc3QgY2hhcmFjdGVyIGNvZGUuICAwfmlmIGNoYXJtYXAgaXMgZW1wdHkuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIGNoYXJtYXAncyBmaXJzdCBjaGFyYWN0ZXIgY29kZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB0b2dldGhlciB3aXRoIEBGVF9HZXRfTmV4dF9DaGFyIHRvIHBhcnNlCisgICAqICAgYWxsIGNoYXJhY3RlciBjb2RlcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBjaGFybWFwLiAgVGhlIGNvZGUgc2hvdWxkCisgICAqICAgbG9vayBsaWtlIHRoaXM6CisgICAqCisgICAqICAgYGBgCisgICAqICAgICBGVF9VTG9uZyAgY2hhcmNvZGU7CisgICAqICAgICBGVF9VSW50ICAgZ2luZGV4OworICAgKgorICAgKgorICAgKiAgICAgY2hhcmNvZGUgPSBGVF9HZXRfRmlyc3RfQ2hhciggZmFjZSwgJmdpbmRleCApOworICAgKiAgICAgd2hpbGUgKCBnaW5kZXggIT0gMCApCisgICAqICAgICB7CisgICAqICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCAoY2hhcmNvZGUsZ2luZGV4KSBwYWlyIC4uLgorICAgKgorICAgKiAgICAgICBjaGFyY29kZSA9IEZUX0dldF9OZXh0X0NoYXIoIGZhY2UsIGNoYXJjb2RlLCAmZ2luZGV4ICk7CisgICAqICAgICB9CisgICAqICAgYGBgCisgICAqCisgICAqICAgQmUgYXdhcmUgdGhhdCBjaGFyYWN0ZXIgY29kZXMgY2FuIGhhdmUgdmFsdWVzIHVwIHRvIDB4RkZGRkZGRkY7IHRoaXMKKyAgICogICBtaWdodCBoYXBwZW4gZm9yIG5vbi1Vbmljb2RlIG9yIG1hbGZvcm1lZCBjbWFwcy4gIEhvd2V2ZXIsIGV2ZW4gd2l0aAorICAgKiAgIHJlZ3VsYXIgVW5pY29kZSBlbmNvZGluZywgc28tY2FsbGVkICdsYXN0IHJlc29ydCBmb250cycgKHVzaW5nIFNGTlQKKyAgICogICBjbWFwIGZvcm1hdCAxMywgc2VlIGZ1bmN0aW9uIEBGVF9HZXRfQ01hcF9Gb3JtYXQpIG5vcm1hbGx5IGhhdmUKKyAgICogICBlbnRyaWVzIGZvciBhbGwgVW5pY29kZSBjaGFyYWN0ZXJzIHVwIHRvIDB4MUZGRkZGLCB3aGljaCBjYW4gY2F1c2UgKmEKKyAgICogICBsb3QqIG9mIGl0ZXJhdGlvbnMuCisgICAqCisgICAqICAgTm90ZSB0aGF0IGAqYWdpbmRleGAgaXMgc2V0IHRvfjAgaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkuICBUaGUgcmVzdWx0CisgICAqICAgaXRzZWxmIGNhbiBiZX4wIGluIHR3byBjYXNlczogaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkgb3IgaWYgdGhlCisgICAqICAgdmFsdWV+MCBpcyB0aGUgZmlyc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX1VMb25nICkKICAgRlRfR2V0X0ZpcnN0X0NoYXIoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFnaW5kZXggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OZXh0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbmV4dCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgY3VycmVudCBjaGFybWFwIG9mIGEgZ2l2ZW4gICAqLwotICAvKiAgICBmYWNlIGZvbGxvd2luZyB0aGUgdmFsdWUgYGNoYXJfY29kZScsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogICAgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2NvZGUgOjogVGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2luZGV4ICAgOjogR2x5cGggaW5kZXggb2YgbmV4dCBjaGFyYWN0ZXIgY29kZS4gIDB+aWYgY2hhcm1hcCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGlzIGVtcHR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNoYXJtYXAncyBuZXh0IGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIEBGVF9HZXRfRmlyc3RfQ2hhciB0byB3YWxrICAgICAgICovCi0gIC8qICAgIG92ZXIgYWxsIGNoYXJhY3RlciBjb2RlcyBhdmFpbGFibGUgaW4gYSBnaXZlbiBjaGFybWFwLiAgU2VlIHRoZSAgICAqLwotICAvKiAgICBub3RlIGZvciB0aGF0IGZ1bmN0aW9uIGZvciBhIHNpbXBsZSBjb2RlIGV4YW1wbGUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBgKmFnaW5kZXgnIGlzIHNldCB0b34wIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgY29kZXMgaW4gICAqLwotICAvKiAgICB0aGUgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X05leHRfQ2hhcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBuZXh0IGNoYXJhY3RlciBjb2RlIGluIHRoZSBjdXJyZW50IGNoYXJtYXAgb2YgYSBnaXZlbiBmYWNlCisgICAqICAgZm9sbG93aW5nIHRoZSB2YWx1ZSBgY2hhcl9jb2RlYCwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBnbHlwaAorICAgKiAgIGluZGV4LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBjaGFyX2NvZGUgOjoKKyAgICogICAgIFRoZSBzdGFydGluZyBjaGFyYWN0ZXIgY29kZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhZ2luZGV4IDo6CisgICAqICAgICBHbHlwaCBpbmRleCBvZiBuZXh0IGNoYXJhY3RlciBjb2RlLiAgMH5pZiBjaGFybWFwIGlzIGVtcHR5LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSBjaGFybWFwJ3MgbmV4dCBjaGFyYWN0ZXIgY29kZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIEBGVF9HZXRfRmlyc3RfQ2hhciB0byB3YWxrIG92ZXIgYWxsCisgICAqICAgY2hhcmFjdGVyIGNvZGVzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGNoYXJtYXAuICBTZWUgdGhlIG5vdGUgZm9yIHRoYXQKKyAgICogICBmdW5jdGlvbiBmb3IgYSBzaW1wbGUgY29kZSBleGFtcGxlLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBgKmFnaW5kZXhgIGlzIHNldCB0b34wIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgY29kZXMgaW4gdGhlCisgICAqICAgY2hhcm1hcC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfVUxvbmcgKQogICBGVF9HZXRfTmV4dF9DaGFyKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY2hhcl9jb2RlLAogICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFnaW5kZXggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfRmFjZV9Qcm9wZXJ0aWVzCkBAIC0zNzkxLDI3ICszODE2LDI2IEBACiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBTZXQgb3Igb3ZlcnJpZGUgY2VydGFpbiAobGlicmFyeSBvciBtb2R1bGUtd2lkZSkgcHJvcGVydGllcyBvbiBhCiAgICAqICAgZmFjZS1ieS1mYWNlIGJhc2lzLiAgVXNlZnVsIGZvciBmaW5lci1ncmFpbmVkIGNvbnRyb2wgYW5kIGF2b2lkaW5nCi0gICAqICAgbG9ja3Mgb24gc2hhcmVkIHN0cnVjdHVyZXMgKHRocmVhZHMgY2FuIG1vZGlmeSB0aGVpciBvd24gZmFjZXMgYXMKLSAgICogICB0aGV5IHNlZSBmaXQpLgorICAgKiAgIGxvY2tzIG9uIHNoYXJlZCBzdHJ1Y3R1cmVzICh0aHJlYWRzIGNhbiBtb2RpZnkgdGhlaXIgb3duIGZhY2VzIGFzIHRoZXkKKyAgICogICBzZWUgZml0KS4KICAgICoKLSAgICogICBDb250cmFyeSB0byBARlRfUHJvcGVydHlfU2V0LCB0aGlzIGZ1bmN0aW9uIHVzZXMgQEZUX1BhcmFtZXRlciBzbwotICAgKiAgIHRoYXQgeW91IGNhbiBwYXNzIG11bHRpcGxlIHByb3BlcnRpZXMgdG8gdGhlIHRhcmdldCBmYWNlIGluIG9uZSBjYWxsLgotICAgKiAgIE5vdGUgdGhhdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBjYW4gYmUKLSAgICogICBjb250cm9sbGVkLgorICAgKiAgIENvbnRyYXJ5IHRvIEBGVF9Qcm9wZXJ0eV9TZXQsIHRoaXMgZnVuY3Rpb24gdXNlcyBARlRfUGFyYW1ldGVyIHNvIHRoYXQKKyAgICogICB5b3UgY2FuIHBhc3MgbXVsdGlwbGUgcHJvcGVydGllcyB0byB0aGUgdGFyZ2V0IGZhY2UgaW4gb25lIGNhbGwuICBOb3RlCisgICAqICAgdGhhdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcyBjYW4gYmUgY29udHJvbGxlZC4KICAgICoKICAgICogICAqIEBGVF9QQVJBTV9UQUdfU1RFTV9EQVJLRU5JTkcgKHN0ZW0gZGFya2VuaW5nLCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAgKiAgICAgcHJvcGVydHkgYG5vLXN0ZW0tZGFya2VuaW5nJyBwcm92aWRlZCBieSB0aGUgYGF1dG9maXQnLCBgY2ZmJywKLSAgICogICAgIGB0eXBlMScsIGFuZCBgdDFjaWQnIG1vZHVsZXM7IHNlZSBAbm8tc3RlbS1kYXJrZW5pbmcpLgorICAgKiAgICAgcHJvcGVydHkgYG5vLXN0ZW0tZGFya2VuaW5nYCBwcm92aWRlZCBieSB0aGUgJ2F1dG9maXQnLCAnY2ZmJywKKyAgICogICAgICd0eXBlMScsIGFuZCAndDFjaWQnIG1vZHVsZXM7IHNlZSBAbm8tc3RlbS1kYXJrZW5pbmcpLgogICAgKgogICAgKiAgICogQEZUX1BBUkFNX1RBR19MQ0RfRklMVEVSX1dFSUdIVFMgKExDRCBmaWx0ZXIgd2VpZ2h0cywgY29ycmVzcG9uZGluZwogICAgKiAgICAgdG8gZnVuY3Rpb24gQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cykuCiAgICAqCiAgICAqICAgKiBARlRfUEFSQU1fVEFHX1JBTkRPTV9TRUVEIChzZWVkIHZhbHVlIGZvciB0aGUgQ0ZGLCBUeXBlfjEsIGFuZCBDSUQKLSAgICogICAgIGByYW5kb20nIG9wZXJhdG9yLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBgcmFuZG9tLXNlZWQnIHByb3BlcnR5Ci0gICAqICAgICBwcm92aWRlZCBieSB0aGUgYGNmZicsIGB0eXBlMScsIGFuZCBgdDFjaWQnIG1vZHVsZXM7IHNlZQorICAgKiAgICAgJ3JhbmRvbScgb3BlcmF0b3IsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGByYW5kb20tc2VlZGAgcHJvcGVydHkKKyAgICogICAgIHByb3ZpZGVkIGJ5IHRoZSAnY2ZmJywgJ3R5cGUxJywgYW5kICd0MWNpZCcgbW9kdWxlczsgc2VlCiAgICAqICAgICBAcmFuZG9tLXNlZWQpLgogICAgKgotICAgKiAgIFBhc3MgTlVMTCBhcyBgZGF0YScgaW4gQEZUX1BhcmFtZXRlciBmb3IgYSBnaXZlbiB0YWcgdG8gcmVzZXQgdGhlCisgICAqICAgUGFzcyBgTlVMTGAgYXMgYGRhdGFgIGluIEBGVF9QYXJhbWV0ZXIgZm9yIGEgZ2l2ZW4gdGFnIHRvIHJlc2V0IHRoZQogICAgKiAgIG9wdGlvbiBhbmQgdXNlIHRoZSBsaWJyYXJ5IG9yIG1vZHVsZSBkZWZhdWx0IGFnYWluLgogICAgKgogICAgKiBAaW5wdXQ6CkBAIC0zODIyLDE3ICszODQ2LDE3IEBACiAgICAqICAgICBUaGUgbnVtYmVyIG9mIHByb3BlcnRpZXMgdGhhdCBmb2xsb3cuCiAgICAqCiAgICAqICAgcHJvcGVydGllcyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gYW4gQEZUX1BhcmFtZXRlciBhcnJheSB3aXRoIGBudW1fcHJvcGVydGllcycgZWxlbWVudHMuCisgICAqICAgICBBIGhhbmRsZSB0byBhbiBARlRfUGFyYW1ldGVyIGFycmF5IHdpdGggYG51bV9wcm9wZXJ0aWVzYCBlbGVtZW50cy4KICAgICoKICAgICogQHJldHVybjoKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgotICAgKiBAbm90ZToKLSAgICogICBIZXJlIGFuIGV4YW1wbGUgdGhhdCBzZXRzIHRocmVlIHByb3BlcnRpZXMuICBZb3UgbXVzdCBkZWZpbmUKLSAgICogICBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyB0byBtYWtlIHRoZSBMQ0QgZmlsdGVyIGV4YW1wbGVzCisgICAqIEBleGFtcGxlOgorICAgKiAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0aGF0IHNldHMgdGhyZWUgcHJvcGVydGllcy4gIFlvdSBtdXN0IGRlZmluZQorICAgKiAgIGBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklOR2AgdG8gbWFrZSB0aGUgTENEIGZpbHRlciBleGFtcGxlcwogICAgKiAgIHdvcmsuCiAgICAqCi0gICAqICAgeworICAgKiAgIGBgYAogICAgKiAgICAgRlRfUGFyYW1ldGVyICAgICAgICAgcHJvcGVydHkxOwogICAgKiAgICAgRlRfQm9vbCAgICAgICAgICAgICAgZGFya2VuX3N0ZW1zID0gMTsKICAgICoKQEAgLTM4NTgsMTEgKzM4ODIsMTEgQEAKICAgICogICAgIHByb3BlcnR5My5kYXRhID0gJnJhbmRvbV9zZWVkOwogICAgKgogICAgKiAgICAgRlRfRmFjZV9Qcm9wZXJ0aWVzKCBmYWNlLCAzLCBwcm9wZXJ0aWVzICk7Ci0gICAqICAgfQorICAgKiAgIGBgYAogICAgKgogICAgKiAgIFRoZSBuZXh0IGV4YW1wbGUgcmVzZXRzIGEgc2luZ2xlIHByb3BlcnR5IHRvIGl0cyBkZWZhdWx0IHZhbHVlLgogICAgKgotICAgKiAgIHsKKyAgICogICBgYGAKICAgICogICAgIEZUX1BhcmFtZXRlciAgcHJvcGVydHk7CiAgICAqCiAgICAqCkBAIC0zODcwLDcgKzM4OTQsNyBAQAogICAgKiAgICAgcHJvcGVydHkuZGF0YSA9IE5VTEw7CiAgICAqCiAgICAqICAgICBGVF9GYWNlX1Byb3BlcnRpZXMoIGZhY2UsIDEsICZwcm9wZXJ0eSApOwotICAgKiAgIH0KKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuOApAQCAtMzg4MiwzNyArMzkwNiw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHByb3BlcnRpZXMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OYW1lX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBnbHlwaCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbmFtZSA6OiBUaGUgZ2x5cGggbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVF9HZXRfTmFtZV9JbmRleCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgotICAgKiBAbWFjcm86CisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfTmFtZV9JbmRleAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGdseXBoIG5hbWUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGdseXBoX25hbWUgOjoKKyAgICogICAgIFRoZSBnbHlwaCBuYW1lLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgJ3VuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuCisgICAqLworICBGVF9FWFBPUlQoIEZUX1VJbnQgKQorICBGVF9HZXRfTmFtZV9JbmRleCggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKICAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hYWAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyBkZXNjcmliaW5nIHN1YmdseXBocy4gIFBsZWFzZSByZWZlciB0byB0aGUKLSAgICogICBgZ2x5ZicgdGFibGUgZGVzY3JpcHRpb24gaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gZm9yIHRoZQotICAgKiAgIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgZmxhZ3MgKHdoaWNoIGdldCBzeW50aGVzaXplZCBmb3IKLSAgICogICBub24tT3BlblR5cGUgc3ViZ2x5cGhzKS4KKyAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIGRlc2NyaWJpbmcgc3ViZ2x5cGhzLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSAnZ2x5ZicKKyAgICogICB0YWJsZSBkZXNjcmlwdGlvbiBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCisgICAqICAgdmFyaW91cyBmbGFncyAod2hpY2ggZ2V0IHN5bnRoZXNpemVkIGZvciBub24tT3BlblR5cGUgc3ViZ2x5cGhzKS4KKyAgICoKKyAgICogICAgIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3R5cG9ncmFwaHkvb3BlbnR5cGUvc3BlYy9nbHlmI2NvbXBvc2l0ZS1nbHlwaC1kZXNjcmlwdGlvbgogICAgKgogICAgKiBAdmFsdWVzOgogICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfV09SRFMgOjoKQEAgLTM5MzMsMTUgKzM5NjAsMTUgQEAKICNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyAgICAgIDB4MjAwCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKLSAgICogQGZ1bmM6CisgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9HZXRfU3ViR2x5cGhfSW5mbwogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgUmV0cmlldmUgYSBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIHN1YmdseXBoLiAgT25seSB1c2UgaXQgaWYKLSAgICogICBgZ2x5cGgtPmZvcm1hdCcgaXMgQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEU7IGFuIGVycm9yIGlzCi0gICAqICAgcmV0dXJuZWQgb3RoZXJ3aXNlLgorICAgKiAgIGBnbHlwaC0+Zm9ybWF0YCBpcyBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsgYW4gZXJyb3IgaXMgcmV0dXJuZWQKKyAgICogICBvdGhlcndpc2UuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBnbHlwaCA6OgpAQCAtMzk0OSw3ICszOTc2LDcgQEAKICAgICoKICAgICogICBzdWJfaW5kZXggOjoKICAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgc3ViZ2x5cGguICBNdXN0IGJlIGxlc3MgdGhhbgotICAgKiAgICAgYGdseXBoLT5udW1fc3ViZ2x5cGhzJy4KKyAgICogICAgIGBnbHlwaC0+bnVtX3N1YmdseXBoc2AuCiAgICAqCiAgICAqIEBvdXRwdXQ6CiAgICAqICAgcF9pbmRleCA6OgpAQCAtMzk3MSwxMCArMzk5OCwxMiBAQAogICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoZSB2YWx1ZXMgb2YgYCpwX2FyZzEnLCBgKnBfYXJnMicsIGFuZCBgKnBfdHJhbnNmb3JtJyBtdXN0IGJlCi0gICAqICAgaW50ZXJwcmV0ZWQgZGVwZW5kaW5nIG9uIHRoZSBmbGFncyByZXR1cm5lZCBpbiBgKnBfZmxhZ3MnLiAgU2VlIHRoZQorICAgKiAgIFRoZSB2YWx1ZXMgb2YgYCpwX2FyZzFgLCBgKnBfYXJnMmAsIGFuZCBgKnBfdHJhbnNmb3JtYCBtdXN0IGJlCisgICAqICAgaW50ZXJwcmV0ZWQgZGVwZW5kaW5nIG9uIHRoZSBmbGFncyByZXR1cm5lZCBpbiBgKnBfZmxhZ3NgLiAgU2VlIHRoZQogICAgKiAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMuCiAgICAqCisgICAqICAgICBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy90eXBvZ3JhcGh5L29wZW50eXBlL3NwZWMvZ2x5ZiNjb21wb3NpdGUtZ2x5cGgtZGVzY3JpcHRpb24KKyAgICoKICAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfU3ViR2x5cGhfSW5mbyggRlRfR2x5cGhTbG90ICBnbHlwaCwKQEAgLTM5ODYsNTkgKzQwMTUsMjI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgKnBfdHJhbnNmb3JtICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGBmc1R5cGUnIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlICAgKi8KLSAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250IGFuZCB0aGUgYEZTVHlwZScgZW50cnkgaW4gYSAgICAgICAgICovCi0gIC8qICAgIFBvc3RTY3JpcHQgZm9udC4gIFRoZXNlIGJpdCBmbGFncyBhcmUgcmV0dXJuZWQgYnkgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfR2V0X0ZTVHlwZV9GbGFnczsgdGhleSBpbmZvcm0gY2xpZW50IGFwcGxpY2F0aW9ucyBvZiBlbWJlZGRpbmcgKi8KLSAgLyogICAgYW5kIHN1YnNldHRpbmcgcmVzdHJpY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhIGZvbnQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaHR0cHM6Ly93d3cuYWRvYmUuY29tL2NvbnRlbnQvZGFtL0Fkb2JlL2VuL2Rldm5ldC9hY3JvYmF0L3BkZnMvRm9udFBvbGljaWVzLnBkZiAqLwotICAvKiAgICBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfSU5TVEFMTEFCTEVfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGb250cyB3aXRoIG5vIGZzVHlwZSBiaXQgc2V0IG1heSBiZSBlbWJlZGRlZCBhbmQgcGVybWFuZW50bHkgICAgICovCi0gIC8qICAgICAgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgc3lzdGVtIGJ5IGFuIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1JFU1RSSUNURURfTElDRU5TRV9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRm9udHMgdGhhdCBoYXZlIG9ubHkgdGhpcyBiaXQgc2V0IG11c3Qgbm90IGJlIG1vZGlmaWVkLCBlbWJlZGRlZCAqLwotICAvKiAgICAgIG9yIGV4Y2hhbmdlZCBpbiBhbnkgbWFubmVyIHdpdGhvdXQgZmlyc3Qgb2J0YWluaW5nIHBlcm1pc3Npb24gb2YgKi8KLSAgLyogICAgICB0aGUgZm9udCBzb2Z0d2FyZSBjb3B5cmlnaHQgb3duZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfUFJFVklFV19BTkRfUFJJTlRfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZm9udCBtYXkgYmUgZW1iZWRkZWQgYW5kIHRlbXBvcmFyaWx5IGxvYWRlZCBvbiB0aGUgcmVtb3RlICAgICovCi0gIC8qICAgICAgc3lzdGVtLiAgRG9jdW1lbnRzIGNvbnRhaW5pbmcgUHJldmlldyAmIFByaW50IGZvbnRzIG11c3QgYmUgICAgICAqLwotICAvKiAgICAgIG9wZW5lZCBgcmVhZC1vbmx5Jzsgbm8gZWRpdHMgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9FRElUQUJMRV9FTUJFRERJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmb250IG1heSBiZSBlbWJlZGRlZCBidXQgbXVzdCBvbmx5IGJlIGluc3RhbGxlZCB0ZW1wb3JhcmlseSAgKi8KLSAgLyogICAgICBvbiBvdGhlciBzeXN0ZW1zLiAgSW4gY29udHJhc3QgdG8gUHJldmlldyAmIFByaW50IGZvbnRzLCAgICAgICAgICovCi0gIC8qICAgICAgZG9jdW1lbnRzIGNvbnRhaW5pbmcgZWRpdGFibGUgZm9udHMgbWF5IGJlIG9wZW5lZCBmb3IgcmVhZGluZywgICAqLwotICAvKiAgICAgIGVkaXRpbmcgaXMgcGVybWl0dGVkLCBhbmQgY2hhbmdlcyBtYXkgYmUgc2F2ZWQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9OT19TVUJTRVRUSU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmb250IG1heSBub3QgYmUgc3Vic2V0dGVkIHByaW9yIHRvIGVtYmVkZGluZy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9CSVRNQVBfRU1CRURESU5HX09OTFkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIE9ubHkgYml0bWFwcyBjb250YWluZWQgaW4gdGhlIGZvbnQgbWF5IGJlIGVtYmVkZGVkOyBubyBvdXRsaW5lICAgKi8KLSAgLyogICAgICBkYXRhIG1heSBiZSBlbWJlZGRlZC4gIElmIHRoZXJlIGFyZSBubyBiaXRtYXBzIGF2YWlsYWJsZSBpbiB0aGUgICovCi0gIC8qICAgICAgZm9udCwgdGhlbiB0aGUgZm9udCBpcyB1bmVtYmVkZGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmbGFncyBhcmUgT1JlZCB0b2dldGhlciwgdGh1cyBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUgY2FuIGJlICAqLwotICAvKiAgICByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoaWxlIHRoZSBgZnNUeXBlJyBmbGFncyBjYW4gaW5kaWNhdGUgdGhhdCBhIGZvbnQgbWF5IGJlIGVtYmVkZGVkLCAqLwotICAvKiAgICBhIGxpY2Vuc2Ugd2l0aCB0aGUgZm9udCB2ZW5kb3IgbWF5IGJlIHNlcGFyYXRlbHkgcmVxdWlyZWQgdG8gdXNlICAgKi8KLSAgLyogICAgdGhlIGZvbnQgaW4gdGhpcyB3YXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgbGF5ZXJfbWFuYWdlbWVudAorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgR2x5cGggTGF5ZXIgTWFuYWdlbWVudAorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgUmV0cmlldmluZyBhbmQgbWFuaXB1bGF0aW5nIE9wZW5UeXBlJ3MgJ0NPTFInIHRhYmxlIGRhdGEuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBoZXJlIGFsbG93IGFjY2VzcyBvZiBjb2xvcmVkIGdseXBoIGxheWVyIGRhdGEKKyAgICogICBpbiBPcGVuVHlwZSdzICdDT0xSJyB0YWJsZXMuCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTGF5ZXJJdGVyYXRvcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBpdGVyYXRvciBvYmplY3QgaXMgbmVlZGVkIGZvciBARlRfR2V0X0NvbG9yX0dseXBoX0xheWVyLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG51bV9sYXllcnMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZ2x5cGggbGF5ZXJzIGZvciB0aGUgcmVxdWVzdGVkIGdseXBoIGluZGV4LiAgV2lsbCBiZQorICAgKiAgICAgc2V0IGJ5IEBGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIuCisgICAqCisgICAqICAgbGF5ZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGxheWVyLiAgV2lsbCBiZSBzZXQgYnkgQEZUX0dldF9Db2xvcl9HbHlwaF9MYXllci4KKyAgICoKKyAgICogICBwIDo6CisgICAqICAgICBBbiBvcGFxdWUgcG9pbnRlciBpbnRvICdDT0xSJyB0YWJsZSBkYXRhLiAgVGhlIGNhbGxlciBtdXN0IHNldCB0aGlzCisgICAqICAgICB0byBgTlVMTGAgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIG9mIEBGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIuCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfTGF5ZXJJdGVyYXRvcl8KKyAgeworICAgIEZUX1VJbnQgICBudW1fbGF5ZXJzOworICAgIEZUX1VJbnQgICBsYXllcjsKKyAgICBGVF9CeXRlKiAgcDsKKworICB9IEZUX0xheWVySXRlcmF0b3I7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9Db2xvcl9HbHlwaF9MYXllcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlICdDT0xSJyB0YWJsZSBpbiBPcGVuVHlwZSBmb250cyB0bworICAgKiAgIGl0ZXJhdGl2ZWx5IHJldHJpZXZlIHRoZSBjb2xvcmVkIGdseXBoIGxheWVycyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAqICAgY3VycmVudCBnbHlwaCBzbG90LgorICAgKgorICAgKiAgICAgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvdHlwb2dyYXBoeS9vcGVudHlwZS9zcGVjL2NvbHIKKyAgICoKKyAgICogICBUaGUgZ2x5cGggbGF5ZXIgZGF0YSBmb3IgYSBnaXZlbiBnbHlwaCBpbmRleCwgaWYgcHJlc2VudCwgcHJvdmlkZXMgYW4KKyAgICogICBhbHRlcm5hdGl2ZSwgbXVsdGktY29sb3IgZ2x5cGggcmVwcmVzZW50YXRpb246IEluc3RlYWQgb2YgcmVuZGVyaW5nCisgICAqICAgdGhlIG91dGxpbmUgb3IgYml0bWFwIHdpdGggdGhlIGdpdmVuIGdseXBoIGluZGV4LCBnbHlwaHMgd2l0aCB0aGUKKyAgICogICBpbmRpY2VzIGFuZCBjb2xvcnMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBhcmUgcmVuZGVyZWQgbGF5ZXIgYnkKKyAgICogICBsYXllci4KKyAgICoKKyAgICogICBUaGUgcmV0dXJuZWQgZWxlbWVudHMgYXJlIG9yZGVyZWQgaW4gdGhlIHp+ZGlyZWN0aW9uIGZyb20gYm90dG9tIHRvCisgICAqICAgdG9wOyB0aGUgJ24ndGggZWxlbWVudCBzaG91bGQgYmUgcmVuZGVyZWQgd2l0aCB0aGUgYXNzb2NpYXRlZCBwYWxldHRlCisgICAqICAgY29sb3IgYW5kIGJsZW5kZWQgb24gdG9wIG9mIHRoZSBhbHJlYWR5IHJlbmRlcmVkIGxheWVycyAoZWxlbWVudHMgMCwKKyAgICogICAxLCAuLi4sIG4tMSkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGJhc2VfZ2x5cGggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCB0aGUgY29sb3JlZCBnbHlwaCBsYXllcnMgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGl0ZXJhdG9yIDo6CisgICAqICAgICBBbiBARlRfTGF5ZXJJdGVyYXRvciBvYmplY3QuICBGb3IgdGhlIGZpcnN0IGNhbGwgeW91IHNob3VsZCBzZXQKKyAgICogICAgIGBpdGVyYXRvci0+cGAgdG8gYE5VTExgLiAgRm9yIGFsbCBmb2xsb3dpbmcgY2FsbHMsIHNpbXBseSB1c2UgdGhlCisgICAqICAgICBzYW1lIG9iamVjdCBhZ2Fpbi4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhZ2x5cGhfaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgY3VycmVudCBsYXllci4KKyAgICoKKyAgICogICBhY29sb3JfaW5kZXggOjoKKyAgICogICAgIFRoZSBjb2xvciBpbmRleCBpbnRvIHRoZSBmb250IGZhY2UncyBjb2xvciBwYWxldHRlIG9mIHRoZSBjdXJyZW50CisgICAqICAgICBsYXllci4gIFRoZSB2YWx1ZSAweEZGRkYgaXMgc3BlY2lhbDsgaXQgZG9lc24ndCByZWZlcmVuY2UgYSBwYWxldHRlCisgICAqICAgICBlbnRyeSBidXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgZm9yZWdyb3VuZCBjb2xvciBzaG91bGQgYmUgdXNlZAorICAgKiAgICAgaW5zdGVhZCAodG8gYmUgc2V0IHVwIGJ5IHRoZSBhcHBsaWNhdGlvbiBvdXRzaWRlIG9mIEZyZWVUeXBlKS4KKyAgICoKKyAgICogICAgIFRoZSBjb2xvciBwYWxldHRlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBARlRfUGFsZXR0ZV9TZWxlY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVmFsdWV+MSBpZiBldmVyeXRoaW5nIGlzIE9LLiAgSWYgdGhlcmUgYXJlIG5vIG1vcmUgbGF5ZXJzIChvciBpZiB0aGVyZQorICAgKiAgIGFyZSBubyBsYXllcnMgYXQgYWxsKSwgdmFsdWV+MCBnZXRzIHJldHVybmVkLiAgSW4gY2FzZSBvZiBhbiBlcnJvciwKKyAgICogICB2YWx1ZX4wIGlzIHJldHVybmVkIGFsc28uCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGhhbmRsZSBnbHlwaCBsYXllcnMgYnkKKyAgICogICB5b3Vyc2VsZi4gIEluIHBhcnRpY3VsYXIsIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgd2l0aCBARlRfR2x5cGhSZWMKKyAgICogICBvYmplY3RzIChsaWtlIEBGVF9HZXRfR2x5cGggb3IgQEZUX0dseXBoX1RvX0JpdG1hcCkgZG9uJ3QgaGF2ZSBhY2Nlc3MKKyAgICogICB0byB0aGlzIGluZm9ybWF0aW9uLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCBARlRfUmVuZGVyX0dseXBoIGlzIGFibGUgdG8gaGFuZGxlIGNvbG9yZWQgZ2x5cGggbGF5ZXJzCisgICAqICAgYXV0b21hdGljYWxseSBpZiB0aGUgQEZUX0xPQURfQ09MT1IgZmxhZyBpcyBwYXNzZWQgdG8gYSBwcmV2aW91cyBjYWxsCisgICAqICAgdG8gQEZUX0xvYWRfR2x5cGguICBbVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS5dCisgICAqCisgICAqIEBleGFtcGxlOgorICAgKiAgIGBgYAorICAgKiAgICAgRlRfQ29sb3IqICAgICAgICAgcGFsZXR0ZTsKKyAgICogICAgIEZUX0xheWVySXRlcmF0b3IgIGl0ZXJhdG9yOworICAgKgorICAgKiAgICAgRlRfQm9vbCAgaGF2ZV9sYXllcnM7CisgICAqICAgICBGVF9VSW50ICBsYXllcl9nbHlwaF9pbmRleDsKKyAgICogICAgIEZUX1VJbnQgIGxheWVyX2NvbG9yX2luZGV4OworICAgKgorICAgKgorICAgKiAgICAgZXJyb3IgPSBGVF9QYWxldHRlX1NlbGVjdCggZmFjZSwgcGFsZXR0ZV9pbmRleCwgJnBhbGV0dGUgKTsKKyAgICogICAgIGlmICggZXJyb3IgKQorICAgKiAgICAgICBwYWxldHRlID0gTlVMTDsKKyAgICoKKyAgICogICAgIGl0ZXJhdG9yLnAgID0gTlVMTDsKKyAgICogICAgIGhhdmVfbGF5ZXJzID0gRlRfR2V0X0NvbG9yX0dseXBoX0xheWVyKCBmYWNlLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXllcl9nbHlwaF9pbmRleCwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF5ZXJfY29sb3JfaW5kZXgsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhdG9yICk7CisgICAqCisgICAqICAgICBpZiAoIHBhbGV0dGUgJiYgaGF2ZV9sYXllcnMgKQorICAgKiAgICAgeworICAgKiAgICAgICBkbworICAgKiAgICAgICB7CisgICAqICAgICAgICAgRlRfQ29sb3IgIGxheWVyX2NvbG9yOworICAgKgorICAgKgorICAgKiAgICAgICAgIGlmICggbGF5ZXJfY29sb3JfaW5kZXggPT0gMHhGRkZGICkKKyAgICogICAgICAgICAgIGxheWVyX2NvbG9yID0gdGV4dF9mb3JlZ3JvdW5kX2NvbG9yOworICAgKiAgICAgICAgIGVsc2UKKyAgICogICAgICAgICAgIGxheWVyX2NvbG9yID0gcGFsZXR0ZVtsYXllcl9jb2xvcl9pbmRleF07CisgICAqCisgICAqICAgICAgICAgLy8gTG9hZCBhbmQgcmVuZGVyIGdseXBoIGBsYXllcl9nbHlwaF9pbmRleCcsIHRoZW4KKyAgICogICAgICAgICAvLyBibGVuZCByZXN1bHRpbmcgcGl4bWFwICh1c2luZyBjb2xvciBgbGF5ZXJfY29sb3InKQorICAgKiAgICAgICAgIC8vIHdpdGggcHJldmlvdXNseSBjcmVhdGVkIHBpeG1hcHMuCisgICAqCisgICAqICAgICAgIH0gd2hpbGUgKCBGVF9HZXRfQ29sb3JfR2x5cGhfTGF5ZXIoIGZhY2UsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGF5ZXJfZ2x5cGhfaW5kZXgsCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXllcl9jb2xvcl9pbmRleCwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhdG9yICkgKTsKKyAgICogICAgIH0KKyAgICogICBgYGAKKyAgICovCisgIEZUX0VYUE9SVCggRlRfQm9vbCApCisgIEZUX0dldF9Db2xvcl9HbHlwaF9MYXllciggRlRfRmFjZSAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGJhc2VfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgKmFnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAqYWNvbG9yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xheWVySXRlcmF0b3IqICBpdGVyYXRvciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGJhc2VfaW50ZXJmYWNlCisgICAqCisgICAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9GU1RZUEVfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGBmc1R5cGVgIGZpZWxkIG9mIHRoZSBPUy8yIHRhYmxlIGluIGEKKyAgICogICBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250IGFuZCB0aGUgYEZTVHlwZWAgZW50cnkgaW4gYSBQb3N0U2NyaXB0IGZvbnQuCisgICAqICAgVGhlc2UgYml0IGZsYWdzIGFyZSByZXR1cm5lZCBieSBARlRfR2V0X0ZTVHlwZV9GbGFnczsgdGhleSBpbmZvcm0KKyAgICogICBjbGllbnQgYXBwbGljYXRpb25zIG9mIGVtYmVkZGluZyBhbmQgc3Vic2V0dGluZyByZXN0cmljdGlvbnMKKyAgICogICBhc3NvY2lhdGVkIHdpdGggYSBmb250LgorICAgKgorICAgKiAgIFNlZQorICAgKiAgIGh0dHBzOi8vd3d3LmFkb2JlLmNvbS9jb250ZW50L2RhbS9BZG9iZS9lbi9kZXZuZXQvYWNyb2JhdC9wZGZzL0ZvbnRQb2xpY2llcy5wZGYKKyAgICogICBmb3IgbW9yZSBkZXRhaWxzLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX0ZTVFlQRV9JTlNUQUxMQUJMRV9FTUJFRERJTkcgOjoKKyAgICogICAgIEZvbnRzIHdpdGggbm8gZnNUeXBlIGJpdCBzZXQgbWF5IGJlIGVtYmVkZGVkIGFuZCBwZXJtYW5lbnRseQorICAgKiAgICAgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUgc3lzdGVtIGJ5IGFuIGFwcGxpY2F0aW9uLgorICAgKgorICAgKiAgIEZUX0ZTVFlQRV9SRVNUUklDVEVEX0xJQ0VOU0VfRU1CRURESU5HIDo6CisgICAqICAgICBGb250cyB0aGF0IGhhdmUgb25seSB0aGlzIGJpdCBzZXQgbXVzdCBub3QgYmUgbW9kaWZpZWQsIGVtYmVkZGVkIG9yCisgICAqICAgICBleGNoYW5nZWQgaW4gYW55IG1hbm5lciB3aXRob3V0IGZpcnN0IG9idGFpbmluZyBwZXJtaXNzaW9uIG9mIHRoZQorICAgKiAgICAgZm9udCBzb2Z0d2FyZSBjb3B5cmlnaHQgb3duZXIuCisgICAqCisgICAqICAgRlRfRlNUWVBFX1BSRVZJRVdfQU5EX1BSSU5UX0VNQkVERElORyA6OgorICAgKiAgICAgVGhlIGZvbnQgbWF5IGJlIGVtYmVkZGVkIGFuZCB0ZW1wb3JhcmlseSBsb2FkZWQgb24gdGhlIHJlbW90ZQorICAgKiAgICAgc3lzdGVtLiAgRG9jdW1lbnRzIGNvbnRhaW5pbmcgUHJldmlldyAmIFByaW50IGZvbnRzIG11c3QgYmUgb3BlbmVkCisgICAqICAgICAncmVhZC1vbmx5Jzsgbm8gZWRpdHMgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50LgorICAgKgorICAgKiAgIEZUX0ZTVFlQRV9FRElUQUJMRV9FTUJFRERJTkcgOjoKKyAgICogICAgIFRoZSBmb250IG1heSBiZSBlbWJlZGRlZCBidXQgbXVzdCBvbmx5IGJlIGluc3RhbGxlZCB0ZW1wb3JhcmlseSBvbgorICAgKiAgICAgb3RoZXIgc3lzdGVtcy4gIEluIGNvbnRyYXN0IHRvIFByZXZpZXcgJiBQcmludCBmb250cywgZG9jdW1lbnRzCisgICAqICAgICBjb250YWluaW5nIGVkaXRhYmxlIGZvbnRzIG1heSBiZSBvcGVuZWQgZm9yIHJlYWRpbmcsIGVkaXRpbmcgaXMKKyAgICogICAgIHBlcm1pdHRlZCwgYW5kIGNoYW5nZXMgbWF5IGJlIHNhdmVkLgorICAgKgorICAgKiAgIEZUX0ZTVFlQRV9OT19TVUJTRVRUSU5HIDo6CisgICAqICAgICBUaGUgZm9udCBtYXkgbm90IGJlIHN1YnNldHRlZCBwcmlvciB0byBlbWJlZGRpbmcuCisgICAqCisgICAqICAgRlRfRlNUWVBFX0JJVE1BUF9FTUJFRERJTkdfT05MWSA6OgorICAgKiAgICAgT25seSBiaXRtYXBzIGNvbnRhaW5lZCBpbiB0aGUgZm9udCBtYXkgYmUgZW1iZWRkZWQ7IG5vIG91dGxpbmUgZGF0YQorICAgKiAgICAgbWF5IGJlIGVtYmVkZGVkLiAgSWYgdGhlcmUgYXJlIG5vIGJpdG1hcHMgYXZhaWxhYmxlIGluIHRoZSBmb250LAorICAgKiAgICAgdGhlbiB0aGUgZm9udCBpcyB1bmVtYmVkZGFibGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmbGFncyBhcmUgT1JlZCB0b2dldGhlciwgdGh1cyBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUgY2FuIGJlCisgICAqICAgcmV0dXJuZWQuCisgICAqCisgICAqICAgV2hpbGUgdGhlIGBmc1R5cGVgIGZsYWdzIGNhbiBpbmRpY2F0ZSB0aGF0IGEgZm9udCBtYXkgYmUgZW1iZWRkZWQsIGEKKyAgICogICBsaWNlbnNlIHdpdGggdGhlIGZvbnQgdmVuZG9yIG1heSBiZSBzZXBhcmF0ZWx5IHJlcXVpcmVkIHRvIHVzZSB0aGUKKyAgICogICBmb250IGluIHRoaXMgd2F5LgorICAgKi8KICNkZWZpbmUgRlRfRlNUWVBFX0lOU1RBTExBQkxFX0VNQkVERElORyAgICAgICAgIDB4MDAwMAogI2RlZmluZSBGVF9GU1RZUEVfUkVTVFJJQ1RFRF9MSUNFTlNFX0VNQkVERElORyAgMHgwMDAyCiAjZGVmaW5lIEZUX0ZTVFlQRV9QUkVWSUVXX0FORF9QUklOVF9FTUJFRERJTkcgICAweDAwMDQKQEAgLTQwNDcsNTQ4ICs0MjQ1LDU2MyBAQAogI2RlZmluZSBGVF9GU1RZUEVfQklUTUFQX0VNQkVERElOR19PTkxZICAgICAgICAgMHgwMjAwCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfRlNUeXBlX0ZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGBmc1R5cGUnIGZsYWdzIGZvciBhIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYGZzVHlwZScgZmxhZ3MsIHNlZSBARlRfRlNUWVBFX1hYWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkaXJlY3RseSByZWFkaW5nIHRoZSBgZnNfdHlwZScgZmllbGQgKi8KLSAgLyogICAgaW4gdGhlIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUsIHdoaWNoIGlzIG9ubHkgZ3VhcmFudGVlZCB0byAgICAgICovCi0gIC8qICAgIHJldHVybiB0aGUgY29ycmVjdCByZXN1bHRzIGZvciBUeXBlfjEgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfRlNUeXBlX0ZsYWdzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIGBmc1R5cGVgIGZsYWdzIGZvciBhIGZvbnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSBgZnNUeXBlYCBmbGFncywgc2VlIEBGVF9GU1RZUEVfWFhYLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBVc2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbiBkaXJlY3RseSByZWFkaW5nIHRoZSBgZnNfdHlwZWAgZmllbGQgaW4KKyAgICogICB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSwgd2hpY2ggaXMgb25seSBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUKKyAgICogICBjb3JyZWN0IHJlc3VsdHMgZm9yIFR5cGV+MSBmb250cy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy44CisgICAqLwogICBGVF9FWFBPUlQoIEZUX1VTaG9ydCApCiAgIEZUX0dldF9GU1R5cGVfRmxhZ3MoIEZUX0ZhY2UgIGZhY2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX3ZhcmlhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZX4yIGludGVyZmFjZSB0byBVbmljb2RlIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKFVWUyksICAgICAqLwotICAvKiAgICB1c2luZyB0aGUgU0ZOVCBjbWFwIGZvcm1hdH4xNC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW55IGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZm9yIENKSyBzY3JpcHRzLCBoYXZlIHZhcmlhbnQgZm9ybXMuICAgKi8KLSAgLyogICAgVGhleSBhcmUgYSBzb3J0IG9mIGdyZXkgYXJlYSBzb21ld2hlcmUgYmV0d2VlbiBiZWluZyB0b3RhbGx5ICAgICAgICovCi0gIC8qICAgIGlycmVsZXZhbnQgYW5kIHNlbWFudGljYWxseSBkaXN0aW5jdDsgZm9yIHRoaXMgcmVhc29uLCB0aGUgVW5pY29kZSAqLwotICAvKiAgICBjb25zb3J0aXVtIGRlY2lkZWQgdG8gaW50cm9kdWNlIFZhcmlhdGlvbiBTZXF1ZW5jZXMgKFZTKSwgICAgICAgICAgKi8KLSAgLyogICAgY29uc2lzdGluZyBvZiBhIFVuaWNvZGUgYmFzZSBjaGFyYWN0ZXIgYW5kIGEgdmFyaWF0aW9uIHNlbGVjdG9yICAgICovCi0gIC8qICAgIGluc3RlYWQgb2YgZnVydGhlciBleHRlbmRpbmcgdGhlIGFscmVhZHkgaHVnZSBudW1iZXIgb2YgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVuaWNvZGUgbWFpbnRhaW5zIHR3byBkaWZmZXJlbnQgc2V0cywgbmFtZWx5IGBTdGFuZGFyZGl6ZWQgICAgICAgICAqLwotICAvKiAgICBWYXJpYXRpb24gU2VxdWVuY2VzJyBhbmQgcmVnaXN0ZXJlZCBgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICAgKi8KLSAgLyogICAgU2VxdWVuY2VzJyAoSVZTKSwgY29sbGVjdGVkIGluIHRoZSBgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICAgICovCi0gIC8qICAgIERhdGFiYXNlJyAoSVZEKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwczovL3VuaWNvZGUub3JnL1B1YmxpYy9VQ0QvbGF0ZXN0L3VjZC9TdGFuZGFyZGl6ZWRWYXJpYW50cy50eHQgKi8KLSAgLyogICAgICBodHRwczovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHIzNy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cHM6Ly91bmljb2RlLm9yZy9pdmQvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZGF0ZSAoSmFudWFyeSAyMDE3KSwgdGhlIGNoYXJhY3RlciB3aXRoIHRoZSBtb3N0IGlkZW9ncmFwaGljICAgICovCi0gIC8qICAgIHZhcmlhdGlvbnMgaXMgVSs5MDg5LCBoYXZpbmcgMzIgc3VjaCBJVlMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhyZWUgTW9uZ29saWFuIFZhcmlhdGlvbiBTZWxlY3RvcnMgaGF2ZSB0aGUgdmFsdWVzIFUrMTgwQi1VKzE4MEQ7ICovCi0gIC8qICAgIDI1NiBnZW5lcmljIFZhcmlhdGlvbiBTZWxlY3RvcnMgYXJlIGVuY29kZWQgaW4gdGhlIHJhbmdlcyAgICAgICAgICAqLwotICAvKiAgICBVK0ZFMDAtVStGRTBGIGFuZCBVK0UwMTAwLVUrRTAxRUYuICBJVlMgY3VycmVudGx5IHVzZSBWYXJpYXRpb24gICAgKi8KLSAgLyogICAgU2VsZWN0b3JzIGZyb20gdGhlIHJhbmdlIFUrRTAxMDAtVStFMDFFRiBvbmx5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFZTIGNvbnNpc3RzIG9mIHRoZSBiYXNlIGNoYXJhY3RlciB2YWx1ZSBmb2xsb3dlZCBieSBhIHNpbmdsZSAgICAgKi8KLSAgLyogICAgVmFyaWF0aW9uIFNlbGVjdG9yLiAgRm9yIGV4YW1wbGUsIHRvIGdldCB0aGUgZmlyc3QgdmFyaWF0aW9uIG9mICAgICovCi0gIC8qICAgIFUrOTA4OSwgeW91IGhhdmUgdG8gd3JpdGUgdGhlIGNoYXJhY3RlciBzZXF1ZW5jZSBgVSs5MDg5IFUrRTAxMDAnLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWRvYmUgYW5kIE1TIGRlY2lkZWQgdG8gc3VwcG9ydCBib3RoIHN0YW5kYXJkaXplZCBhbmQgaWRlb2dyYXBoaWMgICovCi0gIC8qICAgIFZTIHdpdGggYSBuZXcgY21hcCBzdWJ0YWJsZSAoZm9ybWF0fjE0KS4gIEl0IGlzIGFuIG9kZCBzdWJ0YWJsZSAgICAqLwotICAvKiAgICBiZWNhdXNlIGl0IGlzIG5vdCBhIG1hcHBpbmcgb2YgaW5wdXQgY29kZSBwb2ludHMgdG8gZ2x5cGhzLCBidXQgICAgKi8KLSAgLyogICAgY29udGFpbnMgbGlzdHMgb2YgYWxsIHZhcmlhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBmb250LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhdGlvbiBtYXkgYmUgZWl0aGVyIGBkZWZhdWx0JyBvciBgbm9uLWRlZmF1bHQnIGZvciBhIGdpdmVuICAgKi8KLSAgLyogICAgZm9udC4gIEEgZGVmYXVsdCB2YXJpYXRpb24gaXMgdGhlIG9uZSB5b3Ugd2lsbCBnZXQgZm9yIHRoYXQgY29kZSAgICovCi0gIC8qICAgIHBvaW50IGlmIHlvdSBsb29rIGl0IHVwIGluIHRoZSBzdGFuZGFyZCBVbmljb2RlIGNtYXAuICBBICAgICAgICAgICAqLwotICAvKiAgICBub24tZGVmYXVsdCB2YXJpYXRpb24gaXMgYSBkaWZmZXJlbnQgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgZ2x5cGhfdmFyaWFudHMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlcworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgVGhlIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlcyAoVVZTKSwgdXNpbmcKKyAgICogICB0aGUgU0ZOVCBjbWFwIGZvcm1hdH4xNC4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIE1hbnkgY2hhcmFjdGVycywgZXNwZWNpYWxseSBmb3IgQ0pLIHNjcmlwdHMsIGhhdmUgdmFyaWFudCBmb3Jtcy4gIFRoZXkKKyAgICogICBhcmUgYSBzb3J0IG9mIGdyZXkgYXJlYSBzb21ld2hlcmUgYmV0d2VlbiBiZWluZyB0b3RhbGx5IGlycmVsZXZhbnQgYW5kCisgICAqICAgc2VtYW50aWNhbGx5IGRpc3RpbmN0OyBmb3IgdGhpcyByZWFzb24sIHRoZSBVbmljb2RlIGNvbnNvcnRpdW0gZGVjaWRlZAorICAgKiAgIHRvIGludHJvZHVjZSBWYXJpYXRpb24gU2VxdWVuY2VzIChWUyksIGNvbnNpc3Rpbmcgb2YgYSBVbmljb2RlIGJhc2UKKyAgICogICBjaGFyYWN0ZXIgYW5kIGEgdmFyaWF0aW9uIHNlbGVjdG9yIGluc3RlYWQgb2YgZnVydGhlciBleHRlbmRpbmcgdGhlCisgICAqICAgYWxyZWFkeSBodWdlIG51bWJlciBvZiBjaGFyYWN0ZXJzLgorICAgKgorICAgKiAgIFVuaWNvZGUgbWFpbnRhaW5zIHR3byBkaWZmZXJlbnQgc2V0cywgbmFtZWx5ICdTdGFuZGFyZGl6ZWQgVmFyaWF0aW9uCisgICAqICAgU2VxdWVuY2VzJyBhbmQgcmVnaXN0ZXJlZCAnSWRlb2dyYXBoaWMgVmFyaWF0aW9uIFNlcXVlbmNlcycgKElWUyksCisgICAqICAgY29sbGVjdGVkIGluIHRoZSAnSWRlb2dyYXBoaWMgVmFyaWF0aW9uIERhdGFiYXNlJyAoSVZEKS4KKyAgICoKKyAgICogICAgIGh0dHBzOi8vdW5pY29kZS5vcmcvUHVibGljL1VDRC9sYXRlc3QvdWNkL1N0YW5kYXJkaXplZFZhcmlhbnRzLnR4dAorICAgKiAgICAgaHR0cHM6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyMzcvIGh0dHBzOi8vdW5pY29kZS5vcmcvaXZkLworICAgKgorICAgKiAgIFRvIGRhdGUgKEphbnVhcnkgMjAxNyksIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgbW9zdCBpZGVvZ3JhcGhpYworICAgKiAgIHZhcmlhdGlvbnMgaXMgVSs5MDg5LCBoYXZpbmcgMzIgc3VjaCBJVlMuCisgICAqCisgICAqICAgVGhyZWUgTW9uZ29saWFuIFZhcmlhdGlvbiBTZWxlY3RvcnMgaGF2ZSB0aGUgdmFsdWVzIFUrMTgwQi1VKzE4MEQ7IDI1NgorICAgKiAgIGdlbmVyaWMgVmFyaWF0aW9uIFNlbGVjdG9ycyBhcmUgZW5jb2RlZCBpbiB0aGUgcmFuZ2VzIFUrRkUwMC1VK0ZFMEYKKyAgICogICBhbmQgVStFMDEwMC1VK0UwMUVGLiAgSVZTIGN1cnJlbnRseSB1c2UgVmFyaWF0aW9uIFNlbGVjdG9ycyBmcm9tIHRoZQorICAgKiAgIHJhbmdlIFUrRTAxMDAtVStFMDFFRiBvbmx5LgorICAgKgorICAgKiAgIEEgVlMgY29uc2lzdHMgb2YgdGhlIGJhc2UgY2hhcmFjdGVyIHZhbHVlIGZvbGxvd2VkIGJ5IGEgc2luZ2xlCisgICAqICAgVmFyaWF0aW9uIFNlbGVjdG9yLiAgRm9yIGV4YW1wbGUsIHRvIGdldCB0aGUgZmlyc3QgdmFyaWF0aW9uIG9mCisgICAqICAgVSs5MDg5LCB5b3UgaGF2ZSB0byB3cml0ZSB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlIGBVKzkwODkgVStFMDEwMGAuCisgICAqCisgICAqICAgQWRvYmUgYW5kIE1TIGRlY2lkZWQgdG8gc3VwcG9ydCBib3RoIHN0YW5kYXJkaXplZCBhbmQgaWRlb2dyYXBoaWMgVlMKKyAgICogICB3aXRoIGEgbmV3IGNtYXAgc3VidGFibGUgKGZvcm1hdH4xNCkuICBJdCBpcyBhbiBvZGQgc3VidGFibGUgYmVjYXVzZQorICAgKiAgIGl0IGlzIG5vdCBhIG1hcHBpbmcgb2YgaW5wdXQgY29kZSBwb2ludHMgdG8gZ2x5cGhzLCBidXQgY29udGFpbnMgbGlzdHMKKyAgICogICBvZiBhbGwgdmFyaWF0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGZvbnQuCisgICAqCisgICAqICAgQSB2YXJpYXRpb24gbWF5IGJlIGVpdGhlciAnZGVmYXVsdCcgb3IgJ25vbi1kZWZhdWx0JyBmb3IgYSBnaXZlbiBmb250LgorICAgKiAgIEEgZGVmYXVsdCB2YXJpYXRpb24gaXMgdGhlIG9uZSB5b3Ugd2lsbCBnZXQgZm9yIHRoYXQgY29kZSBwb2ludCBpZiB5b3UKKyAgICogICBsb29rIGl0IHVwIGluIHRoZSBzdGFuZGFyZCBVbmljb2RlIGNtYXAuICBBIG5vbi1kZWZhdWx0IHZhcmlhdGlvbiBpcyBhCisgICAqICAgZGlmZmVyZW50IGdseXBoLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZSBhcyBtb2RpZmllZCBieSAgICAqLwotICAvKiAgICB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBlaXRoZXIgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScsIG9yICAgICovCi0gIC8qICAgIGB1bmRlZmluZWQgc2VsZWN0b3IgY29kZScsIG9yIGBubyB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCAgICAgICAgICAqLwotICAvKiAgICBzdWJ0YWJsZScsIG9yIGBjdXJyZW50IENoYXJNYXAgaXMgbm90IFVuaWNvZGUnLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgdXNlIEZyZWVUeXBlIHRvIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnRzIG9mIGZvbnQgZmlsZXMgICAgICAgKi8KLSAgLyogICAgZGlyZWN0bHksIGJlIGF3YXJlIHRoYXQgdGhlIGdseXBoIGluZGV4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gICovCi0gIC8qICAgIGRvZXNuJ3QgYWx3YXlzIGNvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIGluZGljZXMgdXNlZCB3aXRoaW4gICAgICAqLwotICAvKiAgICB0aGUgZmlsZS4gIFRoaXMgaXMgZG9uZSB0byBlbnN1cmUgdGhhdCB2YWx1ZX4wIGFsd2F5cyBjb3JyZXNwb25kcyAgKi8KLSAgLyogICAgdG8gdGhlIGBtaXNzaW5nIGdseXBoJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBhKSB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCBzdWIgdGFibGUsICAgICAgICAgICAgICovCi0gIC8qICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGIpIHRoZSBjdXJyZW50IGNoYXJtYXAgaGFzIGEgVW5pY29kZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIGdseXBoIGluZGV4IG9mIGEgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUgYXMgbW9kaWZpZWQgYnkgdGhlCisgICAqICAgdmFyaWF0aW9uIHNlbGVjdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBjaGFyY29kZSA6OgorICAgKiAgICAgVGhlIGNoYXJhY3RlciBjb2RlIHBvaW50IGluIFVuaWNvZGUuCisgICAqCisgICAqICAgdmFyaWFudFNlbGVjdG9yIDo6CisgICAqICAgICBUaGUgVW5pY29kZSBjb2RlIHBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBlaXRoZXIgJ3VuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScsIG9yCisgICAqICAgJ3VuZGVmaW5lZCBzZWxlY3RvciBjb2RlJywgb3IgJ25vIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwIHN1YnRhYmxlJywKKyAgICogICBvciAnY3VycmVudCBDaGFyTWFwIGlzIG5vdCBVbmljb2RlJy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSWYgeW91IHVzZSBGcmVlVHlwZSB0byBtYW5pcHVsYXRlIHRoZSBjb250ZW50cyBvZiBmb250IGZpbGVzIGRpcmVjdGx5LAorICAgKiAgIGJlIGF3YXJlIHRoYXQgdGhlIGdseXBoIGluZGV4IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gZG9lc24ndCBhbHdheXMKKyAgICogICBjb3JyZXNwb25kIHRvIHRoZSBpbnRlcm5hbCBpbmRpY2VzIHVzZWQgd2l0aGluIHRoZSBmaWxlLiAgVGhpcyBpcyBkb25lCisgICAqICAgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gdGhlICdtaXNzaW5nIGdseXBoJy4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZgorICAgKiAgICAgYSkgdGhlIGZvbnQgaGFzIGEgdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgc3ViIHRhYmxlLCBhbmQKKyAgICogICAgIGIpIHRoZSBjdXJyZW50IGNoYXJtYXAgaGFzIGEgVW5pY29kZSBlbmNvZGluZy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy42CisgICAqLwogICBGVF9FWFBPUlQoIEZUX1VJbnQgKQogICBGVF9GYWNlX0dldENoYXJWYXJpYW50SW5kZXgoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB3aGV0aGVyIHRoaXMgdmFyaWF0aW9uIG9mIHRoaXMgVW5pY29kZSBjaGFyYWN0ZXIgaXMgdGhlIG9uZSAgKi8KLSAgLyogICAgdG8gYmUgZm91bmQgaW4gdGhlIGBjbWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyaWFudFNlbGVjdG9yIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIFVuaWNvZGUgY29kZXBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDF+aWYgZm91bmQgaW4gdGhlIHN0YW5kYXJkIChVbmljb2RlKSBjbWFwLCAwfmlmIGZvdW5kIGluIHRoZSAgICAgICAqLwotICAvKiAgICB2YXJpYXRpb24gc2VsZWN0b3IgY21hcCwgb3IgLTEgaWYgaXQgaXMgbm90IGEgdmFyaWF0aW9uLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgZm9udCBoYXMgYSB2YXJpYXRpb24gICAgICAgKi8KLSAgLyogICAgc2VsZWN0b3IgY21hcCBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENoZWNrIHdoZXRoZXIgdGhpcyB2YXJpYXRpb24gb2YgdGhpcyBVbmljb2RlIGNoYXJhY3RlciBpcyB0aGUgb25lIHRvCisgICAqICAgYmUgZm91bmQgaW4gdGhlIGNoYXJtYXAuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGNoYXJjb2RlIDo6CisgICAqICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLgorICAgKgorICAgKiAgIHZhcmlhbnRTZWxlY3RvciA6OgorICAgKiAgICAgVGhlIFVuaWNvZGUgY29kZXBvaW50IG9mIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgMX5pZiBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgKFVuaWNvZGUpIGNtYXAsIDB+aWYgZm91bmQgaW4gdGhlIHZhcmlhdGlvbgorICAgKiAgIHNlbGVjdG9yIGNtYXAsIG9yIC0xIGlmIGl0IGlzIG5vdCBhIHZhcmlhdGlvbi4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIGZvbnQgaGFzIGEgdmFyaWF0aW9uIHNlbGVjdG9yCisgICAqICAgY21hcCBzdWJ0YWJsZS4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy42CisgICAqLwogICBGVF9FWFBPUlQoIEZUX0ludCApCiAgIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWF0aW9uIHNlbGVjdG9ycyBmb3VuZCAqLwotICAvKiAgICBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHNlbGVjdG9yIGNvZGUgcG9pbnRzLCBvciBOVUxMIGlmIHRoZXJlIGlzICovCi0gIC8qICAgIG5vIHZhbGlkIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCAgICAgKi8KLSAgLyogICAgY2FsbCB0byBhIEZyZWVUeXBlIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIGEgemVyby10ZXJtaW5hdGVkIGxpc3Qgb2YgVW5pY29kZSB2YXJpYXRpb24gc2VsZWN0b3JzIGZvdW5kIGluCisgICAqICAgdGhlIGZvbnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzZWxlY3RvciBjb2RlIHBvaW50cywgb3IgYE5VTExgIGlmIHRoZXJlIGlzCisgICAqICAgbm8gdmFsaWQgdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAgc3VidGFibGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgQEZUX0ZhY2UKKyAgICogICBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCBjYWxsIHRvIGEKKyAgICogICBGcmVlVHlwZSBmdW5jdGlvbi4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy42CisgICAqLwogICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQogICBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMoIEZUX0ZhY2UgIGZhY2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgdmFyaWF0aW9uIHNlbGVjdG9ycyBmb3VuZCAqLwotICAvKiAgICBmb3IgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgY2hhcmFjdGVyIGNvZGVwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZhcmlhdGlvbiBzZWxlY3RvciBjb2RlIHBvaW50cyB0aGF0IGFyZSAgICovCi0gIC8qICAgIGFjdGl2ZSBmb3IgdGhlIGdpdmVuIGNoYXJhY3Rlciwgb3IgTlVMTCBpZiB0aGUgY29ycmVzcG9uZGluZyBsaXN0ICAqLwotICAvKiAgICBpcyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCi0gIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIHZhcmlhdGlvbiBzZWxlY3RvcnMgZm91bmQgZm9yCisgICAqICAgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgY29kZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgY2hhcmNvZGUgOjoKKyAgICogICAgIFRoZSBjaGFyYWN0ZXIgY29kZXBvaW50IGluIFVuaWNvZGUuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHZhcmlhdGlvbiBzZWxlY3RvciBjb2RlIHBvaW50cyB0aGF0IGFyZQorICAgKiAgIGFjdGl2ZSBmb3IgdGhlIGdpdmVuIGNoYXJhY3Rlciwgb3IgYE5VTExgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QgaXMKKyAgICogICBlbXB0eS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXN+MDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSBARlRfRmFjZQorICAgKiAgIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0IGNhbGwgdG8gYQorICAgKiAgIEZyZWVUeXBlIGZ1bmN0aW9uLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4zLjYKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfVUludDMyKiApCiAgIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgY2hhcmFjdGVyIGNvZGVzIGZvdW5kIGZvciAqLwotICAvKiAgICB0aGUgc3BlY2lmaWVkIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdmFyaWF0aW9uIHNlbGVjdG9yIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGFsbCB0aGUgY29kZSBwb2ludHMgdGhhdCBhcmUgc3BlY2lmaWVkIGJ5IHRoaXMgc2VsZWN0b3IgICovCi0gIC8qICAgIChib3RoIGRlZmF1bHQgYW5kIG5vbi1kZWZhdWx0IGNvZGVzIGFyZSByZXR1cm5lZCkgb3IgTlVMTCBpZiB0aGVyZSAqLwotICAvKiAgICBpcyBubyB2YWxpZCBjbWFwIG9yIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IgaXMgaW52YWxpZC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCi0gIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIGNoYXJhY3RlciBjb2RlcyBmb3VuZCBmb3IgdGhlCisgICAqICAgc3BlY2lmaWVkIHZhcmlhdGlvbiBzZWxlY3Rvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgdmFyaWFudFNlbGVjdG9yIDo6CisgICAqICAgICBUaGUgdmFyaWF0aW9uIHNlbGVjdG9yIGNvZGUgcG9pbnQgaW4gVW5pY29kZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBIGxpc3Qgb2YgYWxsIHRoZSBjb2RlIHBvaW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgdGhpcyBzZWxlY3RvcgorICAgKiAgIChib3RoIGRlZmF1bHQgYW5kIG5vbi1kZWZhdWx0IGNvZGVzIGFyZSByZXR1cm5lZCkgb3IgYE5VTExgIGlmIHRoZXJlCisgICAqICAgaXMgbm8gdmFsaWQgY21hcCBvciB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yIGlzIGludmFsaWQuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBsYXN0IGl0ZW0gaW4gdGhlIGFycmF5IGlzfjA7IHRoZSBhcnJheSBpcyBvd25lZCBieSB0aGUgQEZUX0ZhY2UKKyAgICogICBvYmplY3QgYnV0IGNhbiBiZSBvdmVyd3JpdHRlbiBvciByZWxlYXNlZCBvbiB0aGUgbmV4dCBjYWxsIHRvIGEKKyAgICogICBGcmVlVHlwZSBmdW5jdGlvbi4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMy42CisgICAqLwogICBGVF9FWFBPUlQoIEZUX1VJbnQzMiogKQogICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50KCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3J1bmNoaW5nIGZpeGVkIG51bWJlcnMgYW5kIHZlY3RvcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZnVuY3Rpb25zIHVzZWQgdG8gcGVyZm9ybSAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXB1dGF0aW9ucyBvbiAxNi4xNiBmaXhlZC1mbG9hdCBudW1iZXJzIG9yIDJkIHZlY3RvcnMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRGl2Rml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JvdW5kRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DZWlsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfTXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X0ludmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGNvbXB1dGF0aW9ucworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgQ29tcHV0YXRpb25zCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBDcnVuY2hpbmcgZml4ZWQgbnVtYmVycyBhbmQgdmVjdG9ycy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gY29tcHV0YXRpb25zCisgICAqICAgb24gMTYuMTYgZml4ZWQtZmxvYXQgbnVtYmVycyBvciAyZCB2ZWN0b3JzLgorICAgKgorICAgKiAgICoqQXR0ZW50aW9uKio6IE1vc3QgYXJpdGhtZXRpYyBmdW5jdGlvbnMgdGFrZSBgRlRfTG9uZ2AgYXMgYXJndW1lbnRzLgorICAgKiAgIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIEZyZWVUeXBlIHdhcyBkZXNpZ25lZCB1bmRlciB0aGUgYXNzdW1wdGlvbgorICAgKiAgIHRoYXQgYEZUX0xvbmdgIGlzIGEgMzItYml0IGludGVnZXI7IHJlc3VsdHMgY2FuIHRodXMgYmUgdW5kZWZpbmVkIGlmCisgICAqICAgdGhlIGFyZ3VtZW50cyBkb24ndCBmaXQgaW50byAzMiBiaXRzLgorICAgKgorICAgKiBAb3JkZXI6CisgICAqICAgRlRfTXVsRGl2CisgICAqICAgRlRfTXVsRml4CisgICAqICAgRlRfRGl2Rml4CisgICAqICAgRlRfUm91bmRGaXgKKyAgICogICBGVF9DZWlsRml4CisgICAqICAgRlRfRmxvb3JGaXgKKyAgICogICBGVF9WZWN0b3JfVHJhbnNmb3JtCisgICAqICAgRlRfTWF0cml4X011bHRpcGx5CisgICAqICAgRlRfTWF0cml4X0ludmVydAorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bERpdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgYChhKmIpL2MnIHdpdGggbWF4aW11bSBhY2N1cmFjeSwgdXNpbmcgYSA2NC1iaXQgICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYyA6OiBUaGUgZGl2aXNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvYycuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHRyYXBzIHdoZW4gdHJ5aW5nIHRvICovCi0gIC8qICAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyBgTWF4SW50JyBvciBgTWluSW50JyBkZXBlbmRpbmcgICAqLwotICAvKiAgICBvbiB0aGUgc2lnbnMgb2YgYGEnIGFuZCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTXVsRGl2CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlIGAoYSpiKS9jYCB3aXRoIG1heGltdW0gYWNjdXJhY3ksIHVzaW5nIGEgNjQtYml0IGludGVybWVkaWF0ZQorICAgKiAgIGludGVnZXIgd2hlbmV2ZXIgbmVjZXNzYXJ5LgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3Nvci1zcGVjaWZpYworICAgKiAgIG9wZXJhdGlvbnMsIGJ1dCBpcyBhdCBsZWFzdCBjb21wbGV0ZWx5IHBvcnRhYmxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYSA6OgorICAgKiAgICAgVGhlIGZpcnN0IG11bHRpcGxpZXIuCisgICAqCisgICAqICAgYiA6OgorICAgKiAgICAgVGhlIHNlY29uZCBtdWx0aXBsaWVyLgorICAgKgorICAgKiAgIGMgOjoKKyAgICogICAgIFRoZSBkaXZpc29yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2NgLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0bworICAgKiAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyAnTWF4SW50JyBvciAnTWluSW50JyBkZXBlbmRpbmcgb24KKyAgICogICB0aGUgc2lnbnMgb2YgYGFgIGFuZCBgYmAuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0xvbmcgKQogICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCiAgICAgICAgICAgICAgRlRfTG9uZyAgYiwKICAgICAgICAgICAgICBGVF9Mb25nICBjICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIGAoYSpiKS8weDEwMDAwJyB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBJdHMgbWFpbiB1c2UgaXMgdG8gKi8KLSAgLyogICAgbXVsdGlwbHkgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkLXBvaW50IGZhY3Rvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gIFVzZSBhIDE2LjE2IGZhY3RvciBoZXJlIHdoZW5ldmVyICAgICAgKi8KLSAgLyogICAgICAgICBwb3NzaWJsZSAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvMHgxMDAwMCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBhYnNvbHV0ZSAgICovCi0gIC8qICAgIHZhbHVlIG9mIGBhJyBpcyBsZXNzIHRoYW4gMjA0OCwgYW5kIGBiJyBpcyBhIDE2LjE2IHNjYWxpbmcgZmFjdG9yLiAqLwotICAvKiAgICBBcyB0aGlzIGhhcHBlbnMgbWFpbmx5IHdoZW4gc2NhbGluZyBmcm9tIG5vdGlvbmFsIHVuaXRzIHRvICAgICAgICAgKi8KLSAgLyogICAgZnJhY3Rpb25hbCBwaXhlbHMgaW4gRnJlZVR5cGUsIGl0IHJlc3VsdGVkIGluIG5vdGljZWFibGUgc3BlZWQgICAgICovCi0gIC8qICAgIGltcHJvdmVtZW50cyBiZXR3ZWVuIHZlcnNpb25zIDIueCBhbmQgMS54LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXMgYSBjb25jbHVzaW9uLCBhbHdheXMgdHJ5IHRvIHBsYWNlIGEgMTYuMTYgZmFjdG9yIGFzIHRoZSAgICAgICAgICovCi0gIC8qICAgIF9zZWNvbmRfIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb247IHRoaXMgY2FuIG1ha2UgYSBncmVhdCAgICAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTXVsRml4CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlIGAoYSpiKS8weDEwMDAwYCB3aXRoIG1heGltdW0gYWNjdXJhY3kuICBJdHMgbWFpbiB1c2UgaXMgdG8KKyAgICogICBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQtcG9pbnQgZmFjdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYSA6OgorICAgKiAgICAgVGhlIGZpcnN0IG11bHRpcGxpZXIuCisgICAqCisgICAqICAgYiA6OgorICAgKiAgICAgVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgcG9zc2libGUKKyAgICogICAgIChzZWUgbm90ZSBiZWxvdykuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvMHgxMDAwMGAuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gb3B0aW1pemVkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgYWJzb2x1dGUgdmFsdWUKKyAgICogICBvZiBgYWAgaXMgbGVzcyB0aGFuIDIwNDgsIGFuZCBgYmAgaXMgYSAxNi4xNiBzY2FsaW5nIGZhY3Rvci4gIEFzIHRoaXMKKyAgICogICBoYXBwZW5zIG1haW5seSB3aGVuIHNjYWxpbmcgZnJvbSBub3Rpb25hbCB1bml0cyB0byBmcmFjdGlvbmFsIHBpeGVscworICAgKiAgIGluIEZyZWVUeXBlLCBpdCByZXN1bHRlZCBpbiBub3RpY2VhYmxlIHNwZWVkIGltcHJvdmVtZW50cyBiZXR3ZWVuCisgICAqICAgdmVyc2lvbnMgMi54IGFuZCAxLnguCisgICAqCisgICAqICAgQXMgYSBjb25jbHVzaW9uLCBhbHdheXMgdHJ5IHRvIHBsYWNlIGEgMTYuMTYgZmFjdG9yIGFzIHRoZSBfc2Vjb25kXworICAgKiAgIGFyZ3VtZW50IG9mIHRoaXMgZnVuY3Rpb247IHRoaXMgY2FuIG1ha2UgYSBncmVhdCBkaWZmZXJlbmNlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9Mb25nICkKICAgRlRfTXVsRml4KCBGVF9Mb25nICBhLAogICAgICAgICAgICAgIEZUX0xvbmcgIGIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RpdkZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgYChhKjB4MTAwMDApL2InIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIEl0cyBtYWluIHVzZSBpcyB0byAqLwotICAvKiAgICBkaXZpZGUgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkLXBvaW50IGZhY3Rvci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1lcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIGRlbm9taW5hdG9yLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKjB4MTAwMDApL2InLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9EaXZGaXgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGUgYChhKjB4MTAwMDApL2JgIHdpdGggbWF4aW11bSBhY2N1cmFjeS4gIEl0cyBtYWluIHVzZSBpcyB0bworICAgKiAgIGRpdmlkZSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQtcG9pbnQgZmFjdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYSA6OgorICAgKiAgICAgVGhlIG51bWVyYXRvci4KKyAgICoKKyAgICogICBiIDo6CisgICAqICAgICBUaGUgZGVub21pbmF0b3IuICBVc2UgYSAxNi4xNiBmYWN0b3IgaGVyZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgcmVzdWx0IG9mIGAoYSoweDEwMDAwKS9iYC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfTG9uZyApCiAgIEZUX0RpdkZpeCggRlRfTG9uZyAgYSwKICAgICAgICAgICAgICBGVF9Mb25nICBiICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Sb3VuZEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZCBhIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgdG8gYmUgcm91bmRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgYScgcm91bmRlZCB0byB0aGUgbmVhcmVzdCAxNi4xNiBmaXhlZCBpbnRlZ2VyLCBoYWxmd2F5IGNhc2VzIGF3YXkgKi8KLSAgLyogICAgZnJvbSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZ1bmN0aW9uIHVzZXMgd3JhcC1hcm91bmQgYXJpdGhtZXRpYy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1JvdW5kRml4CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSb3VuZCBhIDE2LjE2IGZpeGVkIG51bWJlci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGEgOjoKKyAgICogICAgIFRoZSBudW1iZXIgdG8gYmUgcm91bmRlZC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBgYWAgcm91bmRlZCB0byB0aGUgbmVhcmVzdCAxNi4xNiBmaXhlZCBpbnRlZ2VyLCBoYWxmd2F5IGNhc2VzIGF3YXkKKyAgICogICBmcm9tIHplcm8uCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmdW5jdGlvbiB1c2VzIHdyYXAtYXJvdW5kIGFyaXRobWV0aWMuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKICAgRlRfUm91bmRGaXgoIEZUX0ZpeGVkICBhICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DZWlsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSBzbWFsbGVzdCBmb2xsb3dpbmcgaW50ZWdlciBvZiBhIDE2LjE2IGZpeGVkIG51bWJlci4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgZm9yIHdoaWNoIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgYScgcm91bmRlZCB0b3dhcmRzIHBsdXMgaW5maW5pdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyB3cmFwLWFyb3VuZCBhcml0aG1ldGljLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQ2VpbEZpeAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ29tcHV0ZSB0aGUgc21hbGxlc3QgZm9sbG93aW5nIGludGVnZXIgb2YgYSAxNi4xNiBmaXhlZCBudW1iZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBhIDo6CisgICAqICAgICBUaGUgbnVtYmVyIGZvciB3aGljaCB0aGUgY2VpbGluZyBmdW5jdGlvbiBpcyB0byBiZSBjb21wdXRlZC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBgYWAgcm91bmRlZCB0b3dhcmRzIHBsdXMgaW5maW5pdHkuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmdW5jdGlvbiB1c2VzIHdyYXAtYXJvdW5kIGFyaXRobWV0aWMuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKICAgRlRfQ2VpbEZpeCggRlRfRml4ZWQgIGEgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Zsb29yRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIGxhcmdlc3QgcHJldmlvdXMgaW50ZWdlciBvZiBhIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGZsb29yIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBhJyByb3VuZGVkIHRvd2FyZHMgbWludXMgaW5maW5pdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9GbG9vckZpeAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ29tcHV0ZSB0aGUgbGFyZ2VzdCBwcmV2aW91cyBpbnRlZ2VyIG9mIGEgMTYuMTYgZml4ZWQgbnVtYmVyLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYSA6OgorICAgKiAgICAgVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGZsb29yIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIGBhYCByb3VuZGVkIHRvd2FyZHMgbWludXMgaW5maW5pdHkuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0ZpeGVkICkKICAgRlRfRmxvb3JGaXgoIEZUX0ZpeGVkICBhICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WZWN0b3JfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcmFuc2Zvcm0gYSBzaW5nbGUgdmVjdG9yIHRocm91Z2ggYSAyeDIgbWF0cml4LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZWN0b3IgOjogVGhlIHRhcmdldCB2ZWN0b3IgdG8gdHJhbnNmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBlaXRoZXIgYHZlY3Rvcicgb3IgYG1hdHJpeCcgaXMgaW52YWxpZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfVmVjdG9yX1RyYW5zZm9ybQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVHJhbnNmb3JtIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIHZlY3RvciA6OgorICAgKiAgICAgVGhlIHRhcmdldCB2ZWN0b3IgdG8gdHJhbnNmb3JtLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbWF0cml4IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSAyeDIgbWF0cml4LgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBlaXRoZXIgYHZlY3RvcmAgb3IgYG1hdHJpeGAgaXMgaW52YWxpZC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oIEZUX1ZlY3RvciogICAgICAgIHZlYywKKyAgRlRfVmVjdG9yX1RyYW5zZm9ybSggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIFZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gRnJlZVR5cGUgdmVyc2lvbnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aG9zZSBmdW5jdGlvbnMgYW5kIG1hY3JvcyBhcmUgb2YgbGltaXRlZCB1c2UgYmVjYXVzZSAgICAqLwotICAvKiAgICBldmVuIGEgbmV3IHJlbGVhc2Ugb2YgRnJlZVR5cGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24gY2hhbmdlcyAgICAgKi8KLSAgLyogICAgaW5jcmVhc2VzIHRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlicmFyeV9WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9NQUpPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfTUlOT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZSRUVUWVBFX1BBVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIHZlcnNpb24KKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIEZyZWVUeXBlIFZlcnNpb24KKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIEZ1bmN0aW9ucyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gRnJlZVR5cGUgdmVyc2lvbnMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBOb3RlIHRoYXQgdGhvc2UgZnVuY3Rpb25zIGFuZCBtYWNyb3MgYXJlIG9mIGxpbWl0ZWQgdXNlIGJlY2F1c2UgZXZlbiBhCisgICAqICAgbmV3IHJlbGVhc2Ugb2YgRnJlZVR5cGUgd2l0aCBvbmx5IGRvY3VtZW50YXRpb24gY2hhbmdlcyBpbmNyZWFzZXMgdGhlCisgICAqICAgdmVyc2lvbiBudW1iZXIuCisgICAqCisgICAqIEBvcmRlcjoKKyAgICogICBGVF9MaWJyYXJ5X1ZlcnNpb24KKyAgICoKKyAgICogICBGUkVFVFlQRV9NQUpPUgorICAgKiAgIEZSRUVUWVBFX01JTk9SCisgICAqICAgRlJFRVRZUEVfUEFUQ0gKKyAgICoKKyAgICogICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzCisgICAqICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZworICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZW51bToKICAgICogICBGUkVFVFlQRV9YWFgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHRocmVlIG1hY3JvcyBpZGVudGlmeSB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdmVyc2lvbi4KLSAgICogICBVc2UgQEZUX0xpYnJhcnlfVmVyc2lvbiB0byBhY2Nlc3MgdGhlbSBhdCBydW50aW1lLgorICAgKiAgIFRoZXNlIHRocmVlIG1hY3JvcyBpZGVudGlmeSB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdmVyc2lvbi4gIFVzZQorICAgKiAgIEBGVF9MaWJyYXJ5X1ZlcnNpb24gdG8gYWNjZXNzIHRoZW0gYXQgcnVudGltZS4KICAgICoKICAgICogQHZhbHVlczoKLSAgICogICBGUkVFVFlQRV9NQUpPUiA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuCi0gICAqICAgRlJFRVRZUEVfTUlOT1IgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLgotICAgKiAgIEZSRUVUWVBFX1BBVENIIDo6IFRoZSBwYXRjaCBsZXZlbC4KKyAgICogICBGUkVFVFlQRV9NQUpPUiA6OgorICAgKiAgICAgVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICAgKiAgIEZSRUVUWVBFX01JTk9SIDo6CisgICAqICAgICBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuCisgICAqICAgRlJFRVRZUEVfUEFUQ0ggOjoKKyAgICogICAgIFRoZSBwYXRjaCBsZXZlbC4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIEZyZWVUeXBlIGlmIGJ1aWx0IGFzIGEgZHluYW1pYyBsaW5rIGxpYnJhcnkKLSAgICogICB3aXRoIHRoZSBgbGlidG9vbCcgcGFja2FnZSBpcyBfbm90XyBjb250cm9sbGVkIGJ5IHRoZXNlIHRocmVlCi0gICAqICAgbWFjcm9zLgorICAgKiAgIFRoZSB2ZXJzaW9uIG51bWJlciBvZiBGcmVlVHlwZSBpZiBidWlsdCBhcyBhIGR5bmFtaWMgbGluayBsaWJyYXJ5IHdpdGgKKyAgICogICB0aGUgJ2xpYnRvb2wnIHBhY2thZ2UgaXMgX25vdF8gY29udHJvbGxlZCBieSB0aGVzZSB0aHJlZSBtYWNyb3MuCiAgICAqCiAgICAqLwogI2RlZmluZSBGUkVFVFlQRV9NQUpPUiAgMgotI2RlZmluZSBGUkVFVFlQRV9NSU5PUiAgOQotI2RlZmluZSBGUkVFVFlQRV9QQVRDSCAgMQorI2RlZmluZSBGUkVFVFlQRV9NSU5PUiAgMTAKKyNkZWZpbmUgRlJFRVRZUEVfUEFUQ0ggIDQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlfVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeSBiZWluZyB1c2VkLiAgVGhpcyBpcyAgICAqLwotICAvKiAgICB1c2VmdWwgd2hlbiBkeW5hbWljYWxseSBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBzaW5jZSBvbmUgY2Fubm90ICAgKi8KLSAgLyogICAgdXNlIHRoZSBtYWNyb3MgQEZSRUVUWVBFX01BSk9SLCBARlJFRVRZUEVfTUlOT1IsIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGUkVFVFlQRV9QQVRDSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBzb3VyY2UgbGlicmFyeSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYWpvciAgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1pbm9yICA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcGF0Y2ggIDo6IFRoZSBwYXRjaCB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnknIGFyZ3VtZW50IGlzIGJlY2F1c2UgKi8KLSAgLyogICAgY2VydGFpbiBwcm9ncmFtcyBpbXBsZW1lbnQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBpbiBhIGN1c3RvbSB3YXkgICovCi0gIC8qICAgIHRoYXQgZG9lc24ndCB1c2UgQEZUX0luaXRfRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gc3VjaCBjYXNlcywgdGhlIGxpYnJhcnkgdmVyc2lvbiBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGJlZm9yZSAgICovCi0gIC8qICAgIHRoZSBsaWJyYXJ5IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9MaWJyYXJ5X1ZlcnNpb24KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeSBiZWluZyB1c2VkLiAgVGhpcyBpcyB1c2VmdWwKKyAgICogICB3aGVuIGR5bmFtaWNhbGx5IGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIHNpbmNlIG9uZSBjYW5ub3QgdXNlIHRoZQorICAgKiAgIG1hY3JvcyBARlJFRVRZUEVfTUFKT1IsIEBGUkVFVFlQRV9NSU5PUiwgYW5kIEBGUkVFVFlQRV9QQVRDSC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgc291cmNlIGxpYnJhcnkgaGFuZGxlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFtYWpvciA6OgorICAgKiAgICAgVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLgorICAgKgorICAgKiAgIGFtaW5vciA6OgorICAgKiAgICAgVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLgorICAgKgorICAgKiAgIGFwYXRjaCA6OgorICAgKiAgICAgVGhlIHBhdGNoIHZlcnNpb24gbnVtYmVyLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnlgIGFyZ3VtZW50IGlzIGJlY2F1c2UKKyAgICogICBjZXJ0YWluIHByb2dyYW1zIGltcGxlbWVudCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGluIGEgY3VzdG9tIHdheSB0aGF0CisgICAqICAgZG9lc24ndCB1c2UgQEZUX0luaXRfRnJlZVR5cGUuCisgICAqCisgICAqICAgSW4gc3VjaCBjYXNlcywgdGhlIGxpYnJhcnkgdmVyc2lvbiBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGJlZm9yZSB0aGUKKyAgICogICBsaWJyYXJ5IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRfTGlicmFyeV9WZXJzaW9uKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYW1ham9yLApAQCAtNDU5Niw1MiArNDgwOSw1NSBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphcGF0Y2ggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlcHJlY2F0ZWQsIGRvZXMgbm90aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyByZXR1cm5zIGZhbHNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIE1heSAyMDEwLCBUcnVlVHlwZSBoaW50aW5nIGlzIG5vIGxvbmdlciBwYXRlbnRlZC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXByZWNhdGVkLCBkb2VzIG5vdGhpbmcuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGZhY2UgaGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEFsd2F5cyByZXR1cm5zIGZhbHNlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBTaW5jZSBNYXkgMjAxMCwgVHJ1ZVR5cGUgaGludGluZyBpcyBubyBsb25nZXIgcGF0ZW50ZWQuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjMuNQorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9Cb29sICkKICAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyggRlRfRmFjZSAgZmFjZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgZG9lcyBub3RoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBmYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YWx1ZSA6OiBOZXcgYm9vbGVhbiBzZXR0aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHdheXMgcmV0dXJucyBmYWxzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBNYXkgMjAxMCwgVHJ1ZVR5cGUgaGludGluZyBpcyBubyBsb25nZXIgcGF0ZW50ZWQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRGVwcmVjYXRlZCwgZG9lcyBub3RoaW5nLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBmYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICB2YWx1ZSA6OgorICAgKiAgICAgTmV3IGJvb2xlYW4gc2V0dGluZy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgU2luY2UgTWF5IDIwMTAsIFRydWVUeXBlIGhpbnRpbmcgaXMgbm8gbG9uZ2VyIHBhdGVudGVkLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4zLjUKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfQm9vbCApCiAgIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcoIEZUX0ZhY2UgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHZhbHVlICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmgKaW5kZXggZjc4ZThiMS4uZjE2NmJjNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRhZHZhbmMuaApAQCAtMSwyNyArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRhZHZhbmMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFF1aWNrIGNvbXB1dGF0aW9uIG9mIGFkdmFuY2Ugd2lkdGhzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRhZHZhbmMuaAorICoKKyAqICAgUXVpY2sgY29tcHV0YXRpb24gb2YgYWR2YW5jZSB3aWR0aHMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUQURWQU5DX0hfCiAjZGVmaW5lIEZUQURWQU5DX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC01Niw2OCArNTUsNjggQEAKICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGJpdC1mbGFnIHRvIGJlIE9SLWVkIHdpdGggdGhlIGBmbGFncycgcGFyYW1ldGVyIG9mIHRoZSAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9BZHZhbmNlIGFuZCBARlRfR2V0X0FkdmFuY2VzIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBzZXQsIGl0IGluZGljYXRlcyB0aGF0IHlvdSB3YW50IHRoZXNlIGZ1bmN0aW9ucyB0byBmYWlsIGlmIHRoZSAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyBoaW50aW5nIG1vZGUgb3IgZm9udCBkcml2ZXIgZG9lc24ndCBhbGxvdyBmb3IgdmVyeSAgICovCi0gIC8qICAgIHF1aWNrIGFkdmFuY2UgY29tcHV0YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwaWNhbGx5LCBnbHlwaHMgdGhhdCBhcmUgZWl0aGVyIHVuc2NhbGVkLCB1bmhpbnRlZCwgYml0bWFwcGVkLCAgICovCi0gIC8qICAgIG9yIGxpZ2h0LWhpbnRlZCBjYW4gaGF2ZSB0aGVpciBhZHZhbmNlIHdpZHRoIGNvbXB1dGVkIHZlcnkgICAgICAgICAqLwotICAvKiAgICBxdWlja2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbCBhbmQgYnl0ZWNvZGUgaGludGVkIG1vZGVzIHRoYXQgcmVxdWlyZSBsb2FkaW5nLCBzY2FsaW5nLCAgICAqLwotICAvKiAgICBhbmQgaGludGluZyBvZiB0aGUgZ2x5cGggb3V0bGluZSwgYXJlIGV4dHJlbWVseSBzbG93IGJ5ICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGFyaXNvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBiaXQtZmxhZyB0byBiZSBPUi1lZCB3aXRoIHRoZSBgZmxhZ3NgIHBhcmFtZXRlciBvZiB0aGUKKyAgICogICBARlRfR2V0X0FkdmFuY2UgYW5kIEBGVF9HZXRfQWR2YW5jZXMgZnVuY3Rpb25zLgorICAgKgorICAgKiAgIElmIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgeW91IHdhbnQgdGhlc2UgZnVuY3Rpb25zIHRvIGZhaWwgaWYgdGhlCisgICAqICAgY29ycmVzcG9uZGluZyBoaW50aW5nIG1vZGUgb3IgZm9udCBkcml2ZXIgZG9lc24ndCBhbGxvdyBmb3IgdmVyeSBxdWljaworICAgKiAgIGFkdmFuY2UgY29tcHV0YXRpb24uCisgICAqCisgICAqICAgVHlwaWNhbGx5LCBnbHlwaHMgdGhhdCBhcmUgZWl0aGVyIHVuc2NhbGVkLCB1bmhpbnRlZCwgYml0bWFwcGVkLCBvcgorICAgKiAgIGxpZ2h0LWhpbnRlZCBjYW4gaGF2ZSB0aGVpciBhZHZhbmNlIHdpZHRoIGNvbXB1dGVkIHZlcnkgcXVpY2tseS4KKyAgICoKKyAgICogICBOb3JtYWwgYW5kIGJ5dGVjb2RlIGhpbnRlZCBtb2RlcyB0aGF0IHJlcXVpcmUgbG9hZGluZywgc2NhbGluZywgYW5kCisgICAqICAgaGludGluZyBvZiB0aGUgZ2x5cGggb3V0bGluZSwgYXJlIGV4dHJlbWVseSBzbG93IGJ5IGNvbXBhcmlzb24uCisgICAqLwogI2RlZmluZSBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZICAweDIwMDAwMDAwTAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2UgdmFsdWUgb2YgYSBnaXZlbiBnbHlwaCBvdXRsaW5lIGluIGFuICAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHNvdXJjZSBARlRfRmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLCB1c2VkIHRvIGRldGVybWluZSB3aGF0IGtpbmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgb2YgYWR2YW5jZXMgeW91IG5lZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkdmFuY2UgOjogVGhlIGFkdmFuY2UgdmFsdWUuICBJZiBzY2FsaW5nIGlzIHBlcmZvcm1lZCAoYmFzZWQgb24gICovCi0gIC8qICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiBgbG9hZF9mbGFncycpLCB0aGUgYWR2YW5jZSB2YWx1ZSBpcyBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAxNi4xNiBmb3JtYXQuICBPdGhlcndpc2UsIGl0IGlzIGluIGZvbnQgdW5pdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCBpcyBzZXQsIHRoaXMgaXMgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlIGNvcnJlc3BvbmRpbmcgdG8gYSB2ZXJ0aWNhbCBsYXlvdXQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBpdCBpcyB0aGUgaG9yaXpvbnRhbCBhZHZhbmNlIGluIGEgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgaWYgeW91IHVzZSBARlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSBhbmQgICAqLwotICAvKiAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBmb250IGJhY2tlbmQgZG9lc24ndCBoYXZlIGEgcXVpY2sgd2F5IHRvICAgICAgKi8KLSAgLyogICAgcmV0cmlldmUgdGhlIGFkdmFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNjYWxlZCBhZHZhbmNlIGlzIHJldHVybmVkIGluIDE2LjE2IGZvcm1hdCBidXQgaXNuJ3QgdHJhbnNmb3JtZWQgKi8KLSAgLyogICAgYnkgdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBzcGVjaWZpZWQgYnkgQEZUX1NldF9UcmFuc2Zvcm0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9BZHZhbmNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSB0aGUgYWR2YW5jZSB2YWx1ZSBvZiBhIGdpdmVuIGdseXBoIG91dGxpbmUgaW4gYW4gQEZUX0ZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgc291cmNlIEBGVF9GYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICBnaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogICBsb2FkX2ZsYWdzIDo6CisgICAqICAgICBBIHNldCBvZiBiaXQgZmxhZ3Mgc2ltaWxhciB0byB0aG9zZSB1c2VkIHdoZW4gY2FsbGluZworICAgKiAgICAgQEZUX0xvYWRfR2x5cGgsIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBhZHZhbmNlcyB5b3UgbmVlZC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGFkdmFuY2UgdmFsdWUuICBJZiBzY2FsaW5nIGlzIHBlcmZvcm1lZCAoYmFzZWQgb24gdGhlIHZhbHVlIG9mCisgICAqICAgICBgbG9hZF9mbGFnc2ApLCB0aGUgYWR2YW5jZSB2YWx1ZSBpcyBpbiAxNi4xNiBmb3JtYXQuICBPdGhlcndpc2UsIGl0CisgICAqICAgICBpcyBpbiBmb250IHVuaXRzLgorICAgKgorICAgKiAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhpcyBpcyB0aGUgdmVydGljYWwgYWR2YW5jZQorICAgKiAgICAgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gIE90aGVyd2lzZSwgaXQgaXMgdGhlIGhvcml6b250YWwKKyAgICogICAgIGFkdmFuY2UgaW4gYSBob3Jpem9udGFsIGxheW91dC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIGlmIHlvdSB1c2UgQEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgYW5kIGlmCisgICAqICAgdGhlIGNvcnJlc3BvbmRpbmcgZm9udCBiYWNrZW5kIGRvZXNuJ3QgaGF2ZSBhIHF1aWNrIHdheSB0byByZXRyaWV2ZQorICAgKiAgIHRoZSBhZHZhbmNlcy4KKyAgICoKKyAgICogICBBIHNjYWxlZCBhZHZhbmNlIGlzIHJldHVybmVkIGluIDE2LjE2IGZvcm1hdCBidXQgaXNuJ3QgdHJhbnNmb3JtZWQgYnkKKyAgICogICB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHNwZWNpZmllZCBieSBARlRfU2V0X1RyYW5zZm9ybS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCkBAIC0xMjUsNTAgKzEyNCw1MiBAQAogICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0FkdmFuY2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGFkdmFuY2UgdmFsdWVzIG9mIHNldmVyYWwgZ2x5cGggb3V0bGluZXMgaW4gYW4gICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IFRoZSBzb3VyY2UgQEZUX0ZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RhcnQgICAgICAgOjogVGhlIGZpcnN0IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGFkdmFuY2UgdmFsdWVzIHlvdSB3YW50IHRvIHJldHJpZXZlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgc2V0IG9mIGJpdCBmbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB2YWx1ZXMuICBUaGlzIGFycmF5LCB0byBiZSBwcm92aWRlZCBieSB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FsbGVyLCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgYGNvdW50JyBlbGVtZW50cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBzY2FsaW5nIGlzIHBlcmZvcm1lZCAoYmFzZWQgb24gdGhlIHZhbHVlIG9mICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgYGxvYWRfZmxhZ3MnKSwgdGhlIGFkdmFuY2UgdmFsdWVzIGFyZSBpbiAxNi4xNiBmb3JtYXQuICovCi0gIC8qICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhleSBhcmUgaW4gZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhlc2UgYXJlIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIHZlcnRpY2FsIGFkdmFuY2VzIGNvcnJlc3BvbmRpbmcgdG8gYSB2ZXJ0aWNhbCBsYXlvdXQuICAqLwotICAvKiAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIHRoZSBob3Jpem9udGFsIGFkdmFuY2VzIGluIGEgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCAgICovCi0gIC8qICAgIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gICAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGUgYWR2YW5jZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYWxlZCBhZHZhbmNlcyBhcmUgcmV0dXJuZWQgaW4gMTYuMTYgZm9ybWF0IGJ1dCBhcmVuJ3QgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1lZCBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIHNwZWNpZmllZCBieSAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1NldF9UcmFuc2Zvcm0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9BZHZhbmNlcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIGFkdmFuY2UgdmFsdWVzIG9mIHNldmVyYWwgZ2x5cGggb3V0bGluZXMgaW4gYW4gQEZUX0ZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgc291cmNlIEBGVF9GYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICBzdGFydCA6OgorICAgKiAgICAgVGhlIGZpcnN0IGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIGNvdW50IDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGFkdmFuY2UgdmFsdWVzIHlvdSB3YW50IHRvIHJldHJpZXZlLgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIEEgc2V0IG9mIGJpdCBmbGFncyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgd2hlbiBjYWxsaW5nCisgICAqICAgICBARlRfTG9hZF9HbHlwaC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGFkdmFuY2UgdmFsdWVzLiAgVGhpcyBhcnJheSwgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciwgbXVzdAorICAgKiAgICAgY29udGFpbiBhdCBsZWFzdCBgY291bnRgIGVsZW1lbnRzLgorICAgKgorICAgKiAgICAgSWYgc2NhbGluZyBpcyBwZXJmb3JtZWQgKGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBgbG9hZF9mbGFnc2ApLCB0aGUKKyAgICogICAgIGFkdmFuY2UgdmFsdWVzIGFyZSBpbiAxNi4xNiBmb3JtYXQuICBPdGhlcndpc2UsIHRoZXkgYXJlIGluIGZvbnQKKyAgICogICAgIHVuaXRzLgorICAgKgorICAgKiAgICAgSWYgQEZUX0xPQURfVkVSVElDQUxfTEFZT1VUIGlzIHNldCwgdGhlc2UgYXJlIHRoZSB2ZXJ0aWNhbCBhZHZhbmNlcworICAgKiAgICAgY29ycmVzcG9uZGluZyB0byBhIHZlcnRpY2FsIGxheW91dC4gIE90aGVyd2lzZSwgdGhleSBhcmUgdGhlCisgICAqICAgICBob3Jpem9udGFsIGFkdmFuY2VzIGluIGEgaG9yaXpvbnRhbCBsYXlvdXQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgZmFpbCBpZiB5b3UgdXNlIEBGVF9BRFZBTkNFX0ZMQUdfRkFTVF9PTkxZIGFuZCBpZgorICAgKiAgIHRoZSBjb3JyZXNwb25kaW5nIGZvbnQgYmFja2VuZCBkb2Vzbid0IGhhdmUgYSBxdWljayB3YXkgdG8gcmV0cmlldmUKKyAgICogICB0aGUgYWR2YW5jZXMuCisgICAqCisgICAqICAgU2NhbGVkIGFkdmFuY2VzIGFyZSByZXR1cm5lZCBpbiAxNi4xNiBmb3JtYXQgYnV0IGFyZW4ndCB0cmFuc2Zvcm1lZCBieQorICAgKiAgIHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3BlY2lmaWVkIGJ5IEBGVF9TZXRfVHJhbnNmb3JtLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldF9BZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaAppbmRleCBmOWViNzBiLi5mZGExYWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiYm94LmgKQEAgLTEsMzggKzEsMzcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmJveC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBleGFjdCBiYm94IGNvbXB1dGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0YmJveC5oCisgKgorICogICBGcmVlVHlwZSBleGFjdCBiYm94IGNvbXB1dGF0aW9uIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGNvbXBvbmVudCBoYXMgYSBfc2luZ2xlXyByb2xlOiB0byBjb21wdXRlIGV4YWN0IG91dGxpbmUgYm91bmRpbmcgKi8KLSAgLyogYm94ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIGZvciB2YXJpb3VzIHRlY2huaWNhbCAgICAgKi8KLSAgLyogcmVhc29ucy4gIEl0IG1heSB3ZWxsIGJlIGludGVncmF0ZWQgaW4gYGZ0b3V0bG4nIGxhdGVyLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZworICAgKiBib3hlcy4KKyAgICoKKyAgICogSXQgaXMgc2VwYXJhdGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBmb3IgdmFyaW91cyB0ZWNobmljYWwKKyAgICogcmVhc29ucy4gIEl0IG1heSB3ZWxsIGJlIGludGVncmF0ZWQgaW4gJ2Z0b3V0bG4nIGxhdGVyLgorICAgKgorICAgKi8KIAogCiAjaWZuZGVmIEZUQkJPWF9IXwogI2RlZmluZSBGVEJCT1hfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTQ0LDQzICs0Myw0NCBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lX3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgb3V0bGluZV9wcm9jZXNzaW5nCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZSB0aGUgZXhhY3QgYm91bmRpbmcgYm94IG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHNsb3dlciAgICAgICovCi0gIC8qICAgIHRoYW4gY29tcHV0aW5nIHRoZSBjb250cm9sIGJveC4gIEhvd2V2ZXIsIGl0IHVzZXMgYW4gYWR2YW5jZWQgICAgICAqLwotICAvKiAgICBhbGdvcml0aG0gdGhhdCByZXR1cm5zIF92ZXJ5XyBxdWlja2x5IHdoZW4gdGhlIHR3byBib3hlcyAgICAgICAgICAgKi8KLSAgLyogICAgY29pbmNpZGUuICBPdGhlcndpc2UsIHRoZSBvdXRsaW5lIEJlemllciBhcmNzIGFyZSB0cmF2ZXJzZWQgdG8gICAgICovCi0gIC8qICAgIGV4dHJhY3QgdGhlaXIgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiYm94ICAgOjogVGhlIG91dGxpbmUncyBleGFjdCBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBmb250IGlzIHRyaWNreSBhbmQgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSwgdGhlIHJlc3VsdGluZyBCQm94IGlzIG1lYW5pbmdsZXNzLiAgVG8gZ2V0ICAgICAgKi8KLSAgLyogICAgcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHRoZSBCQm94IGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBnbHlwaCAgICovCi0gIC8qICAgIGF0IGEgbGFyZ2UgcHBlbSB2YWx1ZSAoc28gdGhhdCB0aGUgaGludGluZyBpbnN0cnVjdGlvbnMgY2FuICAgICAgICAqLwotICAvKiAgICBwcm9wZXJseSBzaGlmdCBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQkJveCwgKi8KLSAgLyogICAgd2hpY2ggY2FuIGJlIGV2ZW50dWFsbHkgY29udmVydGVkIGJhY2sgdG8gZm9udCB1bml0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfR2V0X0JCb3gKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGUgdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyBzbG93ZXIgdGhhbgorICAgKiAgIGNvbXB1dGluZyB0aGUgY29udHJvbCBib3guICBIb3dldmVyLCBpdCB1c2VzIGFuIGFkdmFuY2VkIGFsZ29yaXRobQorICAgKiAgIHRoYXQgcmV0dXJucyBfdmVyeV8gcXVpY2tseSB3aGVuIHRoZSB0d28gYm94ZXMgY29pbmNpZGUuICBPdGhlcndpc2UsCisgICAqICAgdGhlIG91dGxpbmUgQmV6aWVyIGFyY3MgYXJlIHRyYXZlcnNlZCB0byBleHRyYWN0IHRoZWlyIGV4dHJlbWEuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFiYm94IDo6CisgICAqICAgICBUaGUgb3V0bGluZSdzIGV4YWN0IGJvdW5kaW5nIGJveC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB0aGUgZm9udCBpcyB0cmlja3kgYW5kIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aAorICAgKiAgIEBGVF9MT0FEX05PX1NDQUxFLCB0aGUgcmVzdWx0aW5nIEJCb3ggaXMgbWVhbmluZ2xlc3MuICBUbyBnZXQKKyAgICogICByZWFzb25hYmxlIHZhbHVlcyBmb3IgdGhlIEJCb3ggaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIGdseXBoIGF0IGEKKyAgICogICBsYXJnZSBwcGVtIHZhbHVlIChzbyB0aGF0IHRoZSBoaW50aW5nIGluc3RydWN0aW9ucyBjYW4gcHJvcGVybHkgc2hpZnQKKyAgICogICBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQkJveCwgd2hpY2ggY2FuIGJlCisgICAqICAgZXZlbnR1YWxseSBjb252ZXJ0ZWQgYmFjayB0byBmb250IHVuaXRzLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfR2V0X0JCb3goIEZUX091dGxpbmUqICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAqYWJib3ggKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaAppbmRleCAxYjZkZWE2Li4yZTFkYWVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmRmLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGJkZi5oCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBCREYtc3BlY2lmaWMgc3RyaW5ncyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUQkRGX0hfCiAjZGVmaW5lIEZUQkRGX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtMzIsMjUgKzMxLDI1IEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJkZl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJERiBhbmQgUENGIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJERiBhbmQgUENGIHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHNwZWNpZmljIHRvIEJERiAqLwotICAvKiAgICBhbmQgUENGIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgYmRmX2ZvbnRzCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBCREYgYW5kIFBDRiBGaWxlcworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgQkRGIGFuZCBQQ0Ygc3BlY2lmaWMgQVBJLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gQkRGIGFuZAorICAgKiAgIFBDRiBmb250cy4KKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgIEJERl9Qcm9wZXJ0eVR5cGUKQEAgLTgxLDQwICs4MCw0MCBAQAogICB9IEJERl9Qcm9wZXJ0eVR5cGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHR5cGU6CiAgICAqICAgIEJERl9Qcm9wZXJ0eQogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIEEgaGFuZGxlIHRvIGEgQEJERl9Qcm9wZXJ0eVJlYyBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBnaXZlbgotICAgKiAgICBCREYvUENGIHByb3BlcnR5LgorICAgKiAgICBBIGhhbmRsZSB0byBhIEBCREZfUHJvcGVydHlSZWMgc3RydWN0dXJlIHRvIG1vZGVsIGEgZ2l2ZW4gQkRGL1BDRgorICAgKiAgICBwcm9wZXJ0eS4KICAgICovCiAgIHR5cGVkZWYgc3RydWN0IEJERl9Qcm9wZXJ0eVJlY18qICBCREZfUHJvcGVydHk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc3RydWN0OgotICAqICAgIEJERl9Qcm9wZXJ0eVJlYwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyBhIGdpdmVuIEJERi9QQ0YgcHJvcGVydHkuCi0gICoKLSAgKiBAZmllbGRzOgotICAqICAgIHR5cGUgOjoKLSAgKiAgICAgIFRoZSBwcm9wZXJ0eSB0eXBlLgotICAqCi0gICogICAgdS5hdG9tIDo6Ci0gICogICAgICBUaGUgYXRvbSBzdHJpbmcsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0FUT00uICBNYXkgYmUKLSAgKiAgICAgIE5VTEwsIGluZGljYXRpbmcgYW4gZW1wdHkgc3RyaW5nLgotICAqCi0gICogICAgdS5pbnRlZ2VyIDo6Ci0gICogICAgICBBIHNpZ25lZCBpbnRlZ2VyLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSLgotICAqCi0gICogICAgdS5jYXJkaW5hbCA6OgotICAqICAgICAgQW4gdW5zaWduZWQgaW50ZWdlciwgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgICBCREZfUHJvcGVydHlSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgYSBnaXZlbiBCREYvUENGIHByb3BlcnR5LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgICB0eXBlIDo6CisgICAqICAgICAgVGhlIHByb3BlcnR5IHR5cGUuCisgICAqCisgICAqICAgIHUuYXRvbSA6OgorICAgKiAgICAgIFRoZSBhdG9tIHN0cmluZywgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfQVRPTS4gIE1heSBiZQorICAgKiAgICAgIGBOVUxMYCwgaW5kaWNhdGluZyBhbiBlbXB0eSBzdHJpbmcuCisgICAqCisgICAqICAgIHUuaW50ZWdlciA6OgorICAgKiAgICAgIEEgc2lnbmVkIGludGVnZXIsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIuCisgICAqCisgICAqICAgIHUuY2FyZGluYWwgOjoKKyAgICogICAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBCREZfUHJvcGVydHlSZWNfCiAgIHsKICAgICBCREZfUHJvcGVydHlUeXBlICB0eXBlOwpAQCAtMTI4LDczICsxMjcsNzYgQEAKICAgfSBCREZfUHJvcGVydHlSZWM7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X0JERl9DaGFyc2V0X0lECi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0cmlldmUgYSBCREYgZm9udCBjaGFyYWN0ZXIgc2V0IGlkZW50aXR5LCBhY2NvcmRpbmcgdG8KLSAgKiAgICB0aGUgQkRGIHNwZWNpZmljYXRpb24uCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhY2hhcnNldF9lbmNvZGluZyA6OgotICAqICAgICAgIENoYXJzZXQgZW5jb2RpbmcsIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAqCi0gICogICAgYWNoYXJzZXRfcmVnaXN0cnkgOjoKLSAgKiAgICAgICBDaGFyc2V0IHJlZ2lzdHJ5LCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBCREYgZmFjZXMsIHJldHVybmluZyBhbiBlcnJvciBvdGhlcndpc2UuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9CREZfQ2hhcnNldF9JRAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHJpZXZlIGEgQkRGIGZvbnQgY2hhcmFjdGVyIHNldCBpZGVudGl0eSwgYWNjb3JkaW5nIHRvIHRoZSBCREYKKyAgICogICAgc3BlY2lmaWNhdGlvbi4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgIGFjaGFyc2V0X2VuY29kaW5nIDo6CisgICAqICAgICAgQ2hhcnNldCBlbmNvZGluZywgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCisgICAqCisgICAqICAgIGFjaGFyc2V0X3JlZ2lzdHJ5IDo6CisgICAqICAgICAgQ2hhcnNldCByZWdpc3RyeSwgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQkRGIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldF9CREZfQ2hhcnNldF9JRCggRlRfRmFjZSAgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqYWNoYXJzZXRfZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9CREZfUHJvcGVydHkKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXRyaWV2ZSBhIEJERiBwcm9wZXJ0eSBmcm9tIGEgQkRGIG9yIFBDRiBmb250IGZpbGUuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIG5hbWUgOjogVGhlIHByb3BlcnR5IG5hbWUuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGFwcm9wZXJ0eSA6OiBUaGUgcHJvcGVydHkuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIEJERiBfYW5kXyBQQ0YgZm9udHMuICBJdCByZXR1cm5zIGFuIGVycm9yCi0gICogICBvdGhlcndpc2UuICBJdCBhbHNvIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBpbiB0aGUKLSAgKiAgIGZvbnQuCi0gICoKLSAgKiAgIEEgYHByb3BlcnR5JyBpcyBhIGVpdGhlciBrZXktdmFsdWUgcGFpciB3aXRoaW4gdGhlIFNUQVJUUFJPUEVSVElFUwotICAqICAgLi4uIEVORFBST1BFUlRJRVMgYmxvY2sgb2YgYSBCREYgZm9udCBvciBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlCi0gICogICBgaW5mby0+cHJvcHMnIGFycmF5IHdpdGhpbiBhIGBGb250UmVjJyBzdHJ1Y3R1cmUgb2YgYSBQQ0YgZm9udC4KLSAgKgotICAqICAgSW50ZWdlciBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgc3RvcmVkIGFzIGBzaWduZWQnIHdpdGhpbiBQQ0YgZm9udHM7Ci0gICogICBjb25zZXF1ZW50bHksIEBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCBpcyBhIHBvc3NpYmxlIHJldHVybiB2YWx1ZQotICAqICAgZm9yIEJERiBmb250cyBvbmx5LgotICAqCi0gICogICBJbiBjYXNlIG9mIGVycm9yLCBgYXByb3BlcnR5LT50eXBlJyBpcyBhbHdheXMgc2V0IHRvCi0gICogICBAQkRGX1BST1BFUlRZX1RZUEVfTk9ORS4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X0JERl9Qcm9wZXJ0eQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHJpZXZlIGEgQkRGIHByb3BlcnR5IGZyb20gYSBCREYgb3IgUENGIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqICAgIG5hbWUgOjoKKyAgICogICAgICBUaGUgcHJvcGVydHkgbmFtZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICAgYXByb3BlcnR5IDo6CisgICAqICAgICAgVGhlIHByb3BlcnR5LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBCREYgX2FuZF8gUENGIGZvbnRzLiAgSXQgcmV0dXJucyBhbiBlcnJvcgorICAgKiAgIG90aGVyd2lzZS4gIEl0IGFsc28gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGluIHRoZQorICAgKiAgIGZvbnQuCisgICAqCisgICAqICAgQSAncHJvcGVydHknIGlzIGEgZWl0aGVyIGtleS12YWx1ZSBwYWlyIHdpdGhpbiB0aGUgU1RBUlRQUk9QRVJUSUVTCisgICAqICAgLi4uIEVORFBST1BFUlRJRVMgYmxvY2sgb2YgYSBCREYgZm9udCBvciBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlCisgICAqICAgYGluZm8tPnByb3BzYCBhcnJheSB3aXRoaW4gYSBgRm9udFJlY2Agc3RydWN0dXJlIG9mIGEgUENGIGZvbnQuCisgICAqCisgICAqICAgSW50ZWdlciBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgc3RvcmVkIGFzICdzaWduZWQnIHdpdGhpbiBQQ0YgZm9udHM7CisgICAqICAgY29uc2VxdWVudGx5LCBAQkRGX1BST1BFUlRZX1RZUEVfQ0FSRElOQUwgaXMgYSBwb3NzaWJsZSByZXR1cm4gdmFsdWUKKyAgICogICBmb3IgQkRGIGZvbnRzIG9ubHkuCisgICAqCisgICAqICAgSW4gY2FzZSBvZiBlcnJvciwgYGFwcm9wZXJ0eS0+dHlwZWAgaXMgYWx3YXlzIHNldCB0bworICAgKiAgIEBCREZfUFJPUEVSVFlfVFlQRV9OT05FLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldF9CREZfUHJvcGVydHkoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaAppbmRleCBhNDMxODdjLi4yODJjMjJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Yml0bWFwLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oCkBAIC0xLDI3ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJpdG1hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGJpdG1hcC5oCisgKgorICogICBGcmVlVHlwZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYml0bWFwcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUQklUTUFQX0hfCiAjZGVmaW5lIEZUQklUTUFQX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNvbG9yLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtMzMsMzkgKzMzLDQ2IEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF9oYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJpdG1hcCBIYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhhbmRsaW5nIEZUX0JpdG1hcCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEBGVF9CaXRtYXAgb2JqZWN0cy4gICAqLwotICAvKiAgICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgZnVuY3Rpb25zIGNoYW5nZXMgdGhlIGJpdG1hcCdzIGBmbG93JyAoYXMgICAgKi8KLSAgLyogICAgaW5kaWNhdGVkIGJ5IHRoZSBzaWduIG9mIHRoZSBgcGl0Y2gnIGZpZWxkIGluIGBGVF9CaXRtYXAnKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGJpdG1hcF9oYW5kbGluZworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgQml0bWFwIEhhbmRsaW5nCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBIYW5kbGluZyBGVF9CaXRtYXAgb2JqZWN0cy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEBGVF9CaXRtYXAgb2JqZWN0cywKKyAgICogICBhdXRvbWF0aWNhbGx5IGFkanVzdGluZyB0aGUgdGFyZ2V0J3MgYml0bWFwIGJ1ZmZlciBzaXplIGFzIG5lZWRlZC4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUgZnVuY3Rpb25zIGNoYW5nZXMgdGhlIGJpdG1hcCdzICdmbG93JyAoYXMKKyAgICogICBpbmRpY2F0ZWQgYnkgdGhlIHNpZ24gb2YgdGhlIGBwaXRjaGAgZmllbGQgaW4gQEZUX0JpdG1hcCkuCisgICAqCisgICAqICAgVG8gc2V0IHRoZSBmbG93LCBhc3NpZ24gYW4gYXBwcm9wcmlhdGUgcG9zaXRpdmUgb3IgbmVnYXRpdmUgdmFsdWUgdG8KKyAgICogICB0aGUgYHBpdGNoYCBmaWVsZCBvZiB0aGUgdGFyZ2V0IEBGVF9CaXRtYXAgb2JqZWN0IGFmdGVyIGNhbGxpbmcKKyAgICogICBARlRfQml0bWFwX0luaXQgYnV0IGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgb3RoZXIgZnVuY3Rpb25zCisgICAqICAgZGVzY3JpYmVkIGhlcmUuCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIHBvaW50ZXIgdG8gYW4gQEZUX0JpdG1hcCBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJpdG1hcCA6OiBBIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkZXByZWNhdGVkIG5hbWUgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGBGVF9CaXRtYXBfTmV3Jy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0JpdG1hcF9Jbml0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplIGEgcG9pbnRlciB0byBhbiBARlRfQml0bWFwIHN0cnVjdHVyZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGFiaXRtYXAgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0cnVjdHVyZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQSBkZXByZWNhdGVkIG5hbWUgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGBGVF9CaXRtYXBfTmV3YC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICk7CiAKQEAgLTc1LDY2ICs4Miw3NyBAQAogICBGVF9CaXRtYXBfTmV3KCBGVF9CaXRtYXAgICphYml0bWFwICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb3B5IGEgYml0bWFwIGludG8gYW5vdGhlciBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvdXJjZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9CaXRtYXBfQ29weQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ29weSBhIGJpdG1hcCBpbnRvIGFub3RoZXIgb25lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICBzb3VyY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYml0bWFwLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHRhcmdldCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgYHNvdXJjZS0+YnVmZmVyYCBhbmQgYHRhcmdldC0+YnVmZmVyYCBtdXN0IG5laXRoZXIgYmUgZXF1YWwgbm9yCisgICAqICAgb3ZlcmxhcC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9CaXRtYXBfQ29weSggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1ib2xkZW4gYSBiaXRtYXAuICBUaGUgbmV3IGJpdG1hcCB3aWxsIGJlIGFib3V0IGB4U3RyZW5ndGgnICAgICAgICovCi0gIC8qICAgIHBpeGVscyB3aWRlciBhbmQgYHlTdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIFRoZSBsZWZ0IGFuZCBib3R0b20gICAqLwotICAvKiAgICBib3JkZXJzIGFyZSBrZXB0IHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIGhvcml6b250YWxseS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIHZlcnRpY2FsbHkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXN0cmljdHMgYHhTdHJlbmd0aCcgdG8gYmUgbGVzcyB0aGFuICAgKi8KLSAgLyogICAgb3IgZXF1YWwgdG9+OCBpZiBiaXRtYXAgaXMgb2YgcGl4ZWxfbW9kZSBARlRfUElYRUxfTU9ERV9NT05PLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3Ugd2FudCB0byBlbWJvbGRlbiB0aGUgYml0bWFwIG93bmVkIGJ5IGEgQEZUX0dseXBoU2xvdFJlYywgICAgKi8KLSAgLyogICAgeW91IHNob3VsZCBjYWxsIEBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCBvbiB0aGUgc2xvdCBmaXJzdC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCaXRtYXBzIGluIEBGVF9QSVhFTF9NT0RFX0dSQVkyIGFuZCBARlRfUElYRUxfTU9ERV9HUkFZQCBmb3JtYXQgICAgKi8KLSAgLyogICAgYXJlIGNvbnZlcnRlZCB0byBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdCAoaS5lLiwgOGJwcCkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0JpdG1hcF9FbWJvbGRlbgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRW1ib2xkZW4gYSBiaXRtYXAuICBUaGUgbmV3IGJpdG1hcCB3aWxsIGJlIGFib3V0IGB4U3RyZW5ndGhgIHBpeGVscworICAgKiAgIHdpZGVyIGFuZCBgeVN0cmVuZ3RoYCBwaXhlbHMgaGlnaGVyLiAgVGhlIGxlZnQgYW5kIGJvdHRvbSBib3JkZXJzIGFyZQorICAgKiAgIGtlcHQgdW5jaGFuZ2VkLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICB4U3RyZW5ndGggOjoKKyAgICogICAgIEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgaG9yaXpvbnRhbGx5LiAgRXhwcmVzc2VkIGluIDI2LjYKKyAgICogICAgIHBpeGVsIGZvcm1hdC4KKyAgICoKKyAgICogICB5U3RyZW5ndGggOjoKKyAgICogICAgIEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQgdmVydGljYWxseS4gIEV4cHJlc3NlZCBpbiAyNi42CisgICAqICAgICBwaXhlbCBmb3JtYXQuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBiaXRtYXAgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgYml0bWFwLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHJlc3RyaWN0cyBgeFN0cmVuZ3RoYCB0byBiZSBsZXNzIHRoYW4gb3IKKyAgICogICBlcXVhbCB0b344IGlmIGJpdG1hcCBpcyBvZiBwaXhlbF9tb2RlIEBGVF9QSVhFTF9NT0RFX01PTk8uCisgICAqCisgICAqICAgSWYgeW91IHdhbnQgdG8gZW1ib2xkZW4gdGhlIGJpdG1hcCBvd25lZCBieSBhIEBGVF9HbHlwaFNsb3RSZWMsIHlvdQorICAgKiAgIHNob3VsZCBjYWxsIEBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCBvbiB0aGUgc2xvdCBmaXJzdC4KKyAgICoKKyAgICogICBCaXRtYXBzIGluIEBGVF9QSVhFTF9NT0RFX0dSQVkyIGFuZCBARlRfUElYRUxfTU9ERV9HUkFZQCBmb3JtYXQgYXJlCisgICAqICAgY29udmVydGVkIHRvIEBGVF9QSVhFTF9NT0RFX0dSQVkgZm9ybWF0IChpLmUuLCA4YnBwKS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9CaXRtYXBfRW1ib2xkZW4oIEZUX0xpYnJhcnkgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLApAQCAtMTQyLDM5ICsxNjAsNDYgQEAKICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5U3RyZW5ndGggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Db252ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbnZlcnQgYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggMWJwcCwgMmJwcCwgNGJwcCwgOGJwcCBvciAzMmJwcCAqLwotICAvKiAgICB0byBhIGJpdG1hcCBvYmplY3Qgd2l0aCBkZXB0aCA4YnBwLCBtYWtpbmcgdGhlIG51bWJlciBvZiB1c2VkICAgICAgKi8KLSAgLyogICAgYnl0ZXMgbGluZSAoYS5rLmEuIHRoZSBgcGl0Y2gnKSBhIG11bHRpcGxlIG9mIGBhbGlnbm1lbnQnLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgIDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3VyY2UgICAgOjogVGhlIHNvdXJjZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFsaWdubWVudCA6OiBUaGUgcGl0Y2ggb2YgdGhlIGJpdG1hcCBpcyBhIG11bHRpcGxlIG9mIHRoaXMgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiAgQ29tbW9uIHZhbHVlcyBhcmUgMSwgMiwgb3IgNC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YXJnZXQgICAgOjogVGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIEBGVF9CaXRtYXBfQ29udmVydCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0ICAgKi8KLSAgLyogICAgY2FsbGluZyBARlRfQml0bWFwX0RvbmUgKHRoZSBtZW1vcnkgaXMgc2ltcGx5IHJlYWxsb2NhdGVkKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0JpdG1hcF9Eb25lIHRvIGZpbmFsbHkgcmVtb3ZlIHRoZSBiaXRtYXAgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLwotICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQml0bWFwX0NvbnZlcnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENvbnZlcnQgYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggMWJwcCwgMmJwcCwgNGJwcCwgOGJwcCBvciAzMmJwcCB0bworICAgKiAgIGEgYml0bWFwIG9iamVjdCB3aXRoIGRlcHRoIDhicHAsIG1ha2luZyB0aGUgbnVtYmVyIG9mIHVzZWQgYnl0ZXMgcGVyCisgICAqICAgbGluZSAoYS5rLmEuIHRoZSAncGl0Y2gnKSBhIG11bHRpcGxlIG9mIGBhbGlnbm1lbnRgLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICBzb3VyY2UgOjoKKyAgICogICAgIFRoZSBzb3VyY2UgYml0bWFwLgorICAgKgorICAgKiAgIGFsaWdubWVudCA6OgorICAgKiAgICAgVGhlIHBpdGNoIG9mIHRoZSBiaXRtYXAgaXMgYSBtdWx0aXBsZSBvZiB0aGlzIGFyZ3VtZW50LiAgQ29tbW9uCisgICAqICAgICB2YWx1ZXMgYXJlIDEsIDIsIG9yIDQuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgdGFyZ2V0IDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGJpdG1hcC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJdCBpcyBwb3NzaWJsZSB0byBjYWxsIEBGVF9CaXRtYXBfQ29udmVydCBtdWx0aXBsZSB0aW1lcyB3aXRob3V0CisgICAqICAgY2FsbGluZyBARlRfQml0bWFwX0RvbmUgKHRoZSBtZW1vcnkgaXMgc2ltcGx5IHJlYWxsb2NhdGVkKS4KKyAgICoKKyAgICogICBVc2UgQEZUX0JpdG1hcF9Eb25lIHRvIGZpbmFsbHkgcmVtb3ZlIHRoZSBiaXRtYXAgb2JqZWN0LgorICAgKgorICAgKiAgIFRoZSBgbGlicmFyeWAgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyBtZW1vcnkKKyAgICogICBoYW5kbGluZyBmdW5jdGlvbnMuCisgICAqCisgICAqICAgYHNvdXJjZS0+YnVmZmVyYCBhbmQgYHRhcmdldC0+YnVmZmVyYCBtdXN0IG5laXRoZXIgYmUgZXF1YWwgbm9yCisgICAqICAgb3ZlcmxhcC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9CaXRtYXBfQ29udmVydCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKQEAgLTE4Miw0OCArMjA3LDExMiBAQAogICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICAgYWxpZ25tZW50ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYWtlIHN1cmUgdGhhdCBhIGdseXBoIHNsb3Qgb3ducyBgc2xvdC0+Yml0bWFwJy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90IDo6IFRoZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0JpdG1hcF9FbWJvbGRlbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0JpdG1hcF9CbGVuZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQmxlbmQgYSBiaXRtYXAgb250byBhbm90aGVyIGJpdG1hcCwgdXNpbmcgYSBnaXZlbiBjb2xvci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqICAgc291cmNlIDo6CisgICAqICAgICBUaGUgc291cmNlIGJpdG1hcCwgd2hpY2ggY2FuIGhhdmUgYW55IEBGVF9QaXhlbF9Nb2RlIGZvcm1hdC4KKyAgICoKKyAgICogICBzb3VyY2Vfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgb2Zmc2V0IHZlY3RvciB0byB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNvdXJjZSBiaXRtYXAgaW4KKyAgICogICAgIDI2LjYgcGl4ZWwgZm9ybWF0LiAgSXQgc2hvdWxkIHJlcHJlc2VudCBhbiBpbnRlZ2VyIG9mZnNldDsgdGhlCisgICAqICAgICBmdW5jdGlvbiB3aWxsIHNldCB0aGUgbG93ZXN0IHNpeCBiaXRzIHRvIHplcm8gdG8gZW5mb3JjZSB0aGF0LgorICAgKgorICAgKiAgIGNvbG9yIDo6CisgICAqICAgICBUaGUgY29sb3IgdXNlZCB0byBkcmF3IGBzb3VyY2VgIG9udG8gYHRhcmdldGAuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICB0YXJnZXQgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGFuIGBGVF9CaXRtYXBgIG9iamVjdC4gIEl0IHNob3VsZCBiZSBlaXRoZXIgaW5pdGlhbGl6ZWQKKyAgICogICAgIGFzIGVtcHR5IHdpdGggYSBjYWxsIHRvIEBGVF9CaXRtYXBfSW5pdCwgb3IgaXQgc2hvdWxkIGJlIG9mIHR5cGUKKyAgICogICAgIEBGVF9QSVhFTF9NT0RFX0JHUkEuCisgICAqCisgICAqICAgYXRhcmdldF9vZmZzZXQgOjoKKyAgICogICAgIFRoZSBvZmZzZXQgdmVjdG9yIHRvIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgdGFyZ2V0IGJpdG1hcCBpbgorICAgKiAgICAgMjYuNiBwaXhlbCBmb3JtYXQuICBJdCBzaG91bGQgcmVwcmVzZW50IGFuIGludGVnZXIgb2Zmc2V0OyB0aGUKKyAgICogICAgIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBsb3dlc3Qgc2l4IGJpdHMgdG8gemVybyB0byBlbmZvcmNlIHRoYXQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHBlcmZvcm0gY2xpcHBpbmcuCisgICAqCisgICAqICAgVGhlIGJpdG1hcCBpbiBgdGFyZ2V0YCBnZXRzIGFsbG9jYXRlZCBvciByZWFsbG9jYXRlZCBhcyBuZWVkZWQ7IHRoZQorICAgKiAgIHZlY3RvciBgYXRhcmdldF9vZmZzZXRgIGlzIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCisgICAqCisgICAqICAgSW4gY2FzZSBvZiBhbGxvY2F0aW9uIG9yIHJlYWxsb2NhdGlvbiwgdGhlIGJpdG1hcCdzIHBpdGNoIGlzIHNldCB0bworICAgKiAgIGA0ICogd2lkdGhgLiAgQm90aCBgc291cmNlYCBhbmQgYHRhcmdldGAgbXVzdCBoYXZlIHRoZSBzYW1lIGJpdG1hcAorICAgKiAgIGZsb3cgKGFzIGluZGljYXRlZCBieSB0aGUgc2lnbiBvZiB0aGUgYHBpdGNoYCBmaWVsZCkuCisgICAqCisgICAqICAgYHNvdXJjZS0+YnVmZmVyYCBhbmQgYHRhcmdldC0+YnVmZmVyYCBtdXN0IG5laXRoZXIgYmUgZXF1YWwgbm9yCisgICAqICAgb3ZlcmxhcC4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuMTAKKyAgICovCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9CaXRtYXBfQmxlbmQoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCogICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yICAgIHNvdXJjZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICAgICAgICAqYXRhcmdldF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgRlRfQ29sb3IgICAgICAgICAgIGNvbG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBNYWtlIHN1cmUgdGhhdCBhIGdseXBoIHNsb3Qgb3ducyBgc2xvdC0+Yml0bWFwYC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHNsb3QgOjoKKyAgICogICAgIFRoZSBnbHlwaCBzbG90LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEBGVF9CaXRtYXBfRW1ib2xkZW4uCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGJpdG1hcCBvYmplY3QgaW5pdGlhbGl6ZWQgd2l0aCBARlRfQml0bWFwX0luaXQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgIDo6IFRoZSBiaXRtYXAgb2JqZWN0IHRvIGJlIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYGxpYnJhcnknIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0JpdG1hcF9Eb25lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXN0cm95IGEgYml0bWFwIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIEBGVF9CaXRtYXBfSW5pdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqICAgYml0bWFwIDo6CisgICAqICAgICBUaGUgYml0bWFwIG9iamVjdCB0byBiZSBmcmVlZC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgYGxpYnJhcnlgIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgbWVtb3J5CisgICAqICAgaGFuZGxpbmcgZnVuY3Rpb25zLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0JpdG1hcF9Eb25lKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAqYml0bWFwICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiemlwMi5oCmluZGV4IDZlZGZhMDMuLmViNmE1YTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRiemlwMi5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRiemlwMi5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJ6aXAyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQnppcDItY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEpvZWwgS2xpbmdoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGJ6aXAyLmgKKyAqCisgKiAgIEJ6aXAyLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMjAgYnkKKyAqIEpvZWwgS2xpbmdoZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVEJaSVAyX0hfCiAjZGVmaW5lIEZUQlpJUDJfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMSw2MiArMzAsNjMgQEAKIAogRlRfQkVHSU5fSEVBREVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnppcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQlpJUDIgU3RyZWFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNpbmcgYnppcDItY29tcHJlc3NlZCBmb250IGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBCemlwMi1zcGVjaWZpYyBmdW5jdGlvbnMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGJ6aXAyCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBCWklQMiBTdHJlYW1zCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBVc2luZyBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgYnppcDIgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKKyAgICogICBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgd2hlbiBjYWxsaW5nIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlLgorICAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKKyAgICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkCisgICAqICAgc3RyZWFtIGZyb20gaXQgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KKyAgICoKKyAgICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgorICAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbSwKKyAgICogICB3aGljaCBzaWduaWZpY2FudGx5IHVuZGVybWluZXMgdGhlIHBlcmZvcm1hbmNlLgorICAgKgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQnppcDItc3BlY2lmaWMgZnVuY3Rpb25zLgorICAgKgorICAgKi8KIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfU3RyZWFtX09wZW5CemlwMgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BlbiBhIG5ldyBzdHJlYW0gdG8gcGFyc2UgYnppcDItY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcwotICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuYnoyJyBmb250cyB0aGF0IGNvbWUKLSAgKiAgIHdpdGggWEZyZWU4Ni4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIHN0cmVhbSA6OgotICAqICAgICBUaGUgdGFyZ2V0IGVtYmVkZGluZyBzdHJlYW0uCi0gICoKLSAgKiAgIHNvdXJjZSA6OgotICAqICAgICBUaGUgc291cmNlIHN0cmVhbS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGUgc291cmNlIHN0cmVhbSBtdXN0IGJlIG9wZW5lZCBfYmVmb3JlXyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gICoKLSAgKiAgIENhbGxpbmcgdGhlIGludGVybmFsIGZ1bmN0aW9uIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBuZXcgc3RyZWFtIHdpbGwKLSAgKiAgICpub3QqIGNhbGwgYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIHNvdXJjZSBzdHJlYW0uICBOb25lIG9mIHRoZSBzdHJlYW0KLSAgKiAgIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB0byB0aGUgaGVhcC4KLSAgKgotICAqICAgVGhlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCByZXNldHMgdGhlIGRlY29tcHJlc3Npb24KLSAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbS4KLSAgKgotICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIGJ6aXAyIGNvbXByZXNzaW9uIHJlY29nbml0aW9uIGlzCi0gICogICBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgd2hlbiBjYWxsaW5nIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlLgotICAqICAgVGhpcyBtZWFucyB0aGF0IGlmIG5vIGZvbnQgZHJpdmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgdGhlIHJhdwotICAqICAgY29tcHJlc3NlZCBmaWxlLCB0aGUgbGlicmFyeSB3aWxsIHRyeSB0byBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0KLSAgKiAgIGZyb20gaXQgYW5kIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KLSAgKgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggYnppcDIgc3VwcG9ydC4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9TdHJlYW1fT3BlbkJ6aXAyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICBUaGlzIGlzCisgICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuYnoyYCBmb250cyB0aGF0IGNvbWUgd2l0aAorICAgKiAgIFhGcmVlODYuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KKyAgICoKKyAgICogICBzb3VyY2UgOjoKKyAgICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICoKKyAgICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlYCBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCisgICAqICAgKipub3QqKiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2VgIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUKKyAgICogICBzdHJlYW0gb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAgaWYgeW91ciBidWlsZAorICAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBiemlwMiBzdXBwb3J0LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1N0cmVhbV9PcGVuQnppcDIoIEZUX1N0cmVhbSAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaAppbmRleCA1MmQ1ZjAwLi42MDQ3Mjc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaApAQCAtMSw1MCArMSw0OSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjYWNoZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIENhY2hlIHN1YnN5c3RlbSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjYWNoZS5oCisgKgorICogICBGcmVlVHlwZSBDYWNoZSBzdWJzeXN0ZW0gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVENBQ0hFX0hfCiAjZGVmaW5lIEZUQ0FDSEVfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0dMWVBIX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGdseXBoLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKLSAgICogPFNlY3Rpb24+Ci0gICAqICAgIGNhY2hlX3N1YnN5c3RlbQorICAgKiBAc2VjdGlvbjoKKyAgICogICBjYWNoZV9zdWJzeXN0ZW0KICAgICoKLSAgICogPFRpdGxlPgotICAgKiAgICBDYWNoZSBTdWItU3lzdGVtCisgICAqIEB0aXRsZToKKyAgICogICBDYWNoZSBTdWItU3lzdGVtCiAgICAqCi0gICAqIDxBYnN0cmFjdD4KLSAgICogICAgSG93IHRvIGNhY2hlIGZhY2UsIHNpemUsIGFuZCBnbHlwaCBkYXRhIHdpdGggRnJlZVR5cGV+Mi4KKyAgICogQGFic3RyYWN0OgorICAgKiAgIEhvdyB0byBjYWNoZSBmYWNlLCBzaXplLCBhbmQgZ2x5cGggZGF0YSB3aXRoIEZyZWVUeXBlfjIuCiAgICAqCi0gICAqIDxEZXNjcmlwdGlvbj4KKyAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbSwgd2hpY2ggaXMgdXNlZAogICAgKiAgIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29uY3VycmVudGx5IG9wZW5lZCBARlRfRmFjZSBhbmQgQEZUX1NpemUKICAgICogICBvYmplY3RzLCBhcyB3ZWxsIGFzIGNhY2hpbmcgaW5mb3JtYXRpb24gbGlrZSBjaGFyYWN0ZXIgbWFwcyBhbmQgZ2x5cGgKICAgICogICBpbWFnZXMgd2hpbGUgbGltaXRpbmcgdGhlaXIgbWF4aW11bSBtZW1vcnkgdXNhZ2UuCiAgICAqCi0gICAqICAgTm90ZSB0aGF0IGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zIGJlZ2luIHdpdGggdGhlIGBGVENfJyBwcmVmaXguCisgICAqICAgTm90ZSB0aGF0IGFsbCB0eXBlcyBhbmQgZnVuY3Rpb25zIGJlZ2luIHdpdGggdGhlIGBGVENfYCBwcmVmaXguCiAgICAqCiAgICAqICAgVGhlIGNhY2hlIGlzIGhpZ2hseSBwb3J0YWJsZSBhbmQgdGh1cyBkb2Vzbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlCiAgICAqICAgZm9udHMgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCBvciBob3cgdG8gYWNjZXNzIHRoZW0uICBUaGlzIGltcGxpZXMKQEAgLTU5LDcgKzU4LDcgQEAKICAgICogICB0byBjb252ZXJ0IGFuIEBGVENfRmFjZUlEIGludG8gYSBuZXcgQEZUX0ZhY2Ugb2JqZWN0LiAgVGhlIGxhdHRlciBpcwogICAgKiAgIHRoZW4gY29tcGxldGVseSBtYW5hZ2VkIGJ5IHRoZSBjYWNoZSwgaW5jbHVkaW5nIGl0cyB0ZXJtaW5hdGlvbgogICAgKiAgIHRocm91Z2ggQEZUX0RvbmVfRmFjZS4gIFRvIG1vbml0b3IgdGVybWluYXRpb24gb2YgZmFjZSBvYmplY3RzLCB0aGUKLSAgICogICBmaW5hbGl6ZXIgY2FsbGJhY2sgaW4gdGhlIGBnZW5lcmljJyBmaWVsZCBvZiB0aGUgQEZUX0ZhY2Ugb2JqZWN0IGNhbgorICAgKiAgIGZpbmFsaXplciBjYWxsYmFjayBpbiB0aGUgYGdlbmVyaWNgIGZpZWxkIG9mIHRoZSBARlRfRmFjZSBvYmplY3QgY2FuCiAgICAqICAgYmUgdXNlZCwgd2hpY2ggbWlnaHQgYWxzbyBiZSB1c2VkIHRvIHN0b3JlIHRoZSBARlRDX0ZhY2VJRCBvZiB0aGUKICAgICogICBmYWNlLgogICAgKgpAQCAtNjksMTQgKzY4LDE0IEBACiAgICAqICAgcG9zc2libGUuCiAgICAqCiAgICAqICAgTm90ZSB0aGF0IGZvciB0aGUgY2FjaGUgdG8gd29yayBjb3JyZWN0bHksIHRoZSBmYWNlIElEIHZhbHVlcyBtdXN0IGJlCi0gICAqICAgKnBlcnNpc3RlbnQqLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjb250ZW50cyB0aGV5IHBvaW50IHRvIHNob3VsZCBub3QKKyAgICogICAqKnBlcnNpc3RlbnQqKiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29udGVudHMgdGhleSBwb2ludCB0byBzaG91bGQgbm90CiAgICAqICAgY2hhbmdlIGF0IHJ1bnRpbWUsIG9yIHRoYXQgdGhlaXIgdmFsdWUgc2hvdWxkIG5vdCBiZWNvbWUgaW52YWxpZC4KICAgICoKICAgICogICBJZiB0aGlzIGlzIHVuYXZvaWRhYmxlIChlLmcuLCB3aGVuIGEgZm9udCBpcyB1bmluc3RhbGxlZCBhdCBydW50aW1lKSwKICAgICogICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCBhcyBzb29uIGFzIHBvc3NpYmxlLCB0byBsZXQKLSAgICogICB0aGUgY2FjaGUgZ2V0IHJpZCBvZiBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb2xkIEBGVENfRmFjZUlEIGl0IG1heQotICAgKiAgIGtlZXAgaW50ZXJuYWxseS4gIEZhaWx1cmUgdG8gZG8gc28gd2lsbCBsZWFkIHRvIGluY29ycmVjdCBiZWhhdmlvdXIKLSAgICogICBvciBldmVuIGNyYXNoZXMuCisgICAqICAgdGhlIGNhY2hlIGdldCByaWQgb2YgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9sZCBARlRDX0ZhY2VJRCBpdCBtYXkga2VlcAorICAgKiAgIGludGVybmFsbHkuICBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgbGVhZCB0byBpbmNvcnJlY3QgYmVoYXZpb3VyIG9yIGV2ZW4KKyAgICogICBjcmFzaGVzLgogICAgKgogICAgKiAgIFRvIHVzZSB0aGUgY2FjaGUsIHN0YXJ0IHdpdGggY2FsbGluZyBARlRDX01hbmFnZXJfTmV3IHRvIGNyZWF0ZSBhIG5ldwogICAgKiAgIEBGVENfTWFuYWdlciBvYmplY3QsIHdoaWNoIG1vZGVscyBhIHNpbmdsZSBjYWNoZSBpbnN0YW5jZS4gIFlvdSBjYW4KQEAgLTkxLDE2ICs5MCwxNiBAQAogICAgKiAgIGxhdGVyIHVzZSBARlRDX0ltYWdlQ2FjaGVfTG9va3VwIHRvIHJldHJpZXZlIHRoZSBjb3JyZXNwb25kaW5nCiAgICAqICAgQEZUX0dseXBoIG9iamVjdHMgZnJvbSB0aGUgY2FjaGUuCiAgICAqCi0gICAqICAgSWYgeW91IG5lZWQgbG90cyBvZiBzbWFsbCBiaXRtYXBzLCBpdCBpcyBtdWNoIG1vcmUgbWVtb3J5IGVmZmljaWVudAotICAgKiAgIHRvIGNhbGwgQEZUQ19TQml0Q2FjaGVfTmV3IGZvbGxvd2VkIGJ5IEBGVENfU0JpdENhY2hlX0xvb2t1cC4gIFRoaXMKLSAgICogICByZXR1cm5zIEBGVENfU0JpdFJlYyBzdHJ1Y3R1cmVzLCB3aGljaCBhcmUgdXNlZCB0byBzdG9yZSBzbWFsbAotICAgKiAgIGJpdG1hcHMgZGlyZWN0bHkuICAoQSBzbWFsbCBiaXRtYXAgaXMgb25lIHdob3NlIG1ldHJpY3MgYW5kCi0gICAqICAgZGltZW5zaW9ucyBhbGwgZml0IGludG8gOC1iaXQgaW50ZWdlcnMpLgorICAgKiAgIElmIHlvdSBuZWVkIGxvdHMgb2Ygc21hbGwgYml0bWFwcywgaXQgaXMgbXVjaCBtb3JlIG1lbW9yeSBlZmZpY2llbnQgdG8KKyAgICogICBjYWxsIEBGVENfU0JpdENhY2hlX05ldyBmb2xsb3dlZCBieSBARlRDX1NCaXRDYWNoZV9Mb29rdXAuICBUaGlzCisgICAqICAgcmV0dXJucyBARlRDX1NCaXRSZWMgc3RydWN0dXJlcywgd2hpY2ggYXJlIHVzZWQgdG8gc3RvcmUgc21hbGwgYml0bWFwcworICAgKiAgIGRpcmVjdGx5LiAgKEEgc21hbGwgYml0bWFwIGlzIG9uZSB3aG9zZSBtZXRyaWNzIGFuZCBkaW1lbnNpb25zIGFsbCBmaXQKKyAgICogICBpbnRvIDgtYml0IGludGVnZXJzKS4KICAgICoKICAgICogICBXZSBob3BlIHRvIGFsc28gcHJvdmlkZSBhIGtlcm5pbmcgY2FjaGUgaW4gdGhlIG5lYXIgZnV0dXJlLgogICAgKgogICAgKgotICAgKiA8T3JkZXI+CisgICAqIEBvcmRlcjoKICAgICogICBGVENfTWFuYWdlcgogICAgKiAgIEZUQ19GYWNlSUQKICAgICogICBGVENfRmFjZV9SZXF1ZXN0ZXIKQEAgLTE0MiwxOSArMTQxLDIwIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEB0eXBlOiBGVENfRmFjZUlECisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19GYWNlSUQKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEFuIG9wYXF1ZSBwb2ludGVyIHR5cGUgdGhhdCBpcyB1c2VkIHRvIGlkZW50aXR5IGZhY2Ugb2JqZWN0cy4gIFRoZQogICAgKiAgIGNvbnRlbnRzIG9mIHN1Y2ggb2JqZWN0cyBpcyBhcHBsaWNhdGlvbi1kZXBlbmRlbnQuCiAgICAqCi0gICAqICAgVGhlc2UgcG9pbnRlcnMgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBvaW50IHRvIGEgdXNlci1kZWZpbmVkCi0gICAqICAgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBmb250IGZpbGUgcGF0aCwgYW5kIGZhY2UgaW5kZXguCisgICAqICAgVGhlc2UgcG9pbnRlcnMgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBvaW50IHRvIGEgdXNlci1kZWZpbmVkIHN0cnVjdHVyZQorICAgKiAgIGNvbnRhaW5pbmcgYSBmb250IGZpbGUgcGF0aCwgYW5kIGZhY2UgaW5kZXguCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIE5ldmVyIHVzZSBOVUxMIGFzIGEgdmFsaWQgQEZUQ19GYWNlSUQuCisgICAqICAgTmV2ZXIgdXNlIGBOVUxMYCBhcyBhIHZhbGlkIEBGVENfRmFjZUlELgogICAgKgogICAgKiAgIEZhY2UgSURzIGFyZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY2FjaGUgbWFuYWdlciB0aGF0IGNhbGxzLAogICAgKiAgIHdoZW4gbmVlZGVkLCB0aGUgQEZUQ19GYWNlX1JlcXVlc3RlciB0byB0cmFuc2xhdGUgdGhlbSBpbnRvIG5ldwpAQCAtMTY1LDEzICsxNjUsMTMgQEAKICAgICogICBpbW1lZGlhdGVseSBjYWxsIEBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQgYmVmb3JlIGFueSBvdGhlciBjYWNoZQogICAgKiAgIGZ1bmN0aW9uLgogICAgKgotICAgKiAgIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW91ciBvciBldmVuCi0gICAqICAgbWVtb3J5IGxlYWtzIGFuZCBjcmFzaGVzLgorICAgKiAgIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW91ciBvciBldmVuIG1lbW9yeQorICAgKiAgIGxlYWtzIGFuZCBjcmFzaGVzLgogICAgKi8KICAgdHlwZWRlZiBGVF9Qb2ludGVyICBGVENfRmFjZUlEOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIEZUQ19GYWNlX1JlcXVlc3RlcgpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAqICAgdGhlIGNhY2hlIG1hbmFnZXIgdG8gdHJhbnNsYXRlIGEgZ2l2ZW4gQEZUQ19GYWNlSUQgaW50byBhIG5ldyB2YWxpZAogICAgKiAgIEBGVF9GYWNlIG9iamVjdCwgb24gZGVtYW5kLgogICAgKgotICAgKiA8SW5wdXQ+CisgICAqIEBpbnB1dDoKICAgICogICBmYWNlX2lkIDo6CiAgICAqICAgICBUaGUgZmFjZSBJRCB0byByZXNvbHZlLgogICAgKgpAQCAtMTkxLDE1ICsxOTEsMTUgQEAKICAgICogICByZXFfZGF0YSA6OgogICAgKiAgICAgQXBwbGljYXRpb24tcHJvdmlkZWQgcmVxdWVzdCBkYXRhIChzZWUgbm90ZSBiZWxvdykuCiAgICAqCi0gICAqIDxPdXRwdXQ+CisgICAqIEBvdXRwdXQ6CiAgICAqICAgYWZhY2UgOjoKICAgICogICAgIEEgbmV3IEBGVF9GYWNlIGhhbmRsZS4KICAgICoKLSAgICogPFJldHVybj4KKyAgICogQHJldHVybjoKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgotICAgKiA8Tm90ZT4KLSAgICogICBUaGUgdGhpcmQgcGFyYW1ldGVyIGByZXFfZGF0YScgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgYnkgdGhlCisgICAqIEBub3RlOgorICAgKiAgIFRoZSB0aGlyZCBwYXJhbWV0ZXIgYHJlcV9kYXRhYCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBieSB0aGUKICAgICogICBjbGllbnQgd2hlbiBARlRDX01hbmFnZXJfTmV3IGlzIGNhbGxlZC4KICAgICoKICAgICogICBUaGUgZmFjZSByZXF1ZXN0ZXIgc2hvdWxkIG5vdCBwZXJmb3JtIGZ1bm55IHRoaW5ncyBvbiB0aGUgcmV0dXJuZWQKQEAgLTIyNiw4NCArMjI2LDkwIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBvYmplY3QgY29ycmVzcG9uZHMgdG8gb25lIGluc3RhbmNlIG9mIHRoZSBjYWNoZS1zdWJzeXN0ZW0uICAgICovCi0gIC8qICAgIEl0IGlzIHVzZWQgdG8gY2FjaGUgb25lIG9yIG1vcmUgQEZUX0ZhY2Ugb2JqZWN0cywgYWxvbmcgd2l0aCAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYW5hZ2VyIGludGVudGlvbmFsbHkgbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlbmVkICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cyB0byBjb250cm9sIG1lbW9yeSB1c2FnZS4gIFNlZSB0aGUgICAgKi8KLSAgLyogICAgYG1heF9mYWNlcycgYW5kIGBtYXhfc2l6ZXMnIHBhcmFtZXRlcnMgb2YgQEZUQ19NYW5hZ2VyX05ldy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWFuYWdlciBpcyBhbHNvIHVzZWQgdG8gY2FjaGUgYG5vZGVzJyBvZiB2YXJpb3VzIHR5cGVzIHdoaWxlICAgKi8KLSAgLyogICAgbGltaXRpbmcgdGhlaXIgdG90YWwgbWVtb3J5IHVzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgbGltaXRhdGlvbnMgYXJlIGVuZm9yY2VkIGJ5IGtlZXBpbmcgbGlzdHMgb2YgbWFuYWdlZCBvYmplY3RzICAgKi8KLSAgLyogICAgaW4gbW9zdC1yZWNlbnRseS11c2VkIG9yZGVyLCBhbmQgZmx1c2hpbmcgb2xkIG5vZGVzIHRvIG1ha2Ugcm9vbSAgICovCi0gIC8qICAgIGZvciBuZXcgb25lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19NYW5hZ2VyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIG9iamVjdCBjb3JyZXNwb25kcyB0byBvbmUgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLXN1YnN5c3RlbS4gIEl0IGlzCisgICAqICAgdXNlZCB0byBjYWNoZSBvbmUgb3IgbW9yZSBARlRfRmFjZSBvYmplY3RzLCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcKKyAgICogICBARlRfU2l6ZSBvYmplY3RzLgorICAgKgorICAgKiAgIFRoZSBtYW5hZ2VyIGludGVudGlvbmFsbHkgbGltaXRzIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3BlbmVkIEBGVF9GYWNlCisgICAqICAgYW5kIEBGVF9TaXplIG9iamVjdHMgdG8gY29udHJvbCBtZW1vcnkgdXNhZ2UuICBTZWUgdGhlIGBtYXhfZmFjZXNgIGFuZAorICAgKiAgIGBtYXhfc2l6ZXNgIHBhcmFtZXRlcnMgb2YgQEZUQ19NYW5hZ2VyX05ldy4KKyAgICoKKyAgICogICBUaGUgbWFuYWdlciBpcyBhbHNvIHVzZWQgdG8gY2FjaGUgJ25vZGVzJyBvZiB2YXJpb3VzIHR5cGVzIHdoaWxlCisgICAqICAgbGltaXRpbmcgdGhlaXIgdG90YWwgbWVtb3J5IHVzYWdlLgorICAgKgorICAgKiAgIEFsbCBsaW1pdGF0aW9ucyBhcmUgZW5mb3JjZWQgYnkga2VlcGluZyBsaXN0cyBvZiBtYW5hZ2VkIG9iamVjdHMgaW4KKyAgICogICBtb3N0LXJlY2VudGx5LXVzZWQgb3JkZXIsIGFuZCBmbHVzaGluZyBvbGQgbm9kZXMgdG8gbWFrZSByb29tIGZvciBuZXcKKyAgICogICBvbmVzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRDX01hbmFnZXJSZWNfKiAgRlRDX01hbmFnZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGEgY2FjaGUgbm9kZSBvYmplY3QuICBFYWNoIGNhY2hlIG5vZGUgaXMgICAgICAgKi8KLSAgLyogICAgcmVmZXJlbmNlLWNvdW50ZWQuICBBIG5vZGUgd2l0aCBhIGNvdW50IG9mfjAgbWlnaHQgYmUgZmx1c2hlZCAgICAgICovCi0gIC8qICAgIG91dCBvZiBhIGZ1bGwgY2FjaGUgd2hlbmV2ZXIgYSBsb29rdXAgcmVxdWVzdCBpcyBwZXJmb3JtZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IGxvb2sgdXAgbm9kZXMsIHlvdSBoYXZlIHRoZSBhYmlsaXR5IHRvIGBhY3F1aXJlJyB0aGVtLCAgICAgICovCi0gIC8qICAgIGkuZS4sIHRvIGluY3JlbWVudCB0aGVpciByZWZlcmVuY2UgY291bnQuICBUaGlzIHdpbGwgcHJldmVudCB0aGUgICAqLwotICAvKiAgICBub2RlIGZyb20gYmVpbmcgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIHVudGlsIHlvdSBleHBsaWNpdGx5ICAgICAgKi8KLSAgLyogICAgYHJlbGVhc2UnIGl0IChzZWUgQEZUQ19Ob2RlX1VucmVmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgYWxzbyBARlRDX1NCaXRDYWNoZV9Mb29rdXAgYW5kIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVENfTm9kZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gb3BhcXVlIGhhbmRsZSB0byBhIGNhY2hlIG5vZGUgb2JqZWN0LiAgRWFjaCBjYWNoZSBub2RlIGlzCisgICAqICAgcmVmZXJlbmNlLWNvdW50ZWQuICBBIG5vZGUgd2l0aCBhIGNvdW50IG9mfjAgbWlnaHQgYmUgZmx1c2hlZCBvdXQgb2YgYQorICAgKiAgIGZ1bGwgY2FjaGUgd2hlbmV2ZXIgYSBsb29rdXAgcmVxdWVzdCBpcyBwZXJmb3JtZWQuCisgICAqCisgICAqICAgSWYgeW91IGxvb2sgdXAgbm9kZXMsIHlvdSBoYXZlIHRoZSBhYmlsaXR5IHRvICdhY3F1aXJlJyB0aGVtLCBpLmUuLCB0bworICAgKiAgIGluY3JlbWVudCB0aGVpciByZWZlcmVuY2UgY291bnQuICBUaGlzIHdpbGwgcHJldmVudCB0aGUgbm9kZSBmcm9tCisgICAqICAgYmVpbmcgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIHVudGlsIHlvdSBleHBsaWNpdGx5ICdyZWxlYXNlJyBpdCAoc2VlCisgICAqICAgQEZUQ19Ob2RlX1VucmVmKS4KKyAgICoKKyAgICogICBTZWUgYWxzbyBARlRDX1NCaXRDYWNoZV9Mb29rdXAgYW5kIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVENfTm9kZVJlY18qICBGVENfTm9kZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBUaGUgcGFyZW50IEZyZWVUeXBlIGxpYnJhcnkgaGFuZGxlIHRvIHVzZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2ZhY2VzIDo6IE1heGltdW0gbnVtYmVyIG9mIG9wZW5lZCBARlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICB0aGlzIGNhY2hlIGluc3RhbmNlLiAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3NpemVzIDo6IE1heGltdW0gbnVtYmVyIG9mIG9wZW5lZCBARlRfU2l6ZSBvYmplY3RzIG1hbmFnZWQgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICB0aGlzIGNhY2hlIGluc3RhbmNlLiAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2J5dGVzIDo6IE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSBmb3IgY2FjaGVkIGRhdGEgbm9kZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICBVc2V+MCBmb3IgZGVmYXVsdHMuICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIG5vdCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYWNjb3VudCBmb3IgbWFuYWdlZCBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3RlciA6OiBBbiBhcHBsaWNhdGlvbi1wcm92aWRlZCBjYWxsYmFjayB1c2VkIHRvIHRyYW5zbGF0ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZmFjZSBJRHMgaW50byByZWFsIEBGVF9GYWNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcV9kYXRhICA6OiBBIGdlbmVyaWMgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB0aGUgcmVxdWVzdGVyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCAoc2VlIEBGVENfRmFjZV9SZXF1ZXN0ZXIpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFuYWdlciAgOjogQSBoYW5kbGUgdG8gYSBuZXcgbWFuYWdlciBvYmplY3QuICAwfmluIGNhc2Ugb2YgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUQ19NYW5hZ2VyX05ldworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ3JlYXRlIGEgbmV3IGNhY2hlIG1hbmFnZXIuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBUaGUgcGFyZW50IEZyZWVUeXBlIGxpYnJhcnkgaGFuZGxlIHRvIHVzZS4KKyAgICoKKyAgICogICBtYXhfZmFjZXMgOjoKKyAgICogICAgIE1heGltdW0gbnVtYmVyIG9mIG9wZW5lZCBARlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgdGhpcyBjYWNoZQorICAgKiAgICAgaW5zdGFuY2UuICBVc2V+MCBmb3IgZGVmYXVsdHMuCisgICAqCisgICAqICAgbWF4X3NpemVzIDo6CisgICAqICAgICBNYXhpbXVtIG51bWJlciBvZiBvcGVuZWQgQEZUX1NpemUgb2JqZWN0cyBtYW5hZ2VkIGJ5IHRoaXMgY2FjaGUKKyAgICogICAgIGluc3RhbmNlLiAgVXNlfjAgZm9yIGRlZmF1bHRzLgorICAgKgorICAgKiAgIG1heF9ieXRlcyA6OgorICAgKiAgICAgTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGZvciBjYWNoZWQgZGF0YSBub2Rlcy4gIFVzZX4wIGZvcgorICAgKiAgICAgZGVmYXVsdHMuICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBkb2VzIG5vdCBhY2NvdW50IGZvciBtYW5hZ2VkCisgICAqICAgICBARlRfRmFjZSBhbmQgQEZUX1NpemUgb2JqZWN0cy4KKyAgICoKKyAgICogICByZXF1ZXN0ZXIgOjoKKyAgICogICAgIEFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIGNhbGxiYWNrIHVzZWQgdG8gdHJhbnNsYXRlIGZhY2UgSURzIGludG8KKyAgICogICAgIHJlYWwgQEZUX0ZhY2Ugb2JqZWN0cy4KKyAgICoKKyAgICogICByZXFfZGF0YSA6OgorICAgKiAgICAgQSBnZW5lcmljIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHJlcXVlc3RlciBlYWNoIHRpbWUgaXQgaXMKKyAgICogICAgIGNhbGxlZCAoc2VlIEBGVENfRmFjZV9SZXF1ZXN0ZXIpLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFtYW5hZ2VyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIG5ldyBtYW5hZ2VyIG9iamVjdC4gIDB+aW4gY2FzZSBvZiBmYWlsdXJlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRDX01hbmFnZXJfTmV3KCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICBtYXhfZmFjZXMsCkBAIC0zMTQsMTE0ICszMjAsMTI0IEBACiAgICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgICAgICAgICphbWFuYWdlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1wdHkgYSBnaXZlbiBjYWNoZSBtYW5hZ2VyLiAgVGhpcyBzaW1wbHkgZ2V0cyByaWQgb2YgYWxsIHRoZSAgICAgICovCi0gIC8qICAgIGN1cnJlbnRseSBjYWNoZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgd2l0aGluIHRoZSBtYW5hZ2VyLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfTWFuYWdlcl9SZXNldAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRW1wdHkgYSBnaXZlbiBjYWNoZSBtYW5hZ2VyLiAgVGhpcyBzaW1wbHkgZ2V0cyByaWQgb2YgYWxsIHRoZQorICAgKiAgIGN1cnJlbnRseSBjYWNoZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgd2l0aGluIHRoZSBtYW5hZ2VyLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbWFuYWdlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIG1hbmFnZXIuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVENfTWFuYWdlcl9SZXNldCggRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBtYW5hZ2VyIGFmdGVyIGVtcHR5aW5nIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBjYWNoZSBtYW5hZ2VyIG9iamVjdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfTWFuYWdlcl9Eb25lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXN0cm95IGEgZ2l2ZW4gbWFuYWdlciBhZnRlciBlbXB0eWluZyBpdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hbmFnZXIgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgY2FjaGUgbWFuYWdlciBvYmplY3QuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVENfTWFuYWdlcl9Eb25lKCBGVENfTWFuYWdlciAgbWFuYWdlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEBGVF9GYWNlIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gZmFjZSBJRCAgICovCi0gIC8qICAgIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pZCA6OiBUaGUgSUQgb2YgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIEBGVF9GYWNlIG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIG1hbmFnZXIuICBZb3UgICovCi0gIC8qICAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCB5b3Vyc2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEBGVF9GYWNlIG9iamVjdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGhhdmUgYSBjdXJyZW50IHNpemUgb2JqZWN0ICovCi0gIC8qICAgIChpLmUuLCBmYWNlLT5zaXplIGNhbiBiZX4wKS4gIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgYGZvbnQgc2l6ZScsICAqLwotICAvKiAgICB1c2UgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ldmVyIGNoYW5nZSB0aGUgZmFjZSdzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAoaS5lLiwgbmV2ZXIgY2FsbCAgICAqLwotICAvKiAgICB0aGUgQEZUX1NldF9UcmFuc2Zvcm0gZnVuY3Rpb24pIG9uIGEgcmV0dXJuZWQgZmFjZSEgIElmIHlvdSBuZWVkICAgKi8KLSAgLyogICAgdG8gdHJhbnNmb3JtIGdseXBocywgZG8gaXQgeW91cnNlbGYgYWZ0ZXIgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIHlvdSBwZXJmb3JtIGEgbG9va3VwLCBvdXQtb2YtbWVtb3J5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgICAgICAgKi8KLSAgLyogICAgX3dpdGhpbl8gdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIHVudGlsIGVub3VnaCBtZW1vcnkgaXMgcmVsZWFzZWQgZm9yIHRoZSBsb29rdXAgdG8gc3VjY2VlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnknIHRoZSBjYWNoZSBoYXMgICAgICAgICovCi0gIC8qICAgIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IGZsdXNoZWQsIGFuZCBzdGlsbCBubyBtZW1vcnkgd2FzIGF2YWlsYWJsZSAqLwotICAvKiAgICBmb3IgdGhlIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIEBGVF9GYWNlIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gZmFjZSBJRAorICAgKiAgIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbWFuYWdlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuCisgICAqCisgICAqICAgZmFjZV9pZCA6OgorICAgKiAgICAgVGhlIElEIG9mIHRoZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSByZXR1cm5lZCBARlRfRmFjZSBvYmplY3QgaXMgYWx3YXlzIG93bmVkIGJ5IHRoZSBtYW5hZ2VyLiAgWW91CisgICAqICAgc2hvdWxkIG5ldmVyIHRyeSB0byBkaXNjYXJkIGl0IHlvdXJzZWxmLgorICAgKgorICAgKiAgIFRoZSBARlRfRmFjZSBvYmplY3QgZG9lc24ndCBuZWNlc3NhcmlseSBoYXZlIGEgY3VycmVudCBzaXplIG9iamVjdAorICAgKiAgIChpLmUuLCBmYWNlLT5zaXplIGNhbiBiZX4wKS4gIElmIHlvdSBuZWVkIGEgc3BlY2lmaWMgJ2ZvbnQgc2l6ZScsIHVzZQorICAgKiAgIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplIGluc3RlYWQuCisgICAqCisgICAqICAgTmV2ZXIgY2hhbmdlIHRoZSBmYWNlJ3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IChpLmUuLCBuZXZlciBjYWxsIHRoZQorICAgKiAgIEBGVF9TZXRfVHJhbnNmb3JtIGZ1bmN0aW9uKSBvbiBhIHJldHVybmVkIGZhY2UhICBJZiB5b3UgbmVlZCB0bworICAgKiAgIHRyYW5zZm9ybSBnbHlwaHMsIGRvIGl0IHlvdXJzZWxmIGFmdGVyIGdseXBoIGxvYWRpbmcuCisgICAqCisgICAqICAgV2hlbiB5b3UgcGVyZm9ybSBhIGxvb2t1cCwgb3V0LW9mLW1lbW9yeSBlcnJvcnMgYXJlIGRldGVjdGVkIF93aXRoaW5fCisgICAqICAgdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgdW50aWwgZW5vdWdoCisgICAqICAgbWVtb3J5IGlzIHJlbGVhc2VkIGZvciB0aGUgbG9va3VwIHRvIHN1Y2NlZWQuCisgICAqCisgICAqICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnlgIHRoZSBjYWNoZSBoYXMgYWxyZWFkeQorICAgKiAgIGJlZW4gY29tcGxldGVseSBmbHVzaGVkLCBhbmQgc3RpbGwgbm8gbWVtb3J5IHdhcyBhdmFpbGFibGUgZm9yIHRoZQorICAgKiAgIG9wZXJhdGlvbi4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlKCBGVENfTWFuYWdlciAgbWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NjYWxlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIGNoYXJhY3RlciBzaXplIGluIGVpdGhlciAgICAgICovCi0gIC8qICAgIHBpeGVscyBvciBwb2ludHMgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRDX01hbmFnZXJfTG9va3VwU2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2lkIDo6IFRoZSBzb3VyY2UgZmFjZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgOjogVGhlIGNoYXJhY3RlciB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICA6OiBUaGUgY2hhcmFjdGVyIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbCAgIDo6IEEgQm9vbGVhbi4gIElmIDEsIHRoZSBgd2lkdGgnIGFuZCBgaGVpZ2h0JyBmaWVsZHMgYXJlICAgKi8KLSAgLyogICAgICAgICAgICAgICBpbnRlcnByZXRlZCBhcyBpbnRlZ2VyIHBpeGVsIGNoYXJhY3RlciBzaXplcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBleHByZXNzZWQgYXMgMS82NHRoIG9mIHBvaW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlfjAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgaG9yaXpvbnRhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9yZXMgICA6OiBPbmx5IHVzZWQgd2hlbiBgcGl4ZWwnIGlzIHZhbHVlfjAgdG8gaW5kaWNhdGUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgdmVydGljYWwgcmVzb2x1dGlvbiBpbiBkcGkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyBtYWlubHkgdXNlZCB0byByZXRyaWV2ZSBARlRfU2l6ZSBvYmplY3RzIHRocm91Z2ggdGhlICAqLwotICAvKiAgICBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUQ19TY2FsZXJSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiBjaGFyYWN0ZXIgc2l6ZSBpbiBlaXRoZXIgcGl4ZWxzCisgICAqICAgb3IgcG9pbnRzIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgU2VlIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGZhY2VfaWQgOjoKKyAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBJRC4KKyAgICoKKyAgICogICB3aWR0aCA6OgorICAgKiAgICAgVGhlIGNoYXJhY3RlciB3aWR0aC4KKyAgICoKKyAgICogICBoZWlnaHQgOjoKKyAgICogICAgIFRoZSBjaGFyYWN0ZXIgaGVpZ2h0LgorICAgKgorICAgKiAgIHBpeGVsIDo6CisgICAqICAgICBBIEJvb2xlYW4uICBJZiAxLCB0aGUgYHdpZHRoYCBhbmQgYGhlaWdodGAgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcworICAgKiAgICAgaW50ZWdlciBwaXhlbCBjaGFyYWN0ZXIgc2l6ZXMuICBPdGhlcndpc2UsIHRoZXkgYXJlIGV4cHJlc3NlZCBhcworICAgKiAgICAgMS82NHRoIG9mIHBvaW50cy4KKyAgICoKKyAgICogICB4X3JlcyA6OgorICAgKiAgICAgT25seSB1c2VkIHdoZW4gYHBpeGVsYCBpcyB2YWx1ZX4wIHRvIGluZGljYXRlIHRoZSBob3Jpem9udGFsCisgICAqICAgICByZXNvbHV0aW9uIGluIGRwaS4KKyAgICoKKyAgICogICB5X3JlcyA6OgorICAgKiAgICAgT25seSB1c2VkIHdoZW4gYHBpeGVsYCBpcyB2YWx1ZX4wIHRvIGluZGljYXRlIHRoZSB2ZXJ0aWNhbAorICAgKiAgICAgcmVzb2x1dGlvbiBpbiBkcGkuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgdHlwZSBpcyBtYWlubHkgdXNlZCB0byByZXRyaWV2ZSBARlRfU2l6ZSBvYmplY3RzIHRocm91Z2ggdGhlCisgICAqICAgY2FjaGUgbWFuYWdlci4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVENfU2NhbGVyUmVjXwogICB7CiAgICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKQEAgLTQzNCw4OSArNDUwLDkzIEBACiAgIH0gRlRDX1NjYWxlclJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIEBGVENfU2NhbGVyUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRDX1NjYWxlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYW4gQEZUQ19TY2FsZXJSZWMgc3RydWN0dXJlLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NjYWxlclJlY18qICBGVENfU2NhbGVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEBGVF9TaXplIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4gICAgICAgICAgICovCi0gIC8qICAgIEBGVENfU2NhbGVyUmVjIHBvaW50ZXIgdGhyb3VnaCBhIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2NhbGVyICA6OiBBIHNjYWxlciBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNpemUgICA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIEBGVF9TaXplIG9iamVjdCBpcyBhbHdheXMgb3duZWQgYnkgdGhlIG1hbmFnZXIuICBZb3UgICovCi0gIC8qICAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCBieSB5b3Vyc2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiBhY2Nlc3MgdGhlIHBhcmVudCBARlRfRmFjZSBvYmplY3Qgc2ltcGx5IGFzIGBzaXplLT5mYWNlJyAgICovCi0gIC8qICAgIGlmIHlvdSBuZWVkIGl0LiAgTm90ZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGFsc28gb3duZWQgYnkgdGhlICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIHlvdSBwZXJmb3JtIGEgbG9va3VwLCBvdXQtb2YtbWVtb3J5IGVycm9ycyBhcmUgZGV0ZWN0ZWQgICAgICAgKi8KLSAgLyogICAgX3dpdGhpbl8gdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIHVudGlsIGVub3VnaCBtZW1vcnkgaXMgcmVsZWFzZWQgZm9yIHRoZSBsb29rdXAgdG8gc3VjY2VlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnknIHRoZSBjYWNoZSBoYXMgICAgICAgICovCi0gIC8qICAgIGFscmVhZHkgYmVlbiBjb21wbGV0ZWx5IGZsdXNoZWQsIGFuZCBzdGlsbCBubyBtZW1vcnkgaXMgYXZhaWxhYmxlICAqLwotICAvKiAgICBmb3IgdGhlIG9wZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIEBGVF9TaXplIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgZ2l2ZW4KKyAgICogICBARlRDX1NjYWxlclJlYyBwb2ludGVyIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbWFuYWdlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIuCisgICAqCisgICAqICAgc2NhbGVyIDo6CisgICAqICAgICBBIHNjYWxlciBoYW5kbGUuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYXNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgcmV0dXJuZWQgQEZUX1NpemUgb2JqZWN0IGlzIGFsd2F5cyBvd25lZCBieSB0aGUgbWFuYWdlci4gIFlvdQorICAgKiAgIHNob3VsZCBuZXZlciB0cnkgdG8gZGlzY2FyZCBpdCBieSB5b3Vyc2VsZi4KKyAgICoKKyAgICogICBZb3UgY2FuIGFjY2VzcyB0aGUgcGFyZW50IEBGVF9GYWNlIG9iamVjdCBzaW1wbHkgYXMgYHNpemUtPmZhY2VgIGlmCisgICAqICAgeW91IG5lZWQgaXQuICBOb3RlIHRoYXQgdGhpcyBvYmplY3QgaXMgYWxzbyBvd25lZCBieSB0aGUgbWFuYWdlci4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgV2hlbiB5b3UgcGVyZm9ybSBhIGxvb2t1cCwgb3V0LW9mLW1lbW9yeSBlcnJvcnMgYXJlIGRldGVjdGVkIF93aXRoaW5fCisgICAqICAgdGhlIGxvb2t1cCBhbmQgZm9yY2UgaW5jcmVtZW50YWwgZmx1c2hlcyBvZiB0aGUgY2FjaGUgdW50aWwgZW5vdWdoCisgICAqICAgbWVtb3J5IGlzIHJlbGVhc2VkIGZvciB0aGUgbG9va3VwIHRvIHN1Y2NlZWQuCisgICAqCisgICAqICAgSWYgYSBsb29rdXAgZmFpbHMgd2l0aCBgRlRfRXJyX091dF9PZl9NZW1vcnlgIHRoZSBjYWNoZSBoYXMgYWxyZWFkeQorICAgKiAgIGJlZW4gY29tcGxldGVseSBmbHVzaGVkLCBhbmQgc3RpbGwgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSBmb3IgdGhlCisgICAqICAgb3BlcmF0aW9uLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgc2NhbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAqYXNpemUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19Ob2RlX1VucmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlY3JlbWVudCBhIGNhY2hlIG5vZGUncyBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQuICBXaGVuIHRoZSBjb3VudCAqLwotICAvKiAgICByZWFjaGVzIDAsIGl0IGlzIG5vdCBkZXN0cm95ZWQgYnV0IGJlY29tZXMgZWxpZ2libGUgZm9yIHN1YnNlcXVlbnQgKi8KLSAgLyogICAgY2FjaGUgZmx1c2hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSAgICA6OiBUaGUgY2FjaGUgbm9kZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IFRoZSBjYWNoZSBtYW5hZ2VyIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRDX05vZGVfVW5yZWYKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlY3JlbWVudCBhIGNhY2hlIG5vZGUncyBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQuICBXaGVuIHRoZSBjb3VudAorICAgKiAgIHJlYWNoZXMgMCwgaXQgaXMgbm90IGRlc3Ryb3llZCBidXQgYmVjb21lcyBlbGlnaWJsZSBmb3Igc3Vic2VxdWVudAorICAgKiAgIGNhY2hlIGZsdXNoZXMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBub2RlIDo6CisgICAqICAgICBUaGUgY2FjaGUgbm9kZSBoYW5kbGUuCisgICAqCisgICAqICAgbWFuYWdlciA6OgorICAgKiAgICAgVGhlIGNhY2hlIG1hbmFnZXIgaGFuZGxlLgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRDX05vZGVfVW5yZWYoIEZUQ19Ob2RlICAgICBub2RlLAogICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlECiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHNwZWNpYWwgZnVuY3Rpb24gdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgY2FjaGUgbWFuYWdlciB0aGF0Ci0gICAqICAgYSBnaXZlbiBARlRDX0ZhY2VJRCBpcyBubyBsb25nZXIgdmFsaWQsIGVpdGhlciBiZWNhdXNlIGl0cwotICAgKiAgIGNvbnRlbnQgY2hhbmdlZCwgb3IgYmVjYXVzZSBpdCB3YXMgZGVhbGxvY2F0ZWQgb3IgdW5pbnN0YWxsZWQuCisgICAqICAgQSBzcGVjaWFsIGZ1bmN0aW9uIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIGNhY2hlIG1hbmFnZXIgdGhhdCBhIGdpdmVuCisgICAqICAgQEZUQ19GYWNlSUQgaXMgbm8gbG9uZ2VyIHZhbGlkLCBlaXRoZXIgYmVjYXVzZSBpdHMgY29udGVudCBjaGFuZ2VkLCBvcgorICAgKiAgIGJlY2F1c2UgaXQgd2FzIGRlYWxsb2NhdGVkIG9yIHVuaW5zdGFsbGVkLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgbWFuYWdlciA6OgpAQCAtNTI3LDExICs1NDcsMTEgQEAKICAgICoKICAgICogQG5vdGU6CiAgICAqICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBub2RlcyBmcm9tIHRoZSBjYWNoZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMKLSAgICogICBgZmFjZV9pZCcsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBub2RlcyB3aXRoIGEgbm9uLW51bGwgcmVmZXJlbmNlCisgICAqICAgYGZhY2VfaWRgLCB3aXRoIHRoZSBleGNlcHRpb24gb2Ygbm9kZXMgd2l0aCBhIG5vbi1udWxsIHJlZmVyZW5jZQogICAgKiAgIGNvdW50LgogICAgKgotICAgKiAgIFN1Y2ggbm9kZXMgYXJlIGhvd2V2ZXIgbW9kaWZpZWQgaW50ZXJuYWxseSBzbyBhcyB0byBuZXZlciBhcHBlYXIKLSAgICogICBpbiBsYXRlciBsb29rdXBzIHdpdGggdGhlIHNhbWUgYGZhY2VfaWQnIHZhbHVlLCBhbmQgdG8gYmUgaW1tZWRpYXRlbHkKKyAgICogICBTdWNoIG5vZGVzIGFyZSBob3dldmVyIG1vZGlmaWVkIGludGVybmFsbHkgc28gYXMgdG8gbmV2ZXIgYXBwZWFyIGluCisgICAqICAgbGF0ZXIgbG9va3VwcyB3aXRoIHRoZSBzYW1lIGBmYWNlX2lkYCB2YWx1ZSwgYW5kIHRvIGJlIGltbWVkaWF0ZWx5CiAgICAqICAgZGVzdHJveWVkIHdoZW4gcmVsZWFzZWQgYnkgYWxsIHRoZWlyIHVzZXJzLgogICAgKgogICAgKi8KQEAgLTU0MCwyMCArNTYwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAdHlwZToKICAgICogICBGVENfQ01hcENhY2hlCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBbiBvcGFxdWUgaGFuZGxlIHVzZWQgdG8gbW9kZWwgYSBjaGFybWFwIGNhY2hlLiAgVGhpcyBjYWNoZSBpcyB0bwotICAgKiAgIGhvbGQgY2hhcmFjdGVyIGNvZGVzIC0+IGdseXBoIGluZGljZXMgbWFwcGluZ3MuCisgICAqICAgQW4gb3BhcXVlIGhhbmRsZSB1c2VkIHRvIG1vZGVsIGEgY2hhcm1hcCBjYWNoZS4gIFRoaXMgY2FjaGUgaXMgdG8gaG9sZAorICAgKiAgIGNoYXJhY3RlciBjb2RlcyAtPiBnbHlwaCBpbmRpY2VzIG1hcHBpbmdzLgogICAgKgogICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0NNYXBDYWNoZVJlY18qICBGVENfQ01hcENhY2hlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVENfQ01hcENhY2hlX05ldwpAQCAtNTY3LDcgKzU4Nyw3IEBACiAgICAqCiAgICAqIEBvdXRwdXQ6CiAgICAqICAgYWNhY2hlIDo6Ci0gICAqICAgICBBIG5ldyBjYWNoZSBoYW5kbGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCisgICAqICAgICBBIG5ldyBjYWNoZSBoYW5kbGUuICBgTlVMTGAgaW4gY2FzZSBvZiBlcnJvci4KICAgICoKICAgICogQHJldHVybjoKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgpAQCAtNTgyLDcgKzYwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICBGVENfQ01hcENhY2hlICAqYWNhY2hlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRDX0NNYXBDYWNoZV9Mb29rdXAKQEAgLTYwNiw3ICs2MjYsNyBAQAogICAgKiAgICAgVGhlIGNoYXJhY3RlciBjb2RlIChpbiB0aGUgY29ycmVzcG9uZGluZyBjaGFybWFwKS4KICAgICoKICAgICogQHJldHVybjoKLSAgICogICAgR2x5cGggaW5kZXguICAwfm1lYW5zIGBubyBnbHlwaCcuCisgICAqICAgIEdseXBoIGluZGV4LiAgMH5tZWFucyAnbm8gZ2x5cGgnLgogICAgKgogICAgKi8KICAgRlRfRVhQT1JUKCBGVF9VSW50ICkKQEAgLTYyNyw3ICs2NDcsNyBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAc3RydWN0OgogICAgKiAgIEZUQ19JbWFnZVR5cGVSZWMKQEAgLTY1OSw3ICs2NzksNyBAQAogICB9IEZUQ19JbWFnZVR5cGVSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHR5cGU6CiAgICAqICAgRlRDX0ltYWdlVHlwZQpAQCAtNjgwLDgzICs3MDAsODcgQEAKICAgICAgICAgICAgIChkMSktPmZsYWdzICAgPT0gKGQyKS0+ZmxhZ3MgICApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdseXBoIGltYWdlIGNhY2hlIG9iamVjdC4gIFRoZXkgYXJlIGRlc2lnbmVkIHRvICAgICAgKi8KLSAgLyogICAgaG9sZCBtYW55IGRpc3RpbmN0IGdseXBoIGltYWdlcyB3aGlsZSBub3QgZXhjZWVkaW5nIGEgY2VydGFpbiAgICAgICovCi0gIC8qICAgIG1lbW9yeSB0aHJlc2hvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19JbWFnZUNhY2hlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIGdseXBoIGltYWdlIGNhY2hlIG9iamVjdC4gIFRoZXkgYXJlIGRlc2lnbmVkIHRvIGhvbGQKKyAgICogICBtYW55IGRpc3RpbmN0IGdseXBoIGltYWdlcyB3aGlsZSBub3QgZXhjZWVkaW5nIGEgY2VydGFpbiBtZW1vcnkKKyAgICogICB0aHJlc2hvbGQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVENfSW1hZ2VDYWNoZVJlY18qICBGVENfSW1hZ2VDYWNoZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19JbWFnZUNhY2hlX05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogVGhlIHBhcmVudCBtYW5hZ2VyIGZvciB0aGUgaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjYWNoZSAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfSW1hZ2VDYWNoZV9OZXcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBnbHlwaCBpbWFnZSBjYWNoZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hbmFnZXIgOjoKKyAgICogICAgIFRoZSBwYXJlbnQgbWFuYWdlciBmb3IgdGhlIGltYWdlIGNhY2hlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFjYWNoZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIG5ldyBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVENfSW1hZ2VDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICAgbWFuYWdlciwKICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VDYWNoZSAgKmFjYWNoZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSBnaXZlbiBnbHlwaCBpbWFnZSBmcm9tIGEgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgOjogQSBwb2ludGVyIHRvIGEgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXggdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBUaGUgY29ycmVzcG9uZGluZyBARlRfR2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIGdseXBoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBnbHlwaCBpbWFnZSBjYWNoZS4gICovCi0gIC8qICAgIE5ldmVyIHRyeSB0byB0cmFuc2Zvcm0gb3IgZGlzY2FyZCBpdCBtYW51YWxseSEgIFlvdSBjYW4gaG93ZXZlciAgICAqLwotICAvKiAgICBjcmVhdGUgYSBjb3B5IHdpdGggQEZUX0dseXBoX0NvcHkgYW5kIG1vZGlmeSB0aGUgbmV3IG9uZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGltYWdlLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgICAgKi8KLSAgLyogICAgY291bnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsICovCi0gIC8qICAgIGFsd2F5cyBiZSBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBARlRfR2x5cGggY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHJpZXZlIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgZnJvbSBhIGdseXBoIGltYWdlIGNhY2hlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY2FjaGUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuCisgICAqCisgICAqICAgdHlwZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGEgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLgorICAgKgorICAgKiAgIGdpbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFnbHlwaCA6OgorICAgKiAgICAgVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiBmYWlsdXJlLgorICAgKgorICAgKiAgIGFub2RlIDo6CisgICAqICAgICBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBub2RlIGFmdGVyCisgICAqICAgICBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgYmVsb3cpLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuCisgICAqICAgTmV2ZXIgdHJ5IHRvIHRyYW5zZm9ybSBvciBkaXNjYXJkIGl0IG1hbnVhbGx5ISAgWW91IGNhbiBob3dldmVyIGNyZWF0ZQorICAgKiAgIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuCisgICAqCisgICAqICAgSWYgYGFub2RlYCBpcyBfbm90XyBgTlVMTGAsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSBub2RlCisgICAqICAgY29udGFpbmluZyB0aGUgZ2x5cGggaW1hZ2UsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KKyAgICogICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsIGFsd2F5cyBiZQorICAgKiAgIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byAncmVsZWFzZScgaXQuCisgICAqCisgICAqICAgSWYgYGFub2RlYCBpcyBgTlVMTGAsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucworICAgKiAgIHRoYXQgdGhlIEBGVF9HbHlwaCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgY2FsbAorICAgKiAgIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCBpcworICAgKiAgIHBlcnNpc3RlbnQhCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwKCBGVENfSW1hZ2VDYWNoZSAgY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlVHlwZSAgIHR5cGUsCkBAIC03NjUsNTQgKzc4OSw1NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICphbm9kZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2YXJpYW50IG9mIEBGVENfSW1hZ2VDYWNoZV9Mb29rdXAgdGhhdCB1c2VzIGFuIEBGVENfU2NhbGVyUmVjICAgICovCi0gIC8qICAgIHRvIHNwZWNpZnkgdGhlIGZhY2UgSUQgYW5kIGl0cyBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBpbWFnZSBjYWNoZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2NhbGVyICAgICA6OiBBIHBvaW50ZXIgdG8gYSBzY2FsZXIgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzIDo6IFRoZSBjb3JyZXNwb25kaW5nIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCAgICAgOjogVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCAgICAgOjogVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICAgICAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGNhY2hlIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAoc2VlIG5vdGUgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJldHVybmVkIGdseXBoIGlzIG93bmVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBnbHlwaCBpbWFnZSBjYWNoZS4gICovCi0gIC8qICAgIE5ldmVyIHRyeSB0byB0cmFuc2Zvcm0gb3IgZGlzY2FyZCBpdCBtYW51YWxseSEgIFlvdSBjYW4gaG93ZXZlciAgICAqLwotICAvKiAgICBjcmVhdGUgYSBjb3B5IHdpdGggQEZUX0dseXBoX0NvcHkgYW5kIG1vZGlmeSB0aGUgbmV3IG9uZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgX25vdF8gTlVMTCwgaXQgcmVjZWl2ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGltYWdlLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgICAgKi8KLSAgLyogICAgY291bnQuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsICovCi0gIC8qICAgIGFsd2F5cyBiZSBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBARlRfR2x5cGggY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2FsbHMgdG8gQEZUX1NldF9DaGFyX1NpemUgYW5kIGZyaWVuZHMgaGF2ZSBubyBlZmZlY3Qgb24gY2FjaGVkICAgICovCi0gIC8qICAgIGdseXBoczsgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkgaW5zdGVhZC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdmFyaWFudCBvZiBARlRDX0ltYWdlQ2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyB0bworICAgKiAgIHNwZWNpZnkgdGhlIGZhY2UgSUQgYW5kIGl0cyBzaXplLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY2FjaGUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgY2FjaGUuCisgICAqCisgICAqICAgc2NhbGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYSBzY2FsZXIgZGVzY3JpcHRvci4KKyAgICoKKyAgICogICBsb2FkX2ZsYWdzIDo6CisgICAqICAgICBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLgorICAgKgorICAgKiAgIGdpbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFnbHlwaCA6OgorICAgKiAgICAgVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiBmYWlsdXJlLgorICAgKgorICAgKiAgIGFub2RlIDo6CisgICAqICAgICBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSBub2RlIGFmdGVyCisgICAqICAgICBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgYmVsb3cpLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuCisgICAqICAgTmV2ZXIgdHJ5IHRvIHRyYW5zZm9ybSBvciBkaXNjYXJkIGl0IG1hbnVhbGx5ISAgWW91IGNhbiBob3dldmVyIGNyZWF0ZQorICAgKiAgIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuCisgICAqCisgICAqICAgSWYgYGFub2RlYCBpcyBfbm90XyBgTlVMTGAsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSBub2RlCisgICAqICAgY29udGFpbmluZyB0aGUgZ2x5cGggaW1hZ2UsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4KKyAgICogICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgQEZUX0dseXBoKSB3aWxsIGFsd2F5cyBiZQorICAgKiAgIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byAncmVsZWFzZScgaXQuCisgICAqCisgICAqICAgSWYgYGFub2RlYCBpcyBgTlVMTGAsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucworICAgKiAgIHRoYXQgdGhlIEBGVF9HbHlwaCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgY2FsbAorICAgKiAgIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCBpcworICAgKiAgIHBlcnNpc3RlbnQhCisgICAqCisgICAqICAgQ2FsbHMgdG8gQEZUX1NldF9DaGFyX1NpemUgYW5kIGZyaWVuZHMgaGF2ZSBubyBlZmZlY3Qgb24gY2FjaGVkCisgICAqICAgZ2x5cGhzOyB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSSBpbnN0ZWFkLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cFNjYWxlciggRlRDX0ltYWdlQ2FjaGUgIGNhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICAgICBzY2FsZXIsCkBAIC04MjIsNTMgKzg0OSw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgICphbm9kZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gIFNlZSB0aGUgQEZUQ19TQml0UmVjICAgICAgICovCi0gIC8qICAgIHN0cnVjdHVyZSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUQ19TQml0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgU2VlIHRoZSBARlRDX1NCaXRSZWMgc3RydWN0dXJlCisgICAqICAgZm9yIGRldGFpbHMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVENfU0JpdFJlY18qICBGVENfU0JpdDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBjb21wYWN0IHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgc21hbGwgZ2x5cGggYml0bWFwLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICA6OiBUaGUgYml0bWFwIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgIDo6IFRoZSBiaXRtYXAgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICAgICAgOjogVGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIHRvIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGxlZnQgYml0bWFwIGJvcmRlciAoYS5rLmEuIGBsZWZ0IHNpZGUgYmVhcmluZycsIG9yICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBgbHNiJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG9wICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gKG9uIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICBiYXNlbGluZSkgdG8gdGhlIHVwcGVyIGJpdG1hcCBib3JkZXIgKGEuay5hLiBgdG9wICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgc2lkZSBiZWFyaW5nJykuICBUaGUgZGlzdGFuY2UgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHMgKi8KLSAgLyogICAgICAgICAgICAgICAgIHl+Y29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgICAgOjogVGhlIGZvcm1hdCBvZiB0aGUgZ2x5cGggYml0bWFwIChtb25vY2hyb21lIG9yIGdyYXkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9ncmF5cyA6OiBNYXhpbXVtIGdyYXkgbGV2ZWwgdmFsdWUgKGluIHRoZSByYW5nZSAxIHRvfjI1NSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl0Y2ggICAgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGJpdG1hcCBsaW5lLiAgTWF5IGJlIHBvc2l0aXZlICovCi0gIC8qICAgICAgICAgICAgICAgICBvciBuZWdhdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeGFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2Ugd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5YWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRDX1NCaXRSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdmVyeSBjb21wYWN0IHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgc21hbGwgZ2x5cGggYml0bWFwLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHdpZHRoIDo6CisgICAqICAgICBUaGUgYml0bWFwIHdpZHRoIGluIHBpeGVscy4KKyAgICoKKyAgICogICBoZWlnaHQgOjoKKyAgICogICAgIFRoZSBiaXRtYXAgaGVpZ2h0IGluIHBpeGVscy4KKyAgICoKKyAgICogICBsZWZ0IDo6CisgICAqICAgICBUaGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gdG8gdGhlIGxlZnQgYml0bWFwCisgICAqICAgICBib3JkZXIgKGEuay5hLiAnbGVmdCBzaWRlIGJlYXJpbmcnLCBvciAnbHNiJykuCisgICAqCisgICAqICAgdG9wIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgZGlzdGFuY2UgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIChvbiB0aGUgYmFzZWxpbmUpIHRvIHRoZQorICAgKiAgICAgdXBwZXIgYml0bWFwIGJvcmRlciAoYS5rLmEuICd0b3Agc2lkZSBiZWFyaW5nJykuICBUaGUgZGlzdGFuY2UgaXMKKyAgICogICAgIHBvc2l0aXZlIGZvciB1cHdhcmRzIHl+Y29vcmRpbmF0ZXMuCisgICAqCisgICAqICAgZm9ybWF0IDo6CisgICAqICAgICBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCBiaXRtYXAgKG1vbm9jaHJvbWUgb3IgZ3JheSkuCisgICAqCisgICAqICAgbWF4X2dyYXlzIDo6CisgICAqICAgICBNYXhpbXVtIGdyYXkgbGV2ZWwgdmFsdWUgKGluIHRoZSByYW5nZSAxIHRvfjI1NSkuCisgICAqCisgICAqICAgcGl0Y2ggOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGJpdG1hcCBsaW5lLiAgTWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLgorICAgKgorICAgKiAgIHhhZHZhbmNlIDo6CisgICAqICAgICBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlIHdpZHRoIGluIHBpeGVscy4KKyAgICoKKyAgICogICB5YWR2YW5jZSA6OgorICAgKiAgICAgVGhlIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0IGluIHBpeGVscy4KKyAgICoKKyAgICogICBidWZmZXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHBpeGVscy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVENfU0JpdFJlY18KICAgewogICAgIEZUX0J5dGUgICB3aWR0aDsKQEAgLTg4Nyw4NyArOTIxLDkzIEBACiAgIH0gRlRDX1NCaXRSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBjYWNoZS4gIFRoZXNlIGFyZSBzcGVjaWFsIGNhY2hlIG9iamVjdHMgKi8KLSAgLyogICAgdXNlZCB0byBzdG9yZSBzbWFsbCBnbHlwaCBiaXRtYXBzIChhbmQgYW50aS1hbGlhc2VkIHBpeG1hcHMpIGluIGEgICovCi0gIC8qICAgIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5IHRoYW4gdGhlIHRyYWRpdGlvbmFsIGdseXBoIGltYWdlIGNhY2hlICAgICAqLwotICAvKiAgICBpbXBsZW1lbnRlZCBieSBARlRDX0ltYWdlQ2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVENfU0JpdENhY2hlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBjYWNoZS4gIFRoZXNlIGFyZSBzcGVjaWFsIGNhY2hlIG9iamVjdHMKKyAgICogICB1c2VkIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMgKGFuZCBhbnRpLWFsaWFzZWQgcGl4bWFwcykgaW4gYSBtdWNoCisgICAqICAgbW9yZSBlZmZpY2llbnQgd2F5IHRoYW4gdGhlIHRyYWRpdGlvbmFsIGdseXBoIGltYWdlIGNhY2hlIGltcGxlbWVudGVkCisgICAqICAgYnkgQEZUQ19JbWFnZUNhY2hlLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NCaXRDYWNoZVJlY18qICBGVENfU0JpdENhY2hlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGNhY2hlIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHNiaXQgY2FjaGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUQ19TQml0Q2FjaGVfTmV3CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDcmVhdGUgYSBuZXcgY2FjaGUgdG8gc3RvcmUgc21hbGwgZ2x5cGggYml0bWFwcy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hbmFnZXIgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgY2FjaGUgbWFuYWdlci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhY2FjaGUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBuZXcgc2JpdCBjYWNoZS4gIGBOVUxMYCBpbiBjYXNlIG9mIGVycm9yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRDX1NCaXRDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICBtYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXRDYWNoZSAgKmFjYWNoZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9Mb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9vayB1cCBhIGdpdmVuIHNtYWxsIGdseXBoIGJpdG1hcCBpbiBhIGdpdmVuIHNiaXQgY2FjaGUgYW5kICAgICAgICovCi0gIC8qICAgIGBsb2NrJyBpdCB0byBwcmV2ZW50IGl0cyBmbHVzaGluZyBmcm9tIHRoZSBjYWNoZSB1bnRpbCBuZWVkZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0ICAgOjogQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlICAgICovCi0gIC8qICAgIGNhY2hlIGFuZCBzaG91bGQgbmV2ZXIgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhleSBtaWdodCAgICAqLwotICAvKiAgICBhcyB3ZWxsIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0ICAgKi8KLSAgLyogICAgdHJlYXQgdGhlbSBhcyBwZXJzaXN0ZW50IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVzY3JpcHRvcidzIGBidWZmZXInIGZpZWxkIGlzIHNldCB0b34wIHRvIGluZGljYXRlIGEgbWlzc2luZyAgKi8KLSAgLyogICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBiaXRtYXAsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gICovCi0gIC8qICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUgICAqLwotICAvKiAgICBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gYHJlbGVhc2UnIGl0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVENfU0JpdENhY2hlX0xvb2t1cAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgTG9vayB1cCBhIGdpdmVuIHNtYWxsIGdseXBoIGJpdG1hcCBpbiBhIGdpdmVuIHNiaXQgY2FjaGUgYW5kICdsb2NrJyBpdAorICAgKiAgIHRvIHByZXZlbnQgaXRzIGZsdXNoaW5nIGZyb20gdGhlIGNhY2hlIHVudGlsIG5lZWRlZC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGNhY2hlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuCisgICAqCisgICAqICAgdHlwZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBpbWFnZSB0eXBlIGRlc2NyaXB0b3IuCisgICAqCisgICAqICAgZ2luZGV4IDo6CisgICAqICAgICBUaGUgZ2x5cGggaW5kZXguCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgc2JpdCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4KKyAgICoKKyAgICogICBhbm9kZSA6OgorICAgKiAgICAgVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgbm9kZSBhZnRlcgorICAgKiAgICAgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgKHNlZSBub3RlIGJlbG93KS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IgYW5kIGl0cyBiaXQgYnVmZmVyIGFyZSBvd25lZCBieSB0aGUgY2FjaGUKKyAgICogICBhbmQgc2hvdWxkIG5ldmVyIGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZXkgbWlnaHQgYXMgd2VsbAorICAgKiAgIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0IHRyZWF0IHRoZW0gYXMKKyAgICogICBwZXJzaXN0ZW50IGRhdGEuCisgICAqCisgICAqICAgVGhlIGRlc2NyaXB0b3IncyBgYnVmZmVyYCBmaWVsZCBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcKKyAgICogICBnbHlwaCBiaXRtYXAuCisgICAqCisgICAqICAgSWYgYGFub2RlYCBpcyBfbm90XyBgTlVMTGAsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSBub2RlCisgICAqICAgY29udGFpbmluZyB0aGUgYml0bWFwLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuICBUaGlzCisgICAqICAgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUga2VwdCBpbgorICAgKiAgIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gJ3JlbGVhc2UnIGl0LgorICAgKgorICAgKiAgIElmIGBhbm9kZWAgaXMgYE5VTExgLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMKKyAgICogICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0IGNhbGwgdG8KKyAgICogICBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgaXMKKyAgICogICBwZXJzaXN0ZW50IQorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUQ19TQml0Q2FjaGVfTG9va3VwKCBGVENfU0JpdENhY2hlICAgIGNhY2hlLAogICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlVHlwZSAgICB0eXBlLApAQCAtOTc2LDUzICsxMDE2LDU4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAgKmFub2RlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgb2YgQEZUQ19TQml0Q2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyAgICAgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc2NhbGVyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdCAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgICAgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWNoZSBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvciBhbmQgaXRzIGJpdCBidWZmZXIgYXJlIG93bmVkIGJ5IHRoZSAgICAqLwotICAvKiAgICBjYWNoZSBhbmQgc2hvdWxkIG5ldmVyIGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZXkgbWlnaHQgICAgKi8KLSAgLyogICAgYXMgd2VsbCBkaXNhcHBlYXIgZnJvbSBtZW1vcnkgb24gdGhlIG5leHQgY2FjaGUgbG9va3VwLCBzbyBkb24ndCAgICovCi0gIC8qICAgIHRyZWF0IHRoZW0gYXMgcGVyc2lzdGVudCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlc2NyaXB0b3IncyBgYnVmZmVyJyBmaWVsZCBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgICovCi0gIC8qICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgYml0bWFwLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuICAqLwotICAvKiAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgaW1hZ2UpIHdpbGwgYWx3YXlzIGJlICAgKi8KLSAgLyogICAga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvIGByZWxlYXNlJyBpdC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgYml0bWFwIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRDX1NCaXRDYWNoZV9Mb29rdXBTY2FsZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdmFyaWFudCBvZiBARlRDX1NCaXRDYWNoZV9Mb29rdXAgdGhhdCB1c2VzIGFuIEBGVENfU2NhbGVyUmVjIHRvCisgICAqICAgc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBjYWNoZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzYml0IGNhY2hlLgorICAgKgorICAgKiAgIHNjYWxlciA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzY2FsZXIgZGVzY3JpcHRvci4KKyAgICoKKyAgICogICBsb2FkX2ZsYWdzIDo6CisgICAqICAgICBUaGUgY29ycmVzcG9uZGluZyBsb2FkIGZsYWdzLgorICAgKgorICAgKiAgIGdpbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHNiaXQgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGRlc2NyaXB0b3IuCisgICAqCisgICAqICAgYW5vZGUgOjoKKyAgICogICAgIFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNhY2hlIG5vZGUgYWZ0ZXIKKyAgICogICAgIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50IChzZWUgbm90ZSBiZWxvdykuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlIGNhY2hlCisgICAqICAgYW5kIHNob3VsZCBuZXZlciBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24uICBUaGV5IG1pZ2h0IGFzIHdlbGwKKyAgICogICBkaXNhcHBlYXIgZnJvbSBtZW1vcnkgb24gdGhlIG5leHQgY2FjaGUgbG9va3VwLCBzbyBkb24ndCB0cmVhdCB0aGVtIGFzCisgICAqICAgcGVyc2lzdGVudCBkYXRhLgorICAgKgorICAgKiAgIFRoZSBkZXNjcmlwdG9yJ3MgYGJ1ZmZlcmAgZmllbGQgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYSBtaXNzaW5nCisgICAqICAgZ2x5cGggYml0bWFwLgorICAgKgorICAgKiAgIElmIGBhbm9kZWAgaXMgX25vdF8gYE5VTExgLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgbm9kZQorICAgKiAgIGNvbnRhaW5pbmcgdGhlIGJpdG1hcCwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LiAgVGhpcworICAgKiAgIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgaW1hZ2UpIHdpbGwgYWx3YXlzIGJlIGtlcHQgaW4KKyAgICogICB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvICdyZWxlYXNlJyBpdC4KKyAgICoKKyAgICogICBJZiBgYW5vZGVgIGlzIGBOVUxMYCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zCisgICAqICAgdGhhdCB0aGUgYml0bWFwIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCBjYWxsIHRvCisgICAqICAgb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0IGlzCisgICAqICAgcGVyc2lzdGVudCEKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciggRlRDX1NCaXRDYWNoZSAgY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICBzY2FsZXIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRjaGFwdGVycy5oCmluZGV4IDUxMjU3YmIuLjJlZTI2OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjaGFwdGVycy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRjaGFwdGVycy5oCkBAIC0xLDEzOSArMSwxNDUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRnJlZVR5cGUgcmVmZXJlbmNlLiAgICAgICAgICAgICAgKi8KLS8qIEl0IGlzIHVzZWQgYnkgdGhlIHB5dGhvbiBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgdGhlIEhUTUwgZmlsZXMuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgRnJlZVR5cGUgcmVmZXJlbmNlLgorICogSXQgaXMgdXNlZCBieSB0aGUgcHl0aG9uIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyB0aGUgSFRNTCBmaWxlcy4KKyAqCisgKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxDaGFwdGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBnZW5lcmFsX3JlbWFya3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHZW5lcmFsIFJlbWFya3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIDxTZWN0aW9ucz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBoZWFkZXJfaW5jbHVzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgdXNlcl9hbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgZ2VuZXJhbF9yZW1hcmtzCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBHZW5lcmFsIFJlbWFya3MKKyAgICoKKyAgICogQHNlY3Rpb25zOgorICAgKiAgIGhlYWRlcl9pbmNsdXNpb24KKyAgICogICB1c2VyX2FsbG9jYXRpb24KKyAgICoKKyAgICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY29yZV9hcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ29yZSBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiYXNlX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2x5cGhfdmFyaWFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGdseXBoX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtYWNfc3BlY2lmaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc2l6ZXNfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGhlYWRlcl9maWxlX21hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBjaGFwdGVyOgorICAgKiAgIGNvcmVfYXBpCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBDb3JlIEFQSQorICAgKgorICAgKiBAc2VjdGlvbnM6CisgICAqICAgdmVyc2lvbgorICAgKiAgIGJhc2ljX3R5cGVzCisgICAqICAgYmFzZV9pbnRlcmZhY2UKKyAgICogICBnbHlwaF92YXJpYW50cworICAgKiAgIGNvbG9yX21hbmFnZW1lbnQKKyAgICogICBsYXllcl9tYW5hZ2VtZW50CisgICAqICAgZ2x5cGhfbWFuYWdlbWVudAorICAgKiAgIG1hY19zcGVjaWZpYworICAgKiAgIHNpemVzX21hbmFnZW1lbnQKKyAgICogICBoZWFkZXJfZmlsZV9tYWNyb3MKKyAgICoKKyAgICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZm9ybWF0X3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRm9ybWF0LVNwZWNpZmljIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB0eXBlMV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc2ZudF9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJkZl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBjaWRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcGZyX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHdpbmZudF9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBmb250X2Zvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2FzcF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgZm9ybWF0X3NwZWNpZmljCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBGb3JtYXQtU3BlY2lmaWMgQVBJCisgICAqCisgICAqIEBzZWN0aW9uczoKKyAgICogICBtdWx0aXBsZV9tYXN0ZXJzCisgICAqICAgdHJ1ZXR5cGVfdGFibGVzCisgICAqICAgdHlwZTFfdGFibGVzCisgICAqICAgc2ZudF9uYW1lcworICAgKiAgIGJkZl9mb250cworICAgKiAgIGNpZF9mb250cworICAgKiAgIHBmcl9mb250cworICAgKiAgIHdpbmZudF9mb250cworICAgKiAgIGZvbnRfZm9ybWF0cworICAgKiAgIGdhc3BfdGFibGUKKyAgICoKKyAgICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbW9kdWxlX3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ29udHJvbGxpbmcgRnJlZVR5cGUgTW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYXV0b19oaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGNmZl9kcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICB0MV9jaWRfZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgdHRfZHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBjZl9kcml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcGFyYW1ldGVyX3RhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgbW9kdWxlX3NwZWNpZmljCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBDb250cm9sbGluZyBGcmVlVHlwZSBNb2R1bGVzCisgICAqCisgICAqIEBzZWN0aW9uczoKKyAgICogICBhdXRvX2hpbnRlcgorICAgKiAgIGNmZl9kcml2ZXIKKyAgICogICB0MV9jaWRfZHJpdmVyCisgICAqICAgdHRfZHJpdmVyCisgICAqICAgcGNmX2RyaXZlcgorICAgKiAgIHByb3BlcnRpZXMKKyAgICogICBwYXJhbWV0ZXJfdGFncworICAgKiAgIGxjZF9yZW5kZXJpbmcKKyAgICoKKyAgICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ2FjaGUgU3ViLVN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY2FjaGVfc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgY2FjaGVfc3Vic3lzdGVtCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBDYWNoZSBTdWItU3lzdGVtCisgICAqCisgICAqIEBzZWN0aW9uczoKKyAgICogICBjYWNoZV9zdWJzeXN0ZW0KKyAgICoKKyAgICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc3VwcG9ydF9hcGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGxpc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBvdXRsaW5lX3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcXVpY2tfYWR2YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJpdG1hcF9oYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICByYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ2x5cGhfc3Ryb2tlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHN5c3RlbV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtb2R1bGVfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZ3ppcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGx6dyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBiemlwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgbGNkX2ZpbHRlcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgc3VwcG9ydF9hcGkKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFN1cHBvcnQgQVBJCisgICAqCisgICAqIEBzZWN0aW9uczoKKyAgICogICBjb21wdXRhdGlvbnMKKyAgICogICBsaXN0X3Byb2Nlc3NpbmcKKyAgICogICBvdXRsaW5lX3Byb2Nlc3NpbmcKKyAgICogICBxdWlja19hZHZhbmNlCisgICAqICAgYml0bWFwX2hhbmRsaW5nCisgICAqICAgcmFzdGVyCisgICAqICAgZ2x5cGhfc3Ryb2tlcgorICAgKiAgIHN5c3RlbV9pbnRlcmZhY2UKKyAgICogICBtb2R1bGVfbWFuYWdlbWVudAorICAgKiAgIGd6aXAKKyAgICogICBsencKKyAgICogICBiemlwMgorICAgKgorICAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8Q2hhcHRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZXJyb3JfY29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRXJyb3IgQ29kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiA8U2VjdGlvbnM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgZXJyb3JfZW51bWVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGVycm9yX2NvZGVfdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNoYXB0ZXI6CisgICAqICAgZXJyb3JfY29kZXMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIEVycm9yIENvZGVzCisgICAqCisgICAqIEBzZWN0aW9uczoKKyAgICogICBlcnJvcl9lbnVtZXJhdGlvbnMKKyAgICogICBlcnJvcl9jb2RlX3ZhbHVlcworICAgKgorICAgKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaAppbmRleCA1ZTkxMDBhLi5hMjlmYjMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2lkLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGNpZC5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQ0lEIGZvbnQgaW5mb3JtYXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERlcmVnIENsZWdnIGFuZCBNaWNoYWVsIFRvZnRkYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNpZC5oCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBDSUQgZm9udCBpbmZvcm1hdGlvbiAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMjAgYnkKKyAqIERlcmVnIENsZWdnIGFuZCBNaWNoYWVsIFRvZnRkYWwuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVENJRF9IXwogI2RlZmluZSBGVENJRF9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTMyLDI1ICszMSwyNSBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSUQgRm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSUQta2V5ZWQgZm9udCBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIENJRC1rZXllZCBmb250IHNwZWNpZmljICAgKi8KLSAgLyogICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGNpZF9mb250cworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgQ0lEIEZvbnRzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBDSUQta2V5ZWQgZm9udC1zcGVjaWZpYyBBUEkuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIENJRC1rZXllZCBmb250LXNwZWNpZmljCisgICAqICAgZnVuY3Rpb25zLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX0dldF9DSURfUmVnaXN0cnlfT3JkZXJpbmdfU3VwcGxlbWVudApAQCAtNjEsMTcgKzYwLDE3IEBACiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KICAgICoKICAgICogQG91dHB1dDoKICAgICogICAgcmVnaXN0cnkgOjoKLSAgICogICAgICAgVGhlIHJlZ2lzdHJ5LCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KKyAgICogICAgICBUaGUgcmVnaXN0cnksIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgogICAgKgogICAgKiAgICBvcmRlcmluZyA6OgotICAgKiAgICAgICBUaGUgb3JkZXJpbmcsIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgorICAgKiAgICAgIFRoZSBvcmRlcmluZywgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCiAgICAqCiAgICAqICAgIHN1cHBsZW1lbnQgOjoKLSAgICogICAgICAgVGhlIHN1cHBsZW1lbnQuCisgICAqICAgICAgVGhlIHN1cHBsZW1lbnQuCiAgICAqCiAgICAqIEByZXR1cm46CiAgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCkBAIC05MCwzMCArODksMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfS2V5ZWQKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgZmFjZSwgQ0lEIGtleWVkIG9yIG5vdC4gIEluCi0gICAqICAgIGNvbnRyYXN0IHRvIHRoZSBARlRfSVNfQ0lEX0tFWUVEIG1hY3JvIHRoaXMgZnVuY3Rpb24gcmV0dXJucwotICAgKiAgICBzdWNjZXNzZnVsbHkgYWxzbyBmb3IgQ0lELWtleWVkIGZvbnRzIGluIGFuIFNGTlQgd3JhcHBlci4KKyAgICogICAgUmV0cmlldmUgdGhlIHR5cGUgb2YgdGhlIGlucHV0IGZhY2UsIENJRCBrZXllZCBvciBub3QuICBJbiBjb250cmFzdAorICAgKiAgICB0byB0aGUgQEZUX0lTX0NJRF9LRVlFRCBtYWNybyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5IGFsc28KKyAgICogICAgZm9yIENJRC1rZXllZCBmb250cyBpbiBhbiBTRk5UIHdyYXBwZXIuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KICAgICoKICAgICogQG91dHB1dDoKICAgICogICAgaXNfY2lkIDo6Ci0gICAqICAgICAgIFRoZSB0eXBlIG9mIHRoZSBmYWNlIGFzIGFuIEBGVF9Cb29sLgorICAgKiAgICAgIFRoZSB0eXBlIG9mIHRoZSBmYWNlIGFzIGFuIEBGVF9Cb29sLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywKLSAgICogICAgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KKyAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywgcmV0dXJuaW5nCisgICAqICAgIGFuIGVycm9yIG90aGVyd2lzZS4KICAgICoKICAgICogQHNpbmNlOgogICAgKiAgICAyLjMuOQpAQCAtMTIzLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX0dldF9DSURfRnJvbV9HbHlwaF9JbmRleApAQCAtMTMzLDIxICsxMzIsMjEgQEAKICAgICoKICAgICogQGlucHV0OgogICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAgKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgogICAgKgogICAgKiAgICBnbHlwaF9pbmRleCA6OgotICAgKiAgICAgICBUaGUgaW5wdXQgZ2x5cGggaW5kZXguCisgICAqICAgICAgVGhlIGlucHV0IGdseXBoIGluZGV4LgogICAgKgogICAgKiBAb3V0cHV0OgogICAgKiAgICBjaWQgOjoKLSAgICogICAgICAgVGhlIENJRCBhcyBhbiBARlRfVUludC4KKyAgICogICAgICBUaGUgQ0lEIGFzIGFuIEBGVF9VSW50LgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywKLSAgICogICAgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KKyAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywgcmV0dXJuaW5nCisgICAqICAgIGFuIGVycm9yIG90aGVyd2lzZS4KICAgICoKICAgICogQHNpbmNlOgogICAgKiAgICAyLjMuOQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGNvbG9yLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M2NDg1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGNvbG9yLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjb2xvci5oCisgKgorICogICBGcmVlVHlwZSdzIGdseXBoIGNvbG9yIG1hbmFnZW1lbnQgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2lmbmRlZiBGVENPTE9SX0hfCisjZGVmaW5lIEZUQ09MT1JfSF8KKworI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisKKyNpZmRlZiBGUkVFVFlQRV9ICisjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgorI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCisjZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKKyNlbmRpZgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGNvbG9yX21hbmFnZW1lbnQKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIEdseXBoIENvbG9yIE1hbmFnZW1lbnQKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFJldHJpZXZpbmcgYW5kIG1hbmlwdWxhdGluZyBPcGVuVHlwZSdzICdDUEFMJyB0YWJsZSBkYXRhLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIGZ1bmN0aW9ucyBkZXNjcmliZWQgaGVyZSBhbGxvdyBhY2Nlc3MgYW5kIG1hbmlwdWxhdGlvbiBvZiBjb2xvcgorICAgKiAgIHBhbGV0dGUgZW50cmllcyBpbiBPcGVuVHlwZSdzICdDUEFMJyB0YWJsZXMuCisgICAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfQ29sb3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIG1vZGVscyBhIEJHUkEgY29sb3IgdmFsdWUgb2YgYSAnQ1BBTCcgcGFsZXR0ZSBlbnRyeS4KKyAgICoKKyAgICogICBUaGUgdXNlZCBjb2xvciBzcGFjZSBpcyBzUkdCOyB0aGUgY29sb3JzIGFyZSBub3QgcHJlLW11bHRpcGxpZWQsIGFuZAorICAgKiAgIGFscGhhIHZhbHVlcyBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGJsdWUgOjoKKyAgICogICAgIEJsdWUgdmFsdWUuCisgICAqCisgICAqICAgZ3JlZW4gOjoKKyAgICogICAgIEdyZWVuIHZhbHVlLgorICAgKgorICAgKiAgIHJlZCA6OgorICAgKiAgICAgUmVkIHZhbHVlLgorICAgKgorICAgKiAgIGFscGhhIDo6CisgICAqICAgICBBbHBoYSB2YWx1ZSwgZ2l2aW5nIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb2xvcidzIG9wYWNpdHkuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjEwCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgRlRfQ29sb3JfCisgIHsKKyAgICBGVF9CeXRlICBibHVlOworICAgIEZUX0J5dGUgIGdyZWVuOworICAgIEZUX0J5dGUgIHJlZDsKKyAgICBGVF9CeXRlICBhbHBoYTsKKworICB9IEZUX0NvbG9yOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX1BBTEVUVEVfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgYml0IGZpZWxkIGNvbnN0YW50cyB1c2VkIGluIHRoZSBgcGFsZXR0ZV9mbGFnc2AgYXJyYXkgb2YgdGhlCisgICAqICAgQEZUX1BhbGV0dGVfRGF0YSBzdHJ1Y3R1cmUgdG8gaW5kaWNhdGUgZm9yIHdoaWNoIGJhY2tncm91bmQgYSBwYWxldHRlCisgICAqICAgd2l0aCBhIGdpdmVuIGluZGV4IGlzIHVzYWJsZS4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9QQUxFVFRFX0ZPUl9MSUdIVF9CQUNLR1JPVU5EIDo6CisgICAqICAgICBUaGUgcGFsZXR0ZSBpcyBhcHByb3ByaWF0ZSB0byB1c2Ugd2hlbiBkaXNwbGF5aW5nIHRoZSBmb250IG9uIGEKKyAgICogICAgIGxpZ2h0IGJhY2tncm91bmQgc3VjaCBhcyB3aGl0ZS4KKyAgICoKKyAgICogICBGVF9QQUxFVFRFX0ZPUl9EQVJLX0JBQ0tHUk9VTkQgOjoKKyAgICogICAgIFRoZSBwYWxldHRlIGlzIGFwcHJvcHJpYXRlIHRvIHVzZSB3aGVuIGRpc3BsYXlpbmcgdGhlIGZvbnQgb24gYSBkYXJrCisgICAqICAgICBiYWNrZ3JvdW5kIHN1Y2ggYXMgYmxhY2suCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjEwCisgICAqLworI2RlZmluZSBGVF9QQUxFVFRFX0ZPUl9MSUdIVF9CQUNLR1JPVU5EICAweDAxCisjZGVmaW5lIEZUX1BBTEVUVEVfRk9SX0RBUktfQkFDS0dST1VORCAgIDB4MDIKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX1BhbGV0dGVfRGF0YQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGRhdGEgb2YgdGhlICdDUEFMJyB0YWJsZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBudW1fcGFsZXR0ZXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgcGFsZXR0ZXMuCisgICAqCisgICAqICAgcGFsZXR0ZV9uYW1lX2lkcyA6OgorICAgKiAgICAgQW4gb3B0aW9uYWwgcmVhZC1vbmx5IGFycmF5IG9mIHBhbGV0dGUgbmFtZSBJRHMgd2l0aCBgbnVtX3BhbGV0dGVzYAorICAgKiAgICAgZWxlbWVudHMsIGNvcnJlc3BvbmRpbmcgdG8gZW50cmllcyBsaWtlICdkYXJrJyBvciAnbGlnaHQnIGluIHRoZQorICAgKiAgICAgZm9udCdzICduYW1lJyB0YWJsZS4KKyAgICoKKyAgICogICAgIEFuIGVtcHR5IG5hbWUgSUQgaW4gdGhlICdDUEFMJyB0YWJsZSBnZXRzIHJlcHJlc2VudGVkIGFzIHZhbHVlCisgICAqICAgICAweEZGRkYuCisgICAqCisgICAqICAgICBgTlVMTGAgaWYgdGhlIGZvbnQncyAnQ1BBTCcgdGFibGUgZG9lc24ndCBjb250YWluIGFwcHJvcHJpYXRlIGRhdGEuCisgICAqCisgICAqICAgcGFsZXR0ZV9mbGFncyA6OgorICAgKiAgICAgQW4gb3B0aW9uYWwgcmVhZC1vbmx5IGFycmF5IG9mIHBhbGV0dGUgZmxhZ3Mgd2l0aCBgbnVtX3BhbGV0dGVzYAorICAgKiAgICAgZWxlbWVudHMuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIGFuIE9SZWQgY29tYmluYXRpb24gb2YKKyAgICogICAgIEBGVF9QQUxFVFRFX0ZPUl9MSUdIVF9CQUNLR1JPVU5EIGFuZAorICAgKiAgICAgQEZUX1BBTEVUVEVfRk9SX0RBUktfQkFDS0dST1VORC4KKyAgICoKKyAgICogICAgIGBOVUxMYCBpZiB0aGUgZm9udCdzICdDUEFMJyB0YWJsZSBkb2Vzbid0IGNvbnRhaW4gYXBwcm9wcmlhdGUgZGF0YS4KKyAgICoKKyAgICogICBudW1fcGFsZXR0ZV9lbnRyaWVzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gYSBzaW5nbGUgcGFsZXR0ZS4gIEFsbCBwYWxldHRlcyBoYXZlIHRoZQorICAgKiAgICAgc2FtZSBzaXplLgorICAgKgorICAgKiAgIHBhbGV0dGVfZW50cnlfbmFtZV9pZHMgOjoKKyAgICogICAgIEFuIG9wdGlvbmFsIHJlYWQtb25seSBhcnJheSBvZiBwYWxldHRlIGVudHJ5IG5hbWUgSURzIHdpdGgKKyAgICogICAgIGBudW1fcGFsZXR0ZV9lbnRyaWVzYC4gIEluIGVhY2ggcGFsZXR0ZSwgZW50cmllcyB3aXRoIHRoZSBzYW1lIGluZGV4CisgICAqICAgICBoYXZlIHRoZSBzYW1lIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUsIGluZGV4fjAgbWlnaHQgY29ycmVzcG9uZCB0bworICAgKiAgICAgc3RyaW5nICdvdXRsaW5lJyBpbiB0aGUgZm9udCdzICduYW1lJyB0YWJsZSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMKKyAgICogICAgIHBhbGV0dGUgZW50cnkgaXMgdXNlZCBmb3Igb3V0bGluZXMsIGluZGV4fjEgbWlnaHQgY29ycmVzcG9uZCB0bworICAgKiAgICAgJ2ZpbGwnIHRvIGluZGljYXRlIHRoZSBmaWxsaW5nIGNvbG9yIHBhbGV0dGUgZW50cnksIGV0Yy4KKyAgICoKKyAgICogICAgIEFuIGVtcHR5IGVudHJ5IG5hbWUgSUQgaW4gdGhlICdDUEFMJyB0YWJsZSBnZXRzIHJlcHJlc2VudGVkIGFzIHZhbHVlCisgICAqICAgICAweEZGRkYuCisgICAqCisgICAqICAgICBgTlVMTGAgaWYgdGhlIGZvbnQncyAnQ1BBTCcgdGFibGUgZG9lc24ndCBjb250YWluIGFwcHJvcHJpYXRlIGRhdGEuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFVzZSBmdW5jdGlvbiBARlRfR2V0X1NmbnRfTmFtZSB0byBtYXAgbmFtZSBJRHMgYW5kIGVudHJ5IG5hbWUgSURzIHRvCisgICAqICAgbmFtZSBzdHJpbmdzLgorICAgKgorICAgKiAgIFVzZSBmdW5jdGlvbiBARlRfUGFsZXR0ZV9TZWxlY3QgdG8gZ2V0IHRoZSBjb2xvcnMgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICogICBwYWxldHRlIGVudHJ5LgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4xMAorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1BhbGV0dGVfRGF0YV8geworICAgIEZUX1VTaG9ydCAgICAgICAgIG51bV9wYWxldHRlczsKKyAgICBjb25zdCBGVF9VU2hvcnQqICBwYWxldHRlX25hbWVfaWRzOworICAgIGNvbnN0IEZUX1VTaG9ydCogIHBhbGV0dGVfZmxhZ3M7CisKKyAgICBGVF9VU2hvcnQgICAgICAgICBudW1fcGFsZXR0ZV9lbnRyaWVzOworICAgIGNvbnN0IEZUX1VTaG9ydCogIHBhbGV0dGVfZW50cnlfbmFtZV9pZHM7CisKKyAgfSBGVF9QYWxldHRlX0RhdGE7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1BhbGV0dGVfRGF0YV9HZXQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHJpZXZlIHRoZSBmYWNlJ3MgY29sb3IgcGFsZXR0ZSBkYXRhLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhcGFsZXR0ZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIEBGVF9QYWxldHRlX0RhdGEgc3RydWN0dXJlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEFsbCBhcnJheXMgaW4gdGhlIHJldHVybmVkIEBGVF9QYWxldHRlX0RhdGEgc3RydWN0dXJlIGFyZSByZWFkLW9ubHkuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY29uZmlnIG1hY3JvCisgICAqICAgYFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTYCBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjEwCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9EYXRhX0dldCggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFsZXR0ZV9EYXRhICAqYXBhbGV0dGUgKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfUGFsZXR0ZV9TZWxlY3QKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaGFzIHR3byBwdXJwb3Nlcy4KKyAgICoKKyAgICogICAoMSkgSXQgYWN0aXZhdGVzIGEgcGFsZXR0ZSBmb3IgcmVuZGVyaW5nIGNvbG9yIGdseXBocywgYW5kCisgICAqCisgICAqICAgKDIpIGl0IHJldHJpZXZlcyBhbGwgKHVubW9kaWZpZWQpIGNvbG9yIGVudHJpZXMgb2YgdGhpcyBwYWxldHRlLiAgVGhpcworICAgKiAgICAgICBmdW5jdGlvbiByZXR1cm5zIGEgcmVhZC13cml0ZSBhcnJheSwgd2hpY2ggbWVhbnMgdGhhdCBhIGNhbGxpbmcKKyAgICogICAgICAgYXBwbGljYXRpb24gY2FuIG1vZGlmeSB0aGUgcGFsZXR0ZSBlbnRyaWVzIG9uIGRlbWFuZC4KKyAgICoKKyAgICogQSBjb3JvbGxhcnkgb2YgKDIpIGlzIHRoYXQgY2FsbGluZyB0aGUgZnVuY3Rpb24sIHRoZW4gbW9kaWZ5aW5nIHNvbWUKKyAgICogdmFsdWVzLCB0aGVuIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGFnYWluIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIHJlc2V0cworICAgKiBhbGwgY29sb3IgZW50cmllcyB0byB0aGUgb3JpZ2luYWwgJ0NQQUwnIHZhbHVlczsgYWxsIHVzZXIgbW9kaWZpY2F0aW9ucworICAgKiBhcmUgbG9zdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCisgICAqCisgICAqICAgcGFsZXR0ZV9pbmRleCA6OgorICAgKiAgICAgVGhlIHBhbGV0dGUgaW5kZXguCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYXBhbGV0dGUgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGNvbG9yIGVudHJpZXMgZm9yIGEgcGFsZXR0ZSB3aXRoIGluZGV4IGBwYWxldHRlX2luZGV4YCwKKyAgICogICAgIGhhdmluZyBgbnVtX3BhbGV0dGVfZW50cmllc2AgZWxlbWVudHMgKGFzIGZvdW5kIGluIHRoZQorICAgKiAgICAgYEZUX1BhbGV0dGVfRGF0YWAgc3RydWN0dXJlKS4gIElmIGBhcGFsZXR0ZWAgaXMgc2V0IHRvIGBOVUxMYCwgbm8KKyAgICogICAgIGFycmF5IGdldHMgcmV0dXJuZWQgKGFuZCBubyBjb2xvciBlbnRyaWVzIGNhbiBiZSBtb2RpZmllZCkuCisgICAqCisgICAqICAgICBJbiBjYXNlIHRoZSBmb250IGRvZXNuJ3Qgc3VwcG9ydCBjb2xvciBwYWxldHRlcywgYE5VTExgIGlzIHJldHVybmVkLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBhcnJheSBwb2ludGVkIHRvIGJ5IGBhcGFsZXR0ZV9lbnRyaWVzYCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieQorICAgKiAgIEZyZWVUeXBlLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGNvbmZpZyBtYWNybworICAgKiAgIGBUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSU2AgaXMgbm90IGRlZmluZWQgaW4gYGZ0b3B0aW9uLmhgLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4xMAorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1BhbGV0dGVfU2VsZWN0KCBGVF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgcGFsZXR0ZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIEZUX0NvbG9yKiAgKmFwYWxldHRlICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1BhbGV0dGVfU2V0X0ZvcmVncm91bmRfQ29sb3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICdDT0xSJyB1c2VzIHBhbGV0dGUgaW5kZXggMHhGRkZGIHRvIGluZGljYXRlIGEgJ3RleHQgZm9yZWdyb3VuZAorICAgKiAgIGNvbG9yJy4gIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGlzIHZhbHVlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICoKKyAgICogICBmb3JlZ3JvdW5kX2NvbG9yIDo6CisgICAqICAgICBBbiBgRlRfQ29sb3JgIHN0cnVjdHVyZSB0byBkZWZpbmUgdGhlIHRleHQgZm9yZWdyb3VuZCBjb2xvci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB0aGlzIGZ1bmN0aW9uIGlzbid0IGNhbGxlZCwgdGhlIHRleHQgZm9yZWdyb3VuZCBjb2xvciBpcyBzZXQgdG8KKyAgICogICB3aGl0ZSBvcGFxdWUgKEJHUkEgdmFsdWUgMHhGRkZGRkZGRikgaWYKKyAgICogICBARlRfUEFMRVRURV9GT1JfREFSS19CQUNLR1JPVU5EIGlzIHByZXNlbnQgZm9yIHRoZSBjdXJyZW50IHBhbGV0dGUsCisgICAqICAgYW5kIGJsYWNrIG9wYXF1ZSAoQkdSQSB2YWx1ZSAweDAwMDAwMEZGKSBvdGhlcndpc2UsIGluY2x1ZGluZyB0aGUgY2FzZQorICAgKiAgIHRoYXQgbm8gcGFsZXR0ZSB0eXBlcyBhcmUgYXZhaWxhYmxlIGluIHRoZSAnQ1BBTCcgdGFibGUuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY29uZmlnIG1hY3JvCisgICAqICAgYFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTYCBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjEwCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9TZXRfRm9yZWdyb3VuZF9Db2xvciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NvbG9yICBmb3JlZ3JvdW5kX2NvbG9yICk7CisKKyAgLyogKi8KKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBGVENPTE9SX0hfICovCisKKworLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZHJpdmVyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZHJpdmVyLmgKaW5kZXggZTkwNDc1Yi4uODA0ZWMzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGRyaXZlci5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRkcml2ZXIuaApAQCAtMSwyNyArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgY29udHJvbGxpbmcgZHJpdmVyIG1vZHVsZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDE3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRkcml2ZXIuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBjb250cm9sbGluZyBkcml2ZXIgbW9kdWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlREUklWRVJfSF8KICNkZWZpbmUgRlREUklWRVJfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9QQVJBTUVURVJfVEFHU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdHBhcmFtcy5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTUwLDggKzQ5LDggQEAKICAgICogICBARlRfUHJvcGVydHlfR2V0LiAgVGhlIGZvbGxvd2luZyBsaXN0cyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKICAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgogICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGUgYXV0by1oaW50ZXIncyBtb2R1bGUgbmFtZSBpcyBgYXV0b2ZpdHRlcicgZm9yCi0gICAqICAgaGlzdG9yaWNhbCByZWFzb25zLgorICAgKiAgIE5vdGUgdGhhdCB0aGUgYXV0by1oaW50ZXIncyBtb2R1bGUgbmFtZSBpcyAnYXV0b2ZpdHRlcicgZm9yIGhpc3RvcmljYWwKKyAgICogICByZWFzb25zLgogICAgKgogICAgKiAgIEF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFyZSBAaW5jcmVhc2UteC1oZWlnaHQsIEBuby1zdGVtLWRhcmtlbmluZwogICAgKiAgIChleHBlcmltZW50YWwpLCBAZGFya2VuaW5nLXBhcmFtZXRlcnMgKGV4cGVyaW1lbnRhbCksIEB3YXJwaW5nCkBAIC03NCwxOCArNzMsMTggQEAKICAgICogICBDb250cm9sbGluZyB0aGUgQ0ZGIGRyaXZlciBtb2R1bGUuCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBXaGlsZSBGcmVlVHlwZSdzIENGRiBkcml2ZXIgZG9lc24ndCBleHBvc2UgQVBJIGZ1bmN0aW9ucyBieSBpdHNlbGYsCi0gICAqICAgaXQgaXMgcG9zc2libGUgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyIHdpdGggQEZUX1Byb3BlcnR5X1NldCBhbmQKKyAgICogICBXaGlsZSBGcmVlVHlwZSdzIENGRiBkcml2ZXIgZG9lc24ndCBleHBvc2UgQVBJIGZ1bmN0aW9ucyBieSBpdHNlbGYsIGl0CisgICAqICAgaXMgcG9zc2libGUgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyIHdpdGggQEZUX1Byb3BlcnR5X1NldCBhbmQKICAgICogICBARlRfUHJvcGVydHlfR2V0LgogICAgKgotICAgKiAgIFRoZSBDRkYgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYGNmZicuCisgICAqICAgVGhlIENGRiBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyAnY2ZmJy4KICAgICoKICAgICogICBBdmFpbGFibGUgcHJvcGVydGllcyBhcmUgQGhpbnRpbmctZW5naW5lLCBAbm8tc3RlbS1kYXJrZW5pbmcsCiAgICAqICAgQGRhcmtlbmluZy1wYXJhbWV0ZXJzLCBhbmQgQHJhbmRvbS1zZWVkLCBhcyBkb2N1bWVudGVkIGluIHRoZQogICAgKiAgIEBwcm9wZXJ0aWVzIHNlY3Rpb24uCiAgICAqCiAgICAqCi0gICAqICAgKkhpbnRpbmcqICphbmQqICphbnRpYWxpYXNpbmcqICpwcmluY2lwbGVzKiAqb2YqICp0aGUqICpuZXcqICplbmdpbmUqCisgICAqICAgKipIaW50aW5nIGFuZCBhbnRpYWxpYXNpbmcgcHJpbmNpcGxlcyBvZiB0aGUgbmV3IGVuZ2luZSoqCiAgICAqCiAgICAqICAgVGhlIHJhc3Rlcml6ZXIgaXMgcG9zaXRpb25pbmcgaG9yaXpvbnRhbCBmZWF0dXJlcyAoZS5nLiwgYXNjZW5kZXIKICAgICogICBoZWlnaHQgJiB4LWhlaWdodCwgb3IgY3Jvc3NiYXJzKSBvbiB0aGUgcGl4ZWwgZ3JpZCBhbmQgbWluaW1pemluZyB0aGUKQEAgLTkzLDM1ICs5MiwzNCBAQAogICAgKiAgIGZlYXR1cmVzICh2ZXJ0aWNhbCBzdGVtcykgb24gdGhlIHBpeGVsIGdyaWQgd2l0aG91dCBoaW50aW5nLCB0aHVzCiAgICAqICAgcmVwcmVzZW50aW5nIHRoZSBzdGVtIHBvc2l0aW9uIGFuZCB3ZWlnaHQgYWNjdXJhdGVseS4gIFNvbWV0aW1lcyB0aGUKICAgICogICB2ZXJ0aWNhbCBzdGVtcyBtYXkgYmUgb25seSBwYXJ0aWFsbHkgYmxhY2suICBJbiB0aGlzIGNvbnRleHQsCi0gICAqICAgYGFudGlhbGlhc2luZycgbWVhbnMgdGhhdCBzdGVtcyBhcmUgbm90IHBvc2l0aW9uZWQgZXhhY3RseSBvbiBwaXhlbAorICAgKiAgICdhbnRpYWxpYXNpbmcnIG1lYW5zIHRoYXQgc3RlbXMgYXJlIG5vdCBwb3NpdGlvbmVkIGV4YWN0bHkgb24gcGl4ZWwKICAgICogICBib3JkZXJzLCBjYXVzaW5nIGEgZnV6enkgYXBwZWFyYW5jZS4KICAgICoKICAgICogICBUaGVyZSBhcmUgdHdvIHByaW5jaXBsZXMgYmVoaW5kIHRoaXMgYXBwcm9hY2guCiAgICAqCi0gICAqICAgMSkgTm8gaGludGluZyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb246IFVubGlrZSBgc3VwZXJoaW50ZWQnCisgICAqICAgMSkgTm8gaGludGluZyBpbiB0aGUgaG9yaXpvbnRhbCBkaXJlY3Rpb246IFVubGlrZSAnc3VwZXJoaW50ZWQnCiAgICAqICAgVHJ1ZVR5cGUsIHdoaWNoIGNoYW5nZXMgZ2x5cGggd2lkdGhzIHRvIGFjY29tbW9kYXRlIHJlZ3VsYXIKLSAgICogICBpbnRlci1nbHlwaCBzcGFjaW5nLCBBZG9iZSdzIGFwcHJvYWNoIGlzIGBmYWl0aGZ1bCB0byB0aGUgZGVzaWduJyBpbgotICAgKiAgIHJlcHJlc2VudGluZyBib3RoIHRoZSBnbHlwaCB3aWR0aCBhbmQgdGhlIGludGVyLWdseXBoIHNwYWNpbmcKLSAgICogICBkZXNpZ25lZCBmb3IgdGhlIGZvbnQuICBUaGlzIG1ha2VzIHRoZSBzY3JlZW4gZGlzcGxheSBhcyBjbG9zZSBhcyBpdAotICAgKiAgIGNhbiBiZSB0byB0aGUgcmVzdWx0IG9uZSB3b3VsZCBnZXQgd2l0aCBpbmZpbml0ZSByZXNvbHV0aW9uLCB3aGlsZQotICAgKiAgIHByZXNlcnZpbmcgd2hhdCBpcyBjb25zaWRlcmVkIHRoZSBrZXkgY2hhcmFjdGVyaXN0aWNzIG9mIGVhY2ggZ2x5cGguCi0gICAqICAgTm90ZSB0aGF0IHRoZSBkaXN0YW5jZXMgYmV0d2VlbiB1bmhpbnRlZCBhbmQgZ3JpZC1maXR0ZWQgcG9zaXRpb25zIGF0Ci0gICAqICAgc21hbGwgc2l6ZXMgYXJlIGNvbXBhcmFibGUgdG8ga2VybmluZyB2YWx1ZXMgYW5kIHRodXMgd291bGQgYmUKLSAgICogICBub3RpY2VhYmxlIChhbmQgZGlzdHJhY3RpbmcpIHdoaWxlIHJlYWRpbmcgaWYgaGludGluZyB3ZXJlIGFwcGxpZWQuCisgICAqICAgaW50ZXItZ2x5cGggc3BhY2luZywgQWRvYmUncyBhcHByb2FjaCBpcyAnZmFpdGhmdWwgdG8gdGhlIGRlc2lnbicgaW4KKyAgICogICByZXByZXNlbnRpbmcgYm90aCB0aGUgZ2x5cGggd2lkdGggYW5kIHRoZSBpbnRlci1nbHlwaCBzcGFjaW5nIGRlc2lnbmVkCisgICAqICAgZm9yIHRoZSBmb250LiAgVGhpcyBtYWtlcyB0aGUgc2NyZWVuIGRpc3BsYXkgYXMgY2xvc2UgYXMgaXQgY2FuIGJlIHRvCisgICAqICAgdGhlIHJlc3VsdCBvbmUgd291bGQgZ2V0IHdpdGggaW5maW5pdGUgcmVzb2x1dGlvbiwgd2hpbGUgcHJlc2VydmluZworICAgKiAgIHdoYXQgaXMgY29uc2lkZXJlZCB0aGUga2V5IGNoYXJhY3RlcmlzdGljcyBvZiBlYWNoIGdseXBoLiAgTm90ZSB0aGF0CisgICAqICAgdGhlIGRpc3RhbmNlcyBiZXR3ZWVuIHVuaGludGVkIGFuZCBncmlkLWZpdHRlZCBwb3NpdGlvbnMgYXQgc21hbGwKKyAgICogICBzaXplcyBhcmUgY29tcGFyYWJsZSB0byBrZXJuaW5nIHZhbHVlcyBhbmQgdGh1cyB3b3VsZCBiZSBub3RpY2VhYmxlCisgICAqICAgKGFuZCBkaXN0cmFjdGluZykgd2hpbGUgcmVhZGluZyBpZiBoaW50aW5nIHdlcmUgYXBwbGllZC4KICAgICoKICAgICogICBPbmUgb2YgdGhlIHJlYXNvbnMgdG8gbm90IGhpbnQgaG9yaXpvbnRhbGx5IGlzIGFudGlhbGlhc2luZyBmb3IgTENECi0gICAqICAgc2NyZWVuczogVGhlIHBpeGVsIGdlb21ldHJ5IG9mIG1vZGVybiBkaXNwbGF5cyBzdXBwbGllcyB0aHJlZQotICAgKiAgIHZlcnRpY2FsIHN1YnBpeGVscyBhcyB0aGUgZXllIG1vdmVzIGhvcml6b250YWxseSBhY3Jvc3MgZWFjaCB2aXNpYmxlCi0gICAqICAgcGl4ZWwuICBPbiBkZXZpY2VzIHdoZXJlIHdlIGNhbiBiZSBjZXJ0YWluIHRoaXMgY2hhcmFjdGVyaXN0aWMgaXMKLSAgICogICBwcmVzZW50IGEgcmFzdGVyaXplciBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHN1YnBpeGVscyB0byBhZGQKLSAgICogICBpbmNyZW1lbnRzIG9mIHdlaWdodC4gIEluIFdlc3Rlcm4gd3JpdGluZyBzeXN0ZW1zIHRoaXMgdHVybnMgb3V0IHRvCi0gICAqICAgYmUgdGhlIG1vcmUgY3JpdGljYWwgZGlyZWN0aW9uIGFueXdheTsgdGhlIHdlaWdodHMgYW5kIHNwYWNpbmcgb2YKLSAgICogICB2ZXJ0aWNhbCBzdGVtcyAoc2VlIGFib3ZlKSBhcmUgY2VudHJhbCB0byBBcm1lbmlhbiwgQ3lyaWxsaWMsIEdyZWVrLAotICAgKiAgIGFuZCBMYXRpbiB0eXBlIGRlc2lnbnMuICBFdmVuIHdoZW4gdGhlIHJhc3Rlcml6ZXIgdXNlcyBncmV5c2NhbGUKLSAgICogICBhbnRpYWxpYXNpbmcgaW5zdGVhZCBvZiBjb2xvciAoYSBuZWNlc3NhcnkgY29tcHJvbWlzZSB3aGVuIG9uZQotICAgKiAgIGRvZXNuJ3Qga25vdyB0aGUgc2NyZWVuIGNoYXJhY3RlcmlzdGljcyksIHRoZSB1bmhpbnRlZCB2ZXJ0aWNhbAotICAgKiAgIGZlYXR1cmVzIHByZXNlcnZlIHRoZSBkZXNpZ24ncyB3ZWlnaHQgYW5kIHNwYWNpbmcgbXVjaCBiZXR0ZXIgdGhhbgotICAgKiAgIGFsaWFzZWQgdHlwZSB3b3VsZC4KKyAgICogICBzY3JlZW5zOiBUaGUgcGl4ZWwgZ2VvbWV0cnkgb2YgbW9kZXJuIGRpc3BsYXlzIHN1cHBsaWVzIHRocmVlIHZlcnRpY2FsCisgICAqICAgc3VicGl4ZWxzIGFzIHRoZSBleWUgbW92ZXMgaG9yaXpvbnRhbGx5IGFjcm9zcyBlYWNoIHZpc2libGUgcGl4ZWwuICBPbgorICAgKiAgIGRldmljZXMgd2hlcmUgd2UgY2FuIGJlIGNlcnRhaW4gdGhpcyBjaGFyYWN0ZXJpc3RpYyBpcyBwcmVzZW50IGEKKyAgICogICByYXN0ZXJpemVyIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGUgc3VicGl4ZWxzIHRvIGFkZCBpbmNyZW1lbnRzIG9mCisgICAqICAgd2VpZ2h0LiAgSW4gV2VzdGVybiB3cml0aW5nIHN5c3RlbXMgdGhpcyB0dXJucyBvdXQgdG8gYmUgdGhlIG1vcmUKKyAgICogICBjcml0aWNhbCBkaXJlY3Rpb24gYW55d2F5OyB0aGUgd2VpZ2h0cyBhbmQgc3BhY2luZyBvZiB2ZXJ0aWNhbCBzdGVtcworICAgKiAgIChzZWUgYWJvdmUpIGFyZSBjZW50cmFsIHRvIEFybWVuaWFuLCBDeXJpbGxpYywgR3JlZWssIGFuZCBMYXRpbiB0eXBlCisgICAqICAgZGVzaWducy4gIEV2ZW4gd2hlbiB0aGUgcmFzdGVyaXplciB1c2VzIGdyZXlzY2FsZSBhbnRpYWxpYXNpbmcgaW5zdGVhZAorICAgKiAgIG9mIGNvbG9yIChhIG5lY2Vzc2FyeSBjb21wcm9taXNlIHdoZW4gb25lIGRvZXNuJ3Qga25vdyB0aGUgc2NyZWVuCisgICAqICAgY2hhcmFjdGVyaXN0aWNzKSwgdGhlIHVuaGludGVkIHZlcnRpY2FsIGZlYXR1cmVzIHByZXNlcnZlIHRoZSBkZXNpZ24ncworICAgKiAgIHdlaWdodCBhbmQgc3BhY2luZyBtdWNoIGJldHRlciB0aGFuIGFsaWFzZWQgdHlwZSB3b3VsZC4KICAgICoKICAgICogICAyKSBBbGlnbm1lbnQgaW4gdGhlIHZlcnRpY2FsIGRpcmVjdGlvbjogV2VpZ2h0cyBhbmQgc3BhY2luZyBhbG9uZyB0aGUKICAgICogICB5fmF4aXMgYXJlIGxlc3MgY3JpdGljYWw7IHdoYXQgaXMgbXVjaCBtb3JlIGltcG9ydGFudCBpcyB0aGUgdmlzdWFsCkBAIC0xMzIsMTYgKzEzMCwxNiBAQAogICAgKgogICAgKiAgIE9uIHRoZSB0ZWNobmljYWwgc2lkZSwgaG9yaXpvbnRhbCBhbGlnbm1lbnQgem9uZXMgZm9yIGFzY2VuZGVyLAogICAgKiAgIHgtaGVpZ2h0LCBhbmQgb3RoZXIgaW1wb3J0YW50IGhlaWdodCB2YWx1ZXMgKHRyYWRpdGlvbmFsbHkgY2FsbGVkCi0gICAqICAgYGJsdWUgem9uZXMnKSBhcyBkZWZpbmVkIGluIHRoZSBmb250IGFyZSBwb3NpdGlvbmVkIGluZGVwZW5kZW50bHksCi0gICAqICAgZWFjaCBiZWluZyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IHBpeGVsIGVkZ2UsIHRha2luZyBjYXJlIG9mCi0gICAqICAgb3ZlcnNob290IHN1cHByZXNzaW9uIGF0IHNtYWxsIHNpemVzLCBzdGVtIGRhcmtlbmluZywgYW5kIHNjYWxpbmcuCisgICAqICAgJ2JsdWUgem9uZXMnKSBhcyBkZWZpbmVkIGluIHRoZSBmb250IGFyZSBwb3NpdGlvbmVkIGluZGVwZW5kZW50bHksCisgICAqICAgZWFjaCBiZWluZyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IHBpeGVsIGVkZ2UsIHRha2luZyBjYXJlIG9mIG92ZXJzaG9vdAorICAgKiAgIHN1cHByZXNzaW9uIGF0IHNtYWxsIHNpemVzLCBzdGVtIGRhcmtlbmluZywgYW5kIHNjYWxpbmcuCiAgICAqCiAgICAqICAgSHN0ZW1zICh0aGlzIGlzLCBoaW50IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBmb250IHRvIGhlbHAgYWxpZ24KICAgICogICBob3Jpem9udGFsIGZlYXR1cmVzKSB0aGF0IGZhbGwgd2l0aGluIGEgYmx1ZSB6b25lIGFyZSBzYWlkIHRvIGJlCi0gICAqICAgYGNhcHR1cmVkJyBhbmQgYXJlIGFsaWduZWQgdG8gdGhhdCB6b25lLiAgVW5jYXB0dXJlZCBzdGVtcyBhcmUgbW92ZWQKKyAgICogICAnY2FwdHVyZWQnIGFuZCBhcmUgYWxpZ25lZCB0byB0aGF0IHpvbmUuICBVbmNhcHR1cmVkIHN0ZW1zIGFyZSBtb3ZlZAogICAgKiAgIGluIG9uZSBvZiBmb3VyIHdheXMsIHRvcCBlZGdlIHVwIG9yIGRvd24sIGJvdHRvbSBlZGdlIHVwIG9yIGRvd24uCi0gICAqICAgVW5sZXNzIHRoZXJlIGFyZSBjb25mbGljdGluZyBoc3RlbXMsIHRoZSBzbWFsbGVzdCBtb3ZlbWVudCBpcyB0YWtlbgotICAgKiAgIHRvIG1pbmltaXplIGRpc3RvcnRpb24uCisgICAqICAgVW5sZXNzIHRoZXJlIGFyZSBjb25mbGljdGluZyBoc3RlbXMsIHRoZSBzbWFsbGVzdCBtb3ZlbWVudCBpcyB0YWtlbiB0bworICAgKiAgIG1pbmltaXplIGRpc3RvcnRpb24uCiAgICAqCiAgICAqLwogCkBAIC0xNTgsMTMgKzE1NiwxMyBAQAogICAgKiAgIENvbnRyb2xsaW5nIHRoZSBQQ0YgZHJpdmVyIG1vZHVsZS4KICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgUENGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKLSAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAorICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgUENGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwgaXQKKyAgICogICBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAogICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBSaWdodCBub3csIHRoZXJlIGlzIGEgc2luZ2xlIHByb3BlcnR5CiAgICAqICAgQG5vLWxvbmctZmFtaWx5LW5hbWVzIGF2YWlsYWJsZSBpZiBGcmVlVHlwZSBpcyBjb21waWxlZCB3aXRoCiAgICAqICAgUENGX0NPTkZJR19PUFRJT05fTE9OR19GQU1JTFlfTkFNRVMuCiAgICAqCi0gICAqICAgVGhlIFBDRiBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyBgcGNmJy4KKyAgICogICBUaGUgUENGIGRyaXZlcidzIG1vZHVsZSBuYW1lIGlzICdwY2YnLgogICAgKgogICAgKi8KIApAQCAtMTg3LDE1ICsxODUsMTUgQEAKICAgICogICBCZWhpbmQgdGhlIHNjZW5lcywgYm90aCBkcml2ZXJzIHVzZSB0aGUgQWRvYmUgQ0ZGIGVuZ2luZSBmb3IgaGludGluZzsKICAgICogICBob3dldmVyLCB0aGUgdXNlZCBwcm9wZXJ0aWVzIG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkuCiAgICAqCi0gICAqICAgVGhlIFR5cGV+MSBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyBgdHlwZTEnOyB0aGUgQ0lEIGRyaXZlcidzIG1vZHVsZQotICAgKiAgIG5hbWUgaXMgYHQxY2lkJy4KKyAgICogICBUaGUgVHlwZX4xIGRyaXZlcidzIG1vZHVsZSBuYW1lIGlzICd0eXBlMSc7IHRoZSBDSUQgZHJpdmVyJ3MgbW9kdWxlCisgICAqICAgbmFtZSBpcyAndDFjaWQnLgogICAgKgogICAgKiAgIEF2YWlsYWJsZSBwcm9wZXJ0aWVzIGFyZSBAaGludGluZy1lbmdpbmUsIEBuby1zdGVtLWRhcmtlbmluZywKICAgICogICBAZGFya2VuaW5nLXBhcmFtZXRlcnMsIGFuZCBAcmFuZG9tLXNlZWQsIGFzIGRvY3VtZW50ZWQgaW4gdGhlCiAgICAqICAgQHByb3BlcnRpZXMgc2VjdGlvbi4KICAgICoKLSAgICogICBQbGVhc2Ugc2VlIHRoZSBAY2ZmX2RyaXZlciBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG5ldwotICAgKiAgIGhpbnRpbmcgZW5naW5lLgorICAgKiAgIFBsZWFzZSBzZWUgdGhlIEBjZmZfZHJpdmVyIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgbmV3IGhpbnRpbmcKKyAgICogICBlbmdpbmUuCiAgICAqCiAgICAqLwogCkBAIC0yMTcsNyArMjE1LDcgQEAKICAgICogICBhbmQgQEZUX1Byb3BlcnR5X0dldC4gIFRoZSBmb2xsb3dpbmcgbGlzdHMgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzCiAgICAqICAgdG9nZXRoZXIgd2l0aCB0aGUgbmVjZXNzYXJ5IG1hY3JvcyBhbmQgc3RydWN0dXJlcy4KICAgICoKLSAgICogICBUaGUgVHJ1ZVR5cGUgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYHRydWV0eXBlJy4KKyAgICogICBUaGUgVHJ1ZVR5cGUgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgJ3RydWV0eXBlJy4KICAgICoKICAgICogICBBIHNpbmdsZSBwcm9wZXJ0eSBAaW50ZXJwcmV0ZXItdmVyc2lvbiBpcyBhdmFpbGFibGUsIGFzIGRvY3VtZW50ZWQgaW4KICAgICogICB0aGUgQHByb3BlcnRpZXMgc2VjdGlvbi4KQEAgLTIyNSwzNiArMjIzLDM2IEBACiAgICAqICAgV2Ugc3RhcnQgd2l0aCBhIGxpc3Qgb2YgZGVmaW5pdGlvbnMsIGtpbmRseSBwcm92aWRlZCBieSBHcmVnCiAgICAqICAgSGl0Y2hjb2NrLgogICAgKgotICAgKiAgIF9CaS1MZXZlbF8gX1JlbmRlcmluZ18KKyAgICogICBfQmktTGV2ZWwgUmVuZGVyaW5nXwogICAgKgogICAgKiAgIE1vbm9jaHJvbWF0aWMgcmVuZGVyaW5nLCBleGNsdXNpdmVseSB1c2VkIGluIHRoZSBlYXJseSBkYXlzIG9mCiAgICAqICAgVHJ1ZVR5cGUgYnkgYm90aCBBcHBsZSBhbmQgTWljcm9zb2Z0LiAgTWljcm9zb2Z0J3MgR0RJIGludGVyZmFjZQogICAgKiAgIHN1cHBvcnRlZCBoaW50aW5nIG9mIHRoZSByaWdodC1zaWRlIGJlYXJpbmcgcG9pbnQsIHN1Y2ggdGhhdCB0aGUKICAgICogICBhZHZhbmNlIHdpZHRoIGNvdWxkIGJlIG5vbi1saW5lYXIuICBNb3N0IG9mdGVuIHRoaXMgd2FzIGRvbmUgdG8KICAgICogICBhY2hpZXZlIHNvbWUgbGV2ZWwgb2YgZ2x5cGggc3ltbWV0cnkuICBUbyBlbmFibGUgcmVhc29uYWJsZQotICAgKiAgIHBlcmZvcm1hbmNlIChlLmcuLCBub3QgaGF2aW5nIHRvIHJ1biBoaW50aW5nIG9uIGFsbCBnbHlwaHMganVzdCB0bwotICAgKiAgIGdldCB0aGUgd2lkdGhzKSB0aGVyZSB3YXMgYSBiaXQgaW4gdGhlIGhlYWQgdGFibGUgaW5kaWNhdGluZyBpZiB0aGUKLSAgICogICBzaWRlIGJlYXJpbmcgd2FzIGhpbnRlZCwgYW5kIGFkZGl0aW9uYWwgdGFibGVzLCBgaGRteCcgYW5kIGBMVFNIJywgdG8KLSAgICogICBjYWNoZSBoaW50aW5nIHdpZHRocyBhY3Jvc3MgbXVsdGlwbGUgc2l6ZXMgYW5kIGRldmljZSBhc3BlY3QgcmF0aW9zLgorICAgKiAgIHBlcmZvcm1hbmNlIChlLmcuLCBub3QgaGF2aW5nIHRvIHJ1biBoaW50aW5nIG9uIGFsbCBnbHlwaHMganVzdCB0byBnZXQKKyAgICogICB0aGUgd2lkdGhzKSB0aGVyZSB3YXMgYSBiaXQgaW4gdGhlIGhlYWQgdGFibGUgaW5kaWNhdGluZyBpZiB0aGUgc2lkZQorICAgKiAgIGJlYXJpbmcgd2FzIGhpbnRlZCwgYW5kIGFkZGl0aW9uYWwgdGFibGVzLCAnaGRteCcgYW5kICdMVFNIJywgdG8gY2FjaGUKKyAgICogICBoaW50aW5nIHdpZHRocyBhY3Jvc3MgbXVsdGlwbGUgc2l6ZXMgYW5kIGRldmljZSBhc3BlY3QgcmF0aW9zLgogICAgKgotICAgKiAgIF9Gb250XyBfU21vb3RoaW5nXworICAgKiAgIF9Gb250IFNtb290aGluZ18KICAgICoKICAgICogICBNaWNyb3NvZnQncyBHREkgaW1wbGVtZW50YXRpb24gb2YgYW50aS1hbGlhc2luZy4gIE5vdCB0cmFkaXRpb25hbAogICAgKiAgIGFudGktYWxpYXNpbmcgYXMgdGhlIG91dGxpbmVzIHdlcmUgaGludGVkIGJlZm9yZSB0aGUgc2FtcGxpbmcuICBUaGUKICAgICogICB3aWR0aHMgbWF0Y2hlZCB0aGUgYmktbGV2ZWwgcmVuZGVyaW5nLgogICAgKgotICAgKiAgIF9DbGVhclR5cGVfIF9SZW5kZXJpbmdfCisgICAqICAgX0NsZWFyVHlwZSBSZW5kZXJpbmdfCiAgICAqCiAgICAqICAgVGVjaG5pcXVlIHRoYXQgdXNlcyBwaHlzaWNhbCBzdWJwaXhlbHMgdG8gaW1wcm92ZSByZW5kZXJpbmcgb24gTENECiAgICAqICAgKGFuZCBvdGhlcikgZGlzcGxheXMuICBCZWNhdXNlIG9mIHRoZSBoaWdoZXIgcmVzb2x1dGlvbiwgbWFueSBtZXRob2RzCi0gICAqICAgb2YgaW1wcm92aW5nIHN5bW1ldHJ5IGluIGdseXBocyB0aHJvdWdoIGhpbnRpbmcgdGhlIHJpZ2h0LXNpZGUKLSAgICogICBiZWFyaW5nIHdlcmUgbm8gbG9uZ2VyIG5lY2Vzc2FyeS4gIFRoaXMgbGVhZCB0byB3aGF0IEdESSBjYWxscwotICAgKiAgIGBuYXR1cmFsIHdpZHRocycgQ2xlYXJUeXBlLCBzZWUKLSAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzIxLiAgU2luY2UgaGludGluZworICAgKiAgIG9mIGltcHJvdmluZyBzeW1tZXRyeSBpbiBnbHlwaHMgdGhyb3VnaCBoaW50aW5nIHRoZSByaWdodC1zaWRlIGJlYXJpbmcKKyAgICogICB3ZXJlIG5vIGxvbmdlciBuZWNlc3NhcnkuICBUaGlzIGxlYWQgdG8gd2hhdCBHREkgY2FsbHMgJ25hdHVyYWwKKyAgICogICB3aWR0aHMnIENsZWFyVHlwZSwgc2VlCisgICAqICAgaHR0cDovL3Jhc3RlcnRyYWdlZHkuY29tL1JUUkNoNC5odG0jU2VjMjEuICBTaW5jZSBoaW50aW5nCiAgICAqICAgaGFzIGV4dHJhIHJlc29sdXRpb24sIG1vc3Qgbm9uLWxpbmVhcml0eSB3ZW50IGF3YXksIGJ1dCBpdCBpcyBzdGlsbAogICAgKiAgIHBvc3NpYmxlIGZvciBoaW50cyB0byBjaGFuZ2UgdGhlIGFkdmFuY2Ugd2lkdGhzIGluIHRoaXMgbW9kZS4KICAgICoKLSAgICogICBfQ2xlYXJUeXBlXyBfQ29tcGF0aWJsZV8gX1dpZHRoc18KKyAgICogICBfQ2xlYXJUeXBlIENvbXBhdGlibGUgV2lkdGhzXwogICAgKgogICAgKiAgIE9uZSBvZiB0aGUgZWFybGllc3QgY2hhbGxlbmdlcyB3aXRoIENsZWFyVHlwZSB3YXMgYWxsb3dpbmcgdGhlCiAgICAqICAgaW1wbGVtZW50YXRpb24gaW4gR0RJIHRvIGJlIHNlbGVjdGVkIHdpdGhvdXQgcmVxdWlyaW5nIGFsbCBVSSBhbmQKQEAgLTI2Myw0MSArMjYxLDQxIEBACiAgICAqICAgdG8gZGV0ZXJtaW5lIHRoZSB3aWR0aCBpbiBiaS1sZXZlbCByZW5kZXJpbmcsIGFuZCB0aGVuIHJlLXJ1biBpbgogICAgKiAgIENsZWFyVHlwZSwgd2l0aCB0aGUgZGlmZmVyZW5jZSBpbiB3aWR0aHMgYmVpbmcgYWJzb3JiZWQgaW4gdGhlIGZvbnQKICAgICogICBoaW50cyBmb3IgQ2xlYXJUeXBlIChtb3N0bHkgaW4gdGhlIHdoaXRlIHNwYWNlIG9mIGhpbnRzKTsgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMyMC4gIFNvbWV3aGF0IGJ5CisgICAqICAgaHR0cDovL3Jhc3RlcnRyYWdlZHkuY29tL1JUUkNoNC5odG0jU2VjMjAuICBTb21ld2hhdCBieQogICAgKiAgIGRlZmluaXRpb24sIGNvbXBhdGlibGUgd2lkdGggQ2xlYXJUeXBlIGFsbG93cyBmb3Igbm9uLWxpbmVhciB3aWR0aHMsCiAgICAqICAgYnV0IG9ubHkgd2hlbiB0aGUgYmktbGV2ZWwgdmVyc2lvbiBoYXMgbm9uLWxpbmVhciB3aWR0aHMuCiAgICAqCi0gICAqICAgX0NsZWFyVHlwZV8gX1N1YnBpeGVsXyBfUG9zaXRpb25pbmdfCisgICAqICAgX0NsZWFyVHlwZSBTdWJwaXhlbCBQb3NpdGlvbmluZ18KICAgICoKICAgICogICBPbmUgb2YgdGhlIG5pY2UgYmVuZWZpdHMgb2YgQ2xlYXJUeXBlIGlzIHRoZSBhYmlsaXR5IHRvIG1vcmUgY3Jpc3BseQogICAgKiAgIGRpc3BsYXkgZnJhY3Rpb25hbCB3aWR0aHM7IHVuZm9ydHVuYXRlbHksIHRoZSBHREkgbW9kZWwgb2YgaW50ZWdlcgogICAgKiAgIGJpdG1hcHMgZGlkIG5vdCBzdXBwb3J0IHRoaXMuICBIb3dldmVyLCB0aGUgV1BGIGFuZCBEaXJlY3QgV3JpdGUKLSAgICogICBmcmFtZXdvcmtzIGRvIHN1cHBvcnQgZnJhY3Rpb25hbCB3aWR0aHMuICBEV3JpdGUgY2FsbHMgdGhpcyBgbmF0dXJhbAotICAgKiAgIG1vZGUnLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBHREkncyBgbmF0dXJhbCB3aWR0aHMnLiAgU3VicGl4ZWwKKyAgICogICBmcmFtZXdvcmtzIGRvIHN1cHBvcnQgZnJhY3Rpb25hbCB3aWR0aHMuICBEV3JpdGUgY2FsbHMgdGhpcyAnbmF0dXJhbAorICAgKiAgIG1vZGUnLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBHREkncyAnbmF0dXJhbCB3aWR0aHMnLiAgU3VicGl4ZWwKICAgICogICBwb3NpdGlvbmluZywgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgRGlyZWN0IFdyaXRlLAogICAgKiAgIHVuZm9ydHVuYXRlbHkgZG9lcyBub3Qgc3VwcG9ydCBoaW50ZWQgYWR2YW5jZSB3aWR0aHMsIHNlZQotICAgKiAgIGh0dHA6Ly93d3cuYmVhdHN0YW1tLmNvbS90eXBvZ3JhcGh5L1JUUkNoNC5odG0jU2VjMjIuICBOb3RlIHRoYXQgdGhlCisgICAqICAgaHR0cDovL3Jhc3RlcnRyYWdlZHkuY29tL1JUUkNoNC5odG0jU2VjMjIuICBOb3RlIHRoYXQgdGhlCiAgICAqICAgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIgZnVsbHkgYWxsb3dzIHRoZSBhZHZhbmNlIHdpZHRoIHRvIGJlIGFkanVzdGVkIGluCiAgICAqICAgdGhpcyBtb2RlLCBqdXN0IHRoZSBEV3JpdGUgY2xpZW50IHdpbGwgaWdub3JlIHRob3NlIGNoYW5nZXMuCiAgICAqCi0gICAqICAgX0NsZWFyVHlwZV8gX0JhY2t3YXJkXyBfQ29tcGF0aWJpbGl0eV8KKyAgICogICBfQ2xlYXJUeXBlIEJhY2t3YXJkIENvbXBhdGliaWxpdHlfCiAgICAqCiAgICAqICAgVGhpcyBpcyBhIHNldCBvZiBleGNlcHRpb25zIG1hZGUgaW4gdGhlIFRydWVUeXBlIGludGVycHJldGVyIHRvCiAgICAqICAgbWluaW1pemUgaGludGluZyB0ZWNobmlxdWVzIHRoYXQgd2VyZSBwcm9ibGVtYXRpYyB3aXRoIHRoZSBleHRyYQogICAgKiAgIHJlc29sdXRpb24gb2YgQ2xlYXJUeXBlOyBzZWUKLSAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzEgYW5kCisgICAqICAgaHR0cDovL3Jhc3RlcnRyYWdlZHkuY29tL1JUUkNoNC5odG0jU2VjMSBhbmQKICAgICogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHguCi0gICAqICAgVGhpcyB0ZWNobmlxdWUgaXMgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggQ2xlYXJUeXBlIGNvbXBhdGlibGUKLSAgICogICB3aWR0aHMuICBDbGVhclR5cGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYXMgbm8gZGlyZWN0IGltcGFjdCBvbgotICAgKiAgIGNoYW5naW5nIGFkdmFuY2Ugd2lkdGhzLCBidXQgdGhlcmUgbWlnaHQgYmUgYW4gaW5kaXJlY3QgaW1wYWN0IG9uCi0gICAqICAgZGlzYWJsaW5nIHNvbWUgZGVsdGFzLiAgVGhpcyBjb3VsZCBiZSB3b3JrZWQgYXJvdW5kIGluIGJhY2t3YXJkCi0gICAqICAgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgKiAgIFRoaXMgdGVjaG5pcXVlIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIENsZWFyVHlwZSBjb21wYXRpYmxlIHdpZHRocy4KKyAgICogICBDbGVhclR5cGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYXMgbm8gZGlyZWN0IGltcGFjdCBvbiBjaGFuZ2luZworICAgKiAgIGFkdmFuY2Ugd2lkdGhzLCBidXQgdGhlcmUgbWlnaHQgYmUgYW4gaW5kaXJlY3QgaW1wYWN0IG9uIGRpc2FibGluZworICAgKiAgIHNvbWUgZGVsdGFzLiAgVGhpcyBjb3VsZCBiZSB3b3JrZWQgYXJvdW5kIGluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICogICBtb2RlLgogICAgKgotICAgKiAgIF9OYXRpdmVfIF9DbGVhclR5cGVfIF9Nb2RlXworICAgKiAgIF9OYXRpdmUgQ2xlYXJUeXBlIE1vZGVfCiAgICAqCi0gICAqICAgKE5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGBuYXR1cmFsIHdpZHRocycuKSAgVGhpcyBtb2RlIHJlbW92ZXMgYWxsCi0gICAqICAgdGhlIGV4Y2VwdGlvbnMgaW4gdGhlIFRydWVUeXBlIGludGVycHJldGVyIHdoZW4gcnVubmluZyB3aXRoCi0gICAqICAgQ2xlYXJUeXBlLiAgQW55IGlzc3VlcyBvbiB3aWR0aHMgd291bGQgc3RpbGwgYXBwbHksIHRob3VnaC4KKyAgICogICAoTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggJ25hdHVyYWwgd2lkdGhzJy4pICBUaGlzIG1vZGUgcmVtb3ZlcyBhbGwgdGhlCisgICAqICAgZXhjZXB0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIgd2hlbiBydW5uaW5nIHdpdGggQ2xlYXJUeXBlLgorICAgKiAgIEFueSBpc3N1ZXMgb24gd2lkdGhzIHdvdWxkIHN0aWxsIGFwcGx5LCB0aG91Z2guCiAgICAqCiAgICAqLwogCkBAIC0zMjgsOCArMzI2LDggQEAKICAgICogICBGVF9ISU5USU5HX1hYWAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGhpbnRpbmctZW5naW5lIHByb3BlcnR5IHRvCi0gICAqICAgc2VsZWN0IHRoZSBoaW50aW5nIGVuZ2luZSBmb3IgQ0ZGLCBUeXBlfjEsIGFuZCBDSUQgZm9udHMuCisgICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGhpbnRpbmctZW5naW5lIHByb3BlcnR5IHRvIHNlbGVjdAorICAgKiAgIHRoZSBoaW50aW5nIGVuZ2luZSBmb3IgQ0ZGLCBUeXBlfjEsIGFuZCBDSUQgZm9udHMuCiAgICAqCiAgICAqIEB2YWx1ZXM6CiAgICAqICAgRlRfSElOVElOR19GUkVFVFlQRSA6OgpAQCAtMzU2LDQ1ICszNTQsNDYgQEAKICAgICogICBoaW50aW5nLWVuZ2luZQogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhhbmtzIHRvIEFkb2JlLCB3aGljaCBjb250cmlidXRlZCBhIG5ldyBoaW50aW5nIChhbmQgcGFyc2luZykKLSAgICogICBlbmdpbmUsIGFuIGFwcGxpY2F0aW9uIGNhbiBzZWxlY3QgYmV0d2VlbiBgZnJlZXR5cGUnIGFuZCBgYWRvYmUnIGlmCi0gICAqICAgY29tcGlsZWQgd2l0aCBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FLiAgSWYgdGhpcyBjb25maWd1cmF0aW9uCi0gICAqICAgbWFjcm8gaXNuJ3QgZGVmaW5lZCwgYGhpbnRpbmctZW5naW5lJyBkb2VzIG5vdGhpbmcuCisgICAqICAgVGhhbmtzIHRvIEFkb2JlLCB3aGljaCBjb250cmlidXRlZCBhIG5ldyBoaW50aW5nIChhbmQgcGFyc2luZykgZW5naW5lLAorICAgKiAgIGFuIGFwcGxpY2F0aW9uIGNhbiBzZWxlY3QgYmV0d2VlbiAnZnJlZXR5cGUnIGFuZCAnYWRvYmUnIGlmIGNvbXBpbGVkCisgICAqICAgd2l0aCBgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAuICBJZiB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8KKyAgICogICBpc24ndCBkZWZpbmVkLCAnaGludGluZy1lbmdpbmUnIGRvZXMgbm90aGluZy4KICAgICoKICAgICogICBUaGUgc2FtZSBob2xkcyBmb3IgdGhlIFR5cGV+MSBhbmQgQ0lEIG1vZHVsZXMgaWYgY29tcGlsZWQgd2l0aAotICAgKiAgIFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORS4KKyAgICogICBgVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FYC4KICAgICoKLSAgICogICBGb3IgdGhlIGBjZmYnIG1vZHVsZSwgdGhlIGRlZmF1bHQgZW5naW5lIGlzIGBmcmVldHlwZScgaWYKLSAgICogICBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGlzIGRlZmluZWQsIGFuZCBgYWRvYmUnIG90aGVyd2lzZS4KKyAgICogICBGb3IgdGhlICdjZmYnIG1vZHVsZSwgdGhlIGRlZmF1bHQgZW5naW5lIGlzICdmcmVldHlwZScgaWYKKyAgICogICBgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORWAgaXMgZGVmaW5lZCwgYW5kICdhZG9iZScgb3RoZXJ3aXNlLgogICAgKgotICAgKiAgIEZvciBib3RoIHRoZSBgdHlwZTEnIGFuZCBgdDFjaWQnIG1vZHVsZXMsIHRoZSBkZWZhdWx0IGVuZ2luZSBpcwotICAgKiAgIGBmcmVldHlwZScgaWYgVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FIGlzIGRlZmluZWQsIGFuZCBgYWRvYmUnCisgICAqICAgRm9yIGJvdGggdGhlICd0eXBlMScgYW5kICd0MWNpZCcgbW9kdWxlcywgdGhlIGRlZmF1bHQgZW5naW5lIGlzCisgICAqICAgJ2ZyZWV0eXBlJyBpZiBgVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FYCBpcyBkZWZpbmVkLCBhbmQgJ2Fkb2JlJwogICAgKiAgIG90aGVyd2lzZS4KICAgICoKLSAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHNlbGVjdCBBZG9iZSdzIGhpbnRpbmcKLSAgICogICBlbmdpbmUgZm9yIHRoZSBgY2ZmJyBtb2R1bGUgKG9taXR0aW5nIHRoZSBlcnJvciBoYW5kbGluZykuCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCiAgICAqCi0gICAqICAgeworICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCBlbnZpcm9ubWVudAorICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgJ2Fkb2JlJyBvciAnZnJlZXR5cGUnKS4KKyAgICoKKyAgICogQGV4YW1wbGU6CisgICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBzZWxlY3QgQWRvYmUncyBoaW50aW5nCisgICAqICAgZW5naW5lIGZvciB0aGUgJ2NmZicgbW9kdWxlIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgorICAgKgorICAgKiAgIGBgYAogICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGhpbnRpbmdfZW5naW5lID0gRlRfQ0ZGX0hJTlRJTkdfQURPQkU7CisgICAqICAgICBGVF9VSW50ICAgICBoaW50aW5nX2VuZ2luZSA9IEZUX0hJTlRJTkdfQURPQkU7CiAgICAqCiAgICAqCiAgICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwogICAgKgogICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpbnRpbmctZW5naW5lIiwgJmhpbnRpbmdfZW5naW5lICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAotICAgKiAgIHZhcmlhYmxlICh1c2luZyB2YWx1ZXMgYGFkb2JlJyBvciBgZnJlZXR5cGUnKS4KKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgotICAgKiAgIDIuNC4xMiAoZm9yIGBjZmYnIG1vZHVsZSkKKyAgICogICAyLjQuMTIgKGZvciAnY2ZmJyBtb2R1bGUpCiAgICAqCi0gICAqICAgMi45IChmb3IgYHR5cGUxJyBhbmQgYHQxY2lkJyBtb2R1bGVzKQorICAgKiAgIDIuOSAoZm9yICd0eXBlMScgYW5kICd0MWNpZCcgbW9kdWxlcykKICAgICoKICAgICovCiAKQEAgLTQwNSwxMCArNDA0LDEwIEBACiAgICAqICAgbm8tc3RlbS1kYXJrZW5pbmcKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFsbCBnbHlwaHMgdGhhdCBwYXNzIHRocm91Z2ggdGhlIGF1dG8taGludGVyIHdpbGwgYmUgZW1ib2xkZW5lZAotICAgKiAgIHVubGVzcyB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBUUlVFLiAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgdGhlIENGRiwKLSAgICogICBUeXBlfjEsIGFuZCBDSUQgZm9udCBtb2R1bGVzIGlmIHRoZSBgQWRvYmUnIGVuZ2luZSBpcyBzZWxlY3RlZCAod2hpY2gKLSAgICogICBpcyB0aGUgZGVmYXVsdCkuCisgICAqICAgQWxsIGdseXBocyB0aGF0IHBhc3MgdGhyb3VnaCB0aGUgYXV0by1oaW50ZXIgd2lsbCBiZSBlbWJvbGRlbmVkIHVubGVzcworICAgKiAgIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIFRSVUUuICBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgQ0ZGLCBUeXBlfjEsCisgICAqICAgYW5kIENJRCBmb250IG1vZHVsZXMgaWYgdGhlICdBZG9iZScgZW5naW5lIGlzIHNlbGVjdGVkICh3aGljaCBpcyB0aGUKKyAgICogICBkZWZhdWx0KS4KICAgICoKICAgICogICBTdGVtIGRhcmtlbmluZyBlbWJvbGRlbnMgZ2x5cGhzIGF0IHNtYWxsZXIgc2l6ZXMgdG8gbWFrZSB0aGVtIG1vcmUKICAgICogICByZWFkYWJsZSBvbiBjb21tb24gbG93LURQSSBzY3JlZW5zIHdoZW4gdXNpbmcgbGluZWFyIGFscGhhIGJsZW5kaW5nCkBAIC00MTksMzAgKzQxOCwzNCBAQAogICAgKiAgIEdhbW1hIGNvcnJlY3Rpb24gZXNzZW50aWFsbHkgbGlnaHRlbnMgZm9udHMgc2luY2Ugc2hhZGVzIG9mIGdyZXkgYXJlCiAgICAqICAgc2hpZnRlZCB0byBoaWdoZXIgcGl4ZWwgdmFsdWVzICg9fmhpZ2hlciBicmlnaHRuZXNzKSB0byBtYXRjaCB0aGUKICAgICogICBvcmlnaW5hbCBpbnRlbnRpb24gdG8gdGhlIHJlYWxpdHkgb2Ygb3VyIHNjcmVlbnMuICBUaGUgc2lkZS1lZmZlY3QgaXMKLSAgICogICB0aGF0IGdseXBocyBgdGhpbiBvdXQnLiAgTWFjIE9TflggYW5kIEFkb2JlJ3MgcHJvcHJpZXRhcnkgZm9udAorICAgKiAgIHRoYXQgZ2x5cGhzICd0aGluIG91dCcuICBNYWMgT1N+WCBhbmQgQWRvYmUncyBwcm9wcmlldGFyeSBmb250CiAgICAqICAgcmVuZGVyaW5nIGxpYnJhcnkgaW1wbGVtZW50IGEgY291bnRlci1tZWFzdXJlOiBzdGVtIGRhcmtlbmluZyBhdAogICAgKiAgIHNtYWxsZXIgc2l6ZXMgd2hlcmUgc2hhZGVzIG9mIGdyYXkgZG9taW5hdGUuICBCeSBlbWJvbGRlbmluZyBhIGdseXBoCiAgICAqICAgc2xpZ2h0bHkgaW4gcmVsYXRpb24gdG8gaXRzIHBpeGVsIHNpemUsIGluZGl2aWR1YWwgcGl4ZWxzIGdldCBoaWdoZXIKLSAgICogICBjb3ZlcmFnZSBvZiBmaWxsZWQtaW4gb3V0bGluZXMgYW5kIGFyZSB0aGVyZWZvcmUgYGJsYWNrZXInLiAgVGhpcwotICAgKiAgIGNvdW50ZXJhY3RzIHRoZSBgdGhpbm5pbmcgb3V0JyBvZiBnbHlwaHMsIG1ha2luZyB0ZXh0IHJlbWFpbiByZWFkYWJsZQorICAgKiAgIGNvdmVyYWdlIG9mIGZpbGxlZC1pbiBvdXRsaW5lcyBhbmQgYXJlIHRoZXJlZm9yZSAnYmxhY2tlcicuICBUaGlzCisgICAqICAgY291bnRlcmFjdHMgdGhlICd0aGlubmluZyBvdXQnIG9mIGdseXBocywgbWFraW5nIHRleHQgcmVtYWluIHJlYWRhYmxlCiAgICAqICAgYXQgc21hbGxlciBzaXplcy4KICAgICoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgQWRvYmUgZW5naW5lcyBmb3IgQ0ZGLCBUeXBlfjEsIGFuZCBDSUQgZm9udHMgZGFya2VuCi0gICAqICAgc3RlbXMgYXQgc21hbGxlciBzaXplcywgcmVnYXJkbGVzcyBvZiBoaW50aW5nLCB0byBlbmhhbmNlIGNvbnRyYXN0LiAKLSAgICogICBTZXR0aW5nIHRoaXMgcHJvcGVydHksIHN0ZW0gZGFya2VuaW5nIGdldHMgc3dpdGNoZWQgb2ZmLgotICAgKgotICAgKiAgIEZvciB0aGUgYXV0by1oaW50ZXIsIHN0ZW0tZGFya2VuaW5nIGlzIGV4cGVyaW1lbnRhbCBjdXJyZW50bHkgYW5kCi0gICAqICAgdGh1cyBzd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdCAodGhpcyBpcywgYG5vLXN0ZW0tZGFya2VuaW5nJyBpcyBzZXQgdG8KLSAgICogICBUUlVFIGJ5IGRlZmF1bHQpLiAgVG90YWwgY29uc2lzdGVuY3kgd2l0aCB0aGUgQ0ZGIGRyaXZlciBpcyBub3QKLSAgICogICBhY2hpZXZlZCByaWdodCBub3cgYmVjYXVzZSB0aGUgZW1ib2xkZW5pbmcgbWV0aG9kIGRpZmZlcnMgYW5kIGdseXBocwotICAgKiAgIG11c3QgYmUgc2NhbGVkIGRvd24gb24gdGhlIFktYXhpcyB0byBrZWVwIG91dGxpbmUgcG9pbnRzIGluc2lkZSB0aGVpcgorICAgKiAgIEZvciB0aGUgYXV0by1oaW50ZXIsIHN0ZW0tZGFya2VuaW5nIGlzIGV4cGVyaW1lbnRhbCBjdXJyZW50bHkgYW5kIHRodXMKKyAgICogICBzd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdCAodGhpcyBpcywgYG5vLXN0ZW0tZGFya2VuaW5nYCBpcyBzZXQgdG8gVFJVRQorICAgKiAgIGJ5IGRlZmF1bHQpLiAgVG90YWwgY29uc2lzdGVuY3kgd2l0aCB0aGUgQ0ZGIGRyaXZlciBpcyBub3QgYWNoaWV2ZWQKKyAgICogICByaWdodCBub3cgYmVjYXVzZSB0aGUgZW1ib2xkZW5pbmcgbWV0aG9kIGRpZmZlcnMgYW5kIGdseXBocyBtdXN0IGJlCisgICAqICAgc2NhbGVkIGRvd24gb24gdGhlIFktYXhpcyB0byBrZWVwIG91dGxpbmUgcG9pbnRzIGluc2lkZSB0aGVpcgogICAgKiAgIHByZWNvbXB1dGVkIGJsdWUgem9uZXMuICBUaGUgc21hbGxlciB0aGUgc2l6ZSAoZXNwZWNpYWxseSA5cHBlbSBhbmQKICAgICogICBkb3duKSwgdGhlIGhpZ2hlciB0aGUgbG9zcyBvZiBlbWJvbGRlbmluZyB2ZXJzdXMgdGhlIENGRiBkcml2ZXIuCiAgICAqCi0gICAqICAgTm90ZSB0aGF0IHN0ZW0gZGFya2VuaW5nIGlzIG5ldmVyIGFwcGxpZWQgaWYgQEZUX0xPQURfTk9fU0NBTEUgaXMKLSAgICogICBzZXQuCisgICAqICAgTm90ZSB0aGF0IHN0ZW0gZGFya2VuaW5nIGlzIG5ldmVyIGFwcGxpZWQgaWYgQEZUX0xPQURfTk9fU0NBTEUgaXMgc2V0LgogICAgKgotICAgKiAgIHsKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFU2AgZW52aXJvbm1lbnQKKyAgICogICB2YXJpYWJsZSAodXNpbmcgdmFsdWVzIDEgYW5kIDAgZm9yICdvbicgYW5kICdvZmYnLCByZXNwZWN0aXZlbHkpLiAgSXQKKyAgICogICBjYW4gYWxzbyBiZSBzZXQgcGVyIGZhY2UgdXNpbmcgQEZUX0ZhY2VfUHJvcGVydGllcyB3aXRoCisgICAqICAgQEZUX1BBUkFNX1RBR19TVEVNX0RBUktFTklORy4KKyAgICoKKyAgICogQGV4YW1wbGU6CisgICAqICAgYGBgCiAgICAqICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwogICAgKiAgICAgRlRfQm9vbCAgICAgbm9fc3RlbV9kYXJrZW5pbmcgPSBUUlVFOwogICAgKgpAQCAtNDUxLDIyICs0NTQsMTQgQEAKICAgICoKICAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImNmZiIsCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuby1zdGVtLWRhcmtlbmluZyIsICZub19zdGVtX2RhcmtlbmluZyApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycgZW52aXJvbm1lbnQKLSAgICogICB2YXJpYWJsZSAodXNpbmcgdmFsdWVzIDEgYW5kIDAgZm9yIGBvbicgYW5kIGBvZmYnLCByZXNwZWN0aXZlbHkpLgotICAgKiAgIEl0IGNhbiBhbHNvIGJlIHNldCBwZXIgZmFjZSB1c2luZyBARlRfRmFjZV9Qcm9wZXJ0aWVzIHdpdGgKLSAgICogICBARlRfUEFSQU1fVEFHX1NURU1fREFSS0VOSU5HLgorICAgKiAgIGBgYAogICAgKgogICAgKiBAc2luY2U6Ci0gICAqICAgMi40LjEyIChmb3IgYGNmZicgbW9kdWxlKQorICAgKiAgIDIuNC4xMiAoZm9yICdjZmYnIG1vZHVsZSkKICAgICoKLSAgICogICAyLjYuMiAoZm9yIGBhdXRvZml0dGVyJyBtb2R1bGUpCisgICAqICAgMi42LjIgKGZvciAnYXV0b2ZpdHRlcicgbW9kdWxlKQogICAgKgotICAgKiAgIDIuOSAoZm9yIGB0eXBlMScgYW5kIGB0MWNpZCcgbW9kdWxlcykKKyAgICogICAyLjkgKGZvciAndHlwZTEnIGFuZCAndDFjaWQnIG1vZHVsZXMpCiAgICAqCiAgICAqLwogCkBAIC00NzgsMjQgKzQ3Myw0NyBAQAogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQnkgZGVmYXVsdCwgdGhlIEFkb2JlIGhpbnRpbmcgZW5naW5lLCBhcyB1c2VkIGJ5IHRoZSBDRkYsIFR5cGV+MSwgYW5kCi0gICAqICAgQ0lEIGZvbnQgZHJpdmVycywgZGFya2VucyBzdGVtcyBhcyBmb2xsb3dzIChpZiB0aGUKLSAgICogICBgbm8tc3RlbS1kYXJrZW5pbmcnIHByb3BlcnR5IGlzbid0IHNldCk6CisgICAqICAgQ0lEIGZvbnQgZHJpdmVycywgZGFya2VucyBzdGVtcyBhcyBmb2xsb3dzIChpZiB0aGUgYG5vLXN0ZW0tZGFya2VuaW5nYAorICAgKiAgIHByb3BlcnR5IGlzbid0IHNldCk6CiAgICAqCi0gICAqICAgeworICAgKiAgIGBgYAogICAgKiAgICAgc3RlbSB3aWR0aCA8PSAwLjVweDogICBkYXJrZW5pbmcgYW1vdW50ID0gMC40cHgKICAgICogICAgIHN0ZW0gd2lkdGggID0gMXB4OiAgICAgZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKICAgICogICAgIHN0ZW0gd2lkdGggID0gMS42NjdweDogZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKICAgICogICAgIHN0ZW0gd2lkdGggPj0gMi4zMzNweDogZGFya2VuaW5nIGFtb3VudCA9IDBweAotICAgKiAgIH0KKyAgICogICBgYGAKICAgICoKICAgICogICBhbmQgcGllY2V3aXNlIGxpbmVhciBpbi1iZXR3ZWVuLiAgQXQgY29uZmlndXJhdGlvbiB0aW1lLCB0aGVzZSBmb3VyCiAgICAqICAgY29udHJvbCBwb2ludHMgY2FuIGJlIHNldCB3aXRoIHRoZSBtYWNybwotICAgKiAgIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSUyc7IHRoZSBDRkYsIFR5cGV+MSwgYW5kIENJRAorICAgKiAgIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSU2A7IHRoZSBDRkYsIFR5cGV+MSwgYW5kIENJRAogICAgKiAgIGRyaXZlcnMgc2hhcmUgdGhlc2UgdmFsdWVzLiAgQXQgcnVudGltZSwgdGhlIGNvbnRyb2wgcG9pbnRzIGNhbiBiZQotICAgKiAgIGNoYW5nZWQgdXNpbmcgdGhlIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHksIGFzIHRoZSBmb2xsb3dpbmcKLSAgICogICBleGFtcGxlIGRlbW9uc3RyYXRlcyBmb3IgdGhlIFR5cGV+MSBkcml2ZXIuCisgICAqICAgY2hhbmdlZCB1c2luZyB0aGUgYGRhcmtlbmluZy1wYXJhbWV0ZXJzYCBwcm9wZXJ0eSAoc2VlIHRoZSBleGFtcGxlCisgICAqICAgYmVsb3cgdGhhdCBkZW1vbnN0cmF0ZXMgdGhpcyBmb3IgdGhlIFR5cGV+MSBkcml2ZXIpLgogICAgKgotICAgKiAgIHsKKyAgICogICBUaGUgeH52YWx1ZXMgZ2l2ZSB0aGUgc3RlbSB3aWR0aCwgYW5kIHRoZSB5fnZhbHVlcyB0aGUgZGFya2VuaW5nCisgICAqICAgYW1vdW50LiAgVGhlIHVuaXQgaXMgMTAwMHRoIG9mIHBpeGVscy4gIEFsbCBjb29yZGluYXRlIHZhbHVlcyBtdXN0IGJlCisgICAqICAgcG9zaXRpdmU7IHRoZSB4fnZhbHVlcyBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZzsgdGhlIHl+dmFsdWVzCisgICAqICAgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGRlY3JlYXNpbmcgYW5kIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byA1MDAKKyAgICogICAoY29ycmVzcG9uZGluZyB0byBoYWxmIGEgcGl4ZWwpOyB0aGUgc2xvcGUgb2YgZWFjaCBsaW5lYXIgcGllY2UgbXVzdAorICAgKiAgIGJlIHNoYWxsb3dlciB0aGFuIC0xIChlLmcuLCAtLjQpLgorICAgKgorICAgKiAgIFRoZSBhdXRvLWhpbnRlciBwcm92aWRlcyB0aGlzIHByb3BlcnR5LCB0b28sIGFzIGFuIGV4cGVyaW1lbnRhbAorICAgKiAgIGZlYXR1cmUuICBTZWUgQG5vLXN0ZW0tZGFya2VuaW5nIGZvciBtb3JlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgorICAgKgorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCBlbnZpcm9ubWVudAorICAgKiAgIHZhcmlhYmxlLCB1c2luZyBlaWdodCBjb21tYS1zZXBhcmF0ZWQgaW50ZWdlcnMgd2l0aG91dCBzcGFjZXMuICBIZXJlCisgICAqICAgdGhlIGFib3ZlIGV4YW1wbGUsIHVzaW5nIGBcYCB0byBicmVhayB0aGUgbGluZSBmb3IgcmVhZGFiaWxpdHkuCisgICAqCisgICAqICAgYGBgCisgICAqICAgICBGUkVFVFlQRV9QUk9QRVJUSUVTPVwKKyAgICogICAgIHR5cGUxOmRhcmtlbmluZy1wYXJhbWV0ZXJzPTUwMCwzMDAsMTAwMCwyMDAsMTUwMCwxMDAsMjAwMCwwCisgICAqICAgYGBgCisgICAqCisgICAqIEBleGFtcGxlOgorICAgKiAgIGBgYAogICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKICAgICogICAgIEZUX0ludCAgICAgIGRhcmtlbl9wYXJhbXNbOF0gPSB7ICA1MDAsIDMwMCwgICAvLyB4MSwgeTEKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsIDIwMCwgICAvLyB4MiwgeTIKQEAgLTUwNywzNiArNTI1LDE0IEBACiAgICAqCiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJ0eXBlMSIsCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXJrZW5pbmctcGFyYW1ldGVycyIsIGRhcmtlbl9wYXJhbXMgKTsKLSAgICogICB9Ci0gICAqCi0gICAqICAgVGhlIHh+dmFsdWVzIGdpdmUgdGhlIHN0ZW0gd2lkdGgsIGFuZCB0aGUgeX52YWx1ZXMgdGhlIGRhcmtlbmluZwotICAgKiAgIGFtb3VudC4gIFRoZSB1bml0IGlzIDEwMDB0aCBvZiBwaXhlbHMuICBBbGwgY29vcmRpbmF0ZSB2YWx1ZXMgbXVzdCBiZQotICAgKiAgIHBvc2l0aXZlOyB0aGUgeH52YWx1ZXMgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmc7IHRoZQotICAgKiAgIHl+dmFsdWVzIG11c3QgYmUgbW9ub3RvbmljYWxseSBkZWNyZWFzaW5nIGFuZCBzbWFsbGVyIHRoYW4gb3IKLSAgICogICBlcXVhbCB0byA1MDAgKGNvcnJlc3BvbmRpbmcgdG8gaGFsZiBhIHBpeGVsKTsgdGhlIHNsb3BlIG9mIGVhY2gKLSAgICogICBsaW5lYXIgcGllY2UgbXVzdCBiZSBzaGFsbG93ZXIgdGhhbiAtMSAoZS5nLiwgLS40KS4KLSAgICoKLSAgICogICBUaGUgYXV0by1oaW50ZXIgcHJvdmlkZXMgdGhpcyBwcm9wZXJ0eSwgdG9vLCBhcyBhbiBleHBlcmltZW50YWwKLSAgICogICBmZWF0dXJlLiAgU2VlIEBuby1zdGVtLWRhcmtlbmluZyBmb3IgbW9yZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFUycgZW52aXJvbm1lbnQKLSAgICogICB2YXJpYWJsZSwgdXNpbmcgZWlnaHQgY29tbWEtc2VwYXJhdGVkIGludGVnZXJzIHdpdGhvdXQgc3BhY2VzLiAgSGVyZQotICAgKiAgIHRoZSBhYm92ZSBleGFtcGxlLCB1c2luZyBgXCcgdG8gYnJlYWsgdGhlIGxpbmUgZm9yIHJlYWRhYmlsaXR5LgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZSRUVUWVBFX1BST1BFUlRJRVM9XAotICAgKiAgICAgdHlwZTE6ZGFya2VuaW5nLXBhcmFtZXRlcnM9NTAwLDMwMCwxMDAwLDIwMCwxNTAwLDEwMCwyMDAwLDAKLSAgICogICB9CisgICAqICAgYGBgCiAgICAqCiAgICAqIEBzaW5jZToKLSAgICogICAyLjUuMSAoZm9yIGBjZmYnIG1vZHVsZSkKKyAgICogICAyLjUuMSAoZm9yICdjZmYnIG1vZHVsZSkKICAgICoKLSAgICogICAyLjYuMiAoZm9yIGBhdXRvZml0dGVyJyBtb2R1bGUpCisgICAqICAgMi42LjIgKGZvciAnYXV0b2ZpdHRlcicgbW9kdWxlKQogICAgKgotICAgKiAgIDIuOSAoZm9yIGB0eXBlMScgYW5kIGB0MWNpZCcgbW9kdWxlcykKKyAgICogICAyLjkgKGZvciAndHlwZTEnIGFuZCAndDFjaWQnIG1vZHVsZXMpCiAgICAqCiAgICAqLwogCkBAIC01NDcsMjkgKzU0MywyOSBAQAogICAgKiAgIHJhbmRvbS1zZWVkCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBCeSBkZWZhdWx0LCB0aGUgc2VlZCB2YWx1ZSBmb3IgdGhlIENGRiBgcmFuZG9tJyBvcGVyYXRvciBhbmQgdGhlCi0gICAqICAgc2ltaWxhciBgMCAyOCBjYWxsb3RoZXJzdWJyIHBvcCcgY29tbWFuZCBmb3IgdGhlIFR5cGV+MSBhbmQgQ0lECisgICAqICAgQnkgZGVmYXVsdCwgdGhlIHNlZWQgdmFsdWUgZm9yIHRoZSBDRkYgJ3JhbmRvbScgb3BlcmF0b3IgYW5kIHRoZQorICAgKiAgIHNpbWlsYXIgJzAgMjggY2FsbG90aGVyc3ViciBwb3AnIGNvbW1hbmQgZm9yIHRoZSBUeXBlfjEgYW5kIENJRAogICAgKiAgIGRyaXZlcnMgaXMgc2V0IHRvIGEgcmFuZG9tIHZhbHVlLiAgSG93ZXZlciwgbWFpbmx5IGZvciBkZWJ1Z2dpbmcKLSAgICogICBwdXJwb3NlcywgaXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIHVzZSBhIGtub3duIHZhbHVlIGFzIGEgc2VlZCBzbwotICAgKiAgIHRoYXQgdGhlIHBzZXVkby1yYW5kb20gbnVtYmVyIHNlcXVlbmNlcyBnZW5lcmF0ZWQgYnkgYHJhbmRvbScgYXJlCisgICAqICAgcHVycG9zZXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB1c2UgYSBrbm93biB2YWx1ZSBhcyBhIHNlZWQgc28gdGhhdAorICAgKiAgIHRoZSBwc2V1ZG8tcmFuZG9tIG51bWJlciBzZXF1ZW5jZXMgZ2VuZXJhdGVkIGJ5ICdyYW5kb20nIGFyZQogICAgKiAgIHJlcGVhdGFibGUuCiAgICAqCi0gICAqICAgVGhlIGByYW5kb20tc2VlZCcgcHJvcGVydHkgZG9lcyB0aGF0LiAgSXRzIGFyZ3VtZW50IGlzIGEgc2lnbmVkIDMyYml0CisgICAqICAgVGhlIGByYW5kb20tc2VlZGAgcHJvcGVydHkgZG9lcyB0aGF0LiAgSXRzIGFyZ3VtZW50IGlzIGEgc2lnbmVkIDMyYml0CiAgICAqICAgaW50ZWdlcjsgaWYgdGhlIHZhbHVlIGlzIHplcm8gb3IgbmVnYXRpdmUsIHRoZSBzZWVkIGdpdmVuIGJ5IHRoZQotICAgKiAgIGBpbnRpdGlhbFJhbmRvbVNlZWQnIHByaXZhdGUgRElDVCBvcGVyYXRvciBpbiBhIENGRiBmaWxlIGdldHMgdXNlZAotICAgKiAgIChvciBhIGRlZmF1bHQgdmFsdWUgaWYgdGhlcmUgaXMgbm8gc3VjaCBvcGVyYXRvcikuICBJZiB0aGUgdmFsdWUgaXMKLSAgICogICBwb3NpdGl2ZSwgdXNlIGl0IGluc3RlYWQgb2YgYGluaXRpYWxSYW5kb21TZWVkJywgd2hpY2ggaXMKLSAgICogICBjb25zZXF1ZW50bHkgaWdub3JlZC4KKyAgICogICBgaW50aXRpYWxSYW5kb21TZWVkYCBwcml2YXRlIERJQ1Qgb3BlcmF0b3IgaW4gYSBDRkYgZmlsZSBnZXRzIHVzZWQgKG9yCisgICAqICAgYSBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIG5vIHN1Y2ggb3BlcmF0b3IpLiAgSWYgdGhlIHZhbHVlIGlzCisgICAqICAgcG9zaXRpdmUsIHVzZSBpdCBpbnN0ZWFkIG9mIGBpbml0aWFsUmFuZG9tU2VlZGAsIHdoaWNoIGlzIGNvbnNlcXVlbnRseQorICAgKiAgIGlnbm9yZWQuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudAorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHNldCB2aWEgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTYCBlbnZpcm9ubWVudAogICAgKiAgIHZhcmlhYmxlLiAgSXQgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlIHVzaW5nIEBGVF9GYWNlX1Byb3BlcnRpZXMgd2l0aAogICAgKiAgIEBGVF9QQVJBTV9UQUdfUkFORE9NX1NFRUQuCiAgICAqCiAgICAqIEBzaW5jZToKLSAgICogICAyLjggKGZvciBgY2ZmJyBtb2R1bGUpCisgICAqICAgMi44IChmb3IgJ2NmZicgbW9kdWxlKQogICAgKgotICAgKiAgIDIuOSAoZm9yIGB0eXBlMScgYW5kIGB0MWNpZCcgbW9kdWxlcykKKyAgICogICAyLjkgKGZvciAndHlwZTEnIGFuZCAndDFjaWQnIG1vZHVsZXMpCiAgICAqCiAgICAqLwogCkBAIC01ODAsMjEgKzU3NiwyOCBAQAogICAgKiAgIG5vLWxvbmctZmFtaWx5LW5hbWVzCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBJZiBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUyBpcyBhY3RpdmUgd2hpbGUgY29tcGlsaW5nCisgICAqICAgSWYgYFBDRl9DT05GSUdfT1BUSU9OX0xPTkdfRkFNSUxZX05BTUVTYCBpcyBhY3RpdmUgd2hpbGUgY29tcGlsaW5nCiAgICAqICAgRnJlZVR5cGUsIHRoZSBQQ0YgZHJpdmVyIGNvbnN0cnVjdHMgbG9uZyBmYW1pbHkgbmFtZXMuCiAgICAqCi0gICAqICAgVGhlcmUgYXJlIG1hbnkgUENGIGZvbnRzIGp1c3QgY2FsbGVkIGBGaXhlZCcgd2hpY2ggbG9vayBjb21wbGV0ZWx5CisgICAqICAgVGhlcmUgYXJlIG1hbnkgUENGIGZvbnRzIGp1c3QgY2FsbGVkICdGaXhlZCcgd2hpY2ggbG9vayBjb21wbGV0ZWx5CiAgICAqICAgZGlmZmVyZW50LCBhbmQgd2hpY2ggaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggZWFjaCBvdGhlci4gIFdoZW4KLSAgICogICBzZWxlY3RpbmcgYEZpeGVkJyBpbiBLREUgb3IgR25vbWUgb25lIGdldHMgcmVzdWx0cyB0aGF0IGFwcGVhciByYXRoZXIKLSAgICogICByYW5kb20sIHRoZSBzdHlsZSBjaGFuZ2VzIG9mdGVuIGlmIG9uZSBjaGFuZ2VzIHRoZSBzaXplIGFuZCBvbmUKLSAgICogICBjYW5ub3Qgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAgVGhlIGltcHJvdmUgdGhpcyBzaXR1YXRpb24sIHRoZSBQQ0YKLSAgICogICBtb2R1bGUgcHJlcGVuZHMgdGhlIGZvdW5kcnkgbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuCi0gICAqICAgSXQgYWxzbyBjaGVja3Mgd2hldGhlciB0aGVyZSBhcmUgYHdpZGUnIGNoYXJhY3RlcnM7IGFsbCBwdXQgdG9nZXRoZXIsCi0gICAqICAgZmFtaWx5IG5hbWVzIGxpa2UgYFNvbnkgRml4ZWQnIG9yIGBNaXNjIEZpeGVkIFdpZGUnIGFyZSBjb25zdHJ1Y3RlZC4KKyAgICogICBzZWxlY3RpbmcgJ0ZpeGVkJyBpbiBLREUgb3IgR25vbWUgb25lIGdldHMgcmVzdWx0cyB0aGF0IGFwcGVhciByYXRoZXIKKyAgICogICByYW5kb20sIHRoZSBzdHlsZSBjaGFuZ2VzIG9mdGVuIGlmIG9uZSBjaGFuZ2VzIHRoZSBzaXplIGFuZCBvbmUgY2Fubm90CisgICAqICAgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAgVGhlIGltcHJvdmUgdGhpcyBzaXR1YXRpb24sIHRoZSBQQ0YgbW9kdWxlCisgICAqICAgcHJlcGVuZHMgdGhlIGZvdW5kcnkgbmFtZSAocGx1cyBhIHNwYWNlKSB0byB0aGUgZmFtaWx5IG5hbWUuICBJdCBhbHNvCisgICAqICAgY2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlICd3aWRlJyBjaGFyYWN0ZXJzOyBhbGwgcHV0IHRvZ2V0aGVyLCBmYW1pbHkKKyAgICogICBuYW1lcyBsaWtlICdTb255IEZpeGVkJyBvciAnTWlzYyBGaXhlZCBXaWRlJyBhcmUgY29uc3RydWN0ZWQuCiAgICAqCi0gICAqICAgSWYgYG5vLWxvbmctZmFtaWx5LW5hbWVzJyBpcyBzZXQsIHRoaXMgZmVhdHVyZSBnZXRzIHN3aXRjaGVkIG9mZi4KKyAgICogICBJZiBgbm8tbG9uZy1mYW1pbHktbmFtZXNgIGlzIHNldCwgdGhpcyBmZWF0dXJlIGdldHMgc3dpdGNoZWQgb2ZmLgogICAgKgotICAgKiAgIHsKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFU2AgZW52aXJvbm1lbnQKKyAgICogICB2YXJpYWJsZSAodXNpbmcgdmFsdWVzIDEgYW5kIDAgZm9yICdvbicgYW5kICdvZmYnLCByZXNwZWN0aXZlbHkpLgorICAgKgorICAgKiBAZXhhbXBsZToKKyAgICogICBgYGAKICAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CiAgICAqICAgICBGVF9Cb29sICAgICBub19sb25nX2ZhbWlseV9uYW1lcyA9IFRSVUU7CiAgICAqCkBAIC02MDQsMTMgKzYwNyw3IEBACiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJwY2YiLAogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8tbG9uZy1mYW1pbHktbmFtZXMiLAogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9fbG9uZ19mYW1pbHlfbmFtZXMgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50Ci0gICAqICAgdmFyaWFibGUgKHVzaW5nIHZhbHVlcyAxIGFuZCAwIGZvciBgb24nIGFuZCBgb2ZmJywgcmVzcGVjdGl2ZWx5KS4KKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuOApAQCAtNjI2LDggKzYyMyw4IEBACiAgICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGludGVycHJldGVyLXZlcnNpb24gcHJvcGVydHkgdG8KICAgICogICBzZWxlY3QgdGhlIGhpbnRpbmcgZW5naW5lIGZvciBUcnVldHlwZSBmb250cy4KICAgICoKLSAgICogICBUaGUgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgY29uc3RhbnQgbmFtZXMgcmVwcmVzZW50cyB0aGUgdmVyc2lvbgotICAgKiAgIG51bWJlciBhcyByZXR1cm5lZCBieSB0aGUgYEdFVElORk8nIGJ5dGVjb2RlIGluc3RydWN0aW9uLgorICAgKiAgIFRoZSBudW1lcmljIHZhbHVlIGluIHRoZSBjb25zdGFudCBuYW1lcyByZXByZXNlbnRzIHRoZSB2ZXJzaW9uIG51bWJlcgorICAgKiAgIGFzIHJldHVybmVkIGJ5IHRoZSAnR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uCiAgICAqCiAgICAqIEB2YWx1ZXM6CiAgICAqICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSA6OgpAQCAtNjM4LDM4ICs2MzUsMzcgQEAKICAgICogICAgIFZlcnNpb25+MzggY29ycmVzcG9uZHMgdG8gTVMgcmFzdGVyaXplciB2LjEuOTsgaXQgaXMgcm91Z2hseQogICAgKiAgICAgZXF1aXZhbGVudCB0byB0aGUgaGludGluZyBwcm92aWRlZCBieSBEaXJlY3RXcml0ZSBDbGVhclR5cGUgKGFzIGNhbgogICAgKiAgICAgYmUgZm91bmQsIGZvciBleGFtcGxlLCBpbiB0aGUgSW50ZXJuZXQgRXhwbG9yZXJ+OSBydW5uaW5nIG9uCi0gICAqICAgICBXaW5kb3dzfjcpLiAgSXQgaXMgdXNlZCBpbiBGcmVlVHlwZSB0byBzZWxlY3QgdGhlIGBJbmZpbmFsaXR5JwotICAgKiAgICAgc3VicGl4ZWwgaGludGluZyBjb2RlLiAgVGhlIGNvZGUgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUKLSAgICogICAgIHZlcnNpb24uCisgICAqICAgICBXaW5kb3dzfjcpLiAgSXQgaXMgdXNlZCBpbiBGcmVlVHlwZSB0byBzZWxlY3QgdGhlICdJbmZpbmFsaXR5JworICAgKiAgICAgc3VicGl4ZWwgaGludGluZyBjb2RlLiAgVGhlIGNvZGUgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KICAgICoKICAgICogICBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzQwIDo6CiAgICAqICAgICBWZXJzaW9ufjQwIGNvcnJlc3BvbmRzIHRvIE1TIHJhc3Rlcml6ZXIgdi4yLjE7IGl0IGlzIHJvdWdobHkKICAgICogICAgIGVxdWl2YWxlbnQgdG8gdGhlIGhpbnRpbmcgcHJvdmlkZWQgYnkgRGlyZWN0V3JpdGUgQ2xlYXJUeXBlIChhcyBjYW4KICAgICogICAgIGJlIGZvdW5kLCBmb3IgZXhhbXBsZSwgaW4gTWljcm9zb2Z0J3MgRWRnZSBCcm93c2VyIG9uIFdpbmRvd3N+MTApLgotICAgKiAgICAgSXQgaXMgdXNlZCBpbiBGcmVlVHlwZSB0byBzZWxlY3QgdGhlIGBtaW5pbWFsJyBzdWJwaXhlbCBoaW50aW5nCisgICAqICAgICBJdCBpcyB1c2VkIGluIEZyZWVUeXBlIHRvIHNlbGVjdCB0aGUgJ21pbmltYWwnIHN1YnBpeGVsIGhpbnRpbmcKICAgICogICAgIGNvZGUsIGEgc3RyaXBwZWQtZG93biBhbmQgaGlnaGVyIHBlcmZvcm1hbmNlIHZlcnNpb24gb2YgdGhlCi0gICAqICAgICBgSW5maW5hbGl0eScgY29kZS4KKyAgICogICAgICdJbmZpbmFsaXR5JyBjb2RlLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyCi0gICAqICAgYW5kIHRodXMgaG93IG91dGxpbmVzIGdldCBoaW50ZWQuICBJdCBkb2VzICpub3QqIGNvbnRyb2wgaG93IGdseXBoCi0gICAqICAgZ2V0IHJhc3Rlcml6ZWQhICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBjb250cm9sIHN1YnBpeGVsIGNvbG9yCisgICAqICAgVGhpcyBwcm9wZXJ0eSBjb250cm9scyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciBhbmQKKyAgICogICB0aHVzIGhvdyBvdXRsaW5lcyBnZXQgaGludGVkLiAgSXQgZG9lcyAqKm5vdCoqIGNvbnRyb2wgaG93IGdseXBoIGdldAorICAgKiAgIHJhc3Rlcml6ZWQhICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBjb250cm9sIHN1YnBpeGVsIGNvbG9yCiAgICAqICAgZmlsdGVyaW5nLgogICAgKgogICAgKiAgIElmIEZyZWVUeXBlIGhhcyBub3QgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbgotICAgKiAgIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORywgc2VsZWN0aW5nIHZlcnNpb25+Mzggb3J+NDAgY2F1c2VzCi0gICAqICAgYW4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGVycm9yLgorICAgKiAgIGBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkdgLCBzZWxlY3RpbmcgdmVyc2lvbn4zOCBvcn40MCBjYXVzZXMKKyAgICogICBhbiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAgZXJyb3IuCiAgICAqCi0gICAqICAgRGVwZW5kaW5nIG9uIHRoZSBncmFwaGljcyBmcmFtZXdvcmssIE1pY3Jvc29mdCB1c2VzIGRpZmZlcmVudAotICAgKiAgIGJ5dGVjb2RlIGFuZCByZW5kZXJpbmcgZW5naW5lcy4gIEFzIGEgY29uc2VxdWVuY2UsIHRoZSB2ZXJzaW9uCi0gICAqICAgbnVtYmVycyByZXR1cm5lZCBieSBhIGNhbGwgdG8gdGhlIGBHRVRJTkZPJyBieXRlY29kZSBpbnN0cnVjdGlvbiBhcmUKLSAgICogICBtb3JlIGNvbnZvbHV0ZWQgdGhhbiBkZXNpcmVkLgorICAgKiAgIERlcGVuZGluZyBvbiB0aGUgZ3JhcGhpY3MgZnJhbWV3b3JrLCBNaWNyb3NvZnQgdXNlcyBkaWZmZXJlbnQgYnl0ZWNvZGUKKyAgICogICBhbmQgcmVuZGVyaW5nIGVuZ2luZXMuICBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgdmVyc2lvbiBudW1iZXJzIHJldHVybmVkCisgICAqICAgYnkgYSBjYWxsIHRvIHRoZSAnR0VUSU5GTycgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gYXJlIG1vcmUgY29udm9sdXRlZAorICAgKiAgIHRoYW4gZGVzaXJlZC4KICAgICoKLSAgICogICBIZXJlIGFyZSB0d28gdGFibGVzIHRoYXQgdHJ5IHRvIHNoZWQgc29tZSBsaWdodCBvbiB0aGUgcG9zc2libGUKLSAgICogICB2YWx1ZXMgZm9yIHRoZSBNUyByYXN0ZXJpemVyIGVuZ2luZSwgdG9nZXRoZXIgd2l0aCB0aGUgYWRkaXRpb25hbAotICAgKiAgIGZlYXR1cmVzIGludHJvZHVjZWQgYnkgaXQuCisgICAqICAgSGVyZSBhcmUgdHdvIHRhYmxlcyB0aGF0IHRyeSB0byBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIHBvc3NpYmxlIHZhbHVlcworICAgKiAgIGZvciB0aGUgTVMgcmFzdGVyaXplciBlbmdpbmUsIHRvZ2V0aGVyIHdpdGggdGhlIGFkZGl0aW9uYWwgZmVhdHVyZXMKKyAgICogICBpbnRyb2R1Y2VkIGJ5IGl0LgogICAgKgotICAgKiAgIHsKKyAgICogICBgYGAKICAgICogICAgIEdFVElORk8gZnJhbWV3b3JrICAgICAgICAgICAgICAgdmVyc2lvbiBmZWF0dXJlCiAgICAqICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAqICAgICAgICAgMyAgIEdESSAoV2luIDMuMSksICAgICAgICAgICAgdjEuMCAgMTYtYml0LCBmaXJzdCB2ZXJzaW9uCkBAIC02OTIsMTUgKzY4OCwxNSBAQAogICAgKiAgICAgICAgNDAgICBHREkrIChhZnRlciBXaW4gNyksICAgICAgIHYyLjEgIFktZGlyZWN0aW9uIENsZWFyVHlwZSBmbGFnCiAgICAqICAgICAgICAgICAgIERXcml0ZSAoV2luIDgpICAgICAgICAgICAgICAgICAgICBpbiBHRVRJTkZPIG9wY29kZSwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmF5IENsZWFyVHlwZQotICAgKiAgIH0KKyAgICogICBgYGAKICAgICoKLSAgICogICBUaGUgYHZlcnNpb24nIGZpZWxkIGdpdmVzIGEgcm91Z2ggb3JpZW50YXRpb24gb25seSwgc2luY2Ugc29tZQorICAgKiAgIFRoZSAndmVyc2lvbicgZmllbGQgZ2l2ZXMgYSByb3VnaCBvcmllbnRhdGlvbiBvbmx5LCBzaW5jZSBzb21lCiAgICAqICAgYXBwbGljYXRpb25zIHByb3ZpZGVkIGNlcnRhaW4gZmVhdHVyZXMgbXVjaCBlYXJsaWVyIChhcyBhbiBleGFtcGxlLAogICAgKiAgIE1pY3Jvc29mdCBSZWFkZXIgdXNlZCBzdWJwaXhlbCBhbmQgWS1kaXJlY3Rpb24gQ2xlYXJUeXBlIGFscmVhZHkgaW4KICAgICogICBXaW5kb3dzIDIwMDApLiAgU2ltaWxhcmx5LCB1cGRhdGVzIHRvIGEgZ2l2ZW4gZnJhbWV3b3JrIG1pZ2h0IGluY2x1ZGUKICAgICogICBpbXByb3ZlZCBoaW50aW5nIHN1cHBvcnQuCiAgICAqCi0gICAqICAgeworICAgKiAgIGBgYAogICAgKiAgICAgIHZlcnNpb24gICBzYW1wbGluZyAgICAgICAgICByZW5kZXJpbmcgICAgICAgIGNvbW1lbnQKICAgICogICAgICAgICAgICAgICB4ICAgICAgICB5ICAgICAgIHggICAgICAgICAgIHkKICAgICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MTAsMzggKzcwNiwzOCBAQAogICAgKiAgICAgICB2MS45ICAgaGlnaCAgICBoaWdoICAgIGNvbG9yLWZpbHRlciAgZ3JheSAgIENvbG9yIENsZWFyVHlwZQogICAgKiAgICAgICB2Mi4xICAgaGlnaCAgICBub3JtYWwgIGdyYXkgICAgICAgICAgQi9XICAgIEdyYXkgQ2xlYXJUeXBlCiAgICAqICAgICAgIHYyLjEgICBoaWdoICAgIGhpZ2ggICAgZ3JheSAgICAgICAgICBncmF5ICAgR3JheSBDbGVhclR5cGUKLSAgICogICB9CisgICAqICAgYGBgCiAgICAqCiAgICAqICAgQ29sb3IgYW5kIEdyYXkgQ2xlYXJUeXBlIGFyZSB0aGUgdHdvIGF2YWlsYWJsZSB2YXJpYW50cyBvZgotICAgKiAgIGBZLWRpcmVjdGlvbiBDbGVhclR5cGUnLCBtZWFuaW5nIGdyYXlzY2FsZSByYXN0ZXJpemF0aW9uIGFsb25nIHRoZQorICAgKiAgICdZLWRpcmVjdGlvbiBDbGVhclR5cGUnLCBtZWFuaW5nIGdyYXlzY2FsZSByYXN0ZXJpemF0aW9uIGFsb25nIHRoZQogICAgKiAgIFktZGlyZWN0aW9uOyB0aGUgbmFtZSB1c2VkIGluIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciB0aGlzCi0gICAqICAgZmVhdHVyZSBpcyBgc3ltbWV0cmljIHNtb290aGluZycuICBgQ2xhc3NpYyBDbGVhclR5cGUnIGlzIHRoZQotICAgKiAgIG9yaWdpbmFsIGFsZ29yaXRobSB1c2VkIGJlZm9yZSBpbnRyb2R1Y2luZyBhIG1vZGlmaWVkIHZlcnNpb24gaW4KLSAgICogICBXaW5+WFAuICBBbm90aGVyIG5hbWUgZm9yIHYxLjYncyBncmF5c2NhbGUgcmVuZGVyaW5nIGlzIGBmb250Ci0gICAqICAgc21vb3RoaW5nJywgYW5kIGBDb2xvciBDbGVhclR5cGUnIGlzIHNvbWV0aW1lcyBhbHNvIGNhbGxlZCBgRFdyaXRlCi0gICAqICAgQ2xlYXJUeXBlJy4gIFRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0b2RheSdzIENvbG9yIENsZWFyVHlwZSBhbmQgdGhlCi0gICAqICAgZWFybGllciBDbGVhclR5cGUgdmFyaWFudCB3aXRoIEIvVyByZW5kZXJpbmcgYWxvbmcgdGhlIHZlcnRpY2FsIGF4aXMsCi0gICAqICAgdGhlIGxhdHRlciBpcyBzb21ldGltZXMgY2FsbGVkIGBHREkgQ2xlYXJUeXBlJy4KKyAgICogICBmZWF0dXJlIGlzICdzeW1tZXRyaWMgc21vb3RoaW5nJy4gICdDbGFzc2ljIENsZWFyVHlwZScgaXMgdGhlIG9yaWdpbmFsCisgICAqICAgYWxnb3JpdGhtIHVzZWQgYmVmb3JlIGludHJvZHVjaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBpbiBXaW5+WFAuCisgICAqICAgQW5vdGhlciBuYW1lIGZvciB2MS42J3MgZ3JheXNjYWxlIHJlbmRlcmluZyBpcyAnZm9udCBzbW9vdGhpbmcnLCBhbmQKKyAgICogICAnQ29sb3IgQ2xlYXJUeXBlJyBpcyBzb21ldGltZXMgYWxzbyBjYWxsZWQgJ0RXcml0ZSBDbGVhclR5cGUnLiAgVG8KKyAgICogICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdG9kYXkncyBDb2xvciBDbGVhclR5cGUgYW5kIHRoZSBlYXJsaWVyCisgICAqICAgQ2xlYXJUeXBlIHZhcmlhbnQgd2l0aCBCL1cgcmVuZGVyaW5nIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzLCB0aGUKKyAgICogICBsYXR0ZXIgaXMgc29tZXRpbWVzIGNhbGxlZCAnR0RJIENsZWFyVHlwZScuCiAgICAqCi0gICAqICAgYE5vcm1hbCcgYW5kIGBoaWdoJyBzYW1wbGluZyBkZXNjcmliZSB0aGUgKHZpcnR1YWwpIHJlc29sdXRpb24gdG8KLSAgICogICBhY2Nlc3MgdGhlIHJhc3Rlcml6ZWQgb3V0bGluZSBhZnRlciB0aGUgaGludGluZyBwcm9jZXNzLiAgYE5vcm1hbCcKKyAgICogICAnTm9ybWFsJyBhbmQgJ2hpZ2gnIHNhbXBsaW5nIGRlc2NyaWJlIHRoZSAodmlydHVhbCkgcmVzb2x1dGlvbiB0bworICAgKiAgIGFjY2VzcyB0aGUgcmFzdGVyaXplZCBvdXRsaW5lIGFmdGVyIHRoZSBoaW50aW5nIHByb2Nlc3MuICAnTm9ybWFsJwogICAgKiAgIG1lYW5zIDEgc2FtcGxlIHBlciBncmlkIGxpbmUgKGkuZS4sIEIvVykuICBJbiB0aGUgY3VycmVudCBNaWNyb3NvZnQKLSAgICogICBpbXBsZW1lbnRhdGlvbiwgYGhpZ2gnIG1lYW5zIGFuIGV4dHJhIHZpcnR1YWwgcmVzb2x1dGlvbiBvZiAxNngxNiAob3IKLSAgICogICAxNngxKSBncmlkIGxpbmVzIHBlciBwaXhlbCBmb3IgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGxpa2UgYE1JUlAnLgorICAgKiAgIGltcGxlbWVudGF0aW9uLCAnaGlnaCcgbWVhbnMgYW4gZXh0cmEgdmlydHVhbCByZXNvbHV0aW9uIG9mIDE2eDE2IChvcgorICAgKiAgIDE2eDEpIGdyaWQgbGluZXMgcGVyIHBpeGVsIGZvciBieXRlY29kZSBpbnN0cnVjdGlvbnMgbGlrZSAnTUlSUCcuCiAgICAqICAgQWZ0ZXIgaGludGluZywgdGhlc2UgMTYgZ3JpZCBsaW5lcyBhcmUgbWFwcGVkIHRvIDZ4NSAob3IgNngxKSBncmlkCiAgICAqICAgbGluZXMgZm9yIGNvbG9yIGZpbHRlcmluZyBpZiBDb2xvciBDbGVhclR5cGUgaXMgYWN0aXZhdGVkLgogICAgKgotICAgKiAgIE5vdGUgdGhhdCBgR3JheSBDbGVhclR5cGUnIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHYxLjYncwotICAgKiAgIGdyYXlzY2FsZSByZW5kZXJpbmcuICBIb3dldmVyLCB0aGUgR0VUSU5GTyBpbnN0cnVjdGlvbiBoYW5kbGVzIGl0Ci0gICAqICAgZGlmZmVyZW50bHk6IHYxLjYgcmV0dXJucyBiaXR+MTIgKGhpbnRpbmcgZm9yIGdyYXlzY2FsZSksIHdoaWxlIHYyLjEKLSAgICogICByZXR1cm5zIGJpdHN+MTMgKGhpbnRpbmcgZm9yIENsZWFyVHlwZSksIDE4IChzeW1tZXRyaWNhbCBzbW9vdGhpbmcpLAotICAgKiAgIGFuZH4xOSAoR3JheSBDbGVhclR5cGUpLiAgQWxzbywgdGhpcyBtb2RlIHJlc3BlY3RzIGJpdHMgMiBhbmR+MyBmb3IKLSAgICogICB0aGUgdmVyc2lvbn4xIGdhc3AgdGFibGUgZXhjbHVzaXZlbHkgKGxpa2UgQ29sb3IgQ2xlYXJUeXBlKSwgd2hpbGUKLSAgICogICB2MS42IG9ubHkgcmVzcGVjdHMgdGhlIHZhbHVlcyBvZiB2ZXJzaW9ufjAgKGJpdHMgMCBhbmR+MSkuCisgICAqICAgTm90ZSB0aGF0ICdHcmF5IENsZWFyVHlwZScgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdjEuNidzIGdyYXlzY2FsZQorICAgKiAgIHJlbmRlcmluZy4gIEhvd2V2ZXIsIHRoZSBHRVRJTkZPIGluc3RydWN0aW9uIGhhbmRsZXMgaXQgZGlmZmVyZW50bHk6CisgICAqICAgdjEuNiByZXR1cm5zIGJpdH4xMiAoaGludGluZyBmb3IgZ3JheXNjYWxlKSwgd2hpbGUgdjIuMSByZXR1cm5zCisgICAqICAgYml0c34xMyAoaGludGluZyBmb3IgQ2xlYXJUeXBlKSwgMTggKHN5bW1ldHJpY2FsIHNtb290aGluZyksIGFuZH4xOQorICAgKiAgIChHcmF5IENsZWFyVHlwZSkuICBBbHNvLCB0aGlzIG1vZGUgcmVzcGVjdHMgYml0cyAyIGFuZH4zIGZvciB0aGUKKyAgICogICB2ZXJzaW9ufjEgZ2FzcCB0YWJsZSBleGNsdXNpdmVseSAobGlrZSBDb2xvciBDbGVhclR5cGUpLCB3aGlsZSB2MS42CisgICAqICAgb25seSByZXNwZWN0cyB0aGUgdmFsdWVzIG9mIHZlcnNpb25+MCAoYml0cyAwIGFuZH4xKS4KICAgICoKLSAgICogICBLZWVwIGluIG1pbmQgdGhhdCB0aGUgZmVhdHVyZXMgb2YgdGhlIGFib3ZlIGludGVycHJldGVyIHZlcnNpb25zCi0gICAqICAgbWlnaHQgbm90IG1hcCBleGFjdGx5IHRvIEZyZWVUeXBlIGZlYXR1cmVzIG9yIGJlaGF2aW9yIGJlY2F1c2UgaXQgaXMKLSAgICogICBhIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IGxpYnJhcnkgd2l0aCBkaWZmZXJlbnQgaW50ZXJuYWxzLgorICAgKiAgIEtlZXAgaW4gbWluZCB0aGF0IHRoZSBmZWF0dXJlcyBvZiB0aGUgYWJvdmUgaW50ZXJwcmV0ZXIgdmVyc2lvbnMgbWlnaHQKKyAgICogICBub3QgbWFwIGV4YWN0bHkgdG8gRnJlZVR5cGUgZmVhdHVyZXMgb3IgYmVoYXZpb3IgYmVjYXVzZSBpdCBpcyBhCisgICAqICAgZnVuZGFtZW50YWxseSBkaWZmZXJlbnQgbGlicmFyeSB3aXRoIGRpZmZlcmVudCBpbnRlcm5hbHMuCiAgICAqCiAgICAqLwogI2RlZmluZSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1ICAzNQpAQCAtNzU1LDMzICs3NTEsNDAgQEAKICAgICogICBpbnRlcnByZXRlci12ZXJzaW9uCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDdXJyZW50bHksIHRocmVlIHZlcnNpb25zIGFyZSBhdmFpbGFibGUsIHR3byByZXByZXNlbnRpbmcgdGhlCi0gICAqICAgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgd2l0aCBzdWJwaXhlbCBoaW50aW5nIHN1cHBvcnQgKG9sZCBgSW5maW5hbGl0eScKLSAgICogICBjb2RlIGFuZCBuZXcgc3RyaXBwZWQtZG93biBhbmQgaGlnaGVyIHBlcmZvcm1hbmNlIGBtaW5pbWFsJyBjb2RlKSBhbmQKLSAgICogICBvbmUgd2l0aG91dCwgcmVzcGVjdGl2ZWx5LiAgVGhlIGRlZmF1bHQgaXMgc3VicGl4ZWwgc3VwcG9ydCBpZgotICAgKiAgIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyBpcyBkZWZpbmVkLCBhbmQgbm8gc3VicGl4ZWwgc3VwcG9ydAotICAgKiAgIG90aGVyd2lzZSAoc2luY2UgaXQgaXNuJ3QgYXZhaWxhYmxlIHRoZW4pLgorICAgKiAgIEN1cnJlbnRseSwgdGhyZWUgdmVyc2lvbnMgYXJlIGF2YWlsYWJsZSwgdHdvIHJlcHJlc2VudGluZyB0aGUgYnl0ZWNvZGUKKyAgICogICBpbnRlcnByZXRlciB3aXRoIHN1YnBpeGVsIGhpbnRpbmcgc3VwcG9ydCAob2xkICdJbmZpbmFsaXR5JyBjb2RlIGFuZAorICAgKiAgIG5ldyBzdHJpcHBlZC1kb3duIGFuZCBoaWdoZXIgcGVyZm9ybWFuY2UgJ21pbmltYWwnIGNvZGUpIGFuZCBvbmUKKyAgICogICB3aXRob3V0LCByZXNwZWN0aXZlbHkuICBUaGUgZGVmYXVsdCBpcyBzdWJwaXhlbCBzdXBwb3J0IGlmCisgICAqICAgYFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElOR2AgaXMgZGVmaW5lZCwgYW5kIG5vIHN1YnBpeGVsCisgICAqICAgc3VwcG9ydCBvdGhlcndpc2UgKHNpbmNlIGl0IGlzbid0IGF2YWlsYWJsZSB0aGVuKS4KICAgICoKICAgICogICBJZiBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLCBtYW55IFRydWVUeXBlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBiZWhhdmUKLSAgICogICBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBCL1cgb3IgZ3JheXNjYWxlIHJlbmRlcmluZyAoZXhjZXB0IGlmIGBuYXRpdmUKKyAgICogICBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBCL1cgb3IgZ3JheXNjYWxlIHJlbmRlcmluZyAoZXhjZXB0IGlmICduYXRpdmUKICAgICogICBDbGVhclR5cGUnIGlzIHNlbGVjdGVkIGJ5IHRoZSBmb250KS4gIE1pY3Jvc29mdCdzIG1haW4gaWRlYSBpcyB0bwogICAgKiAgIHJlbmRlciBhdCBhIG11Y2ggaW5jcmVhc2VkIGhvcml6b250YWwgcmVzb2x1dGlvbiwgdGhlbiBzYW1wbGluZyBkb3duCiAgICAqICAgdGhlIGNyZWF0ZWQgb3V0cHV0IHRvIHN1YnBpeGVsIHByZWNpc2lvbi4gIEhvd2V2ZXIsIG1hbnkgb2xkZXIgZm9udHMKLSAgICogICBhcmUgbm90IHN1aXRlZCB0byB0aGlzIGFuZCBtdXN0IGJlIHNwZWNpYWxseSB0YWtlbiBjYXJlIG9mIGJ5Ci0gICAqICAgYXBwbHlpbmcgKGhhcmRjb2RlZCkgdHdlYWtzIGluIE1pY3Jvc29mdCdzIGludGVycHJldGVyLgorICAgKiAgIGFyZSBub3Qgc3VpdGVkIHRvIHRoaXMgYW5kIG11c3QgYmUgc3BlY2lhbGx5IHRha2VuIGNhcmUgb2YgYnkgYXBwbHlpbmcKKyAgICogICAoaGFyZGNvZGVkKSB0d2Vha3MgaW4gTWljcm9zb2Z0J3MgaW50ZXJwcmV0ZXIuCiAgICAqCiAgICAqICAgRGV0YWlscyBvbiBzdWJwaXhlbCBoaW50aW5nIGFuZCBzb21lIG9mIHRoZSBuZWNlc3NhcnkgdHdlYWtzIGNhbiBiZQogICAgKiAgIGZvdW5kIGluIEdyZWcgSGl0Y2hjb2NrJ3Mgd2hpdGVwYXBlciBhdAotICAgKiAgIGBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHgnLgotICAgKiAgIE5vdGUgdGhhdCBGcmVlVHlwZSBjdXJyZW50bHkgZG9lc24ndCByZWFsbHkgYHN1YnBpeGVsIGhpbnQnICg2eDEsIDZ4MiwKKyAgICogICAnaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4Jy4KKyAgICogICBOb3RlIHRoYXQgRnJlZVR5cGUgY3VycmVudGx5IGRvZXNuJ3QgcmVhbGx5ICdzdWJwaXhlbCBoaW50JyAoNngxLCA2eDIsCiAgICAqICAgb3IgNng1IHN1cGVyc2FtcGxpbmcpIGxpa2UgZGlzY3Vzc2VkIGluIHRoZSBwYXBlci4gIERlcGVuZGluZyBvbiB0aGUKICAgICogICBjaG9zZW4gaW50ZXJwcmV0ZXIsIGl0IHNpbXBseSBpZ25vcmVzIGluc3RydWN0aW9ucyBvbiB2ZXJ0aWNhbCBzdGVtcwogICAgKiAgIHRvIGFycml2ZSBhdCB2ZXJ5IHNpbWlsYXIgcmVzdWx0cy4KICAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgdmlhIHRoZSBgRlJFRVRZUEVfUFJPUEVSVElFU2AgZW52aXJvbm1lbnQKKyAgICogICB2YXJpYWJsZSAodXNpbmcgdmFsdWVzICczNScsICczOCcsIG9yICc0MCcpLgorICAgKgorICAgKiBAZXhhbXBsZToKICAgICogICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY29kZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGRlYWN0aXZhdGUgc3VicGl4ZWwKICAgICogICBoaW50aW5nIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgogICAgKgotICAgKiAgIHsKKyAgICogICBgYGAKICAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CiAgICAqICAgICBGVF9GYWNlICAgICBmYWNlOwogICAgKiAgICAgRlRfVUludCAgICAgaW50ZXJwcmV0ZXJfdmVyc2lvbiA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzU7CkBAIC03OTIsMTMgKzc5NSw3IEBACiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJ0cnVldHlwZSIsCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcnByZXRlci12ZXJzaW9uIiwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVycHJldGVyX3ZlcnNpb24gKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50Ci0gICAqICAgdmFyaWFibGUgKHVzaW5nIHZhbHVlcyBgMzUnLCBgMzgnLCBvciBgNDAnKS4KKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuNQpAQCAtODExLDcgKzgwOCw3IEBACiAgICAqICAgZ2x5cGgtdG8tc2NyaXB0LW1hcAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqICAgKipFeHBlcmltZW50YWwgb25seSoqCiAgICAqCiAgICAqICAgVGhlIGF1dG8taGludGVyIHByb3ZpZGVzIHZhcmlvdXMgc2NyaXB0IG1vZHVsZXMgdG8gaGludCBnbHlwaHMuCiAgICAqICAgRXhhbXBsZXMgb2Ygc3VwcG9ydGVkIHNjcmlwdHMgYXJlIExhdGluIG9yIENKSy4gIEJlZm9yZSBhIGdseXBoIGlzCkBAIC04MTksMjUgKzgxNiwyNiBAQAogICAgKiAgIHRoZSBzY3JpcHQgaXMgdGhlbiBkZXRlcm1pbmVkIGJhc2VkIG9uIFVuaWNvZGUgY2hhcmFjdGVyIHJhbmdlcywgc2VlCiAgICAqICAgYmVsb3cuCiAgICAqCi0gICAqICAgT3BlblR5cGUgZm9udHMsIGhvd2V2ZXIsIG9mdGVuIHByb3ZpZGUgbXVjaCBtb3JlIGdseXBocyB0aGFuCi0gICAqICAgY2hhcmFjdGVyIGNvZGVzIChzbWFsbCBjYXBzLCBzdXBlcnNjcmlwdHMsIGxpZ2F0dXJlcywgc3dhc2hlcywgZXRjLiksCi0gICAqICAgdG8gYmUgY29udHJvbGxlZCBieSBzby1jYWxsZWQgYGZlYXR1cmVzJy4gIEhhbmRsaW5nIE9wZW5UeXBlIGZlYXR1cmVzCi0gICAqICAgY2FuIGJlIHF1aXRlIGNvbXBsaWNhdGVkIGFuZCB0aHVzIG5lZWRzIGEgc2VwYXJhdGUgbGlicmFyeSBvbiB0b3Agb2YKKyAgICogICBPcGVuVHlwZSBmb250cywgaG93ZXZlciwgb2Z0ZW4gcHJvdmlkZSBtdWNoIG1vcmUgZ2x5cGhzIHRoYW4gY2hhcmFjdGVyCisgICAqICAgY29kZXMgKHNtYWxsIGNhcHMsIHN1cGVyc2NyaXB0cywgbGlnYXR1cmVzLCBzd2FzaGVzLCBldGMuKSwgdG8gYmUKKyAgICogICBjb250cm9sbGVkIGJ5IHNvLWNhbGxlZCAnZmVhdHVyZXMnLiAgSGFuZGxpbmcgT3BlblR5cGUgZmVhdHVyZXMgY2FuIGJlCisgICAqICAgcXVpdGUgY29tcGxpY2F0ZWQgYW5kIHRodXMgbmVlZHMgYSBzZXBhcmF0ZSBsaWJyYXJ5IG9uIHRvcCBvZgogICAgKiAgIEZyZWVUeXBlLgogICAgKgogICAgKiAgIFRoZSBtYXBwaW5nIGJldHdlZW4gZ2x5cGggaW5kaWNlcyBhbmQgc2NyaXB0cyAoaW4gdGhlIGF1dG8taGludGVyCi0gICAqICAgc2Vuc2UsIHNlZSB0aGUgQEZUX0FVVE9ISU5URVJfU0NSSVBUX1hYWCB2YWx1ZXMpIGlzIHN0b3JlZCBhcyBhbgotICAgKiAgIGFycmF5IHdpdGggYG51bV9nbHlwaHMnIGVsZW1lbnRzLCBhcyBmb3VuZCBpbiB0aGUgZm9udCdzIEBGVF9GYWNlCi0gICAqICAgc3RydWN0dXJlLiAgVGhlIGBnbHlwaC10by1zY3JpcHQtbWFwJyBwcm9wZXJ0eSByZXR1cm5zIGEgcG9pbnRlciB0bwotICAgKiAgIHRoaXMgYXJyYXksIHdoaWNoIGNhbiBiZSBtb2RpZmllZCBhcyBuZWVkZWQuICBOb3RlIHRoYXQgdGhlCi0gICAqICAgbW9kaWZpY2F0aW9uIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCBnbHlwaCBnZXRzIHByb2Nlc3NlZCBieQotICAgKiAgIHRoZSBhdXRvLWhpbnRlciBzbyB0aGF0IHRoZSBnbG9iYWwgYW5hbHlzaXMgb2YgdGhlIGZvbnQgc2hhcGVzCi0gICAqICAgYWN0dWFsbHkgdXNlcyB0aGUgbW9kaWZpZWQgbWFwcGluZy4KKyAgICogICBzZW5zZSwgc2VlIHRoZSBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfWFhYIHZhbHVlcykgaXMgc3RvcmVkIGFzIGFuIGFycmF5CisgICAqICAgd2l0aCBgbnVtX2dseXBoc2AgZWxlbWVudHMsIGFzIGZvdW5kIGluIHRoZSBmb250J3MgQEZUX0ZhY2Ugc3RydWN0dXJlLgorICAgKiAgIFRoZSBgZ2x5cGgtdG8tc2NyaXB0LW1hcGAgcHJvcGVydHkgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhpcyBhcnJheSwKKyAgICogICB3aGljaCBjYW4gYmUgbW9kaWZpZWQgYXMgbmVlZGVkLiAgTm90ZSB0aGF0IHRoZSBtb2RpZmljYXRpb24gc2hvdWxkCisgICAqICAgaGFwcGVuIGJlZm9yZSB0aGUgZmlyc3QgZ2x5cGggZ2V0cyBwcm9jZXNzZWQgYnkgdGhlIGF1dG8taGludGVyIHNvCisgICAqICAgdGhhdCB0aGUgZ2xvYmFsIGFuYWx5c2lzIG9mIHRoZSBmb250IHNoYXBlcyBhY3R1YWxseSB1c2VzIHRoZSBtb2RpZmllZAorICAgKiAgIG1hcHBpbmcuCiAgICAqCi0gICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBhY2Nlc3MgaXQgKG9taXR0aW5nCi0gICAqICAgdGhlIGVycm9yIGhhbmRsaW5nKS4KKyAgICogQGV4YW1wbGU6CisgICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBhY2Nlc3MgaXQgKG9taXR0aW5nIHRoZQorICAgKiAgIGVycm9yIGhhbmRsaW5nKS4KICAgICoKLSAgICogICB7CisgICAqICAgYGBgCiAgICAqICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnk7CiAgICAqICAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgIGZhY2U7CiAgICAqICAgICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXAgIHByb3A7CkBAIC04NTQsNyArODUyLDcgQEAKICAgICogICAgIC8vIGFkanVzdCBgcHJvcC5tYXAnIGFzIG5lZWRlZCByaWdodCBoZXJlCiAgICAqCiAgICAqICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCAuLi4sIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgKTsKLSAgICogICB9CisgICAqICAgYGBgCiAgICAqCiAgICAqIEBzaW5jZToKICAgICogICAyLjQuMTEKQEAgLTg2OCw3ICs4NjYsNyBAQAogICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX1hYWAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqICAgKipFeHBlcmltZW50YWwgb25seSoqCiAgICAqCiAgICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGdseXBoLXRvLXNjcmlwdC1tYXAgcHJvcGVydHkgdG8KICAgICogICBzcGVjaWZ5IHRoZSBzY3JpcHQgc3VibW9kdWxlIHRoZSBhdXRvLWhpbnRlciBzaG91bGQgdXNlIGZvciBoaW50aW5nIGEKQEAgLTg3OSwxNCArODc3LDE0IEBACiAgICAqICAgICBEb24ndCBhdXRvLWhpbnQgdGhpcyBnbHlwaC4KICAgICoKICAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9MQVRJTiA6OgotICAgKiAgICAgQXBwbHkgdGhlIGxhdGluIGF1dG8taGludGVyLiAgRm9yIHRoZSBhdXRvLWhpbnRlciwgYGxhdGluJyBpcyBhCi0gICAqICAgICB2ZXJ5IGJyb2FkIHRlcm0sIGluY2x1ZGluZyBDeXJpbGxpYyBhbmQgR3JlZWsgYWxzbyBzaW5jZSBjaGFyYWN0ZXJzCi0gICAqICAgICBmcm9tIHRob3NlIHNjcmlwdHMgc2hhcmUgdGhlIHNhbWUgZGVzaWduIGNvbnN0cmFpbnRzLgorICAgKiAgICAgQXBwbHkgdGhlIGxhdGluIGF1dG8taGludGVyLiAgRm9yIHRoZSBhdXRvLWhpbnRlciwgJ2xhdGluJyBpcyBhIHZlcnkKKyAgICogICAgIGJyb2FkIHRlcm0sIGluY2x1ZGluZyBDeXJpbGxpYyBhbmQgR3JlZWsgYWxzbyBzaW5jZSBjaGFyYWN0ZXJzIGZyb20KKyAgICogICAgIHRob3NlIHNjcmlwdHMgc2hhcmUgdGhlIHNhbWUgZGVzaWduIGNvbnN0cmFpbnRzLgogICAgKgogICAgKiAgICAgQnkgZGVmYXVsdCwgY2hhcmFjdGVycyBmcm9tIHRoZSBmb2xsb3dpbmcgVW5pY29kZSByYW5nZXMgYXJlCiAgICAqICAgICBhc3NpZ25lZCB0byB0aGlzIHN1Ym1vZHVsZS4KICAgICoKLSAgICogICAgIHsKKyAgICogICAgIGBgYAogICAgKiAgICAgICBVKzAwMjAgLSBVKzAwN0YgIC8vIEJhc2ljIExhdGluIChubyBjb250cm9sIGNoYXJhY3RlcnMpCiAgICAqICAgICAgIFUrMDBBMCAtIFUrMDBGRiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IChubyBjb250cm9sIGNoYXJhY3RlcnMpCiAgICAqICAgICAgIFUrMDEwMCAtIFUrMDE3RiAgLy8gTGF0aW4gRXh0ZW5kZWQtQQpAQCAtOTE1LDcgKzkxMyw3IEBACiAgICAqICAgICAgIFUrRkIwMCAtIFUrRkIwNiAgLy8gQWxwaGFiLiBQcmVzZW50LiBGb3JtcyAoTGF0aW4gTGlnYXR1cmVzKQogICAgKiAgICAgIFUrMUQ0MDAgLSBVKzFEN0ZGIC8vIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scwogICAgKiAgICAgIFUrMUYxMDAgLSBVKzFGMUZGIC8vIEVuY2xvc2VkIEFscGhhbnVtZXJpYyBTdXBwbGVtZW50Ci0gICAqICAgICB9CisgICAqICAgICBgYGAKICAgICoKICAgICogICBGVF9BVVRPSElOVEVSX1NDUklQVF9DSksgOjoKICAgICogICAgIEFwcGx5IHRoZSBDSksgYXV0by1oaW50ZXIsIGNvdmVyaW5nIENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4sIG9sZApAQCAtOTI0LDcgKzkyMiw3IEBACiAgICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKICAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgogICAgKgotICAgKiAgICAgeworICAgKiAgICAgYGBgCiAgICAqICAgICAgIFUrMTEwMCAtIFUrMTFGRiAgLy8gSGFuZ3VsIEphbW8KICAgICogICAgICAgVSsyRTgwIC0gVSsyRUZGICAvLyBDSksgUmFkaWNhbHMgU3VwcGxlbWVudAogICAgKiAgICAgICBVKzJGMDAgLSBVKzJGREYgIC8vIEthbmd4aSBSYWRpY2FscwpAQCAtOTU3LDcgKzk1NSw3IEBACiAgICAqICAgICAgVSsyQTcwMCAtIFUrMkI3M0YgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQwogICAgKiAgICAgIFUrMkI3NDAgLSBVKzJCODFGIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEQKICAgICogICAgICBVKzJGODAwIC0gVSsyRkExRiAvLyBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQKLSAgICogICAgIH0KKyAgICogICAgIGBgYAogICAgKgogICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX0lORElDIDo6CiAgICAqICAgICBBcHBseSB0aGUgaW5kaWMgYXV0by1oaW50ZXIsIGNvdmVyaW5nIGFsbCBtYWpvciBzY3JpcHRzIGZyb20gdGhlCkBAIC05NjcsNyArOTY1LDcgQEAKICAgICogICAgIEJ5IGRlZmF1bHQsIGNoYXJhY3RlcnMgZnJvbSB0aGUgZm9sbG93aW5nIFVuaWNvZGUgcmFuZ2VzIGFyZQogICAgKiAgICAgYXNzaWduZWQgdG8gdGhpcyBzdWJtb2R1bGUuCiAgICAqCi0gICAqICAgICB7CisgICAqICAgICBgYGAKICAgICogICAgICAgVSswOTAwIC0gVSswREZGICAvLyBJbmRpYyBSYW5nZQogICAgKiAgICAgICBVKzBGMDAgLSBVKzBGRkYgIC8vIFRpYmV0YW4KICAgICogICAgICAgVSsxOTAwIC0gVSsxOTRGICAvLyBMaW1idQpAQCAtOTc1LDcgKzk3Myw3IEBACiAgICAqICAgICAgIFUrQTgwMCAtIFUrQTgyRiAgLy8gU3lsb3RpIE5hZ3JpCiAgICAqICAgICAgIFUrQUJDMCAtIFUrQUJGRiAgLy8gTWVldGVpIE1heWVrCiAgICAqICAgICAgVSsxMTgwMCAtIFUrMTE4REYgLy8gU2hhcmFkYQotICAgKiAgICAgfQorICAgKiAgICAgYGBgCiAgICAqCiAgICAqICAgICBOb3RlIHRoYXQgY3VycmVudGx5IEluZGljIHN1cHBvcnQgaXMgcnVkaW1lbnRhcnkgb25seSwgbWlzc2luZyBibHVlCiAgICAqICAgICB6b25lIHN1cHBvcnQuCkBAIC05OTYsNyArOTk0LDcgQEAKICAgICogICBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXAKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICpFeHBlcmltZW50YWwqICpvbmx5KgorICAgKiAgICoqRXhwZXJpbWVudGFsIG9ubHkqKgogICAgKgogICAgKiAgIFRoZSBkYXRhIGV4Y2hhbmdlIHN0cnVjdHVyZSBmb3IgdGhlIEBnbHlwaC10by1zY3JpcHQtbWFwIHByb3BlcnR5LgogICAgKgpAQCAtMTAxOCwxNSArMTAxNiwyNiBAQAogICAgKiAgIGZhbGxiYWNrLXNjcmlwdAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqICAgKipFeHBlcmltZW50YWwgb25seSoqCiAgICAqCi0gICAqICAgSWYgbm8gYXV0by1oaW50ZXIgc2NyaXB0IG1vZHVsZSBjYW4gYmUgYXNzaWduZWQgdG8gYSBnbHlwaCwgYQotICAgKiAgIGZhbGxiYWNrIHNjcmlwdCBnZXRzIGFzc2lnbmVkIHRvIGl0IChzZWUgYWxzbyB0aGUKLSAgICogICBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eSkuICBCeSBkZWZhdWx0LCB0aGlzIGlzCi0gICAqICAgQEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSy4gIFVzaW5nIHRoZSBgZmFsbGJhY2stc2NyaXB0JyBwcm9wZXJ0eSwKLSAgICogICB0aGlzIGZhbGxiYWNrIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgorICAgKiAgIElmIG5vIGF1dG8taGludGVyIHNjcmlwdCBtb2R1bGUgY2FuIGJlIGFzc2lnbmVkIHRvIGEgZ2x5cGgsIGEgZmFsbGJhY2sKKyAgICogICBzY3JpcHQgZ2V0cyBhc3NpZ25lZCB0byBpdCAoc2VlIGFsc28gdGhlIEBnbHlwaC10by1zY3JpcHQtbWFwCisgICAqICAgcHJvcGVydHkpLiAgQnkgZGVmYXVsdCwgdGhpcyBpcyBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLLiAgVXNpbmcgdGhlCisgICAqICAgYGZhbGxiYWNrLXNjcmlwdGAgcHJvcGVydHksIHRoaXMgZmFsbGJhY2sgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCiAgICAqCi0gICAqICAgeworICAgKiBAbm90ZToKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgorICAgKgorICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKKyAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUgZmFsbGJhY2sKKyAgICogICBzY3JpcHQgdmFsdWUgZ2V0cyB0cmlnZ2VyZWQgZWl0aGVyIGJ5IHNldHRpbmcgb3IgcmVhZGluZyBhCisgICAqICAgZmFjZS1zcGVjaWZpYyBwcm9wZXJ0eSBsaWtlIEBnbHlwaC10by1zY3JpcHQtbWFwLCBvciBieSBhdXRvLWhpbnRpbmcKKyAgICogICBhbnkgZ2x5cGggZnJvbSB0aGF0IGZhY2UuICBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQKKyAgICogICBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgYnV0IG5vdCBsb2FkZWQgYW55IGdseXBoICh1c2luZyB0aGUKKyAgICogICBhdXRvLWhpbnRlciksIGEgY2hhbmdlIG9mIHRoZSBmYWxsYmFjayBzY3JpcHQgd2lsbCBhZmZlY3QgdGhpcyBmYWNlLgorICAgKgorICAgKiBAZXhhbXBsZToKKyAgICogICBgYGAKICAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7CiAgICAqICAgICBGVF9VSW50ICAgICBmYWxsYmFja19zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOwogICAgKgpAQCAtMTAzNSwxOCArMTA0NCw3IEBACiAgICAqCiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhbGxiYWNrLXNjcmlwdCIsICZmYWxsYmFja19zY3JpcHQgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgSXQncyBpbXBvcnRhbnQgdG8gdXNlIHRoZSByaWdodCB0aW1pbmcgZm9yIGNoYW5naW5nIHRoaXMgdmFsdWU6IFRoZQotICAgKiAgIGNyZWF0aW9uIG9mIHRoZSBnbHlwaC10by1zY3JpcHQgbWFwIHRoYXQgZXZlbnR1YWxseSB1c2VzIHRoZQotICAgKiAgIGZhbGxiYWNrIHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKLSAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZwotICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAotICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQotICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGZhbGxiYWNrIHNjcmlwdCB3aWxsIGFmZmVjdCB0aGlzIGZhY2UuCisgICAqICAgYGBgCiAgICAqCiAgICAqIEBzaW5jZToKICAgICogICAyLjQuMTEKQEAgLTEwNjAsMjEgKzEwNTgsMzMgQEAKICAgICogICBkZWZhdWx0LXNjcmlwdAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqICAgKipFeHBlcmltZW50YWwgb25seSoqCiAgICAqCi0gICAqICAgSWYgRnJlZVR5cGUgZ2V0cyBjb21waWxlZCB3aXRoIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaIHRvIG1ha2UKLSAgICogICB0aGUgSGFyZkJ1enogbGlicmFyeSBhY2Nlc3MgT3BlblR5cGUgZmVhdHVyZXMgZm9yIGdldHRpbmcgYmV0dGVyCi0gICAqICAgZ2x5cGggY292ZXJhZ2VzLCB0aGlzIHByb3BlcnR5IHNldHMgdGhlIChhdXRvLWZpdHRlcikgc2NyaXB0IHRvIGJlCi0gICAqICAgdXNlZCBmb3IgdGhlIGRlZmF1bHQgKE9wZW5UeXBlKSBzY3JpcHQgZGF0YSBvZiBhIGZvbnQncyBHU1VCIHRhYmxlLgotICAgKiAgIEZlYXR1cmVzIGZvciB0aGUgZGVmYXVsdCBzY3JpcHQgYXJlIGludGVuZGVkIGZvciBhbGwgc2NyaXB0cyBub3QKLSAgICogICBleHBsaWNpdGx5IGhhbmRsZWQgaW4gR1NVQjsgYW4gZXhhbXBsZSBpcyBhIGBkbGlnJyBmZWF0dXJlLAotICAgKiAgIGNvbnRhaW5pbmcgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBjaGFyYWN0ZXJzIGBUJywgYEUnLCBhbmQgYEwnIHRvCi0gICAqICAgZm9ybSBhIGBURUwnIGxpZ2F0dXJlLgorICAgKiAgIElmIEZyZWVUeXBlIGdldHMgY29tcGlsZWQgd2l0aCBgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlpgIHRvIG1ha2UKKyAgICogICB0aGUgSGFyZkJ1enogbGlicmFyeSBhY2Nlc3MgT3BlblR5cGUgZmVhdHVyZXMgZm9yIGdldHRpbmcgYmV0dGVyIGdseXBoCisgICAqICAgY292ZXJhZ2VzLCB0aGlzIHByb3BlcnR5IHNldHMgdGhlIChhdXRvLWZpdHRlcikgc2NyaXB0IHRvIGJlIHVzZWQgZm9yCisgICAqICAgdGhlIGRlZmF1bHQgKE9wZW5UeXBlKSBzY3JpcHQgZGF0YSBvZiBhIGZvbnQncyBHU1VCIHRhYmxlLiAgRmVhdHVyZXMKKyAgICogICBmb3IgdGhlIGRlZmF1bHQgc2NyaXB0IGFyZSBpbnRlbmRlZCBmb3IgYWxsIHNjcmlwdHMgbm90IGV4cGxpY2l0bHkKKyAgICogICBoYW5kbGVkIGluIEdTVUI7IGFuIGV4YW1wbGUgaXMgYSAnZGxpZycgZmVhdHVyZSwgY29udGFpbmluZyB0aGUKKyAgICogICBjb21iaW5hdGlvbiBvZiB0aGUgY2hhcmFjdGVycyAnVCcsICdFJywgYW5kICdMJyB0byBmb3JtIGEgJ1RFTCcKKyAgICogICBsaWdhdHVyZS4KICAgICoKICAgICogICBCeSBkZWZhdWx0LCB0aGlzIGlzIEBGVF9BVVRPSElOVEVSX1NDUklQVF9MQVRJTi4gIFVzaW5nIHRoZQotICAgKiAgIGBkZWZhdWx0LXNjcmlwdCcgcHJvcGVydHksIHRoaXMgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgY2hhbmdlZC4KKyAgICogICBgZGVmYXVsdC1zY3JpcHRgIHByb3BlcnR5LCB0aGlzIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCiAgICAqCi0gICAqICAgeworICAgKiBAbm90ZToKKyAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgorICAgKgorICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKKyAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUgZGVmYXVsdAorICAgKiAgIHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKKyAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZworICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAorICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQorICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KKyAgICoKKyAgICogQGV4YW1wbGU6CisgICAqICAgYGBgCiAgICAqICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwogICAgKiAgICAgRlRfVUludCAgICAgZGVmYXVsdF9zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOwogICAgKgpAQCAtMTA4MywxOCArMTA5Myw3IEBACiAgICAqCiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQtc2NyaXB0IiwgJmRlZmF1bHRfc2NyaXB0ICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKLSAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUKLSAgICogICBkZWZhdWx0IHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKLSAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZwotICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAotICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQotICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuNS4zCkBAIC0xMTA4LDEzICsxMTA3LDIwIEBACiAgICAqICAgaW5jcmVhc2UteC1oZWlnaHQKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEZvciBwcGVtIHZhbHVlcyBpbiB0aGUgcmFuZ2UgNn48PSBwcGVtIDw9IGBpbmNyZWFzZS14LWhlaWdodCcsIHJvdW5kCi0gICAqICAgdXAgdGhlIGZvbnQncyB4fmhlaWdodCBtdWNoIG1vcmUgb2Z0ZW4gdGhhbiBub3JtYWxseS4gIElmIHRoZSB2YWx1ZQotICAgKiAgIGlzIHNldCB0b34wLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgdGhpcyBmZWF0dXJlIGlzIHN3aXRjaGVkIG9mZi4gIFVzZQorICAgKiAgIEZvciBwcGVtIHZhbHVlcyBpbiB0aGUgcmFuZ2UgNn48PSBwcGVtIDw9IGBpbmNyZWFzZS14LWhlaWdodGAsIHJvdW5kCisgICAqICAgdXAgdGhlIGZvbnQncyB4fmhlaWdodCBtdWNoIG1vcmUgb2Z0ZW4gdGhhbiBub3JtYWxseS4gIElmIHRoZSB2YWx1ZSBpcworICAgKiAgIHNldCB0b34wLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgdGhpcyBmZWF0dXJlIGlzIHN3aXRjaGVkIG9mZi4gIFVzZQogICAgKiAgIHRoaXMgcHJvcGVydHkgdG8gaW1wcm92ZSB0aGUgbGVnaWJpbGl0eSBvZiBzbWFsbCBmb250IHNpemVzIGlmCiAgICAqICAgbmVjZXNzYXJ5LgogICAgKgotICAgKiAgIHsKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KKyAgICoKKyAgICogICBTZXQgdGhpcyB2YWx1ZSByaWdodCBhZnRlciBjYWxsaW5nIEBGVF9TZXRfQ2hhcl9TaXplLCBidXQgYmVmb3JlCisgICAqICAgbG9hZGluZyBhbnkgZ2x5cGggKHVzaW5nIHRoZSBhdXRvLWhpbnRlcikuCisgICAqCisgICAqIEBleGFtcGxlOgorICAgKiAgIGBgYAogICAgKiAgICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgIGxpYnJhcnk7CiAgICAqICAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgZmFjZTsKICAgICogICAgIEZUX1Byb3BfSW5jcmVhc2VYSGVpZ2h0ICBwcm9wOwpAQCAtMTEyOSwxMyArMTEzNSw3IEBACiAgICAqCiAgICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY3JlYXNlLXgtaGVpZ2h0IiwgJnByb3AgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgU2V0IHRoaXMgdmFsdWUgcmlnaHQgYWZ0ZXIgY2FsbGluZyBARlRfU2V0X0NoYXJfU2l6ZSwgYnV0IGJlZm9yZQotICAgKiAgIGxvYWRpbmcgYW55IGdseXBoICh1c2luZyB0aGUgYXV0by1oaW50ZXIpLgorICAgKiAgIGBgYAogICAgKgogICAgKiBAc2luY2U6CiAgICAqICAgMi40LjExCkBAIC0xMTY2LDQ2ICsxMTY2LDQ4IEBACiAgICAqICAgd2FycGluZwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCisgICAqICAgKipFeHBlcmltZW50YWwgb25seSoqCiAgICAqCi0gICAqICAgSWYgRnJlZVR5cGUgZ2V0cyBjb21waWxlZCB3aXRoIG9wdGlvbiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgdG8KKyAgICogICBJZiBGcmVlVHlwZSBnZXRzIGNvbXBpbGVkIHdpdGggb3B0aW9uIGBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVJgIHRvCiAgICAqICAgYWN0aXZhdGUgdGhlIHdhcnAgaGludGluZyBjb2RlIGluIHRoZSBhdXRvLWhpbnRlciwgdGhpcyBwcm9wZXJ0eQogICAgKiAgIHN3aXRjaGVzIHdhcnBpbmcgb24gYW5kIG9mZi4KICAgICoKLSAgICogICBXYXJwaW5nIG9ubHkgd29ya3MgaW4gYG5vcm1hbCcgYXV0by1oaW50aW5nIG1vZGUgcmVwbGFjaW5nIGl0LgotICAgKiAgIFRoZSBpZGVhIG9mIHRoZSBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoIGFsb25nCi0gICAqICAgdGhlIG5vbi1oaW50ZWQgZGltZW5zaW9uICh3aGljaCBpcyB1c3VhbGx5IHRoZSBob3Jpem9udGFsIGF4aXMpIHNvCi0gICAqICAgdGhhdCBhcyBtdWNoIG9mIGl0cyBzZWdtZW50cyBhcmUgYWxpZ25lZCAobW9yZSBvciBsZXNzKSB0byB0aGUgZ3JpZC4KLSAgICogICBUbyBmaW5kIG91dCBhIGdseXBoJ3Mgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cwotICAgKiAgIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuCisgICAqICAgV2FycGluZyBvbmx5IHdvcmtzIGluICdub3JtYWwnIGF1dG8taGludGluZyBtb2RlIHJlcGxhY2luZyBpdC4gIFRoZQorICAgKiAgIGlkZWEgb2YgdGhlIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggYWxvbmcgdGhlCisgICAqICAgbm9uLWhpbnRlZCBkaW1lbnNpb24gKHdoaWNoIGlzIHVzdWFsbHkgdGhlIGhvcml6b250YWwgYXhpcykgc28gdGhhdCBhcworICAgKiAgIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIHRvIHRoZSBncmlkLiAgVG8gZmluZAorICAgKiAgIG91dCBhIGdseXBoJ3Mgb3B0aW1hbCBzY2FsaW5nIGFuZCBzaGlmdGluZyB2YWx1ZSwgdmFyaW91cyBwYXJhbWV0ZXIKKyAgICogICBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuCiAgICAqCi0gICAqICAgQnkgZGVmYXVsdCwgd2FycGluZyBpcyBvZmYuICBUaGUgZXhhbXBsZSBiZWxvdyBzaG93cyBob3cgdG8gc3dpdGNoIG9uCi0gICAqICAgd2FycGluZyAob21pdHRpbmcgdGhlIGVycm9yIGhhbmRsaW5nKS4KKyAgICogICBCeSBkZWZhdWx0LCB3YXJwaW5nIGlzIG9mZi4KICAgICoKLSAgICogICB7CisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCisgICAqCisgICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVNgIGVudmlyb25tZW50CisgICAqICAgdmFyaWFibGUgKHVzaW5nIHZhbHVlcyAxIGFuZCAwIGZvciAnb24nIGFuZCAnb2ZmJywgcmVzcGVjdGl2ZWx5KS4KKyAgICoKKyAgICogICBUaGUgd2FycGluZyBjb2RlIGNhbiBhbHNvIGNoYW5nZSBhZHZhbmNlIHdpZHRocy4gIEhhdmUgYSBsb29rIGF0IHRoZQorICAgKiAgIGBsc2JfZGVsdGFgIGFuZCBgcnNiX2RlbHRhYCBmaWVsZHMgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlCisgICAqICAgZm9yIGRldGFpbHMgb24gaW1wcm92aW5nIGludGVyLWdseXBoIGRpc3RhbmNlcyB3aGlsZSByZW5kZXJpbmcuCisgICAqCisgICAqICAgU2luY2Ugd2FycGluZyBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBvZiB0aGUgYXV0by1oaW50ZXIgaXQgaXMgYmVzdCB0bworICAgKiAgIGNoYW5nZSBpdHMgdmFsdWUgYmVmb3JlIHJlbmRlcmluZyBhbnkgZmFjZS4gIE90aGVyd2lzZSwgeW91IHNob3VsZAorICAgKiAgIHJlbG9hZCBhbGwgZmFjZXMgdGhhdCBnZXQgYXV0by1oaW50ZWQgaW4gJ25vcm1hbCcgaGludGluZyBtb2RlLgorICAgKgorICAgKiBAZXhhbXBsZToKKyAgICogICBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHN3aXRjaCBvbiB3YXJwaW5nIChvbWl0dGluZyB0aGUgZXJyb3IKKyAgICogICBoYW5kbGluZykuCisgICAqCisgICAqICAgYGBgCiAgICAqICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwogICAgKiAgICAgRlRfQm9vbCAgICAgd2FycGluZyA9IDE7CiAgICAqCiAgICAqCiAgICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwogICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJwaW5nIiwgJndhcnBpbmcgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0IHZpYSB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVMnIGVudmlyb25tZW50Ci0gICAqICAgdmFyaWFibGUgKHVzaW5nIHZhbHVlcyAxIGFuZCAwIGZvciBgb24nIGFuZCBgb2ZmJywgcmVzcGVjdGl2ZWx5KS4KLSAgICoKLSAgICogICBUaGUgd2FycGluZyBjb2RlIGNhbiBhbHNvIGNoYW5nZSBhZHZhbmNlIHdpZHRocy4gIEhhdmUgYSBsb29rIGF0IHRoZQotICAgKiAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyBmaWVsZHMgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlCi0gICAqICAgZm9yIGRldGFpbHMgb24gaW1wcm92aW5nIGludGVyLWdseXBoIGRpc3RhbmNlcyB3aGlsZSByZW5kZXJpbmcuCi0gICAqCi0gICAqICAgU2luY2Ugd2FycGluZyBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBvZiB0aGUgYXV0by1oaW50ZXIgaXQgaXMgYmVzdCB0bwotICAgKiAgIGNoYW5nZSBpdHMgdmFsdWUgYmVmb3JlIHJlbmRlcmluZyBhbnkgZmFjZS4gIE90aGVyd2lzZSwgeW91IHNob3VsZAotICAgKiAgIHJlbG9hZCBhbGwgZmFjZXMgdGhhdCBnZXQgYXV0by1oaW50ZWQgaW4gYG5vcm1hbCcgaGludGluZyBtb2RlLgorICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsICJ3YXJwaW5nIiwgJndhcnBpbmcgKTsKKyAgICogICBgYGAKICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuNgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oCmluZGV4IDhmZmQzNDYuLjg5NWQyZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyZGVmLmgKQEAgLTEsNTggKzEsNTcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyZGVmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0ZXJyZGVmLmgKKyAqCisgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlcnJvcl9jb2RlX3ZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBDb2RlIFZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBbGwgcG9zc2libGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgRnJlZVR5cGUgZnVuY3Rpb25zLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgbGlzdCBiZWxvdyBpcyB0YWtlbiB2ZXJiYXRpbSBmcm9tIHRoZSBmaWxlIGBmdGVycmRlZi5oJyAgICAgICAgICovCi0gIC8qICAgKGxvYWRlZCBhdXRvbWF0aWNhbGx5IGJ5IGluY2x1ZGluZyBgRlRfRlJFRVRZUEVfSCcpLiAgVGhlIGZpcnN0ICAgICAqLwotICAvKiAgIGFyZ3VtZW50IG9mIHRoZSBgRlRfRVJST1JfREVGXycgbWFjcm8gaXMgdGhlIGVycm9yIGxhYmVsOyBieSAgICAgICAgKi8KLSAgLyogICBkZWZhdWx0LCB0aGUgcHJlZml4IGBGVF9FcnJfJyBnZXRzIGFkZGVkIHNvIHRoYXQgeW91IGdldCBlcnJvciAgICAgICovCi0gIC8qICAgbmFtZXMgbGlrZSBgRlRfRXJyX0Nhbm5vdF9PcGVuX1Jlc291cmNlJy4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgICAqLwotICAvKiAgIHRoZSBlcnJvciBjb2RlLCBhbmQgdGhlIGxhc3QgYXJndW1lbnQgYW4gZXJyb3Igc3RyaW5nLCB3aGljaCBpcyBub3QgKi8KLSAgLyogICB1c2VkIGJ5IEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdpdGhpbiB5b3VyIGFwcGxpY2F0aW9uIHlvdSBzaG91bGQgKm9ubHkqIHVzZSBlcnJvciBuYW1lcyBhbmQgICAgICAgKi8KLSAgLyogICAqbmV2ZXIqIGl0cyBudW1lcmljIHZhbHVlcyEgIFRoZSBsYXR0ZXIgbWlnaHQgKGFuZCBhY3R1YWxseSBkbykgICAgICovCi0gIC8qICAgY2hhbmdlIGluIGZvcnRoY29taW5nIEZyZWVUeXBlIHZlcnNpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBNYWNybyBgRlRfTk9FUlJPUkRFRl8nIGRlZmluZXMgYEZUX0Vycl9PaycsIHdoaWNoIGlzIGFsd2F5cyB6ZXJvLiAgICovCi0gIC8qICAgU2VlIHRoZSBgRXJyb3IgRW51bWVyYXRpb25zJyBzdWJzZWN0aW9uIGhvdyB0byBhdXRvbWF0aWNhbGx5ICAgICAgICAqLwotICAvKiAgIGdlbmVyYXRlIGEgbGlzdCBvZiBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICBlcnJvcl9jb2RlX3ZhbHVlcworICAgKgorICAgKiBAdGl0bGU6CisgICAqICBFcnJvciBDb2RlIFZhbHVlcworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICBBbGwgcG9zc2libGUgZXJyb3IgY29kZXMgcmV0dXJuZWQgYnkgRnJlZVR5cGUgZnVuY3Rpb25zLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICBUaGUgbGlzdCBiZWxvdyBpcyB0YWtlbiB2ZXJiYXRpbSBmcm9tIHRoZSBmaWxlIGBmdGVycmRlZi5oYCAobG9hZGVkCisgICAqICBhdXRvbWF0aWNhbGx5IGJ5IGluY2x1ZGluZyBgRlRfRlJFRVRZUEVfSGApLiAgVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZQorICAgKiAgYEZUX0VSUk9SX0RFRl9gIG1hY3JvIGlzIHRoZSBlcnJvciBsYWJlbDsgYnkgZGVmYXVsdCwgdGhlIHByZWZpeAorICAgKiAgYEZUX0Vycl9gIGdldHMgYWRkZWQgc28gdGhhdCB5b3UgZ2V0IGVycm9yIG5hbWVzIGxpa2UKKyAgICogIGBGVF9FcnJfQ2Fubm90X09wZW5fUmVzb3VyY2VgLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgZXJyb3IgY29kZSwKKyAgICogIGFuZCB0aGUgbGFzdCBhcmd1bWVudCBhbiBlcnJvciBzdHJpbmcsIHdoaWNoIGlzIG5vdCB1c2VkIGJ5IEZyZWVUeXBlLgorICAgKgorICAgKiAgV2l0aGluIHlvdXIgYXBwbGljYXRpb24geW91IHNob3VsZCAqKm9ubHkqKiB1c2UgZXJyb3IgbmFtZXMgYW5kCisgICAqICAqKm5ldmVyKiogaXRzIG51bWVyaWMgdmFsdWVzISAgVGhlIGxhdHRlciBtaWdodCAoYW5kIGFjdHVhbGx5IGRvKQorICAgKiAgY2hhbmdlIGluIGZvcnRoY29taW5nIEZyZWVUeXBlIHZlcnNpb25zLgorICAgKgorICAgKiAgTWFjcm8gYEZUX05PRVJST1JERUZfYCBkZWZpbmVzIGBGVF9FcnJfT2tgLCB3aGljaCBpcyBhbHdheXMgemVyby4gIFNlZQorICAgKiAgdGhlICdFcnJvciBFbnVtZXJhdGlvbnMnIHN1YnNlY3Rpb24gaG93IHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYQorICAgKiAgbGlzdCBvZiBlcnJvciBzdHJpbmdzLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycl9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9FcnJfWFhYCisgICAqCisgICAqLwogCiAgIC8qIGdlbmVyaWMgZXJyb3JzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaAppbmRleCBmNmVlNWMyLi42MGE2MzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oCkBAIC0xLDExMCArMSwxMjAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0ZXJyb3JzLmgKKyAqCisgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUgaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVycm9yX2VudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIEVudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhvdyB0byBoYW5kbGUgZXJyb3JzIGFuZCBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBoZWFkZXIgZmlsZSBgZnRlcnJvcnMuaCcgKHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgICAgKi8KLSAgLyogICBgZnJlZXR5cGUuaCcgZGVmaW5lcyB0aGUgaGFuZGxpbmcgb2YgRnJlZVR5cGUncyBlbnVtZXJhdGlvbiAgICAgICAgICovCi0gIC8qICAgY29uc3RhbnRzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlIHN0cmluZ3MgICAqLwotICAvKiAgIHdpdGggYSBzbWFsbCBtYWNybyB0cmljayBleHBsYWluZWQgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgKkVycm9yKiAqRm9ybWF0cyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGNhbiBiZSAgICovCi0gIC8qICAgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgICAqLwotICAvKiAgIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGVycm9yIGhhcyBoYXBwZW5lZCAodGhpcyBpcyBub3QgY29tcGF0aWJsZSAgICAgKi8KLSAgLyogICB3aXRoIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZX4yLCBob3dldmVyKS4gIFNlZSB0aGUgZmlsZSAgICAgICAgICovCi0gIC8qICAgYGZ0bW9kZXJyLmgnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAqRXJyb3IqICpNZXNzYWdlKiAqU3RyaW5ncyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGRlZmluaXRpb25zIGFyZSBzZXQgdXAgd2l0aCBzcGVjaWFsIG1hY3JvcyB0aGF0IGFsbG93IGNsaWVudCAgKi8KLSAgLyogICBhcHBsaWNhdGlvbnMgdG8gYnVpbGQgYSB0YWJsZSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGUgICAgICAgICovCi0gIC8qICAgc3RyaW5ncyBhcmUgbm90IGluY2x1ZGVkIGluIGEgbm9ybWFsIGJ1aWxkIG9mIEZyZWVUeXBlfjIgdG8gc2F2ZSAgICAqLwotICAvKiAgIHNwYWNlIChtb3N0IGNsaWVudCBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZSB0aGVtKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVG8gZG8gc28sIHlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nICAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGRlZmluZSB0aGUgc3RhcnQgb2YgICAgKi8KLSAgLyogICB0aGUgZXJyb3IgbGlzdC4gIEl0IGlzIGZvbGxvd2VkIGJ5IHNldmVyYWwgRlRfRVJST1JfREVGIGNhbGxzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VSUk9SX0RFRiggZSwgdiwgcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCB0byBkZWZpbmUgb25lIHNpbmdsZSBlcnJvci4gIGBlJyBpcyB0aGUgZXJyb3IgICovCi0gIC8qICAgY29kZSBpZGVudGlmaWVyIChlLmcuLCBgSW52YWxpZF9Bcmd1bWVudCcpLCBgdicgaXMgdGhlIGVycm9yJ3MgICAgICAqLwotICAvKiAgIG51bWVyaWNhbCB2YWx1ZSwgYW5kIGBzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byB1bmRlZmluZSBgRlRFUlJPUlNfSF8nIGJlZm9yZSAjaW5jbHVkaW5nICAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjdW5kZWYgRlRFUlJPUlNfSF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICB7IGUsIHMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgTlVMTCB9IH07ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpbnQgICAgICAgICAgZXJyX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3QgY2hhciogIGVycl9tc2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9IGZ0X2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNpbmNsdWRlIEZUX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgYEZUX0Vycl9PaycgaXMgX25vdF8gZGVmaW5lZCB3aXRoIGBGVF9FUlJPUkRFRicgYnV0IHdpdGggICovCi0gIC8qICAgYEZUX05PRVJST1JERUYnOyBpdCBpcyBhbHdheXMgemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBlcnJvcl9lbnVtZXJhdGlvbnMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIEVycm9yIEVudW1lcmF0aW9ucworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgSG93IHRvIGhhbmRsZSBlcnJvcnMgYW5kIGVycm9yIHN0cmluZ3MuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgaGVhZGVyIGZpbGUgYGZ0ZXJyb3JzLmhgICh3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGJ5CisgICAqICAgYGZyZWV0eXBlLmhgIGRlZmluZXMgdGhlIGhhbmRsaW5nIG9mIEZyZWVUeXBlJ3MgZW51bWVyYXRpb24KKyAgICogICBjb25zdGFudHMuICBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGdlbmVyYXRlIGVycm9yIG1lc3NhZ2Ugc3RyaW5ncworICAgKiAgIHdpdGggYSBzbWFsbCBtYWNybyB0cmljayBleHBsYWluZWQgYmVsb3cuCisgICAqCisgICAqICAgKipFcnJvciBGb3JtYXRzKioKKyAgICoKKyAgICogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SU2AgY2FuIGJlCisgICAqICAgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgdGhlCisgICAqICAgbW9kdWxlIHdoZXJlIHRoZSBlcnJvciBoYXMgaGFwcGVuZWQgKHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aAorICAgKiAgIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZX4yLCBob3dldmVyKS4gIFNlZSB0aGUgZmlsZSBgZnRtb2RlcnIuaGAKKyAgICogICBmb3IgbW9yZSBkZXRhaWxzLgorICAgKgorICAgKiAgICoqRXJyb3IgTWVzc2FnZSBTdHJpbmdzKioKKyAgICoKKyAgICogICBFcnJvciBkZWZpbml0aW9ucyBhcmUgc2V0IHVwIHdpdGggc3BlY2lhbCBtYWNyb3MgdGhhdCBhbGxvdyBjbGllbnQKKyAgICogICBhcHBsaWNhdGlvbnMgdG8gYnVpbGQgYSB0YWJsZSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGUgc3RyaW5ncworICAgKiAgIGFyZSBub3QgaW5jbHVkZWQgaW4gYSBub3JtYWwgYnVpbGQgb2YgRnJlZVR5cGV+MiB0byBzYXZlIHNwYWNlIChtb3N0CisgICAqICAgY2xpZW50IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIHRoZW0pLgorICAgKgorICAgKiAgIFRvIGRvIHNvLCB5b3UgaGF2ZSB0byBkZWZpbmUgdGhlIGZvbGxvd2luZyBtYWNyb3MgYmVmb3JlIGluY2x1ZGluZworICAgKiAgIHRoaXMgZmlsZS4KKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIEZUX0VSUk9SX1NUQVJUX0xJU1QKKyAgICogICBgYGAKKyAgICoKKyAgICogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSB0byBkZWZpbmUgdGhlIHN0YXJ0IG9mIHRoZQorICAgKiAgIGVycm9yIGxpc3QuICBJdCBpcyBmb2xsb3dlZCBieSBzZXZlcmFsIGBGVF9FUlJPUl9ERUZgIGNhbGxzLgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgRlRfRVJST1JfREVGKCBlLCB2LCBzICkKKyAgICogICBgYGAKKyAgICoKKyAgICogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCB0byBkZWZpbmUgb25lIHNpbmdsZSBlcnJvci4gICdlJyBpcyB0aGUgZXJyb3IKKyAgICogICBjb2RlIGlkZW50aWZpZXIgKGUuZy4sIGBJbnZhbGlkX0FyZ3VtZW50YCksICd2JyBpcyB0aGUgZXJyb3IncworICAgKiAgIG51bWVyaWNhbCB2YWx1ZSwgYW5kICdzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuCisgICAqCisgICAqICAgYGBgCisgICAqICAgICBGVF9FUlJPUl9FTkRfTElTVAorICAgKiAgIGBgYAorICAgKgorICAgKiAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4KKyAgICoKKyAgICogICBBZGRpdGlvbmFsbHksIHlvdSBoYXZlIHRvIHVuZGVmaW5lIGBGVEVSUk9SU19IX2AgYmVmb3JlICNpbmNsdWRpbmcKKyAgICogICB0aGlzIGZpbGUuCisgICAqCisgICAqICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgI3VuZGVmIEZURVJST1JTX0hfCisgICAqICAgICAjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIHsgZSwgcyB9LAorICAgKiAgICAgI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICB7CisgICAqICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgTlVMTCB9IH07CisgICAqCisgICAqICAgICBjb25zdCBzdHJ1Y3QKKyAgICogICAgIHsKKyAgICogICAgICAgaW50ICAgICAgICAgIGVycl9jb2RlOworICAgKiAgICAgICBjb25zdCBjaGFyKiAgZXJyX21zZzsKKyAgICogICAgIH0gZnRfZXJyb3JzW10gPQorICAgKgorICAgKiAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CisgICAqICAgYGBgCisgICAqCisgICAqICAgQW4gYWx0ZXJuYXRpdmUgdG8gdXNpbmcgYW4gYXJyYXkgaXMgYSBzd2l0Y2ggc3RhdGVtZW50LgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgI3VuZGVmIEZURVJST1JTX0hfCisgICAqICAgICAjZGVmaW5lIEZUX0VSUk9SX1NUQVJUX0xJU1QgICAgIHN3aXRjaCAoIGVycm9yX2NvZGUgKSB7CisgICAqICAgICAjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgICAgY2FzZSB2OiByZXR1cm4gczsKKyAgICogICAgICNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgfQorICAgKiAgIGBgYAorICAgKgorICAgKiAgIElmIHlvdSB1c2UgYEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlNgLCBgZXJyb3JfY29kZWAgc2hvdWxkCisgICAqICAgYmUgcmVwbGFjZWQgd2l0aCBgRlRfRVJST1JfQkFTRShlcnJvcl9jb2RlKWAgaW4gdGhlIGxhc3QgZXhhbXBsZS4KKyAgICovCiAKICAgLyogKi8KIAotICAvKiBJbiBwcmV2aW91cyBGcmVlVHlwZSB2ZXJzaW9ucyB3ZSB1c2VkIGBfX0ZURVJST1JTX0hfXycuICBIb3dldmVyLCAqLworICAvKiBJbiBwcmV2aW91cyBGcmVlVHlwZSB2ZXJzaW9ucyB3ZSB1c2VkIGBfX0ZURVJST1JTX0hfX2AuICBIb3dldmVyLCAqLwogICAvKiB1c2luZyB0d28gc3VjY2Vzc2l2ZSB1bmRlcnNjb3JlcyBpbiBhIG5vbi1zeXN0ZW0gc3ltYm9sIG5hbWUgICAgICAqLwogICAvKiB2aW9sYXRlcyB0aGUgQyAoYW5kIEMrKykgc3RhbmRhcmQsIHNvIGl0IHdhcyBjaGFuZ2VkIHRvIHRoZSAgICAgICAqLwogICAvKiBjdXJyZW50IGZvcm0uICBJbiBzcGl0ZSBvZiB0aGlzLCB3ZSBoYXZlIHRvIG1ha2UgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICN1bmRlZmluZSBfX0ZURVJST1JTX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiB3b3JrIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE0LDcgKzEyNCw3IEBACiAKIAogICAvKiBpbmNsdWRlIG1vZHVsZSBiYXNlIGVycm9yIGNvZGVzICovCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzAsNyArMTQwLDcgQEAKIAogCiAgIC8qIEZUX0VSUl9QUkVGSVggaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgZXJyb3IgaWRlbnRpZmllcnMuICovCi0gIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyXycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyX2AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjaWZuZGVmIEZUX0VSUl9QUkVGSVgKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRfRXJyXwpAQCAtMTU4LDYgKzE2OCw4IEBACiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2lmbmRlZiBGVF9FUlJPUkRFRgogCisjZGVmaW5lIEZUX0lOQ0xVREVfRVJSX1BST1RPUworCiAjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIGUgPSB2LAogI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBlbnVtIHsKICNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgTWF4ICkgfTsKQEAgLTE4NSw3ICsxOTcsNyBAQAogCiAKICAgLyogbm93IGluY2x1ZGUgdGhlIGVycm9yIGNvZGVzICovCi0jaW5jbHVkZSBGVF9FUlJPUl9ERUZJTklUSU9OU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJkZWYuaD4KIAogCiAjaWZkZWYgRlRfRVJST1JfRU5EX0xJU1QKQEAgLTIyMCw2ICsyMzIsNjIgQEAKICN1bmRlZiBGVF9FUlJfUFJFRklYCiAjZW5kaWYKIAorICAvKiBGVF9JTkNMVURFX0VSUl9QUk9UT1M6IENvbnRyb2wgd2hldGhlciBmdW5jdGlvbiBwcm90b3R5cGVzIHNob3VsZCBiZSAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIHdpdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+ICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgb25seSB0cnVlIHdoZXJlIGBGVF9FUlJPUkRFRmAgaXMgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9FUlJfUFJPVE9TX0RFRklORUQ6IEFjdHVhbCBtdWx0aXBsZS1pbmNsdXNpb24gcHJvdGVjdGlvbiBvZiAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGBmdGVycm9ycy5oYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUX0lOQ0xVREVfRVJSX1BST1RPUworI3VuZGVmIEZUX0lOQ0xVREVfRVJSX1BST1RPUworCisjaWZuZGVmIEZUX0VSUl9QUk9UT1NfREVGSU5FRAorI2RlZmluZSBGVF9FUlJfUFJPVE9TX0RFRklORUQKKworCitGVF9CRUdJTl9IRUFERVIKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0Vycm9yX1N0cmluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdmFsaWQgRnJlZVR5cGUgZXJyb3IgY29kZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGVycm9yX2NvZGUgOjoKKyAgICogICAgIEEgdmFsaWQgRnJlZVR5cGUgZXJyb3IgY29kZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBIEN+c3RyaW5nIG9yIGBOVUxMYCwgaWYgYW55IGVycm9yIG9jY3VycmVkLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBGcmVlVHlwZSBoYXMgdG8gYmUgY29tcGlsZWQgd2l0aCBgRlRfQ09ORklHX09QVElPTl9FUlJPUl9TVFJJTkdTYCBvcgorICAgKiAgIGBGVF9ERUJVR19MRVZFTF9FUlJPUmAgdG8gZ2V0IG1lYW5pbmdmdWwgZGVzY3JpcHRpb25zLgorICAgKiAgICdlcnJvcl9zdHJpbmcnIHdpbGwgYmUgYE5VTExgIG90aGVyd2lzZS4KKyAgICoKKyAgICogICBNb2R1bGUgaWRlbnRpZmljYXRpb24gd2lsbCBiZSBpZ25vcmVkOgorICAgKgorICAgKiAgIGBgYGMKKyAgICogICAgIHN0cmNtcCggRlRfRXJyb3JfU3RyaW5nKCAgRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQgKSwKKyAgICogICAgICAgICAgICAgRlRfRXJyb3JfU3RyaW5nKCBCREZfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQgKSApID09IDA7CisgICAqICAgYGBgCisgICAqLworICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKKyAgRlRfRXJyb3JfU3RyaW5nKCBGVF9FcnJvciAgZXJyb3JfY29kZSApOworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIEZUX0VSUl9QUk9UT1NfREVGSU5FRCAqLworCisjZW5kaWYgLyogRlRfSU5DTFVERV9FUlJfUFJPVE9TICovCisKICNlbmRpZiAvKiAhKEZURVJST1JTX0hfICYmIF9fRlRFUlJPUlNfSF9fKSAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaAppbmRleCBjYzg2ZWZhLi5mODAzMzQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Zm50Zm10LmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGZudGZtdC5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGZudGZtdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmdW5jdGlvbnMgZm9yIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGZudGZtdC5oCisgKgorICogICBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgZm9udCBmb3JtYXRzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVEZOVEZNVF9IXwogI2RlZmluZSBGVEZOVEZNVF9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTMyLDQ5ICszMSw0OCBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvbnRfZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZvbnQgRm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEdldHRpbmcgdGhlIGZvbnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBzaW5nbGUgZnVuY3Rpb24gaW4gdGhpcyBzZWN0aW9uIGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgZm9udCAgICAgKi8KLSAgLyogICBmb3JtYXQuICBOb3RlIHRoYXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgbmVlZGVkIG5vcm1hbGx5OyAgICAgICAgICovCi0gIC8qICAgaG93ZXZlciwgdGhlcmUgYXJlIHNwZWNpYWwgY2FzZXMgKGxpa2UgaW4gUERGIGRldmljZXMpIHdoZXJlIGl0IGlzICAqLwotICAvKiAgIGltcG9ydGFudCB0byBkaWZmZXJlbnRpYXRlLCBpbiBzcGl0ZSBvZiBGcmVlVHlwZSdzIHVuaWZvcm0gQVBJLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICBmb250X2Zvcm1hdHMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgRm9udCBGb3JtYXRzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogIEdldHRpbmcgdGhlIGZvbnQgZm9ybWF0LgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICBUaGUgc2luZ2xlIGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGZvbnQgZm9ybWF0LgorICAgKiAgTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBub3JtYWxseTsgaG93ZXZlciwgdGhlcmUgYXJlCisgICAqICBzcGVjaWFsIGNhc2VzIChsaWtlIGluIFBERiBkZXZpY2VzKSB3aGVyZSBpdCBpcyBpbXBvcnRhbnQgdG8KKyAgICogIGRpZmZlcmVudGlhdGUsIGluIHNwaXRlIG9mIEZyZWVUeXBlJ3MgdW5pZm9ybSBBUEkuCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9HZXRfRm9udF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZm9ybWF0IG9mIGEgZ2l2ZW4gZmFjZS4gIFBvc3NpYmxlICAgICovCi0gIC8qICAgdmFsdWVzIGFyZSBgVHJ1ZVR5cGUnLCBgVHlwZX4xJywgYEJERicsIGBQQ0YnLCBgVHlwZX40MicsICAgICAgICAgICAqLwotICAvKiAgIGBDSUR+VHlwZX4xJywgYENGRicsIGBQRlInLCBhbmQgYFdpbmRvd3N+Rk5UJy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIHJldHVybiB2YWx1ZSBpcyBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGFuIFgxMSBGT05UX1BST1BFUlRZLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgSW5wdXQgZmFjZSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZvbnQgZm9ybWF0IHN0cmluZy4gIE5VTEwgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgc2FtZSBmdW5jdGlvbiBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgRlRfR2V0X0ZvbnRfRm9ybWF0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBmb3JtYXQgb2YgYSBnaXZlbiBmYWNlLiAgUG9zc2libGUgdmFsdWVzCisgICAqICBhcmUgJ1RydWVUeXBlJywgJ1R5cGV+MScsICdCREYnLCAnUENGJywgJ1R5cGV+NDInLCAnQ0lEflR5cGV+MScsICdDRkYnLAorICAgKiAgJ1BGUicsIGFuZCAnV2luZG93c35GTlQnLgorICAgKgorICAgKiAgVGhlIHJldHVybiB2YWx1ZSBpcyBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGFuIFgxMSBGT05UX1BST1BFUlRZLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICBmYWNlIDo6CisgICAqICAgIElucHV0IGZhY2UgaGFuZGxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgRm9udCBmb3JtYXQgc3RyaW5nLiAgYE5VTExgIGluIGNhc2Ugb2YgZXJyb3IuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgQSBkZXByZWNhdGVkIG5hbWUgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIGlzIGBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0YC4KKyAgICovCiAgIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQogICBGVF9HZXRfRm9udF9Gb3JtYXQoIEZUX0ZhY2UgIGZhY2UgKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmgKaW5kZXggZmMxMjQ4Zi4uNmI3Njg4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2FzcC5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGdhc3AuaAorICoKKyAqICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgJ2dhc3AnIHRhYmxlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRHQVNQX0hfCiAjZGVmaW5lIEZUR0FTUF9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTMyLDcgKzMxLDcgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHNlY3Rpb246CiAgICAqICAgZ2FzcF90YWJsZQpAQCAtNDEsMTYgKzQwLDE2IEBACiAgICAqICAgR2FzcCBUYWJsZQogICAgKgogICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgUmV0cmlldmluZyBUcnVlVHlwZSBgZ2FzcCcgdGFibGUgZW50cmllcy4KKyAgICogICBSZXRyaWV2aW5nIFRydWVUeXBlICdnYXNwJyB0YWJsZSBlbnRyaWVzLgogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgVGhlIGZ1bmN0aW9uIEBGVF9HZXRfR2FzcCBjYW4gYmUgdXNlZCB0byBxdWVyeSBhIFRydWVUeXBlIG9yIE9wZW5UeXBlCi0gICAqICAgZm9udCBmb3Igc3BlY2lmaWMgZW50cmllcyBpbiBpdHMgYGdhc3AnIHRhYmxlLCBpZiBhbnkuICBUaGlzIGlzCi0gICAqICAgbWFpbmx5IHVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyB3aXRoIHRoZQotICAgKiAgIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIGR1cGxpY2F0ZSB0aGUgV2luZG93cyB0ZXh0IHJlbmRlcmluZyByZXN1bHRzLgorICAgKiAgIGZvbnQgZm9yIHNwZWNpZmljIGVudHJpZXMgaW4gaXRzICdnYXNwJyB0YWJsZSwgaWYgYW55LiAgVGhpcyBpcyBtYWlubHkKKyAgICogICB1c2VmdWwgd2hlbiBpbXBsZW1lbnRpbmcgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgd2l0aCB0aGUgYnl0ZWNvZGUKKyAgICogICBpbnRlcnByZXRlciB0byBkdXBsaWNhdGUgdGhlIFdpbmRvd3MgdGV4dCByZW5kZXJpbmcgcmVzdWx0cy4KICAgICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIEZUX0dBU1BfWFhYCkBAIC02Niw3ICs2NSw3IEBACiAgICAqCiAgICAqICAgRlRfR0FTUF9ET19HUklERklUIDo6CiAgICAqICAgICBHcmlkLWZpdHRpbmcgYW5kIGhpbnRpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBhdCB0aGUgc3BlY2lmaWVkIHBwZW0uCi0gICAqICAgICBUaGlzICpyZWFsbHkqIG1lYW5zIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgSWYgdGhpcyBiaXQKKyAgICogICAgIFRoaXMgKipyZWFsbHkqKiBtZWFucyBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gIElmIHRoaXMgYml0CiAgICAqICAgICBpcyBub3Qgc2V0LCBubyBoaW50aW5nIGdldHMgYXBwbGllZC4KICAgICoKICAgICogICBGVF9HQVNQX0RPX0dSQVkgOjoKQEAgLTgwLDEzICs3OSwxMyBAQAogICAgKiAgICAgR3JpZC1maXR0aW5nIG11c3QgYmUgdXNlZCB3aXRoIENsZWFyVHlwZSdzIHN5bW1ldHJpYyBzbW9vdGhpbmcuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoZSBiaXQtZmxhZ3MgYEZUX0dBU1BfRE9fR1JJREZJVCcgYW5kIGBGVF9HQVNQX0RPX0dSQVknIGFyZSB0byBiZQorICAgKiAgIFRoZSBiaXQtZmxhZ3MgYEZUX0dBU1BfRE9fR1JJREZJVGAgYW5kIGBGVF9HQVNQX0RPX0dSQVlgIGFyZSB0byBiZQogICAgKiAgIHVzZWQgZm9yIHN0YW5kYXJkIGZvbnQgcmFzdGVyaXphdGlvbiBvbmx5LiAgSW5kZXBlbmRlbnRseSBvZiB0aGF0LAotICAgKiAgIGBGVF9HQVNQX1NZTU1FVFJJQ19TTU9PVEhJTkcnIGFuZCBgRlRfR0FTUF9TWU1NRVRSSUNfR1JJREZJVCcgYXJlIHRvCi0gICAqICAgYmUgdXNlZCBpZiBDbGVhclR5cGUgaXMgZW5hYmxlZCAoYW5kIGBGVF9HQVNQX0RPX0dSSURGSVQnIGFuZAotICAgKiAgIGBGVF9HQVNQX0RPX0dSQVknIGFyZSBjb25zZXF1ZW50bHkgaWdub3JlZCkuCisgICAqICAgYEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElOR2AgYW5kIGBGVF9HQVNQX1NZTU1FVFJJQ19HUklERklUYCBhcmUgdG8KKyAgICogICBiZSB1c2VkIGlmIENsZWFyVHlwZSBpcyBlbmFibGVkIChhbmQgYEZUX0dBU1BfRE9fR1JJREZJVGAgYW5kCisgICAqICAgYEZUX0dBU1BfRE9fR1JBWWAgYXJlIGNvbnNlcXVlbnRseSBpZ25vcmVkKS4KICAgICoKLSAgICogICBgQ2xlYXJUeXBlJyBpcyBNaWNyb3NvZnQncyBpbXBsZW1lbnRhdGlvbiBvZiBMQ0QgcmVuZGVyaW5nLCBwYXJ0bHkKKyAgICogICAnQ2xlYXJUeXBlJyBpcyBNaWNyb3NvZnQncyBpbXBsZW1lbnRhdGlvbiBvZiBMQ0QgcmVuZGVyaW5nLCBwYXJ0bHkKICAgICogICBwcm90ZWN0ZWQgYnkgcGF0ZW50cy4KICAgICoKICAgICogQHNpbmNlOgpAQCAtOTksMjkgKzk4LDMxIEBACiAjZGVmaW5lIEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORyAgMHgwOAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEBmdW5jOgorICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfR2V0X0dhc3AKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEZvciBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQgZmlsZSwgcmV0dXJuIHRoZSByYXN0ZXJpemVyIGJlaGF2aW91cgotICAgKiAgIGZsYWdzIGZyb20gdGhlIGZvbnQncyBgZ2FzcCcgdGFibGUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgY2hhcmFjdGVyIHBpeGVsIHNpemUuCisgICAqICAgZmxhZ3MgZnJvbSB0aGUgZm9udCdzICdnYXNwJyB0YWJsZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyCisgICAqICAgcGl4ZWwgc2l6ZS4KICAgICoKICAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjogVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgc291cmNlIGZhY2UgaGFuZGxlLgogICAgKgotICAgKiAgIHBwZW0gOjogVGhlIHZlcnRpY2FsIGNoYXJhY3RlciBwaXhlbCBzaXplLgorICAgKiAgIHBwZW0gOjoKKyAgICogICAgIFRoZSB2ZXJ0aWNhbCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZS4KICAgICoKICAgICogQHJldHVybjoKICAgICogICBCaXQgZmxhZ3MgKHNlZSBARlRfR0FTUF9YWFgpLCBvciBARlRfR0FTUF9OT19UQUJMRSBpZiB0aGVyZSBpcyBubwotICAgKiAgIGBnYXNwJyB0YWJsZSBpbiB0aGUgZmFjZS4KKyAgICogICAnZ2FzcCcgdGFibGUgaW4gdGhlIGZhY2UuCiAgICAqCiAgICAqIEBub3RlOgogICAgKiAgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgTU0gZnVuY3Rpb25hbGl0eSBvZiBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMKICAgICogICAoaS5lLiwgdXNpbmcgQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIGFuZCBmcmllbmRzKSwgY2FsbCB0aGlzCi0gICAqICAgZnVuY3Rpb24gKmFmdGVyKiBzZXR0aW5nIGFuIGluc3RhbmNlIHNpbmNlIHRoZSByZXR1cm4gdmFsdWVzIGNhbgorICAgKiAgIGZ1bmN0aW9uICoqYWZ0ZXIqKiBzZXR0aW5nIGFuIGluc3RhbmNlIHNpbmNlIHRoZSByZXR1cm4gdmFsdWVzIGNhbgogICAgKiAgIGNoYW5nZS4KICAgICoKICAgICogQHNpbmNlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGdseXBoLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaAppbmRleCA1ZjNmYzAwLi43MDQ2MTllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaApAQCAtMSw0MCArMSwzOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbHlwaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZ2x5cGhzIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRnbHlwaC5oCisgKgorICogICBGcmVlVHlwZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHNldmVyYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zICAgICovCi0gIC8qIHRoYXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBlYXNpbHkgcmV0cmlldmUgZ2x5cGggICAgICAqLwotICAvKiBiaXRtYXBzIGFuZCBvdXRsaW5lcyBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgb3B0aW9uYWwgaWYgeW91IGFyZSB3cml0aW5nIGEgZm9udCBzZXJ2ZXIgICAqLwotICAvKiBvciB0ZXh0IGxheW91dCBlbmdpbmUgb24gdG9wIG9mIEZyZWVUeXBlLiAgSG93ZXZlciwgdGhleSBhcmUgcHJldHR5ICAgKi8KLSAgLyogaGFuZHkgZm9yIG1hbnkgb3RoZXIgc2ltcGxlIHVzZXMgb2YgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBzZXZlcmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0aGF0CisgICAqIGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZWFzaWx5IHJldHJpZXZlIGdseXBoIGJpdG1hcHMgYW5kCisgICAqIG91dGxpbmVzIGZyb20gYSBnaXZlbiBmYWNlLgorICAgKgorICAgKiBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZvbnQgc2VydmVyIG9yCisgICAqIHRleHQgbGF5b3V0IGVuZ2luZSBvbiB0b3Agb2YgRnJlZVR5cGUuICBIb3dldmVyLCB0aGV5IGFyZSBwcmV0dHkgaGFuZHkKKyAgICogZm9yIG1hbnkgb3RoZXIgc2ltcGxlIHVzZXMgb2YgdGhlIGxpYnJhcnkuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRHTFlQSF9IXwogI2RlZmluZSBGVEdMWVBIX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC00Niw2NSArNDUsNzAgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2x5cGggTWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2VuZXJpYyBpbnRlcmZhY2UgdG8gbWFuYWdlIGluZGl2aWR1YWwgZ2x5cGggZGF0YS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlZmluaXRpb25zIHVzZWQgdG8gbWFuYWdlIGdseXBoIGRhdGEgICAgICAgICovCi0gIC8qICAgIHRocm91Z2ggZ2VuZXJpYyBGVF9HbHlwaCBvYmplY3RzLiAgRWFjaCBvZiB0aGVtIGNhbiBjb250YWluIGEgICAgICAqLwotICAvKiAgICBiaXRtYXAsIGEgdmVjdG9yIG91dGxpbmUsIG9yIGV2ZW4gaW1hZ2VzIGluIG90aGVyIGZvcm1hdHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgZ2x5cGhfbWFuYWdlbWVudAorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgR2x5cGggTWFuYWdlbWVudAorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgR2VuZXJpYyBpbnRlcmZhY2UgdG8gbWFuYWdlIGluZGl2aWR1YWwgZ2x5cGggZGF0YS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBkZWZpbml0aW9ucyB1c2VkIHRvIG1hbmFnZSBnbHlwaCBkYXRhIHRocm91Z2gKKyAgICogICBnZW5lcmljIEBGVF9HbHlwaCBvYmplY3RzLiAgRWFjaCBvZiB0aGVtIGNhbiBjb250YWluIGEgYml0bWFwLAorICAgKiAgIGEgdmVjdG9yIG91dGxpbmUsIG9yIGV2ZW4gaW1hZ2VzIGluIG90aGVyIGZvcm1hdHMuICBUaGVzZSBvYmplY3RzIGFyZQorICAgKiAgIGRldGFjaGVkIGZyb20gQEZUX0ZhY2UsIGNvbnRyYXJ5IHRvIEBGVF9HbHlwaFNsb3QuCisgICAqCisgICAqLwogCiAKICAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhIHByaXZhdGUgdHlwZSAqLwogICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaF9DbGFzc18gIEZUX0dseXBoX0NsYXNzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGdlbmVyaWMgZ2x5cGggaW1hZ2VzLiAgSXQgaXMgYSAgICovCi0gIC8qICAgIHBvaW50ZXIgdG8gdGhlIEBGVF9HbHlwaFJlYyBzdHJ1Y3R1cmUgYW5kIGNhbiBjb250YWluIGEgZ2x5cGggICAgICAqLwotICAvKiAgICBiaXRtYXAgb3IgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHbHlwaCBvYmplY3RzIGFyZSBub3Qgb3duZWQgYnkgdGhlIGxpYnJhcnkuICBZb3UgbXVzdCB0aHVzIHJlbGVhc2UgKi8KLSAgLyogICAgdGhlbSBtYW51YWxseSAodGhyb3VnaCBARlRfRG9uZV9HbHlwaCkgX2JlZm9yZV8gY2FsbGluZyAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0ZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0dseXBoCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBIYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgZ2VuZXJpYyBnbHlwaCBpbWFnZXMuICBJdCBpcyBhCisgICAqICAgcG9pbnRlciB0byB0aGUgQEZUX0dseXBoUmVjIHN0cnVjdHVyZSBhbmQgY2FuIGNvbnRhaW4gYSBnbHlwaCBiaXRtYXAKKyAgICogICBvciBwb2ludGVyLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBHbHlwaCBvYmplY3RzIGFyZSBub3Qgb3duZWQgYnkgdGhlIGxpYnJhcnkuICBZb3UgbXVzdCB0aHVzIHJlbGVhc2UKKyAgICogICB0aGVtIG1hbnVhbGx5ICh0aHJvdWdoIEBGVF9Eb25lX0dseXBoKSBfYmVmb3JlXyBjYWxsaW5nCisgICAqICAgQEZUX0RvbmVfRnJlZVR5cGUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaFJlY18qICBGVF9HbHlwaDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGdseXBoIHN0cnVjdHVyZSBjb250YWlucyBhIGdpdmVuIGdseXBoIGltYWdlIHBsdXMgaXRzICAgICAqLwotICAvKiAgICBhZHZhbmNlIHdpZHRoIGluIDE2LjE2IGZpeGVkLXBvaW50IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCdzIGNsYXNzLiAgUHJpdmF0ZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICA6OiBUaGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGltYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIDo6IEEgMTYuMTYgdmVjdG9yIHRoYXQgZ2l2ZXMgdGhlIGdseXBoJ3MgYWR2YW5jZSB3aWR0aC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0dseXBoUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgcm9vdCBnbHlwaCBzdHJ1Y3R1cmUgY29udGFpbnMgYSBnaXZlbiBnbHlwaCBpbWFnZSBwbHVzIGl0cyBhZHZhbmNlCisgICAqICAgd2lkdGggaW4gMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICBjbGF6eiA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBnbHlwaCdzIGNsYXNzLiAgUHJpdmF0ZS4KKyAgICoKKyAgICogICBmb3JtYXQgOjoKKyAgICogICAgIFRoZSBmb3JtYXQgb2YgdGhlIGdseXBoJ3MgaW1hZ2UuCisgICAqCisgICAqICAgYWR2YW5jZSA6OgorICAgKiAgICAgQSAxNi4xNiB2ZWN0b3IgdGhhdCBnaXZlcyB0aGUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoUmVjXwogICB7CiAgICAgRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5OwpAQCAtMTE1LDQ4ICsxMTksNTEgQEAKICAgfSBGVF9HbHlwaFJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcEdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGEgYml0bWFwIGdseXBoIGltYWdlLiAgVGhpcyBpcyAqLwotICAvKiAgICBhIHN1Yi1jbGFzcyBvZiBARlRfR2x5cGgsIGFuZCBhIHBvaW50ZXIgdG8gQEZUX0JpdG1hcEdseXBoUmVjLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9CaXRtYXBHbHlwaAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYSBiaXRtYXAgZ2x5cGggaW1hZ2UuICBUaGlzIGlzIGEKKyAgICogICBzdWItY2xhc3Mgb2YgQEZUX0dseXBoLCBhbmQgYSBwb2ludGVyIHRvIEBGVF9CaXRtYXBHbHlwaFJlYy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX0JpdG1hcEdseXBoUmVjXyogIEZUX0JpdG1hcEdseXBoOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBmb3IgYml0bWFwIGdseXBoIGltYWdlcy4gIFRoaXMgcmVhbGx5IGlzIGEgICAgICAgICovCi0gIC8qICAgIGBzdWItY2xhc3MnIG9mIEBGVF9HbHlwaFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICA6OiBUaGUgcm9vdCBARlRfR2x5cGggZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdCAgIDo6IFRoZSBsZWZ0LXNpZGUgYmVhcmluZywgaS5lLiwgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICBmcm9tIHRoZSBjdXJyZW50IHBlbiBwb3NpdGlvbiB0byB0aGUgbGVmdCBib3JkZXIgb2YgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvcCAgICA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZywgaS5lLiwgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gICAqLwotICAvKiAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgcGVuIHBvc2l0aW9uIHRvIHRoZSB0b3AgYm9yZGVyIG9mIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgIGJpdG1hcC4gIFRoaXMgZGlzdGFuY2UgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHN+eSEgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgOjogQSBkZXNjcmlwdG9yIGZvciB0aGUgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHR5cGVjYXN0IGFuIEBGVF9HbHlwaCB0byBARlRfQml0bWFwR2x5cGggaWYgeW91IGhhdmUgICAgICAgKi8KLSAgLyogICAgYGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCcuICBUaGlzIGxldHMgeW91IGFjY2VzcyAgICovCi0gIC8qICAgIHRoZSBiaXRtYXAncyBjb250ZW50cyBlYXNpbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgYnVmZmVyIGlzIGFsd2F5cyBvd25lZCBieSBARlRfQml0bWFwR2x5cGggICovCi0gIC8qICAgIGFuZCBpcyB0aHVzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCB3aXRoIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfQml0bWFwR2x5cGhSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIGJpdG1hcCBnbHlwaCBpbWFnZXMuICBUaGlzIHJlYWxseSBpcyBhCisgICAqICAgJ3N1Yi1jbGFzcycgb2YgQEZUX0dseXBoUmVjLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHJvb3QgOjoKKyAgICogICAgIFRoZSByb290IEBGVF9HbHlwaCBmaWVsZHMuCisgICAqCisgICAqICAgbGVmdCA6OgorICAgKiAgICAgVGhlIGxlZnQtc2lkZSBiZWFyaW5nLCBpLmUuLCB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZQorICAgKiAgICAgY3VycmVudCBwZW4gcG9zaXRpb24gdG8gdGhlIGxlZnQgYm9yZGVyIG9mIHRoZSBnbHlwaCBiaXRtYXAuCisgICAqCisgICAqICAgdG9wIDo6CisgICAqICAgICBUaGUgdG9wLXNpZGUgYmVhcmluZywgaS5lLiwgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGZyb20gdGhlIGN1cnJlbnQKKyAgICogICAgIHBlbiBwb3NpdGlvbiB0byB0aGUgdG9wIGJvcmRlciBvZiB0aGUgZ2x5cGggYml0bWFwLiAgVGhpcyBkaXN0YW5jZQorICAgKiAgICAgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHN+eSEKKyAgICoKKyAgICogICBiaXRtYXAgOjoKKyAgICogICAgIEEgZGVzY3JpcHRvciBmb3IgdGhlIGJpdG1hcC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IGNhbiB0eXBlY2FzdCBhbiBARlRfR2x5cGggdG8gQEZUX0JpdG1hcEdseXBoIGlmIHlvdSBoYXZlCisgICAqICAgYGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUGAuICBUaGlzIGxldHMgeW91IGFjY2VzcyB0aGUKKyAgICogICBiaXRtYXAncyBjb250ZW50cyBlYXNpbHkuCisgICAqCisgICAqICAgVGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgYnVmZmVyIGlzIGFsd2F5cyBvd25lZCBieSBARlRfQml0bWFwR2x5cGggYW5kCisgICAqICAgaXMgdGh1cyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2l0aCBpdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBHbHlwaFJlY18KICAgewogICAgIEZUX0dseXBoUmVjICByb290OwpAQCAtMTY3LDQ0ICsxNzQsNDYgQEAKICAgfSBGVF9CaXRtYXBHbHlwaFJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGFuIG91dGxpbmUgZ2x5cGggaW1hZ2UuICBUaGlzICAqLwotICAvKiAgICBpcyBhIHN1Yi1jbGFzcyBvZiBARlRfR2x5cGgsIGFuZCBhIHBvaW50ZXIgdG8gQEZUX091dGxpbmVHbHlwaFJlYy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9PdXRsaW5lR2x5cGgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGFuIG9iamVjdCB1c2VkIHRvIG1vZGVsIGFuIG91dGxpbmUgZ2x5cGggaW1hZ2UuICBUaGlzIGlzIGEKKyAgICogICBzdWItY2xhc3Mgb2YgQEZUX0dseXBoLCBhbmQgYSBwb2ludGVyIHRvIEBGVF9PdXRsaW5lR2x5cGhSZWMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVF9PdXRsaW5lR2x5cGhSZWNfKiAgRlRfT3V0bGluZUdseXBoOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZUdseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCBmb3Igb3V0bGluZSAodmVjdG9yaWFsKSBnbHlwaCBpbWFnZXMuICBUaGlzICAgICAgICovCi0gIC8qICAgIHJlYWxseSBpcyBhIGBzdWItY2xhc3MnIG9mIEBGVF9HbHlwaFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgOjogVGhlIHJvb3QgQEZUX0dseXBoIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIGRlc2NyaXB0b3IgZm9yIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB0eXBlY2FzdCBhbiBARlRfR2x5cGggdG8gQEZUX091dGxpbmVHbHlwaCBpZiB5b3UgaGF2ZSAgICAgICovCi0gIC8qICAgIGBnbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FJy4gIFRoaXMgbGV0cyB5b3UgYWNjZXNzICAqLwotICAvKiAgICB0aGUgb3V0bGluZSdzIGNvbnRlbnQgZWFzaWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzIHRoZSBvdXRsaW5lIGlzIGV4dHJhY3RlZCBmcm9tIGEgZ2x5cGggc2xvdCwgaXRzIGNvb3JkaW5hdGVzIGFyZSAqLwotICAvKiAgICBleHByZXNzZWQgbm9ybWFsbHkgaW4gMjYuNiBwaXhlbHMsIHVubGVzcyB0aGUgZmxhZyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUgd2FzIHVzZWQgaW4gQEZUX0xvYWRfR2x5cGgoKSBvciBARlRfTG9hZF9DaGFyKCkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgb3V0bGluZSdzIHRhYmxlcyBhcmUgYWx3YXlzIG93bmVkIGJ5IHRoZSBvYmplY3QgYW5kIGFyZSAgICAgICAgKi8KLSAgLyogICAgZGVzdHJveWVkIHdpdGggaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9PdXRsaW5lR2x5cGhSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIG91dGxpbmUgKHZlY3RvcmlhbCkgZ2x5cGggaW1hZ2VzLiAgVGhpcyByZWFsbHkgaXMKKyAgICogICBhICdzdWItY2xhc3MnIG9mIEBGVF9HbHlwaFJlYy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICByb290IDo6CisgICAqICAgICBUaGUgcm9vdCBARlRfR2x5cGggZmllbGRzLgorICAgKgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIEEgZGVzY3JpcHRvciBmb3IgdGhlIG91dGxpbmUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFlvdSBjYW4gdHlwZWNhc3QgYW4gQEZUX0dseXBoIHRvIEBGVF9PdXRsaW5lR2x5cGggaWYgeW91IGhhdmUKKyAgICogICBgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORWAuICBUaGlzIGxldHMgeW91IGFjY2VzcyB0aGUKKyAgICogICBvdXRsaW5lJ3MgY29udGVudCBlYXNpbHkuCisgICAqCisgICAqICAgQXMgdGhlIG91dGxpbmUgaXMgZXh0cmFjdGVkIGZyb20gYSBnbHlwaCBzbG90LCBpdHMgY29vcmRpbmF0ZXMgYXJlCisgICAqICAgZXhwcmVzc2VkIG5vcm1hbGx5IGluIDI2LjYgcGl4ZWxzLCB1bmxlc3MgdGhlIGZsYWcgQEZUX0xPQURfTk9fU0NBTEUKKyAgICogICB3YXMgdXNlZCBpbiBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyLgorICAgKgorICAgKiAgIFRoZSBvdXRsaW5lJ3MgdGFibGVzIGFyZSBhbHdheXMgb3duZWQgYnkgdGhlIG9iamVjdCBhbmQgYXJlIGRlc3Ryb3llZAorICAgKiAgIHdpdGggaXQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZUdseXBoUmVjXwogICB7CiAgICAgRlRfR2x5cGhSZWMgIHJvb3Q7CkBAIC0yMTMsMTEzICsyMjIsMTUwIEBACiAgIH0gRlRfT3V0bGluZUdseXBoUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgYSBnbHlwaCBpbWFnZSBmcm9tIGEgc2xvdC4gIE5vdGUgdGhhdCAgICovCi0gIC8qICAgIHRoZSBjcmVhdGVkIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlY2F1c2UgYCphZ2x5cGgtPmFkdmFuY2UueCcgYW5kICcqYWdseXBoLT5hZHZhbmNlLnknIGFyZSAxNi4xNiAgICAqLwotICAvKiAgICBmaXhlZC1wb2ludCBudW1iZXJzLCBgc2xvdC0+YWR2YW5jZS54JyBhbmQgYHNsb3QtPmFkdmFuY2UueScgICAgICAgKi8KLSAgLyogICAgKHdoaWNoIGFyZSBpbiAyNi42IGZpeGVkLXBvaW50IGZvcm1hdCkgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgICAgICAgICovCi0gIC8qICAgIF0tMzI3Njg7MzI3NjhbLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9OZXdfR2x5cGgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBuZXcgZW1wdHkgZ2x5cGggaW1hZ2UuICBOb3RlIHRoYXQgdGhlCisgICAqICAgY3JlYXRlZCBARlRfR2x5cGggb2JqZWN0IG11c3QgYmUgcmVsZWFzZWQgd2l0aCBARlRfRG9uZV9HbHlwaC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICBmb3JtYXQgOjoKKyAgICogICAgIFRoZSBmb3JtYXQgb2YgdGhlIGdseXBoJ3MgaW1hZ2UuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYWdseXBoIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgZ2x5cGggb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjEwCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfTmV3X0dseXBoKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0ICBmb3JtYXQsCisgICAgICAgICAgICAgICAgRlRfR2x5cGggICAgICAgICAqYWdseXBoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9HbHlwaAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgYSBnbHlwaCBpbWFnZSBmcm9tIGEgc2xvdC4gIE5vdGUgdGhhdCB0aGUKKyAgICogICBjcmVhdGVkIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc2xvdCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBnbHlwaCBzbG90LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFnbHlwaCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBCZWNhdXNlIGAqYWdseXBoLT5hZHZhbmNlLnhgIGFuZCBgKmFnbHlwaC0+YWR2YW5jZS55YCBhcmUgMTYuMTYKKyAgICogICBmaXhlZC1wb2ludCBudW1iZXJzLCBgc2xvdC0+YWR2YW5jZS54YCBhbmQgYHNsb3QtPmFkdmFuY2UueWAgKHdoaWNoCisgICAqICAgYXJlIGluIDI2LjYgZml4ZWQtcG9pbnQgZm9ybWF0KSBtdXN0IGJlIGluIHRoZSByYW5nZSBdLTMyNzY4OzMyNzY4Wy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfR2x5cGgoIEZUX0dseXBoU2xvdCAgc2xvdCwKICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgKmFnbHlwaCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNvcHkgYSBnbHlwaCBpbWFnZS4gIE5vdGUgdGhhdCB0aGUgY3JlYXRlZCAgICAgICovCi0gIC8qICAgIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvdXJjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2x5cGhfQ29weQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGNvcHkgYSBnbHlwaCBpbWFnZS4gIE5vdGUgdGhhdCB0aGUgY3JlYXRlZAorICAgKiAgIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc291cmNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICB0YXJnZXQgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mIGVycm9yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhfQ29weSggRlRfR2x5cGggICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgIEZUX0dseXBoICAqdGFyZ2V0ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUcmFuc2Zvcm0gYSBnbHlwaCBpbWFnZSBpZiBpdHMgZm9ybWF0IGlzIHNjYWxhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIGEgMngyIG1hdHJpeCB0byBhcHBseS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhICA6OiBBIHBvaW50ZXIgdG8gYSAyZCB2ZWN0b3IgdG8gYXBwbHkuICBDb29yZGluYXRlcyBhcmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIDEvNjR0aCBvZiBhIHBpeGVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIChpZiBub3QgMCwgdGhlIGdseXBoIGZvcm1hdCBpcyBub3Qgc2NhbGFibGUpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgMngyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBpcyBhbHNvIGFwcGxpZWQgdG8gdGhlIGdseXBoJ3MgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dseXBoX1RyYW5zZm9ybQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVHJhbnNmb3JtIGEgZ2x5cGggaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcyBzY2FsYWJsZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGdseXBoIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hdHJpeCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGEgMngyIG1hdHJpeCB0byBhcHBseS4KKyAgICoKKyAgICogICBkZWx0YSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGEgMmQgdmVjdG9yIHRvIGFwcGx5LiAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZCBpbgorICAgKiAgICAgMS82NHRoIG9mIGEgcGl4ZWwuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZSAoaWYgbm90IDAsIHRoZSBnbHlwaCBmb3JtYXQgaXMgbm90IHNjYWxhYmxlKS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIDJ4MiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBnbHlwaCdzIGFkdmFuY2UKKyAgICogICB2ZWN0b3IuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhfVHJhbnNmb3JtKCBGVF9HbHlwaCAgICBnbHlwaCwKICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgZGVsdGEgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0JCb3hfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2RlIGhvdyB0aGUgdmFsdWVzIG9mIEBGVF9HbHlwaF9HZXRfQ0JveCBhcmUgcmV0dXJuZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiB1bnNjYWxlZCBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiB1bmZpdHRlZCAyNi42IGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBncmlkLWZpdHRlZCAyNi42IGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBjb29yZGluYXRlcyBpbiBpbnRlZ2VyIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0JCT1hfUElYRUxTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFJldHVybiBncmlkLWZpdHRlZCBwaXhlbCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9HbHlwaF9CQm94X01vZGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBtb2RlIGhvdyB0aGUgdmFsdWVzIG9mIEBGVF9HbHlwaF9HZXRfQ0JveCBhcmUgcmV0dXJuZWQuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfR0xZUEhfQkJPWF9VTlNDQUxFRCA6OgorICAgKiAgICAgUmV0dXJuIHVuc2NhbGVkIGZvbnQgdW5pdHMuCisgICAqCisgICAqICAgRlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgOjoKKyAgICogICAgIFJldHVybiB1bmZpdHRlZCAyNi42IGNvb3JkaW5hdGVzLgorICAgKgorICAgKiAgIEZUX0dMWVBIX0JCT1hfR1JJREZJVCA6OgorICAgKiAgICAgUmV0dXJuIGdyaWQtZml0dGVkIDI2LjYgY29vcmRpbmF0ZXMuCisgICAqCisgICAqICAgRlRfR0xZUEhfQkJPWF9UUlVOQ0FURSA6OgorICAgKiAgICAgUmV0dXJuIGNvb3JkaW5hdGVzIGluIGludGVnZXIgcGl4ZWxzLgorICAgKgorICAgKiAgIEZUX0dMWVBIX0JCT1hfUElYRUxTIDo6CisgICAqICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMuCisgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0JCb3hfTW9kZV8KICAgewogICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgID0gMCwKQEAgLTMzMiw3ICszNzgsNyBAQAogCiAKICAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX0dseXBoX0JCb3hfTW9kZScgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYEZUX0dseXBoX0JCb3hfTW9kZWAgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfZ2x5cGhfYmJveF91bnNjYWxlZCAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQKICNkZWZpbmUgZnRfZ2x5cGhfYmJveF9zdWJwaXhlbHMgIEZUX0dMWVBIX0JCT1hfU1VCUElYRUxTCiAjZGVmaW5lIGZ0X2dseXBoX2Jib3hfZ3JpZGZpdCAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQKQEAgLTM0MCwxODcgKzM4NiwxODggQEAKICNkZWZpbmUgZnRfZ2x5cGhfYmJveF9waXhlbHMgICAgIEZUX0dMWVBIX0JCT1hfUElYRUxTCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9HZXRfQ0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSBnbHlwaCdzIGBjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsIHRoZSAgKi8KLSAgLyogICAgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIEJlemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgICAgICovCi0gIC8qICAgIGNvaW5jaWRlcyB3aXRoIHRoZSBleGFjdCBib3VuZGluZyBib3ggZm9yIG1vc3QgZ2x5cGhzLCBpdCBjYW4gYmUgICAqLwotICAvKiAgICBzbGlnaHRseSBsYXJnZXIgaW4gc29tZSBzaXR1YXRpb25zIChsaWtlIHdoZW4gcm90YXRpbmcgYW4gb3V0bGluZSAgKi8KLSAgLyogICAgdGhhdCBjb250YWlucyBCZXppZXIgb3V0c2lkZSBhcmNzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KLSAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCi0gIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLwotICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQsIHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZGUgIDo6IFRoZSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkICAgICAqLwotICAvKiAgICAgICAgICAgICBib3VuZGluZyBib3ggdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2JveCA6OiBUaGUgZ2x5cGggY29vcmRpbmF0ZSBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgZXhwcmVzc2VkIGluIDEvNjR0aCBvZiBwaXhlbHMgaWYgaXQgaXMgZ3JpZC1maXR0ZWQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29vcmRpbmF0ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBnbHlwaCBvcmlnaW4sIHVzaW5nIHRoZSB5fnVwd2FyZHMgICovCi0gIC8qICAgIGNvbnZlbnRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoIEBGVF9MT0FEX05PX1NDQUxFLCBgYmJveF9tb2RlJyAgICovCi0gIC8qICAgIG11c3QgYmUgc2V0IHRvIEBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIHRvIGdldCB1bnNjYWxlZCBmb250ICAgICAgICAqLwotICAvKiAgICB1bml0cyBpbiAyNi42IHBpeGVsIGZvcm1hdC4gIFRoZSB2YWx1ZSBARlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgICAgKi8KLSAgLyogICAgaXMgYW5vdGhlciBuYW1lIGZvciB0aGlzIGNvbnN0YW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgZm9udCBpcyB0cmlja3kgYW5kIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUsIHRoZSByZXN1bHRpbmcgQ0JveCBpcyBtZWFuaW5nbGVzcy4gIFRvIGdldCAgICAgICovCi0gIC8qICAgIHJlYXNvbmFibGUgdmFsdWVzIGZvciB0aGUgQ0JveCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgZ2x5cGggICAqLwotICAvKiAgICBhdCBhIGxhcmdlIHBwZW0gdmFsdWUgKHNvIHRoYXQgdGhlIGhpbnRpbmcgaW5zdHJ1Y3Rpb25zIGNhbiAgICAgICAgKi8KLSAgLyogICAgcHJvcGVybHkgc2hpZnQgYW5kIHNjYWxlIHRoZSBzdWJnbHlwaHMpLCB0aGVuIGV4dHJhY3RpbmcgdGhlIENCb3gsICovCi0gIC8qICAgIHdoaWNoIGNhbiBiZSBldmVudHVhbGx5IGNvbnZlcnRlZCBiYWNrIHRvIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoZSBtYXhpbXVtIGNvb3JkaW5hdGVzIGFyZSBleGNsdXNpdmUsIHdoaWNoIG1lYW5zIHRoYXQgICovCi0gIC8qICAgIG9uZSBjYW4gY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZ2x5cGggaW1hZ2UgKGJlIGl0IGluICAqLwotICAvKiAgICBpbnRlZ2VyIG9yIDI2LjYgcGl4ZWxzKSBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBoZWlnaHQgPSBiYm94LnlNYXggLSBiYm94LnlNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgZm9yIDI2LjYgY29vcmRpbmF0ZXMsIGlmIGBiYm94X21vZGUnIGlzIHNldCB0byAgICAgICovCi0gIC8qICAgIEBGVF9HTFlQSF9CQk9YX0dSSURGSVQsIHRoZSBjb29yZGluYXRlcyB3aWxsIGFsc28gYmUgZ3JpZC1maXR0ZWQsICAqLwotICAvKiAgICB3aGljaCBjb3JyZXNwb25kcyB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueE1pbiA9IEZMT09SKGJib3gueE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnlNaW4gPSBGTE9PUihiYm94LnlNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC54TWF4ID0gQ0VJTElORyhiYm94LnhNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueU1heCA9IENFSUxJTkcoYmJveC55TWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyB0byAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyAgKi8KLSAgLyogICAgdG8gQEZUX0dMWVBIX0JCT1hfUElYRUxTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dseXBoX0dldF9DQm94CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gYSBnbHlwaCdzICdjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsIHRoZQorICAgKiAgIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCZXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQKKyAgICogICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlCisgICAqICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgdGhhdAorICAgKiAgIGNvbnRhaW5zIEJlemllciBvdXRzaWRlIGFyY3MpLgorICAgKgorICAgKiAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyBib3gKKyAgICogICBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzIGFuZCBhcmNzCisgICAqICAgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICdmdGJib3gnCisgICAqICAgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGdseXBoIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogICBtb2RlIDo6CisgICAqICAgICBUaGUgbW9kZSB0aGF0IGluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSByZXR1cm5lZCBib3VuZGluZyBib3gKKyAgICogICAgIHZhbHVlcy4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhY2JveCA6OgorICAgKiAgICAgVGhlIGdseXBoIGNvb3JkaW5hdGUgYm91bmRpbmcgYm94LiAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZCBpbgorICAgKiAgICAgMS82NHRoIG9mIHBpeGVscyBpZiBpdCBpcyBncmlkLWZpdHRlZC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQ29vcmRpbmF0ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBnbHlwaCBvcmlnaW4sIHVzaW5nIHRoZSB5fnVwd2FyZHMKKyAgICogICBjb252ZW50aW9uLgorICAgKgorICAgKiAgIElmIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCBARlRfTE9BRF9OT19TQ0FMRSwgYGJib3hfbW9kZWAgbXVzdAorICAgKiAgIGJlIHNldCB0byBARlRfR0xZUEhfQkJPWF9VTlNDQUxFRCB0byBnZXQgdW5zY2FsZWQgZm9udCB1bml0cyBpbiAyNi42CisgICAqICAgcGl4ZWwgZm9ybWF0LiAgVGhlIHZhbHVlIEBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyBpcyBhbm90aGVyIG5hbWUgZm9yCisgICAqICAgdGhpcyBjb25zdGFudC4KKyAgICoKKyAgICogICBJZiB0aGUgZm9udCBpcyB0cmlja3kgYW5kIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aAorICAgKiAgIEBGVF9MT0FEX05PX1NDQUxFLCB0aGUgcmVzdWx0aW5nIENCb3ggaXMgbWVhbmluZ2xlc3MuICBUbyBnZXQKKyAgICogICByZWFzb25hYmxlIHZhbHVlcyBmb3IgdGhlIENCb3ggaXQgaXMgbmVjZXNzYXJ5IHRvIGxvYWQgdGhlIGdseXBoIGF0IGEKKyAgICogICBsYXJnZSBwcGVtIHZhbHVlIChzbyB0aGF0IHRoZSBoaW50aW5nIGluc3RydWN0aW9ucyBjYW4gcHJvcGVybHkgc2hpZnQKKyAgICogICBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQ0JveCwgd2hpY2ggY2FuIGJlCisgICAqICAgZXZlbnR1YWxseSBjb252ZXJ0ZWQgYmFjayB0byBmb250IHVuaXRzLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB0aGUgbWF4aW11bSBjb29yZGluYXRlcyBhcmUgZXhjbHVzaXZlLCB3aGljaCBtZWFucyB0aGF0IG9uZQorICAgKiAgIGNhbiBjb21wdXRlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBnbHlwaCBpbWFnZSAoYmUgaXQgaW4gaW50ZWdlcgorICAgKiAgIG9yIDI2LjYgcGl4ZWxzKSBhczoKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIHdpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsKKyAgICogICAgIGhlaWdodCA9IGJib3gueU1heCAtIGJib3gueU1pbjsKKyAgICogICBgYGAKKyAgICoKKyAgICogICBOb3RlIGFsc28gdGhhdCBmb3IgMjYuNiBjb29yZGluYXRlcywgaWYgYGJib3hfbW9kZWAgaXMgc2V0IHRvCisgICAqICAgQEZUX0dMWVBIX0JCT1hfR1JJREZJVCwgdGhlIGNvb3JkaW5hdGVzIHdpbGwgYWxzbyBiZSBncmlkLWZpdHRlZCwKKyAgICogICB3aGljaCBjb3JyZXNwb25kcyB0bzoKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIGJib3gueE1pbiA9IEZMT09SKGJib3gueE1pbik7CisgICAqICAgICBiYm94LnlNaW4gPSBGTE9PUihiYm94LnlNaW4pOworICAgKiAgICAgYmJveC54TWF4ID0gQ0VJTElORyhiYm94LnhNYXgpOworICAgKiAgICAgYmJveC55TWF4ID0gQ0VJTElORyhiYm94LnlNYXgpOworICAgKiAgIGBgYAorICAgKgorICAgKiAgIFRvIGdldCB0aGUgYmJveCBpbiBwaXhlbCBjb29yZGluYXRlcywgc2V0IGBiYm94X21vZGVgIHRvCisgICAqICAgQEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUuCisgICAqCisgICAqICAgVG8gZ2V0IHRoZSBiYm94IGluIGdyaWQtZml0dGVkIHBpeGVsIGNvb3JkaW5hdGVzLCBzZXQgYGJib3hfbW9kZWAgdG8KKyAgICogICBARlRfR0xZUEhfQkJPWF9QSVhFTFMuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9HbHlwaF9HZXRfQ0JveCggRlRfR2x5cGggIGdseXBoLAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGJib3hfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICphY2JveCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfVG9fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydCBhIGdpdmVuIGdseXBoIG9iamVjdCB0byBhIGJpdG1hcCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGhlX2dseXBoICAgOjogQSBwb2ludGVyIHRvIGEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGguICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX21vZGUgOjogQW4gZW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IHRoZSBkYXRhIGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3JpZ2luICAgICAgOjogQSBwb2ludGVyIHRvIGEgdmVjdG9yIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIGJlZm9yZSByZW5kZXJpbmcuICBDYW4gYmV+MCAoaWYgbm8gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbikuICBUaGUgb3JpZ2luIGlzIGV4cHJlc3NlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgMjYuNiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXN0cm95ICAgICA6OiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JpZ2luYWwgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2Ugc2hvdWxkIGJlIGRlc3Ryb3llZCBieSB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG5ldmVyIGRlc3Ryb3llZCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIHRoZSBnbHlwaCBmb3JtYXQgaXNuJ3Qgc2NhbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGltYWdlIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgYG9yaWdpbicgdmVjdG9yIGJlZm9yZSAgICAgICovCi0gIC8qICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gQEZUX0dseXBoIGhhbmRsZSwgdGhhdCB3aWxsICovCi0gIC8qICAgIGJlIF9yZXBsYWNlZF8gYnkgdGhpcyBmdW5jdGlvbiAod2l0aCBuZXdseSBhbGxvY2F0ZWQgZGF0YSkuICAgICAgICAqLwotICAvKiAgICBUeXBpY2FsbHksIHlvdSB3b3VsZCB1c2UgKG9taXR0aW5nIGVycm9yIGhhbmRsaW5nKTogICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0dseXBoICAgICAgICBnbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGhfYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBsb2FkIGdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZXJyb3IgPSBGVF9Mb2FkX0NoYXIoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX0RFRkFVTFQgKTsgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBleHRyYWN0IGdseXBoIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZXJyb3IgPSBGVF9HZXRfR2x5cGgoIGZhY2UtPmdseXBoLCAmZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBjb252ZXJ0IHRvIGEgYml0bWFwIChkZWZhdWx0IHJlbmRlciBtb2RlICsgZGVzdHJveWluZyBvbGQpICAqLwotICAvKiAgICAgICAgaWYgKCBnbHlwaC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGVycm9yID0gRlRfR2x5cGhfVG9fQml0bWFwKCAmZ2x5cGgsIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgaWYgKCBlcnJvciApIC8vIGBnbHlwaCcgdW5jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBhY2Nlc3MgYml0bWFwIGNvbnRlbnQgYnkgdHlwZWNhc3RpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZ2x5cGhfYml0bWFwID0gKEZUX0JpdG1hcEdseXBoKWdseXBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBkbyBmdW5ueSBzdHVmZiB3aXRoIGl0LCBsaWtlIGJsaXR0aW5nL2RyYXdpbmcgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBkaXNjYXJkIGdseXBoIGltYWdlIChiaXRtYXAgb3Igbm90KSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBhbm90aGVyIGV4YW1wbGUsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmc6ICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9HbHlwaCAgZ2x5cGhzW01BWF9HTFlQSFNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWR4LCBGVF9MT0FEX0RFRkFVTFQgKSB8fCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEZUX0dldF9HbHlwaCAoIGZhY2UtPmdseXBoLCAmZ2x5cGhbaWR4XSApOyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGVF9HbHlwaCAgYml0bWFwID0gZ2x5cGhzW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIC8vIGFmdGVyIHRoaXMgY2FsbCwgYGJpdG1hcCcgbm8gbG9uZ2VyIHBvaW50cyBpbnRvICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAvLyB0aGUgYGdseXBocycgYXJyYXkgKGFuZCB0aGUgb2xkIHZhbHVlIGlzbid0IGRlc3Ryb3llZCkgICAgKi8KLSAgLyogICAgICAgICAgRlRfR2x5cGhfVG9fQml0bWFwKCAmYml0bWFwLCBGVF9SRU5ERVJfTU9ERV9NT05PLCAwLCAwICk7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGJpdG1hcCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoc1tpZHhdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2x5cGhfVG9fQml0bWFwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggb2JqZWN0IHRvIGEgYml0bWFwIGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIHRoZV9nbHlwaCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGguCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICByZW5kZXJfbW9kZSA6OgorICAgKiAgICAgQW4gZW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IHRoZSBkYXRhIGlzIHJlbmRlcmVkLgorICAgKgorICAgKiAgIG9yaWdpbiA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGEgdmVjdG9yIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnbHlwaCBpbWFnZSBiZWZvcmUKKyAgICogICAgIHJlbmRlcmluZy4gIENhbiBiZX4wIChpZiBubyB0cmFuc2xhdGlvbikuICBUaGUgb3JpZ2luIGlzIGV4cHJlc3NlZAorICAgKiAgICAgaW4gMjYuNiBwaXhlbHMuCisgICAqCisgICAqICAgZGVzdHJveSA6OgorICAgKiAgICAgQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlIHNob3VsZCBiZQorICAgKiAgICAgZGVzdHJveWVkIGJ5IHRoaXMgZnVuY3Rpb24uICBJdCBpcyBuZXZlciBkZXN0cm95ZWQgaW4gY2FzZSBvZiBlcnJvci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBpZiB0aGUgZ2x5cGggZm9ybWF0IGlzbid0IHNjYWxhYmxlLgorICAgKgorICAgKiAgIFRoZSBnbHlwaCBpbWFnZSBpcyB0cmFuc2xhdGVkIHdpdGggdGhlIGBvcmlnaW5gIHZlY3RvciBiZWZvcmUKKyAgICogICByZW5kZXJpbmcuCisgICAqCisgICAqICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gQEZUX0dseXBoIGhhbmRsZSwgdGhhdCB3aWxsIGJlCisgICAqICAgX3JlcGxhY2VkXyBieSB0aGlzIGZ1bmN0aW9uICh3aXRoIG5ld2x5IGFsbG9jYXRlZCBkYXRhKS4gIFR5cGljYWxseSwKKyAgICogICB5b3Ugd291bGQgdXNlIChvbWl0dGluZyBlcnJvciBoYW5kbGluZyk6CisgICAqCisgICAqICAgYGBgCisgICAqICAgICBGVF9HbHlwaCAgICAgICAgZ2x5cGg7CisgICAqICAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGhfYml0bWFwOworICAgKgorICAgKgorICAgKiAgICAgLy8gbG9hZCBnbHlwaAorICAgKiAgICAgZXJyb3IgPSBGVF9Mb2FkX0NoYXIoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX0RFRkFVTFQgKTsKKyAgICoKKyAgICogICAgIC8vIGV4dHJhY3QgZ2x5cGggaW1hZ2UKKyAgICogICAgIGVycm9yID0gRlRfR2V0X0dseXBoKCBmYWNlLT5nbHlwaCwgJmdseXBoICk7CisgICAqCisgICAqICAgICAvLyBjb252ZXJ0IHRvIGEgYml0bWFwIChkZWZhdWx0IHJlbmRlciBtb2RlICsgZGVzdHJveWluZyBvbGQpCisgICAqICAgICBpZiAoIGdseXBoLT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCisgICAqICAgICB7CisgICAqICAgICAgIGVycm9yID0gRlRfR2x5cGhfVG9fQml0bWFwKCAmZ2x5cGgsIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSApOworICAgKiAgICAgICBpZiAoIGVycm9yICkgLy8gYGdseXBoJyB1bmNoYW5nZWQKKyAgICogICAgICAgICAuLi4KKyAgICogICAgIH0KKyAgICoKKyAgICogICAgIC8vIGFjY2VzcyBiaXRtYXAgY29udGVudCBieSB0eXBlY2FzdGluZworICAgKiAgICAgZ2x5cGhfYml0bWFwID0gKEZUX0JpdG1hcEdseXBoKWdseXBoOworICAgKgorICAgKiAgICAgLy8gZG8gZnVubnkgc3R1ZmYgd2l0aCBpdCwgbGlrZSBibGl0dGluZy9kcmF3aW5nCisgICAqICAgICAuLi4KKyAgICoKKyAgICogICAgIC8vIGRpc2NhcmQgZ2x5cGggaW1hZ2UgKGJpdG1hcCBvciBub3QpCisgICAqICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaCApOworICAgKiAgIGBgYAorICAgKgorICAgKiAgIEhlcmUgaXMgYW5vdGhlciBleGFtcGxlLCBhZ2FpbiB3aXRob3V0IGVycm9yIGhhbmRsaW5nOgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgRlRfR2x5cGggIGdseXBoc1tNQVhfR0xZUEhTXQorICAgKgorICAgKgorICAgKiAgICAgLi4uCisgICAqCisgICAqICAgICBmb3IgKCBpZHggPSAwOyBpIDwgTUFYX0dMWVBIUzsgaSsrICkKKyAgICogICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBpZHgsIEZUX0xPQURfREVGQVVMVCApIHx8CisgICAqICAgICAgICAgICAgICAgRlRfR2V0X0dseXBoICggZmFjZS0+Z2x5cGgsICZnbHlwaHNbaWR4XSApOworICAgKgorICAgKiAgICAgLi4uCisgICAqCisgICAqICAgICBmb3IgKCBpZHggPSAwOyBpIDwgTUFYX0dMWVBIUzsgaSsrICkKKyAgICogICAgIHsKKyAgICogICAgICAgRlRfR2x5cGggIGJpdG1hcCA9IGdseXBoc1tpZHhdOworICAgKgorICAgKgorICAgKiAgICAgICAuLi4KKyAgICoKKyAgICogICAgICAgLy8gYWZ0ZXIgdGhpcyBjYWxsLCBgYml0bWFwJyBubyBsb25nZXIgcG9pbnRzIGludG8KKyAgICogICAgICAgLy8gdGhlIGBnbHlwaHMnIGFycmF5IChhbmQgdGhlIG9sZCB2YWx1ZSBpc24ndCBkZXN0cm95ZWQpCisgICAqICAgICAgIEZUX0dseXBoX1RvX0JpdG1hcCggJmJpdG1hcCwgRlRfUkVOREVSX01PREVfTU9OTywgMCwgMCApOworICAgKgorICAgKiAgICAgICAuLi4KKyAgICoKKyAgICogICAgICAgRlRfRG9uZV9HbHlwaCggYml0bWFwICk7CisgICAqICAgICB9CisgICAqCisgICAqICAgICAuLi4KKyAgICoKKyAgICogICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKQorICAgKiAgICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaHNbaWR4XSApOworICAgKiAgIGBgYAorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dseXBoX1RvX0JpdG1hcCggRlRfR2x5cGgqICAgICAgIHRoZV9nbHlwaCwKICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUsCkBAIC01MjgsMTcgKzU3NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZXN0cm95ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgZ2l2ZW4gZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfRG9uZV9HbHlwaAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRGVzdHJveSBhIGdpdmVuIGdseXBoLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZ2x5cGggOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRfRG9uZV9HbHlwaCggRlRfR2x5cGggIGdseXBoICk7CiAKQEAgLTU0Nyw1NCArNTk1LDU2IEBACiAKICAgLyogb3RoZXIgaGVscGZ1bCBmdW5jdGlvbnMgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgY29tcHV0YXRpb25zCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybSB0aGUgbWF0cml4IG9wZXJhdGlvbiBgYiA9IGEqYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBhJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBBIHBvaW50ZXIgdG8gbWF0cml4IGBiJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGBhJyBvciBgYicgaXMgemVyby4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSB0aGUgZnVuY3Rpb24gdXNlcyB3cmFwLWFyb3VuZCBhcml0aG1ldGljLCByZXN1bHRzIGJlY29tZSAgICAgKi8KLSAgLyogICAgbWVhbmluZ2xlc3MgaWYgdGhlIGFyZ3VtZW50cyBhcmUgdmVyeSBsYXJnZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX01hdHJpeF9NdWx0aXBseQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUGVyZm9ybSB0aGUgbWF0cml4IG9wZXJhdGlvbiBgYiA9IGEqYmAuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBhIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gbWF0cml4IGBhYC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBtYXRyaXggYGJgLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZCBpZiBlaXRoZXIgYGFgIG9yIGBiYCBpcyB6ZXJvLgorICAgKgorICAgKiAgIFNpbmNlIHRoZSBmdW5jdGlvbiB1c2VzIHdyYXAtYXJvdW5kIGFyaXRobWV0aWMsIHJlc3VsdHMgYmVjb21lCisgICAqICAgbWVhbmluZ2xlc3MgaWYgdGhlIGFyZ3VtZW50cyBhcmUgdmVyeSBsYXJnZS4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX01hdHJpeF9NdWx0aXBseSggY29uc3QgRlRfTWF0cml4KiAgYSwKICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXgqICAgICAgICBiICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXhfSW52ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnZlcnQgYSAyeDIgbWF0cml4LiAgUmV0dXJuIGFuIGVycm9yIGlmIGl0IGNhbid0IGJlIGludmVydGVkLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgbWF0cml4LiAgUmVtYWlucyB1bnRvdWNoZWQgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX01hdHJpeF9JbnZlcnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEludmVydCBhIDJ4MiBtYXRyaXguICBSZXR1cm4gYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgaW52ZXJ0ZWQuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBtYXRyaXggOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG1hdHJpeC4gIFJlbWFpbnMgdW50b3VjaGVkIGluIGNhc2Ugb2YgZXJyb3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGd4dmFsLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaAppbmRleCA4MzgyZDU5Li4zNTQ0NjBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaApAQCAtMSwzNSArMSwzNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRneHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z3h2YWwuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSywKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRHWFZBTF9IXwogI2RlZmluZSBGVEdYVkFMX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtNDEsNDMgKzQwLDQzIEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGd4X3ZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlR1gvQUFUIFZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFQSSB0byB2YWxpZGF0ZSBUcnVlVHlwZUdYL0FBVCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlICAgICAqLwotICAvKiAgICBzb21lIFRydWVUeXBlR1ggdGFibGVzIChmZWF0LCBtb3J0LCBtb3J4LCBic2xuLCBqdXN0LCBrZXJuLCBvcGJkLCAgKi8KLSAgLyogICAgdHJhaywgcHJvcCwgbGNhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RydWVUeXBlR1hfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NsYXNzaWNLZXJuX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVkFMSURBVEVfR1hfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX0dYWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9DS0VSTlhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgZ3hfdmFsaWRhdGlvbgorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgVHJ1ZVR5cGVHWC9BQVQgVmFsaWRhdGlvbgorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgQW4gQVBJIHRvIHZhbGlkYXRlIFRydWVUeXBlR1gvQUFUIHRhYmxlcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlIHNvbWUKKyAgICogICBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2Vybiwgb3BiZCwgdHJhaywKKyAgICogICBwcm9wLCBsY2FyKS4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUKKyAgICogICBGVF9UcnVlVHlwZUdYX0ZyZWUKKyAgICoKKyAgICogICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZQorICAgKiAgIEZUX0NsYXNzaWNLZXJuX0ZyZWUKKyAgICoKKyAgICogICBGVF9WQUxJREFURV9HWF9MRU5HVEgKKyAgICogICBGVF9WQUxJREFURV9HWFhYWAorICAgKiAgIEZUX1ZBTElEQVRFX0NLRVJOWFhYCisgICAqCisgICAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdhcm5pbmc6IFVzZSBGVF9WQUxJREFURV9YWFggdG8gdmFsaWRhdGUgYSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBneHZhbGlkIGRldmVsb3BlcnMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqCisgICAqIFdhcm5pbmc6IFVzZSBgRlRfVkFMSURBVEVfWFhYYCB0byB2YWxpZGF0ZSBhIHRhYmxlLgorICAgKiAgICAgICAgICBGb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBneHZhbGlkIGRldmVsb3BlcnMuCisgICAqCisgICAqCisgICAqLwogCiAjZGVmaW5lIEZUX1ZBTElEQVRFX2ZlYXRfSU5ERVggICAgIDAKICNkZWZpbmUgRlRfVkFMSURBVEVfbW9ydF9JTkRFWCAgICAgMQpAQCAtOTIsMTQgKzkxLDE0IEBACiAjZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0xBU1RfSU5ERVggIEZUX1ZBTElEQVRFX2xjYXJfSU5ERVgKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfVkFMSURBVEVfR1hfTEVOR1RICiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBUaGUgbnVtYmVyIG9mIHRhYmxlcyBjaGVja2VkIGluIHRoaXMgbW9kdWxlLiAgVXNlIGl0IGFzIGEgcGFyYW1ldGVyCi0gICAqICAgZm9yIHRoZSBgdGFibGUtbGVuZ3RoJyBhcmd1bWVudCBvZiBmdW5jdGlvbiBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZS4KKyAgICogICBmb3IgdGhlIGB0YWJsZS1sZW5ndGhgIGFyZ3VtZW50IG9mIGZ1bmN0aW9uIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlLgogICAgKi8KICNkZWZpbmUgRlRfVkFMSURBVEVfR1hfTEVOR1RIICAoIEZUX1ZBTElEQVRFX0dYX0xBU1RfSU5ERVggKyAxICkKIApAQCAtMTEyLDUxICsxMTEsNTEgQEAKICAgICAgICAgICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IEZUX1ZBTElEQVRFXyMjdGFnIyNfSU5ERVggKQogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICAgRlRfVkFMSURBVEVfR1hYWFgKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgdG8KLSAgKiAgICBpbmRpY2F0ZSB3aGljaCBUcnVlVHlwZUdYL0FBVCBUeXBlIHRhYmxlcyBzaG91bGQgYmUgdmFsaWRhdGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgICBGVF9WQUxJREFURV9mZWF0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgZmVhdCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9tb3J0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbW9ydCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9tb3J4IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbW9yeCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9ic2xuIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgYnNsbicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9qdXN0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBganVzdCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9rZXJuIDo6Ci0gICogICAgICBWYWxpZGF0ZSBga2VybicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9vcGJkIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgb3BiZCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV90cmFrIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgdHJhaycgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9wcm9wIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgcHJvcCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9sY2FyIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbGNhcicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HWCA6OgotICAqICAgICAgVmFsaWRhdGUgYWxsIFRydWVUeXBlR1ggdGFibGVzIChmZWF0LCBtb3J0LCBtb3J4LCBic2xuLCBqdXN0LCBrZXJuLAotICAqICAgICAgb3BiZCwgdHJhaywgcHJvcCBhbmQgbGNhcikuCi0gICoKLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgICBGVF9WQUxJREFURV9HWFhYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSB0bworICAgKiAgICBpbmRpY2F0ZSB3aGljaCBUcnVlVHlwZUdYL0FBVCBUeXBlIHRhYmxlcyBzaG91bGQgYmUgdmFsaWRhdGVkLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgICBGVF9WQUxJREFURV9mZWF0IDo6CisgICAqICAgICAgVmFsaWRhdGUgJ2ZlYXQnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9tb3J0IDo6CisgICAqICAgICAgVmFsaWRhdGUgJ21vcnQnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9tb3J4IDo6CisgICAqICAgICAgVmFsaWRhdGUgJ21vcngnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9ic2xuIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ2JzbG4nIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9qdXN0IDo6CisgICAqICAgICAgVmFsaWRhdGUgJ2p1c3QnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9rZXJuIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ2tlcm4nIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9vcGJkIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ29wYmQnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV90cmFrIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ3RyYWsnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9wcm9wIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ3Byb3AnIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9sY2FyIDo6CisgICAqICAgICAgVmFsaWRhdGUgJ2xjYXInIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9HWCA6OgorICAgKiAgICAgIFZhbGlkYXRlIGFsbCBUcnVlVHlwZUdYIHRhYmxlcyAoZmVhdCwgbW9ydCwgbW9yeCwgYnNsbiwganVzdCwga2VybiwKKyAgICogICAgICBvcGJkLCB0cmFrLCBwcm9wIGFuZCBsY2FyKS4KKyAgICoKKyAgICovCiAKICNkZWZpbmUgRlRfVkFMSURBVEVfZmVhdCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGZlYXQgKQogI2RlZmluZSBGVF9WQUxJREFURV9tb3J0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbW9ydCApCkBAIC0xODEsNDcgKzE4MCw0NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9sY2FyICkKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgVmFsaWRhdGUgdmFyaW91cyBUcnVlVHlwZUdYIHRhYmxlcyB0byBhc3N1cmUgdGhhdCBhbGwgb2Zmc2V0cyBhbmQKLSAgKiAgICBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0Ci0gICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dAotICAqICAgIGVycm9yIGNoZWNraW5nICh3aGljaCBjYW4gYmUgcXVpdGUgdGltZSBjb25zdW1pbmcpLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKLSAgKiAgICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgdGFibGVzIHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9HWFhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogICAgdGFibGVfbGVuZ3RoIDo6Ci0gICogICAgICAgVGhlIHNpemUgb2YgdGhlIGB0YWJsZXMnIGFycmF5LiAgTm9ybWFsbHksIEBGVF9WQUxJREFURV9HWF9MRU5HVEgKLSAgKiAgICAgICBzaG91bGQgYmUgcGFzc2VkLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICB0YWJsZXMgOjoKLSAgKiAgICAgICBUaGUgYXJyYXkgd2hlcmUgYWxsIHZhbGlkYXRlZCBzZm50IHRhYmxlcyBhcmUgc3RvcmVkLgotICAqICAgICAgIFRoZSBhcnJheSBpdHNlbGYgbXVzdCBiZSBhbGxvY2F0ZWQgYnkgYSBjbGllbnQuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggVHJ1ZVR5cGVHWCBmb250cywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICogICBvdGhlcndpc2UuCi0gICoKLSAgKiAgIEFmdGVyIHVzZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWFsbG9jYXRlIHRoZSBidWZmZXJzIHBvaW50ZWQgdG8gYnkKLSAgKiAgIGVhY2ggYHRhYmxlcycgZWxlbWVudCwgYnkgY2FsbGluZyBARlRfVHJ1ZVR5cGVHWF9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZWl0aGVyIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIHRoZQotICAqICAgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvciB2YWxpZGF0aW9uLCBvciB0aGUgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZQotICAqICAgdGhlIGFiaWxpdHkgdG8gdmFsaWRhdGUgdGhlIHNmbnQgdGFibGUuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBWYWxpZGF0ZSB2YXJpb3VzIFRydWVUeXBlR1ggdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAorICAgKiAgICBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwgbGlicmFyeSB0aGF0CisgICAqICAgIGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzIHdpdGhvdXQgZXJyb3IKKyAgICogICAgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSA6OgorICAgKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAgKgorICAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6CisgICAqICAgICAgQSBiaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlIHRhYmxlcyB0byBiZSB2YWxpZGF0ZWQuICBTZWUKKyAgICogICAgICBARlRfVkFMSURBVEVfR1hYWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAgICoKKyAgICogICAgdGFibGVfbGVuZ3RoIDo6CisgICAqICAgICAgVGhlIHNpemUgb2YgdGhlIGB0YWJsZXNgIGFycmF5LiAgTm9ybWFsbHksIEBGVF9WQUxJREFURV9HWF9MRU5HVEgKKyAgICogICAgICBzaG91bGQgYmUgcGFzc2VkLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICB0YWJsZXMgOjoKKyAgICogICAgICBUaGUgYXJyYXkgd2hlcmUgYWxsIHZhbGlkYXRlZCBzZm50IHRhYmxlcyBhcmUgc3RvcmVkLiAgVGhlIGFycmF5CisgICAqICAgICAgaXRzZWxmIG11c3QgYmUgYWxsb2NhdGVkIGJ5IGEgY2xpZW50LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIFRydWVUeXBlR1ggZm9udHMsIHJldHVybmluZyBhbiBlcnJvcgorICAgKiAgIG90aGVyd2lzZS4KKyAgICoKKyAgICogICBBZnRlciB1c2UsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5CisgICAqICAgZWFjaCBgdGFibGVzYCBlbGVtZW50LCBieSBjYWxsaW5nIEBGVF9UcnVlVHlwZUdYX0ZyZWUuICBBIGBOVUxMYCB2YWx1ZQorICAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIgZG9lc24ndCBleGlzdCBpbiB0aGUgZm9udCwgdGhlCisgICAqICAgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvciB2YWxpZGF0aW9uLCBvciB0aGUgdmFsaWRhdG9yIGRvZXNuJ3QgaGF2ZQorICAgKiAgIHRoZSBhYmlsaXR5IHRvIHZhbGlkYXRlIHRoZSBzZm50IHRhYmxlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1RydWVUeXBlR1hfVmFsaWRhdGUoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgdmFsaWRhdGlvbl9mbGFncywKQEAgLTIyOSwxMTkgKzIyOCwxMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX1RydWVUeXBlR1hfRnJlZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgVHJ1ZVR5cGVHWCB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgICAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSBvbmx5LgotICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgICBGVF9UcnVlVHlwZUdYX0ZyZWUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBGcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IFRydWVUeXBlR1ggdmFsaWRhdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICoKKyAgICogICAgdGFibGUgOjoKKyAgICogICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQorICAgKiAgIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIG9ubHkuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9UcnVlVHlwZUdYX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICAgRlRfVkFMSURBVEVfQ0tFUk5YWFgKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlCi0gICogICAgdG8gaW5kaWNhdGUgdGhlIGNsYXNzaWMga2VybiBkaWFsZWN0IG9yIGRpYWxlY3RzLiAgSWYgdGhlIHNlbGVjdGVkCi0gICogICAgdHlwZSBkb2Vzbid0IGZpdCwgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIHJlZ2FyZHMgdGhlIHRhYmxlIGFzCi0gICogICAgaW52YWxpZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfTVMgOjoKLSAgKiAgICAgIEhhbmRsZSB0aGUgYGtlcm4nIHRhYmxlIGFzIGEgY2xhc3NpYyBNaWNyb3NvZnQga2VybiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0FQUExFIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgQXBwbGUga2VybiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0NLRVJOIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyBhcyBlaXRoZXIgY2xhc3NpYyBBcHBsZSBvciBNaWNyb3NvZnQga2VybiB0YWJsZS4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgICBGVF9WQUxJREFURV9DS0VSTlhYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgdG8KKyAgICogICAgaW5kaWNhdGUgdGhlIGNsYXNzaWMga2VybiBkaWFsZWN0IG9yIGRpYWxlY3RzLiAgSWYgdGhlIHNlbGVjdGVkIHR5cGUKKyAgICogICAgZG9lc24ndCBmaXQsIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSByZWdhcmRzIHRoZSB0YWJsZSBhcyBpbnZhbGlkLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgICBGVF9WQUxJREFURV9NUyA6OgorICAgKiAgICAgIEhhbmRsZSB0aGUgJ2tlcm4nIHRhYmxlIGFzIGEgY2xhc3NpYyBNaWNyb3NvZnQga2VybiB0YWJsZS4KKyAgICoKKyAgICogICAgRlRfVkFMSURBVEVfQVBQTEUgOjoKKyAgICogICAgICBIYW5kbGUgdGhlICdrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgQXBwbGUga2VybiB0YWJsZS4KKyAgICoKKyAgICogICAgRlRfVkFMSURBVEVfQ0tFUk4gOjoKKyAgICogICAgICBIYW5kbGUgdGhlICdrZXJuJyBhcyBlaXRoZXIgY2xhc3NpYyBBcHBsZSBvciBNaWNyb3NvZnQga2VybiB0YWJsZS4KKyAgICovCiAjZGVmaW5lIEZUX1ZBTElEQVRFX01TICAgICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IDAgKQogI2RlZmluZSBGVF9WQUxJREFURV9BUFBMRSAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCAxICkKIAogI2RlZmluZSBGVF9WQUxJREFURV9DS0VSTiAgKCBGVF9WQUxJREFURV9NUyB8IEZUX1ZBTElEQVRFX0FQUExFICkKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIGNsYXNzaWMgKDE2LWJpdCBmb3JtYXQpIGtlcm4gdGFibGUgdG8gYXNzdXJlIHRoYXQgdGhlIG9mZnNldHMKLSAgKiAgICBhbmQgaW5kaWNlcyBhcmUgdmFsaWQuICBUaGUgaWRlYSBpcyB0aGF0IGEgaGlnaGVyLWxldmVsIGxpYnJhcnkgdGhhdAotICAqICAgIGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzIHdpdGhvdXQgZXJyb3IKLSAgKiAgICBjaGVja2luZyAod2hpY2ggY2FuIGJlIHF1aXRlIHRpbWUgY29uc3VtaW5nKS4KLSAgKgotICAqICAgIFRoZSBga2VybicgdGFibGUgdmFsaWRhdG9yIGluIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIGRlYWxzIHdpdGggYm90aAotICAqICAgIHRoZSBuZXcgMzItYml0IGZvcm1hdCBhbmQgdGhlIGNsYXNzaWMgMTYtYml0IGZvcm1hdCwgd2hpbGUKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSBvbmx5IHN1cHBvcnRzIHRoZSBjbGFzc2ljIDE2LWJpdCBmb3JtYXQuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSBkaWFsZWN0IHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9DS0VSTlhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBja2Vybl90YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUga2VybiB0YWJsZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBBZnRlciB1c2UsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5Ci0gICogICBgY2tlcm5fdGFibGUnLCBieSBjYWxsaW5nIEBGVF9DbGFzc2ljS2Vybl9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZG9lc24ndCBleGlzdCBpbiB0aGUgZm9udC4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBWYWxpZGF0ZSBjbGFzc2ljICgxNi1iaXQgZm9ybWF0KSBrZXJuIHRhYmxlIHRvIGFzc3VyZSB0aGF0IHRoZQorICAgKiAgICBvZmZzZXRzIGFuZCBpbmRpY2VzIGFyZSB2YWxpZC4gIFRoZSBpZGVhIGlzIHRoYXQgYSBoaWdoZXItbGV2ZWwKKyAgICogICAgbGlicmFyeSB0aGF0IGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzCisgICAqICAgIHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCisgICAqCisgICAqICAgIFRoZSAna2VybicgdGFibGUgdmFsaWRhdG9yIGluIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIGRlYWxzIHdpdGggYm90aAorICAgKiAgICB0aGUgbmV3IDMyLWJpdCBmb3JtYXQgYW5kIHRoZSBjbGFzc2ljIDE2LWJpdCBmb3JtYXQsIHdoaWxlCisgICAqICAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkgc3VwcG9ydHMgdGhlIGNsYXNzaWMgMTYtYml0IGZvcm1hdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKKyAgICogICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgZGlhbGVjdCB0byBiZSB2YWxpZGF0ZWQuICBTZWUKKyAgICogICAgICBARlRfVkFMSURBVEVfQ0tFUk5YWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICAgY2tlcm5fdGFibGUgOjoKKyAgICogICAgICBBIHBvaW50ZXIgdG8gdGhlIGtlcm4gdGFibGUuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcnMgcG9pbnRlZCB0byBieQorICAgKiAgIGBja2Vybl90YWJsZWAsIGJ5IGNhbGxpbmcgQEZUX0NsYXNzaWNLZXJuX0ZyZWUuICBBIGBOVUxMYCB2YWx1ZQorICAgKiAgIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBkb2Vzbid0IGV4aXN0IGluIHRoZSBmb250LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZhbGlkYXRpb25fZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfQ2xhc3NpY0tlcm5fRnJlZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgY2xhc3NpYyBLZXJuIHZhbGlkYXRvci4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB0YWJsZSA6OgotICAqICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkKLSAgKiAgICAgICBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSBvbmx5LgotICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgICBGVF9DbGFzc2ljS2Vybl9GcmVlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBjbGFzc2ljIEtlcm4gdmFsaWRhdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICoKKyAgICogICAgdGFibGUgOjoKKyAgICogICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5CisgICAqICAgICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5CisgICAqICAgQEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlIG9ubHkuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9DbGFzc2ljS2Vybl9GcmVlKCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaAppbmRleCBkYjAzM2RhLi5lYzU5MzlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRnemlwLmgKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3ppcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHemlwLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z3ppcC5oCisgKgorICogICBHemlwLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUR1pJUF9IXwogI2RlZmluZSBGVEdaSVBfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMSwxMDggKzMwLDEwOSBAQAogCiBGVF9CRUdJTl9IRUFERVIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnemlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWklQIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2luZyBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEd6aXAtc3BlY2lmaWMgZnVuY3Rpb25zLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgZ3ppcAorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgR1pJUCBTdHJlYW1zCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBVc2luZyBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBnemlwIGNvbXByZXNzaW9uIHJlY29nbml0aW9uIGlzCisgICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KKyAgICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3CisgICAqICAgY29tcHJlc3NlZCBmaWxlLCB0aGUgbGlicmFyeSB3aWxsIHRyeSB0byBvcGVuIGEgZ3ppcHBlZCBzdHJlYW0gZnJvbSBpdAorICAgKiAgIGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCisgICAqCisgICAqICAgVGhlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCByZXNldHMgdGhlIGRlY29tcHJlc3Npb24KKyAgICogICBwcm9jZXNzIGVhY2ggdGltZSBzZWVraW5nIGJhY2t3YXJkcyBpcyBuZWVkZWQgd2l0aGluIHRoZSBzdHJlYW0sCisgICAqICAgd2hpY2ggc2lnbmlmaWNhbnRseSB1bmRlcm1pbmVzIHRoZSBwZXJmb3JtYW5jZS4KKyAgICoKKyAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEd6aXAtc3BlY2lmaWMgZnVuY3Rpb25zLgorICAgKgorICAgKi8KIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfU3RyZWFtX09wZW5HemlwCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLmd6JyBmb250cyB0aGF0IGNvbWUKLSAgKiAgIHdpdGggWEZyZWU4Ni4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIHN0cmVhbSA6OgotICAqICAgICBUaGUgdGFyZ2V0IGVtYmVkZGluZyBzdHJlYW0uCi0gICoKLSAgKiAgIHNvdXJjZSA6OgotICAqICAgICBUaGUgc291cmNlIHN0cmVhbS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGUgc291cmNlIHN0cmVhbSBtdXN0IGJlIG9wZW5lZCBfYmVmb3JlXyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0gICoKLSAgKiAgIENhbGxpbmcgdGhlIGludGVybmFsIGZ1bmN0aW9uIGBGVF9TdHJlYW1fQ2xvc2UnIG9uIHRoZSBuZXcgc3RyZWFtIHdpbGwKLSAgKiAgICpub3QqIGNhbGwgYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIHNvdXJjZSBzdHJlYW0uICBOb25lIG9mIHRoZSBzdHJlYW0KLSAgKiAgIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB0byB0aGUgaGVhcC4KLSAgKgotICAqICAgVGhlIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhc2ljIGFuZCByZXNldHMgdGhlIGRlY29tcHJlc3Npb24KLSAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbS4KLSAgKgotICAqICAgSW4gY2VydGFpbiBidWlsZHMgb2YgdGhlIGxpYnJhcnksIGd6aXAgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBnemlwcGVkIHN0cmVhbSBmcm9tCi0gICogICBpdCBhbmQgcmUtb3BlbiB0aGUgZmFjZSB3aXRoIGl0LgotICAqCi0gICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKLSAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCB6bGliIHN1cHBvcnQuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU3RyZWFtX09wZW5HemlwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMgbWFpbmx5CisgICAqICAgdXNlZCB0byBzdXBwb3J0IHRoZSBjb21wcmVzc2VkIGAqLnBjZi5nemAgZm9udHMgdGhhdCBjb21lIHdpdGgKKyAgICogICBYRnJlZTg2LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGVtYmVkZGluZyBzdHJlYW0uCisgICAqCisgICAqICAgc291cmNlIDo6CisgICAqICAgICBUaGUgc291cmNlIHN0cmVhbS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc291cmNlIHN0cmVhbSBtdXN0IGJlIG9wZW5lZCBfYmVmb3JlXyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAqCisgICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZWAgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAorICAgKiAgICoqbm90KiogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlYCBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlCisgICAqICAgc3RyZWFtIG9iamVjdHMgd2lsbCBiZSByZWxlYXNlZCB0byB0aGUgaGVhcC4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmVgIGlmIHlvdXIgYnVpbGQKKyAgICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggemxpYiBzdXBwb3J0LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1N0cmVhbV9PcGVuR3ppcCggRlRfU3RyZWFtICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfR3ppcF9VbmNvbXByZXNzCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBEZWNvbXByZXNzIGEgemlwcGVkIGlucHV0IGJ1ZmZlciBpbnRvIGFuIG91dHB1dCBidWZmZXIuICBUaGlzIGZ1bmN0aW9uCi0gICogICBpcyBtb2RlbGVkIGFmdGVyIHpsaWIncyBgdW5jb21wcmVzcycgZnVuY3Rpb24uCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBtZW1vcnkgOjoKLSAgKiAgICAgQSBGcmVlVHlwZSBtZW1vcnkgaGFuZGxlLgotICAqCi0gICogICBpbnB1dCA6OgotICAqICAgICBUaGUgaW5wdXQgYnVmZmVyLgotICAqCi0gICogICBpbnB1dF9sZW4gOjoKLSAgKiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgIG91dHB1dDo6Ci0gICogICAgIFRoZSBvdXRwdXQgYnVmZmVyLgotICAqCi0gICogQGlub3V0OgotICAqICAgb3V0cHV0X2xlbiA6OgotICAqICAgICBCZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb24sIHRoaXMgaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlIG91dHB1dAotICAqICAgICBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZSB1bmNvbXByZXNzZWQKLSAgKiAgICAgZGF0YSAoc28gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgYmUga25vd24gaW4KLSAgKiAgICAgYWR2YW5jZSkuICBBZnRlciBjYWxsaW5nIHRoZSBmdW5jdGlvbiwgYG91dHB1dF9sZW4nIGlzIHRoZSBzaXplIG9mCi0gICogICAgIHRoZSB1c2VkIGRhdGEgaW4gYG91dHB1dCcuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgcmV0dXJuIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB5b3VyIGJ1aWxkCi0gICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggemxpYiBzdXBwb3J0LgotICAqCi0gICogQHNpbmNlOgotICAqICAgMi41LjEKLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HemlwX1VuY29tcHJlc3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlY29tcHJlc3MgYSB6aXBwZWQgaW5wdXQgYnVmZmVyIGludG8gYW4gb3V0cHV0IGJ1ZmZlci4gIFRoaXMgZnVuY3Rpb24KKyAgICogICBpcyBtb2RlbGVkIGFmdGVyIHpsaWIncyBgdW5jb21wcmVzc2AgZnVuY3Rpb24uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgRnJlZVR5cGUgbWVtb3J5IGhhbmRsZS4KKyAgICoKKyAgICogICBpbnB1dCA6OgorICAgKiAgICAgVGhlIGlucHV0IGJ1ZmZlci4KKyAgICoKKyAgICogICBpbnB1dF9sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBvdXRwdXQgOjoKKyAgICogICAgIFRoZSBvdXRwdXQgYnVmZmVyLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgb3V0cHV0X2xlbiA6OgorICAgKiAgICAgQmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uLCB0aGlzIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBvdXRwdXQKKyAgICogICAgIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIHVuY29tcHJlc3NlZAorICAgKiAgICAgZGF0YSAoc28gdGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgYmUga25vd24gaW4KKyAgICogICAgIGFkdmFuY2UpLiAgQWZ0ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24sIGBvdXRwdXRfbGVuYCBpcyB0aGUgc2l6ZSBvZgorICAgKiAgICAgdGhlIHVzZWQgZGF0YSBpbiBgb3V0cHV0YC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmVgIGlmIHlvdXIgYnVpbGQKKyAgICogICBvZiBGcmVlVHlwZSB3YXMgbm90IGNvbXBpbGVkIHdpdGggemxpYiBzdXBwb3J0LgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi41LjEKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HemlwX1VuY29tcHJlc3MoIEZUX01lbW9yeSAgICAgICBtZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIG91dHB1dCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKaW5kZXggNzllZGUxOS4uNzQ5MTE2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKQEAgLTEsMjcgKzEsMjcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW1hZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBnbHlwaCBpbWFnZSBmb3JtYXRzIGFuZCBkZWZhdWx0IHJhc3RlciBpbnRlcmZhY2UgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGltYWdlLmgKKyAqCisgKiAgIEZyZWVUeXBlIGdseXBoIGltYWdlIGZvcm1hdHMgYW5kIGRlZmF1bHQgcmFzdGVyIGludGVyZmFjZQorICogICAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGU6IEEgYHJhc3RlcicgaXMgc2ltcGx5IGEgc2Nhbi1saW5lIGNvbnZlcnRlciwgdXNlZCB0byByZW5kZXIgICAgICAqLwotICAvKiAgICAgICBGVF9PdXRsaW5lcyBpbnRvIEZUX0JpdG1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTm90ZTogQSAncmFzdGVyJyBpcyBzaW1wbHkgYSBzY2FuLWxpbmUgY29udmVydGVyLCB1c2VkIHRvIHJlbmRlcgorICAgKiAgICAgICBGVF9PdXRsaW5lcyBpbnRvIEZUX0JpdG1hcHMuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRJTUFHRV9IXwpAQCAtMzAsNDcgKzMwLDQ4IEBACiAKICAgLyogU1RBTkRBTE9ORV8gaXMgZnJvbSBmdGdyYXlzLmMgKi8KICNpZm5kZWYgU1RBTkRBTE9ORV8KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2VuZGlmCiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgYmFzaWNfdHlwZXMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdHlwZSBGVF9Qb3MgaXMgdXNlZCB0byBzdG9yZSB2ZWN0b3JpYWwgY29vcmRpbmF0ZXMuICBEZXBlbmRpbmcgKi8KLSAgLyogICAgb24gdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgZGlzdGFuY2VzIGluIGludGVnZXIgZm9udCAgICAgICovCi0gIC8qICAgIHVuaXRzLCBvciAxNi4xNiwgb3IgMjYuNiBmaXhlZC1wb2ludCBwaXhlbCBjb29yZGluYXRlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX1BvcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHR5cGUgRlRfUG9zIGlzIHVzZWQgdG8gc3RvcmUgdmVjdG9yaWFsIGNvb3JkaW5hdGVzLiAgRGVwZW5kaW5nIG9uCisgICAqICAgdGhlIGNvbnRleHQsIHRoZXNlIGNhbiByZXByZXNlbnQgZGlzdGFuY2VzIGluIGludGVnZXIgZm9udCB1bml0cywgb3IKKyAgICogICAxNi4xNiwgb3IgMjYuNiBmaXhlZC1wb2ludCBwaXhlbCBjb29yZGluYXRlcy4KKyAgICovCiAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX1BvczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLwotICAvKiAgICB0aGUgRlRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9WZWN0b3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgdGhlCisgICAqICAgRlRfUG9zIHR5cGUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgeCA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZS4KKyAgICogICB5IDo6CisgICAqICAgICBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9WZWN0b3JfCiAgIHsKICAgICBGVF9Qb3MgIHg7CkBAIC03OSwzOSArODAsNDEgQEAKICAgfSBGVF9WZWN0b3I7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gb3V0bGluZSdzIGJvdW5kaW5nIGJveCwgaS5lLiwgdGhlICAgICAgKi8KLSAgLyogICAgY29vcmRpbmF0ZXMgb2YgaXRzIGV4dHJlbWEgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhNaW4gOjogVGhlIGhvcml6b250YWwgbWluaW11bSAobGVmdC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU1pbiA6OiBUaGUgdmVydGljYWwgbWluaW11bSAoYm90dG9tLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4TWF4IDo6IFRoZSBob3Jpem9udGFsIG1heGltdW0gKHJpZ2h0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNYXggOjogVGhlIHZlcnRpY2FsIG1heGltdW0gKHRvcC1tb3N0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBib3VuZGluZyBib3ggaXMgc3BlY2lmaWVkIHdpdGggdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBsb3dlciAgICAqLwotICAvKiAgICBsZWZ0IGFuZCB0aGUgdXBwZXIgcmlnaHQgY29ybmVyLiAgSW4gUG9zdFNjcmlwdCwgdGhvc2UgdmFsdWVzIGFyZSAgKi8KLSAgLyogICAgb2Z0ZW4gY2FsbGVkIChsbHgsbGx5KSBhbmQgKHVyeCx1cnkpLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgeU1pbicgaXMgbmVnYXRpdmUsIHRoaXMgdmFsdWUgZ2l2ZXMgdGhlIGdseXBoJ3MgZGVzY2VuZGVyLiAgICAgKi8KLSAgLyogICAgT3RoZXJ3aXNlLCB0aGUgZ2x5cGggZG9lc24ndCBkZXNjZW5kIGJlbG93IHRoZSBiYXNlbGluZS4gICAgICAgICAgICovCi0gIC8qICAgIFNpbWlsYXJseSwgaWYgYHltYXgnIGlzIHBvc2l0aXZlLCB0aGlzIHZhbHVlIGdpdmVzIHRoZSBnbHlwaCdzICAgICAqLwotICAvKiAgICBhc2NlbmRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGB4TWluJyBnaXZlcyB0aGUgaG9yaXpvbnRhbCBkaXN0YW5jZSBmcm9tIHRoZSBnbHlwaCdzIG9yaWdpbiB0byAgICAqLwotICAvKiAgICB0aGUgbGVmdCBlZGdlIG9mIHRoZSBnbHlwaCdzIGJvdW5kaW5nIGJveC4gIElmIGB4TWluJyBpcyBuZWdhdGl2ZSwgKi8KLSAgLyogICAgdGhlIGdseXBoIGV4dGVuZHMgdG8gdGhlIGxlZnQgb2YgdGhlIG9yaWdpbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9CQm94CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYW4gb3V0bGluZSdzIGJvdW5kaW5nIGJveCwgaS5lLiwgdGhlCisgICAqICAgY29vcmRpbmF0ZXMgb2YgaXRzIGV4dHJlbWEgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpcmVjdGlvbnMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgeE1pbiA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgbWluaW11bSAobGVmdC1tb3N0KS4KKyAgICoKKyAgICogICB5TWluIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgbWluaW11bSAoYm90dG9tLW1vc3QpLgorICAgKgorICAgKiAgIHhNYXggOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIG1heGltdW0gKHJpZ2h0LW1vc3QpLgorICAgKgorICAgKiAgIHlNYXggOjoKKyAgICogICAgIFRoZSB2ZXJ0aWNhbCBtYXhpbXVtICh0b3AtbW9zdCkuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBib3VuZGluZyBib3ggaXMgc3BlY2lmaWVkIHdpdGggdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBsb3dlciBsZWZ0CisgICAqICAgYW5kIHRoZSB1cHBlciByaWdodCBjb3JuZXIuICBJbiBQb3N0U2NyaXB0LCB0aG9zZSB2YWx1ZXMgYXJlIG9mdGVuCisgICAqICAgY2FsbGVkIChsbHgsbGx5KSBhbmQgKHVyeCx1cnkpLCByZXNwZWN0aXZlbHkuCisgICAqCisgICAqICAgSWYgYHlNaW5gIGlzIG5lZ2F0aXZlLCB0aGlzIHZhbHVlIGdpdmVzIHRoZSBnbHlwaCdzIGRlc2NlbmRlci4KKyAgICogICBPdGhlcndpc2UsIHRoZSBnbHlwaCBkb2Vzbid0IGRlc2NlbmQgYmVsb3cgdGhlIGJhc2VsaW5lLiAgU2ltaWxhcmx5LAorICAgKiAgIGlmIGB5bWF4YCBpcyBwb3NpdGl2ZSwgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgZ2x5cGgncyBhc2NlbmRlci4KKyAgICoKKyAgICogICBgeE1pbmAgZ2l2ZXMgdGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgZ2x5cGgncyBvcmlnaW4gdG8gdGhlCisgICAqICAgbGVmdCBlZGdlIG9mIHRoZSBnbHlwaCdzIGJvdW5kaW5nIGJveC4gIElmIGB4TWluYCBpcyBuZWdhdGl2ZSwgdGhlCisgICAqICAgZ2x5cGggZXh0ZW5kcyB0byB0aGUgbGVmdCBvZiB0aGUgb3JpZ2luLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JCb3hfCiAgIHsKICAgICBGVF9Qb3MgIHhNaW4sIHlNaW47CkBAIC0xMjAsNjMgKzEyMyw2MCBAQAogICB9IEZUX0JCb3g7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QaXhlbF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBwaXhlbHMgaW4gYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYml0bWFwLiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUgYWRkZWQgaW4gdGhlICAgICovCi0gIC8qICAgIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzaW5nIDF+Yml0IHBlciBwaXhlbC4gIE5vdGUgdGhhdCBwaXhlbHMgICAgKi8KLSAgLyogICAgICBhcmUgc3RvcmVkIGluIG1vc3Qtc2lnbmlmaWNhbnQgb3JkZXIgKE1TQiksIHdoaWNoIG1lYW5zIHRoYXQgICAgICovCi0gIC8qICAgICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBpbiBhIGJ5dGUgaGFzIHZhbHVlIDEyOC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCBnZW5lcmFsbHkgdXNlZCB0byByZXByZXNlbnQgYW50aS1hbGlhc2VkIGdseXBoICAqLwotICAvKiAgICAgIGltYWdlcy4gIEVhY2ggcGl4ZWwgaXMgc3RvcmVkIGluIG9uZSBieXRlLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgKi8KLSAgLyogICAgICBvZiBgZ3JheScgbGV2ZWxzIGlzIHN0b3JlZCBpbiB0aGUgYG51bV9ncmF5cycgZmllbGQgb2YgdGhlICAgICAgICovCi0gIC8qICAgICAgQEZUX0JpdG1hcCBzdHJ1Y3R1cmUgKGl0IGdlbmVyYWxseSBpcyAyNTYpLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSAyLWJpdCBwZXIgcGl4ZWwgYml0bWFwLCB1c2VkIHRvIHJlcHJlc2VudCBlbWJlZGRlZCAgICAgICAgICAgICAqLwotICAvKiAgICAgIGFudGktYWxpYXNlZCBiaXRtYXBzIGluIGZvbnQgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuVHlwZSAgICAgKi8KLSAgLyogICAgICBzcGVjaWZpY2F0aW9uLiAgV2UgaGF2ZW4ndCBmb3VuZCBhIHNpbmdsZSBmb250IHVzaW5nIHRoaXMgICAgICAgICovCi0gIC8qICAgICAgZm9ybWF0LCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZNCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSA0LWJpdCBwZXIgcGl4ZWwgYml0bWFwLCByZXByZXNlbnRpbmcgZW1iZWRkZWQgYW50aS1hbGlhc2VkICAgICAqLwotICAvKiAgICAgIGJpdG1hcHMgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgKi8KLSAgLyogICAgICBXZSBoYXZlbid0IGZvdW5kIGEgc2luZ2xlIGZvbnQgdXNpbmcgdGhpcyBmb3JtYXQsIGhvd2V2ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCi0gIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiBMQ0QgZGlzcGxheXM7IHRoZSBiaXRtYXAgaXMgdGhyZWUgdGltZXMgICAgICAqLwotICAvKiAgICAgIHdpZGVyIHRoYW4gdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlLiAgU2VlIGFsc28gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfUkVOREVSX01PREVfTENELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCi0gIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiByb3RhdGVkIExDRCBkaXNwbGF5czsgdGhlIGJpdG1hcCBpcyB0aHJlZSAgICAqLwotICAvKiAgICAgIHRpbWVzIHRhbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBnbHlwaCBpbWFnZS4gIFNlZSBhbHNvICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfUkVOREVSX01PREVfTENEX1YuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0JHUkEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBbU2luY2UgMi41XSBBbiBpbWFnZSB3aXRoIGZvdXIgOC1iaXQgY2hhbm5lbHMgcGVyIHBpeGVsLCAgICAgICAgICovCi0gIC8qICAgICAgcmVwcmVzZW50aW5nIGEgY29sb3IgaW1hZ2UgKHN1Y2ggYXMgZW1vdGljb25zKSB3aXRoIGFscGhhICAgICAgICAqLwotICAvKiAgICAgIGNoYW5uZWwuICBGb3IgZWFjaCBwaXhlbCwgdGhlIGZvcm1hdCBpcyBCR1JBLCB3aGljaCBtZWFucywgdGhlICAgKi8KLSAgLyogICAgICBibHVlIGNoYW5uZWwgY29tZXMgZmlyc3QgaW4gbWVtb3J5LiAgVGhlIGNvbG9yIGNoYW5uZWxzIGFyZSAgICAgICovCi0gIC8qICAgICAgcHJlLW11bHRpcGxpZWQgYW5kIGluIHRoZSBzUkdCIGNvbG9yc3BhY2UuICBGb3IgZXhhbXBsZSwgZnVsbCAgICAqLwotICAvKiAgICAgIHJlZCBhdCBoYWxmLXRyYW5zbHVjZW50IG9wYWNpdHkgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAgICAgICAgICAgKi8KLSAgLyogICAgICBgMDAsMDAsODAsODAnLCBub3QgYDAwLDAwLEZGLDgwJy4gIFNlZSBhbHNvIEBGVF9MT0FEX0NPTE9SLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfUGl4ZWxfTW9kZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgcGl4ZWxzIGluIGEgZ2l2ZW4KKyAgICogICBiaXRtYXAuICBOb3RlIHRoYXQgYWRkaXRpb25hbCBmb3JtYXRzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX1BJWEVMX01PREVfTk9ORSA6OgorICAgKiAgICAgVmFsdWV+MCBpcyByZXNlcnZlZC4KKyAgICoKKyAgICogICBGVF9QSVhFTF9NT0RFX01PTk8gOjoKKyAgICogICAgIEEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzaW5nIDF+Yml0IHBlciBwaXhlbC4gIE5vdGUgdGhhdCBwaXhlbHMgYXJlCisgICAqICAgICBzdG9yZWQgaW4gbW9zdC1zaWduaWZpY2FudCBvcmRlciAoTVNCKSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUKKyAgICogICAgIGxlZnQtbW9zdCBwaXhlbCBpbiBhIGJ5dGUgaGFzIHZhbHVlIDEyOC4KKyAgICoKKyAgICogICBGVF9QSVhFTF9NT0RFX0dSQVkgOjoKKyAgICogICAgIEFuIDgtYml0IGJpdG1hcCwgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFudGktYWxpYXNlZCBnbHlwaAorICAgKiAgICAgaW1hZ2VzLiAgRWFjaCBwaXhlbCBpcyBzdG9yZWQgaW4gb25lIGJ5dGUuICBOb3RlIHRoYXQgdGhlIG51bWJlciBvZgorICAgKiAgICAgJ2dyYXknIGxldmVscyBpcyBzdG9yZWQgaW4gdGhlIGBudW1fZ3JheXNgIGZpZWxkIG9mIHRoZSBARlRfQml0bWFwCisgICAqICAgICBzdHJ1Y3R1cmUgKGl0IGdlbmVyYWxseSBpcyAyNTYpLgorICAgKgorICAgKiAgIEZUX1BJWEVMX01PREVfR1JBWTIgOjoKKyAgICogICAgIEEgMi1iaXQgcGVyIHBpeGVsIGJpdG1hcCwgdXNlZCB0byByZXByZXNlbnQgZW1iZWRkZWQgYW50aS1hbGlhc2VkCisgICAqICAgICBiaXRtYXBzIGluIGZvbnQgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgV2UKKyAgICogICAgIGhhdmVuJ3QgZm91bmQgYSBzaW5nbGUgZm9udCB1c2luZyB0aGlzIGZvcm1hdCwgaG93ZXZlci4KKyAgICoKKyAgICogICBGVF9QSVhFTF9NT0RFX0dSQVk0IDo6CisgICAqICAgICBBIDQtYml0IHBlciBwaXhlbCBiaXRtYXAsIHJlcHJlc2VudGluZyBlbWJlZGRlZCBhbnRpLWFsaWFzZWQgYml0bWFwcworICAgKiAgICAgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICBXZSBoYXZlbid0CisgICAqICAgICBmb3VuZCBhIHNpbmdsZSBmb250IHVzaW5nIHRoaXMgZm9ybWF0LCBob3dldmVyLgorICAgKgorICAgKiAgIEZUX1BJWEVMX01PREVfTENEIDo6CisgICAqICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgdXNlZAorICAgKiAgICAgZm9yIGRpc3BsYXkgb24gTENEIGRpc3BsYXlzOyB0aGUgYml0bWFwIGlzIHRocmVlIHRpbWVzIHdpZGVyIHRoYW4KKyAgICogICAgIHRoZSBvcmlnaW5hbCBnbHlwaCBpbWFnZS4gIFNlZSBhbHNvIEBGVF9SRU5ERVJfTU9ERV9MQ0QuCisgICAqCisgICAqICAgRlRfUElYRUxfTU9ERV9MQ0RfViA6OgorICAgKiAgICAgQW4gOC1iaXQgYml0bWFwLCByZXByZXNlbnRpbmcgUkdCIG9yIEJHUiBkZWNpbWF0ZWQgZ2x5cGggaW1hZ2VzIHVzZWQKKyAgICogICAgIGZvciBkaXNwbGF5IG9uIHJvdGF0ZWQgTENEIGRpc3BsYXlzOyB0aGUgYml0bWFwIGlzIHRocmVlIHRpbWVzCisgICAqICAgICB0YWxsZXIgdGhhbiB0aGUgb3JpZ2luYWwgZ2x5cGggaW1hZ2UuICBTZWUgYWxzbworICAgKiAgICAgQEZUX1JFTkRFUl9NT0RFX0xDRF9WLgorICAgKgorICAgKiAgIEZUX1BJWEVMX01PREVfQkdSQSA6OgorICAgKiAgICAgW1NpbmNlIDIuNV0gQW4gaW1hZ2Ugd2l0aCBmb3VyIDgtYml0IGNoYW5uZWxzIHBlciBwaXhlbCwKKyAgICogICAgIHJlcHJlc2VudGluZyBhIGNvbG9yIGltYWdlIChzdWNoIGFzIGVtb3RpY29ucykgd2l0aCBhbHBoYSBjaGFubmVsLgorICAgKiAgICAgRm9yIGVhY2ggcGl4ZWwsIHRoZSBmb3JtYXQgaXMgQkdSQSwgd2hpY2ggbWVhbnMsIHRoZSBibHVlIGNoYW5uZWwKKyAgICogICAgIGNvbWVzIGZpcnN0IGluIG1lbW9yeS4gIFRoZSBjb2xvciBjaGFubmVscyBhcmUgcHJlLW11bHRpcGxpZWQgYW5kIGluCisgICAqICAgICB0aGUgc1JHQiBjb2xvcnNwYWNlLiAgRm9yIGV4YW1wbGUsIGZ1bGwgcmVkIGF0IGhhbGYtdHJhbnNsdWNlbnQKKyAgICogICAgIG9wYWNpdHkgd2lsbCBiZSByZXByZXNlbnRlZCBhcyAnMDAsMDAsODAsODAnLCBub3QgJzAwLDAwLEZGLDgwJy4KKyAgICogICAgIFNlZSBhbHNvIEBGVF9MT0FEX0NPTE9SLgorICAgKi8KICAgdHlwZWRlZiBlbnVtICBGVF9QaXhlbF9Nb2RlXwogICB7CiAgICAgRlRfUElYRUxfTU9ERV9OT05FID0gMCwKQEAgLTE5Myw3ICsxOTMsNyBAQAogICB9IEZUX1BpeGVsX01vZGU7CiAKIAotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfUGl4ZWxfTW9kZScgKi8KKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX1BpeGVsX01vZGVgICovCiAgIC8qIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBmdF9waXhlbF9tb2RlX25vbmUgICBGVF9QSVhFTF9NT0RFX05PTkUKICNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9tb25vICAgRlRfUElYRUxfTU9ERV9NT05PCkBAIC0yMDIsNjIgKzIwMiw2MSBAQAogI2RlZmluZSBmdF9waXhlbF9tb2RlX3BhbDQgICBGVF9QSVhFTF9NT0RFX0dSQVk0CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgYml0bWFwIG9yIHBpeG1hcCB0byB0aGUgcmFzdGVyLiAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBtYW5hZ2UgcGl4bWFwcyBvZiB2YXJpb3VzIGRlcHRocyB0aHJvdWdoIHRoZSAgICAgICovCi0gIC8qICAgIGBwaXhlbF9tb2RlJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvd3MgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGJpdG1hcCByb3dzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGJpdG1hcCByb3cuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXRjaCAgICAgICAgOjogVGhlIHBpdGNoJ3MgYWJzb2x1dGUgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBieXRlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRha2VuIGJ5IG9uZSBiaXRtYXAgcm93LCBpbmNsdWRpbmcgcGFkZGluZy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCB0aGUgcGl0Y2ggaXMgcG9zaXRpdmUgd2hlbiB0aGUgYml0bWFwIGhhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYSBgZG93bicgZmxvdywgYW5kIG5lZ2F0aXZlIHdoZW4gaXQgaGFzIGFuIGB1cCcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZsb3cuICBJbiBhbGwgY2FzZXMsIHRoZSBwaXRjaCBpcyBhbiBvZmZzZXQgdG8gYWRkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0byBhIGJpdG1hcCBwb2ludGVyIGluIG9yZGVyIHRvIGdvIGRvd24gb25lIHJvdy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBgcGFkZGluZycgbWVhbnMgdGhlIGFsaWdubWVudCBvZiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBiaXRtYXAgdG8gYSBieXRlIGJvcmRlciwgYW5kIEZyZWVUeXBlIGZ1bmN0aW9ucyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbm9ybWFsbHkgYWxpZ24gdG8gdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGludGVnZXIgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBCL1cgcmFzdGVyaXplciwgYHBpdGNoJyBpcyBhbHdheXMgYW4gZXZlbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgVG8gY2hhbmdlIHRoZSBwaXRjaCBvZiBhIGJpdG1hcCAoc2F5LCB0byBtYWtlIGl0IGEgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIG9mIDQpLCB1c2UgQEZUX0JpdG1hcF9Db252ZXJ0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgbWlnaHQgdXNlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZGlyZWN0bHkgcmVuZGVyIHRvIHRoZSBhcHBsaWNhdGlvbidzIHN1cmZhY2U7IHNlZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGBleGFtcGxlMi5jcHAnIGluIHRoZSB0dXRvcmlhbCBmb3IgYSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBkZW1vbnN0cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgYml0bWFwIGJ1ZmZlci4gIFRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgYWxpZ25lZCBvbiAzMi1iaXQgYm91bmRhcmllcyBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbW9zdCBjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9ncmF5cyAgICA6OiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCB3aXRoICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX1BJWEVMX01PREVfR1JBWTsgaXQgZ2l2ZXMgdGhlIG51bWJlciBvZiBncmF5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGxldmVscyB1c2VkIGluIHRoZSBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbF9tb2RlICAgOjogVGhlIHBpeGVsIG1vZGUsIGkuZS4sIGhvdyBwaXhlbCBiaXRzIGFyZSBzdG9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIFNlZSBARlRfUGl4ZWxfTW9kZSBmb3IgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWxldHRlX21vZGUgOjogVGhpcyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgcGFsZXR0ZWQgcGl4ZWwgbW9kZXM7ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGl0IGluZGljYXRlcyBob3cgdGhlIHBhbGV0dGUgaXMgc3RvcmVkLiAgTm90ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB1c2VkIGN1cnJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFsZXR0ZSAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgYml0bWFwIHBhbGV0dGU7IHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgcGFsZXR0ZWQgcGl4ZWwgbW9kZXMuICBOb3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdXNlZCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0JpdG1hcAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGJpdG1hcCBvciBwaXhtYXAgdG8gdGhlIHJhc3Rlci4gIE5vdGUKKyAgICogICB0aGF0IHdlIG5vdyBtYW5hZ2UgcGl4bWFwcyBvZiB2YXJpb3VzIGRlcHRocyB0aHJvdWdoIHRoZSBgcGl4ZWxfbW9kZWAKKyAgICogICBmaWVsZC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICByb3dzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGJpdG1hcCByb3dzLgorICAgKgorICAgKiAgIHdpZHRoIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyBpbiBiaXRtYXAgcm93LgorICAgKgorICAgKiAgIHBpdGNoIDo6CisgICAqICAgICBUaGUgcGl0Y2gncyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIGJ5IG9uZQorICAgKiAgICAgYml0bWFwIHJvdywgaW5jbHVkaW5nIHBhZGRpbmcuICBIb3dldmVyLCB0aGUgcGl0Y2ggaXMgcG9zaXRpdmUgd2hlbgorICAgKiAgICAgdGhlIGJpdG1hcCBoYXMgYSAnZG93bicgZmxvdywgYW5kIG5lZ2F0aXZlIHdoZW4gaXQgaGFzIGFuICd1cCcgZmxvdy4KKyAgICogICAgIEluIGFsbCBjYXNlcywgdGhlIHBpdGNoIGlzIGFuIG9mZnNldCB0byBhZGQgdG8gYSBiaXRtYXAgcG9pbnRlciBpbgorICAgKiAgICAgb3JkZXIgdG8gZ28gZG93biBvbmUgcm93LgorICAgKgorICAgKiAgICAgTm90ZSB0aGF0ICdwYWRkaW5nJyBtZWFucyB0aGUgYWxpZ25tZW50IG9mIGEgYml0bWFwIHRvIGEgYnl0ZQorICAgKiAgICAgYm9yZGVyLCBhbmQgRnJlZVR5cGUgZnVuY3Rpb25zIG5vcm1hbGx5IGFsaWduIHRvIHRoZSBzbWFsbGVzdAorICAgKiAgICAgcG9zc2libGUgaW50ZWdlciB2YWx1ZS4KKyAgICoKKyAgICogICAgIEZvciB0aGUgQi9XIHJhc3Rlcml6ZXIsIGBwaXRjaGAgaXMgYWx3YXlzIGFuIGV2ZW4gbnVtYmVyLgorICAgKgorICAgKiAgICAgVG8gY2hhbmdlIHRoZSBwaXRjaCBvZiBhIGJpdG1hcCAoc2F5LCB0byBtYWtlIGl0IGEgbXVsdGlwbGUgb2YgNCksCisgICAqICAgICB1c2UgQEZUX0JpdG1hcF9Db252ZXJ0LiAgQWx0ZXJuYXRpdmVseSwgeW91IG1pZ2h0IHVzZSBjYWxsYmFjaworICAgKiAgICAgZnVuY3Rpb25zIHRvIGRpcmVjdGx5IHJlbmRlciB0byB0aGUgYXBwbGljYXRpb24ncyBzdXJmYWNlOyBzZWUgdGhlCisgICAqICAgICBmaWxlIGBleGFtcGxlMi5jcHBgIGluIHRoZSB0dXRvcmlhbCBmb3IgYSBkZW1vbnN0cmF0aW9uLgorICAgKgorICAgKiAgIGJ1ZmZlciA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgYnVmZmVyLiAgVGhpcyB2YWx1ZSBzaG91bGQgYmUKKyAgICogICAgIGFsaWduZWQgb24gMzItYml0IGJvdW5kYXJpZXMgaW4gbW9zdCBjYXNlcy4KKyAgICoKKyAgICogICBudW1fZ3JheXMgOjoKKyAgICogICAgIFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdpdGggQEZUX1BJWEVMX01PREVfR1JBWTsgaXQgZ2l2ZXMgdGhlCisgICAqICAgICBudW1iZXIgb2YgZ3JheSBsZXZlbHMgdXNlZCBpbiB0aGUgYml0bWFwLgorICAgKgorICAgKiAgIHBpeGVsX21vZGUgOjoKKyAgICogICAgIFRoZSBwaXhlbCBtb2RlLCBpLmUuLCBob3cgcGl4ZWwgYml0cyBhcmUgc3RvcmVkLiAgU2VlIEBGVF9QaXhlbF9Nb2RlCisgICAqICAgICBmb3IgcG9zc2libGUgdmFsdWVzLgorICAgKgorICAgKiAgIHBhbGV0dGVfbW9kZSA6OgorICAgKiAgICAgVGhpcyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgcGFsZXR0ZWQgcGl4ZWwgbW9kZXM7IGl0IGluZGljYXRlcyBob3cKKyAgICogICAgIHRoZSBwYWxldHRlIGlzIHN0b3JlZC4gIE5vdCB1c2VkIGN1cnJlbnRseS4KKyAgICoKKyAgICogICBwYWxldHRlIDo6CisgICAqICAgICBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwYWxldHRlOyB0aGlzIGZpZWxkIGlzIGludGVuZGVkIGZvcgorICAgKiAgICAgcGFsZXR0ZWQgcGl4ZWwgbW9kZXMuICBOb3QgdXNlZCBjdXJyZW50bHkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwXwogICB7CiAgICAgdW5zaWduZWQgaW50ICAgIHJvd3M7CkBAIC0yNzIsNjUgKzI3MSw2OCBAQAogICB9IEZUX0JpdG1hcDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBvdXRsaW5lX3Byb2Nlc3NpbmcKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUgdG8gdGhlIHNjYW4tbGluZSAgICAgKi8KLSAgLyogICAgY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbl9jb250b3VycyA6OiBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuX3BvaW50cyAgIDo6IFRoZSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50cyAgICAgOjogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGBuX3BvaW50cycgQEZUX1ZlY3RvciAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLCBnaXZpbmcgdGhlIG91dGxpbmUncyBwb2ludCBjb29yZGluYXRlcy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZ3MgICAgICAgOjogQSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGBuX3BvaW50cycgY2hhcnMsIGdpdmluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGVhY2ggb3V0bGluZSBwb2ludCdzIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSWYgYml0fjAgaXMgdW5zZXQsIHRoZSBwb2ludCBpcyBgb2ZmJyB0aGUgY3VydmUsICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGkuZS4sIGEgQmV6aWVyIGNvbnRyb2wgcG9pbnQsIHdoaWxlIGl0IGlzIGBvbicgaWYgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJpdH4xIGlzIG1lYW5pbmdmdWwgZm9yIGBvZmYnIHBvaW50cyBvbmx5LiAgSWYgc2V0LCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpdCBpbmRpY2F0ZXMgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGNvbnRyb2wgcG9pbnQ7ICovCi0gIC8qICAgICAgICAgICAgICAgICAgYW5kIGEgc2Vjb25kLW9yZGVyIGNvbnRyb2wgcG9pbnQgaWYgdW5zZXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJZiBiaXR+MiBpcyBzZXQsIGJpdHMgNS03IGNvbnRhaW4gdGhlIGRyb3Atb3V0IG1vZGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKGFzIGRlZmluZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb247IHRoZSB2YWx1ZSAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgU0NBTk1PREUgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJpdHMgMyBhbmR+NCBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHB1cnBvc2VzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRvdXJzICAgOjogQW4gYXJyYXkgb2YgYG5fY29udG91cnMnIHNob3J0cywgZ2l2aW5nIHRoZSBlbmQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHBvaW50IG9mIGVhY2ggY29udG91ciB3aXRoaW4gdGhlIG91dGxpbmUuICBGb3IgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBleGFtcGxlLCB0aGUgZmlyc3QgY29udG91ciBpcyBkZWZpbmVkIGJ5IHRoZSBwb2ludHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYDAnIHRvIGBjb250b3Vyc1swXScsIHRoZSBzZWNvbmQgb25lIGlzIGRlZmluZWQgYnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBwb2ludHMgYGNvbnRvdXJzWzBdKzEnIHRvIGBjb250b3Vyc1sxXScsIGV0Yy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHVzZWQgdG8gY2hhcmFjdGVyaXplIHRoZSBvdXRsaW5lICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFuZCBnaXZlIGhpbnRzIHRvIHRoZSBzY2FuLWNvbnZlcnRlciBhbmQgaGludGVyIG9uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBob3cgdG8gY29udmVydC9ncmlkLWZpdCBpdC4gIFNlZSBARlRfT1VUTElORV9YWFguICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEIvVyByYXN0ZXJpemVyIG9ubHkgY2hlY2tzIGJpdH4yIGluIHRoZSBgdGFncycgYXJyYXkgZm9yIHRoZSAgICovCi0gIC8qICAgIGZpcnN0IHBvaW50IG9mIGVhY2ggY29udG91ci4gIFRoZSBkcm9wLW91dCBtb2RlIGFzIGdpdmVuIHdpdGggICAgICAqLwotICAvKiAgICBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCBhbmQgICAgICAgKi8KLSAgLyogICAgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBpbiBgZmxhZ3MnIGlzIHRoZW4gb3ZlcnJpZGRlbi4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9PdXRsaW5lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUgdG8gdGhlIHNjYW4tbGluZQorICAgKiAgIGNvbnZlcnRlci4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBuX2NvbnRvdXJzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLgorICAgKgorICAgKiAgIG5fcG9pbnRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgb3V0bGluZS4KKyAgICoKKyAgICogICBwb2ludHMgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHNgIEBGVF9WZWN0b3IgZWxlbWVudHMsIGdpdmluZyB0aGUKKyAgICogICAgIG91dGxpbmUncyBwb2ludCBjb29yZGluYXRlcy4KKyAgICoKKyAgICogICB0YWdzIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYG5fcG9pbnRzYCBjaGFycywgZ2l2aW5nIGVhY2ggb3V0bGluZQorICAgKiAgICAgcG9pbnQncyB0eXBlLgorICAgKgorICAgKiAgICAgSWYgYml0fjAgaXMgdW5zZXQsIHRoZSBwb2ludCBpcyAnb2ZmJyB0aGUgY3VydmUsIGkuZS4sIGEgQmV6aWVyCisgICAqICAgICBjb250cm9sIHBvaW50LCB3aGlsZSBpdCBpcyAnb24nIGlmIHNldC4KKyAgICoKKyAgICogICAgIEJpdH4xIGlzIG1lYW5pbmdmdWwgZm9yICdvZmYnIHBvaW50cyBvbmx5LiAgSWYgc2V0LCBpdCBpbmRpY2F0ZXMgYQorICAgKiAgICAgdGhpcmQtb3JkZXIgQmV6aWVyIGFyYyBjb250cm9sIHBvaW50OyBhbmQgYSBzZWNvbmQtb3JkZXIgY29udHJvbAorICAgKiAgICAgcG9pbnQgaWYgdW5zZXQuCisgICAqCisgICAqICAgICBJZiBiaXR+MiBpcyBzZXQsIGJpdHMgNS03IGNvbnRhaW4gdGhlIGRyb3Atb3V0IG1vZGUgKGFzIGRlZmluZWQgaW4KKyAgICogICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uOyB0aGUgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IHRvCisgICAqICAgICB0aGUgJ1NDQU5NT0RFJyBpbnN0cnVjdGlvbikuCisgICAqCisgICAqICAgICBCaXRzIDMgYW5kfjQgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCBwdXJwb3Nlcy4KKyAgICoKKyAgICogICBjb250b3VycyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgYG5fY29udG91cnNgIHNob3J0cywgZ2l2aW5nIHRoZSBlbmQgcG9pbnQgb2YgZWFjaAorICAgKiAgICAgY29udG91ciB3aXRoaW4gdGhlIG91dGxpbmUuICBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGNvbnRvdXIgaXMKKyAgICogICAgIGRlZmluZWQgYnkgdGhlIHBvaW50cyAnMCcgdG8gYGNvbnRvdXJzWzBdYCwgdGhlIHNlY29uZCBvbmUgaXMKKyAgICogICAgIGRlZmluZWQgYnkgdGhlIHBvaW50cyBgY29udG91cnNbMF0rMWAgdG8gYGNvbnRvdXJzWzFdYCwgZXRjLgorICAgKgorICAgKiAgIGZsYWdzIDo6CisgICAqICAgICBBIHNldCBvZiBiaXQgZmxhZ3MgdXNlZCB0byBjaGFyYWN0ZXJpemUgdGhlIG91dGxpbmUgYW5kIGdpdmUgaGludHMKKyAgICogICAgIHRvIHRoZSBzY2FuLWNvbnZlcnRlciBhbmQgaGludGVyIG9uIGhvdyB0byBjb252ZXJ0L2dyaWQtZml0IGl0LiAgU2VlCisgICAqICAgICBARlRfT1VUTElORV9YWFguCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBCL1cgcmFzdGVyaXplciBvbmx5IGNoZWNrcyBiaXR+MiBpbiB0aGUgYHRhZ3NgIGFycmF5IGZvciB0aGUgZmlyc3QKKyAgICogICBwb2ludCBvZiBlYWNoIGNvbnRvdXIuICBUaGUgZHJvcC1vdXQgbW9kZSBhcyBnaXZlbiB3aXRoCisgICAqICAgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgYW5kCisgICAqICAgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBpbiBgZmxhZ3NgIGlzIHRoZW4gb3ZlcnJpZGRlbi4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lXwogICB7CiAgICAgc2hvcnQgICAgICAgbl9jb250b3VyczsgICAgICAvKiBudW1iZXIgb2YgY29udG91cnMgaW4gZ2x5cGggICAgICAgICovCkBAIC0zNTIsNzggKzM1NCw4MyBAQAogI2RlZmluZSBGVF9PVVRMSU5FX1BPSU5UU19NQVggICAgU0hSVF9NQVgKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZSBmb3IgdGhlIGZsYWdzIGluIGFuIG91dGxpbmUncyAgICAqLwotICAvKiAgICBgZmxhZ3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX05PTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBWYWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX09XTkVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBzZXQsIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgb3V0bGluZSdzIGZpZWxkIGFycmF5cyAgICAgICovCi0gIC8qICAgICAgKGkuZS4sIGBwb2ludHMnLCBgZmxhZ3MnLCBhbmQgYGNvbnRvdXJzJykgYXJlIGBvd25lZCcgYnkgdGhlICAgICAqLwotICAvKiAgICAgIG91dGxpbmUgb2JqZWN0LCBhbmQgc2hvdWxkIHRodXMgYmUgZnJlZWQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIG91dGxpbmVzIGFyZSBmaWxsZWQgdXNpbmcgdGhlIG5vbi16ZXJvIHdpbmRpbmcgcnVsZS4gKi8KLSAgLyogICAgICBJZiBzZXQgdG8gMSwgdGhlIG91dGxpbmUgd2lsbCBiZSBmaWxsZWQgdXNpbmcgdGhlIGV2ZW4tb2RkIGZpbGwgICovCi0gIC8qICAgICAgcnVsZSAob25seSB3b3JrcyB3aXRoIHRoZSBzbW9vdGggcmFzdGVyaXplcikuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQnkgZGVmYXVsdCwgb3V0c2lkZSBjb250b3VycyBvZiBhbiBvdXRsaW5lIGFyZSBvcmllbnRlZCBpbiAgICAgICAqLwotICAvKiAgICAgIGNsb2NrLXdpc2UgZGlyZWN0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBvdXRsaW5lIHVzZXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbiAgICAgICovCi0gIC8qICAgICAgKHR5cGljYWxseSBmb3IgVHlwZX4xIGZvbnRzKS4gIFRoaXMgZmxhZyBpcyBpZ25vcmVkIGJ5IHRoZSBzY2FuICAqLwotICAvKiAgICAgIGNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEJ5IGRlZmF1bHQsIHRoZSBzY2FuIGNvbnZlcnRlciB3aWxsIHRyeSB0byBkZXRlY3QgZHJvcC1vdXRzIGluICAgKi8KLSAgLyogICAgICBhbiBvdXRsaW5lIGFuZCBjb3JyZWN0IHRoZSBnbHlwaCBiaXRtYXAgdG8gZW5zdXJlIGNvbnNpc3RlbnQgICAgICovCi0gIC8qICAgICAgc2hhcGUgY29udGludWl0eS4gIElmIHNldCwgdGhpcyBmbGFnIGhpbnRzIHRoZSBzY2FuLWxpbmUgICAgICAgICAqLwotICAvKiAgICAgIGNvbnZlcnRlciB0byBpZ25vcmUgc3VjaCBjYXNlcy4gIFNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNlbGVjdCBzbWFydCBkcm9wb3V0IGNvbnRyb2wuICBJZiB1bnNldCwgdXNlIHNpbXBsZSBkcm9wb3V0ICAgICAgKi8KLSAgLyogICAgICBjb250cm9sLiAgSWdub3JlZCBpZiBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaXMgc2V0LiAgU2VlICAgICovCi0gIC8qICAgICAgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9JTkNMVURFX1NUVUJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgc2V0LCB0dXJuIHBpeGVscyBvbiBmb3IgYHN0dWJzJywgb3RoZXJ3aXNlIGV4Y2x1ZGUgdGhlbS4gICAgICAqLwotICAvKiAgICAgIElnbm9yZWQgaWYgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIGlzIHNldC4gIFNlZSBiZWxvdyBmb3IgICAgKi8KLSAgLyogICAgICBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgc2hvdWxkIHRyeSB0byAgICovCi0gIC8qICAgICAgY29udmVydCB0aGlzIG91dGxpbmUgdG8gYml0bWFwcyB3aXRoIHRoZSBoaWdoZXN0IHBvc3NpYmxlICAgICAgICAqLwotICAvKiAgICAgIHF1YWxpdHkuICBJdCBpcyB0eXBpY2FsbHkgc2V0IGZvciBzbWFsbCBjaGFyYWN0ZXIgc2l6ZXMuICBOb3RlICAgKi8KLSAgLyogICAgICB0aGF0IHRoaXMgaXMgb25seSBhIGhpbnQgdGhhdCBtaWdodCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSAgICovCi0gIC8qICAgICAgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9TSU5HTEVfUEFTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBmbGFnIGlzIHNldCB0byBmb3JjZSBhIGdpdmVuIHNjYW4tY29udmVydGVyIHRvIG9ubHkgdXNlIGEgICAqLwotICAvKiAgICAgIHNpbmdsZSBwYXNzIG92ZXIgdGhlIG91dGxpbmUgdG8gcmVuZGVyIGEgYml0bWFwIGdseXBoIGltYWdlLiAgICAgKi8KLSAgLyogICAgICBOb3JtYWxseSwgaXQgaXMgc2V0IGZvciB2ZXJ5IGxhcmdlIGNoYXJhY3RlciBzaXplcy4gIEl0IGlzIG9ubHkgICovCi0gIC8qICAgICAgYSBoaW50IHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNjYW4tY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmxhZ3MgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTLCBARlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUywgKi8KLSAgLyogICAgYW5kIEBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgYXJlIGlnbm9yZWQgYnkgdGhlIHNtb290aCAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcml6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgZXhpc3RzIGEgc2Vjb25kIG1lY2hhbmlzbSB0byBwYXNzIHRoZSBkcm9wLW91dCBtb2RlIHRvIHRoZSAgICovCi0gIC8qICAgIEIvVyByYXN0ZXJpemVyOyBzZWUgdGhlIGB0YWdzJyBmaWVsZCBpbiBARlRfT3V0bGluZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYFNDQU5UWVBFJyBpbnN0cnVjdGlvbiBpbiAgICovCi0gIC8qICAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIChpbiBmaWxlIGB0dGluc3QxLmRvYycpIGhvdyBzaW1wbGUgICAgICAqLwotICAvKiAgICBkcm9wLW91dHMsIHNtYXJ0IGRyb3Atb3V0cywgYW5kIHN0dWJzIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9PVVRMSU5FX1hYWAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCBmb3IgdGhlIGZsYWdzIGluIGFuIG91dGxpbmUncworICAgKiAgIGBmbGFnc2AgZmllbGQuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfT1VUTElORV9OT05FIDo6CisgICAqICAgICBWYWx1ZX4wIGlzIHJlc2VydmVkLgorICAgKgorICAgKiAgIEZUX09VVExJTkVfT1dORVIgOjoKKyAgICogICAgIElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBvdXRsaW5lJ3MgZmllbGQgYXJyYXlzIChpLmUuLAorICAgKiAgICAgYHBvaW50c2AsIGBmbGFnc2AsIGFuZCBgY29udG91cnNgKSBhcmUgJ293bmVkJyBieSB0aGUgb3V0bGluZQorICAgKiAgICAgb2JqZWN0LCBhbmQgc2hvdWxkIHRodXMgYmUgZnJlZWQgd2hlbiBpdCBpcyBkZXN0cm95ZWQuCisgICAqCisgICAqICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMIDo6CisgICAqICAgICBCeSBkZWZhdWx0LCBvdXRsaW5lcyBhcmUgZmlsbGVkIHVzaW5nIHRoZSBub24temVybyB3aW5kaW5nIHJ1bGUuICBJZgorICAgKiAgICAgc2V0IHRvIDEsIHRoZSBvdXRsaW5lIHdpbGwgYmUgZmlsbGVkIHVzaW5nIHRoZSBldmVuLW9kZCBmaWxsIHJ1bGUKKyAgICogICAgIChvbmx5IHdvcmtzIHdpdGggdGhlIHNtb290aCByYXN0ZXJpemVyKS4KKyAgICoKKyAgICogICBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCA6OgorICAgKiAgICAgQnkgZGVmYXVsdCwgb3V0c2lkZSBjb250b3VycyBvZiBhbiBvdXRsaW5lIGFyZSBvcmllbnRlZCBpbgorICAgKiAgICAgY2xvY2std2lzZSBkaXJlY3Rpb24sIGFzIGRlZmluZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uCisgICAqICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHRoZSBvdXRsaW5lIHVzZXMgdGhlIG9wcG9zaXRlIGRpcmVjdGlvbgorICAgKiAgICAgKHR5cGljYWxseSBmb3IgVHlwZX4xIGZvbnRzKS4gIFRoaXMgZmxhZyBpcyBpZ25vcmVkIGJ5IHRoZSBzY2FuCisgICAqICAgICBjb252ZXJ0ZXIuCisgICAqCisgICAqICAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgOjoKKyAgICogICAgIEJ5IGRlZmF1bHQsIHRoZSBzY2FuIGNvbnZlcnRlciB3aWxsIHRyeSB0byBkZXRlY3QgZHJvcC1vdXRzIGluIGFuCisgICAqICAgICBvdXRsaW5lIGFuZCBjb3JyZWN0IHRoZSBnbHlwaCBiaXRtYXAgdG8gZW5zdXJlIGNvbnNpc3RlbnQgc2hhcGUKKyAgICogICAgIGNvbnRpbnVpdHkuICBJZiBzZXQsIHRoaXMgZmxhZyBoaW50cyB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciB0bworICAgKiAgICAgaWdub3JlIHN1Y2ggY2FzZXMuICBTZWUgYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAqCisgICAqICAgRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyA6OgorICAgKiAgICAgU2VsZWN0IHNtYXJ0IGRyb3BvdXQgY29udHJvbC4gIElmIHVuc2V0LCB1c2Ugc2ltcGxlIGRyb3BvdXQgY29udHJvbC4KKyAgICogICAgIElnbm9yZWQgaWYgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIGlzIHNldC4gIFNlZSBiZWxvdyBmb3IgbW9yZQorICAgKiAgICAgaW5mb3JtYXRpb24uCisgICAqCisgICAqICAgRlRfT1VUTElORV9JTkNMVURFX1NUVUJTIDo6CisgICAqICAgICBJZiBzZXQsIHR1cm4gcGl4ZWxzIG9uIGZvciAnc3R1YnMnLCBvdGhlcndpc2UgZXhjbHVkZSB0aGVtLiAgSWdub3JlZAorICAgKiAgICAgaWYgQEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTIGlzIHNldC4gIFNlZSBiZWxvdyBmb3IgbW9yZQorICAgKiAgICAgaW5mb3JtYXRpb24uCisgICAqCisgICAqICAgRlRfT1VUTElORV9PVkVSTEFQIDo6CisgICAqICAgICBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhpcyBvdXRsaW5lIGNvbnRhaW5zIG92ZXJsYXBwaW5nIGNvbnRyb3VycworICAgKiAgICAgYW5kIHRoZSBhbnRpLWFsaWFzZWQgcmVuZGVyZXIgc2hvdWxkIHBlcmZvcm0gb3ZlcnNhbXBsaW5nIHRvCisgICAqICAgICBtaXRpZ2F0ZSBwb3NzaWJsZSBhcnRpZmFjdHMuICBUaGlzIGZsYWcgc2hvdWxkIF9ub3RfIGJlIHNldCBmb3IKKyAgICogICAgIHdlbGwgZGVzaWduZWQgZ2x5cGhzIHdpdGhvdXQgb3ZlcmxhcHMgYmVjYXVzZSBpdCBxdWFkcnVwbGVzIHRoZQorICAgKiAgICAgcmVuZGVyaW5nIHRpbWUuCisgICAqCisgICAqICAgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiA6OgorICAgKiAgICAgVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBzY2FuLWxpbmUgY29udmVydGVyIHNob3VsZCB0cnkgdG8KKyAgICogICAgIGNvbnZlcnQgdGhpcyBvdXRsaW5lIHRvIGJpdG1hcHMgd2l0aCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBxdWFsaXR5LgorICAgKiAgICAgSXQgaXMgdHlwaWNhbGx5IHNldCBmb3Igc21hbGwgY2hhcmFjdGVyIHNpemVzLiAgTm90ZSB0aGF0IHRoaXMgaXMKKyAgICogICAgIG9ubHkgYSBoaW50IHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4KKyAgICogICAgIHNjYW4tY29udmVydGVyLgorICAgKgorICAgKiAgIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgOjoKKyAgICogICAgIFRoaXMgZmxhZyBpcyBzZXQgdG8gZm9yY2UgYSBnaXZlbiBzY2FuLWNvbnZlcnRlciB0byBvbmx5IHVzZSBhCisgICAqICAgICBzaW5nbGUgcGFzcyBvdmVyIHRoZSBvdXRsaW5lIHRvIHJlbmRlciBhIGJpdG1hcCBnbHlwaCBpbWFnZS4KKyAgICogICAgIE5vcm1hbGx5LCBpdCBpcyBzZXQgZm9yIHZlcnkgbGFyZ2UgY2hhcmFjdGVyIHNpemVzLiAgSXQgaXMgb25seSBhCisgICAqICAgICBoaW50IHRoYXQgbWlnaHQgYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmbGFncyBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCBhbmQKKyAgICogICBARlRfT1VUTElORV9JTkNMVURFX1NUVUJTIGFyZSBpZ25vcmVkIGJ5IHRoZSBzbW9vdGggcmFzdGVyaXplci4KKyAgICoKKyAgICogICBUaGVyZSBleGlzdHMgYSBzZWNvbmQgbWVjaGFuaXNtIHRvIHBhc3MgdGhlIGRyb3Atb3V0IG1vZGUgdG8gdGhlIEIvVworICAgKiAgIHJhc3Rlcml6ZXI7IHNlZSB0aGUgYHRhZ3NgIGZpZWxkIGluIEBGVF9PdXRsaW5lLgorICAgKgorICAgKiAgIFBsZWFzZSByZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICdTQ0FOVFlQRScgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgICAqICAgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAoaW4gZmlsZSBgdHRpbnN0MS5kb2NgKSBob3cgc2ltcGxlIGRyb3Atb3V0cywKKyAgICogICBzbWFydCBkcm9wLW91dHMsIGFuZCBzdHVicyBhcmUgZGVmaW5lZC4KKyAgICovCiAjZGVmaW5lIEZUX09VVExJTkVfTk9ORSAgICAgICAgICAgICAweDAKICNkZWZpbmUgRlRfT1VUTElORV9PV05FUiAgICAgICAgICAgIDB4MQogI2RlZmluZSBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgICAgMHgyCkBAIC00MzEsMTMgKzQzOCwxNCBAQAogI2RlZmluZSBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyAgMHg4CiAjZGVmaW5lIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgICAweDEwCiAjZGVmaW5lIEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyAgICAweDIwCisjZGVmaW5lIEZUX09VVExJTkVfT1ZFUkxBUCAgICAgICAgICAweDQwCiAKICNkZWZpbmUgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiAgIDB4MTAwCiAjZGVmaW5lIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgICAgICAweDIwMAogCiAKICAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX09VVExJTkVfWFhYJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYEZUX09VVExJTkVfWFhYYCB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfb3V0bGluZV9ub25lICAgICAgICAgICAgIEZUX09VVExJTkVfTk9ORQogI2RlZmluZSBmdF9vdXRsaW5lX293bmVyICAgICAgICAgICAgRlRfT1VUTElORV9PV05FUgogI2RlZmluZSBmdF9vdXRsaW5lX2V2ZW5fb2RkX2ZpbGwgICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMCkBAIC00NDgsMjAgKzQ1NiwyNSBAQAogCiAgIC8qICovCiAKLSNkZWZpbmUgRlRfQ1VSVkVfVEFHKCBmbGFnICkgICggZmxhZyAmIDMgKQorI2RlZmluZSBGVF9DVVJWRV9UQUcoIGZsYWcgKSAgKCBmbGFnICYgMHgwMyApCiAKLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAgMQotI2RlZmluZSBGVF9DVVJWRV9UQUdfQ09OSUMgICAgICAgICAwCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19DVUJJQyAgICAgICAgIDIKKyAgLyogc2VlIHRoZSBgdGFnc2AgZmllbGQgaW4gYEZUX091dGxpbmVgIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRlRfQ1VSVkVfVEFHX09OICAgICAgICAgICAgMHgwMQorI2RlZmluZSBGVF9DVVJWRV9UQUdfQ09OSUMgICAgICAgICAweDAwCisjZGVmaW5lIEZUX0NVUlZFX1RBR19DVUJJQyAgICAgICAgIDB4MDIKIAotI2RlZmluZSBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFICA0CisjZGVmaW5lIEZUX0NVUlZFX1RBR19IQVNfU0NBTk1PREUgIDB4MDQKIAotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWCAgICAgICA4ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLwotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWSAgICAgIDE2ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLworI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWCAgICAgICAweDA4ICAvKiByZXNlcnZlZCBmb3IgVHJ1ZVR5cGUgaGludGVyICovCisjZGVmaW5lIEZUX0NVUlZFX1RBR19UT1VDSF9ZICAgICAgIDB4MTAgIC8qIHJlc2VydmVkIGZvciBUcnVlVHlwZSBoaW50ZXIgKi8KIAogI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfQk9USCAgICAoIEZUX0NVUlZFX1RBR19UT1VDSF9YIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkKKyAgLyogdmFsdWVzIDB4MjAsIDB4NDAsIGFuZCAweDgwIGFyZSByZXNlcnZlZCAqLwogCisKKyAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KKyAgLyogYEZUX0NVUlZFX1RBR19YWFhgIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgRlRfQ3VydmVfVGFnX09uICAgICAgIEZUX0NVUlZFX1RBR19PTgogI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ29uaWMgICAgRlRfQ1VSVkVfVEFHX0NPTklDCiAjZGVmaW5lIEZUX0N1cnZlX1RhZ19DdWJpYyAgICBGVF9DVVJWRV9UQUdfQ1VCSUMKQEAgLTQ2OSwyNiArNDgyLDI4IEBACiAjZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9ZICBGVF9DVVJWRV9UQUdfVE9VQ0hfWQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYG1vdmUgICovCi0gIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nL2RlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBgbW92ZSB0bycgaXMgZW1pdHRlZCB0byBzdGFydCBhIG5ldyBjb250b3VyIGluIGFuIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb2ludCBvZiB0aGUgYG1vdmUgdG8nLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX091dGxpbmVfTW92ZVRvRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgJ21vdmUgdG8nCisgICAqICAgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLgorICAgKgorICAgKiAgIEEgJ21vdmUgdG8nIGlzIGVtaXR0ZWQgdG8gc3RhcnQgYSBuZXcgY29udG91ciBpbiBhbiBvdXRsaW5lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSAnbW92ZSB0bycuCisgICAqCisgICAqICAgdXNlciA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mIHRoZQorICAgKiAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgdHlwZWRlZiBpbnQKICAgKCpGVF9PdXRsaW5lX01vdmVUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7CkBAIC00OTYsMjYgKzUxMSwyOCBAQAogI2RlZmluZSBGVF9PdXRsaW5lX01vdmVUb19GdW5jICBGVF9PdXRsaW5lX01vdmVUb0Z1bmMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTGluZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBsaW5lICAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGxpbmUgdG8nIGlzIGVtaXR0ZWQgdG8gaW5kaWNhdGUgYSBzZWdtZW50IGluIHRoZSBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgcG9pbnQgb2YgdGhlIGBsaW5lIHRvJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhICdsaW5lIHRvJworICAgKiAgIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4KKyAgICoKKyAgICogICBBICdsaW5lIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2VnbWVudCBpbiB0aGUgb3V0bGluZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHRvIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBwb2ludCBvZiB0aGUgJ2xpbmUgdG8nLgorICAgKgorICAgKiAgIHVzZXIgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUKKyAgICogICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHR5cGVkZWYgaW50CiAgICgqRlRfT3V0bGluZV9MaW5lVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwpAQCAtNTIzLDMwICs1NDAsMzMgQEAKICNkZWZpbmUgRlRfT3V0bGluZV9MaW5lVG9fRnVuYyAgRlRfT3V0bGluZV9MaW5lVG9GdW5jCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgY29uaWMgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcgb3IgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBjb25pYyB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHNlY29uZC1vcmRlciBCZXppZXIgYXJjIGluICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbCA6OiBBbiBpbnRlcm1lZGlhdGUgY29udHJvbCBwb2ludCBiZXR3ZWVuIHRoZSBsYXN0IHBvc2l0aW9uICovCi0gIC8qICAgICAgICAgICAgICAgYW5kIHRoZSBuZXcgdGFyZ2V0IGluIGB0bycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQgb2YgdGhlIGNvbmljIGFyYy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAgKi8KLSAgLyogICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhICdjb25pYyB0bycKKyAgICogICBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nIG9yIGRlY29tcG9zaXRpb24uCisgICAqCisgICAqICAgQSAnY29uaWMgdG8nIGlzIGVtaXR0ZWQgdG8gaW5kaWNhdGUgYSBzZWNvbmQtb3JkZXIgQmV6aWVyIGFyYyBpbiB0aGUKKyAgICogICBvdXRsaW5lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY29udHJvbCA6OgorICAgKiAgICAgQW4gaW50ZXJtZWRpYXRlIGNvbnRyb2wgcG9pbnQgYmV0d2VlbiB0aGUgbGFzdCBwb3NpdGlvbiBhbmQgdGhlIG5ldworICAgKiAgICAgdGFyZ2V0IGluIGB0b2AuCisgICAqCisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludCBvZiB0aGUgY29uaWMgYXJjLgorICAgKgorICAgKiAgIHVzZXIgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiB0aGUKKyAgICogICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHR5cGVkZWYgaW50CiAgICgqRlRfT3V0bGluZV9Db25pY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLApAQCAtNTU1LDMwICs1NzUsMzQgQEAKICNkZWZpbmUgRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjdWJpYyAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZyBvciBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGN1YmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgdGhpcmQtb3JkZXIgQmV6aWVyIGFyYy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wxIDo6IEEgcG9pbnRlciB0byB0aGUgZmlyc3QgQmV6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29udHJvbDIgOjogQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgQmV6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgJ2N1YmljIHRvJworICAgKiAgIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcgb3IgZGVjb21wb3NpdGlvbi4KKyAgICoKKyAgICogICBBICdjdWJpYyB0bycgaXMgZW1pdHRlZCB0byBpbmRpY2F0ZSBhIHRoaXJkLW9yZGVyIEJlemllciBhcmMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBjb250cm9sMSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBCZXppZXIgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogICBjb250cm9sMiA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgQmV6aWVyIGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludC4KKyAgICoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlCisgICAqICAgICBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICB0eXBlZGVmIGludAogICAoKkZUX091dGxpbmVfQ3ViaWNUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgY29udHJvbDIsCkBAIC01ODgsNDMgKzYxMiw0OSBAQAogI2RlZmluZSBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB2YXJpb3VzIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgZHVyaW5nIG91dGxpbmUgICovCi0gIC8qICAgIGRlY29tcG9zaXRpb24gaW4gb3JkZXIgdG8gZW1pdCBzZWdtZW50cywgY29uaWMsIGFuZCBjdWJpYyBCZXppZXJzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vdmVfdG8gIDo6IFRoZSBgbW92ZSB0bycgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGluZV90byAgOjogVGhlIHNlZ21lbnQgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb25pY190byA6OiBUaGUgc2Vjb25kLW9yZGVyIEJlemllciBhcmMgZW1pdHRlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1YmljX3RvIDo6IFRoZSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2hpZnQgICAgOjogVGhlIHNoaWZ0IHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgICAgOjogVGhlIGRlbHRhIHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLCBidXQgYWZ0ZXIgdGhlIHNoaWZ0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBzZW50IHRvIHRoZSBlbWl0dGVycyBhcmUgdGhlIHRyYW5zZm9ybWVkICAgICAqLwotICAvKiAgICB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlcyAodGhpcyBpcyBpbXBvcnRhbnQgZm9yIGhpZ2ggICAgKi8KLSAgLyogICAgYWNjdXJhY3kgZHVyaW5nIHNjYW4tY29udmVyc2lvbikuICBUaGUgdHJhbnNmb3JtYXRpb24gaXMgc2ltcGxlOiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB4JyA9ICh4IDw8IHNoaWZ0KSAtIGRlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeScgPSAoeSA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgdmFsdWVzIG9mIGBzaGlmdCcgYW5kIGBkZWx0YScgdG9+MCB0byBnZXQgdGhlIG9yaWdpbmFsICAgICAqLwotICAvKiAgICBwb2ludCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX091dGxpbmVfRnVuY3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIGhvbGQgdmFyaW91cyBmdW5jdGlvbiBwb2ludGVycyB1c2VkIGR1cmluZyBvdXRsaW5lCisgICAqICAgZGVjb21wb3NpdGlvbiBpbiBvcmRlciB0byBlbWl0IHNlZ21lbnRzLCBjb25pYywgYW5kIGN1YmljIEJlemllcnMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbW92ZV90byA6OgorICAgKiAgICAgVGhlICdtb3ZlIHRvJyBlbWl0dGVyLgorICAgKgorICAgKiAgIGxpbmVfdG8gOjoKKyAgICogICAgIFRoZSBzZWdtZW50IGVtaXR0ZXIuCisgICAqCisgICAqICAgY29uaWNfdG8gOjoKKyAgICogICAgIFRoZSBzZWNvbmQtb3JkZXIgQmV6aWVyIGFyYyBlbWl0dGVyLgorICAgKgorICAgKiAgIGN1YmljX3RvIDo6CisgICAqICAgICBUaGUgdGhpcmQtb3JkZXIgQmV6aWVyIGFyYyBlbWl0dGVyLgorICAgKgorICAgKiAgIHNoaWZ0IDo6CisgICAqICAgICBUaGUgc2hpZnQgdGhhdCBpcyBhcHBsaWVkIHRvIGNvb3JkaW5hdGVzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIHRoZQorICAgKiAgICAgZW1pdHRlci4KKyAgICoKKyAgICogICBkZWx0YSA6OgorICAgKiAgICAgVGhlIGRlbHRhIHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSBhcmUgc2VudCB0byB0aGUKKyAgICogICAgIGVtaXR0ZXIsIGJ1dCBhZnRlciB0aGUgc2hpZnQuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBzZW50IHRvIHRoZSBlbWl0dGVycyBhcmUgdGhlIHRyYW5zZm9ybWVkIHZlcnNpb24KKyAgICogICBvZiB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgKHRoaXMgaXMgaW1wb3J0YW50IGZvciBoaWdoIGFjY3VyYWN5CisgICAqICAgZHVyaW5nIHNjYW4tY29udmVyc2lvbikuICBUaGUgdHJhbnNmb3JtYXRpb24gaXMgc2ltcGxlOgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgeCcgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YQorICAgKiAgICAgeScgPSAoeSA8PCBzaGlmdCkgLSBkZWx0YQorICAgKiAgIGBgYAorICAgKgorICAgKiAgIFNldCB0aGUgdmFsdWVzIG9mIGBzaGlmdGAgYW5kIGBkZWx0YWAgdG9+MCB0byBnZXQgdGhlIG9yaWdpbmFsIHBvaW50CisgICAqICAgY29vcmRpbmF0ZXMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV9GdW5jc18KICAgewogICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgIG1vdmVfdG87CkBAIC02MzgsMzMgKzY2OCwzMiBAQAogICB9IEZUX091dGxpbmVfRnVuY3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgYmFzaWNfdHlwZXMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JTUFHRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGNvbnZlcnRzIGZvdXItbGV0dGVyIHRhZ3MgdG8gYW4gdW5zaWduZWQgbG9uZyB0eXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW5jZSBtYW55IDE2LWJpdCBjb21waWxlcnMgZG9uJ3QgbGlrZSAzMi1iaXQgZW51bWVyYXRpb25zLCB5b3UgICAgKi8KLSAgLyogICAgc2hvdWxkIHJlZGVmaW5lIHRoaXMgbWFjcm8gaW4gY2FzZSBvZiBwcm9ibGVtcyB0byBzb21ldGhpbmcgbGlrZSAgICovCi0gIC8qICAgIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2RlZmluZSBGVF9JTUFHRV9UQUcoIHZhbHVlLCBfeDEsIF94MiwgX3gzLCBfeDQgKSAgdmFsdWUgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvIGdldCBhIHNpbXBsZSBlbnVtZXJhdGlvbiB3aXRob3V0IGFzc2lnbmluZyBzcGVjaWFsIG51bWJlcnMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9JTUFHRV9UQUcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0byBhbiB1bnNpZ25lZCBsb25nIHR5cGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFNpbmNlIG1hbnkgMTYtYml0IGNvbXBpbGVycyBkb24ndCBsaWtlIDMyLWJpdCBlbnVtZXJhdGlvbnMsIHlvdSBzaG91bGQKKyAgICogICByZWRlZmluZSB0aGlzIG1hY3JvIGluIGNhc2Ugb2YgcHJvYmxlbXMgdG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgICNkZWZpbmUgRlRfSU1BR0VfVEFHKCB2YWx1ZSwgX3gxLCBfeDIsIF94MywgX3g0ICkgIHZhbHVlCisgICAqICAgYGBgCisgICAqCisgICAqICAgdG8gZ2V0IGEgc2ltcGxlIGVudW1lcmF0aW9uIHdpdGhvdXQgYXNzaWduaW5nIHNwZWNpYWwgbnVtYmVycy4KKyAgICovCiAjaWZuZGVmIEZUX0lNQUdFX1RBRwogI2RlZmluZSBGVF9JTUFHRV9UQUcoIHZhbHVlLCBfeDEsIF94MiwgX3gzLCBfeDQgKSAgXAogICAgICAgICAgIHZhbHVlID0gKCAoICh1bnNpZ25lZCBsb25nKV94MSA8PCAyNCApIHwgXApAQCAtNjc0LDQ0ICs3MDMsNDMgQEAKICNlbmRpZiAvKiBGVF9JTUFHRV9UQUcgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIGEgZ2l2ZW4gZ2x5cGggICAqLwotICAvKiAgICBpbWFnZS4gIE5vdGUgdGhhdCB0aGlzIHZlcnNpb24gb2YgRnJlZVR5cGUgb25seSBzdXBwb3J0cyB0d28gaW1hZ2UgKi8KLSAgLyogICAgZm9ybWF0cywgZXZlbiB0aG91Z2ggZnV0dXJlIGZvbnQgZHJpdmVycyB3aWxsIGJlIGFibGUgdG8gcmVnaXN0ZXIgICovCi0gIC8qICAgIHRoZWlyIG93biBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB2YWx1ZX4wIGlzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIGNvbXBvc2l0ZSBvZiBzZXZlcmFsIG90aGVyIGltYWdlcy4gIFRoaXMgICAgKi8KLSAgLyogICAgICBmb3JtYXQgaXMgX29ubHlfIHVzZWQgd2l0aCBARlRfTE9BRF9OT19SRUNVUlNFLCBhbmQgaXMgdXNlZCB0byAgICovCi0gIC8qICAgICAgcmVwb3J0IGNvbXBvdW5kIGdseXBocyAobGlrZSBhY2NlbnRlZCBjaGFyYWN0ZXJzKS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX0JJVE1BUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgYml0bWFwLCBhbmQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhbiAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9CaXRtYXAuICBZb3UgZ2VuZXJhbGx5IG5lZWQgdG8gYWNjZXNzIHRoZSBgYml0bWFwJyBmaWVsZCBvZiAgKi8KLSAgLyogICAgICB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgdG8gcmVhZCBpdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgb3V0bGluZSBtYWRlIG9mIGxpbmUgc2VnbWVudHMgICAgICovCi0gIC8qICAgICAgYW5kIEJlemllciBhcmNzOyBpdCBjYW4gYmUgZGVzY3JpYmVkIGFzIGFuIEBGVF9PdXRsaW5lOyB5b3UgICAgICAqLwotICAvKiAgICAgIGdlbmVyYWxseSB3YW50IHRvIGFjY2VzcyB0aGUgYG91dGxpbmUnIGZpZWxkIG9mIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgcGF0aCB3aXRoIG5vIGluc2lkZSBhbmQgb3V0c2lkZSAgICovCi0gIC8qICAgICAgY29udG91cnMuICBTb21lIFR5cGV+MSBmb250cywgbGlrZSB0aG9zZSBpbiB0aGUgSGVyc2hleSBmYW1pbHksICAqLwotICAvKiAgICAgIGNvbnRhaW4gZ2x5cGhzIGluIHRoaXMgZm9ybWF0LiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhcyAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfT3V0bGluZSwgYnV0IEZyZWVUeXBlIGlzbid0IGN1cnJlbnRseSBjYXBhYmxlIG9mIHJlbmRlcmluZyAgICovCi0gIC8qICAgICAgdGhlbSBjb3JyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBlbnVtOgorICAgKiAgIEZUX0dseXBoX0Zvcm1hdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gZW51bWVyYXRpb24gdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQgb2YgYSBnaXZlbiBnbHlwaAorICAgKiAgIGltYWdlLiAgTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBvZiBGcmVlVHlwZSBvbmx5IHN1cHBvcnRzIHR3byBpbWFnZQorICAgKiAgIGZvcm1hdHMsIGV2ZW4gdGhvdWdoIGZ1dHVyZSBmb250IGRyaXZlcnMgd2lsbCBiZSBhYmxlIHRvIHJlZ2lzdGVyCisgICAqICAgdGhlaXIgb3duIGZvcm1hdC4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9HTFlQSF9GT1JNQVRfTk9ORSA6OgorICAgKiAgICAgVGhlIHZhbHVlfjAgaXMgcmVzZXJ2ZWQuCisgICAqCisgICAqICAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSA6OgorICAgKiAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgY29tcG9zaXRlIG9mIHNldmVyYWwgb3RoZXIgaW1hZ2VzLiAgVGhpcyBmb3JtYXQKKyAgICogICAgIGlzIF9vbmx5XyB1c2VkIHdpdGggQEZUX0xPQURfTk9fUkVDVVJTRSwgYW5kIGlzIHVzZWQgdG8gcmVwb3J0CisgICAqICAgICBjb21wb3VuZCBnbHlwaHMgKGxpa2UgYWNjZW50ZWQgY2hhcmFjdGVycykuCisgICAqCisgICAqICAgRlRfR0xZUEhfRk9STUFUX0JJVE1BUCA6OgorICAgKiAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgYml0bWFwLCBhbmQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhbiBARlRfQml0bWFwLgorICAgKiAgICAgWW91IGdlbmVyYWxseSBuZWVkIHRvIGFjY2VzcyB0aGUgYGJpdG1hcGAgZmllbGQgb2YgdGhlCisgICAqICAgICBARlRfR2x5cGhTbG90UmVjIHN0cnVjdHVyZSB0byByZWFkIGl0LgorICAgKgorICAgKiAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIDo6CisgICAqICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSB2ZWN0b3JpYWwgb3V0bGluZSBtYWRlIG9mIGxpbmUgc2VnbWVudHMgYW5kCisgICAqICAgICBCZXppZXIgYXJjczsgaXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBhbiBARlRfT3V0bGluZTsgeW91IGdlbmVyYWxseQorICAgKiAgICAgd2FudCB0byBhY2Nlc3MgdGhlIGBvdXRsaW5lYCBmaWVsZCBvZiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUKKyAgICogICAgIHRvIHJlYWQgaXQuCisgICAqCisgICAqICAgRlRfR0xZUEhfRk9STUFUX1BMT1RURVIgOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBwYXRoIHdpdGggbm8gaW5zaWRlIGFuZCBvdXRzaWRlCisgICAqICAgICBjb250b3Vycy4gIFNvbWUgVHlwZX4xIGZvbnRzLCBsaWtlIHRob3NlIGluIHRoZSBIZXJzaGV5IGZhbWlseSwKKyAgICogICAgIGNvbnRhaW4gZ2x5cGhzIGluIHRoaXMgZm9ybWF0LiAgVGhlc2UgYXJlIGRlc2NyaWJlZCBhcyBARlRfT3V0bGluZSwKKyAgICogICAgIGJ1dCBGcmVlVHlwZSBpc24ndCBjdXJyZW50bHkgY2FwYWJsZSBvZiByZW5kZXJpbmcgdGhlbSBjb3JyZWN0bHkuCisgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0Zvcm1hdF8KICAgewogICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX05PTkUsIDAsIDAsIDAsIDAgKSwKQEAgLTcyNSw3ICs3NTMsNyBAQAogCiAKICAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX0dseXBoX0Zvcm1hdCcgdmFsdWVzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYEZUX0dseXBoX0Zvcm1hdGAgdmFsdWVzIGluc3RlYWQuICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X25vbmUgICAgICAgRlRfR0xZUEhfRk9STUFUX05PTkUKICNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X2NvbXBvc2l0ZSAgRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURQogI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfYml0bWFwICAgICBGVF9HTFlQSF9GT1JNQVRfQklUTUFQCkBAIC03NDQsODcgKzc3Miw4OSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYXN0ZXIgaXMgYSBzY2FuIGNvbnZlcnRlciwgaW4gY2hhcmdlIG9mIHJlbmRlcmluZyBhbiBvdXRsaW5lIGludG8gICovCi0gIC8qIGEgYml0bWFwLiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBwdWJsaWMgQVBJIGZvciByYXN0ZXJzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGluIEZyZWVUeXBlIDIsIGFsbCByYXN0ZXJzIGFyZSBub3cgZW5jYXBzdWxhdGVkIHdpdGhpbiAgICAgICovCi0gIC8qIHNwZWNpZmljIG1vZHVsZXMgY2FsbGVkIGByZW5kZXJlcnMnLiAgU2VlIGBmdHJlbmRlci5oJyBmb3IgbW9yZSAgICAgICAqLwotICAvKiBkZXRhaWxzIG9uIHJlbmRlcmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQSByYXN0ZXIgaXMgYSBzY2FuIGNvbnZlcnRlciwgaW4gY2hhcmdlIG9mIHJlbmRlcmluZyBhbiBvdXRsaW5lIGludG8gYQorICAgKiBiaXRtYXAuICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIHB1YmxpYyBBUEkgZm9yIHJhc3RlcnMuCisgICAqCisgICAqIE5vdGUgdGhhdCBpbiBGcmVlVHlwZSAyLCBhbGwgcmFzdGVycyBhcmUgbm93IGVuY2Fwc3VsYXRlZCB3aXRoaW4KKyAgICogc3BlY2lmaWMgbW9kdWxlcyBjYWxsZWQgJ3JlbmRlcmVycycuICBTZWUgYGZ0cmVuZGVyLmhgIGZvciBtb3JlIGRldGFpbHMKKyAgICogb24gcmVuZGVyZXJzLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW5saW5lIENvbnZlcnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyB2ZWN0b3JpYWwgb3V0bGluZXMgYXJlIGNvbnZlcnRlZCBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0ZWNobmljYWwgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICByYXN0ZXIKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFNjYW5saW5lIENvbnZlcnRlcgorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgSG93IHZlY3RvcmlhbCBvdXRsaW5lcyBhcmUgY29udmVydGVkIGludG8gYml0bWFwcyBhbmQgcGl4bWFwcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0ZWNobmljYWwgZGVmaW5pdGlvbnMuCisgICAqCisgICAqIEBvcmRlcjoKKyAgICogICBGVF9SYXN0ZXIKKyAgICogICBGVF9TcGFuCisgICAqICAgRlRfU3BhbkZ1bmMKKyAgICoKKyAgICogICBGVF9SYXN0ZXJfUGFyYW1zCisgICAqICAgRlRfUkFTVEVSX0ZMQUdfWFhYCisgICAqCisgICAqICAgRlRfUmFzdGVyX05ld0Z1bmMKKyAgICogICBGVF9SYXN0ZXJfRG9uZUZ1bmMKKyAgICogICBGVF9SYXN0ZXJfUmVzZXRGdW5jCisgICAqICAgRlRfUmFzdGVyX1NldE1vZGVGdW5jCisgICAqICAgRlRfUmFzdGVyX1JlbmRlckZ1bmMKKyAgICogICBGVF9SYXN0ZXJfRnVuY3MKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIChwb2ludGVyKSB0byBhIHJhc3RlciBvYmplY3QuICBFYWNoIG9iamVjdCBjYW4gYmUgKi8KLSAgLyogICAgdXNlZCBpbmRlcGVuZGVudGx5IHRvIGNvbnZlcnQgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIG9yIHBpeG1hcC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfUmFzdGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBvcGFxdWUgaGFuZGxlIChwb2ludGVyKSB0byBhIHJhc3RlciBvYmplY3QuICBFYWNoIG9iamVjdCBjYW4gYmUKKyAgICogICB1c2VkIGluZGVwZW5kZW50bHkgdG8gY29udmVydCBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAgb3IgcGl4bWFwLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfUmFzdGVyUmVjXyogIEZUX1Jhc3RlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBzaW5nbGUgc3BhbiBvZiBncmF5IHBpeGVscyB3aGVuICAgICAgICAqLwotICAvKiAgICByZW5kZXJpbmcgYW4gYW50aS1hbGlhc2VkIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4ICAgICAgICA6OiBUaGUgc3BhbidzIGhvcml6b250YWwgc3RhcnQgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbiAgICAgIDo6IFRoZSBzcGFuJ3MgbGVuZ3RoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY292ZXJhZ2UgOjogVGhlIHNwYW4gY29sb3IvY292ZXJhZ2UsIHJhbmdpbmcgZnJvbSAwIChiYWNrZ3JvdW5kKSAgICovCi0gIC8qICAgICAgICAgICAgICAgIHRvIDI1NSAoZm9yZWdyb3VuZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHNwYW4gZHJhd2luZyBjYWxsYmFjayB0eXBlIG5hbWVkICAgICAqLwotICAvKiAgICBARlRfU3BhbkZ1bmMgdGhhdCB0YWtlcyB0aGUgeX5jb29yZGluYXRlIG9mIHRoZSBzcGFuIGFzIGEgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY292ZXJhZ2UgdmFsdWUgaXMgYWx3YXlzIGJldHdlZW4gMCBhbmQgMjU1LiAgSWYgeW91IHdhbnQgbGVzcyAgKi8KLSAgLyogICAgZ3JheSB2YWx1ZXMsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYXMgdG8gcmVkdWNlIHRoZW0uICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TcGFuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgc2luZ2xlIHNwYW4gb2YgZ3JheSBwaXhlbHMgd2hlbiByZW5kZXJpbmcKKyAgICogICBhbiBhbnRpLWFsaWFzZWQgYml0bWFwLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHggOjoKKyAgICogICAgIFRoZSBzcGFuJ3MgaG9yaXpvbnRhbCBzdGFydCBwb3NpdGlvbi4KKyAgICoKKyAgICogICBsZW4gOjoKKyAgICogICAgIFRoZSBzcGFuJ3MgbGVuZ3RoIGluIHBpeGVscy4KKyAgICoKKyAgICogICBjb3ZlcmFnZSA6OgorICAgKiAgICAgVGhlIHNwYW4gY29sb3IvY292ZXJhZ2UsIHJhbmdpbmcgZnJvbSAwIChiYWNrZ3JvdW5kKSB0byAyNTUKKyAgICogICAgIChmb3JlZ3JvdW5kKS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBieSB0aGUgc3BhbiBkcmF3aW5nIGNhbGxiYWNrIHR5cGUgbmFtZWQKKyAgICogICBARlRfU3BhbkZ1bmMgdGhhdCB0YWtlcyB0aGUgeX5jb29yZGluYXRlIG9mIHRoZSBzcGFuIGFzIGEgcGFyYW1ldGVyLgorICAgKgorICAgKiAgIFRoZSBjb3ZlcmFnZSB2YWx1ZSBpcyBhbHdheXMgYmV0d2VlbiAwIGFuZCAyNTUuICBJZiB5b3Ugd2FudCBsZXNzIGdyYXkKKyAgICogICB2YWx1ZXMsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBoYXMgdG8gcmVkdWNlIHRoZW0uCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfU3Bhbl8KICAgewogICAgIHNob3J0ICAgICAgICAgICB4OwpAQCAtODM0LDMyICs4NjQsMzYgQEAKICAgfSBGVF9TcGFuOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIGFzIGEgY2FsbC1iYWNrIGJ5IHRoZSBhbnRpLWFsaWFzZWQgcmVuZGVyZXIgaW4gICAgICovCi0gIC8qICAgIG9yZGVyIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIGRyYXcgdGhlbXNlbHZlcyB0aGUgZ3JheSBwaXhlbCAgICAqLwotICAvKiAgICBzcGFucyBvbiBlYWNoIHNjYW4gbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5ICAgICA6OiBUaGUgc2NhbmxpbmUncyB5fmNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdW50IDo6IFRoZSBudW1iZXIgb2Ygc3BhbnMgdG8gZHJhdyBvbiB0aGlzIHNjYW5saW5lLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BhbnMgOjogQSB0YWJsZSBvZiBgY291bnQnIHNwYW5zIHRvIGRyYXcgb24gdGhlIHNjYW5saW5lLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICA6OiBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbGxiYWNrIGFsbG93cyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGRpcmVjdGx5IHJlbmRlciB0aGUgICAgKi8KLSAgLyogICAgZ3JheSBzcGFucyBvZiB0aGUgYW50aS1hbGlhc2VkIGJpdG1hcCB0byBhbnkga2luZCBvZiBzdXJmYWNlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGFudGktYWxpYXNlZCBvdXRsaW5lcyBkaXJlY3RseSB0byBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYmFja2dyb3VuZCBiaXRtYXAsIGFuZCBldmVuIHBlcmZvcm0gdHJhbnNsdWNlbmN5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1NwYW5GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGZ1bmN0aW9uIHVzZWQgYXMgYSBjYWxsLWJhY2sgYnkgdGhlIGFudGktYWxpYXNlZCByZW5kZXJlciBpbiBvcmRlcgorICAgKiAgIHRvIGxldCBjbGllbnQgYXBwbGljYXRpb25zIGRyYXcgdGhlbXNlbHZlcyB0aGUgZ3JheSBwaXhlbCBzcGFucyBvbgorICAgKiAgIGVhY2ggc2NhbiBsaW5lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgeSA6OgorICAgKiAgICAgVGhlIHNjYW5saW5lJ3MgdXB3YXJkIHl+Y29vcmRpbmF0ZS4KKyAgICoKKyAgICogICBjb3VudCA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBzcGFucyB0byBkcmF3IG9uIHRoaXMgc2NhbmxpbmUuCisgICAqCisgICAqICAgc3BhbnMgOjoKKyAgICogICAgIEEgdGFibGUgb2YgYGNvdW50YCBzcGFucyB0byBkcmF3IG9uIHRoZSBzY2FubGluZS4KKyAgICoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGNhbGxiYWNrIGFsbG93cyBjbGllbnQgYXBwbGljYXRpb25zIHRvIGRpcmVjdGx5IHJlbmRlciB0aGUgZ3JheQorICAgKiAgIHNwYW5zIG9mIHRoZSBhbnRpLWFsaWFzZWQgYml0bWFwIHRvIGFueSBraW5kIG9mIHN1cmZhY2VzLgorICAgKgorICAgKiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYW50aS1hbGlhc2VkIG91dGxpbmVzIGRpcmVjdGx5IHRvIGEgZ2l2ZW4KKyAgICogICBiYWNrZ3JvdW5kIGJpdG1hcCwgYW5kIGV2ZW4gcGVyZm9ybSB0cmFuc2x1Y2VuY3kuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpGVF9TcGFuRnVuYykoIGludCAgICAgICAgICAgICB5LAogICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50LApAQCAtODY5LDEzMSArOTAzLDEzNSBAQAogI2RlZmluZSBGVF9SYXN0ZXJfU3Bhbl9GdW5jICBGVF9TcGFuRnVuYwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0JpdFRlc3RfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgdW5pbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlcHJlY2F0ZWQsIHVuaW1wbGVtZW50ZWQuCisgICAqLwogICB0eXBlZGVmIGludAogICAoKkZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMpKCBpbnQgICAgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfQml0U2V0X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXByZWNhdGVkLCB1bmltcGxlbWVudGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfUmFzdGVyX0JpdFNldF9GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXByZWNhdGVkLCB1bmltcGxlbWVudGVkLgorICAgKi8KICAgdHlwZWRlZiB2b2lkCiAgICgqRlRfUmFzdGVyX0JpdFNldF9GdW5jKSggaW50ICAgIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogIHVzZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZyBjb25zdGFudHMgYXMgdXNlZCBpbiB0aGUgYGZsYWdzJyBmaWVsZCBvZiBhICAgICAqLwotICAvKiAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19ERUZBVUxUIDo6IFRoaXMgdmFsdWUgaXMgMC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0FBICAgICAgOjogVGhpcyBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudGktYWxpYXNlZCBnbHlwaCBpbWFnZSBzaG91bGQgYmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZWQuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ub2Nocm9tZSAoMS1iaXQpLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICA6OiBUaGlzIGZsYWcgaXMgc2V0IHRvIGluZGljYXRlIGRpcmVjdCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nLiAgSW4gdGhpcyBtb2RlLCBjbGllbnQgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHNwYW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gIFRoaXMgbGV0cyB0aGVtIGRpcmVjdGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdyBvciBjb21wb3NlIG92ZXIgYW4gZXhpc3RpbmcgYml0bWFwLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgYml0IGlzIG5vdCBzZXQsIHRoZSB0YXJnZXQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhtYXAncyBidWZmZXIgX211c3RfIGJlIHplcm9lZCBiZWZvcmUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3QgcmVuZGVyaW5nIGlzIG9ubHkgcG9zc2libGUgd2l0aCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW50aS1hbGlhc2VkIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUCAgICA6OiBUaGlzIGZsYWcgaXMgb25seSB1c2VkIGluIGRpcmVjdCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nIG1vZGUuICBJZiBzZXQsIHRoZSBvdXRwdXQgd2lsbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNsaXBwZWQgdG8gYSBib3ggc3BlY2lmaWVkIGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgY2xpcF9ib3gnIGZpZWxkIG9mIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYnkgZGVmYXVsdCwgdGhlIGdseXBoIGJpdG1hcCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgY2xpcHBlZCB0byB0aGUgdGFyZ2V0IHBpeG1hcCwgZXhjZXB0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGRpcmVjdCByZW5kZXJpbmcgbW9kZSB3aGVyZSBhbGwgc3BhbnMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZ2VuZXJhdGVkIGlmIG5vIGNsaXBwaW5nIGJveCBpcyBzZXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfUkFTVEVSX0ZMQUdfWFhYCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGxpc3Qgb2YgYml0IGZsYWcgY29uc3RhbnRzIGFzIHVzZWQgaW4gdGhlIGBmbGFnc2AgZmllbGQgb2YgYQorICAgKiAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9SQVNURVJfRkxBR19ERUZBVUxUIDo6CisgICAqICAgICBUaGlzIHZhbHVlIGlzIDAuCisgICAqCisgICAqICAgRlRfUkFTVEVSX0ZMQUdfQUEgOjoKKyAgICogICAgIFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCBhbiBhbnRpLWFsaWFzZWQgZ2x5cGggaW1hZ2Ugc2hvdWxkCisgICAqICAgICBiZSBnZW5lcmF0ZWQuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgbW9ub2Nocm9tZSAoMS1iaXQpLgorICAgKgorICAgKiAgIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCA6OgorICAgKiAgICAgVGhpcyBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSBkaXJlY3QgcmVuZGVyaW5nLiAgSW4gdGhpcyBtb2RlLCBjbGllbnQKKyAgICogICAgIGFwcGxpY2F0aW9ucyBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHNwYW4gY2FsbGJhY2suICBUaGlzIGxldHMgdGhlbQorICAgKiAgICAgZGlyZWN0bHkgZHJhdyBvciBjb21wb3NlIG92ZXIgYW4gZXhpc3RpbmcgYml0bWFwLiAgSWYgdGhpcyBiaXQgaXMKKyAgICogICAgIF9ub3RfIHNldCwgdGhlIHRhcmdldCBwaXhtYXAncyBidWZmZXIgX211c3RfIGJlIHplcm9lZCBiZWZvcmUKKyAgICogICAgIHJlbmRlcmluZyBhbmQgdGhlIG91dHB1dCB3aWxsIGJlIGNsaXBwZWQgdG8gaXRzIHNpemUuCisgICAqCisgICAqICAgICBEaXJlY3QgcmVuZGVyaW5nIGlzIG9ubHkgcG9zc2libGUgd2l0aCBhbnRpLWFsaWFzZWQgZ2x5cGhzLgorICAgKgorICAgKiAgIEZUX1JBU1RFUl9GTEFHX0NMSVAgOjoKKyAgICogICAgIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWQgaW4gZGlyZWN0IHJlbmRlcmluZyBtb2RlLiAgSWYgc2V0LCB0aGUgb3V0cHV0CisgICAqICAgICB3aWxsIGJlIGNsaXBwZWQgdG8gYSBib3ggc3BlY2lmaWVkIGluIHRoZSBgY2xpcF9ib3hgIGZpZWxkIG9mIHRoZQorICAgKiAgICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlLiAgT3RoZXJ3aXNlLCB0aGUgYGNsaXBfYm94YCBpcworICAgKiAgICAgZWZmZWN0aXZlbHkgc2V0IHRvIHRoZSBib3VuZGluZyBib3ggYW5kIGFsbCBzcGFucyBhcmUgZ2VuZXJhdGVkLgorICAgKi8KICNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCAgMHgwCiAjZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0FBICAgICAgIDB4MQogI2RlZmluZSBGVF9SQVNURVJfRkxBR19ESVJFQ1QgICAweDIKICNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfQ0xJUCAgICAgMHg0CiAKICAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX1JBU1RFUl9GTEFHX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogYEZUX1JBU1RFUl9GTEFHX1hYWGAgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGVmYXVsdCAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVAogI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19hYSAgICAgICBGVF9SQVNURVJfRkxBR19BQQogI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19kaXJlY3QgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QKICNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfY2xpcCAgICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCAgICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9PdXRsaW5lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgOjogVGhlIHJlbmRlcmluZyBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBncmF5X3NwYW5zICA6OiBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsYWNrX3NwYW5zIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0X3Rlc3QgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRfc2V0ICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byBlYWNoIGRyYXdpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsaXBfYm94ICAgIDo6IEFuIG9wdGlvbmFsIGNsaXBwaW5nIGJveC4gIEl0IGlzIG9ubHkgdXNlZCBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVuZGVyaW5nIG1vZGUuICBOb3RlIHRoYXQgY29vcmRpbmF0ZXMgaGVyZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBfaW50ZWdlcl8gcGl4ZWxzIChhbmQgbm90IGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgZml4ZWQtcG9pbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAgaXMgZHJhd24gaWYgdGhlIEBGVF9SQVNURVJfRkxBR19BQSAgICAqLwotICAvKiAgICBiaXQgZmxhZyBpcyBzZXQgaW4gdGhlIGBmbGFncycgZmllbGQsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgICAgICAgKi8KLSAgLyogICAgYml0bWFwIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBiaXQgZmxhZyBpcyBzZXQgaW4gYGZsYWdzJywgdGhlICAgICAgKi8KLSAgLyogICAgcmFzdGVyIHdpbGwgY2FsbCB0aGUgYGdyYXlfc3BhbnMnIGNhbGxiYWNrIHRvIGRyYXcgZ3JheSBwaXhlbCAgICAgICovCi0gIC8qICAgIHNwYW5zLiAgVGhpcyBhbGxvd3MgZGlyZWN0IGNvbXBvc2l0aW9uIG92ZXIgYSBwcmUtZXhpc3RpbmcgYml0bWFwICAqLwotICAvKiAgICB0aHJvdWdoIHVzZXItcHJvdmlkZWQgY2FsbGJhY2tzIHRvIHBlcmZvcm0gdGhlIHNwYW4gZHJhd2luZyBhbmQgICAgKi8KLSAgLyogICAgY29tcG9zaXRpb24uICAgIE5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vbm9jaHJvbWUgcmFzdGVyaXplci4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9SYXN0ZXJfUGFyYW1zCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBob2xkIHRoZSBwYXJhbWV0ZXJzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgZnVuY3Rpb24sCisgICAqICAgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIEBGVF9PdXRsaW5lX1JlbmRlci4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB0YXJnZXQgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgYml0bWFwLgorICAgKgorICAgKiAgIHNvdXJjZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuIEBGVF9PdXRsaW5lKS4KKyAgICoKKyAgICogICBmbGFncyA6OgorICAgKiAgICAgVGhlIHJlbmRlcmluZyBmbGFncy4KKyAgICoKKyAgICogICBncmF5X3NwYW5zIDo6CisgICAqICAgICBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suCisgICAqCisgICAqICAgYmxhY2tfc3BhbnMgOjoKKyAgICogICAgIFVudXNlZC4KKyAgICoKKyAgICogICBiaXRfdGVzdCA6OgorICAgKiAgICAgVW51c2VkLgorICAgKgorICAgKiAgIGJpdF9zZXQgOjoKKyAgICogICAgIFVudXNlZC4KKyAgICoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBVc2VyLXN1cHBsaWVkIGRhdGEgdGhhdCBpcyBwYXNzZWQgdG8gZWFjaCBkcmF3aW5nIGNhbGxiYWNrLgorICAgKgorICAgKiAgIGNsaXBfYm94IDo6CisgICAqICAgICBBbiBvcHRpb25hbCBzcGFuIGNsaXBwaW5nIGJveCBleHByZXNzZWQgaW4gX2ludGVnZXJfIHBpeGVscworICAgKiAgICAgKG5vdCBpbiAyNi42IGZpeGVkLXBvaW50IHVuaXRzKS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIEBGVF9SQVNURVJfRkxBR19BQSBiaXQgZmxhZyBtdXN0IGJlIHNldCBpbiB0aGUgYGZsYWdzYCB0bworICAgKiAgIGdlbmVyYXRlIGFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgYml0bWFwCisgICAqICAgaXMgZ2VuZXJhdGVkLiAgVGhlIGB0YXJnZXRgIHNob3VsZCBoYXZlIGFwcHJvcHJpYXRlIHBpeGVsIG1vZGUgYW5kIGl0cworICAgKiAgIGRpbWVuc2lvbnMgZGVmaW5lIHRoZSBjbGlwcGluZyByZWdpb24uCisgICAqCisgICAqICAgSWYgYm90aCBARlRfUkFTVEVSX0ZMQUdfQUEgYW5kIEBGVF9SQVNURVJfRkxBR19ESVJFQ1QgYml0IGZsYWdzCisgICAqICAgYXJlIHNldCBpbiBgZmxhZ3NgLCB0aGUgcmFzdGVyIGNhbGxzIGFuIEBGVF9TcGFuRnVuYyBjYWxsYmFjaworICAgKiAgIGBncmF5X3NwYW5zYCB3aXRoIGB1c2VyYCBkYXRhIGFzIGFuIGFyZ3VtZW50IGlnbm9yaW5nIGB0YXJnZXRgLiAgVGhpcworICAgKiAgIGFsbG93cyBkaXJlY3QgY29tcG9zaXRpb24gb3ZlciBhIHByZS1leGlzdGluZyB1c2VyIHN1cmZhY2UgdG8gcGVyZm9ybQorICAgKiAgIHRoZSBzcGFuIGRyYXdpbmcgYW5kIGNvbXBvc2l0aW9uLiAgVG8gb3B0aW9uYWxseSBjbGlwIHRoZSBzcGFucywgc2V0CisgICAqICAgdGhlIEBGVF9SQVNURVJfRkxBR19DTElQIGZsYWcgYW5kIGBjbGlwX2JveGAuICBUaGUgbW9ub2Nocm9tZSByYXN0ZXIKKyAgICogICBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkaXJlY3QgbW9kZS4KKyAgICoKKyAgICogICBUaGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyIGFsd2F5cyB1c2VzIDI1NiBncmF5IGxldmVscy4gIElmIHlvdSB3YW50CisgICAqICAgZmV3ZXIgZ3JheSBsZXZlbHMsIHlvdSBoYXZlIHRvIHVzZSBARlRfUkFTVEVSX0ZMQUdfRElSRUNUIGFuZCByZWR1Y2UKKyAgICogICB0aGUgbGV2ZWxzIGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9SYXN0ZXJfUGFyYW1zXwogICB7CiAgICAgY29uc3QgRlRfQml0bWFwKiAgICAgICAgdGFyZ2V0OwpAQCAtMTAwOSwzMCArMTA0NywzMiBAQAogICB9IEZUX1Jhc3Rlcl9QYXJhbXM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfTmV3RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBhbGxvY2F0b3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYG1lbW9yeScgcGFyYW1ldGVyIGlzIGEgdHlwZWxlc3MgcG9pbnRlciBpbiBvcmRlciB0byBhdm9pZCAgICAgKi8KLSAgLyogICAgdW4td2FudGVkIGRlcGVuZGVuY2llcyBvbiB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgY29kZS4gIEluICAgICAgICovCi0gIC8qICAgIHByYWN0aWNlLCBpdCBpcyBhbiBARlRfTWVtb3J5IG9iamVjdCwgaS5lLiwgYSBoYW5kbGUgdG8gdGhlICAgICAgICAqLwotICAvKiAgICBzdGFuZGFyZCBGcmVlVHlwZSBtZW1vcnkgYWxsb2NhdG9yLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEgZ2l2ZW4gcmFzdGVyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1Jhc3Rlcl9OZXdGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHJhc3RlciBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgYWxsb2NhdG9yLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHJhc3RlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBgbWVtb3J5YCBwYXJhbWV0ZXIgaXMgYSB0eXBlbGVzcyBwb2ludGVyIGluIG9yZGVyIHRvIGF2b2lkCisgICAqICAgdW4td2FudGVkIGRlcGVuZGVuY2llcyBvbiB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgY29kZS4gIEluIHByYWN0aWNlLAorICAgKiAgIGl0IGlzIGFuIEBGVF9NZW1vcnkgb2JqZWN0LCBpLmUuLCBhIGhhbmRsZSB0byB0aGUgc3RhbmRhcmQgRnJlZVR5cGUKKyAgICogICBtZW1vcnkgYWxsb2NhdG9yLiAgSG93ZXZlciwgdGhpcyBmaWVsZCBjYW4gYmUgY29tcGxldGVseSBpZ25vcmVkIGJ5IGEKKyAgICogICBnaXZlbiByYXN0ZXIgaW1wbGVtZW50YXRpb24uCisgICAqLwogICB0eXBlZGVmIGludAogICAoKkZUX1Jhc3Rlcl9OZXdGdW5jKSggdm9pZCogICAgICAgbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmFzdGVyKiAgcmFzdGVyICk7CkBAIC0xMDQwLDQ5ICsxMDgwLDUyIEBACiAjZGVmaW5lIEZUX1Jhc3Rlcl9OZXdfRnVuYyAgRlRfUmFzdGVyX05ld0Z1bmMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9Eb25lRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IGEgZ2l2ZW4gcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9SYXN0ZXJfRG9uZUZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IGEgZ2l2ZW4gcmFzdGVyIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHJhc3RlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpGVF9SYXN0ZXJfRG9uZUZ1bmMpKCBGVF9SYXN0ZXIgIHJhc3RlciApOwogCiAjZGVmaW5lIEZUX1Jhc3Rlcl9Eb25lX0Z1bmMgIEZUX1Jhc3Rlcl9Eb25lRnVuYwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1Jlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgdXNlZCB0byBwcm92aWRlIGFuIGFyZWEgb2YgbWVtb3J5IGNhbGxlZCB0aGUgYHJlbmRlciAgICAgICovCi0gIC8qICAgIHBvb2wnIGF2YWlsYWJsZSB0byBhbGwgcmVnaXN0ZXJlZCByYXN0ZXJpemVycy4gIFRoaXMgd2FzIG5vdCAgICAgICAqLwotICAvKiAgICB0aHJlYWQgc2FmZSwgaG93ZXZlciwgYW5kIG5vdyBGcmVlVHlwZSBuZXZlciBhbGxvY2F0ZXMgdGhpcyBwb29sLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgbmV3IHJhc3RlciBvYmplY3QgaXMgY3JlYXRlZC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciAgICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9vbF9iYXNlIDo6IFByZXZpb3VzbHksIHRoZSBhZGRyZXNzIGluIG1lbW9yeSBvZiB0aGUgcmVuZGVyIHBvb2wuICovCi0gIC8qICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0byBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9vbF9zaXplIDo6IFByZXZpb3VzbHksIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0byAwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJhc3Rlcml6ZXJzIHNob3VsZCByZWx5IG9uIGR5bmFtaWMgb3Igc3RhY2sgYWxsb2NhdGlvbiBpZiB0aGV5ICAgICAqLwotICAvKiAgICB3YW50IHRvIChhIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBpcyBwYXNzZWQgdG8gdGhlICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyaXplciBjb25zdHJ1Y3RvcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZyZWVUeXBlIHVzZWQgdG8gcHJvdmlkZSBhbiBhcmVhIG9mIG1lbW9yeSBjYWxsZWQgdGhlICdyZW5kZXIgcG9vbCcKKyAgICogICBhdmFpbGFibGUgdG8gYWxsIHJlZ2lzdGVyZWQgcmFzdGVyaXplcnMuICBUaGlzIHdhcyBub3QgdGhyZWFkIHNhZmUsCisgICAqICAgaG93ZXZlciwgYW5kIG5vdyBGcmVlVHlwZSBuZXZlciBhbGxvY2F0ZXMgdGhpcyBwb29sLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgbmV3IHJhc3RlciBvYmplY3QgaXMgY3JlYXRlZC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHJhc3RlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LgorICAgKgorICAgKiAgIHBvb2xfYmFzZSA6OgorICAgKiAgICAgUHJldmlvdXNseSwgdGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSByZW5kZXIgcG9vbC4gIFNldCB0aGlzIHRvCisgICAqICAgICBgTlVMTGAuCisgICAqCisgICAqICAgcG9vbF9zaXplIDo6CisgICAqICAgICBQcmV2aW91c2x5LCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wuICBTZXQgdGhpcyB0byAwLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBSYXN0ZXJpemVycyBzaG91bGQgcmVseSBvbiBkeW5hbWljIG9yIHN0YWNrIGFsbG9jYXRpb24gaWYgdGhleSB3YW50IHRvCisgICAqICAgKGEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgYWxsb2NhdG9yIGlzIHBhc3NlZCB0byB0aGUgcmFzdGVyaXplcgorICAgKiAgIGNvbnN0cnVjdG9yKS4KKyAgICovCiAgIHR5cGVkZWYgdm9pZAogICAoKkZUX1Jhc3Rlcl9SZXNldEZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgcmFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgcG9vbF9iYXNlLApAQCAtMTA5MSwyNCArMTEzNCwyNiBAQAogI2RlZmluZSBGVF9SYXN0ZXJfUmVzZXRfRnVuYyAgRlRfUmFzdGVyX1Jlc2V0RnVuYwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1NldE1vZGVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBhIGdlbmVyaWMgZmFjaWxpdHkgdG8gY2hhbmdlIG1vZGVzIG9yIGF0dHJpYnV0ZXMgICovCi0gIC8qICAgIGluIGEgZ2l2ZW4gcmFzdGVyLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBvciAgICAqLwotICAvKiAgICBzaW1wbHkgdG8gYWxsb3cgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgYGZlYXR1cmVzJyBpbiBhIGdpdmVuICAgICAgKi8KLSAgLyogICAgcmFzdGVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2RlICAgOjogQSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgbW9kZSBvciBwcm9wZXJ0eS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyZ3MgICA6OiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtb2RlL3Byb3BlcnR5IHRvIHVzZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmljIGZhY2lsaXR5IHRvIGNoYW5nZSBtb2RlcyBvciBhdHRyaWJ1dGVzIGluIGEKKyAgICogICBnaXZlbiByYXN0ZXIuICBUaGlzIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9yIHNpbXBseSB0bworICAgKiAgIGFsbG93IGltcGxlbWVudGF0aW9uLXNwZWNpZmljICdmZWF0dXJlcycgaW4gYSBnaXZlbiByYXN0ZXIgbW9kdWxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgcmFzdGVyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuCisgICAqCisgICAqICAgbW9kZSA6OgorICAgKiAgICAgQSA0LWJ5dGUgdGFnIHVzZWQgdG8gbmFtZSB0aGUgbW9kZSBvciBwcm9wZXJ0eS4KKyAgICoKKyAgICogICBhcmdzIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtb2RlL3Byb3BlcnR5IHRvIHVzZS4KKyAgICovCiAgIHR5cGVkZWYgaW50CiAgICgqRlRfUmFzdGVyX1NldE1vZGVGdW5jKSggRlRfUmFzdGVyICAgICAgcmFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZGUsCkBAIC0xMTE3LDQwICsxMTYyLDM2IEBACiAjZGVmaW5lIEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEludm9rZSBhIGdpdmVuIHJhc3RlciB0byBzY2FuLWNvbnZlcnQgYSBnaXZlbiBnbHlwaCBpbWFnZSBpbnRvIGEgICAqLwotICAvKiAgICB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICAqLwotICAvKiAgICAgICAgICAgICAgc3RvcmUgdGhlIHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgcmFzdGVyJ3MgZ2x5cGggKi8KLSAgLyogICAgZm9ybWF0IGRlZmluZWQgaW4gaXRzIEBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0dXJlLiAgSXQgY2FuIGJlIGFuICAgICovCi0gIC8qICAgIEBGVF9PdXRsaW5lIG9yIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gc3VwcG9ydCBhIGxhcmdlIGFycmF5IG9mICAqLwotICAvKiAgICBnbHlwaCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByZW5kZXIgZnVuY3Rpb24gY2FuIGZhaWwgYW5kIHJldHVybiBhICAgICAgICAgICAqLwotICAvKiAgICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgZXJyb3IgY29kZSBpZiB0aGUgcmFzdGVyIHVzZWQgZG9lcyAgKi8KLSAgLyogICAgbm90IHN1cHBvcnQgZGlyZWN0IGNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBYWFg6IEZvciBub3csIHRoZSBzdGFuZGFyZCByYXN0ZXIgZG9lc24ndCBzdXBwb3J0IGRpcmVjdCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbiBidXQgdGhpcyBzaG91bGQgY2hhbmdlIGZvciB0aGUgZmluYWwgcmVsZWFzZSAoc2VlICovCi0gIC8qICAgICAgICAgdGhlIGZpbGVzIGBkZW1vcy9zcmMvZnRncmF5cy5jJyBhbmQgYGRlbW9zL3NyYy9mdGdyYXlzMi5jJyAgICAqLwotICAvKiAgICAgICAgIGZvciBleGFtcGxlcyBvZiBkaXN0aW5jdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGRpcmVjdCAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbnZva2UgYSBnaXZlbiByYXN0ZXIgdG8gc2Nhbi1jb252ZXJ0IGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgaW50byBhCisgICAqICAgdGFyZ2V0IGJpdG1hcC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHJhc3RlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuCisgICAqCisgICAqICAgcGFyYW1zIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgdGhlCisgICAqICAgICByZW5kZXJpbmcgcGFyYW1ldGVycy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgcmFzdGVyJ3MgZ2x5cGgKKyAgICogICBmb3JtYXQgZGVmaW5lZCBpbiBpdHMgQEZUX1Jhc3Rlcl9GdW5jcyBzdHJ1Y3R1cmUuICBJdCBjYW4gYmUgYW4KKyAgICogICBARlRfT3V0bGluZSBvciBhbnl0aGluZyBlbHNlIGluIG9yZGVyIHRvIHN1cHBvcnQgYSBsYXJnZSBhcnJheSBvZgorICAgKiAgIGdseXBoIGZvcm1hdHMuCisgICAqCisgICAqICAgTm90ZSBhbHNvIHRoYXQgdGhlIHJlbmRlciBmdW5jdGlvbiBjYW4gZmFpbCBhbmQgcmV0dXJuIGEKKyAgICogICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAgZXJyb3IgY29kZSBpZiB0aGUgcmFzdGVyIHVzZWQgZG9lcyBub3QKKyAgICogICBzdXBwb3J0IGRpcmVjdCBjb21wb3NpdGlvbi4KKyAgICovCiAgIHR5cGVkZWYgaW50CiAgICgqRlRfUmFzdGVyX1JlbmRlckZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgICAgICAgICAgcmFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfUmFzdGVyX1BhcmFtcyogIHBhcmFtcyApOwpAQCAtMTE1OCwyNSArMTE5OSwzMCBAQAogI2RlZmluZSBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiByYXN0ZXIgY2xhc3MgdG8gdGhlIGxpYnJhcnkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9mb3JtYXQgIDo6IFRoZSBzdXBwb3J0ZWQgZ2x5cGggZm9ybWF0IGZvciB0aGlzIHJhc3Rlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9uZXcgICAgOjogVGhlIHJhc3RlciBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX3Jlc2V0ICA6OiBVc2VkIHRvIHJlc2V0IHRoZSByZW5kZXIgcG9vbCB3aXRoaW4gdGhlIHJhc3Rlci4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcmVuZGVyIDo6IEEgZnVuY3Rpb24gdG8gcmVuZGVyIGEgZ2x5cGggaW50byBhIGdpdmVuIGJpdG1hcC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9kb25lICAgOjogVGhlIHJhc3RlciBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfUmFzdGVyX0Z1bmNzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiByYXN0ZXIgY2xhc3MgdG8gdGhlIGxpYnJhcnkuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgZ2x5cGhfZm9ybWF0IDo6CisgICAqICAgICBUaGUgc3VwcG9ydGVkIGdseXBoIGZvcm1hdCBmb3IgdGhpcyByYXN0ZXIuCisgICAqCisgICAqICAgcmFzdGVyX25ldyA6OgorICAgKiAgICAgVGhlIHJhc3RlciBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogICByYXN0ZXJfcmVzZXQgOjoKKyAgICogICAgIFVzZWQgdG8gcmVzZXQgdGhlIHJlbmRlciBwb29sIHdpdGhpbiB0aGUgcmFzdGVyLgorICAgKgorICAgKiAgIHJhc3Rlcl9yZW5kZXIgOjoKKyAgICogICAgIEEgZnVuY3Rpb24gdG8gcmVuZGVyIGEgZ2x5cGggaW50byBhIGdpdmVuIGJpdG1hcC4KKyAgICoKKyAgICogICByYXN0ZXJfZG9uZSA6OgorICAgKiAgICAgVGhlIHJhc3RlciBkZXN0cnVjdG9yLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Jhc3Rlcl9GdW5jc18KICAgewogICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZ2x5cGhfZm9ybWF0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oCmluZGV4IDQ0NjE5ZjkuLmY2NzY1NWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW5jcmVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbmNyZW1lbnRhbCBsb2FkaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0aW5jcmVtLmgKKyAqCisgKiAgIEZyZWVUeXBlIGluY3JlbWVudGFsIGxvYWRpbmcgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVElOQ1JFTV9IXwogI2RlZmluZSBGVElOQ1JFTV9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1BBUkFNRVRFUl9UQUdTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0cGFyYW1zLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtMzIsNyArMzEsNyBAQAogCiBGVF9CRUdJTl9IRUFERVIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAc2VjdGlvbjoKICAgICogICAgaW5jcmVtZW50YWwKQEAgLTQ1LDcgKzQ0LDcgQEAKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gc28tY2FsbGVkCi0gICAqICAgYGluY3JlbWVudGFsJyBnbHlwaCBsb2FkaW5nLiAgVGhpcyBpcyBhIG1vZGUgd2hlcmUgYWxsIGdseXBocyBsb2FkZWQKKyAgICogICAnaW5jcmVtZW50YWwnIGdseXBoIGxvYWRpbmcuICBUaGlzIGlzIGEgbW9kZSB3aGVyZSBhbGwgZ2x5cGhzIGxvYWRlZAogICAgKiAgIGZyb20gYSBnaXZlbiBARlRfRmFjZSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbi4KICAgICoKICAgICogICBBcGFydCBmcm9tIHRoYXQsIGFsbCBvdGhlciB0YWJsZXMgYXJlIGxvYWRlZCBub3JtYWxseSBmcm9tIHRoZSBmb250CkBAIC02MCwyMyArNTksMjQgQEAKICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAdHlwZToKICAgICogICBGVF9JbmNyZW1lbnRhbAogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQW4gb3BhcXVlIHR5cGUgZGVzY3JpYmluZyBhIHVzZXItcHJvdmlkZWQgb2JqZWN0IHVzZWQgdG8gaW1wbGVtZW50Ci0gICAqICAgYGluY3JlbWVudGFsJyBnbHlwaCBsb2FkaW5nIHdpdGhpbiBGcmVlVHlwZS4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAqICAgZW1iZWRkZWQgZm9udHMgaW4gY2VydGFpbiBlbnZpcm9ubWVudHMgKGUuZy4sIFBvc3RTY3JpcHQgaW50ZXJwcmV0ZXJzKSwKLSAgICogICB3aGVyZSB0aGUgZ2x5cGggZGF0YSBpc24ndCBpbiB0aGUgZm9udCBmaWxlLCBvciBtdXN0IGJlIG92ZXJyaWRkZW4gYnkKLSAgICogICBkaWZmZXJlbnQgdmFsdWVzLgorICAgKiAgICdpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZyB3aXRoaW4gRnJlZVR5cGUuICBUaGlzIGlzIHVzZWQgdG8gc3VwcG9ydAorICAgKiAgIGVtYmVkZGVkIGZvbnRzIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzIChlLmcuLCBQb3N0U2NyaXB0CisgICAqICAgaW50ZXJwcmV0ZXJzKSwgd2hlcmUgdGhlIGdseXBoIGRhdGEgaXNuJ3QgaW4gdGhlIGZvbnQgZmlsZSwgb3IgbXVzdCBiZQorICAgKiAgIG92ZXJyaWRkZW4gYnkgZGlmZmVyZW50IHZhbHVlcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgSXQgaXMgdXAgdG8gY2xpZW50IGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgYW5kIGltcGxlbWVudCBARlRfSW5jcmVtZW50YWwKLSAgICogICBvYmplY3RzLCBhcyBsb25nIGFzIHRoZXkgcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBtZXRob2RzCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMsIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYwotICAgKiAgIGFuZCBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KKyAgICogICBJdCBpcyB1cCB0byBjbGllbnQgYXBwbGljYXRpb25zIHRvIGNyZWF0ZSBhbmQgaW1wbGVtZW50CisgICAqICAgQEZUX0luY3JlbWVudGFsIG9iamVjdHMsIGFzIGxvbmcgYXMgdGhleSBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBmb3IKKyAgICogICB0aGUgbWV0aG9kcyBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYywKKyAgICogICBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgYW5kCisgICAqICAgQEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMuCiAgICAqCiAgICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIHRvIHVuZGVyc3RhbmQgaG93CiAgICAqICAgdG8gdXNlIGluY3JlbWVudGFsIG9iamVjdHMgd2l0aCBGcmVlVHlwZS4KQEAgLTg1LDE0ICs4NSwxNCBAQAogICB0eXBlZGVmIHN0cnVjdCBGVF9JbmNyZW1lbnRhbFJlY18qICBGVF9JbmNyZW1lbnRhbDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBzdHJ1Y3Q6CiAgICAqICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzbWFsbCBzdHJ1Y3R1cmUgdXNlZCB0byBjb250YWluIHRoZSBiYXNpYyBnbHlwaCBtZXRyaWNzIHJldHVybmVkCi0gICAqICAgYnkgdGhlIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaE1ldHJpY3NGdW5jIG1ldGhvZC4KKyAgICogICBBIHNtYWxsIHN0cnVjdHVyZSB1c2VkIHRvIGNvbnRhaW4gdGhlIGJhc2ljIGdseXBoIG1ldHJpY3MgcmV0dXJuZWQgYnkKKyAgICogICB0aGUgQEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMgbWV0aG9kLgogICAgKgogICAgKiBAZmllbGRzOgogICAgKiAgIGJlYXJpbmdfeCA6OgpAQCAtMTA5LDcgKzEwOSw3IEBACiAgICAqCiAgICAqIEBub3RlOgogICAgKiAgIFRoZXNlIGNvcnJlc3BvbmQgdG8gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGRlcGVuZGluZyBvbiB0aGUKLSAgICogICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsJyBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24KKyAgICogICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsYCBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24KICAgICogICBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KICAgICoKICAgICovCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgfSBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHN0cnVjdDoKICAgICogICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzCkBAIC0xMzUsNyArMTM1LDcgQEAKICAgIHR5cGVkZWYgc3RydWN0IEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWNfKiAgRlRfSW5jcmVtZW50YWxfTWV0cmljczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEB0eXBlOgogICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMKQEAgLTE0Nyw4ICsxNDcsOCBAQAogICAgKgogICAgKiAgIE5vdGUgdGhhdCB0aGUgZm9ybWF0IG9mIHRoZSBnbHlwaCdzIGRhdGEgYnl0ZXMgZGVwZW5kcyBvbiB0aGUgZm9udAogICAgKiAgIGZpbGUgZm9ybWF0LiAgRm9yIFRydWVUeXBlLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHJhdyBieXRlcyB3aXRoaW4KLSAgICogICB0aGUgYGdseWYnIHRhYmxlLiAgRm9yIFBvc3RTY3JpcHQgZm9ybWF0cywgaXQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZQotICAgKiAgICp1bmVuY3J5cHRlZCogY2hhcnN0cmluZyBieXRlcywgd2l0aG91dCBhbnkgYGxlbklWJyBoZWFkZXIuICBJdCBpcworICAgKiAgIHRoZSAnZ2x5ZicgdGFibGUuICBGb3IgUG9zdFNjcmlwdCBmb3JtYXRzLCBpdCBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlCisgICAqICAgKip1bmVuY3J5cHRlZCoqIGNoYXJzdHJpbmcgYnl0ZXMsIHdpdGhvdXQgYW55IGBsZW5JVmAgaGVhZGVyLiAgSXQgaXMKICAgICogICB1bmRlZmluZWQgZm9yIGFueSBvdGhlciBmb3JtYXQuCiAgICAqCiAgICAqIEBpbnB1dDoKQEAgLTE2OSw4ICsxNjksOCBAQAogICAgKgogICAgKiBAbm90ZToKICAgICogICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRoZSBtZXRob2QKLSAgICogICBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgdG8gcmVsZWFzZQotICAgKiAgIHRoZSBkYXRhIGJ5dGVzLgorICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYyB3aWxsIGJlIGNhbGxlZCBsYXRlciB0byByZWxlYXNlIHRoZQorICAgKiAgIGRhdGEgYnl0ZXMuCiAgICAqCiAgICAqICAgTmVzdGVkIGNhbGxzIHRvIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jIGNhbiBoYXBwZW4gZm9yCiAgICAqICAgY29tcG91bmQgZ2x5cGhzLgpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RhdGEqICAgICAgICBhZGF0YSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHR5cGU6CiAgICAqICAgRlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgICAgIGRhdGEgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEB0eXBlOgogICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMKQEAgLTIxNCw4ICsyMTQsOCBAQAogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJldHJpZXZlIHRoZSBiYXNpYyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXgKICAgICogICBiZWZvcmUgYWNjZXNzaW5nIGl0cyBkYXRhLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgaW4gY2VydGFpbgotICAgKiAgIGZvcm1hdHMgbGlrZSBUcnVlVHlwZSwgdGhlIG1ldHJpY3MgYXJlIHN0b3JlZCBpbiBhIGRpZmZlcmVudCBwbGFjZSBmcm9tCi0gICAqICAgdGhlIGdseXBoIGltYWdlcyBwcm9wZXIuCisgICAqICAgZm9ybWF0cyBsaWtlIFRydWVUeXBlLCB0aGUgbWV0cmljcyBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IHBsYWNlCisgICAqICAgZnJvbSB0aGUgZ2x5cGggaW1hZ2VzIHByb3Blci4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgIGluY3JlbWVudGFsIDo6CkBAIC0yMjksOSArMjI5LDkgQEAKICAgICogICAgIElmIHRydWUsIHJldHVybiB2ZXJ0aWNhbCBtZXRyaWNzLgogICAgKgogICAgKiAgIGFtZXRyaWNzIDo6Ci0gICAqICAgICBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCi0gICAqICAgICBUaGUgb3JpZ2luYWwgZ2x5cGggbWV0cmljcywgaWYgYW55LCBpbiBmb250IHVuaXRzLiAgSWYgbWV0cmljcyBhcmUKLSAgICogICAgIG5vdCBhdmFpbGFibGUgYWxsIHRoZSB2YWx1ZXMgbXVzdCBiZSBzZXQgdG8gemVyby4KKyAgICogICAgIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4gIFRoZSBvcmlnaW5hbAorICAgKiAgICAgZ2x5cGggbWV0cmljcywgaWYgYW55LCBpbiBmb250IHVuaXRzLiAgSWYgbWV0cmljcyBhcmUgbm90IGF2YWlsYWJsZQorICAgKiAgICAgYWxsIHRoZSB2YWx1ZXMgbXVzdCBiZSBzZXQgdG8gemVyby4KICAgICoKICAgICogQG91dHB1dDoKICAgICogICBhbWV0cmljcyA6OgpAQCAtMjUyLDggKzI1Miw4IEBACiAgICAqICAgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgZm9udHMgdGhhdCBsb2FkIGRhdGEKLSAgICogICBpbmNyZW1lbnRhbGx5LiAgVXNlZCBpbiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjLgorICAgKiAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgZm9udHMgdGhhdCBsb2FkIGRhdGEgaW5jcmVtZW50YWxseS4KKyAgICogICBVc2VkIGluIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMuCiAgICAqCiAgICAqIEBmaWVsZHM6CiAgICAqICAgZ2V0X2dseXBoX2RhdGEgOjoKQEAgLTI2Myw4ICsyNjMsOCBAQAogICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHJlbGVhc2UgZ2x5cGggZGF0YS4gIE11c3Qgbm90IGJlIG51bGwuCiAgICAqCiAgICAqICAgZ2V0X2dseXBoX21ldHJpY3MgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggbWV0cmljcy4gIE1heSBiZSBudWxsIGlmIHRoZSBmb250IGRvZXMKLSAgICogICAgIG5vdCBwcm92aWRlIG92ZXJyaWRpbmcgZ2x5cGggbWV0cmljcy4KKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBnZXQgZ2x5cGggbWV0cmljcy4gIE1heSBiZSBudWxsIGlmIHRoZSBmb250IGRvZXMgbm90CisgICAqICAgICBwcm92aWRlIG92ZXJyaWRpbmcgZ2x5cGggbWV0cmljcy4KICAgICoKICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlY18KQEAgLTI3Niw3ICsyNzYsNyBAQAogICB9IEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHN0cnVjdDoKICAgICogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMKQEAgLTI4NiwzMCArMjg2LDMwIEBACiAgICAqICAgd2FudHMgdG8gc3VwcG9ydCBpbmNyZW1lbnRhbCBnbHlwaCBsb2FkaW5nLiAgWW91IHNob3VsZCB1c2UgaXQgd2l0aAogICAgKiAgIEBGVF9QQVJBTV9UQUdfSU5DUkVNRU5UQUwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgogICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgIGluY19pbnQ7Ci0gICAqICAgICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOwotICAgKiAgICAgICBGVF9PcGVuX0FyZ3MgICAgICAgICAgICAgICAgIG9wZW5fYXJnczsKKyAgICogICBgYGAKKyAgICogICAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyAgaW5jX2ludDsKKyAgICogICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgcGFyYW1ldGVyOworICAgKiAgICAgRlRfT3Blbl9BcmdzICAgICAgICAgICAgICAgICBvcGVuX2FyZ3M7CiAgICAqCiAgICAqCi0gICAqICAgICAgIC8vIHNldCB1cCBpbmNyZW1lbnRhbCBkZXNjcmlwdG9yCi0gICAqICAgICAgIGluY19pbnQuZnVuY3MgID0gbXlfZnVuY3M7Ci0gICAqICAgICAgIGluY19pbnQub2JqZWN0ID0gbXlfb2JqZWN0OworICAgKiAgICAgLy8gc2V0IHVwIGluY3JlbWVudGFsIGRlc2NyaXB0b3IKKyAgICogICAgIGluY19pbnQuZnVuY3MgID0gbXlfZnVuY3M7CisgICAqICAgICBpbmNfaW50Lm9iamVjdCA9IG15X29iamVjdDsKICAgICoKLSAgICogICAgICAgLy8gc2V0IHVwIG9wdGlvbmFsIHBhcmFtZXRlcgotICAgKiAgICAgICBwYXJhbWV0ZXIudGFnICA9IEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTDsKLSAgICogICAgICAgcGFyYW1ldGVyLmRhdGEgPSAmaW5jX2ludDsKKyAgICogICAgIC8vIHNldCB1cCBvcHRpb25hbCBwYXJhbWV0ZXIKKyAgICogICAgIHBhcmFtZXRlci50YWcgID0gRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMOworICAgKiAgICAgcGFyYW1ldGVyLmRhdGEgPSAmaW5jX2ludDsKICAgICoKLSAgICogICAgICAgLy8gc2V0IHVwIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUKLSAgICogICAgICAgb3Blbl9hcmdzLmZsYWdzICAgICAgPSBGVF9PUEVOX1BBVEhOQU1FIHwgRlRfT1BFTl9QQVJBTVM7Ci0gICAqICAgICAgIG9wZW5fYXJncy5wYXRobmFtZSAgID0gbXlfZm9udF9wYXRobmFtZTsKLSAgICogICAgICAgb3Blbl9hcmdzLm51bV9wYXJhbXMgPSAxOwotICAgKiAgICAgICBvcGVuX2FyZ3MucGFyYW1zICAgICA9ICZwYXJhbWV0ZXI7IC8vIHdlIHVzZSBvbmUgb3B0aW9uYWwgYXJndW1lbnQKKyAgICogICAgIC8vIHNldCB1cCBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlCisgICAqICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsKKyAgICogICAgIG9wZW5fYXJncy5wYXRobmFtZSAgID0gbXlfZm9udF9wYXRobmFtZTsKKyAgICogICAgIG9wZW5fYXJncy5udW1fcGFyYW1zID0gMTsKKyAgICogICAgIG9wZW5fYXJncy5wYXJhbXMgICAgID0gJnBhcmFtZXRlcjsgLy8gd2UgdXNlIG9uZSBvcHRpb25hbCBhcmd1bWVudAogICAgKgotICAgKiAgICAgICAvLyBvcGVuIHRoZSBmb250Ci0gICAqICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsKLSAgICogICAgICAgLi4uCi0gICAqICAgICB9CisgICAqICAgICAvLyBvcGVuIHRoZSBmb250CisgICAqICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgJm9wZW5fYXJncywgaW5kZXgsICZmYWNlICk7CisgICAqICAgICAuLi4KKyAgICogICBgYGAKICAgICoKICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWNfCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgfSBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAdHlwZToKICAgICogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsY2RmaWwuaAppbmRleCAyYTI3MTk2Li5jNjk5NWYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGxjZGZpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb2xvciBmaWx0ZXJpbmcgb2Ygc3VicGl4ZWwgYml0bWFwIGdseXBocyAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRsY2RmaWwuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBjb2xvciBmaWx0ZXJpbmcgb2Ygc3VicGl4ZWwgYml0bWFwIGdseXBocworICogICAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUTENERklMX0hfCiAjZGVmaW5lIEZUTENERklMX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfUEFSQU1FVEVSX1RBR1NfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRwYXJhbXMuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMywxMDUgKzMyLDk4IEBACiAKIEZUX0JFR0lOX0hFQURFUgogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBzZWN0aW9uOgotICAgKiAgIGxjZF9maWx0ZXJpbmcKKyAgICogICBsY2RfcmVuZGVyaW5nCiAgICAqCiAgICAqIEB0aXRsZToKLSAgICogICBMQ0QgRmlsdGVyaW5nCisgICAqICAgU3VicGl4ZWwgUmVuZGVyaW5nCiAgICAqCiAgICAqIEBhYnN0cmFjdDoKLSAgICogICBSZWR1Y2UgY29sb3IgZnJpbmdlcyBvZiBzdWJwaXhlbC1yZW5kZXJlZCBiaXRtYXBzLgorICAgKiAgIEFQSSB0byBjb250cm9sIHN1YnBpeGVsIHJlbmRlcmluZy4KICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFNob3VsZCB5b3UgI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyBpbiB5b3VyCi0gICAqICAgYGZ0b3B0aW9uLmgnLCB3aGljaCBlbmFibGVzIHBhdGVudGVkIENsZWFyVHlwZS1zdHlsZSByZW5kZXJpbmcsCi0gICAqICAgdGhlIExDRC1vcHRpbWl6ZWQgZ2x5cGggYml0bWFwcyBzaG91bGQgYmUgZmlsdGVyZWQgdG8gcmVkdWNlIGNvbG9yCi0gICAqICAgZnJpbmdlcyBpbmhlcmVudCB0byB0aGlzIHRlY2hub2xvZ3kuICBUaGUgZGVmYXVsdCBGcmVlVHlwZSBMQ0QKLSAgICogICByZW5kZXJpbmcgdXNlcyBkaWZmZXJlbnQgdGVjaG5vbG9neSwgYW5kIEFQSSBkZXNjcmliZWQgYmVsb3csCi0gICAqICAgYWx0aG91Z2ggYXZhaWxhYmxlLCBkb2VzIG5vdGhpbmcuCisgICAqICAgRnJlZVR5cGUgcHJvdmlkZXMgdHdvIGFsdGVybmF0aXZlIHN1YnBpeGVsIHJlbmRlcmluZyB0ZWNobm9sb2dpZXMuIAorICAgKiAgIFNob3VsZCB5b3UgZGVmaW5lIGBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklOR2AgaW4geW91cgorICAgKiAgIGBmdG9wdGlvbi5oYCBmaWxlLCB0aGlzIGVuYWJsZXMgQ2xlYXJUeXBlLXN0eWxlIHJlbmRlcmluZy4KKyAgICogICBPdGhlcndpc2UsIEhhcm1vbnkgTENEIHJlbmRlcmluZyBpcyBlbmFibGVkLiAgVGhlc2UgdGVjaG5vbG9naWVzIGFyZQorICAgKiAgIGNvbnRyb2xsZWQgZGlmZmVyZW50bHkgYW5kIEFQSSBkZXNjcmliZWQgYmVsb3csIGFsdGhvdWdoIGFsd2F5cworICAgKiAgIGF2YWlsYWJsZSwgcGVyZm9ybXMgaXRzIGZ1bmN0aW9uIHdoZW4gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGVuYWJsZWQKKyAgICogICBhbmQgZG9lcyBub3RoaW5nIG90aGVyd2lzZS4KICAgICoKICAgICogICBDbGVhclR5cGUtc3R5bGUgTENEIHJlbmRlcmluZyBleHBsb2l0cyB0aGUgY29sb3Itc3RyaXBlZCBzdHJ1Y3R1cmUgb2YKICAgICogICBMQ0QgcGl4ZWxzLCBpbmNyZWFzaW5nIHRoZSBhdmFpbGFibGUgcmVzb2x1dGlvbiBpbiB0aGUgZGlyZWN0aW9uIG9mCi0gICAqICAgdGhlIHN0cmlwZSAodXN1YWxseSBob3Jpem9udGFsIFJHQikgYnkgYSBmYWN0b3Igb2Z+My4gIFNpbmNlIHRoZXNlCi0gICAqICAgc3VicGl4ZWxzIGFyZSBjb2xvciBwaXhlbHMsIHVzaW5nIHRoZW0gdW5maWx0ZXJlZCBjcmVhdGVzIHNldmVyZQotICAgKiAgIGNvbG9yIGZyaW5nZXMuICBVc2UgdGhlIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciBBUEkgdG8gc3BlY2lmeSBhCi0gICAqICAgbG93LXBhc3MgZmlsdGVyLCB3aGljaCBpcyB0aGVuIGFwcGxpZWQgdG8gc3VicGl4ZWwtcmVuZGVyZWQgYml0bWFwcwotICAgKiAgIGdlbmVyYXRlZCB0aHJvdWdoIEBGVF9SZW5kZXJfR2x5cGguICBUaGUgZmlsdGVyIHNhY3JpZmljZXMgc29tZSBvZgotICAgKiAgIHRoZSBoaWdoZXIgcmVzb2x1dGlvbiB0byByZWR1Y2UgY29sb3IgZnJpbmdlcywgbWFraW5nIHRoZSBnbHlwaCBpbWFnZQotICAgKiAgIHNsaWdodGx5IGJsdXJyaWVyLiAgUG9zaXRpb25hbCBpbXByb3ZlbWVudHMgd2lsbCByZW1haW4uCisgICAqICAgdGhlIHN0cmlwZSAodXN1YWxseSBob3Jpem9udGFsIFJHQikgYnkgYSBmYWN0b3Igb2Z+My4gIFVzaW5nIHRoZQorICAgKiAgIHN1YnBpeGVscyBjb3ZlcmFnZXMgdW5maWx0ZXJlZCBjYW4gY3JlYXRlIHNldmVyZSBjb2xvciBmcmluZ2VzCisgICAqICAgZXNwZWNpYWxseSB3aGVuIHJlbmRlcmluZyB0aGluIGZlYXR1cmVzLiAgSW5kZWVkLCB0byBwcm9kdWNlCisgICAqICAgYmxhY2stb24td2hpdGUgdGV4dCwgdGhlIG5lYXJieSBjb2xvciBzdWJwaXhlbHMgbXVzdCBiZSBkaW1tZWQKKyAgICogICBlcXVhbGx5LgogICAgKgotICAgKiAgIEEgZmlsdGVyIHNob3VsZCBoYXZlIHR3byBwcm9wZXJ0aWVzOgorICAgKiAgIEEgZ29vZCA1LXRhcCBGSVIgZmlsdGVyIHNob3VsZCBiZSBhcHBsaWVkIHRvIHN1YnBpeGVsIGNvdmVyYWdlcworICAgKiAgIHJlZ2FyZGxlc3Mgb2YgcGl4ZWwgYm91bmRhcmllcyBhbmQgc2hvdWxkIGhhdmUgdGhlc2UgcHJvcGVydGllczoKICAgICoKLSAgICogICAxKSBJdCBzaG91bGQgYmUgbm9ybWFsaXplZCwgbWVhbmluZyB0aGUgc3VtIG9mIHRoZSA1fmNvbXBvbmVudHMKLSAgICogICAgICBzaG91bGQgYmUgMjU2ICgweDEwMCkuICBJdCBpcyBwb3NzaWJsZSB0byBnbyBhYm92ZSBvciB1bmRlciB0aGlzCi0gICAqICAgICAgdGFyZ2V0IHN1bSwgaG93ZXZlcjogZ29pbmcgdW5kZXIgbWVhbnMgdG9zc2luZyBvdXQgY29udHJhc3QsIGdvaW5nCi0gICAqICAgICAgb3ZlciBtZWFucyBpbnZva2luZyBjbGFtcGluZyBhbmQgdGhlcmVieSBub24tbGluZWFyaXRpZXMgdGhhdAotICAgKiAgICAgIGluY3JlYXNlIGNvbnRyYXN0IHNvbWV3aGF0IGF0IHRoZSBleHBlbnNlIG9mIGdyZWF0ZXIgZGlzdG9ydGlvbgotICAgKiAgICAgIGFuZCBjb2xvci1mcmluZ2luZy4gIENvbnRyYXN0IGlzIGJldHRlciBlbmhhbmNlZCB0aHJvdWdoIHN0ZW0KLSAgICogICAgICBkYXJrZW5pbmcuCisgICAqICAgMS4gSXQgc2hvdWxkIGJlIHN5bW1ldHJpY2FsLCBsaWtlIHt+YSwgYiwgYywgYiwgYX59LCB0byBhdm9pZAorICAgKiAgICAgIGFueSBzaGlmdHMgaW4gYXBwZWFyYW5jZS4KICAgICoKLSAgICogICAyKSBJdCBzaG91bGQgYmUgY29sb3ItYmFsYW5jZWQsIG1lYW5pbmcgYSBmaWx0ZXIgYHt+YSwgYiwgYywgYiwgYX59JwotICAgKiAgICAgIHdoZXJlIGF+KyBifj1+Yy4gIEl0IGRpc3RyaWJ1dGVzIHRoZSBjb21wdXRlZCBjb3ZlcmFnZSBmb3Igb25lCi0gICAqICAgICAgc3VicGl4ZWwgdG8gYWxsIHN1YnBpeGVscyBlcXVhbGx5LCBzYWNyaWZpY2luZyBzb21lIHdvbiByZXNvbHV0aW9uCi0gICAqICAgICAgYnV0IGRyYXN0aWNhbGx5IHJlZHVjaW5nIGNvbG9yLWZyaW5naW5nLiAgUG9zaXRpb25pbmcgaW1wcm92ZW1lbnRzCi0gICAqICAgICAgcmVtYWluISAgTm90ZSB0aGF0IGNvbG9yLWZyaW5naW5nIGNhbiBvbmx5IHJlYWxseSBiZSBtaW5pbWl6ZWQKLSAgICogICAgICB3aGVuIHVzaW5nIGEgY29sb3ItYmFsYW5jZWQgZmlsdGVyIGFuZCBhbHBoYS1ibGVuZGluZyB0aGUgZ2x5cGgKLSAgICogICAgICBvbnRvIGEgc3VyZmFjZSBpbiBsaW5lYXIgc3BhY2U7IHNlZSBARlRfUmVuZGVyX0dseXBoLgorICAgKiAgIDIuIEl0IHNob3VsZCBiZSBjb2xvci1iYWxhbmNlZCwgbWVhbmluZyBhfisgYn49fmMsIHRvIHJlZHVjZSBjb2xvcgorICAgKiAgICAgIGZyaW5nZXMgYnkgZGlzdHJpYnV0aW5nIHRoZSBjb21wdXRlZCBjb3ZlcmFnZSBmb3Igb25lIHN1YnBpeGVsIHRvCisgICAqICAgICAgYWxsIHN1YnBpeGVscyBlcXVhbGx5LgogICAgKgotICAgKiAgIFJlZ2FyZGluZyB0aGUgZm9ybSwgYSBmaWx0ZXIgY2FuIGJlIGEgYGJveHknIGZpbHRlciBvciBhIGBiZXZlbGVkJwotICAgKiAgIGZpbHRlci4gIEJveHkgZmlsdGVycyBhcmUgc2hhcnBlciBidXQgYXJlIGxlc3MgZm9yZ2l2aW5nIG9mIG5vbi1pZGVhbAotICAgKiAgIGdhbW1hIGN1cnZlcyBvZiBhIHNjcmVlbiAodmlld2luZyBhbmdsZXMhKSwgYmV2ZWxlZCBmaWx0ZXJzIGFyZQotICAgKiAgIGZ1enppZXIgYnV0IG1vcmUgdG9sZXJhbnQuCisgICAqICAgMy4gSXQgc2hvdWxkIGJlIG5vcm1hbGl6ZWQsIG1lYW5pbmcgMmF+KyAyYn4rIGN+PX4xLjAgdG8gbWFpbnRhaW4KKyAgICogICAgICBvdmVyYWxsIGJyaWdodG5lc3MuCiAgICAqCi0gICAqICAgRXhhbXBsZXM6CisgICAqICAgQm94eSAzLXRhcCBmaWx0ZXIgezAsIDEvMywgMS8zLCAxLzMsIDB9IGlzIHNoYXJwZXIgYnV0IGlzIGxlc3MKKyAgICogICBmb3JnaXZpbmcgb2Ygbm9uLWlkZWFsIGdhbW1hIGN1cnZlcyBvZiBhIHNjcmVlbiAoYW5kIHZpZXdpbmcgYW5nbGVzKSwKKyAgICogICBiZXZlbGVkIGZpbHRlcnMgYXJlIGZ1enppZXIgYnV0IG1vcmUgdG9sZXJhbnQuCiAgICAqCi0gICAqICAgLSBbMHgxMCAweDQwIDB4NzAgMHg0MCAweDEwXSBpcyBiZXZlbGVkIGFuZCBuZWl0aGVyIGJhbGFuY2VkIG5vcgotICAgKiAgICAgbm9ybWFsaXplZC4KKyAgICogICBVc2UgdGhlIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciBvciBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzCisgICAqICAgQVBJIHRvIHNwZWNpZnkgYSBsb3ctcGFzcyBmaWx0ZXIsIHdoaWNoIGlzIHRoZW4gYXBwbGllZCB0bworICAgKiAgIHN1YnBpeGVsLXJlbmRlcmVkIGJpdG1hcHMgZ2VuZXJhdGVkIHRocm91Z2ggQEZUX1JlbmRlcl9HbHlwaC4KICAgICoKLSAgICogICAtIFsweDFBIDB4MzMgMHg0RCAweDMzIDB4MUFdIGlzIGJldmVsZWQgYW5kIGJhbGFuY2VkIGJ1dCBub3QKLSAgICogICAgIG5vcm1hbGl6ZWQuCisgICAqICAgSGFybW9ueSBMQ0QgcmVuZGVyaW5nIGlzIHN1aXRhYmxlIHRvIHBhbmVscyB3aXRoIGFueSByZWd1bGFyIHN1YnBpeGVsCisgICAqICAgc3RydWN0dXJlLCBub3QganVzdCBtb25pdG9ycyB3aXRoIDMgY29sb3Igc3RyaXBlZCBzdWJwaXhlbHMsIGFzIGxvbmcKKyAgICogICBhcyB0aGUgY29sb3Igc3VicGl4ZWxzIGhhdmUgZml4ZWQgcG9zaXRpb25zIHJlbGF0aXZlIHRvIHRoZSBwaXhlbAorICAgKiAgIGNlbnRlci4gIEluIHRoaXMgY2FzZSwgZWFjaCBjb2xvciBjaGFubmVsIGlzIHRoZW4gcmVuZGVyZWQgc2VwYXJhdGVseQorICAgKiAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBvdXRsaW5lIG9wcG9zaXRlIHRvIHRoZSBzdWJwaXhlbCBzaGlmdCBzbyB0aGF0IHRoZQorICAgKiAgIGNvdmVyYWdlIG1hcHMgYXJlIGFsaWduZWQuICBUaGlzIG1ldGhvZCBpcyBpbW11bmUgdG8gY29sb3IgZnJpbmdlcworICAgKiAgIGJlY2F1c2UgdGhlIHNoaWZ0cyBkbyBub3QgY2hhbmdlIGludGVncmFsIGNvdmVyYWdlLgogICAgKgotICAgKiAgIC0gWzB4MTkgMHgzMyAweDY2IDB4NGMgMHgxOV0gaXMgYmV2ZWxlZCBhbmQgbm9ybWFsaXplZCBidXQgbm90Ci0gICAqICAgICBiYWxhbmNlZC4KKyAgICogICBUaGUgc3VicGl4ZWwgZ2VvbWV0cnkgbXVzdCBiZSBzcGVjaWZpZWQgYnkgeHktY29vcmRpbmF0ZXMgZm9yIGVhY2gKKyAgICogICBzdWJwaXhlbC4gQnkgY29udmVudGlvbiB0aGV5IG1heSBjb21lIGluIHRoZSBSR0Igb3JkZXI6IHt7LTEvMywgMH0sCisgICAqICAgezAsIDB9LCB7MS8zLCAwfX0gZm9yIHN0YW5kYXJkIFJHQiBzdHJpcGVkIHBhbmVsIG9yIHt7LTEvNiwgMS80fSwKKyAgICogICB7LTEvNiwgLTEvNH0sIHsxLzMsIDB9fSBmb3IgYSBjZXJ0YWluIFBlblRpbGUgcGFuZWwuCiAgICAqCi0gICAqICAgLSBbMHgwMCAweDRjIDB4NjYgMHg0YyAweDAwXSBpcyBib3hpbHkgYmV2ZWxlZCBhbmQgbm9ybWFsaXplZCBidXQgbm90Ci0gICAqICAgICBiYWxhbmNlZC4KKyAgICogICBVc2UgdGhlIEBGVF9MaWJyYXJ5X1NldExjZEdlb21ldHJ5IEFQSSB0byBzcGVjaWZ5IHN1YnBpeGVsIHBvc2l0aW9ucy4KKyAgICogICBJZiBvbmUgZm9sbG93cyB0aGUgUkdCIG9yZGVyIGNvbnZlbnRpb24sIHRoZSBzYW1lIG9yZGVyIGFwcGxpZXMgdG8gdGhlCisgICAqICAgcmVzdWx0aW5nIEBGVF9QSVhFTF9NT0RFX0xDRCBhbmQgQEZUX1BJWEVMX01PREVfTENEX1YgYml0bWFwcy4gIE5vdGUsCisgICAqICAgaG93ZXZlciwgdGhhdCB0aGUgY29vcmRpbmF0ZSBmcmFtZSBmb3IgdGhlIGxhdHRlciBtdXN0IGJlIHJvdGF0ZWQKKyAgICogICBjbG9ja3dpc2UuICBIYXJtb255IHdpdGggZGVmYXVsdCBMQ0QgZ2VvbWV0cnkgaXMgZXF1aXZhbGVudCB0bworICAgKiAgIENsZWFyVHlwZSB3aXRoIGxpZ2h0IGZpbHRlci4KICAgICoKLSAgICogICAtIFsweDAwIDB4NTUgMHg1NiAweDU1IDB4MDBdIGlzIGJveHksIG5vcm1hbGl6ZWQsIGFuZCBhbG1vc3QKLSAgICogICAgIGJhbGFuY2VkLgorICAgKiAgIEFzIGEgcmVzdWx0IG9mIENsZWFyVHlwZSBmaWx0ZXJpbmcgb3IgSGFybW9ueSByZW5kZXJpbmcsIHRoZQorICAgKiAgIGRpbWVuc2lvbnMgb2YgTENEIGJpdG1hcHMgY2FuIGJlIGVpdGhlciB3aWRlciBvciB0YWxsZXIgdGhhbiB0aGUKKyAgICogICBkaW1lbnNpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIG91dGxpbmUgd2l0aCByZWdhcmQgdG8gdGhlIHBpeGVsIGdyaWQuCisgICAqICAgRm9yIGV4YW1wbGUsIGZvciBARlRfUkVOREVSX01PREVfTENELCB0aGUgZmlsdGVyIGFkZHMgMn5zdWJwaXhlbHMgdG8KKyAgICogICB0aGUgbGVmdCwgYW5kIDJ+c3VicGl4ZWxzIHRvIHRoZSByaWdodC4gIFRoZSBiaXRtYXAgb2Zmc2V0IHZhbHVlcyBhcmUKKyAgICogICBhZGp1c3RlZCBhY2NvcmRpbmdseSwgc28gY2xpZW50cyBzaG91bGRuJ3QgbmVlZCB0byBtb2RpZnkgdGhlaXIgbGF5b3V0CisgICAqICAgYW5kIGdseXBoIHBvc2l0aW9uaW5nIGNvZGUgd2hlbiBlbmFibGluZyB0aGUgZmlsdGVyLgogICAgKgotICAgKiAgIC0gWzB4MDggMHg0RCAweDU2IDB4NEQgMHgwOF0gaXMgYmV2ZWxlZCwgbm9ybWFsaXplZCBhbmQsIGFsbW9zdAotICAgKiAgICAgYmFsYW5jZWQuCisgICAqICAgVGhlIENsZWFyVHlwZSBhbmQgSGFybW9ueSByZW5kZXJpbmcgaXMgYXBwbGljYWJsZSB0byBnbHlwaCBiaXRtYXBzCisgICAqICAgcmVuZGVyZWQgdGhyb3VnaCBARlRfUmVuZGVyX0dseXBoLCBARlRfTG9hZF9HbHlwaCwgQEZUX0xvYWRfQ2hhciwgYW5kCisgICAqICAgQEZUX0dseXBoX1RvX0JpdG1hcCwgd2hlbiBARlRfUkVOREVSX01PREVfTENEIG9yIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVgorICAgKiAgIGlzIHNwZWNpZmllZC4gIFRoaXMgQVBJIGRvZXMgbm90IGNvbnRyb2wgQEZUX091dGxpbmVfUmVuZGVyIGFuZAorICAgKiAgIEBGVF9PdXRsaW5lX0dldF9CaXRtYXAuCiAgICAqCi0gICAqICAgVGhlIGZpbHRlciBhZmZlY3RzIGdseXBoIGJpdG1hcHMgcmVuZGVyZWQgdGhyb3VnaCBARlRfUmVuZGVyX0dseXBoLAotICAgKiAgIEBGVF9Mb2FkX0dseXBoLCBhbmQgQEZUX0xvYWRfQ2hhci4gIEl0IGRvZXMgX25vdF8gYWZmZWN0IHRoZSBvdXRwdXQKLSAgICogICBvZiBARlRfT3V0bGluZV9SZW5kZXIgYW5kIEBGVF9PdXRsaW5lX0dldF9CaXRtYXAuCi0gICAqCi0gICAqICAgSWYgdGhpcyBmZWF0dXJlIGlzIGFjdGl2YXRlZCwgdGhlIGRpbWVuc2lvbnMgb2YgTENEIGdseXBoIGJpdG1hcHMgYXJlCi0gICAqICAgZWl0aGVyIHdpZGVyIG9yIHRhbGxlciB0aGFuIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAqICAgb3V0bGluZSB3aXRoIHJlZ2FyZCB0byB0aGUgcGl4ZWwgZ3JpZC4gIEZvciBleGFtcGxlLCBmb3IKLSAgICogICBARlRfUkVOREVSX01PREVfTENELCB0aGUgZmlsdGVyIGFkZHMgM35zdWJwaXhlbHMgdG8gdGhlIGxlZnQsIGFuZAotICAgKiAgIDN+c3VicGl4ZWxzIHRvIHRoZSByaWdodC4gIFRoZSBiaXRtYXAgb2Zmc2V0IHZhbHVlcyBhcmUgYWRqdXN0ZWQKLSAgICogICBhY2NvcmRpbmdseSwgc28gY2xpZW50cyBzaG91bGRuJ3QgbmVlZCB0byBtb2RpZnkgdGhlaXIgbGF5b3V0IGFuZAotICAgKiAgIGdseXBoIHBvc2l0aW9uaW5nIGNvZGUgd2hlbiBlbmFibGluZyB0aGUgZmlsdGVyLgotICAgKgotICAgKiAgIEl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHRoYXQgbGluZWFyIGFscGhhIGJsZW5kaW5nIGFuZCBnYW1tYQotICAgKiAgIGNvcnJlY3Rpb24gaXMgY3JpdGljYWwgZm9yIGNvcnJlY3RseSByZW5kZXJpbmcgZ2x5cGhzIG9udG8gc3VyZmFjZXMKLSAgICogICB3aXRob3V0IGFydGlmYWN0cyBhbmQgZXZlbiBtb3JlIGNyaXRpY2FsIHdoZW4gc3VicGl4ZWwgcmVuZGVyaW5nIGlzCi0gICAqICAgaW52b2x2ZWQuCi0gICAqCi0gICAqICAgRWFjaCBvZiB0aGUgM35hbHBoYSB2YWx1ZXMgKHN1YnBpeGVscykgaXMgaW5kZXBlbmRlbnRseSB1c2VkIHRvIGJsZW5kCi0gICAqICAgb25lIGNvbG9yIGNoYW5uZWwuICBUaGF0IGlzLCByZWQgYWxwaGEgYmxlbmRzIHRoZSByZWQgY2hhbm5lbCBvZiB0aGUKLSAgICogICB0ZXh0IGNvbG9yIHdpdGggdGhlIHJlZCBjaGFubmVsIG9mIHRoZSBiYWNrZ3JvdW5kIHBpeGVsLiAgVGhlCi0gICAqICAgZGlzdHJpYnV0aW9uIG9mIGRlbnNpdHkgdmFsdWVzIGJ5IHRoZSBjb2xvci1iYWxhbmNlZCBmaWx0ZXIgYXNzdW1lcwotICAgKiAgIGFscGhhIGJsZW5kaW5nIGlzIGRvbmUgaW4gbGluZWFyIHNwYWNlOyBvbmx5IHRoZW4gY29sb3IgYXJ0aWZhY3RzCi0gICAqICAgY2FuY2VsIG91dC4KKyAgICogICBUaGUgZGVzY3JpYmVkIGFsZ29yaXRobXMgY2FuIGNvbXBsZXRlbHkgcmVtb3ZlIGNvbG9yIGFydGVmYWN0cyB3aGVuCisgICAqICAgY29tYmluZWQgd2l0aCBnYW1tYS1jb3JyZWN0ZWQgYWxwaGEgYmxlbmRpbmcgaW4gbGluZWFyIHNwYWNlLiAgRWFjaCBvZgorICAgKiAgIHRoZSAzfmFscGhhIHZhbHVlcyAoc3VicGl4ZWxzKSBtdXN0IGJ5IGluZGVwZW5kZW50bHkgdXNlZCB0byBibGVuZCBvbmUKKyAgICogICBjb2xvciBjaGFubmVsLiAgVGhhdCBpcywgcmVkIGFscGhhIGJsZW5kcyB0aGUgcmVkIGNoYW5uZWwgb2YgdGhlIHRleHQKKyAgICogICBjb2xvciB3aXRoIHRoZSByZWQgY2hhbm5lbCBvZiB0aGUgYmFja2dyb3VuZCBwaXhlbC4KICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgRlRfTGNkRmlsdGVyCkBAIC0xNDUsNDcgKzEzNywyNSBAQAogICAgKiAgICAgcmVzdWx0cyBpbiBzb21ldGltZXMgc2V2ZXJlIGNvbG9yIGZyaW5nZXMuCiAgICAqCiAgICAqICAgRlRfTENEX0ZJTFRFUl9ERUZBVUxUIDo6Ci0gICAqICAgICBUaGUgZGVmYXVsdCBmaWx0ZXIgcmVkdWNlcyBjb2xvciBmcmluZ2VzIGNvbnNpZGVyYWJseSwgYXQgdGhlIGNvc3QKLSAgICogICAgIG9mIGEgc2xpZ2h0IGJsdXJyaW5lc3MgaW4gdGhlIG91dHB1dC4KLSAgICoKLSAgICogICAgIEl0IGlzIGEgYmV2ZWxlZCwgbm9ybWFsaXplZCwgYW5kIGNvbG9yLWJhbGFuY2VkIGZpdmUtdGFwIGZpbHRlcgotICAgKiAgICAgdGhhdCBpcyBtb3JlIGZvcmdpdmluZyB0byBzY3JlZW5zIHdpdGggbm9uLWlkZWFsIGdhbW1hIGN1cnZlcyBhbmQKLSAgICogICAgIHZpZXdpbmcgYW5nbGVzLiAgTm90ZSB0aGF0IHdoaWxlIGNvbG9yLWZyaW5naW5nIGlzIHJlZHVjZWQsIGl0IGNhbgotICAgKiAgICAgb25seSBiZSBtaW5pbWl6ZWQgYnkgdXNpbmcgbGluZWFyIGFscGhhIGJsZW5kaW5nIGFuZCBnYW1tYQotICAgKiAgICAgY29ycmVjdGlvbiB0byByZW5kZXIgZ2x5cGhzIG9udG8gc3VyZmFjZXMuICBUaGUgZGVmYXVsdCBmaWx0ZXIKLSAgICogICAgIHdlaWdodHMgYXJlIFsweDA4IDB4NEQgMHg1NiAweDREIDB4MDhdLgorICAgKiAgICAgVGhpcyBpcyBhIGJldmVsZWQsIG5vcm1hbGl6ZWQsIGFuZCBjb2xvci1iYWxhbmNlZCBmaXZlLXRhcCBmaWx0ZXIKKyAgICogICAgIHdpdGggd2VpZ2h0cyBvZiBbMHgwOCAweDREIDB4NTYgMHg0RCAweDA4XSBpbiAxLzI1NnRoIHVuaXRzLgogICAgKgogICAgKiAgIEZUX0xDRF9GSUxURVJfTElHSFQgOjoKLSAgICogICAgIFRoZSBsaWdodCBmaWx0ZXIgaXMgYSB2YXJpYW50IHRoYXQgaXMgc2hhcnBlciBhdCB0aGUgY29zdCBvZgotICAgKiAgICAgc2xpZ2h0bHkgbW9yZSBjb2xvciBmcmluZ2VzIHRoYW4gdGhlIGRlZmF1bHQgb25lLgotICAgKgotICAgKiAgICAgSXQgaXMgYSBib3h5LCBub3JtYWxpemVkLCBhbmQgY29sb3ItYmFsYW5jZWQgdGhyZWUtdGFwIGZpbHRlciB0aGF0Ci0gICAqICAgICBpcyBsZXNzIGZvcmdpdmluZyB0byBzY3JlZW5zIHdpdGggbm9uLWlkZWFsIGdhbW1hIGN1cnZlcyBhbmQKLSAgICogICAgIHZpZXdpbmcgYW5nbGVzLiAgVGhpcyBmaWx0ZXIgd29ya3MgYmVzdCB3aGVuIHRoZSByZW5kZXJpbmcgc3lzdGVtCi0gICAqICAgICB1c2VzIGxpbmVhciBhbHBoYSBibGVuZGluZyBhbmQgZ2FtbWEgY29ycmVjdGlvbiB0byByZW5kZXIgZ2x5cGhzCi0gICAqICAgICBvbnRvIHN1cmZhY2VzLiAgVGhlIGxpZ2h0IGZpbHRlciB3ZWlnaHRzIGFyZQotICAgKiAgICAgWzB4MDAgMHg1NSAweDU2IDB4NTUgMHgwMF0uCisgICAqICAgICB0aGlzIGlzIGEgYm94eSwgbm9ybWFsaXplZCwgYW5kIGNvbG9yLWJhbGFuY2VkIHRocmVlLXRhcCBmaWx0ZXIgd2l0aAorICAgKiAgICAgd2VpZ2h0cyBvZiBbMHgwMCAweDU1IDB4NTYgMHg1NSAweDAwXSBpbiAxLzI1NnRoIHVuaXRzLgogICAgKgogICAgKiAgIEZUX0xDRF9GSUxURVJfTEVHQUNZIDo6CisgICAqICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxIDo6CiAgICAqICAgICBUaGlzIGZpbHRlciBjb3JyZXNwb25kcyB0byB0aGUgb3JpZ2luYWwgbGliWGZ0IGNvbG9yIGZpbHRlci4gIEl0CiAgICAqICAgICBwcm92aWRlcyBoaWdoIGNvbnRyYXN0IG91dHB1dCBidXQgY2FuIGV4aGliaXQgcmVhbGx5IGJhZCBjb2xvcgogICAgKiAgICAgZnJpbmdlcyBpZiBnbHlwaHMgYXJlIG5vdCBleHRyZW1lbHkgd2VsbCBoaW50ZWQgdG8gdGhlIHBpeGVsIGdyaWQuCi0gICAqICAgICBJbiBvdGhlciB3b3JkcywgaXQgb25seSB3b3JrcyB3ZWxsIGlmIHRoZSBUcnVlVHlwZSBieXRlY29kZQotICAgKiAgICAgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZCAqYW5kKiBoaWdoLXF1YWxpdHkgaGludGVkIGZvbnRzIGFyZSB1c2VkLgotICAgKgogICAgKiAgICAgVGhpcyBmaWx0ZXIgaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcywgYW5kIG1pZ2h0IGJlCi0gICAqICAgICBkaXNhYmxlZCBvciBzdGF5IHVuc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuCi0gICAqCi0gICAqICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxIDo6Ci0gICAqICAgICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgRm9udENvbmZpZyBsaWJyYXJ5IHJldHVybnMgYSBkaWZmZXJlbnQKLSAgICogICAgIGVudW1lcmF0aW9uIHZhbHVlIGZvciBsZWdhY3kgTENEIGZpbHRlcmluZy4gIFRvIG1ha2UgY29kZSB3b3JrIHRoYXQKLSAgICogICAgIChpbmNvcnJlY3RseSkgZm9yd2FyZHMgRm9udENvbmZpZydzIGVudW1lcmF0aW9uIHZhbHVlIHRvCi0gICAqICAgICBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgd2l0aG91dCBwcm9wZXIgbWFwcGluZywgaXQgaXMgdGh1cyBlYXNpZXN0Ci0gICAqICAgICB0byBoYXZlIGFub3RoZXIgZW51bWVyYXRpb24gdmFsdWUsIHdoaWNoIGlzIGNvbXBsZXRlbHkgZXF1YWwgdG8KLSAgICogICAgIGBGVF9MQ0RfRklMVEVSX0xFR0FDWScuCisgICAqICAgICBkaXNhYmxlZCBvciBzdGF5IHVuc3VwcG9ydGVkIGluIHRoZSBmdXR1cmUuIFRoZSBzZWNvbmQgdmFsdWUgaXMKKyAgICogICAgIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggRm9udENvbmZpZywgd2hpY2ggaGlzdG9yaWNhbGx5IHVzZWQKKyAgICogICAgIGRpZmZlcmVudCBlbnVtZXJhdGlvbiwgc29tZXRpbWVzIGluY29ycmVjdGx5IGZvcndhcmRlZCB0byBGcmVlVHlwZS4KICAgICoKICAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wIChgRlRfTENEX0ZJTFRFUl9MRUdBQ1kxJyBzaW5jZSAyLjYuMikKKyAgICogICAyLjMuMCAoYEZUX0xDRF9GSUxURVJfTEVHQUNZMWAgc2luY2UgMi42LjIpCiAgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX0xjZEZpbHRlcl8KICAgewpAQCAtMjAyLDExICsxNzIsMTEgQEAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKLSAgICogQGZ1bmM6CisgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcgogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFwcGx5IGNvbG9yIGZpbHRlcmluZyB0byBMQ0QgZGVjaW1hdGVkCisgICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSBmaWx0ZXIgYXBwbGllZCB0byBMQ0QgZGVjaW1hdGVkCiAgICAqICAgYml0bWFwcywgbGlrZSB0aGUgb25lcyB1c2VkIHdoZW4gY2FsbGluZyBARlRfUmVuZGVyX0dseXBoIHdpdGgKICAgICogICBARlRfUkVOREVSX01PREVfTENEIG9yIEBGVF9SRU5ERVJfTU9ERV9MQ0RfVi4KICAgICoKQEAgLTIxOCwyMiArMTg4LDIxIEBACiAgICAqICAgICBUaGUgZmlsdGVyIHR5cGUuCiAgICAqCiAgICAqICAgICBZb3UgY2FuIHVzZSBARlRfTENEX0ZJTFRFUl9OT05FIGhlcmUgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUsIG9yCi0gICAqICAgICBARlRfTENEX0ZJTFRFUl9ERUZBVUxUIHRvIHVzZSBhIGRlZmF1bHQgZmlsdGVyIHRoYXQgc2hvdWxkIHdvcmsKLSAgICogICAgIHdlbGwgb24gbW9zdCBMQ0Qgc2NyZWVucy4KKyAgICogICAgIEBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgdG8gdXNlIGEgZGVmYXVsdCBmaWx0ZXIgdGhhdCBzaG91bGQgd29yayB3ZWxsCisgICAqICAgICBvbiBtb3N0IExDRCBzY3JlZW5zLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoaXMgZmVhdHVyZSBpcyBhbHdheXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIENsaWVudHMgbXVzdCBtYWtlIGFuCi0gICAqICAgZXhwbGljaXQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uIHdpdGggYSBgZmlsdGVyJyB2YWx1ZSBvdGhlciB0aGFuCi0gICAqICAgQEZUX0xDRF9GSUxURVJfTk9ORSBpbiBvcmRlciB0byBlbmFibGUgaXQuCisgICAqICAgU2luY2UgMi4xMC4zIHRoZSBMQ0QgZmlsdGVyaW5nIGlzIGVuYWJsZWQgd2l0aCBARlRfTENEX0ZJTFRFUl9ERUZBVUxULgorICAgKiAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGV4cGxpY2l0bHkgZXhjZXB0CisgICAqICAgdG8gY2hvb3NlIGEgZGlmZmVyZW50IGZpbHRlciBvciBkaXNhYmxlIGZpbHRlcmluZyBhbHRvZ2V0aGVyIHdpdGgKKyAgICogICBARlRfTENEX0ZJTFRFUl9OT05FLgogICAgKgotICAgKiAgIER1ZSB0byAqUEFURU5UUyogY292ZXJpbmcgc3VicGl4ZWwgcmVuZGVyaW5nLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKLSAgICogICBkbyBhbnl0aGluZyBleGNlcHQgcmV0dXJuaW5nIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB0aGUKLSAgICogICBjb25maWd1cmF0aW9uIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIGlzIG5vdAotICAgKiAgIGRlZmluZWQgaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gYWxsCi0gICAqICAgZGVmYXVsdCBidWlsZHMgb2YgRnJlZVR5cGUuCisgICAqICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgYnV0IHJldHVybnMgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmVgCisgICAqICAgaWYgdGhlIGNvbmZpZ3VyYXRpb24gbWFjcm8gYEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HYCBpcworICAgKiAgIG5vdCBkZWZpbmVkIGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnkuCiAgICAqCiAgICAqIEBzaW5jZToKICAgICogICAyLjMuMApAQCAtMjQ1LDcgKzIxNCw3IEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEBmdW5jOgorICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKQEAgLTI1OCwxNyArMjI3LDE1IEBACiAgICAqCiAgICAqICAgd2VpZ2h0cyA6OgogICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIGFycmF5OyB0aGUgZnVuY3Rpb24gY29waWVzIHRoZSBmaXJzdCBmaXZlIGJ5dGVzIGFuZAotICAgKiAgICAgdXNlcyB0aGVtIHRvIHNwZWNpZnkgdGhlIGZpbHRlciB3ZWlnaHRzLgorICAgKiAgICAgdXNlcyB0aGVtIHRvIHNwZWNpZnkgdGhlIGZpbHRlciB3ZWlnaHRzIGluIDEvMjU2dGggdW5pdHMuCiAgICAqCiAgICAqIEByZXR1cm46CiAgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgRHVlIHRvICpQQVRFTlRTKiBjb3ZlcmluZyBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMgZnVuY3Rpb24gZG9lc24ndAotICAgKiAgIGRvIGFueXRoaW5nIGV4Y2VwdCByZXR1cm5pbmcgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHRoZQotICAgKiAgIGNvbmZpZ3VyYXRpb24gbWFjcm8gRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaXMgbm90Ci0gICAqICAgZGVmaW5lZCBpbiB5b3VyIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byBhbGwKLSAgICogICBkZWZhdWx0IGJ1aWxkcyBvZiBGcmVlVHlwZS4KKyAgICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBidXQgcmV0dXJucyBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAKKyAgICogICBpZiB0aGUgY29uZmlndXJhdGlvbiBtYWNybyBgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkdgIGlzCisgICAqICAgbm90IGRlZmluZWQgaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeS4KICAgICoKICAgICogICBMQ0QgZmlsdGVyIHdlaWdodHMgY2FuIGFsc28gYmUgc2V0IHBlciBmYWNlIHVzaW5nIEBGVF9GYWNlX1Byb3BlcnRpZXMKICAgICogICB3aXRoIEBGVF9QQVJBTV9UQUdfTENEX0ZJTFRFUl9XRUlHSFRTLgpAQCAtMjgxLDcgKzI0OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKndlaWdodHMgKTsKIAogCi0gIC8qCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgogICAgKiBAdHlwZToKICAgICogICBGVF9MY2RGaXZlVGFwRmlsdGVyCiAgICAqCkBAIC0yOTgsNiArMjY2LDUzIEBACiAgIHR5cGVkZWYgRlRfQnl0ZSAgRlRfTGNkRml2ZVRhcEZpbHRlcltGVF9MQ0RfRklMVEVSX0ZJVkVfVEFQU107CiAKIAorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0xpYnJhcnlfU2V0TGNkR2VvbWV0cnkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IGRlZmF1bHQgcG9zaXRpb25zIG9mIGNvbG9yCisgICAqICAgc3VicGl4ZWxzLCB3aGljaCBjb250cm9scyBIYXJtb255IExDRCByZW5kZXJpbmcuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5zdGFuY2UuCisgICAqCisgICAqICAgc3ViIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgMyB2ZWN0b3JzIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQ7CisgICAqICAgICB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIGRlZmF1bHQgdmFsdWVzLCBzZWUgdGhlIG5vdGUgYmVsb3cuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgU3VicGl4ZWwgZ2VvbWV0cnkgZXhhbXBsZXM6CisgICAqCisgICAqICAgLSB7ey0yMSwgMH0sIHswLCAwfSwgezIxLCAwfX0gaXMgdGhlIGRlZmF1bHQsIGNvcnJlc3BvbmRpbmcgdG8gMyBjb2xvcgorICAgKiAgIHN0cmlwZXMgc2hpZnRlZCBieSBhIHRoaXJkIG9mIGEgcGl4ZWwuIFRoaXMgY291bGQgYmUgYW4gUkdCIHBhbmVsLgorICAgKgorICAgKiAgIC0ge3syMSwgMH0sIHswLCAwfSwgey0yMSwgMH19IGxvb2tzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IGJ1dCBjYW4KKyAgICogICBzcGVjaWZ5IGEgQkdSIHBhbmVsIGluc3RlYWQsIHdoaWxlIGtlZXBpbmcgdGhlIGJpdG1hcCBpbiB0aGUgc2FtZQorICAgKiAgIFJHQjg4OCBmb3JtYXQuCisgICAqCisgICAqICAgLSB7ezAsIDIxfSwgezAsIDB9LCB7MCwgLTIxfX0gaXMgdGhlIHZlcnRpY2FsIFJHQiwgYnV0IHRoZSBiaXRtYXAKKyAgICogICBzdGF5cyBSR0I4ODggYXMgYSByZXN1bHQuCisgICAqCisgICAqICAgLSB7ey0xMSwgMTZ9LCB7LTExLCAtMTZ9LCB7MjIsIDB9fSBpcyBhIGNlcnRhaW4gUGVuVGlsZSBhcnJhbmdlbWVudC4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAKKyAgICogICBpbiB0aGUgY29udGV4dCBvZiBDbGVhclR5cGUtc3R5bGUgc3VicGl4ZWwgcmVuZGVyaW5nIHdoZW4KKyAgICogICBgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkdgIGlzIGRlZmluZWQgaW4geW91ciBidWlsZCBvZiB0aGUKKyAgICogICBsaWJyYXJ5LgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4xMC4wCisgICAqLworICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKKyAgRlRfTGlicmFyeV9TZXRMY2RHZW9tZXRyeSggRlRfTGlicmFyeSAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAgc3ViWzNdICk7CisKICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaAppbmRleCAxMTc0NzNiLi40NTg4OTIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmgKQEAgLTEsMzUgKzEsMzQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bGlzdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHZW5lcmljIGxpc3Qgc3VwcG9ydCBmb3IgRnJlZVR5cGUgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bGlzdC5oCisgKgorICogICBHZW5lcmljIGxpc3Qgc3VwcG9ydCBmb3IgRnJlZVR5cGUgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgaW1wbGVtZW50cyBmdW5jdGlvbnMgcmVsYXRpdmUgdG8gbGlzdCBwcm9jZXNzaW5nLiAgSXRzICAgICAqLwotICAvKiAgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGBmcmVldHlwZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHJlbGF0aXZlIHRvIGxpc3QgcHJvY2Vzc2luZy4gIEl0cyBkYXRhCisgICAqIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYGZyZWV0eXBlLmhgLgorICAgKgorICAgKi8KIAogCiAjaWZuZGVmIEZUTElTVF9IXwogI2RlZmluZSBGVExJU1RfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTQxLDIyNCArNDAsMjQ1IEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpc3QgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbXBsZSBtYW5hZ2VtZW50IG9mIGxpc3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbGlzdCAgICAgICAgICAqLwotICAvKiAgICBwcm9jZXNzaW5nIHVzaW5nIGRvdWJseS1saW5rZWQgbm9kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JdGVyYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGxpc3RfcHJvY2Vzc2luZworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgTGlzdCBQcm9jZXNzaW5nCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBTaW1wbGUgbWFuYWdlbWVudCBvZiBsaXN0cy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbGlzdCBwcm9jZXNzaW5nCisgICAqICAgdXNpbmcgZG91Ymx5LWxpbmtlZCBub2Rlcy4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgIEZUX0xpc3QKKyAgICogICBGVF9MaXN0Tm9kZQorICAgKiAgIEZUX0xpc3RSZWMKKyAgICogICBGVF9MaXN0Tm9kZVJlYworICAgKgorICAgKiAgIEZUX0xpc3RfQWRkCisgICAqICAgRlRfTGlzdF9JbnNlcnQKKyAgICogICBGVF9MaXN0X0ZpbmQKKyAgICogICBGVF9MaXN0X1JlbW92ZQorICAgKiAgIEZUX0xpc3RfVXAKKyAgICogICBGVF9MaXN0X0l0ZXJhdGUKKyAgICogICBGVF9MaXN0X0l0ZXJhdG9yCisgICAqICAgRlRfTGlzdF9GaW5hbGl6ZQorICAgKiAgIEZUX0xpc3RfRGVzdHJ1Y3RvcgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgdGhlIGxpc3Qgbm9kZSBmb3IgYSBnaXZlbiBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaXN0IG5vZGUuICBOVUxMIGlmIGl0IHdhc24ndCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTGlzdF9GaW5kCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBGaW5kIHRoZSBsaXN0IG5vZGUgZm9yIGEgZ2l2ZW4gbGlzdGVkIG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpc3QgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuCisgICAqICAgZGF0YSA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGxpc3RlZCBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgTGlzdCBub2RlLiAgYE5VTExgIGlmIGl0IHdhc24ndCBmb3VuZC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfTGlzdE5vZGUgKQogICBGVF9MaXN0X0ZpbmQoIEZUX0xpc3QgIGxpc3QsCiAgICAgICAgICAgICAgICAgdm9pZCogICAgZGF0YSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9BZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwZW5kIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gYXBwZW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9MaXN0X0FkZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQXBwZW5kIGFuIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiBhIGxpc3QuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBsaXN0IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LgorICAgKiAgIG5vZGUgOjoKKyAgICogICAgIFRoZSBub2RlIHRvIGFwcGVuZC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX0xpc3RfQWRkKCBGVF9MaXN0ICAgICAgbGlzdCwKICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnQgYW4gZWxlbWVudCBhdCB0aGUgaGVhZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBpbnNlcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0xpc3RfSW5zZXJ0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbnNlcnQgYW4gZWxlbWVudCBhdCB0aGUgaGVhZCBvZiBhIGxpc3QuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBsaXN0IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gcGFyZW50IGxpc3QuCisgICAqICAgbm9kZSA6OgorICAgKiAgICAgVGhlIG5vZGUgdG8gaW5zZXJ0LgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRfTGlzdF9JbnNlcnQoIEZUX0xpc3QgICAgICBsaXN0LAogICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfUmVtb3ZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZSBhIG5vZGUgZnJvbSBhIGxpc3QuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgd2hldGhlciAgICAqLwotICAvKiAgICB0aGUgbm9kZSBpcyBpbiB0aGUgbGlzdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIHJlbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTGlzdF9SZW1vdmUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJlbW92ZSBhIG5vZGUgZnJvbSBhIGxpc3QuICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgd2hldGhlciB0aGUKKyAgICogICBub2RlIGlzIGluIHRoZSBsaXN0IQorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbm9kZSA6OgorICAgKiAgICAgVGhlIG5vZGUgdG8gcmVtb3ZlLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbGlzdCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX0xpc3RfUmVtb3ZlKCBGVF9MaXN0ICAgICAgbGlzdCwKICAgICAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3ZlIGEgbm9kZSB0byB0aGUgaGVhZC90b3Agb2YgYSBsaXN0LiAgVXNlZCB0byBtYWludGFpbiBMUlUgICAgICAgKi8KLSAgLyogICAgbGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdCA6OiBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9MaXN0X1VwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBNb3ZlIGEgbm9kZSB0byB0aGUgaGVhZC90b3Agb2YgYSBsaXN0LiAgVXNlZCB0byBtYWludGFpbiBMUlUgbGlzdHMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBsaXN0IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBsaXN0LgorICAgKiAgIG5vZGUgOjoKKyAgICogICAgIFRoZSBub2RlIHRvIG1vdmUuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEZUX0xpc3QgaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGEgbGlzdCBwYXJzZSAgICAqLwotICAvKiAgICBieSBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBsaXN0IG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfTGlzdF9JdGVyYXRvcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gRlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0IHBhcnNlIGJ5CisgICAqICAgQEZUX0xpc3RfSXRlcmF0ZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG5vZGUgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBsaXN0IG5vZGUuCisgICAqCisgICAqICAgdXNlciA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgQ2FuIGJlIHVzZWQgdG8gcG9pbnQKKyAgICogICAgIHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpGVF9MaXN0X0l0ZXJhdG9yKSggRlRfTGlzdE5vZGUgIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICB1c2VyICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSBhIGxpc3QgYW5kIGNhbGxzIGEgZ2l2ZW4gaXRlcmF0b3IgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMgICovCi0gIC8qICAgIHJldHVybnMgYSBub24temVybyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpdGVyYXRvciA6OiBBbiBpdGVyYXRvciBmdW5jdGlvbiwgY2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgbGlzdC4gKi8KLSAgLyogICAgdXNlciAgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgKGEgRnJlZVR5cGUgZXJyb3IgY29kZSkgb2YgdGhlIGxhc3QgaXRlcmF0b3IgY2FsbC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9MaXN0X0l0ZXJhdGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFBhcnNlIGEgbGlzdCBhbmQgY2FsbHMgYSBnaXZlbiBpdGVyYXRvciBmdW5jdGlvbiBvbiBlYWNoIGVsZW1lbnQuCisgICAqICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMKKyAgICogICByZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaXN0IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbGlzdC4KKyAgICogICBpdGVyYXRvciA6OgorICAgKiAgICAgQW4gaXRlcmF0b3IgZnVuY3Rpb24sIGNhbGxlZCBvbiBlYWNoIG5vZGUgb2YgdGhlIGxpc3QuCisgICAqICAgdXNlciA6OgorICAgKiAgICAgQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlCisgICAqICAgICBpdGVyYXRvci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgcmVzdWx0IChhIEZyZWVUeXBlIGVycm9yIGNvZGUpIG9mIHRoZSBsYXN0IGl0ZXJhdG9yIGNhbGwuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfTGlzdF9JdGVyYXRlKCBGVF9MaXN0ICAgICAgICAgICBsaXN0LAogICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfSXRlcmF0b3IgIGl0ZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEBGVF9MaXN0IGl0ZXJhdG9yIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGR1cmluZyBhIGxpc3QgICAgICAgICAqLwotICAvKiAgICBmaW5hbGl6YXRpb24gYnkgQEZUX0xpc3RfRmluYWxpemUgdG8gZGVzdHJveSBhbGwgZWxlbWVudHMgaW4gYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3lzdGVtIDo6IFRoZSBjdXJyZW50IHN5c3RlbSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhICAgOjogVGhlIGN1cnJlbnQgb2JqZWN0IHRvIGRlc3Ryb3kuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgcGFzc2VkIHRvIEBGVF9MaXN0X0l0ZXJhdGUuICBJdCBjYW4gICAqLwotICAvKiAgICAgICAgICAgICAgYmUgdXNlZCB0byBwb2ludCB0byB0aGUgaXRlcmF0aW9uJ3Mgc3RhdGUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfTGlzdF9EZXN0cnVjdG9yCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBbiBARlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0CisgICAqICAgZmluYWxpemF0aW9uIGJ5IEBGVF9MaXN0X0ZpbmFsaXplIHRvIGRlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIGEgZ2l2ZW4KKyAgICogICBsaXN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3lzdGVtIDo6CisgICAqICAgICBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LgorICAgKgorICAgKiAgIGRhdGEgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IG9iamVjdCB0byBkZXN0cm95LgorICAgKgorICAgKiAgIHVzZXIgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciBwYXNzZWQgdG8gQEZUX0xpc3RfSXRlcmF0ZS4gIEl0IGNhbiBiZSB1c2VkIHRvCisgICAqICAgICBwb2ludCB0byB0aGUgaXRlcmF0aW9uJ3Mgc3RhdGUuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpGVF9MaXN0X0Rlc3RydWN0b3IpKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICB1c2VyICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcyB3ZWxsIGFzIHRoZSBsaXN0IGl0c2VsZi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc3Ryb3kgOjogQSBsaXN0IGRlc3RydWN0b3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50ICAqLwotICAvKiAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAgU2V0IHRoaXMgdG8gTlVMTCBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdCB0aGF0IGhhbmRsZXMgZGVhbGxvY2F0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IGFsbCBub2RlcyBhZGRlZCBieSBARlRfTGlzdF9BZGQgb3IgICAgICAqLwotICAvKiAgICBARlRfTGlzdF9JbnNlcnQgaGF2ZSBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTGlzdF9GaW5hbGl6ZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRGVzdHJveSBhbGwgZWxlbWVudHMgaW4gdGhlIGxpc3QgYXMgd2VsbCBhcyB0aGUgbGlzdCBpdHNlbGYuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaXN0IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbGlzdC4KKyAgICoKKyAgICogICBkZXN0cm95IDo6CisgICAqICAgICBBIGxpc3QgZGVzdHJ1Y3RvciB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QuCisgICAqICAgICBTZXQgdGhpcyB0byBgTlVMTGAgaWYgbm90IG5lZWRlZC4KKyAgICoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QgdGhhdCBoYW5kbGVzIGRlYWxsb2NhdGlvbi4KKyAgICoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlCisgICAqICAgICBkZXN0cnVjdG9yLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgdGhhdCBhbGwgbm9kZXMgYWRkZWQgYnkgQEZUX0xpc3RfQWRkIG9yCisgICAqICAgQEZUX0xpc3RfSW5zZXJ0IGhhdmUgYmVlbiBkeW5hbWljYWxseSBhbGxvY2F0ZWQuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9MaXN0X0ZpbmFsaXplKCBGVF9MaXN0ICAgICAgICAgICAgIGxpc3QsCiAgICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgZGVzdHJveSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaAppbmRleCAxNjE1OTEyLi5hZTQ2YWQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3LmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdGx6dy5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGx6dy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTFpXLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGx6dy5oCisgKgorICogICBMWlctY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRMWldfSF8KICNkZWZpbmUgRlRMWldfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMSw1OSArMzAsNjEgQEAKIAogRlRfQkVHSU5fSEVBREVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbHp3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTFpXIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNpbmcgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBMWlctc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGx6dworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgTFpXIFN0cmVhbXMKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFVzaW5nIExaVy1jb21wcmVzc2VkIGZvbnQgZmlsZXMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgTFpXIGNvbXByZXNzaW9uIHJlY29nbml0aW9uIGlzCisgICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KKyAgICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3CisgICAqICAgY29tcHJlc3NlZCBmaWxlLCB0aGUgbGlicmFyeSB3aWxsIHRyeSB0byBvcGVuIGEgTFpXIHN0cmVhbSBmcm9tIGl0IGFuZAorICAgKiAgIHJlLW9wZW4gdGhlIGZhY2Ugd2l0aCBpdC4KKyAgICoKKyAgICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgorICAgKiAgIHByb2Nlc3MgZWFjaCB0aW1lIHNlZWtpbmcgYmFja3dhcmRzIGlzIG5lZWRlZCB3aXRoaW4gdGhlIHN0cmVhbSwKKyAgICogICB3aGljaCBzaWduaWZpY2FudGx5IHVuZGVybWluZXMgdGhlIHBlcmZvcm1hbmNlLgorICAgKgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgTFpXLXNwZWNpZmljIGZ1bmN0aW9ucy4KKyAgICoKKyAgICovCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3BlbkxaVwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BlbiBhIG5ldyBzdHJlYW0gdG8gcGFyc2UgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLlonIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6IFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtCi0gICoKLSAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBMWlcgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBMWlcgc3RyZWFtIGZyb20gaXQKLSAgKiAgIGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIExaVyBzdXBwb3J0LgotICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1N0cmVhbV9PcGVuTFpXCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBMWlctY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcyBtYWlubHkKKyAgICogICB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLlpgIGZvbnRzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KKyAgICoKKyAgICogICBzb3VyY2UgOjoKKyAgICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICoKKyAgICogICBDYWxsaW5nIHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBgRlRfU3RyZWFtX0Nsb3NlYCBvbiB0aGUgbmV3IHN0cmVhbSB3aWxsCisgICAqICAgKipub3QqKiBjYWxsIGBGVF9TdHJlYW1fQ2xvc2VgIG9uIHRoZSBzb3VyY2Ugc3RyZWFtLiAgTm9uZSBvZiB0aGUKKyAgICogICBzdHJlYW0gb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZWAgaWYgeW91ciBidWlsZAorICAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBMWlcgc3VwcG9ydC4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TdHJlYW1fT3BlbkxaVyggRlRfU3RyZWFtICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHNvdXJjZSApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oCmluZGV4IGMxZTQ5N2MuLmM5ZGU5ODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtYWMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmgKQEAgLTEsMzUgKzEsMzQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWFjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZGRpdGlvbmFsIE1hYy1zcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bWFjLmgKKyAqCisgKiAgIEFkZGl0aW9uYWwgTWFjLXNwZWNpZmljIEFQSS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFOiBJbmNsdWRlIHRoaXMgZmlsZSBhZnRlciBGVF9GUkVFVFlQRV9IIGFuZCBhZnRlciBhbnkgICAgICAgICAgICAgICAqLwotLyogICAgICAgTWFjLXNwZWNpZmljIGhlYWRlcnMgKGJlY2F1c2UgdGhpcyBoZWFkZXIgdXNlcyBNYWMgdHlwZXMgc3VjaCBhcyAgKi8KLS8qICAgICAgIEhhbmRsZSwgRlNTcGVjLCBGU1JlZiwgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTk9URTogSW5jbHVkZSB0aGlzIGZpbGUgYWZ0ZXIgYEZUX0ZSRUVUWVBFX0hgIGFuZCBhZnRlciBhbnkKKyAqICAgICAgIE1hYy1zcGVjaWZpYyBoZWFkZXJzIChiZWNhdXNlIHRoaXMgaGVhZGVyIHVzZXMgTWFjIHR5cGVzIHN1Y2ggYXMKKyAqICAgICAgICdIYW5kbGUnLCAnRlNTcGVjJywgJ0ZTUmVmJywgZXRjLikKKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUTUFDX0hfCiAjZGVmaW5lIEZUTUFDX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC00Nyw1NiArNDYsNTkgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFjX3NwZWNpZmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFjIFNwZWNpZmljIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBhdmFpbGFibGUgb24gdGhlIE1hY2ludG9zaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaWYgRnJlZVR5cGUgaXMgICAgICAgICovCi0gIC8qICAgIGNvbXBpbGVkIG9uIGEgTWFjaW50b3NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBtYWNfc3BlY2lmaWMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIE1hYyBTcGVjaWZpYyBJbnRlcmZhY2UKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIE9ubHkgYXZhaWxhYmxlIG9uIHRoZSBNYWNpbnRvc2guCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiBGcmVlVHlwZSBpcyBjb21waWxlZAorICAgKiAgIG9uIGEgTWFjaW50b3NoLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19GYWNlX0Zyb21fRk9ORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgRk9ORCByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbmQgICAgICAgOjogQSBGT05EIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBPbmx5IHN1cHBvcnRlZCBmb3IgdGhlIC0xIGBzYW5pdHkgY2hlY2snIHNwZWNpYWwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIEBGVF9GYWNlIG9iamVjdHMgZnJvbSBmb250cyAgICAqLwotICAvKiAgICB0aGF0IGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBhcyBmb2xsb3dzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGZvbmQgPSBHZXRSZXNvdXJjZSggJ0ZPTkQnLCBmb250TmFtZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fRk9ORCggbGlicmFyeSwgZm9uZCwgMCwgJmZhY2UgKTsgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgRk9ORCByZXNvdXJjZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZm9uZCA6OgorICAgKiAgICAgQSBGT05EIHJlc291cmNlLgorICAgKgorICAgKiAgIGZhY2VfaW5kZXggOjoKKyAgICogICAgIE9ubHkgc3VwcG9ydGVkIGZvciB0aGUgLTEgJ3Nhbml0eSBjaGVjaycgc3BlY2lhbCBjYXNlLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAZXhhbXBsZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBARlRfRmFjZSBvYmplY3RzIGZyb20gZm9udHMgdGhhdAorICAgKiAgIGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBhcyBmb2xsb3dzLgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgZm9uZCAgPSBHZXRSZXNvdXJjZSggJ0ZPTkQnLCBmb250TmFtZSApOworICAgKiAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX0ZPTkQoIGxpYnJhcnksIGZvbmQsIDAsICZmYWNlICk7CisgICAqICAgYGBgCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSAgICAgIGZvbmQsCkBAIC0xMDUsMjggKzEwNywyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBGU1NwZWMgZm9yIHRoZSBkaXNrIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZWQgZm9udC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgKGUuZy4sIFRpbWVzIE5ldyBSb21hbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJvbGQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoU3BlYyAgIDo6IEZTU3BlYyB0byB0aGUgZmlsZS4gIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIGFuIEZTU3BlYyBmb3IgdGhlIGRpc2sgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lZCBmb250LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZm9udE5hbWUgOjoKKyAgICogICAgIE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IChlLmcuLCBUaW1lcyBOZXcgUm9tYW4gQm9sZCkuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgcGF0aFNwZWMgOjoKKyAgICogICAgIEZTU3BlYyB0byB0aGUgZmlsZS4gIEZvciBwYXNzaW5nIHRvIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBJbmRleCBvZiB0aGUgZmFjZS4gIEZvciBwYXNzaW5nIHRvIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKQEAgLTEzNCwyNyArMTM2LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZV9Gcm9tX01hY19BVFNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGFuIEZTU3BlYyBmb3IgdGhlIGRpc2sgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lZCBmb250LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICA6OiBNYWMgT1MgbmFtZSBvZiB0aGUgZm9udCBpbiBBVFMgZnJhbWV3b3JrLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aFNwZWMgICA6OiBGU1NwZWMgdG8gdGhlIGZpbGUuIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBJbmRleCBvZiB0aGUgZmFjZS4gRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gYW4gRlNTcGVjIGZvciB0aGUgZGlzayBmaWxlIGNvbnRhaW5pbmcgdGhlIG5hbWVkIGZvbnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmb250TmFtZSA6OgorICAgKiAgICAgTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwYXRoU3BlYyA6OgorICAgKiAgICAgRlNTcGVjIHRvIHRoZSBmaWxlLiBGb3IgcGFzc2luZyB0byBARlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgSW5kZXggb2YgdGhlIGZhY2UuIEZvciBwYXNzaW5nIHRvIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNTcGVjKiAgICAgIHBhdGhTcGVjLApAQCAtMTYyLDMwICsxNjUsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgcGF0aG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBhbmQgZmFjZSBpbmRleCBmb3IgZ2l2ZW4gZm9udCAgICovCi0gIC8qICAgIG5hbWUgdGhhdCBpcyBoYW5kbGVkIGJ5IEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgIDo6IE1hYyBPUyBuYW1lIG9mIHRoZSBmb250IGluIEFUUyBmcmFtZXdvcmsuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGggICAgICAgIDo6IEJ1ZmZlciB0byBzdG9yZSBwYXRobmFtZSBvZiB0aGUgZmlsZS4gIEZvciBwYXNzaW5nICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0byBARlRfTmV3X0ZhY2UuICBUaGUgY2xpZW50IG11c3QgYWxsb2NhdGUgdGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQYXRoU2l6ZSA6OiBMZW5ndGhzIG9mIHRoZSBidWZmZXIgYHBhdGgnIHRoYXQgY2xpZW50IGFsbG9jYXRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggIDo6IEluZGV4IG9mIHRoZSBmYWNlLiAgRm9yIHBhc3NpbmcgdG8gQEZUX05ld19GYWNlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIGEgcGF0aG5hbWUgb2YgdGhlIGRpc2sgZmlsZSBhbmQgZmFjZSBpbmRleCBmb3IgZ2l2ZW4gZm9udCBuYW1lCisgICAqICAgdGhhdCBpcyBoYW5kbGVkIGJ5IEFUUyBmcmFtZXdvcmsuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmb250TmFtZSA6OgorICAgKiAgICAgTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBwYXRoIDo6CisgICAqICAgICBCdWZmZXIgdG8gc3RvcmUgcGF0aG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgcGFzc2luZyB0byBARlRfTmV3X0ZhY2UuCisgICAqICAgICBUaGUgY2xpZW50IG11c3QgYWxsb2NhdGUgdGhpcyBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICoKKyAgICogICBtYXhQYXRoU2l6ZSA6OgorICAgKiAgICAgTGVuZ3RocyBvZiB0aGUgYnVmZmVyIGBwYXRoYCB0aGF0IGNsaWVudCBhbGxvY2F0ZWQuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgSW5kZXggb2YgdGhlIGZhY2UuICBGb3IgcGFzc2luZyB0byBARlRfTmV3X0ZhY2UuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgIHBhdGgsCkBAIC0xOTQsMzMgKzIwMCwzNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXggICovCi0gIC8qICAgIHVzaW5nIGFuIEZTU3BlYyB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwZWMgICAgICAgOjogRlNTcGVjIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmlyc3QgZmFjZSBoYXMgaW5kZXh+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjIGlzIGlkZW50aWNhbCB0byBARlRfTmV3X0ZhY2UgZXhjZXB0ICAgICAgICovCi0gIC8qICAgIGl0IGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXgKKyAgICogICB1c2luZyBhbiBGU1NwZWMgdG8gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3BlYyA6OgorICAgKiAgICAgRlNTcGVjIHRvIHRoZSBmb250IGZpbGUuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdpdGhpbiB0aGUgcmVzb3VyY2UuICBUaGUgZmlyc3QgZmFjZSBoYXMKKyAgICogICAgIGluZGV4fjAuCisgICAqIEBvdXRwdXQ6CisgICAqICAgYWZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCBpdAorICAgKiAgIGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNTcGVjICAqc3BlYywKQEAgLTIyOSwzMyArMjM5LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGFuZCB0eXBlZmFjZSBpbmRleCAgKi8KLSAgLyogICAgdXNpbmcgYW4gRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BlYyAgICAgICA6OiBGU1JlZiB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIHJlc291cmNlLiAgVGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmaXJzdCBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCAgICAgICAgKi8KLSAgLyogICAgaXQgYWNjZXB0cyBhbiBGU1JlZiBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgYW5kIHR5cGVmYWNlIGluZGV4CisgICAqICAgdXNpbmcgYW4gRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3BlYyA6OgorICAgKiAgICAgRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSBmaXJzdCBmYWNlIGhhcworICAgKiAgICAgaW5kZXh+MC4KKyAgICogQG91dHB1dDoKKyAgICogICBhZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQEZUX05ld19GYWNlX0Zyb21fRlNSZWYgaXMgaWRlbnRpY2FsIHRvIEBGVF9OZXdfRmFjZSBleGNlcHQgaXQgYWNjZXB0cworICAgKiAgIGFuIEZTUmVmIGluc3RlYWQgb2YgYSBwYXRoLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNSZWYgICpyZWYsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaCBiL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oCmluZGV4IDk5NDgxMDIuLmQ4NzgxYTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oCkBAIC0xLDc1ICsxLDc3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgTXVsdGlwbGUgTWFzdGVyIGZvbnQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG1tLmgKKyAqCisgKiAgIEZyZWVUeXBlIE11bHRpcGxlIE1hc3RlciBmb250IGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUTU1fSF8KICNkZWZpbmUgRlRNTV9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfVFlQRTFfVEFCTEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS90MXRhYmxlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTXVsdGlwbGUgTWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IHRvIG1hbmFnZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmFnZSBNdWx0aXBsZSAgICAgICovCi0gIC8qICAgIE1hc3RlciBmb250cywgaS5lLiwgdGhlIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBkZXNpZ24gaW5zdGFuY2VzIGJ5ICAqLwotICAvKiAgICBzZXR0aW5nIGRlc2lnbiBheGlzIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlc2lkZXMgQWRvYmUgTU0gZm9udHMsIHRoZSBpbnRlcmZhY2Ugc3VwcG9ydHMgQXBwbGUncyBUcnVlVHlwZSBHWCAqLwotICAvKiAgICBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgU29tZSBvZiB0aGUgcm91dGluZXMgb25seSB3b3JrIHdpdGggKi8KLSAgLyogICAgQWRvYmUgTU0gZm9udHMsIG90aGVycyB3aWxsIHdvcmsgd2l0aCBhbGwgdGhyZWUgdHlwZXMuICBUaGV5IGFyZSAgICovCi0gIC8qICAgIHNpbWlsYXIgZW5vdWdoIHRoYXQgYSBjb25zaXN0ZW50IGludGVyZmFjZSBtYWtlcyBzZW5zZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBtdWx0aXBsZV9tYXN0ZXJzCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBNdWx0aXBsZSBNYXN0ZXJzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBIb3cgdG8gbWFuYWdlIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgZm9sbG93aW5nIHR5cGVzIGFuZCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gbWFuYWdlIE11bHRpcGxlIE1hc3RlcgorICAgKiAgIGZvbnRzLCBpLmUuLCB0aGUgc2VsZWN0aW9uIG9mIHNwZWNpZmljIGRlc2lnbiBpbnN0YW5jZXMgYnkgc2V0dGluZworICAgKiAgIGRlc2lnbiBheGlzIGNvb3JkaW5hdGVzLgorICAgKgorICAgKiAgIEJlc2lkZXMgQWRvYmUgTU0gZm9udHMsIHRoZSBpbnRlcmZhY2Ugc3VwcG9ydHMgQXBwbGUncyBUcnVlVHlwZSBHWCBhbmQKKyAgICogICBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICBTb21lIG9mIHRoZSByb3V0aW5lcyBvbmx5IHdvcmsgd2l0aCBBZG9iZQorICAgKiAgIE1NIGZvbnRzLCBvdGhlcnMgd2lsbCB3b3JrIHdpdGggYWxsIHRocmVlIHR5cGVzLiAgVGhleSBhcmUgc2ltaWxhcgorICAgKiAgIGVub3VnaCB0aGF0IGEgY29uc2lzdGVudCBpbnRlcmZhY2UgbWFrZXMgc2Vuc2UuCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTU1fQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgTXVsdGlwbGUgICAgICovCi0gIC8qICAgIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uICovCi0gIC8qICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgICAgOjogVGhlIGF4aXMncyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluaW11bSA6OiBUaGUgYXhpcydzIG1pbmltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhpbXVtIDo6IFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX01NX0F4aXMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgZ2l2ZW4gYXhpcyBpbiBkZXNpZ24gc3BhY2UgZm9yIE11bHRpcGxlIE1hc3RlcnMKKyAgICogICBmb250cy4KKyAgICoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24KKyAgICogICBmb250cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBuYW1lIDo6CisgICAqICAgICBUaGUgYXhpcydzIG5hbWUuCisgICAqCisgICAqICAgbWluaW11bSA6OgorICAgKiAgICAgVGhlIGF4aXMncyBtaW5pbXVtIGRlc2lnbiBjb29yZGluYXRlLgorICAgKgorICAgKiAgIG1heGltdW0gOjoKKyAgICogICAgIFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9NTV9BeGlzXwogICB7CiAgICAgRlRfU3RyaW5nKiAgbmFtZTsKQEAgLTc5LDI4ICs4MSwyOSBAQAogICB9IEZUX01NX0F4aXM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBNdWx0aXBsZSBNYXN0ZXJzICAgICAgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gKi8KLSAgLyogICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2F4aXMgICAgOjogTnVtYmVyIG9mIGF4ZXMuICBDYW5ub3QgZXhjZWVkfjQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZGVzaWducyA6OiBOdW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5IDJebnVtX2F4aXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggdGhlIFR5cGV+MSBzcGVjaWZpY2F0aW9uIHN0cmFuZ2VseSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGFsbG93cyBmb3IgaW50ZXJtZWRpYXRlIGRlc2lnbnMgdG8gYmUgcHJlc2VudC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBjYW5ub3QgZXhjZWVkfjE2LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF4aXMgICAgICAgIDo6IEEgdGFibGUgb2YgYXhpcyBkZXNjcmlwdG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTXVsdGlfTWFzdGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCB0aGUgYXhlcyBhbmQgc3BhY2Ugb2YgYSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnQuCisgICAqCisgICAqICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uCisgICAqICAgZm9udHMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbnVtX2F4aXMgOjoKKyAgICogICAgIE51bWJlciBvZiBheGVzLiAgQ2Fubm90IGV4Y2VlZH40LgorICAgKgorICAgKiAgIG51bV9kZXNpZ25zIDo6CisgICAqICAgICBOdW1iZXIgb2YgZGVzaWduczsgc2hvdWxkIGJlIG5vcm1hbGx5IDJebnVtX2F4aXMgZXZlbiB0aG91Z2ggdGhlCisgICAqICAgICBUeXBlfjEgc3BlY2lmaWNhdGlvbiBzdHJhbmdlbHkgYWxsb3dzIGZvciBpbnRlcm1lZGlhdGUgZGVzaWducyB0byBiZQorICAgKiAgICAgcHJlc2VudC4gIFRoaXMgbnVtYmVyIGNhbm5vdCBleGNlZWR+MTYuCisgICAqCisgICAqICAgYXhpcyA6OgorICAgKiAgICAgQSB0YWJsZSBvZiBheGlzIGRlc2NyaXB0b3JzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX011bHRpX01hc3Rlcl8KICAgewogICAgIEZUX1VJbnQgICAgIG51bV9heGlzOwpAQCAtMTEwLDQyICsxMTMsNDUgQEAKICAgfSBGVF9NdWx0aV9NYXN0ZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WYXJfQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIGdpdmVuIGF4aXMgaW4gZGVzaWduIHNwYWNlIGZvciBNdWx0aXBsZSAgICAgKi8KLSAgLyogICAgTWFzdGVycywgVHJ1ZVR5cGUgR1gsIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgTm90IGFsd2F5cyBtZWFuaW5nZnVsIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIHZhcmlhdGlvbiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbmltdW0gOjogVGhlIGF4aXMncyBtaW5pbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVmICAgICA6OiBUaGUgYXhpcydzIGRlZmF1bHQgZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgRnJlZVR5cGUgY29tcHV0ZXMgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlcyBmb3IgQWRvYmUgICAqLwotICAvKiAgICAgICAgICAgICAgIE1NIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heGltdW0gOjogVGhlIGF4aXMncyBtYXhpbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgICA6OiBUaGUgYXhpcydzIHRhZyAodGhlIGVxdWl2YWxlbnQgdG8gYG5hbWUnIGZvciBUcnVlVHlwZSAgICovCi0gIC8qICAgICAgICAgICAgICAgR1ggYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cykuICBGcmVlVHlwZSBwcm92aWRlcyAgICAqLwotICAvKiAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWVzIGZvciBBZG9iZSBNTSBmb250cyBpZiBwb3NzaWJsZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlkICAgOjogVGhlIGF4aXMgbmFtZSBlbnRyeSBpbiB0aGUgZm9udCdzIGBuYW1lJyB0YWJsZS4gIFRoaXMgICAqLwotICAvKiAgICAgICAgICAgICAgIGlzIGFub3RoZXIgKGFuZCBvZnRlbiBiZXR0ZXIpIHZlcnNpb24gb2YgdGhlIGBuYW1lJyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBmaWVsZCBmb3IgVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgTm90ICovCi0gIC8qICAgICAgICAgICAgICAgbWVhbmluZ2Z1bCBmb3IgQWRvYmUgTU0gZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmaWVsZHMgYG1pbmltdW0nLCBgZGVmJywgYW5kIGBtYXhpbXVtJyBhcmUgMTYuMTYgZnJhY3Rpb25hbCAgICAqLwotICAvKiAgICB2YWx1ZXMgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICBGb3IgQWRvYmUgTU0gKi8KLSAgLyogICAgZm9udHMsIHRoZSB2YWx1ZXMgYXJlIGludGVnZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9WYXJfQXhpcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgTXVsdGlwbGUKKyAgICogICBNYXN0ZXJzLCBUcnVlVHlwZSBHWCwgYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBuYW1lIDo6CisgICAqICAgICBUaGUgYXhpcydzIG5hbWUuICBOb3QgYWx3YXlzIG1lYW5pbmdmdWwgZm9yIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlCisgICAqICAgICB2YXJpYXRpb24gZm9udHMuCisgICAqCisgICAqICAgbWluaW11bSA6OgorICAgKiAgICAgVGhlIGF4aXMncyBtaW5pbXVtIGRlc2lnbiBjb29yZGluYXRlLgorICAgKgorICAgKiAgIGRlZiA6OgorICAgKiAgICAgVGhlIGF4aXMncyBkZWZhdWx0IGRlc2lnbiBjb29yZGluYXRlLiAgRnJlZVR5cGUgY29tcHV0ZXMgbWVhbmluZ2Z1bAorICAgKiAgICAgZGVmYXVsdCB2YWx1ZXMgZm9yIEFkb2JlIE1NIGZvbnRzLgorICAgKgorICAgKiAgIG1heGltdW0gOjoKKyAgICogICAgIFRoZSBheGlzJ3MgbWF4aW11bSBkZXNpZ24gY29vcmRpbmF0ZS4KKyAgICoKKyAgICogICB0YWcgOjoKKyAgICogICAgIFRoZSBheGlzJ3MgdGFnICh0aGUgZXF1aXZhbGVudCB0byAnbmFtZScgZm9yIFRydWVUeXBlIEdYIGFuZAorICAgKiAgICAgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzKS4gIEZyZWVUeXBlIHByb3ZpZGVzIGRlZmF1bHQgdmFsdWVzIGZvcgorICAgKiAgICAgQWRvYmUgTU0gZm9udHMgaWYgcG9zc2libGUuCisgICAqCisgICAqICAgc3RyaWQgOjoKKyAgICogICAgIFRoZSBheGlzIG5hbWUgZW50cnkgaW4gdGhlIGZvbnQncyAnbmFtZScgdGFibGUuICBUaGlzIGlzIGFub3RoZXIKKyAgICogICAgIChhbmQgb2Z0ZW4gYmV0dGVyKSB2ZXJzaW9uIG9mIHRoZSAnbmFtZScgZmllbGQgZm9yIFRydWVUeXBlIEdYIG9yCisgICAqICAgICBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICBOb3QgbWVhbmluZ2Z1bCBmb3IgQWRvYmUgTU0gZm9udHMuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmaWVsZHMgYG1pbmltdW1gLCBgZGVmYCwgYW5kIGBtYXhpbXVtYCBhcmUgMTYuMTYgZnJhY3Rpb25hbCB2YWx1ZXMKKyAgICogICBmb3IgVHJ1ZVR5cGUgR1ggYW5kIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4gIEZvciBBZG9iZSBNTSBmb250cywgdGhlCisgICAqICAgdmFsdWVzIGFyZSBpbnRlZ2Vycy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9WYXJfQXhpc18KICAgewogICAgIEZUX1N0cmluZyogIG5hbWU7CkBAIC0xNjAsMjcgKzE2NiwyOSBAQAogICB9IEZUX1Zhcl9BeGlzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmFyX05hbWVkX1N0eWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBuYW1lZCBpbnN0YW5jZSBpbiBhIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlICovCi0gIC8qICAgIHZhcmlhdGlvbiBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgQWRvYmUgTU0gZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzIDo6IFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBUaGlzIGlzIGFuIGFycmF5IHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGF4aXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWQgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgaWRlbnRpZnlpbmcgdGhpcyBpbnN0YW5jZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc2lkICAgOjogVGhlIGVudHJ5IGluIGBuYW1lJyB0YWJsZSBpZGVudGlmeWluZyBhIFBvc3RTY3JpcHQgbmFtZSAgKi8KLSAgLyogICAgICAgICAgICAgIGZvciB0aGlzIGluc3RhbmNlLiAgVmFsdWUgMHhGRkZGIGluZGljYXRlcyBhIG1pc3NpbmcgICAgICovCi0gIC8qICAgICAgICAgICAgICBlbnRyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfVmFyX05hbWVkX1N0eWxlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIG5hbWVkIGluc3RhbmNlIGluIGEgVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUKKyAgICogICB2YXJpYXRpb24gZm9udC4KKyAgICoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBBZG9iZSBNTSBmb250cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2UuICBUaGlzIGlzIGFuIGFycmF5IHdpdGggb25lCisgICAqICAgICBlbnRyeSBmb3IgZWFjaCBheGlzLgorICAgKgorICAgKiAgIHN0cmlkIDo6CisgICAqICAgICBUaGUgZW50cnkgaW4gJ25hbWUnIHRhYmxlIGlkZW50aWZ5aW5nIHRoaXMgaW5zdGFuY2UuCisgICAqCisgICAqICAgcHNpZCA6OgorICAgKiAgICAgVGhlIGVudHJ5IGluICduYW1lJyB0YWJsZSBpZGVudGlmeWluZyBhIFBvc3RTY3JpcHQgbmFtZSBmb3IgdGhpcworICAgKiAgICAgaW5zdGFuY2UuICBWYWx1ZSAweEZGRkYgaW5kaWNhdGVzIGEgbWlzc2luZyBlbnRyeS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9WYXJfTmFtZWRfU3R5bGVfCiAgIHsKICAgICBGVF9GaXhlZCogIGNvb3JkczsKQEAgLTE5MCw1MCArMTk4LDQ3IEBACiAgIH0gRlRfVmFyX05hbWVkX1N0eWxlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTU1fVmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgdGhlIGF4ZXMgYW5kIHNwYWNlIG9mIGFuIEFkb2JlIE1NLCBUcnVlVHlwZSAgICovCi0gIC8qICAgIEdYLCBvciBPcGVuVHlwZSB2YXJpYXRpb24gZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29tZSBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIG9uZSBmb3JtYXQgYW5kIG5vdCB0byB0aGUgb3RoZXJzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2F4aXMgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYXhlcy4gIFRoZSBtYXhpbXVtIHZhbHVlIGlzfjQgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBBZG9iZSBNTSBmb250czsgbm8gbGltaXQgaW4gVHJ1ZVR5cGUgR1ggb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9kZXNpZ25zICAgICA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbnM7IHNob3VsZCBiZSBub3JtYWxseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgMl5udW1fYXhpcyBmb3IgQWRvYmUgTU0gZm9udHMuICBOb3QgbWVhbmluZ2Z1bCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGZvciBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAod2hlcmUgZXZlcnkgZ2x5cGggY291bGQgaGF2ZSBhIGRpZmZlcmVudCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGRlc2lnbnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9uYW1lZHN0eWxlcyA6OiBUaGUgbnVtYmVyIG9mIG5hbWVkIHN0eWxlczsgYSBgbmFtZWQgc3R5bGUnIGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYSB0dXBsZSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgdGhhdCBoYXMgYSBzdHJpbmcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIElEIChpbiB0aGUgYG5hbWUnIHRhYmxlKSBhc3NvY2lhdGVkIHdpdGggaXQuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9udCBjYW4gdGVsbCB0aGUgdXNlciB0aGF0LCBmb3IgZXhhbXBsZSwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgW1dlaWdodD0xLjUsV2lkdGg9MS4xXSBpcyBgQm9sZCcuICBBbm90aGVyIG5hbWUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGZvciBgbmFtZWQgc3R5bGUnIGlzIGBuYW1lZCBpbnN0YW5jZScuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgRm9yIEFkb2JlIE11bHRpcGxlIE1hc3RlcnMgZm9udHMsIHRoaXMgdmFsdWUgaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyB6ZXJvIGJlY2F1c2UgdGhlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBuYW1lZCBzdHlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXhpcyAgICAgICAgICAgIDo6IEFuIGF4aXMgZGVzY3JpcHRvciB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbiBzbGlnaHRseSBtb3JlIGRhdGEgdGhhbiBBZG9iZSBNTSBmb250cy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBtYW5hZ2VtZW50IG9mIHRoaXMgcG9pbnRlciBpcyBkb25lICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZWRzdHlsZSAgICAgIDo6IEEgbmFtZWQgc3R5bGUgKGluc3RhbmNlKSB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBPbmx5IG1lYW5pbmdmdWwgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIGZvbnRzLiAgTWVtb3J5IG1hbmFnZW1lbnQgb2YgdGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgaXMgZG9uZSBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9NTV9WYXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIHRoZSBheGVzIGFuZCBzcGFjZSBvZiBhbiBBZG9iZSBNTSwgVHJ1ZVR5cGUgR1gsCisgICAqICAgb3IgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQuCisgICAqCisgICAqICAgU29tZSBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIG9uZSBmb3JtYXQgYW5kIG5vdCB0byB0aGUgb3RoZXJzLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG51bV9heGlzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGF4ZXMuICBUaGUgbWF4aW11bSB2YWx1ZSBpc340IGZvciBBZG9iZSBNTSBmb250czsgbm8KKyAgICogICAgIGxpbWl0IGluIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4KKyAgICoKKyAgICogICBudW1fZGVzaWducyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBkZXNpZ25zOyBzaG91bGQgYmUgbm9ybWFsbHkgMl5udW1fYXhpcyBmb3IgQWRvYmUgTU0KKyAgICogICAgIGZvbnRzLiAgTm90IG1lYW5pbmdmdWwgZm9yIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cworICAgKiAgICAgKHdoZXJlIGV2ZXJ5IGdseXBoIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGRlc2lnbnMpLgorICAgKgorICAgKiAgIG51bV9uYW1lZHN0eWxlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBuYW1lZCBzdHlsZXM7IGEgJ25hbWVkIHN0eWxlJyBpcyBhIHR1cGxlIG9mIGRlc2lnbgorICAgKiAgICAgY29vcmRpbmF0ZXMgdGhhdCBoYXMgYSBzdHJpbmcgSUQgKGluIHRoZSAnbmFtZScgdGFibGUpIGFzc29jaWF0ZWQKKyAgICogICAgIHdpdGggaXQuICBUaGUgZm9udCBjYW4gdGVsbCB0aGUgdXNlciB0aGF0LCBmb3IgZXhhbXBsZSwKKyAgICogICAgIFtXZWlnaHQ9MS41LFdpZHRoPTEuMV0gaXMgJ0JvbGQnLiAgQW5vdGhlciBuYW1lIGZvciAnbmFtZWQgc3R5bGUnIGlzCisgICAqICAgICAnbmFtZWQgaW5zdGFuY2UnLgorICAgKgorICAgKiAgICAgRm9yIEFkb2JlIE11bHRpcGxlIE1hc3RlcnMgZm9udHMsIHRoaXMgdmFsdWUgaXMgYWx3YXlzIHplcm8gYmVjYXVzZQorICAgKiAgICAgdGhlIGZvcm1hdCBkb2VzIG5vdCBzdXBwb3J0IG5hbWVkIHN0eWxlcy4KKyAgICoKKyAgICogICBheGlzIDo6CisgICAqICAgICBBbiBheGlzIGRlc2NyaXB0b3IgdGFibGUuICBUcnVlVHlwZSBHWCBhbmQgT3BlblR5cGUgdmFyaWF0aW9uIGZvbnRzCisgICAqICAgICBjb250YWluIHNsaWdodGx5IG1vcmUgZGF0YSB0aGFuIEFkb2JlIE1NIGZvbnRzLiAgTWVtb3J5IG1hbmFnZW1lbnQKKyAgICogICAgIG9mIHRoaXMgcG9pbnRlciBpcyBkb25lIGludGVybmFsbHkgYnkgRnJlZVR5cGUuCisgICAqCisgICAqICAgbmFtZWRzdHlsZSA6OgorICAgKiAgICAgQSBuYW1lZCBzdHlsZSAoaW5zdGFuY2UpIHRhYmxlLiAgT25seSBtZWFuaW5nZnVsIGZvciBUcnVlVHlwZSBHWCBhbmQKKyAgICogICAgIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250cy4gIE1lbW9yeSBtYW5hZ2VtZW50IG9mIHRoaXMgcG9pbnRlciBpcyBkb25lCisgICAqICAgICBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX1Zhcl8KICAgewogICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9heGlzOwpAQCAtMjQ1LDM4NCArMjUwLDQ5MyBAQAogICB9IEZUX01NX1ZhcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIGEgdmFyaWF0aW9uIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBBZG9iZSBNTSBmb250LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uICovCi0gIC8qICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYXN0ZXIgOjogVGhlIE11bHRpcGxlIE1hc3RlcnMgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfTXVsdGlfTWFzdGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSBhIHZhcmlhdGlvbiBkZXNjcmlwdG9yIG9mIGEgZ2l2ZW4gQWRvYmUgTU0gZm9udC4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIHVzZWQgd2l0aCBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24KKyAgICogICBmb250cy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhbWFzdGVyIDo6CisgICAqICAgICBUaGUgTXVsdGlwbGUgTWFzdGVycyBkZXNjcmlwdG9yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X011bHRpX01hc3RlciggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyICAqYW1hc3RlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSB2YXJpYXRpb24gZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFzdGVyIDo6IFRoZSB2YXJpYXRpb24gZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBBbGxvY2F0ZXMgYSBkYXRhIHN0cnVjdHVyZSwgd2hpY2ggdGhlIHVzZXIgbXVzdCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgZGVhbGxvY2F0ZSB3aXRoIGEgY2FsbCB0byBARlRfRG9uZV9NTV9WYXIgYWZ0ZXIgdXNlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfTU1fVmFyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSBhIHZhcmlhdGlvbiBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIGZvbnQuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgdmFyaWF0aW9uIGZvcm1hdHMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYW1hc3RlciA6OgorICAgKiAgICAgVGhlIHZhcmlhdGlvbiBkZXNjcmlwdG9yLiAgQWxsb2NhdGVzIGEgZGF0YSBzdHJ1Y3R1cmUsIHdoaWNoIHRoZQorICAgKiAgICAgdXNlciBtdXN0IGRlYWxsb2NhdGUgd2l0aCBhIGNhbGwgdG8gQEZUX0RvbmVfTU1fVmFyIGFmdGVyIHVzZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0dldF9NTV9WYXIoIEZUX0ZhY2UgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqYW1hc3RlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSBARlRfR2V0X01NX1Zhci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSBvZiB0aGUgZmFjZSdzIHBhcmVudCBsaWJyYXJ5IG9iamVjdCB0aGF0IHdhcyAgICovCi0gIC8qICAgICAgICAgICAgICAgdXNlZCBpbiB0aGUgY2FsbCB0byBARlRfR2V0X01NX1ZhciB0byBjcmVhdGUgYGFtYXN0ZXInLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9Eb25lX01NX1ZhcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBieSBARlRfR2V0X01NX1Zhci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIG9mIHRoZSBmYWNlJ3MgcGFyZW50IGxpYnJhcnkgb2JqZWN0IHRoYXQgd2FzIHVzZWQgaW4gdGhlCisgICAqICAgICBjYWxsIHRvIEBGVF9HZXRfTU1fVmFyIHRvIGNyZWF0ZSBgYW1hc3RlcmAuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9Eb25lX01NX1ZhciggRlRfTGlicmFyeSAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICBGVF9NTV9WYXIgICAqYW1hc3RlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIEFkb2JlIE1NIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggICAgICovCi0gIC8qICAgIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uICovCi0gIC8qICAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgW1NpbmNlIDIuOC4xXSBUbyByZXNldCBhbGwgYXhlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMsIGNhbGwgdGhlICAgICovCi0gIC8qICAgIGZ1bmN0aW9uIHdpdGggYG51bV9jb29yZHMnIHNldCB0byB6ZXJvIGFuZCBgY29vcmRzJyBzZXQgdG8gTlVMTC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgW1NpbmNlIDIuOV0gSWYgYG51bV9jb29yZHMnIGlzIGxhcmdlciB0aGFuIHplcm8sIHRoaXMgZnVuY3Rpb24gICAgICovCi0gIC8qICAgIHNldHMgdGhlIEBGVF9GQUNFX0ZMQUdfVkFSSUFUSU9OIGJpdCBpbiBARlRfRmFjZSdzIGBmYWNlX2ZsYWdzJyAgICAqLwotICAvKiAgICBmaWVsZCAoaS5lLiwgQEZUX0lTX1ZBUklBVElPTiB3aWxsIHJldHVybiB0cnVlKS4gIElmIGBudW1fY29vcmRzJyAgKi8KLSAgLyogICAgaXMgemVybywgdGhpcyBiaXQgZmxhZyBnZXRzIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZvciBBZG9iZSBNTSBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250IGRlc2lnbiB0aHJvdWdoIGRlc2lnbgorICAgKiAgIGNvb3JkaW5hdGVzLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIFRydWVUeXBlIEdYIG9yIE9wZW5UeXBlIHZhcmlhdGlvbgorICAgKiAgIGZvbnRzLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbnVtX2Nvb3JkcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgaXMgbGFyZ2VyIHRoYW4KKyAgICogICAgIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuCisgICAqICAgICB0aGUgbnVtYmVyIG9mIGF4ZXMsIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBheGVzLgorICAgKgorICAgKiAgIGNvb3JkcyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgZGVzaWduIGNvb3JkaW5hdGVzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFtTaW5jZSAyLjguMV0gVG8gcmVzZXQgYWxsIGF4ZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLCBjYWxsIHRoZQorICAgKiAgIGZ1bmN0aW9uIHdpdGggYG51bV9jb29yZHNgIHNldCB0byB6ZXJvIGFuZCBgY29vcmRzYCBzZXQgdG8gYE5VTExgLgorICAgKgorICAgKiAgIFtTaW5jZSAyLjldIElmIGBudW1fY29vcmRzYCBpcyBsYXJnZXIgdGhhbiB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHNldHMKKyAgICogICB0aGUgQEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04gYml0IGluIEBGVF9GYWNlJ3MgYGZhY2VfZmxhZ3NgIGZpZWxkCisgICAqICAgKGkuZS4sIEBGVF9JU19WQVJJQVRJT04gd2lsbCByZXR1cm4gdHJ1ZSkuICBJZiBgbnVtX2Nvb3Jkc2AgaXMgemVybywKKyAgICogICB0aGlzIGJpdCBmbGFnIGdldHMgdW5zZXQuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBhbGwgc3VwcG9ydGVkIHZhcmlhdGlvbiBmb3JtYXRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgW1NpbmNlIDIuOC4xXSBUbyByZXNldCBhbGwgYXhlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMsIGNhbGwgdGhlICAgICovCi0gIC8qICAgIGZ1bmN0aW9uIHdpdGggYG51bV9jb29yZHMnIHNldCB0byB6ZXJvIGFuZCBgY29vcmRzJyBzZXQgdG8gTlVMTC4gICAqLwotICAvKiAgICBbU2luY2UgMi45XSBgRGVmYXVsdCB2YWx1ZXMnIG1lYW5zIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbmFtZWQgICAgKi8KLSAgLyogICAgaW5zdGFuY2UgKG9yIHRoZSBiYXNlIGZvbnQgaWYgbm8gbmFtZWQgaW5zdGFuY2UgaXMgc2VsZWN0ZWQpLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBbU2luY2UgMi45XSBJZiBgbnVtX2Nvb3JkcycgaXMgbGFyZ2VyIHRoYW4gemVybywgdGhpcyBmdW5jdGlvbiAgICAgKi8KLSAgLyogICAgc2V0cyB0aGUgQEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04gYml0IGluIEBGVF9GYWNlJ3MgYGZhY2VfZmxhZ3MnICAgICovCi0gIC8qICAgIGZpZWxkIChpLmUuLCBARlRfSVNfVkFSSUFUSU9OIHdpbGwgcmV0dXJuIHRydWUpLiAgSWYgYG51bV9jb29yZHMnICAqLwotICAvKiAgICBpcyB6ZXJvLCB0aGlzIGJpdCBmbGFnIGdldHMgdW5zZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENob29zZSBhbiBpbnRlcnBvbGF0ZWQgZm9udCBkZXNpZ24gdGhyb3VnaCBkZXNpZ24gY29vcmRpbmF0ZXMuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgdmFyaWF0aW9uIGZvcm1hdHMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBudW1fY29vcmRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNpZ24gY29vcmRpbmF0ZXMuICBJZiBpdCBpcyBsYXJnZXIgdGhhbgorICAgKiAgICAgdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4KKyAgICogICAgIHRoZSBudW1iZXIgb2YgYXhlcywgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuCisgICAqCisgICAqICAgY29vcmRzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgW1NpbmNlIDIuOC4xXSBUbyByZXNldCBhbGwgYXhlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMsIGNhbGwgdGhlCisgICAqICAgZnVuY3Rpb24gd2l0aCBgbnVtX2Nvb3Jkc2Agc2V0IHRvIHplcm8gYW5kIGBjb29yZHNgIHNldCB0byBgTlVMTGAuCisgICAqICAgW1NpbmNlIDIuOV0gJ0RlZmF1bHQgdmFsdWVzJyBtZWFucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hbWVkCisgICAqICAgaW5zdGFuY2UgKG9yIHRoZSBiYXNlIGZvbnQgaWYgbm8gbmFtZWQgaW5zdGFuY2UgaXMgc2VsZWN0ZWQpLgorICAgKgorICAgKiAgIFtTaW5jZSAyLjldIElmIGBudW1fY29vcmRzYCBpcyBsYXJnZXIgdGhhbiB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHNldHMKKyAgICogICB0aGUgQEZUX0ZBQ0VfRkxBR19WQVJJQVRJT04gYml0IGluIEBGVF9GYWNlJ3MgYGZhY2VfZmxhZ3NgIGZpZWxkCisgICAqICAgKGkuZS4sIEBGVF9JU19WQVJJQVRJT04gd2lsbCByZXR1cm4gdHJ1ZSkuICBJZiBgbnVtX2Nvb3Jkc2AgaXMgemVybywKKyAgICogICB0aGlzIGJpdCBmbGFnIGdldHMgdW5zZXQuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRlc2lnbiBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGludGVycG9sYXRlZCAgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgdG8gcmV0cmlldmUuICBJZiBpdCAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgc2V0IHRoZSBleGNlc3MgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMgdG9+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBUaGUgZGVzaWduIGNvb3JkaW5hdGVzIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi43LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBHZXQgdGhlIGRlc2lnbiBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGludGVycG9sYXRlZAorICAgKiAgIGZvbnQuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgdmFyaWF0aW9uIGZvcm1hdHMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCisgICAqCisgICAqICAgbnVtX2Nvb3JkcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgdG8gcmV0cmlldmUuICBJZiBpdCBpcyBsYXJnZXIgdGhhbgorICAgKiAgICAgdGhlIG51bWJlciBvZiBheGVzLCBzZXQgdGhlIGV4Y2VzcyB2YWx1ZXMgdG9+MC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgYXJyYXkuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNy4xCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduIHRocm91Z2ggbm9ybWFsaXplZCBibGVuZCAgICAgICAgKi8KLSAgLyogICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2lnbiBjb29yZGluYXRlcy4gIElmIGl0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBheGVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheSAoZWFjaCBlbGVtZW50IG11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJldHdlZW4gMCBhbmQgMS4wIGZvciBBZG9iZSBNTSBmb250cywgYW5kIGJldHdlZW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAtMS4wIGFuZCAxLjAgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFtTaW5jZSAyLjguMV0gVG8gcmVzZXQgYWxsIGF4ZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLCBjYWxsIHRoZSAgICAqLwotICAvKiAgICBmdW5jdGlvbiB3aXRoIGBudW1fY29vcmRzJyBzZXQgdG8gemVybyBhbmQgYGNvb3Jkcycgc2V0IHRvIE5VTEwuICAgKi8KLSAgLyogICAgW1NpbmNlIDIuOV0gYERlZmF1bHQgdmFsdWVzJyBtZWFucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG5hbWVkICAgICovCi0gIC8qICAgIGluc3RhbmNlIChvciB0aGUgYmFzZSBmb250IGlmIG5vIG5hbWVkIGluc3RhbmNlIGlzIHNlbGVjdGVkKS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgW1NpbmNlIDIuOV0gSWYgYG51bV9jb29yZHMnIGlzIGxhcmdlciB0aGFuIHplcm8sIHRoaXMgZnVuY3Rpb24gICAgICovCi0gIC8qICAgIHNldHMgdGhlIEBGVF9GQUNFX0ZMQUdfVkFSSUFUSU9OIGJpdCBpbiBARlRfRmFjZSdzIGBmYWNlX2ZsYWdzJyAgICAqLwotICAvKiAgICBmaWVsZCAoaS5lLiwgQEZUX0lTX1ZBUklBVElPTiB3aWxsIHJldHVybiB0cnVlKS4gIElmIGBudW1fY29vcmRzJyAgKi8KLSAgLyogICAgaXMgemVybywgdGhpcyBiaXQgZmxhZyBnZXRzIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250IGRlc2lnbiB0aHJvdWdoIG5vcm1hbGl6ZWQgYmxlbmQKKyAgICogICBjb29yZGluYXRlcy4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggYWxsIHN1cHBvcnRlZCB2YXJpYXRpb24gZm9ybWF0cy4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG51bV9jb29yZHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2lnbiBjb29yZGluYXRlcy4gIElmIGl0IGlzIGxhcmdlciB0aGFuCisgICAqICAgICB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbgorICAgKiAgICAgdGhlIG51bWJlciBvZiBheGVzLCB1c2UgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSByZW1haW5pbmcgYXhlcy4KKyAgICoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgYXJyYXkgKGVhY2ggZWxlbWVudCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4wCisgICAqICAgICBmb3IgQWRvYmUgTU0gZm9udHMsIGFuZCBiZXR3ZWVuIC0xLjAgYW5kIDEuMCBmb3IgVHJ1ZVR5cGUgR1ggYW5kCisgICAqICAgICBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMpLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFtTaW5jZSAyLjguMV0gVG8gcmVzZXQgYWxsIGF4ZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLCBjYWxsIHRoZQorICAgKiAgIGZ1bmN0aW9uIHdpdGggYG51bV9jb29yZHNgIHNldCB0byB6ZXJvIGFuZCBgY29vcmRzYCBzZXQgdG8gYE5VTExgLgorICAgKiAgIFtTaW5jZSAyLjldICdEZWZhdWx0IHZhbHVlcycgbWVhbnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBuYW1lZAorICAgKiAgIGluc3RhbmNlIChvciB0aGUgYmFzZSBmb250IGlmIG5vIG5hbWVkIGluc3RhbmNlIGlzIHNlbGVjdGVkKS4KKyAgICoKKyAgICogICBbU2luY2UgMi45XSBJZiBgbnVtX2Nvb3Jkc2AgaXMgbGFyZ2VyIHRoYW4gemVybywgdGhpcyBmdW5jdGlvbiBzZXRzCisgICAqICAgdGhlIEBGVF9GQUNFX0ZMQUdfVkFSSUFUSU9OIGJpdCBpbiBARlRfRmFjZSdzIGBmYWNlX2ZsYWdzYCBmaWVsZAorICAgKiAgIChpLmUuLCBARlRfSVNfVkFSSUFUSU9OIHdpbGwgcmV0dXJuIHRydWUpLiAgSWYgYG51bV9jb29yZHNgIGlzIHplcm8sCisgICAqICAgdGhpcyBiaXQgZmxhZyBnZXRzIHVuc2V0LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgICAgICovCi0gIC8qICAgIGludGVycG9sYXRlZCBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB3b3JrcyB3aXRoIGFsbCBzdXBwb3J0ZWQgdmFyaWF0aW9uIGZvcm1hdHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2Ygbm9ybWFsaXplZCBibGVuZCBjb29yZGluYXRlcyB0byAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICByZXRyaWV2ZS4gIElmIGl0IGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc2V0IHRoZSBleGNlc3MgdmFsdWVzIHRvfjAuNSBmb3IgQWRvYmUgTU0gZm9udHMsIGFuZCAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRvfjAgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24gZm9udHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IFRoZSBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzIGFycmF5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjcuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBHZXQgdGhlIG5vcm1hbGl6ZWQgYmxlbmQgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgKiAgIGludGVycG9sYXRlZCBmb250LgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gd29ya3Mgd2l0aCBhbGwgc3VwcG9ydGVkIHZhcmlhdGlvbiBmb3JtYXRzLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAgKgorICAgKiAgIG51bV9jb29yZHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2Ygbm9ybWFsaXplZCBibGVuZCBjb29yZGluYXRlcyB0byByZXRyaWV2ZS4gIElmIGl0IGlzCisgICAqICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIHNldCB0aGUgZXhjZXNzIHZhbHVlcyB0b34wLjUgZm9yCisgICAqICAgICBBZG9iZSBNTSBmb250cywgYW5kIHRvfjAgZm9yIFRydWVUeXBlIEdYIGFuZCBPcGVuVHlwZSB2YXJpYXRpb24KKyAgICogICAgIGZvbnRzLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGNvb3JkcyA6OgorICAgKiAgICAgVGhlIG5vcm1hbGl6ZWQgYmxlbmQgY29vcmRpbmF0ZXMgYXJyYXkuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNy4xCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIGFub3RoZXIgbmFtZSBvZiBARlRfU2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBpcyBhbm90aGVyIG5hbWUgb2YgQEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYW5vdGhlciBuYW1lIG9mIEBGVF9HZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuNy4xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGlzIGFub3RoZXIgbmFtZSBvZiBARlRfR2V0X01NX0JsZW5kX0Nvb3JkaW5hdGVzLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi43LjEKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfVmFyX0JsZW5kX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBUl9BWElTX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfR2V0X1Zhcl9BeGlzX0ZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQVJfQVhJU19GTEFHX0hJRERFTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdmFyaWF0aW9uIGF4aXMgc2hvdWxkIG5vdCBiZSBleHBvc2VkIHRvIHVzZXIgaW50ZXJmYWNlcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi44LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9NTV9XZWlnaHRWZWN0b3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZvciBBZG9iZSBNTSBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250IGRlc2lnbiBieSBkaXJlY3RseQorICAgKiAgIHNldHRpbmcgdGhlIHdlaWdodCB2ZWN0b3IuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSB1c2VkIHdpdGggVHJ1ZVR5cGUgR1ggb3IgT3BlblR5cGUgdmFyaWF0aW9uCisgICAqICAgZm9udHMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIHdlaWdodCB2ZWN0b3IgYXJyYXkuICBJZiBpdCBpcyBsYXJnZXIgdGhhbiB0aGUKKyAgICogICAgIG51bWJlciBvZiBkZXNpZ25zLCB0aGUgZXh0cmEgdmFsdWVzIGFyZSBpZ25vcmVkLiAgSWYgaXQgaXMgbGVzcyB0aGFuCisgICAqICAgICB0aGUgbnVtYmVyIG9mIGRlc2lnbnMsIHRoZSByZW1haW5pbmcgdmFsdWVzIGFyZSBzZXQgdG8gemVyby4KKyAgICoKKyAgICogICB3ZWlnaHR2ZWN0b3IgOjoKKyAgICogICAgIEFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgd2VpZ2h0IHZlY3Rvci4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBZG9iZSBNdWx0aXBsZSBNYXN0ZXIgZm9udHMgbGltaXQgdGhlIG51bWJlciBvZiBkZXNpZ25zLCBhbmQgdGh1cyB0aGUKKyAgICogICBsZW5ndGggb2YgdGhlIHdlaWdodCB2ZWN0b3IgdG9+MTYuCisgICAqCisgICAqICAgSWYgYGxlbmAgaXMgemVybyBhbmQgYHdlaWdodHZlY3RvcmAgaXMgYE5VTExgLCB0aGUgd2VpZ2h0IHZlY3RvciBhcnJheQorICAgKiAgIGlzIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4KKyAgICoKKyAgICogICBUaGUgQWRvYmUgZG9jdW1lbnRhdGlvbiBhbHNvIHN0YXRlcyB0aGF0IHRoZSB2YWx1ZXMgaW4gdGhlCisgICAqICAgV2VpZ2h0VmVjdG9yIGFycmF5IG11c3QgdG90YWwgMS4wICsvLX4wLjAwMS4gIEluIHByYWN0aWNlIHRoaXMgZG9lcworICAgKiAgIG5vdCBzZWVtIHRvIGJlIGVuZm9yY2VkLCBzbyBpcyBub3QgZW5mb3JjZWQgaGVyZSwgZWl0aGVyLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4xMAorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX1NldF9NTV9XZWlnaHRWZWN0b3IoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgd2VpZ2h0dmVjdG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9NTV9XZWlnaHRWZWN0b3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZvciBBZG9iZSBNTSBmb250cywgcmV0cmlldmUgdGhlIGN1cnJlbnQgd2VpZ2h0IHZlY3RvciBvZiB0aGUgZm9udC4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNhbid0IGJlIHVzZWQgd2l0aCBUcnVlVHlwZSBHWCBvciBPcGVuVHlwZSB2YXJpYXRpb24KKyAgICogICBmb250cy4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgICoKKyAgICogICBsZW4gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgdG8gYmUgZmlsbGVkLiAgSWYgdGhlIHNpemUgb2YgdGhlCisgICAqICAgICBhcnJheSBpcyBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBkZXNpZ25zLCBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnRgCisgICAqICAgICBpcyByZXR1cm5lZCwgYW5kIGBsZW5gIGlzIHNldCB0byB0aGUgcmVxdWlyZWQgc2l6ZSAodGhlIG51bWJlciBvZgorICAgKiAgICAgZGVzaWducykuICBJZiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YKKyAgICogICAgIGRlc2lnbnMsIHRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgc2V0IHRvfjAuICBPbiBzdWNjZXNzZnVsCisgICAqICAgICBjb21wbGV0aW9uLCBgbGVuYCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBkZXNpZ25zIChpLmUuLCB0aGUgbnVtYmVyCisgICAqICAgICBvZiB2YWx1ZXMgd3JpdHRlbiB0byB0aGUgYXJyYXkpLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHdlaWdodHZlY3RvciA6OgorICAgKiAgICAgQW4gYXJyYXkgdG8gYmUgZmlsbGVkLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEFkb2JlIE11bHRpcGxlIE1hc3RlciBmb250cyBsaW1pdCB0aGUgbnVtYmVyIG9mIGRlc2lnbnMsIGFuZCB0aHVzIHRoZQorICAgKiAgIGxlbmd0aCBvZiB0aGUgV2VpZ2h0VmVjdG9yIHRvfjE2LgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi4xMAorICAgKi8KKyAgRlRfRVhQT1JUKCBGVF9FcnJvciApCisgIEZUX0dldF9NTV9XZWlnaHRWZWN0b3IoIEZUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgd2VpZ2h0dmVjdG9yICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfVkFSX0FYSVNfRkxBR19YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgcmV0dXJuIHZhbHVlIG9mCisgICAqICAgQEZUX0dldF9WYXJfQXhpc19GbGFncy4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBGVF9WQVJfQVhJU19GTEFHX0hJRERFTiA6OgorICAgKiAgICAgVGhlIHZhcmlhdGlvbiBheGlzIHNob3VsZCBub3QgYmUgZXhwb3NlZCB0byB1c2VyIGludGVyZmFjZXMuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjguMQorICAgKi8KICNkZWZpbmUgRlRfVkFSX0FYSVNfRkxBR19ISURERU4gIDEKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9WYXJfQXhpc19GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldCB0aGUgYGZsYWdzJyBmaWVsZCBvZiBhbiBPcGVuVHlwZSBWYXJpYXRpb24gQXhpcyBSZWNvcmQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90IG1lYW5pbmdmdWwgZm9yIEFkb2JlIE1NIGZvbnRzIChgKmZsYWdzJyBpcyBhbHdheXMgemVybykuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFzdGVyICAgICA6OiBUaGUgdmFyaWF0aW9uIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBheGlzX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIHZhcmlhdGlvbiBheGlzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgIDo6IFRoZSBgZmxhZ3MnIGZpZWxkLiAgU2VlIEBGVF9WQVJfQVhJU19GTEFHX1hYWCBmb3IgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi44LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9WYXJfQXhpc19GbGFncworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgR2V0IHRoZSAnZmxhZ3MnIGZpZWxkIG9mIGFuIE9wZW5UeXBlIFZhcmlhdGlvbiBBeGlzIFJlY29yZC4KKyAgICoKKyAgICogICBOb3QgbWVhbmluZ2Z1bCBmb3IgQWRvYmUgTU0gZm9udHMgKGAqZmxhZ3NgIGlzIGFsd2F5cyB6ZXJvKS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1hc3RlciA6OgorICAgKiAgICAgVGhlIHZhcmlhdGlvbiBkZXNjcmlwdG9yLgorICAgKgorICAgKiAgIGF4aXNfaW5kZXggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIHZhcmlhdGlvbiBheGlzLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGZsYWdzIDo6CisgICAqICAgICBUaGUgJ2ZsYWdzJyBmaWVsZC4gIFNlZSBARlRfVkFSX0FYSVNfRkxBR19YWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi44LjEKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfVmFyX0F4aXNfRmxhZ3MoIEZUX01NX1ZhciogIG1hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBheGlzX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgIGZsYWdzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfTmFtZWRfSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgb3IgY2hhbmdlIHRoZSBjdXJyZW50IG5hbWVkIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluc3RhbmNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGluc3RhbmNlLCBzdGFydGluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB3aXRoIHZhbHVlIDEuICBJZiBzZXQgdG8gdmFsdWUgMCwgRnJlZVR5cGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZXMgdG8gZm9udCBhY2Nlc3Mgd2l0aG91dCBhIG5hbWVkICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmdW5jdGlvbiB1c2VzIHRoZSB2YWx1ZSBvZiBgaW5zdGFuY2VfaW5kZXgnIHRvIHNldCBiaXRzIDE2LTMwICAqLwotICAvKiAgICBvZiB0aGUgZmFjZSdzIGBmYWNlX2luZGV4JyBmaWVsZC4gIEl0IGFsc28gcmVzZXRzIGFueSB2YXJpYXRpb24gICAgKi8KLSAgLyogICAgYXBwbGllZCB0byB0aGUgZm9udCwgYW5kIHRoZSBARlRfRkFDRV9GTEFHX1ZBUklBVElPTiBiaXQgb2YgdGhlICAgICovCi0gIC8qICAgIGZhY2UncyBgZmFjZV9mbGFncycgZmllbGQgZ2V0cyByZXNldCB0byB6ZXJvIChpLmUuLCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfSVNfVkFSSUFUSU9OIHdpbGwgcmV0dXJuIGZhbHNlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBBZG9iZSBNTSBmb250cyAod2hpY2ggZG9uJ3QgaGF2ZSBuYW1lZCBpbnN0YW5jZXMpIHRoaXMgICAgICAgICAqLwotICAvKiAgICBmdW5jdGlvbiBzaW1wbHkgcmVzZXRzIHRoZSBjdXJyZW50IGZhY2UgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2V0X05hbWVkX0luc3RhbmNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZXQgb3IgY2hhbmdlIHRoZSBjdXJyZW50IG5hbWVkIGluc3RhbmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAgKgorICAgKiAgIGluc3RhbmNlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3RlZCBpbnN0YW5jZSwgc3RhcnRpbmcgd2l0aCB2YWx1ZSAxLiAgSWYgc2V0CisgICAqICAgICB0byB2YWx1ZSAwLCBGcmVlVHlwZSBzd2l0Y2hlcyB0byBmb250IGFjY2VzcyB3aXRob3V0IGEgbmFtZWQKKyAgICogICAgIGluc3RhbmNlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBmdW5jdGlvbiB1c2VzIHRoZSB2YWx1ZSBvZiBgaW5zdGFuY2VfaW5kZXhgIHRvIHNldCBiaXRzIDE2LTMwIG9mCisgICAqICAgdGhlIGZhY2UncyBgZmFjZV9pbmRleGAgZmllbGQuICBJdCBhbHNvIHJlc2V0cyBhbnkgdmFyaWF0aW9uIGFwcGxpZWQKKyAgICogICB0byB0aGUgZm9udCwgYW5kIHRoZSBARlRfRkFDRV9GTEFHX1ZBUklBVElPTiBiaXQgb2YgdGhlIGZhY2UncworICAgKiAgIGBmYWNlX2ZsYWdzYCBmaWVsZCBnZXRzIHJlc2V0IHRvIHplcm8gKGkuZS4sIEBGVF9JU19WQVJJQVRJT04gd2lsbAorICAgKiAgIHJldHVybiBmYWxzZSkuCisgICAqCisgICAqICAgRm9yIEFkb2JlIE1NIGZvbnRzICh3aGljaCBkb24ndCBoYXZlIG5hbWVkIGluc3RhbmNlcykgdGhpcyBmdW5jdGlvbgorICAgKiAgIHNpbXBseSByZXNldHMgdGhlIGN1cnJlbnQgZmFjZSB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuOQorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1NldF9OYW1lZF9JbnN0YW5jZSggRlRfRmFjZSAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBpbnN0YW5jZV9pbmRleCApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oCmluZGV4IGE2ZWI4NzYuLjNmN2FlODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kYXBpLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kYXBpLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bW9kYXBpLmgKKyAqCisgKiAgIEZyZWVUeXBlIG1vZHVsZXMgcHVibGljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUTU9EQVBJX0hfCiAjZGVmaW5lIEZUTU9EQVBJX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMyw3NyArMzIsNzcgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW9kdWxlIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IHRvIGFkZCwgdXBncmFkZSwgcmVtb3ZlLCBhbmQgY29udHJvbCBtb2R1bGVzIGZyb20gRnJlZVR5cGUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlZmluaXRpb25zIGJlbG93IGFyZSB1c2VkIHRvIG1hbmFnZSBtb2R1bGVzIHdpdGhpbiBGcmVlVHlwZS4gICovCi0gIC8qICAgIE1vZHVsZXMgY2FuIGJlIGFkZGVkLCB1cGdyYWRlZCwgYW5kIHJlbW92ZWQgYXQgcnVudGltZS4gICAgICAgICAgICAqLwotICAvKiAgICBBZGRpdGlvbmFsbHksIHNvbWUgbW9kdWxlIHByb3BlcnRpZXMgY2FuIGJlIGNvbnRyb2xsZWQgYWxzby4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhlcmUgaXMgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgYG1vZHVsZV9uYW1lJyBmaWVsZCBpbiAgICAqLwotICAvKiAgICB0aGUgQEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGF1dG9maXR0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiZGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgY2ZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGd4dmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBvdHZhbGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcGNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBmciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwc2F1eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcHNoaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBzbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICByYXN0ZXIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgc2ZudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHNtb290aCwgc21vb3RoLWxjZCwgc21vb3RoLWxjZHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB0cnVldHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdHlwZTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHR5cGU0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB0MWNpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgd2luZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGUgRnJlZVR5cGUgQ2FjaGUgc3ViLXN5c3RlbSBpcyBub3QgYSBGcmVlVHlwZSBtb2R1bGUuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FkZF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVtb3ZlX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUHJvcGVydHlfU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Byb3BlcnR5X0dldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVmZXJlbmNlX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXJfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgbW9kdWxlX21hbmFnZW1lbnQKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIE1vZHVsZSBNYW5hZ2VtZW50CisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBIb3cgdG8gYWRkLCB1cGdyYWRlLCByZW1vdmUsIGFuZCBjb250cm9sIG1vZHVsZXMgZnJvbSBGcmVlVHlwZS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5hZ2UgbW9kdWxlcyB3aXRoaW4gRnJlZVR5cGUuCisgICAqICAgTW9kdWxlcyBjYW4gYmUgYWRkZWQsIHVwZ3JhZGVkLCBhbmQgcmVtb3ZlZCBhdCBydW50aW1lLiAgQWRkaXRpb25hbGx5LAorICAgKiAgIHNvbWUgbW9kdWxlIHByb3BlcnRpZXMgY2FuIGJlIGNvbnRyb2xsZWQgYWxzby4KKyAgICoKKyAgICogICBIZXJlIGlzIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBtb2R1bGVfbmFtZWAgZmllbGQgaW4gdGhlCisgICAqICAgQEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3R1cmUuCisgICAqCisgICAqICAgYGBgCisgICAqICAgICBhdXRvZml0dGVyCisgICAqICAgICBiZGYKKyAgICogICAgIGNmZgorICAgKiAgICAgZ3h2YWxpZAorICAgKiAgICAgb3R2YWxpZAorICAgKiAgICAgcGNmCisgICAqICAgICBwZnIKKyAgICogICAgIHBzYXV4CisgICAqICAgICBwc2hpbnRlcgorICAgKiAgICAgcHNuYW1lcworICAgKiAgICAgcmFzdGVyMQorICAgKiAgICAgc2ZudAorICAgKiAgICAgc21vb3RoCisgICAqICAgICB0cnVldHlwZQorICAgKiAgICAgdHlwZTEKKyAgICogICAgIHR5cGU0MgorICAgKiAgICAgdDFjaWQKKyAgICogICAgIHdpbmZvbnRzCisgICAqICAgYGBgCisgICAqCisgICAqICAgTm90ZSB0aGF0IHRoZSBGcmVlVHlwZSBDYWNoZSBzdWItc3lzdGVtIGlzIG5vdCBhIEZyZWVUeXBlIG1vZHVsZS4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgIEZUX01vZHVsZQorICAgKiAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvcgorICAgKiAgIEZUX01vZHVsZV9EZXN0cnVjdG9yCisgICAqICAgRlRfTW9kdWxlX1JlcXVlc3RlcgorICAgKiAgIEZUX01vZHVsZV9DbGFzcworICAgKgorICAgKiAgIEZUX0FkZF9Nb2R1bGUKKyAgICogICBGVF9HZXRfTW9kdWxlCisgICAqICAgRlRfUmVtb3ZlX01vZHVsZQorICAgKiAgIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMKKyAgICoKKyAgICogICBGVF9Qcm9wZXJ0eV9TZXQKKyAgICogICBGVF9Qcm9wZXJ0eV9HZXQKKyAgICogICBGVF9TZXRfRGVmYXVsdF9Qcm9wZXJ0aWVzCisgICAqCisgICAqICAgRlRfTmV3X0xpYnJhcnkKKyAgICogICBGVF9Eb25lX0xpYnJhcnkKKyAgICogICBGVF9SZWZlcmVuY2VfTGlicmFyeQorICAgKgorICAgKiAgIEZUX1JlbmRlcmVyCisgICAqICAgRlRfUmVuZGVyZXJfQ2xhc3MKKyAgICoKKyAgICogICBGVF9HZXRfUmVuZGVyZXIKKyAgICogICBGVF9TZXRfUmVuZGVyZXIKKyAgICoKKyAgICogICBGVF9TZXRfRGVidWdfSG9vaworICAgKgorICAgKi8KIAogCiAgIC8qIG1vZHVsZSBiaXQgZmxhZ3MgKi8KQEAgLTEzNyw4MyArMTM2LDk5IEBACiAgIHR5cGVkZWYgRlRfUG9pbnRlciAgRlRfTW9kdWxlX0ludGVyZmFjZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIChub3QgY3JlYXRlKSBhIG5ldyBtb2R1bGUgb2JqZWN0LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGluaXRpYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9Nb2R1bGVfQ29uc3RydWN0b3IKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIChub3QgY3JlYXRlKSBhIG5ldyBtb2R1bGUgb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbW9kdWxlIDo6CisgICAqICAgICBUaGUgbW9kdWxlIHRvIGluaXRpYWxpemUuCisgICAqLwogICB0eXBlZGVmIEZUX0Vycm9yCiAgICgqRlRfTW9kdWxlX0NvbnN0cnVjdG9yKSggRlRfTW9kdWxlICBtb2R1bGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9EZXN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBmaW5hbGl6ZSAobm90IGRlc3Ryb3kpIGEgZ2l2ZW4gbW9kdWxlIG9iamVjdC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBUaGUgbW9kdWxlIHRvIGZpbmFsaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGZpbmFsaXplIChub3QgZGVzdHJveSkgYSBnaXZlbiBtb2R1bGUgb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbW9kdWxlIDo6CisgICAqICAgICBUaGUgbW9kdWxlIHRvIGZpbmFsaXplLgorICAgKi8KICAgdHlwZWRlZiB2b2lkCiAgICgqRlRfTW9kdWxlX0Rlc3RydWN0b3IpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX1JlcXVlc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIHF1ZXJ5IGEgZ2l2ZW4gbW9kdWxlIGZvciBhIHNwZWNpZmljIGludGVyZmFjZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlIDo6IFRoZSBtb2R1bGUgdG8gYmUgc2VhcmNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lIDo6ICAgVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBpbiB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgRlRfTW9kdWxlX1JlcXVlc3RlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHF1ZXJ5IGEgZ2l2ZW4gbW9kdWxlIGZvciBhIHNwZWNpZmljIGludGVyZmFjZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1vZHVsZSA6OgorICAgKiAgICAgVGhlIG1vZHVsZSB0byBiZSBzZWFyY2hlZC4KKyAgICoKKyAgICogICBuYW1lIDo6CisgICAqICAgICBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIGluIHRoZSBtb2R1bGUuCisgICAqLwogICB0eXBlZGVmIEZUX01vZHVsZV9JbnRlcmZhY2UKICAgKCpGVF9Nb2R1bGVfUmVxdWVzdGVyKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG5hbWUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtb2R1bGUgY2xhc3MgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9mbGFncyAgICA6OiBCaXQgZmxhZ3MgZGVzY3JpYmluZyB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3NpemUgICAgIDo6IFRoZSBzaXplIG9mIG9uZSBtb2R1bGUgb2JqZWN0L2luc3RhbmNlIGluICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgICAgIDo6IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfdmVyc2lvbiAgOjogVGhlIHZlcnNpb24sIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIChtYWpvci5taW5vcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfcmVxdWlyZXMgOjogVGhlIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhpcyBtb2R1bGUgcmVxdWlyZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzIGEgMTYuMTYgZml4ZWQgbnVtYmVyIChtYWpvci5taW5vcikuICBTdGFydHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhdCB2ZXJzaW9uIDIuMCwgaS5lLiwgMHgyMDAwMC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX2luaXQgICAgIDo6IFRoZSBpbml0aWFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZG9uZSAgICAgOjogVGhlIGZpbmFsaXppbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9pbnRlcmZhY2UgICA6OiBUaGUgaW50ZXJmYWNlIHJlcXVlc3RpbmcgZnVuY3Rpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTW9kdWxlX0NsYXNzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICBXaGlsZSBiZWluZyBhIHB1YmxpYyBzdHJ1Y3R1cmUgbmVjZXNzYXJ5CisgICAqICAgZm9yIEZyZWVUeXBlJ3MgbW9kdWxlIGJvb2trZWVwaW5nLCBtb3N0IG9mIHRoZSBmaWVsZHMgYXJlIGVzc2VudGlhbGx5CisgICAqICAgaW50ZXJuYWwsIG5vdCB0byBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG1vZHVsZV9mbGFncyA6OgorICAgKiAgICAgQml0IGZsYWdzIGRlc2NyaWJpbmcgdGhlIG1vZHVsZS4KKyAgICoKKyAgICogICBtb2R1bGVfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2Ygb25lIG1vZHVsZSBvYmplY3QvaW5zdGFuY2UgaW4gYnl0ZXMuCisgICAqCisgICAqICAgbW9kdWxlX25hbWUgOjoKKyAgICogICAgIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuCisgICAqCisgICAqICAgbW9kdWxlX3ZlcnNpb24gOjoKKyAgICogICAgIFRoZSB2ZXJzaW9uLCBhcyBhIDE2LjE2IGZpeGVkIG51bWJlciAobWFqb3IubWlub3IpLgorICAgKgorICAgKiAgIG1vZHVsZV9yZXF1aXJlcyA6OgorICAgKiAgICAgVGhlIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhpcyBtb2R1bGUgcmVxdWlyZXMsIGFzIGEgMTYuMTYgZml4ZWQKKyAgICogICAgIG51bWJlciAobWFqb3IubWlub3IpLiAgU3RhcnRzIGF0IHZlcnNpb24gMi4wLCBpLmUuLCAweDIwMDAwLgorICAgKgorICAgKiAgIG1vZHVsZV9pbnRlcmZhY2UgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciB0byBhIHN0cnVjdHVyZSAod2hpY2ggdmFyaWVzIGJldHdlZW4gZGlmZmVyZW50CisgICAqICAgICBtb2R1bGVzKSB0aGF0IGhvbGRzIHRoZSBtb2R1bGUncyBpbnRlcmZhY2UgZnVuY3Rpb25zLiAgVGhpcyBpcworICAgKiAgICAgZXNzZW50aWFsbHkgd2hhdCBgZ2V0X2ludGVyZmFjZWAgcmV0dXJucy4KKyAgICoKKyAgICogICBtb2R1bGVfaW5pdCA6OgorICAgKiAgICAgVGhlIGluaXRpYWxpemluZyBmdW5jdGlvbi4KKyAgICoKKyAgICogICBtb2R1bGVfZG9uZSA6OgorICAgKiAgICAgVGhlIGZpbmFsaXppbmcgZnVuY3Rpb24uCisgICAqCisgICAqICAgZ2V0X2ludGVyZmFjZSA6OgorICAgKiAgICAgVGhlIGludGVyZmFjZSByZXF1ZXN0aW5nIGZ1bmN0aW9uLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01vZHVsZV9DbGFzc18KICAgewogICAgIEZUX1VMb25nICAgICAgICAgICAgICAgbW9kdWxlX2ZsYWdzOwpAQCAtMjMxLDgzICsyNDYsODkgQEAKICAgfSBGVF9Nb2R1bGVfQ2xhc3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGQgYSBuZXcgbW9kdWxlIHRvIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgbW9kdWxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgbW9kdWxlIGFscmVhZHkgZXhpc3RzIGJ5IHRoYXQgbmFtZSwgKi8KLSAgLyogICAgb3IgaWYgdGhlIG1vZHVsZSByZXF1aXJlcyBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBpcyB0b28gZ3JlYXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0FkZF9Nb2R1bGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFkZCBhIG5ldyBtb2R1bGUgdG8gYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgY2xhenogOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgbW9kdWxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCBvcgorICAgKiAgIGlmIHRoZSBtb2R1bGUgcmVxdWlyZXMgYSB2ZXJzaW9uIG9mIEZyZWVUeXBlIHRoYXQgaXMgdG9vIGdyZWF0LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0FkZF9Nb2R1bGUoIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIGEgbW9kdWxlIGJ5IGl0cyBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9uYW1lIDo6IFRoZSBtb2R1bGUncyBuYW1lIChhcyBhbiBBU0NJSSBzdHJpbmcpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbW9kdWxlIGhhbmRsZS4gIDB+aWYgbm9uZSB3YXMgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlJ3MgaW50ZXJuYWwgbW9kdWxlcyBhcmVuJ3QgZG9jdW1lbnRlZCB2ZXJ5IHdlbGwsIGFuZCB5b3UgICAqLwotICAvKiAgICBzaG91bGQgbG9vayB1cCB0aGUgc291cmNlIGNvZGUgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X01vZHVsZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRmluZCBhIG1vZHVsZSBieSBpdHMgbmFtZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogICBtb2R1bGVfbmFtZSA6OgorICAgKiAgICAgVGhlIG1vZHVsZSdzIG5hbWUgKGFzIGFuIEFTQ0lJIHN0cmluZykuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgQSBtb2R1bGUgaGFuZGxlLiAgMH5pZiBub25lIHdhcyBmb3VuZC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgRnJlZVR5cGUncyBpbnRlcm5hbCBtb2R1bGVzIGFyZW4ndCBkb2N1bWVudGVkIHZlcnkgd2VsbCwgYW5kIHlvdQorICAgKiAgIHNob3VsZCBsb29rIHVwIHRoZSBzb3VyY2UgY29kZSBmb3IgZGV0YWlscy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfTW9kdWxlICkKICAgRlRfR2V0X01vZHVsZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfbmFtZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVtb3ZlX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVtb3ZlIGEgZ2l2ZW4gbW9kdWxlIGZyb20gYSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlICA6OiBBIGhhbmRsZSB0byBhIG1vZHVsZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1vZHVsZSBvYmplY3QgaXMgZGVzdHJveWVkIGJ5IHRoZSBmdW5jdGlvbiBpbiBjYXNlIG9mIHN1Y2Nlc3MuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1JlbW92ZV9Nb2R1bGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJlbW92ZSBhIGdpdmVuIG1vZHVsZSBmcm9tIGEgbGlicmFyeSBpbnN0YW5jZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtb2R1bGUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbW9kdWxlIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgbW9kdWxlIG9iamVjdCBpcyBkZXN0cm95ZWQgYnkgdGhlIGZ1bmN0aW9uIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9SZW1vdmVfTW9kdWxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGUgICBtb2R1bGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX1Byb3BlcnR5X1NldApAQCAtMzE3LDUzICszMzgsNTEgQEAKICAgICoKICAgICogQGlucHV0OgogICAgKiAgICBsaWJyYXJ5IDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHRoZSBtb2R1bGUgaXMgcGFydCBvZi4KKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSB0aGUgbW9kdWxlIGlzIHBhcnQgb2YuCiAgICAqCiAgICAqICAgIG1vZHVsZV9uYW1lIDo6Ci0gICAqICAgICAgIFRoZSBtb2R1bGUgbmFtZS4KKyAgICogICAgICBUaGUgbW9kdWxlIG5hbWUuCiAgICAqCiAgICAqICAgIHByb3BlcnR5X25hbWUgOjoKLSAgICogICAgICAgVGhlIHByb3BlcnR5IG5hbWUuICBQcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgaW4gc2VjdGlvbgotICAgKiAgICAgICBAcHJvcGVydGllcy4KKyAgICogICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiBzZWN0aW9uCisgICAqICAgICAgQHByb3BlcnRpZXMuCiAgICAqCi0gICAqICAgICAgIE5vdGUgdGhhdCBvbmx5IGEgZmV3IG1vZHVsZXMgaGF2ZSBwcm9wZXJ0aWVzLgorICAgKiAgICAgIE5vdGUgdGhhdCBvbmx5IGEgZmV3IG1vZHVsZXMgaGF2ZSBwcm9wZXJ0aWVzLgogICAgKgogICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIGdlbmVyaWMgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSB0aGF0IGdpdmVzIHRoZSBuZXcKLSAgICogICAgICAgdmFsdWUgb2YgdGhlIHByb3BlcnR5LiAgVGhlIGV4YWN0IGRlZmluaXRpb24gb2YgYHZhbHVlJyBpcwotICAgKiAgICAgICBkZXBlbmRlbnQgb24gdGhlIHByb3BlcnR5OyBzZWUgc2VjdGlvbiBAcHJvcGVydGllcy4KKyAgICogICAgICBBIGdlbmVyaWMgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSB0aGF0IGdpdmVzIHRoZSBuZXcKKyAgICogICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWVgIGlzCisgICAqICAgICAgZGVwZW5kZW50IG9uIHRoZSBwcm9wZXJ0eTsgc2VlIHNlY3Rpb24gQHByb3BlcnRpZXMuCiAgICAqCiAgICAqIEByZXR1cm46CiAgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgIElmIGBtb2R1bGVfbmFtZScgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWUnCi0gICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWUnIGRvZXNuJ3QgcmVwcmVzZW50IGEKKyAgICogICAgSWYgYG1vZHVsZV9uYW1lYCBpc24ndCBhIHZhbGlkIG1vZHVsZSBuYW1lLCBvciBgcHJvcGVydHlfbmFtZWAKKyAgICogICAgZG9lc24ndCBzcGVjaWZ5IGEgdmFsaWQgcHJvcGVydHksIG9yIGlmIGB2YWx1ZWAgZG9lc24ndCByZXByZXNlbnQgYQogICAgKiAgICB2YWxpZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LCBhbiBlcnJvciBpcyByZXR1cm5lZC4KICAgICoKLSAgICogICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgcHJvcGVydHkgYGJhcicgKGEgc2ltcGxlIGludGVnZXIpIGluCi0gICAqICAgIG1vZHVsZSBgZm9vJyB0byB2YWx1ZX4xLgorICAgKiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBwcm9wZXJ0eSAnYmFyJyAoYSBzaW1wbGUgaW50ZWdlcikgaW4KKyAgICogICAgbW9kdWxlICdmb28nIHRvIHZhbHVlfjEuCiAgICAqCi0gICAqICAgIHsKKyAgICogICAgYGBgCiAgICAqICAgICAgRlRfVUludCAgYmFyOwogICAgKgogICAgKgogICAgKiAgICAgIGJhciA9IDE7CiAgICAqICAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiZm9vIiwgImJhciIsICZiYXIgKTsKLSAgICogICAgfQorICAgKiAgICBgYGAKICAgICoKICAgICogICAgTm90ZSB0aGF0IHRoZSBGcmVlVHlwZSBDYWNoZSBzdWItc3lzdGVtIGRvZXNuJ3QgcmVjb2duaXplIG1vZHVsZQogICAgKiAgICBwcm9wZXJ0eSBjaGFuZ2VzLiAgVG8gYXZvaWQgZ2x5cGggbG9va3VwIGNvbmZ1c2lvbiB3aXRoaW4gdGhlIGNhY2hlCi0gICAqICAgIHlvdSBzaG91bGQgY2FsbCBARlRDX01hbmFnZXJfUmVzZXQgdG8gY29tcGxldGVseSBmbHVzaCB0aGUgY2FjaGUgaWYKLSAgICogICAgYSBtb2R1bGUgcHJvcGVydHkgZ2V0cyBjaGFuZ2VkIGFmdGVyIEBGVENfTWFuYWdlcl9OZXcgaGFzIGJlZW4KLSAgICogICAgY2FsbGVkLgorICAgKiAgICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1Jlc2V0IHRvIGNvbXBsZXRlbHkgZmx1c2ggdGhlIGNhY2hlIGlmIGEKKyAgICogICAgbW9kdWxlIHByb3BlcnR5IGdldHMgY2hhbmdlZCBhZnRlciBARlRDX01hbmFnZXJfTmV3IGhhcyBiZWVuIGNhbGxlZC4KICAgICoKLSAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBGcmVlVHlwZSBDYWNoZQotICAgKiAgICBzdWItc3lzdGVtIGl0c2VsZiB3aXRoIEZUX1Byb3BlcnR5X1NldDsgdXNlIEBGVENfUHJvcGVydHlfU2V0Ci0gICAqICAgIGluc3RlYWQuCisgICAqICAgIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBzZXQgcHJvcGVydGllcyBvZiB0aGUgRnJlZVR5cGUgQ2FjaGUgc3ViLXN5c3RlbQorICAgKiAgICBpdHNlbGYgd2l0aCBGVF9Qcm9wZXJ0eV9TZXQ7IHVzZSBARlRDX1Byb3BlcnR5X1NldCBpbnN0ZWFkLgogICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAyLjQuMTEKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNC4xMQogICAgKgogICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCkBAIC0zNzMsNyArMzkyLDcgQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgICAgICB2YWx1ZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICAgRlRfUHJvcGVydHlfR2V0CkBAIC0zODMsMzIgKzQwMiwzMiBAQAogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgdGhlIG1vZHVsZSBpcyBwYXJ0IG9mLgorICAgKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHRoZSBtb2R1bGUgaXMgcGFydCBvZi4KICAgICoKICAgICogICAgbW9kdWxlX25hbWUgOjoKLSAgICogICAgICAgVGhlIG1vZHVsZSBuYW1lLgorICAgKiAgICAgIFRoZSBtb2R1bGUgbmFtZS4KICAgICoKICAgICogICAgcHJvcGVydHlfbmFtZSA6OgotICAgKiAgICAgICBUaGUgcHJvcGVydHkgbmFtZS4gIFByb3BlcnRpZXMgYXJlIGRlc2NyaWJlZCBpbiBzZWN0aW9uCi0gICAqICAgICAgIEBwcm9wZXJ0aWVzLgorICAgKiAgICAgIFRoZSBwcm9wZXJ0eSBuYW1lLiAgUHJvcGVydGllcyBhcmUgZGVzY3JpYmVkIGluIHNlY3Rpb24KKyAgICogICAgICBAcHJvcGVydGllcy4KICAgICoKICAgICogQGlub3V0OgogICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIGdlbmVyaWMgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSB0aGF0IGdpdmVzIHRoZQotICAgKiAgICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWUnIGlzCi0gICAqICAgICAgIGRlcGVuZGVudCBvbiB0aGUgcHJvcGVydHk7IHNlZSBzZWN0aW9uIEBwcm9wZXJ0aWVzLgorICAgKiAgICAgIEEgZ2VuZXJpYyBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0dXJlIHRoYXQgZ2l2ZXMgdGhlIHZhbHVlCisgICAqICAgICAgb2YgdGhlIHByb3BlcnR5LiAgVGhlIGV4YWN0IGRlZmluaXRpb24gb2YgYHZhbHVlYCBpcyBkZXBlbmRlbnQgb24KKyAgICogICAgICB0aGUgcHJvcGVydHk7IHNlZSBzZWN0aW9uIEBwcm9wZXJ0aWVzLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgICBJZiBgbW9kdWxlX25hbWUnIGlzbid0IGEgdmFsaWQgbW9kdWxlIG5hbWUsIG9yIGBwcm9wZXJ0eV9uYW1lJwotICAgKiAgICBkb2Vzbid0IHNwZWNpZnkgYSB2YWxpZCBwcm9wZXJ0eSwgb3IgaWYgYHZhbHVlJyBkb2Vzbid0IHJlcHJlc2VudCBhCisgICAqICAgIElmIGBtb2R1bGVfbmFtZWAgaXNuJ3QgYSB2YWxpZCBtb2R1bGUgbmFtZSwgb3IgYHByb3BlcnR5X25hbWVgCisgICAqICAgIGRvZXNuJ3Qgc3BlY2lmeSBhIHZhbGlkIHByb3BlcnR5LCBvciBpZiBgdmFsdWVgIGRvZXNuJ3QgcmVwcmVzZW50IGEKICAgICogICAgdmFsaWQgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSwgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCiAgICAqCi0gICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBnZXRzIHByb3BlcnR5IGBiYXonIChhIHJhbmdlKSBpbiBtb2R1bGUgYGZvbycuCisgICAqICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBnZXRzIHByb3BlcnR5ICdiYXonIChhIHJhbmdlKSBpbiBtb2R1bGUgJ2ZvbycuCiAgICAqCi0gICAqICAgIHsKKyAgICogICAgYGBgCiAgICAqICAgICAgdHlwZWRlZiAgcmFuZ2VfCiAgICAqICAgICAgewogICAgKiAgICAgICAgRlRfSW50MzIgIG1pbjsKQEAgLTQyMCwxMyArNDM5LDEzIEBACiAgICAqCiAgICAqCiAgICAqICAgICAgRlRfUHJvcGVydHlfR2V0KCBsaWJyYXJ5LCAiZm9vIiwgImJheiIsICZiYXogKTsKLSAgICogICAgfQorICAgKiAgICBgYGAKICAgICoKICAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgdGhlIEZyZWVUeXBlIENhY2hlCiAgICAqICAgIHN1Yi1zeXN0ZW0gd2l0aCBGVF9Qcm9wZXJ0eV9HZXQ7IHVzZSBARlRDX1Byb3BlcnR5X0dldCBpbnN0ZWFkLgogICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAyLjQuMTEKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNC4xMQogICAgKgogICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCkBAIC00MzYsMTg5ICs0NTUsMjQzIEBACiAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdmFsdWUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGNvbXBpbGF0aW9uIG9wdGlvbiBGVF9DT05GSUdfT1BUSU9OX0VOVklST05NRU5UX1BST1BFUlRJRVMgaXMgICAqLwotICAvKiAgICBzZXQsIHRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGBGUkVFVFlQRV9QUk9QRVJUSUVTJyBlbnZpcm9ubWVudCAgICAgKi8KLSAgLyogICAgdmFyaWFibGUgdG8gY29udHJvbCBkcml2ZXIgcHJvcGVydGllcy4gIFNlZSBzZWN0aW9uIEBwcm9wZXJ0aWVzICAgICovCi0gIC8qICAgIGZvciBtb3JlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGNvbXBpbGF0aW9uIG9wdGlvbiBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgRlJFRVRZUEVfUFJPUEVSVElFUycgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlICAgKi8KLSAgLyogICAgaW50byBtdWx0aXBsZSBsaW5lcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICA8b3B0aW9uYWwgd2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgPG1vZHVsZS1uYW1lMT4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIDxwcm9wZXJ0eS1uYW1lMT4gJz0nIDxwcm9wZXJ0eS12YWx1ZTE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICA8d2hpdGVzcGFjZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgPG1vZHVsZS1uYW1lMj4gJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIDxwcm9wZXJ0eS1uYW1lMj4gJz0nIDxwcm9wZXJ0eS12YWx1ZTI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGUkVFVFlQRV9QUk9QRVJUSUVTPXRydWV0eXBlOmludGVycHJldGVyLXZlcnNpb249MzUgXCAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBjZmY6bm8tc3RlbS1kYXJrZW5pbmc9MSBcICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZpdHRlcjp3YXJwaW5nPTEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi44ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIElmIGNvbXBpbGF0aW9uIG9wdGlvbiBgRlRfQ09ORklHX09QVElPTl9FTlZJUk9OTUVOVF9QUk9QRVJUSUVTYCBpcworICAgKiAgIHNldCwgdGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYEZSRUVUWVBFX1BST1BFUlRJRVNgIGVudmlyb25tZW50CisgICAqICAgdmFyaWFibGUgdG8gY29udHJvbCBkcml2ZXIgcHJvcGVydGllcy4gIFNlZSBzZWN0aW9uIEBwcm9wZXJ0aWVzIGZvcgorICAgKiAgIG1vcmUuCisgICAqCisgICAqICAgSWYgdGhlIGNvbXBpbGF0aW9uIG9wdGlvbiBpcyBub3Qgc2V0LCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZy4KKyAgICoKKyAgICogICBgRlJFRVRZUEVfUFJPUEVSVElFU2AgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlIGludG8KKyAgICogICBtdWx0aXBsZSBsaW5lcyBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5KS4KKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIDxvcHRpb25hbCB3aGl0ZXNwYWNlPgorICAgKiAgICAgPG1vZHVsZS1uYW1lMT4gJzonCisgICAqICAgICA8cHJvcGVydHktbmFtZTE+ICc9JyA8cHJvcGVydHktdmFsdWUxPgorICAgKiAgICAgPHdoaXRlc3BhY2U+CisgICAqICAgICA8bW9kdWxlLW5hbWUyPiAnOicKKyAgICogICAgIDxwcm9wZXJ0eS1uYW1lMj4gJz0nIDxwcm9wZXJ0eS12YWx1ZTI+CisgICAqICAgICAuLi4KKyAgICogICBgYGAKKyAgICoKKyAgICogICBFeGFtcGxlOgorICAgKgorICAgKiAgIGBgYAorICAgKiAgICAgRlJFRVRZUEVfUFJPUEVSVElFUz10cnVldHlwZTppbnRlcnByZXRlci12ZXJzaW9uPTM1IFwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgY2ZmOm5vLXN0ZW0tZGFya2VuaW5nPTAgXAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZml0dGVyOndhcnBpbmc9MQorICAgKiAgIGBgYAorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjgKKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY291bnRlciBnZXRzIGluaXRpYWxpemVkIHRvfjEgYXQgdGhlIHRpbWUgYW4gQEZUX0xpYnJhcnkgICAgICAgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY291bnRlci4gICAgICAgKi8KLSAgLyogICAgQEZUX0RvbmVfTGlicmFyeSB0aGVuIG9ubHkgZGVzdHJveXMgYSBsaWJyYXJ5IGlmIHRoZSBjb3VudGVyIGlzfjEsICovCi0gIC8qICAgIG90aGVyd2lzZSBpdCBzaW1wbHkgZGVjcmVtZW50cyB0aGUgY291bnRlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBoZWxwcyBpbiBtYW5hZ2luZyBsaWZlLWN5Y2xlcyBvZiBzdHJ1Y3R1cmVzIHRoYXQgICAgICovCi0gIC8qICAgIHJlZmVyZW5jZSBARlRfTGlicmFyeSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuNC4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9SZWZlcmVuY2VfTGlicmFyeQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBjb3VudGVyIGdldHMgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfTGlicmFyeSBzdHJ1Y3R1cmUKKyAgICogICBpcyBjcmVhdGVkLiAgVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBjb3VudGVyLiAgQEZUX0RvbmVfTGlicmFyeQorICAgKiAgIHRoZW4gb25seSBkZXN0cm95cyBhIGxpYnJhcnkgaWYgdGhlIGNvdW50ZXIgaXN+MSwgb3RoZXJ3aXNlIGl0IHNpbXBseQorICAgKiAgIGRlY3JlbWVudHMgdGhlIGNvdW50ZXIuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBoZWxwcyBpbiBtYW5hZ2luZyBsaWZlLWN5Y2xlcyBvZiBzdHJ1Y3R1cmVzIHRoYXQKKyAgICogICByZWZlcmVuY2UgQEZUX0xpYnJhcnkgb2JqZWN0cy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjQuMgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX1JlZmVyZW5jZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgICAgKi8KLSAgLyogICAgZnJvbSBhIGdpdmVuIG1lbW9yeSBvYmplY3QuICBJdCBpcyB0aHVzIHBvc3NpYmxlIHRvIHVzZSBsaWJyYXJpZXMgICovCi0gIC8qICAgIHdpdGggZGlzdGluY3QgbWVtb3J5IGFsbG9jYXRvcnMgd2l0aGluIHRoZSBzYW1lIHByb2dyYW0uICBOb3RlLCAgICAqLwotICAvKiAgICBob3dldmVyLCB0aGF0IHRoZSB1c2VkIEBGVF9NZW1vcnkgc3RydWN0dXJlIGlzIGV4cGVjdGVkIHRvIHJlbWFpbiAgKi8KLSAgLyogICAgdmFsaWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBARlRfTGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWxseSwgeW91IHdvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiAoZm9sbG93ZWQgYnkgYSBjYWxsIHRvICAgICAgKi8KLSAgLyogICAgQEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgb3IgYSBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX0FkZF9Nb2R1bGUsICAgICovCi0gIC8qICAgIGFuZCBhIGNhbGwgdG8gQEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMpIGluc3RlYWQgb2YgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfSW5pdF9GcmVlVHlwZSB0byBpbml0aWFsaXplIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvbid0IHVzZSBARlRfRG9uZV9GcmVlVHlwZSBidXQgQEZUX0RvbmVfTGlicmFyeSB0byBkZXN0cm95IGEgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICA6OiBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlicmFyeSA6OiBBIHBvaW50ZXIgdG8gaGFuZGxlIG9mIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgKi8KLSAgLyogICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19MaWJyYXJ5CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgZnJvbSBhCisgICAqICAgZ2l2ZW4gbWVtb3J5IG9iamVjdC4gIEl0IGlzIHRodXMgcG9zc2libGUgdG8gdXNlIGxpYnJhcmllcyB3aXRoCisgICAqICAgZGlzdGluY3QgbWVtb3J5IGFsbG9jYXRvcnMgd2l0aGluIHRoZSBzYW1lIHByb2dyYW0uICBOb3RlLCBob3dldmVyLAorICAgKiAgIHRoYXQgdGhlIHVzZWQgQEZUX01lbW9yeSBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gcmVtYWluIHZhbGlkIGZvciB0aGUKKyAgICogICBsaWZlIG9mIHRoZSBARlRfTGlicmFyeSBvYmplY3QuCisgICAqCisgICAqICAgTm9ybWFsbHksIHlvdSB3b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gKGZvbGxvd2VkIGJ5IGEgY2FsbCB0bworICAgKiAgIEBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzIG9yIGEgc2VyaWVzIG9mIGNhbGxzIHRvIEBGVF9BZGRfTW9kdWxlLCBhbmQgYQorICAgKiAgIGNhbGwgdG8gQEZUX1NldF9EZWZhdWx0X1Byb3BlcnRpZXMpIGluc3RlYWQgb2YgQEZUX0luaXRfRnJlZVR5cGUgdG8KKyAgICogICBpbml0aWFsaXplIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LgorICAgKgorICAgKiAgIERvbid0IHVzZSBARlRfRG9uZV9GcmVlVHlwZSBidXQgQEZUX0RvbmVfTGlicmFyeSB0byBkZXN0cm95IGEgbGlicmFyeQorICAgKiAgIGluc3RhbmNlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgb3JpZ2luYWwgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhbGlicmFyeSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGhhbmRsZSBvZiBhIG5ldyBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgKiAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9OZXdfTGlicmFyeSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICphbGlicmFyeSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZCBhIGdpdmVuIGxpYnJhcnkgb2JqZWN0LiAgVGhpcyBjbG9zZXMgYWxsIGRyaXZlcnMgYW5kICAgICAgICovCi0gIC8qICAgIGRpc2NhcmRzIGFsbCByZXNvdXJjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0xpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfRG9uZV9MaWJyYXJ5CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEaXNjYXJkIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICBUaGlzIGNsb3NlcyBhbGwgZHJpdmVycyBhbmQgZGlzY2FyZHMKKyAgICogICBhbGwgcmVzb3VyY2Ugb2JqZWN0cy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgcmVmZXJlbmNlIGNvdW50ZXJzIGluIHRoZSBkZXNjcmlwdGlvbiBvZgorICAgKiAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9Eb25lX0xpYnJhcnkoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKIAotICAvKiAqLwogCi0gIHR5cGVkZWYgdm9pZAorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0RlYnVnSG9va19GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGRyb3AtaW4gcmVwbGFjZW1lbnQgKG9yIHJhdGhlciBhIHdyYXBwZXIpIGZvciB0aGUgYnl0ZWNvZGUgb3IKKyAgICogICBjaGFyc3RyaW5nIGludGVycHJldGVyJ3MgbWFpbiBsb29wIGZ1bmN0aW9uLgorICAgKgorICAgKiAgIEl0cyBqb2IgaXMgZXNzZW50aWFsbHkKKyAgICoKKyAgICogICAtIHRvIGFjdGl2YXRlIGRlYnVnIG1vZGUgdG8gZW5mb3JjZSBzaW5nbGUtc3RlcHBpbmcsCisgICAqCisgICAqICAgLSB0byBjYWxsIHRoZSBtYWluIGxvb3AgZnVuY3Rpb24gdG8gaW50ZXJwcmV0IHRoZSBuZXh0IG9wY29kZSwgYW5kCisgICAqCisgICAqICAgLSB0byBzaG93IHRoZSBjaGFuZ2VkIGNvbnRleHQgdG8gdGhlIHVzZXIuCisgICAqCisgICAqICAgQW4gZXhhbXBsZSBmb3Igc3VjaCBhIG1haW4gbG9vcCBmdW5jdGlvbiBpcyBgVFRfUnVuSW5zYCAoZGVjbGFyZWQgaW4KKyAgICogICBGcmVlVHlwZSdzIGludGVybmFsIGhlYWRlciBmaWxlIGBzcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuaGApLgorICAgKgorICAgKiAgIEhhdmUgYSBsb29rIGF0IHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgYHR0ZGVidWdgIEZyZWVUeXBlIGRlbW8gcHJvZ3JhbQorICAgKiAgIGZvciBhbiBleGFtcGxlIG9mIGEgZHJvcC1pbiByZXBsYWNlbWVudC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGFyZyA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyLCB0byBiZSBjYXN0IHRvIHRoZSBtYWluIGxvb3AgZnVuY3Rpb24ncyBkYXRhCisgICAqICAgICBzdHJ1Y3R1cmUgKHdoaWNoIGRlcGVuZHMgb24gdGhlIGZvbnQgbW9kdWxlKS4gIEZvciBUcnVlVHlwZSBmb250cworICAgKiAgICAgaXQgaXMgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIncyBleGVjdXRpb24gY29udGV4dCwgYFRUX0V4ZWNDb250ZXh0YCwKKyAgICogICAgIHdoaWNoIGlzIGRlY2xhcmVkIGluIEZyZWVUeXBlJ3MgaW50ZXJuYWwgaGVhZGVyIGZpbGUgYHR0dHlwZXMuaGAuCisgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCiAgICgqRlRfRGVidWdIb29rX0Z1bmMpKCB2b2lkKiAgYXJnICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgYSBkZWJ1ZyBob29rIGZ1bmN0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyIG9mIGEgZm9udCAgKi8KLSAgLyogICAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9va19pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGRlYnVnIGhvb2suICBZb3Ugc2hvdWxkIHVzZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIGRlZmluZWQgaW4gYGZ0b2Jqcy5oJywgZS5nLiwgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2sgOjogVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGVidWcgdGhlIGludGVycHJldGVyLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRseSwgZm91ciBkZWJ1ZyBob29rIHNsb3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBvbmx5IHR3byAoZm9yICAqLwotICAvKiAgICB0aGUgVHJ1ZVR5cGUgYW5kIHRoZSBUeXBlfjEgaW50ZXJwcmV0ZXIpIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIHRoZSBpbnRlcm5hbCBoZWFkZXJzIG9mIEZyZWVUeXBlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkLCAgICAqLwotICAvKiAgICB0aGUgc3ltYm9sIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJyBpc24ndCBhdmFpbGFibGUgcHVibGljbHkuICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhIGJ1ZyBhbmQgd2lsbCBiZSBmaXhlZCBpbiBhIGZvcnRoY29taW5nIHJlbGVhc2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfREVCVUdfSE9PS19YWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgbGlzdCBvZiBuYW1lZCBkZWJ1ZyBob29rIGluZGljZXMuCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfREVCVUdfSE9PS19UUlVFVFlQRTo6CisgICAqICAgICBUaGlzIGhvb2sgaW5kZXggaWRlbnRpZmllcyB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZGVidWdnZXIuCisgICAqLworI2RlZmluZSBGVF9ERUJVR19IT09LX1RSVUVUWVBFICAwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NldF9EZWJ1Z19Ib29rCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZXQgYSBkZWJ1ZyBob29rIGZ1bmN0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyIG9mIGEgZm9udAorICAgKiAgIGZvcm1hdC4KKyAgICoKKyAgICogICBXaGlsZSB0aGlzIGlzIGEgcHVibGljIEFQSSBmdW5jdGlvbiwgYW4gYXBwbGljYXRpb24gbmVlZHMgYWNjZXNzIHRvCisgICAqICAgRnJlZVR5cGUncyBpbnRlcm5hbCBoZWFkZXIgZmlsZXMgdG8gZG8gc29tZXRoaW5nIHVzZWZ1bC4KKyAgICoKKyAgICogICBIYXZlIGEgbG9vayBhdCB0aGUgc291cmNlIGNvZGUgb2YgdGhlIGB0dGRlYnVnYCBGcmVlVHlwZSBkZW1vIHByb2dyYW0KKyAgICogICBmb3IgYW4gZXhhbXBsZSBvZiBpdHMgdXNhZ2UuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBob29rX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGRlYnVnIGhvb2suICBZb3Ugc2hvdWxkIHVzZSBkZWZpbmVkIGVudW1lcmF0aW9uCisgICAqICAgICBtYWNyb3MgbGlrZSBARlRfREVCVUdfSE9PS19UUlVFVFlQRS4KKyAgICoKKyAgICogICBkZWJ1Z19ob29rIDo6CisgICAqICAgICBUaGUgZnVuY3Rpb24gdXNlZCB0byBkZWJ1ZyB0aGUgaW50ZXJwcmV0ZXIuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEN1cnJlbnRseSwgZm91ciBkZWJ1ZyBob29rIHNsb3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBvbmx5IG9uZSAoZm9yIHRoZQorICAgKiAgIFRydWVUeXBlIGludGVycHJldGVyKSBpcyBkZWZpbmVkLgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRfU2V0X0RlYnVnX0hvb2soIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGhvb2tfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9vayApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWRkIHRoZSBzZXQgb2YgZGVmYXVsdCBkcml2ZXJzIHRvIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgb25seSB1c2VmdWwgd2hlbiB5b3UgY3JlYXRlIGEgbGlicmFyeSBvYmplY3Qgd2l0aCAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0xpYnJhcnkgKHVzdWFsbHkgdG8gcGx1ZyBhIGN1c3RvbSBtZW1vcnkgbWFuYWdlcikuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQWRkIHRoZSBzZXQgb2YgZGVmYXVsdCBkcml2ZXJzIHRvIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICBUaGlzIGlzCisgICAqICAgb25seSB1c2VmdWwgd2hlbiB5b3UgY3JlYXRlIGEgbGlicmFyeSBvYmplY3Qgd2l0aCBARlRfTmV3X0xpYnJhcnkKKyAgICogICAodXN1YWxseSB0byBwbHVnIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyKS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbmV3IGxpYnJhcnkgb2JqZWN0LgorICAgKi8KICAgRlRfRVhQT1JUKCB2b2lkICkKICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwogCkBAIC02NDQsMjggKzcxNywyOCBAQAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgotICAgKiAgQGVudW06Ci0gICAqICAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUKKyAgICogQGVudW06CisgICAqICAgIEZUX1RydWVUeXBlRW5naW5lVHlwZQogICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgQSBsaXN0IG9mIHZhbHVlcyBkZXNjcmliaW5nIHdoaWNoIGtpbmQgb2YgVHJ1ZVR5cGUgYnl0ZWNvZGUKLSAgICogICAgIGVuZ2luZSBpcyBpbXBsZW1lbnRlZCBpbiBhIGdpdmVuIEZUX0xpYnJhcnkgaW5zdGFuY2UuICBJdCBpcyB1c2VkCi0gICAqICAgICBieSB0aGUgQEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSBmdW5jdGlvbi4KKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBBIGxpc3Qgb2YgdmFsdWVzIGRlc2NyaWJpbmcgd2hpY2gga2luZCBvZiBUcnVlVHlwZSBieXRlY29kZSBlbmdpbmUgaXMKKyAgICogICAgaW1wbGVtZW50ZWQgaW4gYSBnaXZlbiBGVF9MaWJyYXJ5IGluc3RhbmNlLiAgSXQgaXMgdXNlZCBieSB0aGUKKyAgICogICAgQEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSBmdW5jdGlvbi4KICAgICoKLSAgICogIEB2YWx1ZXM6Ci0gICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9OT05FIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgaW1wbGVtZW50IGFueSBraW5kIG9mIGJ5dGVjb2RlIGludGVycHJldGVyLgorICAgKiBAdmFsdWVzOgorICAgKiAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9OT05FIDo6CisgICAqICAgICAgVGhlIGxpYnJhcnkgZG9lc24ndCBpbXBsZW1lbnQgYW55IGtpbmQgb2YgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCiAgICAqCi0gICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9VTlBBVEVOVEVEIDo6Ci0gICAqICAgICAgIERlcHJlY2F0ZWQgYW5kIHJlbW92ZWQuCisgICAqICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1VOUEFURU5URUQgOjoKKyAgICogICAgICBEZXByZWNhdGVkIGFuZCByZW1vdmVkLgogICAgKgotICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfUEFURU5URUQgOjoKLSAgICogICAgICAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBhIGJ5dGVjb2RlIGludGVycHJldGVyIHRoYXQgY292ZXJzCi0gICAqICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIHNldCBvZiB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lICh0aGlzCi0gICAqICAgICAgIHdhcyBnb3Zlcm5lZCBieSBwYXRlbnRzIHVudGlsIE1heSAyMDEwLCBoZW5jZSB0aGUgbmFtZSkuCisgICAqICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX1BBVEVOVEVEIDo6CisgICAqICAgICAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBhIGJ5dGVjb2RlIGludGVycHJldGVyIHRoYXQgY292ZXJzIHRoZSBmdWxsCisgICAqICAgICAgaW5zdHJ1Y3Rpb24gc2V0IG9mIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgKHRoaXMgd2FzIGdvdmVybmVkCisgICAqICAgICAgYnkgcGF0ZW50cyB1bnRpbCBNYXkgMjAxMCwgaGVuY2UgdGhlIG5hbWUpLgogICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAgMi4yCisgICAqIEBzaW5jZToKKyAgICogICAgMi4yCiAgICAqCiAgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX1RydWVUeXBlRW5naW5lVHlwZV8KQEAgLTY3OSwyMiArNzUyLDIyIEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqICBAZnVuYzoKLSAgICogICAgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQogICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgUmV0dXJuIGFuIEBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgdmFsdWUgdG8gaW5kaWNhdGUgd2hpY2ggbGV2ZWwgb2YKLSAgICogICAgIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlIHN1cHBvcnRzLgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHVybiBhbiBARlRfVHJ1ZVR5cGVFbmdpbmVUeXBlIHZhbHVlIHRvIGluZGljYXRlIHdoaWNoIGxldmVsIG9mIHRoZQorICAgKiAgICBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlIHN1cHBvcnRzLgogICAgKgotICAgKiAgQGlucHV0OgotICAgKiAgICAgbGlicmFyeSA6OgotICAgKiAgICAgICBBIGxpYnJhcnkgaW5zdGFuY2UuCisgICAqIEBpbnB1dDoKKyAgICogICAgbGlicmFyeSA6OgorICAgKiAgICAgIEEgbGlicmFyeSBpbnN0YW5jZS4KICAgICoKLSAgICogIEByZXR1cm46Ci0gICAqICAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hpY2ggbGV2ZWwgaXMgc3VwcG9ydGVkLgorICAgKiBAcmV0dXJuOgorICAgKiAgICBBIHZhbHVlIGluZGljYXRpbmcgd2hpY2ggbGV2ZWwgaXMgc3VwcG9ydGVkLgogICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAgMi4yCisgICAqIEBzaW5jZToKKyAgICogICAgMi4yCiAgICAqCiAgICAqLwogICBGVF9FWFBPUlQoIEZUX1RydWVUeXBlRW5naW5lVHlwZSApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmgKaW5kZXggZTBmYzEzMS4uZjA1ZmM1MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RlcnIuaApAQCAtMSw5NCArMSwxMDMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kZXJyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGUgZXJyb3Igb2Zmc2V0cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bW9kZXJyLmgKKyAqCisgKiAgIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBvZmZzZXRzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBjb2Rlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGluIGBmdG9wdGlvbi5oJyBpcyAgICAqLwotICAvKiBzZXQsIHRoZSBsb3dlciBieXRlIG9mIGFuIGVycm9yIHZhbHVlIGlkZW50aWZpZXMgdGhlIGVycm9yIGNvZGUgYXMgICAgKi8KLSAgLyogdXN1YWwuICBJbiBhZGRpdGlvbiwgdGhlIGhpZ2hlciBieXRlIGlkZW50aWZpZXMgdGhlIG1vZHVsZS4gIEZvciAgICAgICovCi0gIC8qIGV4YW1wbGUsIHRoZSBlcnJvciBgRlRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDAwMDMsIHRoZSAqLwotICAvKiBlcnJvciBgVFRfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDEzMDMsIHRoZSBlcnJvciAgICAgICAgKi8KLSAgLyogYFQxX0Vycl9JbnZhbGlkX0ZpbGVfRm9ybWF0JyBoYXMgdmFsdWUgMHgxNDAzLCBldGMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgYEZUX0Vycl9PaycsIGBUVF9FcnJfT2snLCBldGMuIGFyZSBhbHdheXMgZXF1YWwgdG8gemVybywgICAgKi8KLSAgLyogaW5jbHVkaW5nIHRoZSBoaWdoIGJ5dGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGlzbid0IHNldCwgdGhlIGhpZ2hlciBieXRlIG9mICAgKi8KLSAgLyogYW4gZXJyb3IgdmFsdWUgaXMgc2V0IHRvIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUbyBoaWRlIHRoZSB2YXJpb3VzIGBYWFhfRXJyXycgcHJlZml4ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLCBGcmVlVHlwZSAgKi8KLSAgLyogcHJvdmlkZXMgc29tZSBtYWNyb3MgaW4gYGZ0dHlwZXMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUiggZXJyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEFkZCBjdXJyZW50IGVycm9yIG1vZHVsZSBwcmVmaXggKGFzIGRlZmluZWQgd2l0aCB0aGUgICAgICAgICAgICAgICovCi0gIC8qICAgICBgRlRfRVJSX1BSRUZJWCcgbWFjcm8pIHRvIGBlcnInLiAgRm9yIGV4YW1wbGUsIGluIHRoZSBCREYgbW9kdWxlICAqLwotICAvKiAgICAgdGhlIGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX091dGxpbmUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGV4cGFuZHMgdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBlcnJvciA9IEJERl9FcnJfSW52YWxpZF9PdXRsaW5lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGb3Igc2ltcGxpY2l0eSwgeW91IGNhbiBhbHdheXMgdXNlIGBGVF9FcnJfT2snIGRpcmVjdGx5IGluc3RlYWQgICAqLwotICAvKiAgICAgb2YgYEZUX0VSUiggT2sgKScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSX0VRKCBlcnJjb2RlLCBlcnIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUl9ORVEoIGVycmNvZGUsIGVyciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIENvbXBhcmUgZXJyb3IgY29kZSBgZXJyY29kZScgd2l0aCB0aGUgZXJyb3IgYGVycicgZm9yIGVxdWFsaXR5ICAgICovCi0gIC8qICAgICBhbmQgaW5lcXVhbGl0eSwgcmVzcGVjdGl2ZWx5LiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBJbnZhbGlkX091dGxpbmUgKSApICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFVzaW5nIHRoaXMgbWFjcm8geW91IGRvbid0IGhhdmUgdG8gdGhpbmsgYWJvdXQgZXJyb3IgcHJlZml4ZXMuICAgICovCi0gIC8qICAgICBPZiBjb3Vyc2UsIGlmIG1vZHVsZSBlcnJvcnMgYXJlIG5vdCBhY3RpdmUsIHRoZSBhYm92ZSBleGFtcGxlIGlzICAqLwotICAvKiAgICAgdGhlIHNhbWUgYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlmICggZXJyb3IgPT0gRlRfRXJyX0ludmFsaWRfT3V0bGluZSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfQkFTRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VSUk9SX01PRFVMRSggZXJyY29kZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEdldCBiYXNlIGVycm9yIGFuZCBtb2R1bGUgZXJyb3IgY29kZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgY2FuIGFsc28gYmUgdXNlZCB0byBjcmVhdGUgYSBtb2R1bGUgZXJyb3IgbWVzc2FnZSB0YWJsZSBlYXNpbHkgICAgICovCi0gIC8qIHdpdGggc29tZXRoaW5nIGxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjdW5kZWYgRlRNT0RFUlJfSF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJERUYoIGUsIHYsIHMgKSAgeyBGVF9Nb2RfRXJyXyAjIyBlLCBzIH0sICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX01PREVSUl9FTkRfTElTVCAgICAgICB7IDAsIDAgfSB9OyAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpbnQgICAgICAgICAgbW9kX2Vycl9vZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3QgY2hhciogIG1vZF9lcnJfbXNnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9IGZ0X21vZF9lcnJvcnNbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEZyZWVUeXBlIG1vZHVsZSBlcnJvciBjb2Rlcy4KKyAgICoKKyAgICogSWYgdGhlIG1hY3JvIGBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTYCBpbiBgZnRvcHRpb24uaGAgaXMKKyAgICogc2V0LCB0aGUgbG93ZXIgYnl0ZSBvZiBhbiBlcnJvciB2YWx1ZSBpZGVudGlmaWVzIHRoZSBlcnJvciBjb2RlIGFzCisgICAqIHVzdWFsLiAgSW4gYWRkaXRpb24sIHRoZSBoaWdoZXIgYnl0ZSBpZGVudGlmaWVzIHRoZSBtb2R1bGUuICBGb3IKKyAgICogZXhhbXBsZSwgdGhlIGVycm9yIGBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdGAgaGFzIHZhbHVlIDB4MDAwMywgdGhlCisgICAqIGVycm9yIGBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdGAgaGFzIHZhbHVlIDB4MTMwMywgdGhlIGVycm9yCisgICAqIGBUMV9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdGAgaGFzIHZhbHVlIDB4MTQwMywgZXRjLgorICAgKgorICAgKiBOb3RlIHRoYXQgYEZUX0Vycl9Pa2AsIGBUVF9FcnJfT2tgLCBldGMuIGFyZSBhbHdheXMgZXF1YWwgdG8gemVybywKKyAgICogaW5jbHVkaW5nIHRoZSBoaWdoIGJ5dGUuCisgICAqCisgICAqIElmIGBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTYCBpc24ndCBzZXQsIHRoZSBoaWdoZXIgYnl0ZSBvZiBhbgorICAgKiBlcnJvciB2YWx1ZSBpcyBzZXQgdG8gemVyby4KKyAgICoKKyAgICogVG8gaGlkZSB0aGUgdmFyaW91cyBgWFhYX0Vycl9gIHByZWZpeGVzIGluIHRoZSBzb3VyY2UgY29kZSwgRnJlZVR5cGUKKyAgICogcHJvdmlkZXMgc29tZSBtYWNyb3MgaW4gYGZ0dHlwZXMuaGAuCisgICAqCisgICAqICAgRlRfRVJSKCBlcnIgKQorICAgKgorICAgKiAgICAgQWRkIGN1cnJlbnQgZXJyb3IgbW9kdWxlIHByZWZpeCAoYXMgZGVmaW5lZCB3aXRoIHRoZSBgRlRfRVJSX1BSRUZJWGAKKyAgICogICAgIG1hY3JvKSB0byBgZXJyYC4gIEZvciBleGFtcGxlLCBpbiB0aGUgQkRGIG1vZHVsZSB0aGUgbGluZQorICAgKgorICAgKiAgICAgYGBgCisgICAqICAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX091dGxpbmUgKTsKKyAgICogICAgIGBgYAorICAgKgorICAgKiAgICAgZXhwYW5kcyB0bworICAgKgorICAgKiAgICAgYGBgCisgICAqICAgICAgIGVycm9yID0gQkRGX0Vycl9JbnZhbGlkX091dGxpbmU7CisgICAqICAgICBgYGAKKyAgICoKKyAgICogICAgIEZvciBzaW1wbGljaXR5LCB5b3UgY2FuIGFsd2F5cyB1c2UgYEZUX0Vycl9Pa2AgZGlyZWN0bHkgaW5zdGVhZCBvZgorICAgKiAgICAgYEZUX0VSUiggT2sgKWAuCisgICAqCisgICAqICAgRlRfRVJSX0VRKCBlcnJjb2RlLCBlcnIgKQorICAgKiAgIEZUX0VSUl9ORVEoIGVycmNvZGUsIGVyciApCisgICAqCisgICAqICAgICBDb21wYXJlIGVycm9yIGNvZGUgYGVycmNvZGVgIHdpdGggdGhlIGVycm9yIGBlcnJgIGZvciBlcXVhbGl0eSBhbmQKKyAgICogICAgIGluZXF1YWxpdHksIHJlc3BlY3RpdmVseS4gIEV4YW1wbGU6CisgICAqCisgICAqICAgICBgYGAKKyAgICogICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBJbnZhbGlkX091dGxpbmUgKSApCisgICAqICAgICAgICAgLi4uCisgICAqICAgICBgYGAKKyAgICoKKyAgICogICAgIFVzaW5nIHRoaXMgbWFjcm8geW91IGRvbid0IGhhdmUgdG8gdGhpbmsgYWJvdXQgZXJyb3IgcHJlZml4ZXMuICBPZgorICAgKiAgICAgY291cnNlLCBpZiBtb2R1bGUgZXJyb3JzIGFyZSBub3QgYWN0aXZlLCB0aGUgYWJvdmUgZXhhbXBsZSBpcyB0aGUKKyAgICogICAgIHNhbWUgYXMKKyAgICoKKyAgICogICAgIGBgYAorICAgKiAgICAgICBpZiAoIGVycm9yID09IEZUX0Vycl9JbnZhbGlkX091dGxpbmUgKQorICAgKiAgICAgICAgIC4uLgorICAgKiAgICAgYGBgCisgICAqCisgICAqICAgRlRfRVJST1JfQkFTRSggZXJyY29kZSApCisgICAqICAgRlRfRVJST1JfTU9EVUxFKCBlcnJjb2RlICkKKyAgICoKKyAgICogICAgIEdldCBiYXNlIGVycm9yIGFuZCBtb2R1bGUgZXJyb3IgY29kZSwgcmVzcGVjdGl2ZWx5LgorICAgKgorICAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZHVsZSBlcnJvciBtZXNzYWdlIHRhYmxlIGVhc2lseSB3aXRoCisgICAqIHNvbWV0aGluZyBsaWtlCisgICAqCisgICAqIGBgYAorICAgKiAgICN1bmRlZiBGVE1PREVSUl9IXworICAgKiAgICNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIHsgRlRfTW9kX0Vycl8gIyMgZSwgcyB9LAorICAgKiAgICNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgICAgIHsKKyAgICogICAjZGVmaW5lIEZUX01PREVSUl9FTkRfTElTVCAgICAgICB7IDAsIDAgfSB9OworICAgKgorICAgKiAgIGNvbnN0IHN0cnVjdAorICAgKiAgIHsKKyAgICogICAgIGludCAgICAgICAgICBtb2RfZXJyX29mZnNldDsKKyAgICogICAgIGNvbnN0IGNoYXIqICBtb2RfZXJyX21zZworICAgKiAgIH0gZnRfbW9kX2Vycm9yc1tdID0KKyAgICoKKyAgICogICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KKyAgICogYGBgCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRNT0RFUlJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgKaW5kZXggMjY3MzFjMi4uOWMwMGFkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgKQEAgLTEsMzcgKzEsMzYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3R2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgT3BlblR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0b3R2YWwuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIE9wZW5UeXBlIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXYXJuaW5nOiBUaGlzIG1vZHVsZSBtaWdodCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IGluIHRoZSAgICAgICAqLwotLyogICAgICAgICAgZnV0dXJlIHRvIGF2b2lkIGEgdGlnaHQgZGVwZW5kZW5jeSBiZXR3ZWVuIEZyZWVUeXBlIGFuZCB0aGUgICAgKi8KLS8qICAgICAgICAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBXYXJuaW5nOiBUaGlzIG1vZHVsZSBtaWdodCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IGluIHRoZQorICogICAgICAgICAgZnV0dXJlIHRvIGF2b2lkIGEgdGlnaHQgZGVwZW5kZW5jeSBiZXR3ZWVuIEZyZWVUeXBlIGFuZCB0aGUKKyAqICAgICAgICAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uCisgKgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRPVFZBTF9IXwogI2RlZmluZSBGVE9UVkFMX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtNDMsNjIgKzQyLDYyIEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG90X3ZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9wZW5UeXBlIFZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFQSSB0byB2YWxpZGF0ZSBPcGVuVHlwZSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlICAgICAqLwotICAvKiAgICBzb21lIE9wZW5UeXBlIHRhYmxlcyAoQkFTRSwgR0RFRiwgR1BPUywgR1NVQiwgSlNURiwgTUFUSCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3BlblR5cGVfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9PVFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgb3RfdmFsaWRhdGlvbgorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgT3BlblR5cGUgVmFsaWRhdGlvbgorICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgQW4gQVBJIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlIHNvbWUKKyAgICogICBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgorICAgKgorICAgKiBAb3JkZXI6CisgICAqICAgRlRfT3BlblR5cGVfVmFsaWRhdGUKKyAgICogICBGVF9PcGVuVHlwZV9GcmVlCisgICAqCisgICAqICAgRlRfVkFMSURBVEVfT1RYWFgKKyAgICoKKyAgICovCiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgICBGVF9WQUxJREFURV9PVFhYWAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfT3BlblR5cGVfVmFsaWRhdGUgdG8KLSAgKiAgICBpbmRpY2F0ZSB3aGljaCBPcGVuVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfQkFTRSA6OgotICAqICAgICAgVmFsaWRhdGUgQkFTRSB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dERUYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEdERUYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HUE9TIDo6Ci0gICogICAgICBWYWxpZGF0ZSBHUE9TIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1NVQiA6OgotICAqICAgICAgVmFsaWRhdGUgR1NVQiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0pTVEYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEpTVEYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9NQVRIIDo6Ci0gICogICAgICBWYWxpZGF0ZSBNQVRIIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfT1QgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGFsbCBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgotICAqCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICAgRlRfVkFMSURBVEVfT1RYWFgKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX09wZW5UeXBlX1ZhbGlkYXRlIHRvCisgICAqICAgIGluZGljYXRlIHdoaWNoIE9wZW5UeXBlIHRhYmxlcyBzaG91bGQgYmUgdmFsaWRhdGVkLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgICBGVF9WQUxJREFURV9CQVNFIDo6CisgICAqICAgICAgVmFsaWRhdGUgQkFTRSB0YWJsZS4KKyAgICoKKyAgICogICAgRlRfVkFMSURBVEVfR0RFRiA6OgorICAgKiAgICAgIFZhbGlkYXRlIEdERUYgdGFibGUuCisgICAqCisgICAqICAgIEZUX1ZBTElEQVRFX0dQT1MgOjoKKyAgICogICAgICBWYWxpZGF0ZSBHUE9TIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9HU1VCIDo6CisgICAqICAgICAgVmFsaWRhdGUgR1NVQiB0YWJsZS4KKyAgICoKKyAgICogICAgRlRfVkFMSURBVEVfSlNURiA6OgorICAgKiAgICAgIFZhbGlkYXRlIEpTVEYgdGFibGUuCisgICAqCisgICAqICAgIEZUX1ZBTElEQVRFX01BVEggOjoKKyAgICogICAgICBWYWxpZGF0ZSBNQVRIIHRhYmxlLgorICAgKgorICAgKiAgICBGVF9WQUxJREFURV9PVCA6OgorICAgKiAgICAgIFZhbGlkYXRlIGFsbCBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgorICAgKgorICAgKi8KICNkZWZpbmUgRlRfVkFMSURBVEVfQkFTRSAgMHgwMTAwCiAjZGVmaW5lIEZUX1ZBTElEQVRFX0dERUYgIDB4MDIwMAogI2RlZmluZSBGVF9WQUxJREFURV9HUE9TICAweDA0MDAKQEAgLTExMyw1MyArMTEyLDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0pTVEYgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX01BVEggKQogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgT3BlblR5cGUgdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAotICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIEJBU0VfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBHREVGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgR1BPU190YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEdTVUJfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBKU1RGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKLSAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKLSAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCi0gICogICB2YWxpZGF0aW9uLgotICAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX09wZW5UeXBlX1ZhbGlkYXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgVmFsaWRhdGUgdmFyaW91cyBPcGVuVHlwZSB0YWJsZXMgdG8gYXNzdXJlIHRoYXQgYWxsIG9mZnNldHMgYW5kCisgICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKKyAgICogICAgYWN0dWFsbHkgZG9lcyB0aGUgdGV4dCBsYXlvdXQgY2FuIGFjY2VzcyB0aG9zZSB0YWJsZXMgd2l0aG91dCBlcnJvcgorICAgKiAgICBjaGVja2luZyAod2hpY2ggY2FuIGJlIHF1aXRlIHRpbWUgY29uc3VtaW5nKS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqICAgIHZhbGlkYXRpb25fZmxhZ3MgOjoKKyAgICogICAgICBBIGJpdCBmaWVsZCB0aGF0IHNwZWNpZmllcyB0aGUgdGFibGVzIHRvIGJlIHZhbGlkYXRlZC4gIFNlZQorICAgKiAgICAgIEBGVF9WQUxJREFURV9PVFhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgICBCQVNFX3RhYmxlIDo6CisgICAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBCQVNFIHRhYmxlLgorICAgKgorICAgKiAgICBHREVGX3RhYmxlIDo6CisgICAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgorICAgKgorICAgKiAgICBHUE9TX3RhYmxlIDo6CisgICAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBHUE9TIHRhYmxlLgorICAgKgorICAgKiAgICBHU1VCX3RhYmxlIDo6CisgICAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBHU1VCIHRhYmxlLgorICAgKgorICAgKiAgICBKU1RGX3RhYmxlIDo6CisgICAqICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKKyAgICogICBvdGhlcndpc2UuCisgICAqCisgICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKKyAgICogICBARlRfT3BlblR5cGVfRnJlZS4gIEEgYE5VTExgIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKKyAgICogICBkb2Vzbid0IGV4aXN0IGluIHRoZSBmb250LCBvciB0aGUgYXBwbGljYXRpb24gaGFzbid0IGFza2VkIGZvcgorICAgKiAgIHZhbGlkYXRpb24uCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKQEAgLTE2OSwzMCArMTY5LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKkdTVUJfdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKkpTVEZfdGFibGUgKTsKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfT3BlblR5cGVfRnJlZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgT3BlblR5cGUgdmFsaWRhdG9yLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHRhYmxlIDo6Ci0gICogICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IGlzIGFsbG9jYXRlZCBieQotICAqICAgICAgIEBGVF9PcGVuVHlwZV9WYWxpZGF0ZS4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlIG9ubHkuCi0gICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfT3BlblR5cGVfRnJlZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgT3BlblR5cGUgdmFsaWRhdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KKyAgICoKKyAgICogICAgdGFibGUgOjoKKyAgICogICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5CisgICAqICAgICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5CisgICAqICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlIG9ubHkuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9PcGVuVHlwZV9GcmVlKCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7CiAKKwogICAvKiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgKaW5kZXggODkzODlhNC4uODRlOWIxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgKQEAgLTEsMjggKzEsMjcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3V0bG4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTdXBwb3J0IGZvciB0aGUgRlRfT3V0bGluZSB0eXBlIHVzZWQgdG8gc3RvcmUgZ2x5cGggc2hhcGVzIG9mICAgICAgICAqLwotLyogICAgbW9zdCBzY2FsYWJsZSBmb250IGZvcm1hdHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG91dGxuLmgKKyAqCisgKiAgIFN1cHBvcnQgZm9yIHRoZSBGVF9PdXRsaW5lIHR5cGUgdXNlZCB0byBzdG9yZSBnbHlwaCBzaGFwZXMgb2YKKyAqICAgbW9zdCBzY2FsYWJsZSBmb250IGZvcm1hdHMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVE9VVExOX0hfCiAjZGVmaW5lIEZUT1VUTE5fSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTM0LDEyNyArMzMsMTMxIEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE91dGxpbmUgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY2FsYWJsZSAqLwotICAvKiAgICBnbHlwaCBpbWFnZXMga25vd24gYXMgYG91dGxpbmVzJy4gIFRoZXNlIGNhbiBhbHNvIGJlIG1lYXN1cmVkLCAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQsIGFuZCBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTGluZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcmllbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgb3V0bGluZV9wcm9jZXNzaW5nCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBPdXRsaW5lIFByb2Nlc3NpbmcKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHJvdXRpbmVzIHVzZWQgdG8gY3JlYXRlIGFuZCBkZXN0cm95IHNjYWxhYmxlCisgICAqICAgZ2x5cGggaW1hZ2VzIGtub3duIGFzICdvdXRsaW5lcycuICBUaGVzZSBjYW4gYWxzbyBiZSBtZWFzdXJlZCwKKyAgICogICB0cmFuc2Zvcm1lZCwgYW5kIGNvbnZlcnRlZCBpbnRvIGJpdG1hcHMgYW5kIHBpeG1hcHMuCisgICAqCisgICAqIEBvcmRlcjoKKyAgICogICBGVF9PdXRsaW5lCisgICAqICAgRlRfT3V0bGluZV9OZXcKKyAgICogICBGVF9PdXRsaW5lX0RvbmUKKyAgICogICBGVF9PdXRsaW5lX0NvcHkKKyAgICogICBGVF9PdXRsaW5lX1RyYW5zbGF0ZQorICAgKiAgIEZUX091dGxpbmVfVHJhbnNmb3JtCisgICAqICAgRlRfT3V0bGluZV9FbWJvbGRlbgorICAgKiAgIEZUX091dGxpbmVfRW1ib2xkZW5YWQorICAgKiAgIEZUX091dGxpbmVfUmV2ZXJzZQorICAgKiAgIEZUX091dGxpbmVfQ2hlY2sKKyAgICoKKyAgICogICBGVF9PdXRsaW5lX0dldF9DQm94CisgICAqICAgRlRfT3V0bGluZV9HZXRfQkJveAorICAgKgorICAgKiAgIEZUX091dGxpbmVfR2V0X0JpdG1hcAorICAgKiAgIEZUX091dGxpbmVfUmVuZGVyCisgICAqICAgRlRfT3V0bGluZV9EZWNvbXBvc2UKKyAgICogICBGVF9PdXRsaW5lX0Z1bmNzCisgICAqICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jCisgICAqICAgRlRfT3V0bGluZV9MaW5lVG9GdW5jCisgICAqICAgRlRfT3V0bGluZV9Db25pY1RvRnVuYworICAgKiAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMKKyAgICoKKyAgICogICBGVF9PcmllbnRhdGlvbgorICAgKiAgIEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uCisgICAqCisgICAqICAgRlRfT1VUTElORV9YWFgKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXYWxrIG92ZXIgYW4gb3V0bGluZSdzIHN0cnVjdHVyZSB0byBkZWNvbXBvc2UgaXQgaW50byBpbmRpdmlkdWFsICAgKi8KLSAgLyogICAgc2VnbWVudHMgYW5kIEJlemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBhbHNvIGVtaXRzIGBtb3ZlIHRvJyAgICAgICovCi0gIC8qICAgIG9wZXJhdGlvbnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIG5ldyBjb250b3VycyBpbiB0aGUgb3V0bGluZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIHRhcmdldC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY19pbnRlcmZhY2UgOjogQSB0YWJsZSBvZiBgZW1pdHRlcnMnLCBpLmUuLCBmdW5jdGlvbiBwb2ludGVycyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZCBkdXJpbmcgZGVjb21wb3NpdGlvbiB0byBpbmRpY2F0ZSBwYXRoICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgICAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gZWFjaCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgZW1pdHRlciBkdXJpbmcgdGhlIGRlY29tcG9zaXRpb24uICBJdCBjYW4gYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIGR1cmluZyB0aGUgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvbnRvdXIgdGhhdCBjb250YWlucyBhIHNpbmdsZSBwb2ludCBvbmx5IGlzIHJlcHJlc2VudGVkIGJ5IGEgICAgKi8KLSAgLyogICAgYG1vdmUgdG8nIG9wZXJhdGlvbiBmb2xsb3dlZCBieSBgbGluZSB0bycgdG8gdGhlIHNhbWUgcG9pbnQuICBJbiAgICovCi0gIC8qICAgIG1vc3QgY2FzZXMsIGl0IGlzIGJlc3QgdG8gZmlsdGVyIHRoaXMgb3V0IGJlZm9yZSB1c2luZyB0aGUgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIGZvciBzdHJva2luZyBwdXJwb3NlcyAob3RoZXJ3aXNlIGl0IHdvdWxkIHJlc3VsdCBpbiBhICAgICAgKi8KLSAgLyogICAgdmlzaWJsZSBkb3Qgd2hlbiByb3VuZCBjYXBzIGFyZSB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW1pbGFybHksIHRoZSBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3MgZm9yIGFuIGVtcHR5IG91dGxpbmUgYWxzbyAgKi8KLSAgLyogICAgKGRvaW5nIG5vdGhpbmcsIHRoaXMgaXMsIG5vdCBjYWxsaW5nIGFueSBlbWl0dGVyKTsgaWYgbmVjZXNzYXJ5LCAgICovCi0gIC8qICAgIHlvdSBzaG91bGQgZmlsdGVyIHRoaXMgb3V0LCB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0RlY29tcG9zZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgV2FsayBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbAorICAgKiAgIHNlZ21lbnRzIGFuZCBCZXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gYWxzbyBlbWl0cyAnbW92ZSB0bycKKyAgICogICBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSB0YXJnZXQuCisgICAqCisgICAqICAgZnVuY19pbnRlcmZhY2UgOjoKKyAgICogICAgIEEgdGFibGUgb2YgJ2VtaXR0ZXJzJywgaS5lLiwgZnVuY3Rpb24gcG9pbnRlcnMgY2FsbGVkIGR1cmluZworICAgKiAgICAgZGVjb21wb3NpdGlvbiB0byBpbmRpY2F0ZSBwYXRoIG9wZXJhdGlvbnMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBBIHR5cGVsZXNzIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gZWFjaCBlbWl0dGVyIGR1cmluZyB0aGUKKyAgICogICAgIGRlY29tcG9zaXRpb24uICBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZQorICAgKiAgICAgZGVjb21wb3NpdGlvbi4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBIGNvbnRvdXIgdGhhdCBjb250YWlucyBhIHNpbmdsZSBwb2ludCBvbmx5IGlzIHJlcHJlc2VudGVkIGJ5IGEgJ21vdmUKKyAgICogICB0bycgb3BlcmF0aW9uIGZvbGxvd2VkIGJ5ICdsaW5lIHRvJyB0byB0aGUgc2FtZSBwb2ludC4gIEluIG1vc3QgY2FzZXMsCisgICAqICAgaXQgaXMgYmVzdCB0byBmaWx0ZXIgdGhpcyBvdXQgYmVmb3JlIHVzaW5nIHRoZSBvdXRsaW5lIGZvciBzdHJva2luZworICAgKiAgIHB1cnBvc2VzIChvdGhlcndpc2UgaXQgd291bGQgcmVzdWx0IGluIGEgdmlzaWJsZSBkb3Qgd2hlbiByb3VuZCBjYXBzCisgICAqICAgYXJlIHVzZWQpLgorICAgKgorICAgKiAgIFNpbWlsYXJseSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgc3VjY2VzcyBmb3IgYW4gZW1wdHkgb3V0bGluZSBhbHNvCisgICAqICAgKGRvaW5nIG5vdGhpbmcsIHRoaXMgaXMsIG5vdCBjYWxsaW5nIGFueSBlbWl0dGVyKTsgaWYgbmVjZXNzYXJ5LCB5b3UKKyAgICogICBzaG91bGQgZmlsdGVyIHRoaXMgb3V0LCB0b28uCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoIEZUX091dGxpbmUqICAgICAgICAgICAgICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3V0bGluZV9GdW5jcyogIGZ1bmNfaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgIHVzZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBvdXRsaW5lIG9mIGEgZ2l2ZW4gc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdCBmcm9tIHdoZXJlIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIGlzIGFsbG9jYXRlZC4gIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBuZXcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgb3V0bGluZSB3aWxsICpub3QqIG5lY2Vzc2FyaWx5IGJlICpmcmVlZCosIHdoZW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lpbmcgdGhlIGxpYnJhcnksIGJ5IEBGVF9Eb25lX0ZyZWVUeXBlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtUG9pbnRzICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIE11c3QgYmUgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRiAoNjU1MzUpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtQ29udG91cnMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIHdpdGhpbiB0aGUgb3V0bGluZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgMCB0byBgbnVtUG9pbnRzJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub3V0bGluZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBuZXcgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZWFzb24gd2h5IHRoaXMgZnVuY3Rpb24gdGFrZXMgYSBgbGlicmFyeScgcGFyYW1ldGVyIGlzIHNpbXBseSAqLwotICAvKiAgICB0byB1c2UgdGhlIGxpYnJhcnkncyBtZW1vcnkgYWxsb2NhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfT3V0bGluZV9OZXcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBvdXRsaW5lIG9mIGEgZ2l2ZW4gc2l6ZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdCBmcm9tIHdoZXJlIHRoZSBvdXRsaW5lIGlzIGFsbG9jYXRlZC4KKyAgICogICAgIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBuZXcgb3V0bGluZSB3aWxsICoqbm90KiogbmVjZXNzYXJpbHkgYmUKKyAgICogICAgICoqZnJlZWQqKiwgd2hlbiBkZXN0cm95aW5nIHRoZSBsaWJyYXJ5LCBieSBARlRfRG9uZV9GcmVlVHlwZS4KKyAgICoKKyAgICogICBudW1Qb2ludHMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgd2l0aGluIHRoZSBvdXRsaW5lLiAgTXVzdCBiZSBzbWFsbGVyCisgICAqICAgICB0aGFuIG9yIGVxdWFsIHRvIDB4RkZGRiAoNjU1MzUpLgorICAgKgorICAgKiAgIG51bUNvbnRvdXJzIDo6CisgICAqICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lLiAgVGhpcyB2YWx1ZSBtdXN0CisgICAqICAgICBiZSBpbiB0aGUgcmFuZ2UgMCB0byBgbnVtUG9pbnRzYC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhbm91dGxpbmUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBuZXcgb3V0bGluZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnlgIHBhcmFtZXRlciBpcyBzaW1wbHkgdG8KKyAgICogICB1c2UgdGhlIGxpYnJhcnkncyBtZW1vcnkgYWxsb2NhdG9yLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCkBAIC0xNjIsMzcyICsxNjUsMzcyIEBACiAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICk7CiAKIAotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhbiBvdXRsaW5lIGNyZWF0ZWQgd2l0aCBARlRfT3V0bGluZV9OZXcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSBvZiB0aGUgbGlicmFyeSBvYmplY3QgdXNlZCB0byBhbGxvY2F0ZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIG91dGxpbmUgb2JqZWN0IHRvIGJlIGRpc2NhcmRlZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIG91dGxpbmUncyBgb3duZXInIGZpZWxkIGlzIG5vdCBzZXQsIG9ubHkgdGhlIG91dGxpbmUgICAgICAgICovCi0gIC8qICAgIGRlc2NyaXB0b3Igd2lsbCBiZSByZWxlYXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0RvbmUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERlc3Ryb3kgYW4gb3V0bGluZSBjcmVhdGVkIHdpdGggQEZUX091dGxpbmVfTmV3LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlIG91dGxpbmUuCisgICAqCisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBvdXRsaW5lIG9iamVjdCB0byBiZSBkaXNjYXJkZWQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgSWYgdGhlIG91dGxpbmUncyAnb3duZXInIGZpZWxkIGlzIG5vdCBzZXQsIG9ubHkgdGhlIG91dGxpbmUgZGVzY3JpcHRvcgorICAgKiAgIHdpbGwgYmUgcmVsZWFzZWQuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3V0bGluZV9Eb25lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwogCiAKLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2sgdGhlIGNvbnRlbnRzIG9mIGFuIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW1wdHkgb3V0bGluZSwgb3IgYW4gb3V0bGluZSB3aXRoIGEgc2luZ2xlIHBvaW50IG9ubHkgaXMgYWxzbyAgICovCi0gIC8qICAgIHZhbGlkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0NoZWNrCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDaGVjayB0aGUgY29udGVudHMgb2YgYW4gb3V0bGluZSBkZXNjcmlwdG9yLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBzb3VyY2Ugb3V0bGluZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBBbiBlbXB0eSBvdXRsaW5lLCBvciBhbiBvdXRsaW5lIHdpdGggYSBzaW5nbGUgcG9pbnQgb25seSBpcyBhbHNvCisgICAqICAgdmFsaWQuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3V0bGluZV9DaGVjayggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwgICAqLwotICAvKiAgICB0aGUgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIEJlemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgKi8KLSAgLyogICAgY29pbmNpZGVzIHdpdGggdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBmb3IgbW9zdCBnbHlwaHMsIGl0IGNhbiBiZSAgICovCi0gIC8qICAgIHNsaWdodGx5IGxhcmdlciBpbiBzb21lIHNpdHVhdGlvbnMgKGxpa2Ugd2hlbiByb3RhdGluZyBhbiBvdXRsaW5lICAqLwotICAvKiAgICB0aGF0IGNvbnRhaW5zIEJlemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyAqLwotICAvKiAgICBib3ggY2FuIHRha2UgbXVjaCBtb3JlIHRpbWUgYXMgaXQgbmVlZHMgdG8gd2FsayBvdmVyIGFsbCBzZWdtZW50cyAgKi8KLSAgLyogICAgYW5kIGFyY3MgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICAgICAgICovCi0gIC8qICAgIGBmdGJib3gnIGNvbXBvbmVudCwgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjYm94ICAgOjogVGhlIG91dGxpbmUncyBjb250cm9sIGJveC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfR2x5cGhfR2V0X0NCb3ggZm9yIGEgZGlzY3Vzc2lvbiBvZiB0cmlja3kgZm9udHMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0dldF9DQm94CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gYW4gb3V0bGluZSdzICdjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsIHRoZQorICAgKiAgIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCZXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQKKyAgICogICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlCisgICAqICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgdGhhdAorICAgKiAgIGNvbnRhaW5zIEJlemllciBvdXRzaWRlIGFyY3MpLgorICAgKgorICAgKiAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyBib3gKKyAgICogICBjYW4gdGFrZSBtdWNoIG1vcmUgdGltZSBhcyBpdCBuZWVkcyB0byB3YWxrIG92ZXIgYWxsIHNlZ21lbnRzIGFuZCBhcmNzCisgICAqICAgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICdmdGJib3gnCisgICAqICAgY29tcG9uZW50LCB3aGljaCBpcyBkZWRpY2F0ZWQgdG8gdGhpcyBzaW5nbGUgdGFzay4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhY2JveCA6OgorICAgKiAgICAgVGhlIG91dGxpbmUncyBjb250cm9sIGJveC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgU2VlIEBGVF9HbHlwaF9HZXRfQ0JveCBmb3IgYSBkaXNjdXNzaW9uIG9mIHRyaWNreSBmb250cy4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGx5IGEgc2ltcGxlIHRyYW5zbGF0aW9uIHRvIHRoZSBwb2ludHMgb2YgYW4gb3V0bGluZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhPZmZzZXQgOjogVGhlIGhvcml6b250YWwgb2Zmc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU9mZnNldCA6OiBUaGUgdmVydGljYWwgb2Zmc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfVHJhbnNsYXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBcHBseSBhIHNpbXBsZSB0cmFuc2xhdGlvbiB0byB0aGUgcG9pbnRzIG9mIGFuIG91dGxpbmUuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICB4T2Zmc2V0IDo6CisgICAqICAgICBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuCisgICAqCisgICAqICAgeU9mZnNldCA6OgorICAgKiAgICAgVGhlIHZlcnRpY2FsIG9mZnNldC4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB4T2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHlPZmZzZXQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvcHkgYW4gb3V0bGluZSBpbnRvIGFub3RoZXIgb25lLiAgQm90aCBvYmplY3RzIG11c3QgaGF2ZSB0aGUgICAgICAqLwotICAvKiAgICBzYW1lIHNpemVzIChudW1iZXIgb2YgcG9pbnRzICYgbnVtYmVyIG9mIGNvbnRvdXJzKSB3aGVuIHRoaXMgICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb24gaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfQ29weQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ29weSBhbiBvdXRsaW5lIGludG8gYW5vdGhlciBvbmUuICBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHRoZSBzYW1lCisgICAqICAgc2l6ZXMgKG51bWJlciBvZiBwb2ludHMgJiBudW1iZXIgb2YgY29udG91cnMpIHdoZW4gdGhpcyBmdW5jdGlvbiBpcworICAgKiAgIGNhbGxlZC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHNvdXJjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHRhcmdldCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBvdXRsaW5lLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3V0bGluZV9Db3B5KCBjb25zdCBGVF9PdXRsaW5lKiAgc291cmNlLAogICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICAgICAgICp0YXJnZXQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGx5IGEgc2ltcGxlIDJ4MiBtYXRyaXggdG8gYWxsIG9mIGFuIG91dGxpbmUncyBwb2ludHMuICBVc2VmdWwgICAqLwotICAvKiAgICBmb3IgYXBwbHlpbmcgcm90YXRpb25zLCBzbGFudGluZywgZmxpcHBpbmcsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfT3V0bGluZV9UcmFuc2xhdGUgaWYgeW91IG5lZWQgdG8gdHJhbnNsYXRlIHRoZSAgICAgKi8KLSAgLyogICAgb3V0bGluZSdzIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfVHJhbnNmb3JtCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBcHBseSBhIHNpbXBsZSAyeDIgbWF0cml4IHRvIGFsbCBvZiBhbiBvdXRsaW5lJ3MgcG9pbnRzLiAgVXNlZnVsIGZvcgorICAgKiAgIGFwcGx5aW5nIHJvdGF0aW9ucywgc2xhbnRpbmcsIGZsaXBwaW5nLCBldGMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBtYXRyaXggOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBZb3UgY2FuIHVzZSBARlRfT3V0bGluZV9UcmFuc2xhdGUgaWYgeW91IG5lZWQgdG8gdHJhbnNsYXRlIHRoZQorICAgKiAgIG91dGxpbmUncyBwb2ludHMuCisgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICAgbWF0cml4ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbWJvbGRlbiBhbiBvdXRsaW5lLiAgVGhlIG5ldyBvdXRsaW5lIHdpbGwgYmUgYXQgbW9zdCA0fnRpbWVzICAgICAgKi8KLSAgLyogICAgYHN0cmVuZ3RoJyBwaXhlbHMgd2lkZXIgYW5kIGhpZ2hlci4gIFlvdSBtYXkgdGhpbmsgb2YgdGhlIGxlZnQgYW5kICovCi0gIC8qICAgIGJvdHRvbSBib3JkZXJzIGFzIHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTmVnYXRpdmUgYHN0cmVuZ3RoJyB2YWx1ZXMgdG8gcmVkdWNlIHRoZSBvdXRsaW5lIHRoaWNrbmVzcyBhcmUgICAgICovCi0gIC8qICAgIHBvc3NpYmxlIGFsc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQuICBFeHByZXNzZWQgaW4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAyNi42IHBpeGVsIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdXNlZCBhbGdvcml0aG0gdG8gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIHRoaWNrbmVzcyBvZiB0aGUgICAgKi8KLSAgLyogICAgZ2x5cGggZG9lc24ndCBjaGFuZ2UgdGhlIG51bWJlciBvZiBwb2ludHM7IHRoaXMgbWVhbnMgdGhhdCBjZXJ0YWluICovCi0gIC8qICAgIHNpdHVhdGlvbnMgbGlrZSBhY3V0ZSBhbmdsZXMgb3IgaW50ZXJzZWN0aW9ucyBhcmUgc29tZXRpbWVzICAgICAgICAqLwotICAvKiAgICBoYW5kbGVkIGluY29ycmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSBuZWVkIGBiZXR0ZXInIG1ldHJpY3MgdmFsdWVzIHlvdSBzaG91bGQgY2FsbCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT3V0bGluZV9HZXRfQ0JveCBvciBARlRfT3V0bGluZV9HZXRfQkJveC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEV4YW1wbGUgY2FsbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgaW5kZXgsIEZUX0xPQURfREVGQVVMVCApOyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW4oICZmYWNlLT5nbHlwaC0+b3V0bGluZSwgc3RyZW5ndGggKTsgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZ2V0IG1lYW5pbmdmdWwgcmVzdWx0cywgZm9udCBzY2FsaW5nIHZhbHVlcyBtdXN0IGJlIHNldCB3aXRoICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9TZXRfQ2hhcl9TaXplIGJlZm9yZSBjYWxsaW5nIEZUX1JlbmRlcl9HbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0VtYm9sZGVuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBFbWJvbGRlbiBhbiBvdXRsaW5lLiAgVGhlIG5ldyBvdXRsaW5lIHdpbGwgYmUgYXQgbW9zdCA0fnRpbWVzCisgICAqICAgYHN0cmVuZ3RoYCBwaXhlbHMgd2lkZXIgYW5kIGhpZ2hlci4gIFlvdSBtYXkgdGhpbmsgb2YgdGhlIGxlZnQgYW5kCisgICAqICAgYm90dG9tIGJvcmRlcnMgYXMgdW5jaGFuZ2VkLgorICAgKgorICAgKiAgIE5lZ2F0aXZlIGBzdHJlbmd0aGAgdmFsdWVzIHRvIHJlZHVjZSB0aGUgb3V0bGluZSB0aGlja25lc3MgYXJlCisgICAqICAgcG9zc2libGUgYWxzby4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHN0cmVuZ3RoIDo6CisgICAqICAgICBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkLiAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSB1c2VkIGFsZ29yaXRobSB0byBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgdGhpY2tuZXNzIG9mIHRoZSBnbHlwaAorICAgKiAgIGRvZXNuJ3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgcG9pbnRzOyB0aGlzIG1lYW5zIHRoYXQgY2VydGFpbgorICAgKiAgIHNpdHVhdGlvbnMgbGlrZSBhY3V0ZSBhbmdsZXMgb3IgaW50ZXJzZWN0aW9ucyBhcmUgc29tZXRpbWVzIGhhbmRsZWQKKyAgICogICBpbmNvcnJlY3RseS4KKyAgICoKKyAgICogICBJZiB5b3UgbmVlZCAnYmV0dGVyJyBtZXRyaWNzIHZhbHVlcyB5b3Ugc2hvdWxkIGNhbGwKKyAgICogICBARlRfT3V0bGluZV9HZXRfQ0JveCBvciBARlRfT3V0bGluZV9HZXRfQkJveC4KKyAgICoKKyAgICogICBUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBmb250IHNjYWxpbmcgdmFsdWVzIG11c3QgYmUgc2V0IHdpdGgKKyAgICogICBmdW5jdGlvbnMgbGlrZSBARlRfU2V0X0NoYXJfU2l6ZSBiZWZvcmUgY2FsbGluZyBGVF9SZW5kZXJfR2x5cGguCisgICAqCisgICAqIEBleGFtcGxlOgorICAgKiAgIGBgYAorICAgKiAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgaW5kZXgsIEZUX0xPQURfREVGQVVMVCApOworICAgKgorICAgKiAgICAgaWYgKCBmYWNlLT5nbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKKyAgICogICAgICAgRlRfT3V0bGluZV9FbWJvbGRlbiggJmZhY2UtPmdseXBoLT5vdXRsaW5lLCBzdHJlbmd0aCApOworICAgKiAgIGBgYAorICAgKgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfRW1ib2xkZW4oIEZUX091dGxpbmUqICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgc3RyZW5ndGggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBgeHN0cmVuZ3RoJyBwaXhlbHMgICAqLwotICAvKiAgICB3aWRlciBhbmQgYHlzdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIE90aGVyd2lzZSwgaXQgaXMgc2ltaWxhciB0byAgKi8KLSAgLyogICAgQEZUX091dGxpbmVfRW1ib2xkZW4sIHdoaWNoIHVzZXMgdGhlIHNhbWUgc3RyZW5ndGggaW4gYm90aCAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuNC4xMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBgeHN0cmVuZ3RoYCBwaXhlbHMgd2lkZXIKKyAgICogICBhbmQgYHlzdHJlbmd0aGAgcGl4ZWxzIGhpZ2hlci4gIE90aGVyd2lzZSwgaXQgaXMgc2ltaWxhciB0bworICAgKiAgIEBGVF9PdXRsaW5lX0VtYm9sZGVuLCB3aGljaCB1c2VzIHRoZSBzYW1lIHN0cmVuZ3RoIGluIGJvdGggZGlyZWN0aW9ucy4KKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNC4xMAorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggRlRfT3V0bGluZSogIG91dGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHhzdHJlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeXN0cmVuZ3RoICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXZlcnNlIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyB1c2VkIHRvICAgICAgKi8KLSAgLyogICAgZW5zdXJlIGNvbnNpc3RlbnQgZmlsbCBjb252ZW50aW9ucyBmb3IgbWlycm9yZWQgZ2x5cGhzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB0b2dnbGVzIHRoZSBiaXQgZmxhZyBARlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgaW4gICAgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgYGZsYWdzJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgYSBub3JtYWwgY2xpZW50IGFwcGxpY2F0aW9uLCB1bmxlc3MgaXQgICAgICovCi0gIC8qICAgIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX1JldmVyc2UKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldmVyc2UgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGFuIG91dGxpbmUuICBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlCisgICAqICAgY29uc2lzdGVudCBmaWxsIGNvbnZlbnRpb25zIGZvciBtaXJyb3JlZCBnbHlwaHMuCisgICAqCisgICAqIEBpbm91dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gdG9nZ2xlcyB0aGUgYml0IGZsYWcgQEZUX09VVExJTkVfUkVWRVJTRV9GSUxMIGluIHRoZQorICAgKiAgIG91dGxpbmUncyBgZmxhZ3NgIGZpZWxkLgorICAgKgorICAgKiAgIEl0IHNob3VsZG4ndCBiZSB1c2VkIGJ5IGEgbm9ybWFsIGNsaWVudCBhcHBsaWNhdGlvbiwgdW5sZXNzIGl0IGtub3dzCisgICAqICAgd2hhdCBpdCBpcyBkb2luZy4KKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX091dGxpbmVfUmV2ZXJzZSggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfR2V0X0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcC4gIFRoZSBvdXRsaW5lJ3MgaW1hZ2UgaXMgc2ltcGx5ICAqLwotICAvKiAgICBPUi1lZCB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiaXRtYXAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgYml0bWFwIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgQ1JFQVRFIHRoZSBiaXRtYXAsIGl0IG9ubHkgcmVuZGVycyBhbiAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIGltYWdlIHdpdGhpbiB0aGUgb25lIHlvdSBwYXNzIHRvIGl0ISAgQ29uc2VxdWVudGx5LCB0aGUgICAgKi8KLSAgLyogICAgdmFyaW91cyBmaWVsZHMgaW4gYGFiaXRtYXAnIHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nbHkuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCB3aWxsIHVzZSB0aGUgcmFzdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlZmF1bHQgZ2x5cGggZm9ybWF0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB2YWx1ZSBvZiB0aGUgYG51bV9ncmF5cycgZmllbGQgaW4gYGFiaXRtYXAnIGlzIGlnbm9yZWQuICBJZiAgICAqLwotICAvKiAgICB5b3Ugc2VsZWN0IHRoZSBncmF5LWxldmVsIHJhc3Rlcml6ZXIsIGFuZCB5b3Ugd2FudCBsZXNzIHRoYW4gMjU2ICAgKi8KLSAgLyogICAgZ3JheSBsZXZlbHMsIHlvdSBoYXZlIHRvIHVzZSBARlRfT3V0bGluZV9SZW5kZXIgZGlyZWN0bHkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfR2V0X0JpdG1hcAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmVuZGVyIGFuIG91dGxpbmUgd2l0aGluIGEgYml0bWFwLiAgVGhlIG91dGxpbmUncyBpbWFnZSBpcyBzaW1wbHkKKyAgICogICBPUi1lZCB0byB0aGUgdGFyZ2V0IGJpdG1hcC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgYWJpdG1hcCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgYml0bWFwIGRlc2NyaXB0b3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBkb2VzICoqbm90IGNyZWF0ZSoqIHRoZSBiaXRtYXAsIGl0IG9ubHkgcmVuZGVycyBhbgorICAgKiAgIG91dGxpbmUgaW1hZ2Ugd2l0aGluIHRoZSBvbmUgeW91IHBhc3MgdG8gaXQhICBDb25zZXF1ZW50bHksIHRoZQorICAgKiAgIHZhcmlvdXMgZmllbGRzIGluIGBhYml0bWFwYCBzaG91bGQgYmUgc2V0IGFjY29yZGluZ2x5LgorICAgKgorICAgKiAgIEl0IHdpbGwgdXNlIHRoZSByYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZGVmYXVsdCBnbHlwaCBmb3JtYXQuCisgICAqCisgICAqICAgVGhlIHZhbHVlIG9mIHRoZSBgbnVtX2dyYXlzYCBmaWVsZCBpbiBgYWJpdG1hcGAgaXMgaWdub3JlZC4gIElmIHlvdQorICAgKiAgIHNlbGVjdCB0aGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyLCBhbmQgeW91IHdhbnQgbGVzcyB0aGFuIDI1NiBncmF5CisgICAqICAgbGV2ZWxzLCB5b3UgaGF2ZSB0byB1c2UgQEZUX091dGxpbmVfUmVuZGVyIGRpcmVjdGx5LgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX091dGxpbmVfR2V0X0JpdG1hcCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfUmVuZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcCB1c2luZyB0aGUgY3VycmVudCBzY2FuLWNvbnZlcnQuICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCAgKi8KLSAgLyogICAgYWxsb3dpbmcgYWR2YW5jZWQgZmVhdHVyZXMgbGlrZSBkaXJlY3QgY29tcG9zaXRpb24sIHRyYW5zbHVjZW5jeSwgICovCi0gIC8qICAgIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICovCi0gIC8qICAgICAgICAgICAgICAgZGVzY3JpYmUgdGhlIHJlbmRlcmluZyBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcgYW5kIGhvdyBARlRfUmFzdGVyX1BhcmFtcyB3b3JrcyAqLwotICAvKiAgICB0byB1c2UgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmaWVsZCBgcGFyYW1zLnNvdXJjZScgd2lsbCBiZSBzZXQgdG8gYG91dGxpbmUnIGJlZm9yZSB0aGUgc2NhbiAqLwotICAvKiAgICBjb252ZXJ0ZXIgaXMgY2FsbGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSB2YWx1ZSB5b3UgZ2l2ZSB0byBpdCBpcyAgKi8KLSAgLyogICAgYWN0dWFsbHkgaWdub3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ3JheS1sZXZlbCByYXN0ZXJpemVyIGFsd2F5cyB1c2VzIDI1NiBncmF5IGxldmVscy4gIElmIHlvdSAgICAgKi8KLSAgLyogICAgd2FudCBsZXNzIGdyYXkgbGV2ZWxzLCB5b3UgaGF2ZSB0byBwcm92aWRlIHlvdXIgb3duIHNwYW4gY2FsbGJhY2suICovCi0gIC8qICAgIFNlZSB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCB2YWx1ZSBvZiB0aGUgYGZsYWdzJyBmaWVsZCBpbiB0aGUgICAqLwotICAvKiAgICBARlRfUmFzdGVyX1BhcmFtcyBzdHJ1Y3R1cmUgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfT3V0bGluZV9SZW5kZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJlbmRlciBhbiBvdXRsaW5lIHdpdGhpbiBhIGJpdG1hcCB1c2luZyB0aGUgY3VycmVudCBzY2FuLWNvbnZlcnQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsaWJyYXJ5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIHBhcmFtcyA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIHRoZQorICAgKiAgICAgcmVuZGVyaW5nIG9wZXJhdGlvbi4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGFkdmFuY2VkIGZ1bmN0aW9uIHVzZXMgQEZUX1Jhc3Rlcl9QYXJhbXMgYXMgYW4gYXJndW1lbnQuCisgICAqICAgVGhlIGZpZWxkIGBwYXJhbXMuc291cmNlYCB3aWxsIGJlIHNldCB0byBgb3V0bGluZWAgYmVmb3JlIHRoZSBzY2FuCisgICAqICAgY29udmVydGVyIGlzIGNhbGxlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgeW91IGdpdmUgdG8gaXQgaXMKKyAgICogICBhY3R1YWxseSBpZ25vcmVkLiAgRWl0aGVyIGBwYXJhbXMudGFyZ2V0YCBtdXN0IHBvaW50IHRvIHByZWFsbG9jYXRlZAorICAgKiAgIGJpdG1hcCwgb3IgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBtdXN0IGJlIHNldCBpbiBgcGFyYW1zLmZsYWdzYAorICAgKiAgIGFsbG93aW5nIEZyZWVUeXBlIHJhc3Rlcml6ZXIgdG8gYmUgdXNlZCBmb3IgZGlyZWN0IGNvbXBvc2l0aW9uLAorICAgKiAgIHRyYW5zbHVjZW5jeSwgZXRjLiAgU2VlIEBGVF9SYXN0ZXJfUGFyYW1zIGZvciBtb3JlIGRldGFpbHMuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfT3V0bGluZV9SZW5kZXIoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICBGVF9PcmllbnRhdGlvbgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgQSBsaXN0IG9mIHZhbHVlcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUncyBjb250b3VyIG9yaWVudGF0aW9uLgotICAqCi0gICogICBUaGUgVHJ1ZVR5cGUgYW5kIFBvc3RTY3JpcHQgc3BlY2lmaWNhdGlvbnMgdXNlIGRpZmZlcmVudCBjb252ZW50aW9ucwotICAqICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3V0bGluZSBjb250b3VycyBzaG91bGQgYmUgZmlsbGVkIG9yIHVuZmlsbGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiwgY2xvY2t3aXNlIGNvbnRvdXJzIG11c3QKLSAgKiAgICAgYmUgZmlsbGVkLCBhbmQgY291bnRlci1jbG9ja3dpc2Ugb25lcyBtdXN0IGJlIHVuZmlsbGVkLgotICAqCi0gICogICBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9uLCBjb3VudGVyLWNsb2Nrd2lzZSBjb250b3VycwotICAqICAgICBtdXN0IGJlIGZpbGxlZCwgYW5kIGNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgOjoKLSAgKiAgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFLCBidXQgaXMgdXNlZCB0bwotICAqICAgICByZW1lbWJlciB0aGF0IGluIFRydWVUeXBlLCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIHJpZ2h0IG9mCi0gICogICAgIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhIGNvbnRvdXIgbXVzdCBiZSBmaWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfTEVGVCA6OgotICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwgYnV0IGlzIHVzZWQgdG8KLSAgKiAgICAgcmVtZW1iZXIgdGhhdCBpbiBQb3N0U2NyaXB0LCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIGxlZnQgb2YKLSAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fTk9ORSA6OgotICAqICAgICBUaGUgb3JpZW50YXRpb24gY2Fubm90IGJlIGRldGVybWluZWQuICBUaGF0IGlzLCBkaWZmZXJlbnQgcGFydHMgb2YKLSAgKiAgICAgdGhlIGdseXBoIGhhdmUgZGlmZmVyZW50IG9yaWVudGF0aW9uLgotICAqCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBGVF9PcmllbnRhdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBsaXN0IG9mIHZhbHVlcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUncyBjb250b3VyIG9yaWVudGF0aW9uLgorICAgKgorICAgKiAgIFRoZSBUcnVlVHlwZSBhbmQgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9ucyB1c2UgZGlmZmVyZW50IGNvbnZlbnRpb25zCisgICAqICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3V0bGluZSBjb250b3VycyBzaG91bGQgYmUgZmlsbGVkIG9yIHVuZmlsbGVkLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIDo6CisgICAqICAgICBBY2NvcmRpbmcgdG8gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24sIGNsb2Nrd2lzZSBjb250b3VycyBtdXN0IGJlCisgICAqICAgICBmaWxsZWQsIGFuZCBjb3VudGVyLWNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCisgICAqCisgICAqICAgRlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCA6OgorICAgKiAgICAgQWNjb3JkaW5nIHRvIHRoZSBQb3N0U2NyaXB0IHNwZWNpZmljYXRpb24sIGNvdW50ZXItY2xvY2t3aXNlCisgICAqICAgICBjb250b3VycyBtdXN0IGJlIGZpbGxlZCwgYW5kIGNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCisgICAqCisgICAqICAgRlRfT1JJRU5UQVRJT05fRklMTF9SSUdIVCA6OgorICAgKiAgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFLCBidXQgaXMgdXNlZCB0bworICAgKiAgICAgcmVtZW1iZXIgdGhhdCBpbiBUcnVlVHlwZSwgZXZlcnl0aGluZyB0aGF0IGlzIHRvIHRoZSByaWdodCBvZiB0aGUKKyAgICogICAgIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KKyAgICoKKyAgICogICBGVF9PUklFTlRBVElPTl9GSUxMX0xFRlQgOjoKKyAgICogICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIEBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBULCBidXQgaXMgdXNlZCB0bworICAgKiAgICAgcmVtZW1iZXIgdGhhdCBpbiBQb3N0U2NyaXB0LCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIGxlZnQgb2YgdGhlCisgICAqICAgICBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhIGNvbnRvdXIgbXVzdCBiZSBmaWxsZWQuCisgICAqCisgICAqICAgRlRfT1JJRU5UQVRJT05fTk9ORSA6OgorICAgKiAgICAgVGhlIG9yaWVudGF0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgVGhhdCBpcywgZGlmZmVyZW50IHBhcnRzIG9mCisgICAqICAgICB0aGUgZ2x5cGggaGF2ZSBkaWZmZXJlbnQgb3JpZW50YXRpb24uCisgICAqCisgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX09yaWVudGF0aW9uXwogICB7CiAgICAgRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgICA9IDAsCkBAIC01MzksMzMgKzU0MiwzNCBAQAogICB9IEZUX09yaWVudGF0aW9uOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBUaGlzIGZ1bmN0aW9uIGFuYWx5emVzIGEgZ2x5cGggb3V0bGluZSBhbmQgdHJpZXMgdG8gY29tcHV0ZSBpdHMKLSAgKiAgIGZpbGwgb3JpZW50YXRpb24gKHNlZSBARlRfT3JpZW50YXRpb24pLiAgVGhpcyBpcyBkb25lIGJ5IGludGVncmF0aW5nCi0gICogICB0aGUgdG90YWwgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBvdXRsaW5lLiBUaGUgcG9zaXRpdmUgaW50ZWdyYWwKLSAgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBjbG9ja3dpc2Ugb3JpZW50YXRpb24gYW5kIEBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUCi0gICogICBpcyByZXR1cm5lZC4gVGhlIG5lZ2F0aXZlIGludGVncmFsIGNvcnJlc3BvbmRzIHRvIHRoZSBjb3VudGVyLWNsb2Nrd2lzZQotICAqICAgb3JpZW50YXRpb24gYW5kIEBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSBpcyByZXR1cm5lZC4KLSAgKgotICAqICAgTm90ZSB0aGF0IHRoaXMgd2lsbCByZXR1cm4gQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIGZvciBlbXB0eQotICAqICAgb3V0bGluZXMuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBvdXRsaW5lIDo6Ci0gICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBUaGUgb3JpZW50YXRpb24uCi0gICoKLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9PdXRsaW5lX0dldF9PcmllbnRhdGlvbgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBmdW5jdGlvbiBhbmFseXplcyBhIGdseXBoIG91dGxpbmUgYW5kIHRyaWVzIHRvIGNvbXB1dGUgaXRzIGZpbGwKKyAgICogICBvcmllbnRhdGlvbiAoc2VlIEBGVF9PcmllbnRhdGlvbikuICBUaGlzIGlzIGRvbmUgYnkgaW50ZWdyYXRpbmcgdGhlCisgICAqICAgdG90YWwgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBvdXRsaW5lLiBUaGUgcG9zaXRpdmUgaW50ZWdyYWwgY29ycmVzcG9uZHMKKyAgICogICB0byB0aGUgY2xvY2t3aXNlIG9yaWVudGF0aW9uIGFuZCBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCBpcworICAgKiAgIHJldHVybmVkLiBUaGUgbmVnYXRpdmUgaW50ZWdyYWwgY29ycmVzcG9uZHMgdG8gdGhlIGNvdW50ZXItY2xvY2t3aXNlCisgICAqICAgb3JpZW50YXRpb24gYW5kIEBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgZm9yIGVtcHR5CisgICAqICAgb3V0bGluZXMuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG91dGxpbmUuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIG9yaWVudGF0aW9uLgorICAgKgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9PcmllbnRhdGlvbiApCiAgIEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwogCisKICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGFyYW1zLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGFyYW1zLmgKaW5kZXggNWE5MDA2Yy4uNTVlYTJhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHBhcmFtcy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRwYXJhbXMuaApAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRwYXJhbXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgcG9zc2libGUgRlRfUGFyYW1ldGVyIHRhZ3MgKHNwZWNpZmljYXRpb24gb25seSkuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDE3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRwYXJhbXMuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBwb3NzaWJsZSBGVF9QYXJhbWV0ZXIgdGFncyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRQQVJBTVNfSF8KICNkZWZpbmUgRlRQQVJBTVNfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC01MSwxNiArNTAsMTYgQEAKICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgotICAgKiBAY29uc3RhbnQ6CisgICAqIEBlbnVtOgogICAgKiAgIEZUX1BBUkFNX1RBR19JR05PUkVfVFlQT0dSQVBISUNfRkFNSUxZCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBBIHRhZyBmb3IgQEZUX1BhcmFtZXRlciB0byBtYWtlIEBGVF9PcGVuX0ZhY2UgaWdub3JlIHR5cG9ncmFwaGljCi0gICAqICAgZmFtaWx5IG5hbWVzIGluIHRoZSBgbmFtZScgdGFibGUgKGludHJvZHVjZWQgaW4gT3BlblR5cGUgdmVyc2lvbgotICAgKiAgIDEuNCkuICBVc2UgdGhpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzeXN0ZW1zIHRoYXQKLSAgICogICBoYXZlIGEgZm91ci1mYWNlcy1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgorICAgKiAgIGZhbWlseSBuYW1lcyBpbiB0aGUgJ25hbWUnIHRhYmxlIChpbnRyb2R1Y2VkIGluIE9wZW5UeXBlIHZlcnNpb24gMS40KS4KKyAgICogICBVc2UgdGhpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzeXN0ZW1zIHRoYXQgaGF2ZSBhCisgICAqICAgZm91ci1mYWNlcy1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgogICAgKgogICAgKiBAc2luY2U6CiAgICAqICAgMi44CkBAIC03NSwxNCArNzQsMTQgQEAKICAgICAgICAgICBGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX0ZBTUlMWQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKLSAgICogQGNvbnN0YW50OgorICAgKiBAZW51bToKICAgICogICBGVF9QQVJBTV9UQUdfSUdOT1JFX1RZUE9HUkFQSElDX1NVQkZBTUlMWQogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSB0YWcgZm9yIEBGVF9QYXJhbWV0ZXIgdG8gbWFrZSBARlRfT3Blbl9GYWNlIGlnbm9yZSB0eXBvZ3JhcGhpYwotICAgKiAgIHN1YmZhbWlseSBuYW1lcyBpbiB0aGUgYG5hbWUnIHRhYmxlIChpbnRyb2R1Y2VkIGluIE9wZW5UeXBlIHZlcnNpb24KKyAgICogICBzdWJmYW1pbHkgbmFtZXMgaW4gdGhlICduYW1lJyB0YWJsZSAoaW50cm9kdWNlZCBpbiBPcGVuVHlwZSB2ZXJzaW9uCiAgICAqICAgMS40KS4gIFVzZSB0aGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHN5c3RlbXMgdGhhdAogICAgKiAgIGhhdmUgYSBmb3VyLWZhY2VzLXBlci1mYW1pbHkgcmVzdHJpY3Rpb24uCiAgICAqCkBAIC05OSw5ICs5OCw5IEBACiAgICAgICAgICAgRlRfUEFSQU1fVEFHX0lHTk9SRV9UWVBPR1JBUEhJQ19TVUJGQU1JTFkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEBjb25zdGFudDoKKyAgICogQGVudW06CiAgICAqICAgRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKQEAgLTExNSwxNCArMTE0LDE0IEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEBjb25zdGFudDoKKyAgICogQGVudW06CiAgICAqICAgRlRfUEFSQU1fVEFHX0xDRF9GSUxURVJfV0VJR0hUUwogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQW4gQEZUX1BhcmFtZXRlciB0YWcgdG8gYmUgdXNlZCB3aXRoIEBGVF9GYWNlX1Byb3BlcnRpZXMuICBUaGUKICAgICogICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZml2ZSBMQ0QgZmlsdGVyIHdlaWdodHMgZm9yIGEKLSAgICogICBnaXZlbiBmYWNlIChpZiB1c2luZyBARlRfTE9BRF9UQVJHRVRfTENELCBmb3IgZXhhbXBsZSksIG92ZXJyaWRpbmcKLSAgICogICB0aGUgZ2xvYmFsIGRlZmF1bHQgdmFsdWVzIG9yIHRoZSB2YWx1ZXMgc2V0IHVwIHdpdGgKKyAgICogICBnaXZlbiBmYWNlIChpZiB1c2luZyBARlRfTE9BRF9UQVJHRVRfTENELCBmb3IgZXhhbXBsZSksIG92ZXJyaWRpbmcgdGhlCisgICAqICAgZ2xvYmFsIGRlZmF1bHQgdmFsdWVzIG9yIHRoZSB2YWx1ZXMgc2V0IHVwIHdpdGgKICAgICogICBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzLgogICAgKgogICAgKiBAc2luY2U6CkBAIC0xMzUsMTQgKzEzNCwxMyBAQAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgotICAgKiBAY29uc3RhbnQ6CisgICAqIEBlbnVtOgogICAgKiAgIEZUX1BBUkFNX1RBR19SQU5ET01fU0VFRAogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQW4gQEZUX1BhcmFtZXRlciB0YWcgdG8gYmUgdXNlZCB3aXRoIEBGVF9GYWNlX1Byb3BlcnRpZXMuICBUaGUKICAgICogICBjb3JyZXNwb25kaW5nIDMyYml0IHNpZ25lZCBpbnRlZ2VyIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUgZm9udAotICAgKiAgIGRyaXZlcidzIHJhbmRvbSBzZWVkIHZhbHVlIHdpdGggYSBmYWNlLXNwZWNpZmljIG9uZTsgc2VlCi0gICAqICAgQHJhbmRvbS1zZWVkLgorICAgKiAgIGRyaXZlcidzIHJhbmRvbSBzZWVkIHZhbHVlIHdpdGggYSBmYWNlLXNwZWNpZmljIG9uZTsgc2VlIEByYW5kb20tc2VlZC4KICAgICoKICAgICogQHNpbmNlOgogICAgKiAgIDIuOApAQCAtMTU0LDcgKzE1Miw3IEBACiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqIEBjb25zdGFudDoKKyAgICogQGVudW06CiAgICAqICAgRlRfUEFSQU1fVEFHX1NURU1fREFSS0VOSU5HCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKQEAgLTE2MywxMCArMTYxLDEwIEBACiAgICAqICAgZGFya2VuaW5nLCBvdmVycmlkaW5nIHRoZSBnbG9iYWwgZGVmYXVsdCB2YWx1ZXMgb3IgdGhlIHZhbHVlcyBzZXQgdXAKICAgICogICB3aXRoIEBGVF9Qcm9wZXJ0eV9TZXQgKHNlZSBAbm8tc3RlbS1kYXJrZW5pbmcpLgogICAgKgotICAgKiAgIFRoaXMgaXMgYSBwYXNzaXZlIHNldHRpbmcgdGhhdCBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGUgZm9udCBkcml2ZXIKLSAgICogICBvciBhdXRvaGludGVyIGhvbm9ycyBpdCwgd2hpY2ggdGhlIENGRiwgVHlwZX4xLCBhbmQgQ0lEIGRyaXZlcnMKLSAgICogICBhbHdheXMgZG8sIGJ1dCB0aGUgYXV0b2hpbnRlciBvbmx5IGluIGBsaWdodCcgaGludGluZyBtb2RlIChhcyBvZgotICAgKiAgIHZlcnNpb24gMi45KS4KKyAgICogICBUaGlzIGlzIGEgcGFzc2l2ZSBzZXR0aW5nIHRoYXQgb25seSB0YWtlcyBlZmZlY3QgaWYgdGhlIGZvbnQgZHJpdmVyIG9yCisgICAqICAgYXV0b2hpbnRlciBob25vcnMgaXQsIHdoaWNoIHRoZSBDRkYsIFR5cGV+MSwgYW5kIENJRCBkcml2ZXJzIGFsd2F5cworICAgKiAgIGRvLCBidXQgdGhlIGF1dG9oaW50ZXIgb25seSBpbiAnbGlnaHQnIGhpbnRpbmcgbW9kZSAoYXMgb2YgdmVyc2lvbgorICAgKiAgIDIuOSkuCiAgICAqCiAgICAqIEBzaW5jZToKICAgICogICAyLjgKQEAgLTE3NiwxOSArMTc0LDE5IEBACiAgICAgICAgICAgRlRfTUFLRV9UQUcoICdkJywgJ2EnLCAncicsICdrJyApCiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBjb25zdGFudDoKLSAgKiAgIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIERlcHJlY2F0ZWQsIG5vIGVmZmVjdC4KLSAgKgotICAqICAgUHJldmlvdXNseTogQSBjb25zdGFudCB1c2VkIGFzIHRoZSB0YWcgb2YgYW4gQEZUX1BhcmFtZXRlciBzdHJ1Y3R1cmUgdG8KLSAgKiAgIGluZGljYXRlIHRoYXQgdW5wYXRlbnRlZCBtZXRob2RzIG9ubHkgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIFRydWVUeXBlCi0gICogICBieXRlY29kZSBpbnRlcnByZXRlciBmb3IgYSB0eXBlZmFjZSBvcGVuZWQgYnkgQEZUX09wZW5fRmFjZS4KLSAgKgotICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgRGVwcmVjYXRlZCwgbm8gZWZmZWN0LgorICAgKgorICAgKiAgIFByZXZpb3VzbHk6IEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIGFuIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlCisgICAqICAgdG8gaW5kaWNhdGUgdGhhdCB1bnBhdGVudGVkIG1ldGhvZHMgb25seSBzaG91bGQgYmUgdXNlZCBieSB0aGUKKyAgICogICBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBmb3IgYSB0eXBlZmFjZSBvcGVuZWQgYnkgQEZUX09wZW5fRmFjZS4KKyAgICoKKyAgICovCiAjZGVmaW5lIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcgXAogICAgICAgICAgIEZUX01BS0VfVEFHKCAndScsICduJywgJ3AnLCAnYScgKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cGZyLmgKaW5kZXggYTY5Y2M0OC4uOWE1MzgzZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaApAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRwZnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFBGUi1zcGVjaWZpYyBkYXRhIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRwZnIuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUUEZSX0hfCiAjZGVmaW5lIEZUUEZSX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtMzIsNjAgKzMxLDYxIEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBmcl9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBGUiBGb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBGUi9UcnVlRG9jIHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgUEZSLXNwZWNpZmljIGZ1bmN0aW9ucy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBwZnJfZm9udHMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFBGUiBGb250cworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgUEZSL1RydWVEb2Mtc3BlY2lmaWMgQVBJLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBQRlItc3BlY2lmaWMgZnVuY3Rpb25zLgorICAgKgorICAgKi8KIAogCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIG91dGxpbmUgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbnMgb2YgYSBnaXZlbiBQRlIgZmFjZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4gIEl0IGNhbiBiZSBhIG5vbi1QRlIgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYW91dGxpbmVfcmVzb2x1dGlvbiA6OgotICAqICAgICAgT3V0bGluZSByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBmYWNlLT51bml0c19wZXJfRU0nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfcmVzb2x1dGlvbiA6OgotICAqICAgICAgTWV0cmljcyByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBvdXRsaW5lX3Jlc29sdXRpb24nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfeF9zY2FsZSA6OgotICAqICAgICAgQSAxNi4xNiBmaXhlZC1wb2ludCBudW1iZXIgdXNlZCB0byBzY2FsZSBkaXN0YW5jZSBleHByZXNzZWQKLSAgKiAgICAgIGluIG1ldHJpY3MgdW5pdHMgdG8gZGV2aWNlIHN1YnBpeGVscy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAqICAgICAgYGZhY2UtPnNpemUtPnhfc2NhbGUnLCBidXQgZm9yIG1ldHJpY3Mgb25seS4gIE9wdGlvbmFsIChwYXJhbWV0ZXIKLSAgKiAgICAgIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqICAgIGFtZXRyaWNzX3lfc2NhbGUgOjoKLSAgKiAgICAgIFNhbWUgYXMgYGFtZXRyaWNzX3hfc2NhbGUnIGJ1dCBmb3IgdGhlIHZlcnRpY2FsIGRpcmVjdGlvbi4KLSAgKiAgICAgIG9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBJZiB0aGUgaW5wdXQgZmFjZSBpcyBub3QgYSBQRlIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IuCi0gICogICBIb3dldmVyLCBpbiBhbGwgY2FzZXMsIGl0IHdpbGwgcmV0dXJuIHZhbGlkIHZhbHVlcy4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X1BGUl9NZXRyaWNzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0dXJuIHRoZSBvdXRsaW5lIGFuZCBtZXRyaWNzIHJlc29sdXRpb25zIG9mIGEgZ2l2ZW4gUEZSIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICAgZmFjZSA6OgorICAgKiAgICAgIEhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4gIEl0IGNhbiBiZSBhIG5vbi1QRlIgZmFjZS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICAgYW91dGxpbmVfcmVzb2x1dGlvbiA6OgorICAgKiAgICAgIE91dGxpbmUgcmVzb2x1dGlvbi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgZmFjZS0+dW5pdHNfcGVyX0VNYCBmb3IKKyAgICogICAgICBub24tUEZSIGZvbnRzLiAgT3B0aW9uYWwgKHBhcmFtZXRlciBjYW4gYmUgYE5VTExgKS4KKyAgICoKKyAgICogICAgYW1ldHJpY3NfcmVzb2x1dGlvbiA6OgorICAgKiAgICAgIE1ldHJpY3MgcmVzb2x1dGlvbi4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgb3V0bGluZV9yZXNvbHV0aW9uYCBmb3IKKyAgICogICAgICBub24tUEZSIGZvbnRzLiAgT3B0aW9uYWwgKHBhcmFtZXRlciBjYW4gYmUgYE5VTExgKS4KKyAgICoKKyAgICogICAgYW1ldHJpY3NfeF9zY2FsZSA6OgorICAgKiAgICAgIEEgMTYuMTYgZml4ZWQtcG9pbnQgbnVtYmVyIHVzZWQgdG8gc2NhbGUgZGlzdGFuY2UgZXhwcmVzc2VkIGluCisgICAqICAgICAgbWV0cmljcyB1bml0cyB0byBkZXZpY2Ugc3VicGl4ZWxzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAqICAgICAgYGZhY2UtPnNpemUtPnhfc2NhbGVgLCBidXQgZm9yIG1ldHJpY3Mgb25seS4gIE9wdGlvbmFsIChwYXJhbWV0ZXIKKyAgICogICAgICBjYW4gYmUgYE5VTExgKS4KKyAgICoKKyAgICogICAgYW1ldHJpY3NfeV9zY2FsZSA6OgorICAgKiAgICAgIFNhbWUgYXMgYGFtZXRyaWNzX3hfc2NhbGVgIGJ1dCBmb3IgdGhlIHZlcnRpY2FsIGRpcmVjdGlvbi4KKyAgICogICAgICBvcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBgTlVMTGApLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiB0aGUgaW5wdXQgZmFjZSBpcyBub3QgYSBQRlIsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IuCisgICAqICAgSG93ZXZlciwgaW4gYWxsIGNhc2VzLCBpdCB3aWxsIHJldHVybiB2YWxpZCB2YWx1ZXMuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X1BGUl9NZXRyaWNzKCBGVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphb3V0bGluZV9yZXNvbHV0aW9uLApAQCAtOTQsMzcgKzk0LDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICphbWV0cmljc195X3NjYWxlICk7CiAKIAotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X1BGUl9LZXJuaW5nCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0dXJuIHRoZSBrZXJuaW5nIHBhaXIgY29ycmVzcG9uZGluZyB0byB0d28gZ2x5cGhzIGluIGEgUEZSIGZhY2UuCi0gICogICAgVGhlIGRpc3RhbmNlIGlzIGV4cHJlc3NlZCBpbiBtZXRyaWNzIHVuaXRzLCB1bmxpa2UgdGhlIHJlc3VsdCBvZgotICAqICAgIEBGVF9HZXRfS2VybmluZy4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIGxlZnQgIDo6IEluZGV4IG9mIHRoZSBsZWZ0IGdseXBoLgotICAqCi0gICogICAgcmlnaHQgOjogSW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhdmVjdG9yIDo6IEEga2VybmluZyB2ZWN0b3IuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gZGlzdGFuY2VzIGluIG9yaWdpbmFsIFBGUiBtZXRyaWNzCi0gICogICAgdW5pdHMuICBUaGlzIGlzIHVubGlrZSBARlRfR2V0X0tlcm5pbmcgd2l0aCB0aGUgQEZUX0tFUk5JTkdfVU5TQ0FMRUQKLSAgKiAgICBtb2RlLCB3aGljaCBhbHdheXMgcmV0dXJucyBkaXN0YW5jZXMgY29udmVydGVkIHRvIG91dGxpbmUgdW5pdHMuCi0gICoKLSAgKiAgICBZb3UgY2FuIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGB4X3NjYWxlJyBhbmQgYHlfc2NhbGUnIHBhcmFtZXRlcnMKLSAgKiAgICByZXR1cm5lZCBieSBARlRfR2V0X1BGUl9NZXRyaWNzIHRvIHNjYWxlIHRoZXNlIHRvIGRldmljZSBzdWJwaXhlbHMuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgIEZUX0dldF9QRlJfS2VybmluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIFJldHVybiB0aGUga2VybmluZyBwYWlyIGNvcnJlc3BvbmRpbmcgdG8gdHdvIGdseXBocyBpbiBhIFBGUiBmYWNlLgorICAgKiAgICBUaGUgZGlzdGFuY2UgaXMgZXhwcmVzc2VkIGluIG1ldHJpY3MgdW5pdHMsIHVubGlrZSB0aGUgcmVzdWx0IG9mCisgICAqICAgIEBGVF9HZXRfS2VybmluZy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqICAgIGxlZnQgOjoKKyAgICogICAgICBJbmRleCBvZiB0aGUgbGVmdCBnbHlwaC4KKyAgICoKKyAgICogICAgcmlnaHQgOjoKKyAgICogICAgICBJbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGguCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgIGF2ZWN0b3IgOjoKKyAgICogICAgICBBIGtlcm5pbmcgdmVjdG9yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJuIGRpc3RhbmNlcyBpbiBvcmlnaW5hbCBQRlIgbWV0cmljcyB1bml0cy4KKyAgICogICAgVGhpcyBpcyB1bmxpa2UgQEZUX0dldF9LZXJuaW5nIHdpdGggdGhlIEBGVF9LRVJOSU5HX1VOU0NBTEVEIG1vZGUsCisgICAqICAgIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRpc3RhbmNlcyBjb252ZXJ0ZWQgdG8gb3V0bGluZSB1bml0cy4KKyAgICoKKyAgICogICAgWW91IGNhbiB1c2UgdGhlIHZhbHVlIG9mIHRoZSBgeF9zY2FsZWAgYW5kIGB5X3NjYWxlYCBwYXJhbWV0ZXJzCisgICAqICAgIHJldHVybmVkIGJ5IEBGVF9HZXRfUEZSX01ldHJpY3MgdG8gc2NhbGUgdGhlc2UgdG8gZGV2aWNlIHN1YnBpeGVscy4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfUEZSX0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKQEAgLTEzMiwzMCArMTM2LDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yICAqYXZlY3RvciApOwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9QRlJfQWR2YW5jZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHVybiBhIGdpdmVuIGdseXBoIGFkdmFuY2UsIGV4cHJlc3NlZCBpbiBvcmlnaW5hbCBtZXRyaWNzIHVuaXRzLAotICAqICAgIGZyb20gYSBQRlIgZm9udC4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4LgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBhYWR2YW5jZSA6OiBUaGUgZ2x5cGggYWR2YW5jZSBpbiBtZXRyaWNzIHVuaXRzLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICAgWW91IGNhbiB1c2UgdGhlIGB4X3NjYWxlJyBvciBgeV9zY2FsZScgcmVzdWx0cyBvZiBARlRfR2V0X1BGUl9NZXRyaWNzCi0gICogICAgdG8gY29udmVydCB0aGUgYWR2YW5jZSB0byBkZXZpY2Ugc3VicGl4ZWxzIChpLmUuLCAxLzY0dGggb2YgcGl4ZWxzKS4KLSAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICAgRlRfR2V0X1BGUl9BZHZhbmNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgUmV0dXJuIGEgZ2l2ZW4gZ2x5cGggYWR2YW5jZSwgZXhwcmVzc2VkIGluIG9yaWdpbmFsIG1ldHJpY3MgdW5pdHMsCisgICAqICAgIGZyb20gYSBQRlIgZm9udC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCisgICAqCisgICAqICAgIGdpbmRleCA6OgorICAgKiAgICAgIFRoZSBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICAgYWFkdmFuY2UgOjoKKyAgICogICAgICBUaGUgZ2x5cGggYWR2YW5jZSBpbiBtZXRyaWNzIHVuaXRzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICAgWW91IGNhbiB1c2UgdGhlIGB4X3NjYWxlYCBvciBgeV9zY2FsZWAgcmVzdWx0cyBvZiBARlRfR2V0X1BGUl9NZXRyaWNzCisgICAqICAgIHRvIGNvbnZlcnQgdGhlIGFkdmFuY2UgdG8gZGV2aWNlIHN1YnBpeGVscyAoaS5lLiwgMS82NHRoIG9mIHBpeGVscykuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X1BGUl9BZHZhbmNlKCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCmluZGV4IGZhOGFkMjIuLjgwMDc5NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRyZW5kZXIuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgKQEAgLTEsMzkgKzEsMzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0cmVuZGVyLmgKKyAqCisgKiAgIEZyZWVUeXBlIHJlbmRlcmVyIG1vZHVsZXMgcHVibGljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUUkVOREVSX0hfCiAjZGVmaW5lIEZUUkVOREVSX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIG1vZHVsZV9tYW5hZ2VtZW50CisgICAqCisgICAqLwogCiAKICAgLyogY3JlYXRlIGEgbmV3IGdseXBoIG9iamVjdCAqLwpAQCAtMTE2LDMyICsxMTUsMzggQEAKICNkZWZpbmUgRlRSZW5kZXJlcl9zZXRNb2RlICBGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXJfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbmRlcmVyIG1vZHVsZSBjbGFzcyBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgIDo6IFRoZSByb290IEBGVF9Nb2R1bGVfQ2xhc3MgZmllbGRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9mb3JtYXQgICAgOjogVGhlIGdseXBoIGltYWdlIGZvcm1hdCB0aGlzIHJlbmRlcmVyIGhhbmRsZXMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcl9nbHlwaCAgICA6OiBBIG1ldGhvZCB1c2VkIHRvIHJlbmRlciB0aGUgaW1hZ2UgdGhhdCBpcyBpbiBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZ2x5cGggc2xvdCBpbnRvIGEgYml0bWFwLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9nbHlwaCA6OiBBIG1ldGhvZCB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgaW1hZ2UgdGhhdCBpcyBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYSBnaXZlbiBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9nbHlwaF9jYm94ICA6OiBBIG1ldGhvZCB1c2VkIHRvIGFjY2VzcyB0aGUgZ2x5cGgncyBjYm94LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2V0X21vZGUgICAgICAgIDo6IEEgbWV0aG9kIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfY2xhc3MgICAgOjogRm9yIEBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSByZW5kZXJlcnMgb25seS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBwb2ludGVyIHRvIGl0cyByYXN0ZXIncyBjbGFzcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9SZW5kZXJlcl9DbGFzcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHJlbmRlcmVyIG1vZHVsZSBjbGFzcyBkZXNjcmlwdG9yLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHJvb3QgOjoKKyAgICogICAgIFRoZSByb290IEBGVF9Nb2R1bGVfQ2xhc3MgZmllbGRzLgorICAgKgorICAgKiAgIGdseXBoX2Zvcm1hdCA6OgorICAgKiAgICAgVGhlIGdseXBoIGltYWdlIGZvcm1hdCB0aGlzIHJlbmRlcmVyIGhhbmRsZXMuCisgICAqCisgICAqICAgcmVuZGVyX2dseXBoIDo6CisgICAqICAgICBBIG1ldGhvZCB1c2VkIHRvIHJlbmRlciB0aGUgaW1hZ2UgdGhhdCBpcyBpbiBhIGdpdmVuIGdseXBoIHNsb3QgaW50bworICAgKiAgICAgYSBiaXRtYXAuCisgICAqCisgICAqICAgdHJhbnNmb3JtX2dseXBoIDo6CisgICAqICAgICBBIG1ldGhvZCB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgaW1hZ2UgdGhhdCBpcyBpbiBhIGdpdmVuIGdseXBoIHNsb3QuCisgICAqCisgICAqICAgZ2V0X2dseXBoX2Nib3ggOjoKKyAgICogICAgIEEgbWV0aG9kIHVzZWQgdG8gYWNjZXNzIHRoZSBnbHlwaCdzIGNib3guCisgICAqCisgICAqICAgc2V0X21vZGUgOjoKKyAgICogICAgIEEgbWV0aG9kIHVzZWQgdG8gcGFzcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuCisgICAqCisgICAqICAgcmFzdGVyX2NsYXNzIDo6CisgICAqICAgICBGb3IgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIHJlbmRlcmVycyBvbmx5LiAgVGhpcyBpcyBhIHBvaW50ZXIgdG8KKyAgICogICAgIGl0cyByYXN0ZXIncyBjbGFzcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9SZW5kZXJlcl9DbGFzc18KICAgewogICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgIHJvb3Q7CkBAIC0xNTgsNjQgKzE2Myw3MCBAQAogICB9IEZUX1JlbmRlcmVyX0NsYXNzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIGEgZ2l2ZW4gZ2x5cGggZm9ybWF0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgIDo6IFRoZSBnbHlwaCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHJlbmRlcmVyIGhhbmRsZS4gIDB+aWYgbm9uZSBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgbW9kdWxlIGFscmVhZHkgZXhpc3RzIGJ5IHRoYXQgbmFtZSwgKi8KLSAgLyogICAgb3IgaWYgdGhlIG1vZHVsZSByZXF1aXJlcyBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBpcyB0b28gZ3JlYXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBhZGQgYSBuZXcgcmVuZGVyZXIsIHNpbXBseSB1c2UgQEZUX0FkZF9Nb2R1bGUuICBUbyByZXRyaWV2ZSBhICAgKi8KLSAgLyogICAgcmVuZGVyZXIgYnkgaXRzIG5hbWUsIHVzZSBARlRfR2V0X01vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9SZW5kZXJlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIGEgZ2l2ZW4gZ2x5cGggZm9ybWF0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiAgIGZvcm1hdCA6OgorICAgKiAgICAgVGhlIGdseXBoIGZvcm1hdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBIHJlbmRlcmVyIGhhbmRsZS4gIDB+aWYgbm9uZSBmb3VuZC4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIG1vZHVsZSBhbHJlYWR5IGV4aXN0cyBieSB0aGF0IG5hbWUsIG9yCisgICAqICAgaWYgdGhlIG1vZHVsZSByZXF1aXJlcyBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBpcyB0b28gZ3JlYXQuCisgICAqCisgICAqICAgVG8gYWRkIGEgbmV3IHJlbmRlcmVyLCBzaW1wbHkgdXNlIEBGVF9BZGRfTW9kdWxlLiAgVG8gcmV0cmlldmUgYQorICAgKiAgIHJlbmRlcmVyIGJ5IGl0cyBuYW1lLCB1c2UgQEZUX0dldF9Nb2R1bGUuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX1JlbmRlcmVyICkKICAgRlRfR2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhfRm9ybWF0ICBmb3JtYXQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgY3VycmVudCByZW5kZXJlciB0byB1c2UsIGFuZCBzZXQgYWRkaXRpb25hbCBtb2RlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcmVyICAgOjogQSBoYW5kbGUgdG8gdGhlIHJlbmRlcmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3BhcmFtcyA6OiBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXJhbWV0ZXJzIDo6IEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSByZW5kZXJlciB3aWxsIGJlIHVzZWQgdG8gY29udmVydCBnbHlwaCAgICAgKi8KLSAgLyogICAgaW1hZ2VzIGluIHRoZSByZW5kZXJlcidzIGtub3duIGZvcm1hdCBpbnRvIGJpdG1hcHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGRvZXNuJ3QgY2hhbmdlIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciBvdGhlciBmb3JtYXRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRseSwgbm8gRnJlZVR5cGUgcmVuZGVyZXIgbW9kdWxlIHVzZXMgYHBhcmFtZXRlcnMnOyB5b3UgICAgICAqLwotICAvKiAgICBzaG91bGQgdGh1cyBhbHdheXMgcGFzcyBOVUxMIGFzIHRoZSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfU2V0X1JlbmRlcmVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZXQgdGhlIGN1cnJlbnQgcmVuZGVyZXIgdG8gdXNlLCBhbmQgc2V0IGFkZGl0aW9uYWwgbW9kZS4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHJlbmRlcmVyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgcmVuZGVyZXIgb2JqZWN0LgorICAgKgorICAgKiAgIG51bV9wYXJhbXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgKgorICAgKiAgIHBhcmFtZXRlcnMgOjoKKyAgICogICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJbiBjYXNlIG9mIHN1Y2Nlc3MsIHRoZSByZW5kZXJlciB3aWxsIGJlIHVzZWQgdG8gY29udmVydCBnbHlwaCBpbWFnZXMKKyAgICogICBpbiB0aGUgcmVuZGVyZXIncyBrbm93biBmb3JtYXQgaW50byBiaXRtYXBzLgorICAgKgorICAgKiAgIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIG90aGVyIGZvcm1hdHMuCisgICAqCisgICAqICAgQ3VycmVudGx5LCBubyBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGUgdXNlcyBgcGFyYW1ldGVyc2A7IHlvdSBzaG91bGQKKyAgICogICB0aHVzIGFsd2F5cyBwYXNzIGBOVUxMYCBhcyB0aGUgdmFsdWUuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU2V0X1JlbmRlcmVyKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcmVyICAgIHJlbmRlcmVyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaAppbmRleCA3MmNiMDhiLi5hODY4MmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaApAQCAtMSwzNiArMSwzNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzaXplcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHNpemUgb2JqZWN0cyBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzaXplcy5oCisgKgorICogICBGcmVlVHlwZSBzaXplIG9iamVjdHMgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBub3QgbmVlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLiAgICovCi0gIC8qIEhvd2V2ZXIsIHRoZXkgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhIHB1YmxpYyBBUEkgZm9yIHRoZSByYXJlIGNhc2VzICAgICAqLwotICAvKiB3aGVyZSB0aGV5IGFyZSBuZWVkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVHlwaWNhbCBhcHBsaWNhdGlvbiB3b3VsZCBub3JtYWxseSBub3QgbmVlZCB0byB1c2UgdGhlc2UgZnVuY3Rpb25zLgorICAgKiBIb3dldmVyLCB0aGV5IGhhdmUgYmVlbiBwbGFjZWQgaW4gYSBwdWJsaWMgQVBJIGZvciB0aGUgcmFyZSBjYXNlcyB3aGVyZQorICAgKiB0aGV5IGFyZSBuZWVkZWQuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRTSVpFU19IXwogI2RlZmluZSBGVFNJWkVTX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC00MiwxMDkgKzQxLDExMCBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplc19tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaXplIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNYW5hZ2luZyBtdWx0aXBsZSBzaXplcyBwZXIgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIGNyZWF0aW5nIGEgbmV3IGZhY2Ugb2JqZWN0IChlLmcuLCB3aXRoIEBGVF9OZXdfRmFjZSksIGFuICAgICAgKi8KLSAgLyogICAgQEZUX1NpemUgb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBhbmQgdXNlZCB0byBzdG9yZSBhbGwgICAgICovCi0gIC8qICAgIHBpeGVsLXNpemUgZGVwZW5kZW50IGluZm9ybWF0aW9uLCBhdmFpbGFibGUgaW4gdGhlIGBmYWNlLT5zaXplJyAgICAqLwotICAvKiAgICBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGlzIGhvd2V2ZXIgcG9zc2libGUgdG8gY3JlYXRlIG1vcmUgc2l6ZXMgZm9yIGEgZ2l2ZW4gZmFjZSwgICAgICAqLwotICAvKiAgICBtb3N0bHkgaW4gb3JkZXIgdG8gbWFuYWdlIHNldmVyYWwgY2hhcmFjdGVyIHBpeGVsIHNpemVzIG9mIHRoZSAgICAgKi8KLSAgLyogICAgc2FtZSBmb250IGZhbWlseSBhbmQgc3R5bGUuICBTZWUgQEZUX05ld19TaXplIGFuZCBARlRfRG9uZV9TaXplLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgQEZUX1NldF9QaXhlbF9TaXplcyBhbmQgQEZUX1NldF9DaGFyX1NpemUgb25seSAgICAgICAgICAgKi8KLSAgLyogICAgbW9kaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBgYWN0aXZlJyBzaXplOyB5b3UgdGh1cyBuZWVkICAgICovCi0gIC8qICAgIHRvIHVzZSBARlRfQWN0aXZhdGVfU2l6ZSB0byBjaGFuZ2UgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgOTklIG9mIGFwcGxpY2F0aW9ucyB3b24ndCBuZWVkIHRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSwgICAgICAgICovCi0gIC8qICAgIGVzcGVjaWFsbHkgaWYgdGhleSB1c2UgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSwgc28gYmUgY2F1dGlvdXMgICAgICAqLwotICAvKiAgICB3aGVuIHVzaW5nIHRoZXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgc2l6ZXNfbWFuYWdlbWVudAorICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgU2l6ZSBNYW5hZ2VtZW50CisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBNYW5hZ2luZyBtdWx0aXBsZSBzaXplcyBwZXIgZmFjZS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgZmFjZSBvYmplY3QgKGUuZy4sIHdpdGggQEZUX05ld19GYWNlKSwgYW4gQEZUX1NpemUKKyAgICogICBvYmplY3QgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCB1c2VkIHRvIHN0b3JlIGFsbCBwaXhlbC1zaXplCisgICAqICAgZGVwZW5kZW50IGluZm9ybWF0aW9uLCBhdmFpbGFibGUgaW4gdGhlIGBmYWNlLT5zaXplYCBmaWVsZC4KKyAgICoKKyAgICogICBJdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIGNyZWF0ZSBtb3JlIHNpemVzIGZvciBhIGdpdmVuIGZhY2UsIG1vc3RseQorICAgKiAgIGluIG9yZGVyIHRvIG1hbmFnZSBzZXZlcmFsIGNoYXJhY3RlciBwaXhlbCBzaXplcyBvZiB0aGUgc2FtZSBmb250CisgICAqICAgZmFtaWx5IGFuZCBzdHlsZS4gIFNlZSBARlRfTmV3X1NpemUgYW5kIEBGVF9Eb25lX1NpemUuCisgICAqCisgICAqICAgTm90ZSB0aGF0IEBGVF9TZXRfUGl4ZWxfU2l6ZXMgYW5kIEBGVF9TZXRfQ2hhcl9TaXplIG9ubHkgbW9kaWZ5IHRoZQorICAgKiAgIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50ICdhY3RpdmUnIHNpemU7IHlvdSB0aHVzIG5lZWQgdG8gdXNlCisgICAqICAgQEZUX0FjdGl2YXRlX1NpemUgdG8gY2hhbmdlIGl0LgorICAgKgorICAgKiAgIDk5JSBvZiBhcHBsaWNhdGlvbnMgd29uJ3QgbmVlZCB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGhlcmUsIGVzcGVjaWFsbHkKKyAgICogICBpZiB0aGV5IHVzZSB0aGUgY2FjaGluZyBzdWItc3lzdGVtLCBzbyBiZSBjYXV0aW91cyB3aGVuIHVzaW5nIHRoZXNlLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBzaXplIG9iamVjdCBmcm9tIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzaXplIDo6IEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBuZWVkIHRvIGNhbGwgQEZUX0FjdGl2YXRlX1NpemUgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuZXcgc2l6ZSAqLwotICAvKiAgICBmb3IgdXBjb21pbmcgY2FsbHMgdG8gQEZUX1NldF9QaXhlbF9TaXplcywgQEZUX1NldF9DaGFyX1NpemUsICAgICAgKi8KLSAgLyogICAgQEZUX0xvYWRfR2x5cGgsIEBGVF9Mb2FkX0NoYXIsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19TaXplCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBDcmVhdGUgYSBuZXcgc2l6ZSBvYmplY3QgZnJvbSBhIGdpdmVuIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBwYXJlbnQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYXNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgbmV3IHNpemUgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFlvdSBuZWVkIHRvIGNhbGwgQEZUX0FjdGl2YXRlX1NpemUgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBuZXcgc2l6ZSBmb3IKKyAgICogICB1cGNvbWluZyBjYWxscyB0byBARlRfU2V0X1BpeGVsX1NpemVzLCBARlRfU2V0X0NoYXJfU2l6ZSwKKyAgICogICBARlRfTG9hZF9HbHlwaCwgQEZUX0xvYWRfQ2hhciwgZXRjLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX05ld19TaXplKCBGVF9GYWNlICAgZmFjZSwKICAgICAgICAgICAgICAgIEZUX1NpemUqICBzaXplICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICBOb3RlIHRoYXQgQEZUX0RvbmVfRmFjZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b21hdGljYWxseSBkaXNjYXJkcyBhbGwgc2l6ZSBvYmplY3RzIGFsbG9jYXRlZCB3aXRoICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfU2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9Eb25lX1NpemUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERpc2NhcmQgYSBnaXZlbiBzaXplIG9iamVjdC4gIE5vdGUgdGhhdCBARlRfRG9uZV9GYWNlIGF1dG9tYXRpY2FsbHkKKyAgICogICBkaXNjYXJkcyBhbGwgc2l6ZSBvYmplY3RzIGFsbG9jYXRlZCB3aXRoIEBGVF9OZXdfU2l6ZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfRG9uZV9TaXplKCBGVF9TaXplICBzaXplICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BY3RpdmF0ZV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFdmVuIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgc2V2ZXJhbCBzaXplIG9iamVjdHMgZm9yIGEgICAgKi8KLSAgLyogICAgZ2l2ZW4gZmFjZSAoc2VlIEBGVF9OZXdfU2l6ZSBmb3IgZGV0YWlscyksIGZ1bmN0aW9ucyBsaWtlICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoIG9yIEBGVF9Mb2FkX0NoYXIgb25seSB1c2UgdGhlIG9uZSB0aGF0IGhhcyBiZWVuICAgICAqLwotICAvKiAgICBhY3RpdmF0ZWQgbGFzdCB0byBkZXRlcm1pbmUgdGhlIGBjdXJyZW50IGNoYXJhY3RlciBwaXhlbCBzaXplJy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYGFjdGl2YXRlJyBhIHByZXZpb3VzbHkgY3JlYXRlZCBzaXplICAqLwotICAvKiAgICBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgZmFjZScgaXMgdGhlIHNpemUncyBwYXJlbnQgZmFjZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyAgKi8KLSAgLyogICAgdGhlIHZhbHVlIG9mIGBmYWNlLT5zaXplJyB0byB0aGUgaW5wdXQgc2l6ZSBoYW5kbGUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0FjdGl2YXRlX1NpemUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEV2ZW4gdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBzZXZlcmFsIHNpemUgb2JqZWN0cyBmb3IgYSBnaXZlbgorICAgKiAgIGZhY2UgKHNlZSBARlRfTmV3X1NpemUgZm9yIGRldGFpbHMpLCBmdW5jdGlvbnMgbGlrZSBARlRfTG9hZF9HbHlwaCBvcgorICAgKiAgIEBGVF9Mb2FkX0NoYXIgb25seSB1c2UgdGhlIG9uZSB0aGF0IGhhcyBiZWVuIGFjdGl2YXRlZCBsYXN0IHRvCisgICAqICAgZGV0ZXJtaW5lIHRoZSAnY3VycmVudCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZScuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byAnYWN0aXZhdGUnIGEgcHJldmlvdXNseSBjcmVhdGVkIHNpemUKKyAgICogICBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzaXplIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBJZiBgZmFjZWAgaXMgdGhlIHNpemUncyBwYXJlbnQgZmFjZSBvYmplY3QsIHRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUKKyAgICogICB2YWx1ZSBvZiBgZmFjZS0+c2l6ZWAgdG8gdGhlIGlucHV0IHNpemUgaGFuZGxlLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9FcnJvciApCiAgIEZUX0FjdGl2YXRlX1NpemUoIEZUX1NpemUgIHNpemUgKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oCmluZGV4IDhlYjhkNzAuLjcyOWU2YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgKQEAgLTEsMzEgKzEsMzAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c25hbWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW1wbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyBTRk5UIGBuYW1lJyB0YWJsZXMgKHdoaWNoIGFyZSB1c2VkICAgICAgICAqLwotLyogICAgdG8gaG9sZCBmb250IG5hbWVzLCBjb3B5cmlnaHQgaW5mbywgbm90aWNlcywgZXRjLikgKHNwZWNpZmljYXRpb24pLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGlzIF9ub3RfIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c25hbWVzLmgKKyAqCisgKiAgIFNpbXBsZSBpbnRlcmZhY2UgdG8gYWNjZXNzIFNGTlQgJ25hbWUnIHRhYmxlcyAod2hpY2ggYXJlIHVzZWQKKyAqICAgdG8gaG9sZCBmb250IG5hbWVzLCBjb3B5cmlnaHQgaW5mbywgbm90aWNlcywgZXRjLikgKHNwZWNpZmljYXRpb24pLgorICoKKyAqICAgVGhpcyBpcyBfbm90XyB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzIQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVFNOQU1FU19IXwogI2RlZmluZSBGVFNOQU1FU19IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfUEFSQU1FVEVSX1RBR1NfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRwYXJhbXMuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zNyw3MiArMzYsNzQgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2ZudF9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVCBOYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWNjZXNzIHRoZSBuYW1lcyBlbWJlZGRlZCBpbiBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZmlsZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBzcGVjaWZpY2F0aW9ucyBhbGxvdyB0aGUgaW5jbHVzaW9uIG9mICAgICovCi0gIC8qICAgIGEgc3BlY2lhbCBuYW1lcyB0YWJsZSAoYG5hbWUnKSBpbiBmb250IGZpbGVzLiAgVGhpcyB0YWJsZSBjb250YWlucyAqLwotICAvKiAgICB0ZXh0dWFsIChhbmQgaW50ZXJuYXRpb25hbGl6ZWQpIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZm9udCwgICAgKi8KLSAgLyogICAgbGlrZSBmYW1pbHkgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIHVzZWQgdG8gYWNjZXNzIHRoZW0gaWYgYXZhaWxhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBzZm50X25hbWVzCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBTRk5UIE5hbWVzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBBY2Nlc3MgdGhlIG5hbWVzIGVtYmVkZGVkIGluIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmaWxlcy4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBUcnVlVHlwZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMgYWxsb3cgdGhlIGluY2x1c2lvbiBvZiBhCisgICAqICAgc3BlY2lhbCBuYW1lcyB0YWJsZSAoJ25hbWUnKSBpbiBmb250IGZpbGVzLiAgVGhpcyB0YWJsZSBjb250YWlucworICAgKiAgIHRleHR1YWwgKGFuZCBpbnRlcm5hdGlvbmFsaXplZCkgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBmb250LCBsaWtlCisgICAqICAgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLgorICAgKgorICAgKiAgIFRoZSBkZWZpbml0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBhY2Nlc3MgdGhlbSBpZiBhdmFpbGFibGUuCisgICAqCisgICAqICAgTm90ZSB0aGF0IHRoaXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBnbHlwaCBuYW1lcyEKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50TmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGFuIFNGTlQgYG5hbWUnIHRhYmxlIGVudHJ5LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybV9pZCA6OiBUaGUgcGxhdGZvcm0gSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgU2VlIEBUVF9QTEFURk9STV9YWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ19pZCA6OiBUaGUgZW5jb2RpbmcgSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFgsIEBUVF9NQUNfSURfWFhYLCAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBUVF9JU09fSURfWFhYLCBAVFRfTVNfSURfWFhYLCBhbmQgQFRUX0FET0JFX0lEX1hYWCAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3IgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlX2lkIDo6IFRoZSBsYW5ndWFnZSBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBTZWUgQFRUX01BQ19MQU5HSURfWFhYIGFuZCBAVFRfTVNfTEFOR0lEX1hYWCBmb3IgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkIE9wZW5UeXBlIHZhbHVlcyBmb3IgYGxhbmd1YWdlX2lkJyBhcmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYWx3YXlzIHNtYWxsZXIgdGhhbiAweDgwMDA7IHZhbHVlcyBlcXVhbCBvciBsYXJnZXIgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoYW4gMHg4MDAwIHVzdWFsbHkgaW5kaWNhdGUgYSBsYW5ndWFnZSB0YWcgc3RyaW5nICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAoaW50cm9kdWNlZCBpbiBPcGVuVHlwZSB2ZXJzaW9uIDEuNikuICBVc2UgZnVuY3Rpb24gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQEZUX0dldF9TZm50X0xhbmdUYWcgd2l0aCBgbGFuZ3VhZ2VfaWQnIGFzIGl0cyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGxhbmd1YWdlIHRhZy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZV9pZCAgICAgOjogQW4gaWRlbnRpZmllciBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFNlZSBAVFRfTkFNRV9JRF9YWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nICAgICAgOjogVGhlIGBuYW1lJyBzdHJpbmcuICBOb3RlIHRoYXQgaXRzIGZvcm1hdCBkaWZmZXJzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGRlcGVuZGluZyBvbiB0aGUgKHBsYXRmb3JtLGVuY29kaW5nKSBwYWlyLCBiZWluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBlaXRoZXIgYSBzdHJpbmcgb2YgYnl0ZXMgKHdpdGhvdXQgYSB0ZXJtaW5hdGluZyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgTlVMTCBieXRlKSBvciBjb250YWluaW5nIFVURi0xNkJFIGVudGl0aWVzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdfbGVuICA6OiBUaGUgbGVuZ3RoIG9mIGBzdHJpbmcnIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIFRydWVUeXBlIG9yIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gZm9yIG1vcmUgICAgKi8KLSAgLyogICAgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TZm50TmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhbiBTRk5UICduYW1lJyB0YWJsZSBlbnRyeS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBwbGF0Zm9ybV9pZCA6OgorICAgKiAgICAgVGhlIHBsYXRmb3JtIElEIGZvciBgc3RyaW5nYC4gIFNlZSBAVFRfUExBVEZPUk1fWFhYIGZvciBwb3NzaWJsZQorICAgKiAgICAgdmFsdWVzLgorICAgKgorICAgKiAgIGVuY29kaW5nX2lkIDo6CisgICAqICAgICBUaGUgZW5jb2RpbmcgSUQgZm9yIGBzdHJpbmdgLiAgU2VlIEBUVF9BUFBMRV9JRF9YWFgsIEBUVF9NQUNfSURfWFhYLAorICAgKiAgICAgQFRUX0lTT19JRF9YWFgsIEBUVF9NU19JRF9YWFgsIGFuZCBAVFRfQURPQkVfSURfWFhYIGZvciBwb3NzaWJsZQorICAgKiAgICAgdmFsdWVzLgorICAgKgorICAgKiAgIGxhbmd1YWdlX2lkIDo6CisgICAqICAgICBUaGUgbGFuZ3VhZ2UgSUQgZm9yIGBzdHJpbmdgLiAgU2VlIEBUVF9NQUNfTEFOR0lEX1hYWCBhbmQKKyAgICogICAgIEBUVF9NU19MQU5HSURfWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisgICAqCisgICAqICAgICBSZWdpc3RlcmVkIE9wZW5UeXBlIHZhbHVlcyBmb3IgYGxhbmd1YWdlX2lkYCBhcmUgYWx3YXlzIHNtYWxsZXIgdGhhbgorICAgKiAgICAgMHg4MDAwOyB2YWx1ZXMgZXF1YWwgb3IgbGFyZ2VyIHRoYW4gMHg4MDAwIHVzdWFsbHkgaW5kaWNhdGUgYQorICAgKiAgICAgbGFuZ3VhZ2UgdGFnIHN0cmluZyAoaW50cm9kdWNlZCBpbiBPcGVuVHlwZSB2ZXJzaW9uIDEuNikuICBVc2UKKyAgICogICAgIGZ1bmN0aW9uIEBGVF9HZXRfU2ZudF9MYW5nVGFnIHdpdGggYGxhbmd1YWdlX2lkYCBhcyBpdHMgYXJndW1lbnQgdG8KKyAgICogICAgIHJldHJpZXZlIHRoZSBhc3NvY2lhdGVkIGxhbmd1YWdlIHRhZy4KKyAgICoKKyAgICogICBuYW1lX2lkIDo6CisgICAqICAgICBBbiBpZGVudGlmaWVyIGZvciBgc3RyaW5nYC4gIFNlZSBAVFRfTkFNRV9JRF9YWFggZm9yIHBvc3NpYmxlCisgICAqICAgICB2YWx1ZXMuCisgICAqCisgICAqICAgc3RyaW5nIDo6CisgICAqICAgICBUaGUgJ25hbWUnIHN0cmluZy4gIE5vdGUgdGhhdCBpdHMgZm9ybWF0IGRpZmZlcnMgZGVwZW5kaW5nIG9uIHRoZQorICAgKiAgICAgKHBsYXRmb3JtLGVuY29kaW5nKSBwYWlyLCBiZWluZyBlaXRoZXIgYSBzdHJpbmcgb2YgYnl0ZXMgKHdpdGhvdXQgYQorICAgKiAgICAgdGVybWluYXRpbmcgYE5VTExgIGJ5dGUpIG9yIGNvbnRhaW5pbmcgVVRGLTE2QkUgZW50aXRpZXMuCisgICAqCisgICAqICAgc3RyaW5nX2xlbiA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBvZiBgc3RyaW5nYCBpbiBieXRlcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgUGxlYXNlIHJlZmVyIHRvIHRoZSBUcnVlVHlwZSBvciBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlCisgICAqICAgZGV0YWlscy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9TZm50TmFtZV8KICAgewogICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1faWQ7CkBAIC0xMTYsODMgKzExNyw5NSBAQAogICB9IEZUX1NmbnROYW1lOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIG51bWJlciBvZiBuYW1lIHN0cmluZ3MgaW4gdGhlIFNGTlQgYG5hbWUnIHRhYmxlLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG51bWJlciBvZiBzdHJpbmdzIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9TZm50X05hbWVfQ291bnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgbmFtZSBzdHJpbmdzIGluIHRoZSBTRk5UICduYW1lJyB0YWJsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlICduYW1lJyB0YWJsZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgY29uZmlnIG1hY3JvCisgICAqICAgYFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FU2AgaXMgbm90IGRlZmluZWQgaW4gYGZ0b3B0aW9uLmhgLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9VSW50ICkKICAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggRlRfRmFjZSAgZmFjZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgYSBzdHJpbmcgb2YgdGhlIFNGTlQgYG5hbWUnIHRhYmxlIGZvciBhIGdpdmVuIGluZGV4LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICA6OiBUaGUgaW5kZXggb2YgdGhlIGBuYW1lJyBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbmFtZSA6OiBUaGUgaW5kZXhlZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYHN0cmluZycgYXJyYXkgcmV0dXJuZWQgaW4gdGhlIGBhbmFtZScgc3RydWN0dXJlIGlzIG5vdCAgICAgICAgKi8KLSAgLyogICAgbnVsbC10ZXJtaW5hdGVkLiAgTm90ZSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlYWxsb2NhdGUgYHN0cmluZycgICovCi0gIC8qICAgIGJ5IHlvdXJzZWxmOyBGcmVlVHlwZSB0YWtlcyBjYXJlIG9mIGl0IGlmIHlvdSBjYWxsIEBGVF9Eb25lX0ZhY2UuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9HZXRfU2ZudF9OYW1lX0NvdW50IHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSAgICovCi0gIC8qICAgIGBuYW1lJyB0YWJsZSBlbnRyaWVzLCB0aGVuIGRvIGEgbG9vcCB1bnRpbCB5b3UgZ2V0IHRoZSByaWdodCAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybSwgZW5jb2RpbmcsIGFuZCBuYW1lIElELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBuYW1lJyB0YWJsZSBmb3JtYXR+MSBlbnRyaWVzIGNhbiB1c2UgbGFuZ3VhZ2UgdGFncyBhbHNvLCBzZWUgICAgICAqLwotICAvKiAgICBARlRfR2V0X1NmbnRfTGFuZ1RhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X1NmbnRfTmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgYSBzdHJpbmcgb2YgdGhlIFNGTlQgJ25hbWUnIHRhYmxlIGZvciBhIGdpdmVuIGluZGV4LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAgKgorICAgKiAgIGlkeCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSAnbmFtZScgc3RyaW5nLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFuYW1lIDo6CisgICAqICAgICBUaGUgaW5kZXhlZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBgc3RyaW5nYCBhcnJheSByZXR1cm5lZCBpbiB0aGUgYGFuYW1lYCBzdHJ1Y3R1cmUgaXMgbm90CisgICAqICAgbnVsbC10ZXJtaW5hdGVkLiAgTm90ZSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlYWxsb2NhdGUgYHN0cmluZ2AgYnkKKyAgICogICB5b3Vyc2VsZjsgRnJlZVR5cGUgdGFrZXMgY2FyZSBvZiBpdCBpZiB5b3UgY2FsbCBARlRfRG9uZV9GYWNlLgorICAgKgorICAgKiAgIFVzZSBARlRfR2V0X1NmbnRfTmFtZV9Db3VudCB0byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBhdmFpbGFibGUKKyAgICogICAnbmFtZScgdGFibGUgZW50cmllcywgdGhlbiBkbyBhIGxvb3AgdW50aWwgeW91IGdldCB0aGUgcmlnaHQgcGxhdGZvcm0sCisgICAqICAgZW5jb2RpbmcsIGFuZCBuYW1lIElELgorICAgKgorICAgKiAgICduYW1lJyB0YWJsZSBmb3JtYXR+MSBlbnRyaWVzIGNhbiB1c2UgbGFuZ3VhZ2UgdGFncyBhbHNvLCBzZWUKKyAgICogICBARlRfR2V0X1NmbnRfTGFuZ1RhZy4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjb25maWcgbWFjcm8KKyAgICogICBgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTYCBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAuCisgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2V0X1NmbnRfTmFtZSggRlRfRmFjZSAgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudE5hbWUgICphbmFtZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2ZudExhbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBsYW5ndWFnZSB0YWcgZW50cnkgZnJvbSBhbiBTRk5UIGBuYW1lJyAgICAgICovCi0gIC8qICAgIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZyAgICAgIDo6IFRoZSBsYW5ndWFnZSB0YWcgc3RyaW5nLCBlbmNvZGVkIGluIFVURi0xNkJFICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAod2l0aG91dCB0cmFpbGluZyBOVUxMIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ19sZW4gIDo6IFRoZSBsZW5ndGggb2YgYHN0cmluZycgaW4gKmJ5dGVzKi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZSAgICAqLwotICAvKiAgICBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX1NmbnRMYW5nVGFnCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIGxhbmd1YWdlIHRhZyBlbnRyeSBmcm9tIGFuIFNGTlQgJ25hbWUnIHRhYmxlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHN0cmluZyA6OgorICAgKiAgICAgVGhlIGxhbmd1YWdlIHRhZyBzdHJpbmcsIGVuY29kZWQgaW4gVVRGLTE2QkUgKHdpdGhvdXQgdHJhaWxpbmcKKyAgICogICAgIGBOVUxMYCBieXRlcykuCisgICAqCisgICAqICAgc3RyaW5nX2xlbiA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBvZiBgc3RyaW5nYCBpbiAqKmJ5dGVzKiouCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgbW9yZQorICAgKiAgIGRldGFpbHMuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjgKKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9TZm50TGFuZ1RhZ18KICAgewogICAgIEZUX0J5dGUqICBzdHJpbmc7ICAgICAgLyogdGhpcyBzdHJpbmcgaXMgKm5vdCogbnVsbC10ZXJtaW5hdGVkISAqLwpAQCAtMjAxLDQxICsyMTQsNDcgQEAKICAgfSBGVF9TZm50TGFuZ1RhZzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X0xhbmdUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBsYW5ndWFnZSB0YWcgYXNzb2NpYXRlZCB3aXRoIGEgbGFuZ3VhZ2UgSUQgb2YgYW4gU0ZOVCAqLwotICAvKiAgICBgbmFtZScgdGFibGUgZW50cnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmdJRCAgIDo6IFRoZSBsYW5ndWFnZSBJRCwgYXMgcmV0dXJuZWQgYnkgQEZUX0dldF9TZm50X05hbWUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBUaGlzIGlzIGFsd2F5cyBhIHZhbHVlIGxhcmdlciB0aGFuIDB4ODAwMC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGFuZ1RhZyA6OiBUaGUgbGFuZ3VhZ2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgYG5hbWUnIHRhYmxlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgZW50cnkncyBsYW5ndWFnZSBJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGBzdHJpbmcnIGFycmF5IHJldHVybmVkIGluIHRoZSBgYWxhbmdUYWcnIHN0cnVjdHVyZSBpcyBub3QgICAgICovCi0gIC8qICAgIG51bGwtdGVybWluYXRlZC4gIE5vdGUgdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byBkZWFsbG9jYXRlIGBzdHJpbmcnICAqLwotICAvKiAgICBieSB5b3Vyc2VsZjsgRnJlZVR5cGUgdGFrZXMgY2FyZSBvZiBpdCBpZiB5b3UgY2FsbCBARlRfRG9uZV9GYWNlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgYG5hbWUnIHRhYmxlIGZvcm1hdH4xIHN1cHBvcnRzIGxhbmd1YWdlIHRhZ3MuICBGb3IgZm9ybWF0fjAgICAqLwotICAvKiAgICB0YWJsZXMsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgRlRfRXJyX0ludmFsaWRfVGFibGUuICBGb3IgICAgKi8KLSAgLyogICAgaW52YWxpZCBmb3JtYXR+MSBsYW5ndWFnZSBJRCB2YWx1ZXMsIEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50IGlzICAgICovCi0gIC8qICAgIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfU2ZudF9MYW5nVGFnCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXRyaWV2ZSB0aGUgbGFuZ3VhZ2UgdGFnIGFzc29jaWF0ZWQgd2l0aCBhIGxhbmd1YWdlIElEIG9mIGFuIFNGTlQKKyAgICogICAnbmFtZScgdGFibGUgZW50cnkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCisgICAqCisgICAqICAgbGFuZ0lEIDo6CisgICAqICAgICBUaGUgbGFuZ3VhZ2UgSUQsIGFzIHJldHVybmVkIGJ5IEBGVF9HZXRfU2ZudF9OYW1lLiAgVGhpcyBpcyBhbHdheXMgYQorICAgKiAgICAgdmFsdWUgbGFyZ2VyIHRoYW4gMHg4MDAwLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFsYW5nVGFnIDo6CisgICAqICAgICBUaGUgbGFuZ3VhZ2UgdGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ25hbWUnIHRhYmxlIGVudHJ5J3MgbGFuZ3VhZ2UKKyAgICogICAgIElELgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBgc3RyaW5nYCBhcnJheSByZXR1cm5lZCBpbiB0aGUgYGFsYW5nVGFnYCBzdHJ1Y3R1cmUgaXMgbm90CisgICAqICAgbnVsbC10ZXJtaW5hdGVkLiAgTm90ZSB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRlYWxsb2NhdGUgYHN0cmluZ2AgYnkKKyAgICogICB5b3Vyc2VsZjsgRnJlZVR5cGUgdGFrZXMgY2FyZSBvZiBpdCBpZiB5b3UgY2FsbCBARlRfRG9uZV9GYWNlLgorICAgKgorICAgKiAgIE9ubHkgJ25hbWUnIHRhYmxlIGZvcm1hdH4xIHN1cHBvcnRzIGxhbmd1YWdlIHRhZ3MuICBGb3IgZm9ybWF0fjAKKyAgICogICB0YWJsZXMsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgRlRfRXJyX0ludmFsaWRfVGFibGUuICBGb3IKKyAgICogICBpbnZhbGlkIGZvcm1hdH4xIGxhbmd1YWdlIElEIHZhbHVlcywgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQgaXMKKyAgICogICByZXR1cm5lZC4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjb25maWcgbWFjcm8KKyAgICogICBgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTYCBpcyBub3QgZGVmaW5lZCBpbiBgZnRvcHRpb24uaGAuCisgICAqCisgICAqIEBzaW5jZToKKyAgICogICAyLjgKKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9HZXRfU2ZudF9MYW5nVGFnKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgbGFuZ0lELApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oCmluZGV4IDQ0YjZmYmUuLmE3NTljOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3Ryb2tlLmgKQEAgLTEsMTQyICsxLDEzNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdHJva2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHBhdGggc3Ryb2tlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzdHJva2UuaAorICoKKyAqICAgRnJlZVR5cGUgcGF0aCBzdHJva2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRTVFJPS0VfSF8KICNkZWZpbmUgRlRTVFJPS0VfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0dMWVBIX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc2VjdGlvbjoKLSAgKiAgICBnbHlwaF9zdHJva2VyCi0gICoKLSAgKiBAdGl0bGU6Ci0gICogICAgR2x5cGggU3Ryb2tlcgotICAqCi0gICogQGFic3RyYWN0OgotICAqICAgIEdlbmVyYXRpbmcgYm9yZGVyZWQgYW5kIHN0cm9rZWQgZ2x5cGhzLgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgY29tcG9uZW50IGdlbmVyYXRlcyBzdHJva2VkIG91dGxpbmVzIG9mIGEgZ2l2ZW4gdmVjdG9yaWFsCi0gICogICAgZ2x5cGguICBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGBvdXRzaWRlJyBhbmQvb3IgdGhlCi0gICogICAgYGluc2lkZScgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgotICAqCi0gICogICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGdlbmVyYXRlIGBib3JkZXJlZCcgZ2x5cGgsIGkuZS4sIGdseXBocwotICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3VyZWQgKGFuZCBhbnRpLWFsaWFzZWQpIGJvcmRlciBhcm91bmQgdGhlaXIKLSAgKiAgICBzaGFwZS4KLSAgKgotICAqIEBvcmRlcjoKLSAgKiAgICBGVF9TdHJva2VyCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVKb2luCi0gICogICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCi0gICogICAgRlRfU3Ryb2tlckJvcmRlcgotICAqCi0gICogICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKLSAgKiAgICBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIKLSAgKgotICAqICAgIEZUX0dseXBoX1N0cm9rZQotICAqICAgIEZUX0dseXBoX1N0cm9rZUJvcmRlcgotICAqCi0gICogICAgRlRfU3Ryb2tlcl9OZXcKLSAgKiAgICBGVF9TdHJva2VyX1NldAotICAqICAgIEZUX1N0cm9rZXJfUmV3aW5kCi0gICogICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgKiAgICBGVF9TdHJva2VyX0RvbmUKLSAgKgotICAqICAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCi0gICogICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVUbwotICAqICAgIEZUX1N0cm9rZXJfQ29uaWNUbwotICAqICAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAqCi0gICogICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgKiAgICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgotICAqICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCi0gICogICAgRlRfU3Ryb2tlcl9FeHBvcnQKLSAgKgotICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgIGdseXBoX3N0cm9rZXIKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgICBHbHlwaCBTdHJva2VyCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICAgR2VuZXJhdGluZyBib3JkZXJlZCBhbmQgc3Ryb2tlZCBnbHlwaHMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgVGhpcyBjb21wb25lbnQgZ2VuZXJhdGVzIHN0cm9rZWQgb3V0bGluZXMgb2YgYSBnaXZlbiB2ZWN0b3JpYWwgZ2x5cGguCisgICAqICAgIEl0IGFsc28gYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgJ291dHNpZGUnIGFuZC9vciB0aGUgJ2luc2lkZScKKyAgICogICAgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgorICAgKgorICAgKiAgICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gZ2VuZXJhdGUgJ2JvcmRlcmVkJyBnbHlwaCwgaS5lLiwgZ2x5cGhzCisgICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3JlZCAoYW5kIGFudGktYWxpYXNlZCkgYm9yZGVyIGFyb3VuZCB0aGVpcgorICAgKiAgICBzaGFwZS4KKyAgICoKKyAgICogQG9yZGVyOgorICAgKiAgICBGVF9TdHJva2VyCisgICAqCisgICAqICAgIEZUX1N0cm9rZXJfTGluZUpvaW4KKyAgICogICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCisgICAqICAgIEZUX1N0cm9rZXJCb3JkZXIKKyAgICoKKyAgICogICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKKyAgICogICAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyCisgICAqCisgICAqICAgIEZUX0dseXBoX1N0cm9rZQorICAgKiAgICBGVF9HbHlwaF9TdHJva2VCb3JkZXIKKyAgICoKKyAgICogICAgRlRfU3Ryb2tlcl9OZXcKKyAgICogICAgRlRfU3Ryb2tlcl9TZXQKKyAgICogICAgRlRfU3Ryb2tlcl9SZXdpbmQKKyAgICogICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKKyAgICogICAgRlRfU3Ryb2tlcl9Eb25lCisgICAqCisgICAqICAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCisgICAqICAgIEZUX1N0cm9rZXJfRW5kU3ViUGF0aAorICAgKgorICAgKiAgICBGVF9TdHJva2VyX0xpbmVUbworICAgKiAgICBGVF9TdHJva2VyX0NvbmljVG8KKyAgICogICAgRlRfU3Ryb2tlcl9DdWJpY1RvCisgICAqCisgICAqICAgIEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzCisgICAqICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyCisgICAqICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCisgICAqICAgIEZUX1N0cm9rZXJfRXhwb3J0CisgICAqCisgICAqLwogCiAKLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEB0eXBlOgotICAqICAgRlRfU3Ryb2tlcgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BhcXVlIGhhbmRsZSB0byBhIHBhdGggc3Ryb2tlciBvYmplY3QuCi0gICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9TdHJva2VyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBPcGFxdWUgaGFuZGxlIHRvIGEgcGF0aCBzdHJva2VyIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IEZUX1N0cm9rZXJSZWNfKiAgRlRfU3Ryb2tlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgRlRfU3Ryb2tlcl9MaW5lSm9pbgogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGRldGVybWluZSBob3cgdHdvIGpvaW5pbmcgbGluZXMgYXJlIHJlbmRlcmVkCi0gICAqICAgaW4gYSBzdHJva2VyLgorICAgKiAgIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgaG93IHR3byBqb2luaW5nIGxpbmVzIGFyZSByZW5kZXJlZCBpbiBhCisgICAqICAgc3Ryb2tlci4KICAgICoKICAgICogQHZhbHVlczoKICAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5EIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciByb3VuZGVkIGxpbmUgam9pbnMuICBDaXJjdWxhciBhcmNzIGFyZSB1c2VkCi0gICAqICAgICB0byBqb2luIHR3byBsaW5lcyBzbW9vdGhseS4KKyAgICogICAgIFVzZWQgdG8gcmVuZGVyIHJvdW5kZWQgbGluZSBqb2lucy4gIENpcmN1bGFyIGFyY3MgYXJlIHVzZWQgdG8gam9pbgorICAgKiAgICAgdHdvIGxpbmVzIHNtb290aGx5LgogICAgKgogICAgKiAgIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgOjoKLSAgICogICAgIFVzZWQgdG8gcmVuZGVyIGJldmVsZWQgbGluZSBqb2lucy4gIFRoZSBvdXRlciBjb3JuZXIgb2YKLSAgICogICAgIHRoZSBqb2luZWQgbGluZXMgaXMgZmlsbGVkIGJ5IGVuY2xvc2luZyB0aGUgdHJpYW5ndWxhcgotICAgKiAgICAgcmVnaW9uIG9mIHRoZSBjb3JuZXIgd2l0aCBhIHN0cmFpZ2h0IGxpbmUgYmV0d2VlbiB0aGUKLSAgICogICAgIG91dGVyIGNvcm5lcnMgb2YgZWFjaCBzdHJva2UuCisgICAqICAgICBVc2VkIHRvIHJlbmRlciBiZXZlbGVkIGxpbmUgam9pbnMuICBUaGUgb3V0ZXIgY29ybmVyIG9mIHRoZSBqb2luZWQKKyAgICogICAgIGxpbmVzIGlzIGZpbGxlZCBieSBlbmNsb3NpbmcgdGhlIHRyaWFuZ3VsYXIgcmVnaW9uIG9mIHRoZSBjb3JuZXIKKyAgICogICAgIHdpdGggYSBzdHJhaWdodCBsaW5lIGJldHdlZW4gdGhlIG91dGVyIGNvcm5lcnMgb2YgZWFjaCBzdHJva2UuCiAgICAqCiAgICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgbWl0ZXJlZCBsaW5lIGpvaW5zLCB3aXRoIGZpeGVkIGJldmVscyBpZiB0aGUKLSAgICogICAgIG1pdGVyIGxpbWl0IGlzIGV4Y2VlZGVkLiAgVGhlIG91dGVyIGVkZ2VzIG9mIHRoZSBzdHJva2VzCi0gICAqICAgICBmb3IgdGhlIHR3byBzZWdtZW50cyBhcmUgZXh0ZW5kZWQgdW50aWwgdGhleSBtZWV0IGF0IGFuCi0gICAqICAgICBhbmdsZS4gIElmIHRoZSBzZWdtZW50cyBtZWV0IGF0IHRvbyBzaGFycCBhbiBhbmdsZSAoc3VjaAotICAgKiAgICAgdGhhdCB0aGUgbWl0ZXIgd291bGQgZXh0ZW5kIGZyb20gdGhlIGludGVyc2VjdGlvbiBvZiB0aGUKLSAgICogICAgIHNlZ21lbnRzIGEgZGlzdGFuY2UgZ3JlYXRlciB0aGFuIHRoZSBwcm9kdWN0IG9mIHRoZSBtaXRlcgotICAgKiAgICAgbGltaXQgdmFsdWUgYW5kIHRoZSBib3JkZXIgcmFkaXVzKSwgdGhlbiBhIGJldmVsIGpvaW4gKHNlZQotICAgKiAgICAgYWJvdmUpIGlzIHVzZWQgaW5zdGVhZC4gIFRoaXMgcHJldmVudHMgbG9uZyBzcGlrZXMgYmVpbmcKLSAgICogICAgIGNyZWF0ZWQuICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIGdlbmVyYXRlcyBhIG1pdGVyCi0gICAqICAgICBsaW5lIGpvaW4gYXMgdXNlZCBpbiBQb3N0U2NyaXB0IGFuZCBQREYuCisgICAqICAgICBVc2VkIHRvIHJlbmRlciBtaXRlcmVkIGxpbmUgam9pbnMsIHdpdGggZml4ZWQgYmV2ZWxzIGlmIHRoZSBtaXRlcgorICAgKiAgICAgbGltaXQgaXMgZXhjZWVkZWQuICBUaGUgb3V0ZXIgZWRnZXMgb2YgdGhlIHN0cm9rZXMgZm9yIHRoZSB0d28KKyAgICogICAgIHNlZ21lbnRzIGFyZSBleHRlbmRlZCB1bnRpbCB0aGV5IG1lZXQgYXQgYW4gYW5nbGUuICBBIGJldmVsIGpvaW4KKyAgICogICAgIChzZWUgYWJvdmUpIGlzIHVzZWQgaWYgdGhlIHNlZ21lbnRzIG1lZXQgYXQgdG9vIHNoYXJwIGFuIGFuZ2xlIGFuZAorICAgKiAgICAgdGhlIG91dGVyIGVkZ2VzIG1lZXQgYmV5b25kIGEgZGlzdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0ZXIKKyAgICogICAgIGxpbWl0LiAgVGhpcyBwcmV2ZW50cyBsb25nIHNwaWtlcyBiZWluZyBjcmVhdGVkLgorICAgKiAgICAgYEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRURgIGdlbmVyYXRlcyBhIG1pdGVyIGxpbmUgam9pbiBhcworICAgKiAgICAgdXNlZCBpbiBQb3N0U2NyaXB0IGFuZCBQREYuCiAgICAqCiAgICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSA6OgogICAgKiAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIgOjoKLSAgICogICAgIFVzZWQgdG8gcmVuZGVyIG1pdGVyZWQgbGluZSBqb2lucywgd2l0aCB2YXJpYWJsZSBiZXZlbHMgaWYKLSAgICogICAgIHRoZSBtaXRlciBsaW1pdCBpcyBleGNlZWRlZC4gIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlCi0gICAqICAgICBzdHJva2VzIGlzIGNsaXBwZWQgYXQgYSBsaW5lIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGJpc2VjdG9yCi0gICAqICAgICBvZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgc3Ryb2tlcywgYXQgdGhlIGRpc3RhbmNlIGZyb20gdGhlCi0gICAqICAgICBpbnRlcnNlY3Rpb24gb2YgdGhlIHNlZ21lbnRzIGVxdWFsIHRvIHRoZSBwcm9kdWN0IG9mIHRoZQotICAgKiAgICAgbWl0ZXIgbGltaXQgdmFsdWUgYW5kIHRoZSBib3JkZXIgcmFkaXVzLiAgVGhpcyBwcmV2ZW50cwotICAgKiAgICAgbG9uZyBzcGlrZXMgYmVpbmcgY3JlYXRlZC4KLSAgICogICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgZ2VuZXJhdGVzIGEgbWl0ZXJlZCBsaW5lCi0gICAqICAgICBqb2luIGFzIHVzZWQgaW4gWFBTLiAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiBpcyBhbiBhbGlhcwotICAgKiAgICAgZm9yIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUsIHJldGFpbmVkIGZvcgotICAgKiAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKyAgICogICAgIFVzZWQgdG8gcmVuZGVyIG1pdGVyZWQgbGluZSBqb2lucywgd2l0aCB2YXJpYWJsZSBiZXZlbHMgaWYgdGhlIG1pdGVyCisgICAqICAgICBsaW1pdCBpcyBleGNlZWRlZC4gIFRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHN0cm9rZXMgaXMgY2xpcHBlZAorICAgKiAgICAgcGVycGVuZGljdWxhcmx5IHRvIHRoZSBiaXNlY3RvciwgYXQgYSBkaXN0YW5jZSBjb3JyZXNwb25kaW5nIHRvCisgICAqICAgICB0aGUgbWl0ZXIgbGltaXQuIFRoaXMgcHJldmVudHMgbG9uZyBzcGlrZXMgYmVpbmcgY3JlYXRlZC4KKyAgICogICAgIGBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFYCBnZW5lcmF0ZXMgYSBtaXRlcmVkIGxpbmUgam9pbgorICAgKiAgICAgYXMgdXNlZCBpbiBYUFMuICBgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUmAgaXMgYW4gYWxpYXMgZm9yCisgICAqICAgICBgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRWAsIHJldGFpbmVkIGZvciBiYWNrd2FyZAorICAgKiAgICAgY29tcGF0aWJpbGl0eS4KICAgICovCiAgIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lSm9pbl8KICAgewpAQCAtMTQ5LDI3ICsxNDIsMjUgQEAKICAgfSBGVF9TdHJva2VyX0xpbmVKb2luOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZW51bToKICAgICogICBGVF9TdHJva2VyX0xpbmVDYXAKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHZhbHVlcyBkZXRlcm1pbmUgaG93IHRoZSBlbmQgb2Ygb3BlbmVkIHN1Yi1wYXRocyBhcmUKLSAgICogICByZW5kZXJlZCBpbiBhIHN0cm9rZS4KKyAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0aGUgZW5kIG9mIG9wZW5lZCBzdWItcGF0aHMgYXJlIHJlbmRlcmVkIGluCisgICAqICAgYSBzdHJva2UuCiAgICAqCiAgICAqIEB2YWx1ZXM6CiAgICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBmdWxsIHN0b3Agb24gdGhlIGxhc3QKLSAgICogICAgIHBvaW50IGl0c2VsZi4KKyAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBmdWxsIHN0b3Agb24gdGhlIGxhc3QgcG9pbnQKKyAgICogICAgIGl0c2VsZi4KICAgICoKICAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQgOjoKLSAgICogICAgIFRoZSBlbmQgb2YgbGluZXMgaXMgcmVuZGVyZWQgYXMgYSBoYWxmLWNpcmNsZSBhcm91bmQgdGhlCi0gICAqICAgICBsYXN0IHBvaW50LgorICAgKiAgICAgVGhlIGVuZCBvZiBsaW5lcyBpcyByZW5kZXJlZCBhcyBhIGhhbGYtY2lyY2xlIGFyb3VuZCB0aGUgbGFzdCBwb2ludC4KICAgICoKICAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUKLSAgICogICAgIGxhc3QgcG9pbnQuCisgICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUgbGFzdCBwb2ludC4KICAgICovCiAgIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lQ2FwXwogICB7CkBAIC0xODAsMTQgKzE3MSwxNCBAQAogICB9IEZUX1N0cm9rZXJfTGluZUNhcDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgRlRfU3Ryb2tlckJvcmRlcgogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdpdmVuIHN0cm9rZSBib3JkZXIKLSAgICogICBpbiBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydEJvcmRlci4KKyAgICogICBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gc2VsZWN0IGEgZ2l2ZW4gc3Ryb2tlIGJvcmRlciBpbgorICAgKiAgIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyBhbmQgQEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyLgogICAgKgogICAgKiBAdmFsdWVzOgogICAgKiAgIEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgOjoKQEAgLTE5Nyw5ICsxODgsOSBAQAogICAgKiAgICAgU2VsZWN0IHRoZSByaWdodCBib3JkZXIsIHJlbGF0aXZlIHRvIHRoZSBkcmF3aW5nIGRpcmVjdGlvbi4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgQXBwbGljYXRpb25zIGFyZSBnZW5lcmFsbHkgaW50ZXJlc3RlZCBpbiB0aGUgYGluc2lkZScgYW5kIGBvdXRzaWRlJworICAgKiAgIEFwcGxpY2F0aW9ucyBhcmUgZ2VuZXJhbGx5IGludGVyZXN0ZWQgaW4gdGhlICdpbnNpZGUnIGFuZCAnb3V0c2lkZScKICAgICogICBib3JkZXJzLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gZGlyZWN0IG1hcHBpbmcgYmV0d2VlbiB0aGVzZSBhbmQgdGhlCi0gICAqICAgYGxlZnQnIGFuZCBgcmlnaHQnIG9uZXMsIHNpbmNlIHRoaXMgcmVhbGx5IGRlcGVuZHMgb24gdGhlIGdseXBoJ3MKKyAgICogICAnbGVmdCcgYW5kICdyaWdodCcgb25lcywgc2luY2UgdGhpcyByZWFsbHkgZGVwZW5kcyBvbiB0aGUgZ2x5cGgncwogICAgKiAgIGRyYXdpbmcgb3JpZW50YXRpb24sIHdoaWNoIHZhcmllcyBiZXR3ZWVuIGZvbnQgZm9ybWF0cy4KICAgICoKICAgICogICBZb3UgY2FuIGhvd2V2ZXIgdXNlIEBGVF9PdXRsaW5lX0dldEluc2lkZUJvcmRlciBhbmQKQEAgLTIxMywxNCArMjA0LDE0IEBACiAgIH0gRlRfU3Ryb2tlckJvcmRlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgaW5zaWRlJyBib3JkZXJzIG9mIGEgZ2l2ZW4gb3V0bGluZS4KKyAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgJ2luc2lkZScKKyAgICogICBib3JkZXJzIG9mIGEgZ2l2ZW4gb3V0bGluZS4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgIG91dGxpbmUgOjoKQEAgLTIzNCwxNCArMjI1LDE0IEBACiAgIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgb3V0c2lkZScgYm9yZGVycyBvZiBhIGdpdmVuIG91dGxpbmUuCisgICAqICAgUmV0cmlldmUgdGhlIEBGVF9TdHJva2VyQm9yZGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlICdvdXRzaWRlJworICAgKiAgIGJvcmRlcnMgb2YgYSBnaXZlbiBvdXRsaW5lLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgb3V0bGluZSA6OgpAQCAtMjU1LDcgKzI0Niw3IEBACiAgIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1N0cm9rZXJfTmV3CkBAIC0yNjksNyArMjYwLDcgQEAKICAgICoKICAgICogQG91dHB1dDoKICAgICogICBhc3Ryb2tlciA6OgotICAgKiAgICAgQSBuZXcgc3Ryb2tlciBvYmplY3QgaGFuZGxlLiAgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICAgKiAgICAgQSBuZXcgc3Ryb2tlciBvYmplY3QgaGFuZGxlLiAgYE5VTExgIGluIGNhc2Ugb2YgZXJyb3IuCiAgICAqCiAgICAqIEByZXR1cm46CiAgICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCkBAIC0yNzksNyArMjcwLDcgQEAKICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXIgICphc3Ryb2tlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfU3Ryb2tlcl9TZXQKQEAgLTMwMSwxNCArMjkyLDE4IEBACiAgICAqICAgICBUaGUgbGluZSBqb2luIHN0eWxlLgogICAgKgogICAgKiAgIG1pdGVyX2xpbWl0IDo6Ci0gICAqICAgICBUaGUgbWl0ZXIgbGltaXQgZm9yIHRoZSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIGFuZAotICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBsaW5lIGpvaW4gc3R5bGVzLAotICAgKiAgICAgZXhwcmVzc2VkIGFzIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlLgorICAgKiAgICAgVGhlIG1heGltdW0gcmVjaXByb2NhbCBzaW5lIG9mIGhhbGYtYW5nbGUgYXQgdGhlIG1pdGVyIGpvaW4sCisgICAqICAgICBleHByZXNzZWQgYXMgMTYuMTYgZml4ZWQgcG9pbnQgdmFsdWUuCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoZSByYWRpdXMgaXMgZXhwcmVzc2VkIGluIHRoZSBzYW1lIHVuaXRzIGFzIHRoZSBvdXRsaW5lCisgICAqICAgVGhlIGByYWRpdXNgIGlzIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyBhcyB0aGUgb3V0bGluZQogICAgKiAgIGNvb3JkaW5hdGVzLgogICAgKgorICAgKiAgIFRoZSBgbWl0ZXJfbGltaXRgIG11bHRpcGxpZWQgYnkgdGhlIGByYWRpdXNgIGdpdmVzIHRoZSBtYXhpbXVtIHNpemUKKyAgICogICBvZiBhIG1pdGVyIHNwaWtlLCBhdCB3aGljaCBpdCBpcyBjbGlwcGVkIGZvcgorICAgKiAgIEBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIG9yIHJlcGxhY2VkIHdpdGggYSBiZXZlbCBqb2luIGZvcgorICAgKiAgIEBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVELgorICAgKgogICAgKiAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1N0cm9rZXJfUmV3aW5kIGF1dG9tYXRpY2FsbHkuCiAgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQpAQCAtMzE5LDE2ICszMTQsMTUgQEAKICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TdHJva2VyX1Jld2luZAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmVzZXQgYSBzdHJva2VyIG9iamVjdCB3aXRob3V0IGNoYW5naW5nIGl0cyBhdHRyaWJ1dGVzLgotICAgKiAgIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBiZWdpbm5pbmcgYSBuZXcKLSAgICogICBzZXJpZXMgb2YgY2FsbHMgdG8gQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoIG9yCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KKyAgICogICBSZXNldCBhIHN0cm9rZXIgb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIGF0dHJpYnV0ZXMuICBZb3Ugc2hvdWxkCisgICAqICAgY2FsbCB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBiZWdpbm5pbmcgYSBuZXcgc2VyaWVzIG9mIGNhbGxzIHRvCisgICAqICAgQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoIG9yIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBzdHJva2VyIDo6CkBAIC0zMzgsMTUgKzMzMiwxNSBAQAogICBGVF9TdHJva2VyX1Jld2luZCggRlRfU3Ryb2tlciAgc3Ryb2tlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBhIHdob2xlIG91dGxpbmUgd2l0aAotICAgKiAgIHRoZSBzdHJva2VyLiAgVGhlIHJlc3VsdGluZyBvdXRsaW5lKHMpIGNhbiBiZSByZXRyaWV2ZWQKLSAgICogICBsYXRlciBieSBmdW5jdGlvbnMgbGlrZSBARlRfU3Ryb2tlcl9HZXRDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydC4KKyAgICogICBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2UgYSB3aG9sZSBvdXRsaW5lIHdpdGggdGhlIHN0cm9rZXIuCisgICAqICAgVGhlIHJlc3VsdGluZyBvdXRsaW5lKHMpIGNhbiBiZSByZXRyaWV2ZWQgbGF0ZXIgYnkgZnVuY3Rpb25zIGxpa2UKKyAgICogICBARlRfU3Ryb2tlcl9HZXRDb3VudHMgYW5kIEBGVF9TdHJva2VyX0V4cG9ydC4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgIHN0cm9rZXIgOjoKQEAgLTM1NiwxOCArMzUwLDE4IEBACiAgICAqICAgICBUaGUgc291cmNlIG91dGxpbmUuCiAgICAqCiAgICAqICAgb3BlbmVkIDo6Ci0gICAqICAgICBBIGJvb2xlYW4uICBJZn4xLCB0aGUgb3V0bGluZSBpcyB0cmVhdGVkIGFzIGFuIG9wZW4gcGF0aCBpbnN0ZWFkCi0gICAqICAgICBvZiBhIGNsb3NlZCBvbmUuCisgICAqICAgICBBIGJvb2xlYW4uICBJZn4xLCB0aGUgb3V0bGluZSBpcyB0cmVhdGVkIGFzIGFuIG9wZW4gcGF0aCBpbnN0ZWFkIG9mCisgICAqICAgICBhIGNsb3NlZCBvbmUuCiAgICAqCiAgICAqIEByZXR1cm46CiAgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgSWYgYG9wZW5lZCcgaXN+MCAodGhlIGRlZmF1bHQpLCB0aGUgb3V0bGluZSBpcyB0cmVhdGVkIGFzIGEgY2xvc2VkCi0gICAqICAgcGF0aCwgYW5kIHRoZSBzdHJva2VyIGdlbmVyYXRlcyB0d28gZGlzdGluY3QgYGJvcmRlcicgb3V0bGluZXMuCisgICAqICAgSWYgYG9wZW5lZGAgaXN+MCAodGhlIGRlZmF1bHQpLCB0aGUgb3V0bGluZSBpcyB0cmVhdGVkIGFzIGEgY2xvc2VkCisgICAqICAgcGF0aCwgYW5kIHRoZSBzdHJva2VyIGdlbmVyYXRlcyB0d28gZGlzdGluY3QgJ2JvcmRlcicgb3V0bGluZXMuCiAgICAqCi0gICAqICAgSWYgYG9wZW5lZCcgaXN+MSwgdGhlIG91dGxpbmUgaXMgcHJvY2Vzc2VkIGFzIGFuIG9wZW4gcGF0aCwgYW5kIHRoZQotICAgKiAgIHN0cm9rZXIgZ2VuZXJhdGVzIGEgc2luZ2xlIGBzdHJva2UnIG91dGxpbmUuCisgICAqICAgSWYgYG9wZW5lZGAgaXN+MSwgdGhlIG91dGxpbmUgaXMgcHJvY2Vzc2VkIGFzIGFuIG9wZW4gcGF0aCwgYW5kIHRoZQorICAgKiAgIHN0cm9rZXIgZ2VuZXJhdGVzIGEgc2luZ2xlICdzdHJva2UnIG91dGxpbmUuCiAgICAqCiAgICAqICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfU3Ryb2tlcl9SZXdpbmQgYXV0b21hdGljYWxseS4KICAgICovCkBAIC0zNzcsNyArMzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBvcGVuZWQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCkBAIC0zOTksOCArMzkzLDggQEAKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHN0cm9rZSBhIHBhdGggdGhhdCBpcwotICAgKiAgIG5vdCBzdG9yZWQgYXMgYW4gQEZUX091dGxpbmUgb2JqZWN0LgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4geW91IG5lZWQgdG8gc3Ryb2tlIGEgcGF0aCB0aGF0IGlzIG5vdAorICAgKiAgIHN0b3JlZCBhcyBhbiBARlRfT3V0bGluZSBvYmplY3QuCiAgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCkBAIC00MDgsNyArNDAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG9wZW4gKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1N0cm9rZXJfRW5kU3ViUGF0aApAQCAtNDI0LDIyICs0MTgsMjIgQEAKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgogICAgKgogICAgKiBAbm90ZToKLSAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGguCi0gICAqICAgSWYgdGhlIHN1YnBhdGggd2FzIG5vdCBgb3BlbmVkJywgdGhpcyBmdW5jdGlvbiBgZHJhd3MnIGEKLSAgICogICBzaW5nbGUgbGluZSBzZWdtZW50IHRvIHRoZSBzdGFydCBwb3NpdGlvbiB3aGVuIG5lZWRlZC4KKyAgICogICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGguICBJZiB0aGUKKyAgICogICBzdWJwYXRoIHdhcyBub3QgJ29wZW5lZCcsIHRoaXMgZnVuY3Rpb24gJ2RyYXdzJyBhIHNpbmdsZSBsaW5lIHNlZ21lbnQKKyAgICogICB0byB0aGUgc3RhcnQgcG9zaXRpb24gd2hlbiBuZWVkZWQuCiAgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TdHJva2VyX0xpbmVUbwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIGxpbmUgc2VnbWVudCBpbiB0aGUgc3Ryb2tlcidzIGN1cnJlbnQgc3ViLXBhdGgsCi0gICAqICAgZnJvbSB0aGUgbGFzdCBwb3NpdGlvbi4KKyAgICogICAnRHJhdycgYSBzaW5nbGUgbGluZSBzZWdtZW50IGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwgZnJvbQorICAgKiAgIHRoZSBsYXN0IHBvc2l0aW9uLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgc3Ryb2tlciA6OgpAQCAtNDYwLDEzICs0NTQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TdHJva2VyX0NvbmljVG8KICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIGBEcmF3JyBhIHNpbmdsZSBxdWFkcmF0aWMgQmV6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKKyAgICogICAnRHJhdycgYSBzaW5nbGUgcXVhZHJhdGljIEJlemllciBpbiB0aGUgc3Ryb2tlcidzIGN1cnJlbnQgc3ViLXBhdGgsCiAgICAqICAgZnJvbSB0aGUgbGFzdCBwb3NpdGlvbi4KICAgICoKICAgICogQGlucHV0OgpAQCAtNDkyLDE0ICs0ODYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfU3Ryb2tlcl9DdWJpY1RvCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBgRHJhdycgYSBzaW5nbGUgY3ViaWMgQmV6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgorICAgKiAgICdEcmF3JyBhIHNpbmdsZSBjdWJpYyBCZXppZXIgaW4gdGhlIHN0cm9rZXIncyBjdXJyZW50IHN1Yi1wYXRoLCBmcm9tCisgICAqICAgdGhlIGxhc3QgcG9zaXRpb24uCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBzdHJva2VyIDo6CkBAIC01MjgsMTYgKzUyMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIG9uY2UgeW91IGhhdmUgZmluaXNoZWQgcGFyc2luZyB5b3VyIHBhdGhzCi0gICAqICAgd2l0aCB0aGUgc3Ryb2tlci4gIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgbmVjZXNzYXJ5IHRvIGV4cG9ydCBvbmUgb2YgdGhlIGBib3JkZXInIG9yIGBzdHJva2UnCi0gICAqICAgb3V0bGluZXMgZ2VuZXJhdGVkIGJ5IHRoZSBzdHJva2VyLgorICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocyB3aXRoIHRoZQorICAgKiAgIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZCBjb250b3VycyBuZWNlc3NhcnkgdG8KKyAgICogICBleHBvcnQgb25lIG9mIHRoZSAnYm9yZGVyJyBvciAnc3Ryb2tlJyBvdXRsaW5lcyBnZW5lcmF0ZWQgYnkgdGhlCisgICAqICAgc3Ryb2tlci4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgIHN0cm9rZXIgOjoKQEAgLTU1NywxNSArNTUxLDE1IEBACiAgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgV2hlbiBhbiBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgY2xvc2VkJywgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzCi0gICAqICAgdHdvIGluZGVwZW5kZW50IGBib3JkZXInIG91dGxpbmVzLCBuYW1lZCBgbGVmdCcgYW5kIGByaWdodCcuCisgICAqICAgV2hlbiBhbiBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyAnY2xvc2VkJywgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzIHR3bworICAgKiAgIGluZGVwZW5kZW50ICdib3JkZXInIG91dGxpbmVzLCBuYW1lZCAnbGVmdCcgYW5kICdyaWdodCcuCiAgICAqCi0gICAqICAgV2hlbiB0aGUgb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYG9wZW5lZCcsIHRoZSBzdHJva2VyIG1lcmdlcwotICAgKiAgIHRoZSBgYm9yZGVyJyBvdXRsaW5lcyB3aXRoIGNhcHMuICBUaGUgYGxlZnQnIGJvcmRlciByZWNlaXZlcyBhbGwKLSAgICogICBwb2ludHMsIHdoaWxlIHRoZSBgcmlnaHQnIGJvcmRlciBiZWNvbWVzIGVtcHR5LgorICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzICdvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMgdGhlCisgICAqICAgJ2JvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlICdsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsIHBvaW50cywKKyAgICogICB3aGlsZSB0aGUgJ3JpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KICAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0dldENvdW50cyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgdGhlIGNvdW50cyBhc3NvY2lhdGVkIHRvIGJvdGggYm9yZGVycy4KKyAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0dldENvdW50cyBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHJldHJpZXZlCisgICAqICAgdGhlIGNvdW50cyBhc3NvY2lhdGVkIHRvIGJvdGggYm9yZGVycy4KICAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyggRlRfU3Ryb2tlciAgICAgICAgc3Ryb2tlciwKQEAgLTU3NCwxOSArNTY4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX2NvbnRvdXJzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGV4cG9ydCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgdG8geW91ciBvd24gQEZUX091dGxpbmUKLSAgICogICBzdHJ1Y3R1cmUuCisgICAqICAgQ2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0byBleHBvcnQgdGhlCisgICAqICAgY29ycmVzcG9uZGluZyBib3JkZXIgdG8geW91ciBvd24gQEZUX091dGxpbmUgc3RydWN0dXJlLgogICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgdG8geW91ciBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMKLSAgICogICBhcnJheXMuCisgICAqICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gYXBwZW5kcyB0aGUgYm9yZGVyIHBvaW50cyBhbmQgY29udG91cnMgdG8geW91cgorICAgKiAgIG91dGxpbmUsIGJ1dCBkb2VzIG5vdCB0cnkgdG8gcmVzaXplIGl0cyBhcnJheXMuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBzdHJva2VyIDo6CkBAIC01OTksMTkgKzU5MSwxOSBAQAogICAgKiAgICAgVGhlIHRhcmdldCBvdXRsaW5lIGhhbmRsZS4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgQWx3YXlzIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KLSAgICogICBnZXQgc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHlvdXIgQEZUX091dGxpbmUgb2JqZWN0IHRvCi0gICAqICAgcmVjZWl2ZSBhbGwgbmV3IGRhdGEuCisgICAqICAgQWx3YXlzIGNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8gZ2V0CisgICAqICAgc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHlvdXIgQEZUX091dGxpbmUgb2JqZWN0IHRvIHJlY2VpdmUKKyAgICogICBhbGwgbmV3IGRhdGEuCiAgICAqCi0gICAqICAgV2hlbiBhbiBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgY2xvc2VkJywgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzCi0gICAqICAgdHdvIGluZGVwZW5kZW50IGBib3JkZXInIG91dGxpbmVzLCBuYW1lZCBgbGVmdCcgYW5kIGByaWdodCcuCisgICAqICAgV2hlbiBhbiBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyAnY2xvc2VkJywgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzIHR3bworICAgKiAgIGluZGVwZW5kZW50ICdib3JkZXInIG91dGxpbmVzLCBuYW1lZCAnbGVmdCcgYW5kICdyaWdodCcuCiAgICAqCi0gICAqICAgV2hlbiB0aGUgb3V0bGluZSwgb3IgYSBzdWItcGF0aCwgaXMgYG9wZW5lZCcsIHRoZSBzdHJva2VyIG1lcmdlcwotICAgKiAgIHRoZSBgYm9yZGVyJyBvdXRsaW5lcyB3aXRoIGNhcHMuICBUaGUgYGxlZnQnIGJvcmRlciByZWNlaXZlcyBhbGwKLSAgICogICBwb2ludHMsIHdoaWxlIHRoZSBgcmlnaHQnIGJvcmRlciBiZWNvbWVzIGVtcHR5LgorICAgKiAgIFdoZW4gdGhlIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzICdvcGVuZWQnLCB0aGUgc3Ryb2tlciBtZXJnZXMgdGhlCisgICAqICAgJ2JvcmRlcicgb3V0bGluZXMgd2l0aCBjYXBzLiAgVGhlICdsZWZ0JyBib3JkZXIgcmVjZWl2ZXMgYWxsIHBvaW50cywKKyAgICogICB3aGlsZSB0aGUgJ3JpZ2h0JyBib3JkZXIgYmVjb21lcyBlbXB0eS4KICAgICoKLSAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0V4cG9ydCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvCi0gICAqICAgcmV0cmlldmUgYWxsIGJvcmRlcnMgYXQgb25jZS4KKyAgICogICBVc2UgdGhlIGZ1bmN0aW9uIEBGVF9TdHJva2VyX0V4cG9ydCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHJldHJpZXZlCisgICAqICAgYWxsIGJvcmRlcnMgYXQgb25jZS4KICAgICovCiAgIEZUX0VYUE9SVCggdm9pZCApCiAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLApAQCAtNjE5LDE2ICs2MTEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgIG91dGxpbmUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDYWxsIHRoaXMgZnVuY3Rpb24gb25jZSB5b3UgaGF2ZSBmaW5pc2hlZCBwYXJzaW5nIHlvdXIgcGF0aHMKLSAgICogICB3aXRoIHRoZSBzdHJva2VyLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyBuZWNlc3NhcnkgdG8gZXhwb3J0IGFsbCBwb2ludHMvYm9yZGVycyBmcm9tIHRoZSBzdHJva2VkCi0gICAqICAgb3V0bGluZS9wYXRoLgorICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocyB3aXRoIHRoZQorICAgKiAgIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZCBjb250b3VycyBuZWNlc3NhcnkgdG8KKyAgICogICBleHBvcnQgYWxsIHBvaW50cy9ib3JkZXJzIGZyb20gdGhlIHN0cm9rZWQgb3V0bGluZS9wYXRoLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgc3Ryb2tlciA6OgpAQCAtNjUwLDE4ICs2NDEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fY29udG91cnMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1N0cm9rZXJfRXhwb3J0CiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIHRvCi0gICAqICAgZXhwb3J0IGFsbCBib3JkZXJzIHRvIHlvdXIgb3duIEBGVF9PdXRsaW5lIHN0cnVjdHVyZS4KKyAgICogICBDYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIHRvIGV4cG9ydCBhbGwKKyAgICogICBib3JkZXJzIHRvIHlvdXIgb3duIEBGVF9PdXRsaW5lIHN0cnVjdHVyZS4KICAgICoKLSAgICogICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBhcHBlbmRzIHRoZSBib3JkZXIgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIHRvIHlvdXIgb3V0bGluZSwgYnV0IGRvZXMgbm90IHRyeSB0byByZXNpemUgaXRzCi0gICAqICAgYXJyYXlzLgorICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kIGNvbnRvdXJzIHRvIHlvdXIKKyAgICogICBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMgYXJyYXlzLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgc3Ryb2tlciA6OgpAQCAtNjc1LDcgKzY2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfU3Ryb2tlcl9Eb25lCkBAIC02ODUsMTMgKzY3NSwxMyBAQAogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4gIENhbiBiZSBOVUxMLgorICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4gIENhbiBiZSBgTlVMTGAuCiAgICAqLwogICBGVF9FWFBPUlQoIHZvaWQgKQogICBGVF9TdHJva2VyX0RvbmUoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX0dseXBoX1N0cm9rZQpAQCAtNzA4LDggKzY5OCw3IEBACiAgICAqICAgICBBIHN0cm9rZXIgaGFuZGxlLgogICAgKgogICAgKiAgIGRlc3Ryb3kgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0IGlzIGRlc3Ryb3llZAotICAgKiAgICAgb24gc3VjY2Vzcy4KKyAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0IGlzIGRlc3Ryb3llZCBvbiBzdWNjZXNzLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgpAQCAtNzE5LDggKzcwOCw4IEBACiAgICAqCiAgICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKICAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgorICAgKiAgIG1heSBuZWVkIHRvIG1hbnVhbGx5IGFkanVzdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBhZHZhbmNlIGFtb3VudHMgdG8KKyAgICogICBhY2NvdW50IGZvciB0aGlzIGFkZGVkIHNpemUuCiAgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhfU3Ryb2tlKCBGVF9HbHlwaCAgICAqcGdseXBoLApAQCAtNzI4LDE0ICs3MTcsMTQgQEAKICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdHJva2UgYSBnaXZlbiBvdXRsaW5lIGdseXBoIG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3Ryb2tlciwgYnV0Ci0gICAqICAgb25seSByZXR1cm4gZWl0aGVyIGl0cyBpbnNpZGUgb3Igb3V0c2lkZSBib3JkZXIuCisgICAqICAgU3Ryb2tlIGEgZ2l2ZW4gb3V0bGluZSBnbHlwaCBvYmplY3Qgd2l0aCBhIGdpdmVuIHN0cm9rZXIsIGJ1dCBvbmx5CisgICAqICAgcmV0dXJuIGVpdGhlciBpdHMgaW5zaWRlIG9yIG91dHNpZGUgYm9yZGVyLgogICAgKgogICAgKiBAaW5vdXQ6CiAgICAqICAgcGdseXBoIDo6CkBAIC03NDYsMTIgKzczNSwxMSBAQAogICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KICAgICoKICAgICogICBpbnNpZGUgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHJldHVybiB0aGUgaW5zaWRlIGJvcmRlciwgb3RoZXJ3aXNlCi0gICAqICAgICB0aGUgb3V0c2lkZSBib3JkZXIuCisgICAqICAgICBBIEJvb2xlYW4uICBJZn4xLCByZXR1cm4gdGhlIGluc2lkZSBib3JkZXIsIG90aGVyd2lzZSB0aGUgb3V0c2lkZQorICAgKiAgICAgYm9yZGVyLgogICAgKgogICAgKiAgIGRlc3Ryb3kgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0IGlzIGRlc3Ryb3llZAotICAgKiAgICAgb24gc3VjY2Vzcy4KKyAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0IGlzIGRlc3Ryb3llZCBvbiBzdWNjZXNzLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgpAQCAtNzYxLDggKzc0OSw4IEBACiAgICAqCiAgICAqICAgQWRkaW5nIHN0cm9rZSBtYXkgeWllbGQgYSBzaWduaWZpY2FudGx5IHdpZGVyIGFuZCB0YWxsZXIgZ2x5cGgKICAgICogICBkZXBlbmRpbmcgb24gaG93IGxhcmdlIG9mIGEgcmFkaXVzIHdhcyB1c2VkIHRvIHN0cm9rZSB0aGUgZ2x5cGguICBZb3UKLSAgICogICBtYXkgbmVlZCB0byBtYW51YWxseSBhZGp1c3QgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSBhbW91bnRzCi0gICAqICAgdG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCBzaXplLgorICAgKiAgIG1heSBuZWVkIHRvIG1hbnVhbGx5IGFkanVzdCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBhZHZhbmNlIGFtb3VudHMgdG8KKyAgICogICBhY2NvdW50IGZvciB0aGlzIGFkZGVkIHNpemUuCiAgICAqLwogICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyKCBGVF9HbHlwaCAgICAqcGdseXBoLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9mdHN5bnRoLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaAppbmRleCBmZjlmYjQzLi5iZGI0YzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaApAQCAtMSwyMCArMSwyMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeW50aC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN5bnRoZXNpemluZyBjb2RlIGZvciBlbWJvbGRlbmluZyBhbmQgc2xhbnRpbmcgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c3ludGguaAorICoKKyAqICAgRnJlZVR5cGUgc3ludGhlc2l6aW5nIGNvZGUgZm9yIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZworICogICAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzUsNyArMzUsNyBAQAogCiAKICAgLyogTWFpbiByZWFzb24gZm9yIG5vdCBsaWZ0aW5nIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBtb2R1bGUgdG8gYSAgKi8KLSAgLyogYHN0YW5kYXJkJyBBUEkgaXMgdGhhdCB0aGUgdXNlZCBwYXJhbWV0ZXJzIGZvciBlbWJvbGRlbmluZyBhbmQgKi8KKyAgLyogJ3N0YW5kYXJkJyBBUEkgaXMgdGhhdCB0aGUgdXNlZCBwYXJhbWV0ZXJzIGZvciBlbWJvbGRlbmluZyBhbmQgKi8KICAgLyogc2xhbnRpbmcgYXJlIG5vdCBjb25maWd1cmFibGUuICBDb25zaWRlciB0aGUgZnVuY3Rpb25zIGFzIGEgICAgKi8KICAgLyogY29kZSByZXNvdXJjZSB0aGF0IHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGUgYXBwbGljYXRpb24gYW5kICAgKi8KICAgLyogYWRhcHRlZCB0byB0aGUgcGFydGljdWxhciBuZWVkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1LDggKzQ1LDcgQEAKICNkZWZpbmUgRlRTWU5USF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpAQCAtNTcsNyArNTYsNyBAQAogCiBGVF9CRUdJTl9IRUFERVIKIAotICAvKiBFbWJvbGRlbiBhIGdseXBoIGJ5IGEgYHJlYXNvbmFibGUnIHZhbHVlICh3aGljaCBpcyBoaWdobHkgYSBtYXR0ZXIgb2YgKi8KKyAgLyogRW1ib2xkZW4gYSBnbHlwaCBieSBhICdyZWFzb25hYmxlJyB2YWx1ZSAod2hpY2ggaXMgaGlnaGx5IGEgbWF0dGVyIG9mICovCiAgIC8qIHRhc3RlKS4gIFRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiwgcHJvdmlkaW5nICAqLwogICAvKiBhIHdyYXBwZXIgZm9yIEBGVF9PdXRsaW5lX0VtYm9sZGVuIGFuZCBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmgKaW5kZXggZjZiMTYyOS4uMjJhZWFkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaApAQCAtMSw1OSArMSw1NyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGxvdy1sZXZlbCBzeXN0ZW0gaW50ZXJmYWNlIGRlZmluaXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzeXN0ZW0uaAorICoKKyAqICAgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgZGVmaW5pdGlvbiAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUU1lTVEVNX0hfCiAjZGVmaW5lIEZUU1lTVEVNX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN5c3RlbV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFN5c3RlbSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhvdyBGcmVlVHlwZSBtYW5hZ2VzIG1lbW9yeSBhbmQgaS9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5ICAgICAgICAgKi8KLSAgLyogICBtYW5hZ2VtZW50IGFuZCBpL28gYWNjZXNzLiAgWW91IG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzICAgICAgICAgICAgICovCi0gIC8qICAgaW5mb3JtYXRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyIG9yIHlvdSBvd24gICAqLwotICAvKiAgIGkvbyBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICBzeXN0ZW1faW50ZXJmYWNlCisgICAqCisgICAqIEB0aXRsZToKKyAgICogIFN5c3RlbSBJbnRlcmZhY2UKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgSG93IEZyZWVUeXBlIG1hbmFnZXMgbWVtb3J5IGFuZCBpL28uCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gbWVtb3J5IG1hbmFnZW1lbnQKKyAgICogIGFuZCBpL28gYWNjZXNzLiAgWW91IG5lZWQgdG8gdW5kZXJzdGFuZCB0aGlzIGluZm9ybWF0aW9uIGlmIHlvdSB3YW50IHRvCisgICAqICB1c2UgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIgb3IgeW91IG93biBpL28gc3RyZWFtcy4KKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEB0eXBlOgogICAgKiAgIEZUX01lbW9yeQpAQCAtNjYsMTMgKzY0LDEzIEBACiAgIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18qICBGVF9NZW1vcnk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIEZUX0FsbG9jX0Z1bmMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byBhbGxvY2F0ZSBgc2l6ZScgYnl0ZXMgZnJvbSBgbWVtb3J5Jy4KKyAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gYWxsb2NhdGUgYHNpemVgIGJ5dGVzIGZyb20gYG1lbW9yeWAuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBtZW1vcnkgOjoKQEAgLTkwLDcgKzg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIEZUX0ZyZWVfRnVuYwpAQCAtMTExLDcgKzEwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jayApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdHlwZToKICAgICogICBGVF9SZWFsbG9jX0Z1bmMKQEAgLTE0Niw3ICsxNDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAc3RydWN0OgogICAgKiAgIEZUX01lbW9yeVJlYwpAQCAtMTc3LDE0ICsxNzUsMTQgQEAKICAgfTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEkgLyBPICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgIEkgLyBPICAgTSBBIE4gQSBHIEUgTSBFIE4gVAorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAdHlwZToKICAgICogICBGVF9TdHJlYW0KQEAgLTE5MywyMSArMTkxLDIxIEBACiAgICAqICAgQSBoYW5kbGUgdG8gYW4gaW5wdXQgc3RyZWFtLgogICAgKgogICAgKiBAYWxzbzoKLSAgICogICBTZWUgQEZUX1N0cmVhbVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4KLSAgICogICBzdHJlYW0gb2JqZWN0LgorICAgKiAgIFNlZSBARlRfU3RyZWFtUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiBzdHJlYW0KKyAgICogICBvYmplY3QuCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCBGVF9TdHJlYW1SZWNfKiAgRlRfU3RyZWFtOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBzdHJ1Y3Q6CiAgICAqICAgRlRfU3RyZWFtRGVzYwogICAgKgogICAgKiBAZGVzY3JpcHRpb246CiAgICAqICAgQSB1bmlvbiB0eXBlIHVzZWQgdG8gc3RvcmUgZWl0aGVyIGEgbG9uZyBvciBhIHBvaW50ZXIuICBUaGlzIGlzIHVzZWQKLSAgICogICB0byBzdG9yZSBhIGZpbGUgZGVzY3JpcHRvciBvciBhIGBGSUxFKicgaW4gYW4gaW5wdXQgc3RyZWFtLgorICAgKiAgIHRvIHN0b3JlIGEgZmlsZSBkZXNjcmlwdG9yIG9yIGEgYEZJTEUqYCBpbiBhbiBpbnB1dCBzdHJlYW0uCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHVuaW9uICBGVF9TdHJlYW1EZXNjXwpAQCAtMjE4LDcgKzIxNiw3IEBACiAgIH0gRlRfU3RyZWFtRGVzYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgRlRfU3RyZWFtX0lvRnVuYwpAQCAtMjQzLDkgKzI0MSw4IEBACiAgICAqICAgVGhlIG51bWJlciBvZiBieXRlcyBlZmZlY3RpdmVseSByZWFkIGJ5IHRoZSBzdHJlYW0uCiAgICAqCiAgICAqIEBub3RlOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gbWlnaHQgYmUgY2FsbGVkIHRvIHBlcmZvcm0gYSBzZWVrIG9yIHNraXAgb3BlcmF0aW9uCi0gICAqICAgd2l0aCBhIGBjb3VudCcgb2Z+MC4gIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIHRoZW4gaW5kaWNhdGVzIGFuCi0gICAqICAgZXJyb3IuCisgICAqICAgVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgdG8gcGVyZm9ybSBhIHNlZWsgb3Igc2tpcCBvcGVyYXRpb24gd2l0aAorICAgKiAgIGEgYGNvdW50YCBvZn4wLiAgQSBub24temVybyByZXR1cm4gdmFsdWUgdGhlbiBpbmRpY2F0ZXMgYW4gZXJyb3IuCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcKQEAgLTI1NSw3ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgRlRfU3RyZWFtX0Nsb3NlRnVuYwpAQCAtMjY1LDE0ICsyNjIsMTQgQEAKICAgICoKICAgICogQGlucHV0OgogICAgKiAgc3RyZWFtIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHN0cmVhbS4KKyAgICogICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpGVF9TdHJlYW1fQ2xvc2VGdW5jKSggRlRfU3RyZWFtICBzdHJlYW0gKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAc3RydWN0OgogICAgKiAgIEZUX1N0cmVhbVJlYwpAQCAtMjgzLDcgKzI4MCw3IEBACiAgICAqIEBpbnB1dDoKICAgICogICBiYXNlIDo6CiAgICAqICAgICBGb3IgbWVtb3J5LWJhc2VkIHN0cmVhbXMsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHN0cmVhbQotICAgKiAgICAgYnl0ZSBpbiBtZW1vcnkuICBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgYmUgc2V0IHRvIE5VTEwgZm9yCisgICAqICAgICBieXRlIGluIG1lbW9yeS4gIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gYE5VTExgIGZvcgogICAgKiAgICAgZGlzay1iYXNlZCBzdHJlYW1zLgogICAgKgogICAgKiAgIHNpemUgOjoKQEAgLTI5OSw3ICsyOTYsNyBAQAogICAgKgogICAgKiAgIGRlc2NyaXB0b3IgOjoKICAgICogICAgIFRoaXMgZmllbGQgaXMgYSB1bmlvbiB0aGF0IGNhbiBob2xkIGFuIGludGVnZXIgb3IgYSBwb2ludGVyLiAgSXQgaXMKLSAgICogICAgIHVzZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGBGSUxFKicKKyAgICogICAgIHVzZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGBGSUxFKmAKICAgICogICAgIHBvaW50ZXJzLgogICAgKgogICAgKiAgIHBhdGhuYW1lIDo6CkBAIC0zMTQsMTMgKzMxMSwxMyBAQAogICAgKiAgICAgVGhlIHN0cmVhbSdzIGNsb3NlIGZ1bmN0aW9uLgogICAgKgogICAgKiAgIG1lbW9yeSA6OgotICAgKiAgICAgVGhlIG1lbW9yeSBtYW5hZ2VyIHRvIHVzZSB0byBwcmVsb2FkIGZyYW1lcy4gIFRoaXMgaXMgc2V0Ci0gICAqICAgICBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIGFuZCBzaG91bGRuJ3QgYmUgdG91Y2hlZCBieSBzdHJlYW0KLSAgICogICAgIGltcGxlbWVudGF0aW9ucy4KKyAgICogICAgIFRoZSBtZW1vcnkgbWFuYWdlciB0byB1c2UgdG8gcHJlbG9hZCBmcmFtZXMuICBUaGlzIGlzIHNldCBpbnRlcm5hbGx5CisgICAqICAgICBieSBGcmVlVHlwZSBhbmQgc2hvdWxkbid0IGJlIHRvdWNoZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucy4KICAgICoKICAgICogICBjdXJzb3IgOjoKICAgICogICAgIFRoaXMgZmllbGQgaXMgc2V0IGFuZCB1c2VkIGludGVybmFsbHkgYnkgRnJlZVR5cGUgd2hlbiBwYXJzaW5nCi0gICAqICAgICBmcmFtZXMuCisgICAqICAgICBmcmFtZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGUgYEZUX0dFVF9YWFhgIG1hY3JvcyB1c2UgdGhpcyBpbnN0ZWFkIG9mCisgICAqICAgICB0aGUgYHBvc2AgZmllbGQuCiAgICAqCiAgICAqICAgbGltaXQgOjoKICAgICogICAgIFRoaXMgZmllbGQgaXMgc2V0IGFuZCB1c2VkIGludGVybmFsbHkgYnkgRnJlZVR5cGUgd2hlbiBwYXJzaW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgKaW5kZXggMmUzZjNmMS4uMmNlNmIzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaApAQCAtMSwyNSArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmlnb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnR0cmlnb24uaAorICoKKyAqICAgRnJlZVR5cGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVFRSSUdPTl9IXwogI2RlZmluZSBGVFRSSUdPTl9IXwogCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMSwxNSArMzEsMTUgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb21wdXRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgY29tcHV0YXRpb25zCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEB0eXBlOgogICAgKiAgIEZUX0FuZ2xlCkBAIC01Miw3ICs1Miw3IEBACiAgIHR5cGVkZWYgRlRfRml4ZWQgIEZUX0FuZ2xlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9BTkdMRV9QSQpAQCAtNjQsNyArNjQsNyBAQAogI2RlZmluZSBGVF9BTkdMRV9QSSAgKCAxODBMIDw8IDE2ICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfQU5HTEVfMlBJCkBAIC03Niw3ICs3Niw3IEBACiAjZGVmaW5lIEZUX0FOR0xFXzJQSSAgKCBGVF9BTkdMRV9QSSAqIDIgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9BTkdMRV9QSTIKQEAgLTg4LDcgKzg4LDcgQEAKICNkZWZpbmUgRlRfQU5HTEVfUEkyICAoIEZUX0FOR0xFX1BJIC8gMiApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQG1hY3JvOgogICAgKiAgIEZUX0FOR0xFX1BJNApAQCAtMTAwLDcgKzEwMCw3IEBACiAjZGVmaW5lIEZUX0FOR0xFX1BJNCAgKCBGVF9BTkdMRV9QSSAvIDQgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9TaW4KQEAgLTEyNCw3ICsxMjQsNyBAQAogICBGVF9TaW4oIEZUX0FuZ2xlICBhbmdsZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9Db3MKQEAgLTE0OCw3ICsxNDgsNyBAQAogICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9UYW4KQEAgLTE2OCwxNCArMTY4LDE0IEBACiAgIEZUX1RhbiggRlRfQW5nbGUgIGFuZ2xlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX0F0YW4yCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGFyYy10YW5nZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiB2ZWN0b3IgKHgseSkgaW4KLSAgICogICB0aGUgMmQgcGxhbmUuCisgICAqICAgUmV0dXJuIHRoZSBhcmMtdGFuZ2VudCBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gdmVjdG9yICh4LHkpIGluIHRoZSAyZAorICAgKiAgIHBsYW5lLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgeCA6OgpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgICAgICAgICBGVF9GaXhlZCAgeSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9BbmdsZV9EaWZmCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgICogICAgIFNlY29uZCBhbmdsZS4KICAgICoKICAgICogQHJldHVybjoKLSAgICogICBDb25zdHJhaW5lZCB2YWx1ZSBvZiBgdmFsdWUyLXZhbHVlMScuCisgICAqICAgQ29uc3RyYWluZWQgdmFsdWUgb2YgYGFuZ2xlMi1hbmdsZTFgLgogICAgKgogICAgKi8KICAgRlRfRVhQT1JUKCBGVF9BbmdsZSApCkBAIC0yMTgsMTUgKzIxOCwxNSBAQAogICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgYW5nbGUyICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1ZlY3Rvcl9Vbml0CiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBSZXR1cm4gdGhlIHVuaXQgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBhbmdsZS4gIEFmdGVyIHRoZQotICAgKiAgIGNhbGwsIHRoZSB2YWx1ZSBvZiBgdmVjLngnIHdpbGwgYmUgYGNvcyhhbmdsZSknLCBhbmQgdGhlIHZhbHVlIG9mCi0gICAqICAgYHZlYy55JyB3aWxsIGJlIGBzaW4oYW5nbGUpJy4KKyAgICogICBjYWxsLCB0aGUgdmFsdWUgb2YgYHZlYy54YCB3aWxsIGJlIGBjb3MoYW5nbGUpYCwgYW5kIHRoZSB2YWx1ZSBvZgorICAgKiAgIGB2ZWMueWAgd2lsbCBiZSBgc2luKGFuZ2xlKWAuCiAgICAqCiAgICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgdG8gcmV0cmlldmUgYm90aCB0aGUgc2ludXMgYW5kIGNvc2ludXMgb2YgYQogICAgKiAgIGdpdmVuIGFuZ2xlIHF1aWNrbHkuCkBAIC0yNDUsNyArMjQ1LDcgQEAKICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1ZlY3Rvcl9Sb3RhdGUKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBhbmdsZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICBGVF9WZWN0b3JfTGVuZ3RoCkBAIC0yODgsNyArMjg4LDcgQEAKICAgRlRfVmVjdG9yX0xlbmd0aCggRlRfVmVjdG9yKiAgdmVjICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgIEZUX1ZlY3Rvcl9Qb2xhcml6ZQpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmgKaW5kZXggZjYzOGMyZS4uYWFlYjllOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9mdHR5cGVzLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzaW1wbGUgdHlwZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0dHlwZXMuaAorICoKKyAqICAgRnJlZVR5cGUgc2ltcGxlIHR5cGVzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVFRZUEVTX0hfCkBAIC0yMiw4ICsyMiw4IEBACiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9TWVNURU1fSAotI2luY2x1ZGUgRlRfSU1BR0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c3lzdGVtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRpbWFnZS5oPgogCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAKQEAgLTMxLDMyNiArMzEsMzI3IEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2ljX3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJhc2ljIERhdGEgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIsICAqLwotICAvKiAgICByYW5naW5nIGZyb20gc2ltcGxlIHNjYWxhciB0eXBlcyB0byBiaXRtYXAgZGVzY3JpcHRvcnMuICBNb3JlICAgICAgKi8KLSAgLyogICAgZm9udC1zcGVjaWZpYyBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHNlY3Rpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QdHJEaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRml4ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRldvcmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01BS0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BpeGVsX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYWxldHRlX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICBiYXNpY190eXBlcworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgQmFzaWMgRGF0YSBUeXBlcworICAgKgorICAgKiBAYWJzdHJhY3Q6CisgICAqICAgVGhlIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGlicmFyeS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgYmFzaWMgZGF0YSB0eXBlcyBkZWZpbmVkIGJ5IEZyZWVUeXBlfjIsCisgICAqICAgcmFuZ2luZyBmcm9tIHNpbXBsZSBzY2FsYXIgdHlwZXMgdG8gYml0bWFwIGRlc2NyaXB0b3JzLiAgTW9yZQorICAgKiAgIGZvbnQtc3BlY2lmaWMgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBzZWN0aW9uLgorICAgKgorICAgKiBAb3JkZXI6CisgICAqICAgRlRfQnl0ZQorICAgKiAgIEZUX0J5dGVzCisgICAqICAgRlRfQ2hhcgorICAgKiAgIEZUX0ludAorICAgKiAgIEZUX1VJbnQKKyAgICogICBGVF9JbnQxNgorICAgKiAgIEZUX1VJbnQxNgorICAgKiAgIEZUX0ludDMyCisgICAqICAgRlRfVUludDMyCisgICAqICAgRlRfSW50NjQKKyAgICogICBGVF9VSW50NjQKKyAgICogICBGVF9TaG9ydAorICAgKiAgIEZUX1VTaG9ydAorICAgKiAgIEZUX0xvbmcKKyAgICogICBGVF9VTG9uZworICAgKiAgIEZUX0Jvb2wKKyAgICogICBGVF9PZmZzZXQKKyAgICogICBGVF9QdHJEaXN0CisgICAqICAgRlRfU3RyaW5nCisgICAqICAgRlRfVGFnCisgICAqICAgRlRfRXJyb3IKKyAgICogICBGVF9GaXhlZAorICAgKiAgIEZUX1BvaW50ZXIKKyAgICogICBGVF9Qb3MKKyAgICogICBGVF9WZWN0b3IKKyAgICogICBGVF9CQm94CisgICAqICAgRlRfTWF0cml4CisgICAqICAgRlRfRldvcmQKKyAgICogICBGVF9VRldvcmQKKyAgICogICBGVF9GMkRvdDE0CisgICAqICAgRlRfVW5pdFZlY3RvcgorICAgKiAgIEZUX0YyNkRvdDYKKyAgICogICBGVF9EYXRhCisgICAqCisgICAqICAgRlRfTUFLRV9UQUcKKyAgICoKKyAgICogICBGVF9HZW5lcmljCisgICAqICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIKKyAgICoKKyAgICogICBGVF9CaXRtYXAKKyAgICogICBGVF9QaXhlbF9Nb2RlCisgICAqICAgRlRfUGFsZXR0ZV9Nb2RlCisgICAqICAgRlRfR2x5cGhfRm9ybWF0CisgICAqICAgRlRfSU1BR0VfVEFHCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIG9mIHVuc2lnbmVkIGNoYXIsIHVzZWQgZm9yIHNpbXBsZSBib29sZWFucy4gIEFzIHVzdWFsLCAgICovCi0gIC8qICAgIHZhbHVlcyAxIGFuZH4wIHJlcHJlc2VudCB0cnVlIGFuZCBmYWxzZSwgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0Jvb2wKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICBBcyB1c3VhbCwKKyAgICogICB2YWx1ZXMgMSBhbmR+MCByZXByZXNlbnQgdHJ1ZSBhbmQgZmFsc2UsIHJlc3BlY3RpdmVseS4KKyAgICovCiAgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQm9vbDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9GV29yZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzaWduZWQgMTYtYml0IGludGVnZXIgdXNlZCB0byBzdG9yZSBhIGRpc3RhbmNlIGluIG9yaWdpbmFsIGZvbnQKKyAgICogICB1bml0cy4KKyAgICovCiAgIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9GV29yZDsgICAvKiBkaXN0YW5jZSBpbiBGVW5pdHMgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCAgICAqLwotICAvKiAgICBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9VRldvcmQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250CisgICAqICAgdW5pdHMuCisgICAqLwogICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VRldvcmQ7ICAvKiB1bnNpZ25lZCBkaXN0YW5jZSAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfQ2hhcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIF9zaWduZWRfIGNoYXIgdHlwZS4KKyAgICovCiAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgIEZUX0NoYXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3Vuc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9CeXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3Vuc2lnbmVkXyBjaGFyIHR5cGUuCisgICAqLwogICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEZUX0J5dGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIGNvbnN0YW50IG1lbW9yeSBhcmVhcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9CeXRlcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB0eXBlZGVmIGZvciBjb25zdGFudCBtZW1vcnkgYXJlYXMuCisgICAqLwogICB0eXBlZGVmIGNvbnN0IEZUX0J5dGUqICBGVF9CeXRlczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgMzItYml0IHRhZ3MgKGFzIHVzZWQgaW4gdGhlIFNGTlQgZm9ybWF0KS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX1RhZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB0eXBlZGVmIGZvciAzMi1iaXQgdGFncyAoYXMgdXNlZCBpbiB0aGUgU0ZOVCBmb3JtYXQpLgorICAgKi8KICAgdHlwZWRlZiBGVF9VSW50MzIgIEZUX1RhZzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIHRoZSBjaGFyIHR5cGUsIHVzdWFsbHkgdXNlZCBmb3Igc3RyaW5ncy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX1N0cmluZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzaW1wbGUgdHlwZWRlZiBmb3IgdGhlIGNoYXIgdHlwZSwgdXN1YWxseSB1c2VkIGZvciBzdHJpbmdzLgorICAgKi8KICAgdHlwZWRlZiBjaGFyICBGVF9TdHJpbmc7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHNpZ25lZCBzaG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9TaG9ydAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB0eXBlZGVmIGZvciBzaWduZWQgc2hvcnQuCisgICAqLwogICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfU2hvcnQ7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9VU2hvcnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdHlwZWRlZiBmb3IgdW5zaWduZWQgc2hvcnQuCisgICAqLwogICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VU2hvcnQ7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9JbnQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgdHlwZWRlZiBmb3IgdGhlIGludCB0eXBlLgorICAgKi8KICAgdHlwZWRlZiBzaWduZWQgaW50ICBGVF9JbnQ7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9VSW50CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHR5cGVkZWYgZm9yIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4KKyAgICovCiAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICBGVF9VSW50OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfTG9uZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB0eXBlZGVmIGZvciBzaWduZWQgbG9uZy4KKyAgICovCiAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0xvbmc7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIGxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9VTG9uZworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBsb25nLgorICAgKi8KICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICBGVF9VTG9uZzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDIuMTQgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB1bml0IHZlY3RvcnMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0YyRG90MTQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc2lnbmVkIDIuMTQgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB1bml0IHZlY3RvcnMuCisgICAqLwogICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfRjJEb3QxNDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDI2LjYgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB2ZWN0b3JpYWwgcGl4ZWwgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9GMjZEb3Q2CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpZ25lZCAyNi42IGZpeGVkLXBvaW50IHR5cGUgdXNlZCBmb3IgdmVjdG9yaWFsIHBpeGVsIGNvb3JkaW5hdGVzLgorICAgKi8KICAgdHlwZWRlZiBzaWduZWQgbG9uZyAgRlRfRjI2RG90NjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHN0b3JlIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlcywgbGlrZSBzY2FsaW5nICAqLwotICAvKiAgICB2YWx1ZXMgb3IgbWF0cml4IGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9GaXhlZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyB0eXBlIGlzIHVzZWQgdG8gc3RvcmUgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzLCBsaWtlIHNjYWxpbmcKKyAgICogICB2YWx1ZXMgb3IgbWF0cml4IGNvZWZmaWNpZW50cy4KKyAgICovCiAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0ZpeGVkOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZyZWVUeXBlIGVycm9yIGNvZGUgdHlwZS4gIEEgdmFsdWUgb2Z+MCBpcyBhbHdheXMgaW50ZXJwcmV0ZWQgICovCi0gIC8qICAgIGFzIGEgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIEZUX0Vycm9yCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgRnJlZVR5cGUgZXJyb3IgY29kZSB0eXBlLiAgQSB2YWx1ZSBvZn4wIGlzIGFsd2F5cyBpbnRlcnByZXRlZCBhcyBhCisgICAqICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAqLwogICB0eXBlZGVmIGludCAgRlRfRXJyb3I7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciBhIHR5cGVsZXNzIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9Qb2ludGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpbXBsZSB0eXBlZGVmIGZvciBhIHR5cGVsZXNzIHBvaW50ZXIuCisgICAqLwogICB0eXBlZGVmIHZvaWQqICBGVF9Qb2ludGVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJfkMgYHNpemVfdCcgdHlwZSwgaS5lLiwgdGhlIGxhcmdlc3QgICovCi0gIC8qICAgIF91bnNpZ25lZF8gaW50ZWdlciB0eXBlIHVzZWQgdG8gZXhwcmVzcyBhIGZpbGUgc2l6ZSBvciBwb3NpdGlvbiwgICAqLwotICAvKiAgICBvciBhIG1lbW9yeSBibG9jayBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9PZmZzZXQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSX5DIGBzaXplX3RgIHR5cGUsIGkuZS4sIHRoZSBsYXJnZXN0CisgICAqICAgX3Vuc2lnbmVkXyBpbnRlZ2VyIHR5cGUgdXNlZCB0byBleHByZXNzIGEgZmlsZSBzaXplIG9yIHBvc2l0aW9uLCBvciBhCisgICAqICAgbWVtb3J5IGJsb2NrIHNpemUuCisgICAqLwogICB0eXBlZGVmIHNpemVfdCAgRlRfT2Zmc2V0OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUHRyRGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJfkMgYHB0cmRpZmZfdCcgdHlwZSwgaS5lLiwgdGhlICAgICAgICovCi0gIC8qICAgIGxhcmdlc3QgX3NpZ25lZF8gaW50ZWdlciB0eXBlIHVzZWQgdG8gZXhwcmVzcyB0aGUgZGlzdGFuY2UgICAgICAgICAqLwotICAvKiAgICBiZXR3ZWVuIHR3byBwb2ludGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9QdHJEaXN0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIEFOU0l+QyBgcHRyZGlmZl90YCB0eXBlLCBpLmUuLCB0aGUgbGFyZ2VzdAorICAgKiAgIF9zaWduZWRfIGludGVnZXIgdHlwZSB1c2VkIHRvIGV4cHJlc3MgdGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvCisgICAqICAgcG9pbnRlcnMuCisgICAqLwogICB0eXBlZGVmIGZ0X3B0cmRpZmZfdCAgRlRfUHRyRGlzdDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VuaXRWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yIHVuaXQgdmVjdG9yLiAgVXNlcyAgICAqLwotICAvKiAgICBGVF9GMkRvdDE0IHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4IDo6IEhvcml6b250YWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkgOjogVmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfVW5pdFZlY3RvcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyRCB2ZWN0b3IgdW5pdCB2ZWN0b3IuICBVc2VzCisgICAqICAgRlRfRjJEb3QxNCB0eXBlcy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB4IDo6CisgICAqICAgICBIb3Jpem9udGFsIGNvb3JkaW5hdGUuCisgICAqCisgICAqICAgeSA6OgorICAgKiAgICAgVmVydGljYWwgY29vcmRpbmF0ZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9Vbml0VmVjdG9yXwogICB7CiAgICAgRlRfRjJEb3QxNCAgeDsKQEAgLTM1OSwyOSArMzYwLDMzIEBACiAgIH0gRlRfVW5pdFZlY3RvcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMngyIG1hdHJpeC4gIENvZWZmaWNpZW50cyBhcmUgICAqLwotICAvKiAgICBpbiAxNi4xNiBmaXhlZC1wb2ludCBmb3JtYXQuICBUaGUgY29tcHV0YXRpb24gcGVyZm9ybWVkIGlzOiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICB4JyA9IHgqeHggKyB5Knh5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgeScgPSB4Knl4ICsgeSp5eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHh4IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeHkgOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5eCA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHl5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTWF0cml4CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJ4MiBtYXRyaXguICBDb2VmZmljaWVudHMgYXJlIGluCisgICAqICAgMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LiAgVGhlIGNvbXB1dGF0aW9uIHBlcmZvcm1lZCBpczoKKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIHgnID0geCp4eCArIHkqeHkKKyAgICogICAgIHknID0geCp5eCArIHkqeXkKKyAgICogICBgYGAKKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB4eCA6OgorICAgKiAgICAgTWF0cml4IGNvZWZmaWNpZW50LgorICAgKgorICAgKiAgIHh5IDo6CisgICAqICAgICBNYXRyaXggY29lZmZpY2llbnQuCisgICAqCisgICAqICAgeXggOjoKKyAgICogICAgIE1hdHJpeCBjb2VmZmljaWVudC4KKyAgICoKKyAgICogICB5eSA6OgorICAgKiAgICAgTWF0cml4IGNvZWZmaWNpZW50LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01hdHJpeF8KICAgewogICAgIEZUX0ZpeGVkICB4eCwgeHk7CkBAIC0zOTAsMTkgKzM5NSwyMSBAQAogICB9IEZUX01hdHJpeDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQtb25seSBiaW5hcnkgZGF0YSByZXByZXNlbnRlZCBhcyBhIHBvaW50ZXIgYW5kIGEgbGVuZ3RoLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50ZXIgOjogVGhlIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9EYXRhCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZWFkLW9ubHkgYmluYXJ5IGRhdGEgcmVwcmVzZW50ZWQgYXMgYSBwb2ludGVyIGFuZCBhIGxlbmd0aC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBwb2ludGVyIDo6CisgICAqICAgICBUaGUgZGF0YS4KKyAgICoKKyAgICogICBsZW5ndGggOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgaW4gYnl0ZXMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfRGF0YV8KICAgewogICAgIGNvbnN0IEZUX0J5dGUqICBwb2ludGVyOwpAQCAtNDExLDUxICs0MTgsNTIgQEAKICAgfSBGVF9EYXRhOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzY3JpYmUgYSBmdW5jdGlvbiB1c2VkIHRvIGRlc3Ryb3kgdGhlIGBjbGllbnQnIGRhdGEgb2YgYW55ICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIG9iamVjdC4gIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIEBGVF9HZW5lcmljIHR5cGUgZm9yICAqLwotICAvKiAgICBkZXRhaWxzIG9mIHVzYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiB0aGUgRnJlZVR5cGUgb2JqZWN0IHRoYXQgaXMgdW5kZXIgZmluYWxpemF0aW9uLiAgICAgKi8KLSAgLyogICAgSXRzIGNsaWVudCBkYXRhIGlzIGFjY2Vzc2VkIHRocm91Z2ggaXRzIGBnZW5lcmljJyBmaWVsZC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0dlbmVyaWNfRmluYWxpemVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXNjcmliZSBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSB0aGUgJ2NsaWVudCcgZGF0YSBvZiBhbnkgRnJlZVR5cGUKKyAgICogICBvYmplY3QuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBARlRfR2VuZXJpYyB0eXBlIGZvciBkZXRhaWxzIG9mCisgICAqICAgdXNhZ2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBUaGUgYWRkcmVzcyBvZiB0aGUgRnJlZVR5cGUgb2JqZWN0IHRoYXQgaXMgdW5kZXIgZmluYWxpemF0aW9uLiAgSXRzCisgICAqICAgY2xpZW50IGRhdGEgaXMgYWNjZXNzZWQgdGhyb3VnaCBpdHMgYGdlbmVyaWNgIGZpZWxkLgorICAgKi8KICAgdHlwZWRlZiB2b2lkICAoKkZUX0dlbmVyaWNfRmluYWxpemVyKSggdm9pZCogIG9iamVjdCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBvZnRlbiBuZWVkIHRvIGFzc29jaWF0ZSB0aGVpciBvd24gZGF0YSB0byBhICAgICovCi0gIC8qICAgIHZhcmlldHkgb2YgRnJlZVR5cGUgY29yZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIGEgdGV4dCBsYXlvdXQgQVBJICAqLwotICAvKiAgICBtaWdodCB3YW50IHRvIGFzc29jaWF0ZSBhIGdseXBoIGNhY2hlIHRvIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNvbWUgRnJlZVR5cGUgb2JqZWN0IGNvbnRhaW5zIGEgYGdlbmVyaWMnIGZpZWxkLCBvZiB0eXBlICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljLCB3aGljaCB1c2FnZSBpcyBsZWZ0IHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kIGZvbnQgICAgKi8KLSAgLyogICAgc2VydmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIHBvaW50ZXIgdG8gY2xpZW50LXNwZWNpZmljIGRhdGEsIGFzIHdlbGwgKi8KLSAgLyogICAgYXMgdGhlIGFkZHJlc3Mgb2YgYSBgZmluYWxpemVyJyBmdW5jdGlvbiwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgYnkgICovCi0gIC8qICAgIEZyZWVUeXBlIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgKGZvciBleGFtcGxlLCB0aGUgcHJldmlvdXMgICAqLwotICAvKiAgICBjbGllbnQgZXhhbXBsZSB3b3VsZCBwdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdseXBoIGNhY2hlIGRlc3RydWN0b3IgKi8KLSAgLyogICAgaW4gdGhlIGBmaW5hbGl6ZXInIGZpZWxkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byBhbnkgY2xpZW50LXNwZWNpZmllZCBkYXRhLiBUaGlzICovCi0gIC8qICAgICAgICAgICAgICAgICBmaWVsZCBpcyBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmluYWxpemVyIDo6IEEgcG9pbnRlciB0byBhIGBnZW5lcmljIGZpbmFsaXplcicgZnVuY3Rpb24sIHdoaWNoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLiAgSWYgdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgZmllbGQgaXMgc2V0IHRvIE5VTEwsIG5vIGNvZGUgd2lsbCBiZSBjYWxsZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0dlbmVyaWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENsaWVudCBhcHBsaWNhdGlvbnMgb2Z0ZW4gbmVlZCB0byBhc3NvY2lhdGUgdGhlaXIgb3duIGRhdGEgdG8gYQorICAgKiAgIHZhcmlldHkgb2YgRnJlZVR5cGUgY29yZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIGEgdGV4dCBsYXlvdXQgQVBJCisgICAqICAgbWlnaHQgd2FudCB0byBhc3NvY2lhdGUgYSBnbHlwaCBjYWNoZSB0byBhIGdpdmVuIHNpemUgb2JqZWN0LgorICAgKgorICAgKiAgIFNvbWUgRnJlZVR5cGUgb2JqZWN0IGNvbnRhaW5zIGEgYGdlbmVyaWNgIGZpZWxkLCBvZiB0eXBlIGBGVF9HZW5lcmljYCwKKyAgICogICB3aGljaCB1c2FnZSBpcyBsZWZ0IHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgYW5kIGZvbnQgc2VydmVycy4KKyAgICoKKyAgICogICBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhIHBvaW50ZXIgdG8gY2xpZW50LXNwZWNpZmljIGRhdGEsIGFzIHdlbGwgYXMKKyAgICogICB0aGUgYWRkcmVzcyBvZiBhICdmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZCBieQorICAgKiAgIEZyZWVUeXBlIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgKGZvciBleGFtcGxlLCB0aGUgcHJldmlvdXMKKyAgICogICBjbGllbnQgZXhhbXBsZSB3b3VsZCBwdXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdseXBoIGNhY2hlIGRlc3RydWN0b3IgaW4KKyAgICogICB0aGUgYGZpbmFsaXplcmAgZmllbGQpLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGRhdGEgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciB0byBhbnkgY2xpZW50LXNwZWNpZmllZCBkYXRhLiBUaGlzIGZpZWxkIGlzCisgICAqICAgICBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkuCisgICAqCisgICAqICAgZmluYWxpemVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gYSAnZ2VuZXJpYyBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCB3aWxsIGJlIGNhbGxlZAorICAgKiAgICAgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIElmIHRoaXMgZmllbGQgaXMgc2V0IHRvIGBOVUxMYCwgbm8KKyAgICogICAgIGNvZGUgd2lsbCBiZSBjYWxsZWQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfR2VuZXJpY18KICAgewogICAgIHZvaWQqICAgICAgICAgICAgICAgICBkYXRhOwpAQCAtNDY0LDE5ICs0NzIsMTkgQEAKICAgfSBGVF9HZW5lcmljOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyLWxldHRlciB0YWdzIHRoYXQgYXJlIHVzZWQgdG8gbGFiZWwgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHRhYmxlcyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcsIHRvIGJlIHVzZWQgd2l0aGluIEZyZWVUeXBlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBwcm9kdWNlZCB2YWx1ZXMgKm11c3QqIGJlIDMyLWJpdCBpbnRlZ2Vycy4gIERvbid0IHJlZGVmaW5lICAgICAqLwotICAvKiAgICB0aGlzIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfTUFLRV9UQUcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0aGF0IGFyZSB1c2VkIHRvIGxhYmVsIFRydWVUeXBlCisgICAqICAgdGFibGVzIGludG8gYW4gdW5zaWduZWQgbG9uZywgdG8gYmUgdXNlZCB3aXRoaW4gRnJlZVR5cGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBwcm9kdWNlZCB2YWx1ZXMgKiptdXN0KiogYmUgMzItYml0IGludGVnZXJzLiAgRG9uJ3QgcmVkZWZpbmUgdGhpcworICAgKiAgIG1hY3JvLgorICAgKi8KICNkZWZpbmUgRlRfTUFLRV9UQUcoIF94MSwgX3gyLCBfeDMsIF94NCApIFwKICAgICAgICAgICAoRlRfVGFnKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoICggKEZUX1VMb25nKV94MSA8PCAyNCApIHwgICAgIFwKQEAgLTQ5NCw1MyArNTAyLDU2IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlzdF9wcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIGxpc3RfcHJvY2Vzc2luZworICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBNYW55IGVsZW1lbnRzIGFuZCBvYmplY3RzIGluIEZyZWVUeXBlIGFyZSBsaXN0ZWQgdGhyb3VnaCBhbiAgICAgICAqLwotICAvKiAgICAgQEZUX0xpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLiAgQXMgaXRzIG5hbWUgc3VnZ2VzdHMsIGFuICAgICAgKi8KLSAgLyogICAgIEZUX0xpc3ROb2RlIGlzIGEgaGFuZGxlIHRvIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgRlRfTGlzdE5vZGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBNYW55IGVsZW1lbnRzIGFuZCBvYmplY3RzIGluIEZyZWVUeXBlIGFyZSBsaXN0ZWQgdGhyb3VnaCBhbiBARlRfTGlzdAorICAgKiAgICByZWNvcmQgKHNlZSBARlRfTGlzdFJlYykuICBBcyBpdHMgbmFtZSBzdWdnZXN0cywgYW4gRlRfTGlzdE5vZGUgaXMgYQorICAgKiAgICBoYW5kbGUgdG8gYSBzaW5nbGUgbGlzdCBlbGVtZW50LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdE5vZGVSZWNfKiAgRlRfTGlzdE5vZGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGxpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBGVF9MaXN0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIGxpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdFJlY18qICBGVF9MaXN0OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2luZ2xlIGxpc3QgZWxlbWVudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHJldiA6OiBUaGUgcHJldmlvdXMgZWxlbWVudCBpbiB0aGUgbGlzdC4gIE5VTEwgaWYgZmlyc3QuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXh0IDo6IFRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGxpc3QuICBOVUxMIGlmIGxhc3QuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBsaXN0ZWQgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTGlzdE5vZGVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHNpbmdsZSBsaXN0IGVsZW1lbnQuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgcHJldiA6OgorICAgKiAgICAgVGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGxpc3QuICBgTlVMTGAgaWYgZmlyc3QuCisgICAqCisgICAqICAgbmV4dCA6OgorICAgKiAgICAgVGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdC4gIGBOVUxMYCBpZiBsYXN0LgorICAgKgorICAgKiAgIGRhdGEgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgbGlzdGVkIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0Tm9kZVJlY18KICAgewogICAgIEZUX0xpc3ROb2RlICBwcmV2OwpAQCAtNTUwLDIwICs1NjEsMjIgQEAKICAgfSBGVF9MaXN0Tm9kZVJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHNpbXBsZSBkb3VibHktbGlua2VkIGxpc3QuICBUaGVzZSBhcmUgICAqLwotICAvKiAgICB1c2VkIGluIG1hbnkgcGFydHMgb2YgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWFkIDo6IFRoZSBoZWFkIChmaXJzdCBlbGVtZW50KSBvZiBkb3VibHktbGlua2VkIGxpc3QuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhaWwgOjogVGhlIHRhaWwgKGxhc3QgZWxlbWVudCkgb2YgZG91Ymx5LWxpbmtlZCBsaXN0LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTGlzdFJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGEgc2ltcGxlIGRvdWJseS1saW5rZWQgbGlzdC4gIFRoZXNlIGFyZSB1c2VkCisgICAqICAgaW4gbWFueSBwYXJ0cyBvZiBGcmVlVHlwZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBoZWFkIDo6CisgICAqICAgICBUaGUgaGVhZCAoZmlyc3QgZWxlbWVudCkgb2YgZG91Ymx5LWxpbmtlZCBsaXN0LgorICAgKgorICAgKiAgIHRhaWwgOjoKKyAgICogICAgIFRoZSB0YWlsIChsYXN0IGVsZW1lbnQpIG9mIGRvdWJseS1saW5rZWQgbGlzdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0UmVjXwogICB7CiAgICAgRlRfTGlzdE5vZGUgIGhlYWQ7CkBAIC01NzUsMTMgKzU4OCwxMyBAQAogCiAKICNkZWZpbmUgRlRfSVNfRU1QVFkoIGxpc3QgKSAgKCAobGlzdCkuaGVhZCA9PSAwICkKLSNkZWZpbmUgRlRfQk9PTCggeCApICAoIChGVF9Cb29sKSggeCApICkKKyNkZWZpbmUgRlRfQk9PTCggeCApICAoIChGVF9Cb29sKSggKHgpICE9IDAgKSApCiAKICAgLyogY29uY2F0ZW5hdGUgQyB0b2tlbnMgKi8KICNkZWZpbmUgRlRfRVJSX1hDQVQoIHgsIHkgKSAgeCAjIyB5CiAjZGVmaW5lIEZUX0VSUl9DQVQoIHgsIHkgKSAgIEZUX0VSUl9YQ0FUKCB4LCB5ICkKIAotICAvKiBzZWUgYGZ0bW9kZXJyLmgnIGZvciBkZXNjcmlwdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBtYWNyb3MgKi8KKyAgLyogc2VlIGBmdG1vZGVyci5oYCBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zICovCiAKICNkZWZpbmUgRlRfRVJSKCBlICkgIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmgKaW5kZXggNDYxYzY1Yi4uNzg2NTI4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaApAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR3aW5mbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFdpbmRvd3MgZm50LXNwZWNpZmljIGRhdGEuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnR3aW5mbnQuaAorICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgV2luZG93cyBmbnQtc3BlY2lmaWMgZGF0YS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRXSU5GTlRfSF8KICNkZWZpbmUgRlRXSU5GTlRfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMiw0NCArMzEsNDMgQEAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2luZm50X2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93IEZOVCBGaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBXaW5kb3dzIEZOVCBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc2VjdGlvbjoKKyAgICogICB3aW5mbnRfZm9udHMKKyAgICoKKyAgICogQHRpdGxlOgorICAgKiAgIFdpbmRvdyBGTlQgRmlsZXMKKyAgICoKKyAgICogQGFic3RyYWN0OgorICAgKiAgIFdpbmRvd3MgRk5ULXNwZWNpZmljIEFQSS4KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgV2luZG93cyBGTlQtc3BlY2lmaWMKKyAgICogICBmdW5jdGlvbnMuCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIEZUX1dpbkZOVF9JRF9YWFgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgY2hhcnNldCcgYnl0ZSBpbgotICAgKiAgIEBGVF9XaW5GTlRfSGVhZGVyUmVjLiAgRXhhY3QgbWFwcGluZyB0YWJsZXMgZm9yIHRoZSB2YXJpb3VzIGNwWFhYWAotICAgKiAgIGVuY29kaW5ncyAoZXhjZXB0IGZvciBjcDEzNjEpIGNhbiBiZSBmb3VuZCBhdAotICAgKiAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMgaW4gdGhlIE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MKLSAgICogICBzdWJkaXJlY3RvcnkuICBjcDEzNjEgaXMgcm91Z2hseSBhIHN1cGVyc2V0IG9mCi0gICAqICAgTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvS1NDL0pPSEFCLlRYVC4KKyAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGNoYXJzZXRgIGJ5dGUgaW4gQEZUX1dpbkZOVF9IZWFkZXJSZWMuIAorICAgKiAgIEV4YWN0IG1hcHBpbmcgdGFibGVzIGZvciB0aGUgdmFyaW91cyAnY3BYWFhYJyBlbmNvZGluZ3MgKGV4Y2VwdCBmb3IKKyAgICogICAnY3AxMzYxJykgY2FuIGJlIGZvdW5kIGF0ICdmdHA6Ly9mdHAudW5pY29kZS5vcmcvUHVibGljLycgaW4gdGhlCisgICAqICAgYE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1NgIHN1YmRpcmVjdG9yeS4gICdjcDEzNjEnIGlzIHJvdWdobHkgYQorICAgKiAgIHN1cGVyc2V0IG9mIGBNQVBQSU5HUy9PQlNPTEVURS9FQVNUQVNJQS9LU0MvSk9IQUIuVFhUYC4KICAgICoKICAgICogQHZhbHVlczoKICAgICogICBGVF9XaW5GTlRfSURfREVGQVVMVCA6OgotICAgKiAgICAgVGhpcyBpcyB1c2VkIGZvciBmb250IGVudW1lcmF0aW9uIGFuZCBmb250IGNyZWF0aW9uIGFzIGEKLSAgICogICAgIGBkb24ndCBjYXJlJyB2YWx1ZS4gIFZhbGlkIGZvbnQgZmlsZXMgZG9uJ3QgY29udGFpbiB0aGlzIHZhbHVlLgotICAgKiAgICAgV2hlbiBxdWVyeWluZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGZvbnQKLSAgICogICAgIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGludG8gYSBzcGVjaWZpZWQgZGV2aWNlIGNvbnRleHQsIHRoaXMKLSAgICogICAgIHJldHVybiB2YWx1ZSAob2YgdGhlIHJlbGF0ZWQgV2luZG93cyBBUEkpIHNpbXBseSBkZW5vdGVzIGZhaWx1cmUuCisgICAqICAgICBUaGlzIGlzIHVzZWQgZm9yIGZvbnQgZW51bWVyYXRpb24gYW5kIGZvbnQgY3JlYXRpb24gYXMgYSAnZG9uJ3QKKyAgICogICAgIGNhcmUnIHZhbHVlLiAgVmFsaWQgZm9udCBmaWxlcyBkb24ndCBjb250YWluIHRoaXMgdmFsdWUuICBXaGVuCisgICAqICAgICBxdWVyeWluZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGZvbnQgdGhhdCBpcworICAgKiAgICAgY3VycmVudGx5IHNlbGVjdGVkIGludG8gYSBzcGVjaWZpZWQgZGV2aWNlIGNvbnRleHQsIHRoaXMgcmV0dXJuCisgICAqICAgICB2YWx1ZSAob2YgdGhlIHJlbGF0ZWQgV2luZG93cyBBUEkpIHNpbXBseSBkZW5vdGVzIGZhaWx1cmUuCiAgICAqCiAgICAqICAgRlRfV2luRk5UX0lEX1NZTUJPTCA6OgogICAgKiAgICAgVGhlcmUgaXMgbm8ga25vd24gbWFwcGluZyB0YWJsZSBhdmFpbGFibGUuCkBAIC04MCwyNiArNzgsMjcgQEAKICAgICogICBGVF9XaW5GTlRfSURfT0VNIDo6CiAgICAqICAgICBGcm9tIE1pY2hhZWwgUG9ldHRnZW4gPG1pY2hhZWxAcG9ldHRnZW4uZGU+OgogICAgKgotICAgKiAgICAgICBUaGUgYFdpbmRvd3MgRm9udCBNYXBwaW5nJyBhcnRpY2xlIHNheXMgdGhhdCBGVF9XaW5GTlRfSURfT0VNCi0gICAqICAgICAgIGlzIHVzZWQgZm9yIHRoZSBjaGFyc2V0IG9mIHZlY3RvciBmb250cywgbGlrZSBgbW9kZXJuLmZvbicsCi0gICAqICAgICAgIGByb21hbi5mb24nLCBhbmQgYHNjcmlwdC5mb24nIG9uIFdpbmRvd3MuCisgICAqICAgICBUaGUgJ1dpbmRvd3MgRm9udCBNYXBwaW5nJyBhcnRpY2xlIHNheXMgdGhhdCBgRlRfV2luRk5UX0lEX09FTWAgaXMKKyAgICogICAgIHVzZWQgZm9yIHRoZSBjaGFyc2V0IG9mIHZlY3RvciBmb250cywgbGlrZSBgbW9kZXJuLmZvbmAsCisgICAqICAgICBgcm9tYW4uZm9uYCwgYW5kIGBzY3JpcHQuZm9uYCBvbiBXaW5kb3dzLgogICAgKgotICAgKiAgICAgICBUaGUgYENyZWF0ZUZvbnQnIGRvY3VtZW50YXRpb24gc2F5czogVGhlIEZUX1dpbkZOVF9JRF9PRU0gdmFsdWUKLSAgICogICAgICAgc3BlY2lmaWVzIGEgY2hhcmFjdGVyIHNldCB0aGF0IGlzIG9wZXJhdGluZy1zeXN0ZW0gZGVwZW5kZW50LgorICAgKiAgICAgVGhlICdDcmVhdGVGb250JyBkb2N1bWVudGF0aW9uIHNheXM6IFRoZSBgRlRfV2luRk5UX0lEX09FTWAgdmFsdWUKKyAgICogICAgIHNwZWNpZmllcyBhIGNoYXJhY3RlciBzZXQgdGhhdCBpcyBvcGVyYXRpbmctc3lzdGVtIGRlcGVuZGVudC4KICAgICoKLSAgICogICAgICAgVGhlIGBJRklNRVRSSUNTJyBkb2N1bWVudGF0aW9uIGZyb20gdGhlIGBXaW5kb3dzIERyaXZlcgotICAgKiAgICAgICBEZXZlbG9wbWVudCBLaXQnIHNheXM6IFRoaXMgZm9udCBzdXBwb3J0cyBhbiBPRU0tc3BlY2lmaWMKLSAgICogICAgICAgY2hhcmFjdGVyIHNldC4gIFRoZSBPRU0gY2hhcmFjdGVyIHNldCBpcyBzeXN0ZW0gZGVwZW5kZW50LgorICAgKiAgICAgVGhlICdJRklNRVRSSUNTJyBkb2N1bWVudGF0aW9uIGZyb20gdGhlICdXaW5kb3dzIERyaXZlciBEZXZlbG9wbWVudAorICAgKiAgICAgS2l0JyBzYXlzOiBUaGlzIGZvbnQgc3VwcG9ydHMgYW4gT0VNLXNwZWNpZmljIGNoYXJhY3RlciBzZXQuICBUaGUKKyAgICogICAgIE9FTSBjaGFyYWN0ZXIgc2V0IGlzIHN5c3RlbSBkZXBlbmRlbnQuCiAgICAqCi0gICAqICAgICAgIEluIGdlbmVyYWwgT0VNLCBhcyBvcHBvc2VkIHRvIEFOU0kgKGkuZS4sIGNwMTI1MiksIGRlbm90ZXMgdGhlCi0gICAqICAgICAgIHNlY29uZCBkZWZhdWx0IGNvZGVwYWdlIHRoYXQgbW9zdCBpbnRlcm5hdGlvbmFsIHZlcnNpb25zIG9mCi0gICAqICAgICAgIFdpbmRvd3MgaGF2ZS4gIEl0IGlzIG9uZSBvZiB0aGUgT0VNIGNvZGVwYWdlcyBmcm9tCisgICAqICAgICBJbiBnZW5lcmFsIE9FTSwgYXMgb3Bwb3NlZCB0byBBTlNJIChpLmUuLCAnY3AxMjUyJyksIGRlbm90ZXMgdGhlCisgICAqICAgICBzZWNvbmQgZGVmYXVsdCBjb2RlcGFnZSB0aGF0IG1vc3QgaW50ZXJuYXRpb25hbCB2ZXJzaW9ucyBvZiBXaW5kb3dzCisgICAqICAgICBoYXZlLiAgSXQgaXMgb25lIG9mIHRoZSBPRU0gY29kZXBhZ2VzIGZyb20KICAgICoKLSAgICogICAgICAgICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9nb2dsb2JhbC9iYjk2NDY1NSwKKyAgICogICAgIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3MvZGVza3RvcC9pbnRsL2NvZGUtcGFnZS1pZGVudGlmaWVycworICAgKiAgICAgLAogICAgKgotICAgKiAgICAgICBhbmQgaXMgdXNlZCBmb3IgdGhlIGBET1MgYm94ZXMnLCB0byBzdXBwb3J0IGxlZ2FjeSBhcHBsaWNhdGlvbnMuCi0gICAqICAgICAgIEEgR2VybWFuIFdpbmRvd3MgdmVyc2lvbiBmb3IgZXhhbXBsZSB1c3VhbGx5IHVzZXMgQU5TSSBjb2RlcGFnZQotICAgKiAgICAgICAxMjUyIGFuZCBPRU0gY29kZXBhZ2UgODUwLgorICAgKiAgICAgYW5kIGlzIHVzZWQgZm9yIHRoZSAnRE9TIGJveGVzJywgdG8gc3VwcG9ydCBsZWdhY3kgYXBwbGljYXRpb25zLiAgQQorICAgKiAgICAgR2VybWFuIFdpbmRvd3MgdmVyc2lvbiBmb3IgZXhhbXBsZSB1c3VhbGx5IHVzZXMgQU5TSSBjb2RlcGFnZSAxMjUyCisgICAqICAgICBhbmQgT0VNIGNvZGVwYWdlIDg1MC4KICAgICoKICAgICogICBGVF9XaW5GTlRfSURfQ1A4NzQgOjoKICAgICogICAgIEEgc3VwZXJzZXQgb2YgVGhhaSBUSVMgNjIwIGFuZCBJU08gODg1OS0xMS4KQEAgLTExMiw4ICsxMTEsOCBAQAogICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgogICAgKgogICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk0OSA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBLb3JlYW4gSGFuZ3VsIEtTfkMgNTYwMS0xOTg3ICh3aXRoIGRpZmZlcmVudAotICAgKiAgICAgb3JkZXJpbmcgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgorICAgKiAgICAgQSBzdXBlcnNldCBvZiBLb3JlYW4gSGFuZ3VsIEtTfkMgNTYwMS0xOTg3ICh3aXRoIGRpZmZlcmVudCBvcmRlcmluZworICAgKiAgICAgYW5kIG1pbm9yIGRldmlhdGlvbnMpLgogICAgKgogICAgKiAgIEZUX1dpbkZOVF9JRF9DUDk1MCA6OgogICAgKiAgICAgQSBzdXBlcnNldCBvZiB0cmFkaXRpb25hbCBDaGluZXNlIEJpZ341IEVUZW4gKHdpdGggZGlmZmVyZW50CkBAIC0xNzMsMTQgKzE3MiwxNCBAQAogI2RlZmluZSBGVF9XaW5GTlRfSURfT0VNICAgICAyNTUKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdpbmRvd3MgRk5UIEhlYWRlciBpbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfV2luRk5UX0hlYWRlclJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgV2luZG93cyBGTlQgSGVhZGVyIGluZm8uCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfV2luRk5UX0hlYWRlclJlY18KICAgewogICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsKQEAgLTIyMywxOCArMjIyLDE4IEBACiAgIH0gRlRfV2luRk5UX0hlYWRlclJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1dpbkZOVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIEBGVF9XaW5GTlRfSGVhZGVyUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfV2luRk5UX0hlYWRlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYW4gQEZUX1dpbkZOVF9IZWFkZXJSZWMgc3RydWN0dXJlLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgRlRfV2luRk5UX0hlYWRlclJlY18qICBGVF9XaW5GTlRfSGVhZGVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdGlvbjoKICAgICogICAgRlRfR2V0X1dpbkZOVF9IZWFkZXIKQEAgLTI0MywxMCArMjQyLDEyIEBACiAgICAqICAgIFJldHJpZXZlIGEgV2luZG93cyBGTlQgZm9udCBpbmZvIGhlYWRlci4KICAgICoKICAgICogQGlucHV0OgotICAgKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgorICAgKiAgICBmYWNlIDo6CisgICAqICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCiAgICAqCiAgICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFoZWFkZXIgOjogVGhlIFdpbkZOVCBoZWFkZXIuCisgICAqICAgIGFoZWFkZXIgOjoKKyAgICogICAgICBUaGUgV2luRk5UIGhlYWRlci4KICAgICoKICAgICogQHJldHVybjoKICAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oCmluZGV4IGY0ZDMwOGYuLjJhNDcyZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgKQEAgLTEsNzcgKzEsNzYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGF1dG9oaW50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIGBhdXRvaGludCcgbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGF1dG9oaW50LmgKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgJ2F1dG9oaW50JyBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgYXV0by1oaW50ZXIgaXMgdXNlZCB0byBsb2FkIGFuZCBhdXRvbWF0aWNhbGx5IGhpbnQgZ2x5cGhzIGlmIGEgICAgKi8KLSAgLyogZm9ybWF0LXNwZWNpZmljIGhpbnRlciBpc24ndCBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBhdXRvLWhpbnRlciBpcyB1c2VkIHRvIGxvYWQgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBnbHlwaHMgaWYgYQorICAgKiBmb3JtYXQtc3BlY2lmaWMgaGludGVyIGlzbid0IGF2YWlsYWJsZS4KKyAgICoKKyAgICovCiAKIAogI2lmbmRlZiBBVVRPSElOVF9IXwogI2RlZmluZSBBVVRPSElOVF9IXwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNtYWxsIHRlY2huaWNhbCBub3RlIHJlZ2FyZGluZyBhdXRvbWF0aWMgaGludGluZyBpbiBvcmRlciB0byAgICAgICAgKi8KLSAgLyogY2xhcmlmeSB0aGlzIG1vZHVsZSBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbiBhdXRvbWF0aWMgaGludGVyIG1pZ2h0IGNvbXB1dGUgdHdvIGtpbmRzIG9mIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZTogKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2xvYmFsIGhpbnRzOiBVc3VhbGx5IHNvbWUgbWV0cmljcyB0aGF0IGRlc2NyaWJlIGdsb2JhbCBwcm9wZXJ0aWVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgb2YgdGhlIGZhY2UuICBJdCBpcyBjb21wdXRlZCBieSBzY2FubmluZyBtb3JlIG9yIGxlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFnZ3Jlc3NpdmVseSB0aGUgZ2x5cGhzIGluIHRoZSBmYWNlLCBhbmQgdGh1cyBjYW4gYmUgICovCi0gIC8qICAgICAgICAgICAgICAgICB2ZXJ5IHNsb3cgdG8gY29tcHV0ZSAoZXZlbiBpZiB0aGUgc2l6ZSBvZiBnbG9iYWwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgaGludHMgaXMgcmVhbGx5IHNtYWxsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2x5cGggaGludHM6ICBUaGVzZSBkZXNjcmliZSBzb21lIGltcG9ydGFudCBmZWF0dXJlcyBvZiB0aGUgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgb3V0bGluZSwgYXMgd2VsbCBhcyBob3cgdG8gYWxpZ24gdGhlbS4gIFRoZXkgYXJlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGdlbmVyYWxseSBtdWNoIGZhc3RlciB0byBjb21wdXRlIHRoYW4gZ2xvYmFsIGhpbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgY3VycmVudCBGcmVlVHlwZSBhdXRvLWhpbnRlciBkb2VzIGEgcHJldHR5IGdvb2Qgam9iIHdoaWxlICAgICAgICAgKi8KLSAgLyogcGVyZm9ybWluZyBmYXN0IGNvbXB1dGF0aW9ucyBmb3IgYm90aCBnbG9iYWwgYW5kIGdseXBoIGhpbnRzLiAgICAgICAgICovCi0gIC8qIEhvd2V2ZXIsIHdlIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gaW50cm9kdWNpbmcgbW9yZSBjb21wbGV4IGFuZCAgICAgICAqLwotICAvKiBwb3dlcmZ1bCBhbGdvcml0aG1zIGluIHRoZSBmdXR1cmUsIGxpa2UgdGhlIG9uZSBkZXNjcmliZWQgaW4gdGhlIEpvaG4gKi8KLSAgLyogRC4gSG9iYnkgcGFwZXIsIHdoaWNoIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgYSBsb3QgbW9yZSBob3JzZXBvd2VyLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCZWNhdXNlIGEgc3VmZmljaWVudGx5IHNvcGhpc3RpY2F0ZWQgZm9udCBtYW5hZ2VtZW50IHN5c3RlbSB3b3VsZCAgICAgKi8KLSAgLyogdHlwaWNhbGx5IGltcGxlbWVudCBhbiBMUlUgY2FjaGUgb2Ygb3BlbmVkIGZhY2Ugb2JqZWN0cyB0byByZWR1Y2UgICAgICovCi0gIC8qIG1lbW9yeSB1c2FnZSwgaXQgaXMgYSBnb29kIGlkZWEgdG8gYmUgYWJsZSB0byBhdm9pZCByZWNvbXB1dGluZyAgICAgICAqLwotICAvKiBnbG9iYWwgaGludHMgZXZlcnkgdGltZSB0aGUgc2FtZSBmYWNlIGlzIHJlLW9wZW5lZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdlIHRodXMgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjYWNoZSBnbG9iYWwgaGludHMgb3V0c2lkZSBvZiB0aGUgZmFjZSAqLwotICAvKiBvYmplY3QsIGluIG9yZGVyIHRvIHNwZWVkIHVwIGZvbnQgcmUtb3BlbmluZyB0aW1lLiAgT2YgY291cnNlLCB0aGlzICAgKi8KLSAgLyogZmVhdHVyZSBpcyBwdXJlbHkgb3B0aW9uYWwsIHNvIG1vc3QgY2xpZW50IHByb2dyYW1zIHdvbid0IGV2ZW4gbm90aWNlICovCi0gIC8qIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSSBpbml0aWFsbHkgdGhvdWdodCB0aGF0IGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoZSBnbHlwaCAgICovCi0gIC8qIGhpbnRzIHRvby4gIEhvd2V2ZXIsIG15IGdlbmVyYWwgaWRlYSBub3cgaXMgdGhhdCBpZiB5b3UgcmVhbGx5IG5lZWQgICAqLwotICAvKiB0byBjYWNoZSB0aGVzZSB0b28sIHlvdSBhcmUgc2ltcGx5IGluIG5lZWQgb2YgYSBuZXcgZm9udCBmb3JtYXQsICAgICAgKi8KLSAgLyogd2hlcmUgYWxsIHRoaXMgaW5mb3JtYXRpb24gY291bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUgZm9udCBmaWxlIGFuZCAgICovCi0gIC8qIGRlY29kZWQgb24gdGhlIGZseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBIHNtYWxsIHRlY2huaWNhbCBub3RlIHJlZ2FyZGluZyBhdXRvbWF0aWMgaGludGluZyBpbiBvcmRlciB0byBjbGFyaWZ5CisgICAqIHRoaXMgbW9kdWxlIGludGVyZmFjZS4KKyAgICoKKyAgICogQW4gYXV0b21hdGljIGhpbnRlciBtaWdodCBjb21wdXRlIHR3byBraW5kcyBvZiBkYXRhIGZvciBhIGdpdmVuIGZhY2U6CisgICAqCisgICAqIC0gZ2xvYmFsIGhpbnRzOiBVc3VhbGx5IHNvbWUgbWV0cmljcyB0aGF0IGRlc2NyaWJlIGdsb2JhbCBwcm9wZXJ0aWVzCisgICAqICAgICAgICAgICAgICAgICBvZiB0aGUgZmFjZS4gIEl0IGlzIGNvbXB1dGVkIGJ5IHNjYW5uaW5nIG1vcmUgb3IgbGVzcworICAgKiAgICAgICAgICAgICAgICAgYWdncmVzc2l2ZWx5IHRoZSBnbHlwaHMgaW4gdGhlIGZhY2UsIGFuZCB0aHVzIGNhbiBiZQorICAgKiAgICAgICAgICAgICAgICAgdmVyeSBzbG93IHRvIGNvbXB1dGUgKGV2ZW4gaWYgdGhlIHNpemUgb2YgZ2xvYmFsIGhpbnRzCisgICAqICAgICAgICAgICAgICAgICBpcyByZWFsbHkgc21hbGwpLgorICAgKgorICAgKiAtIGdseXBoIGhpbnRzOiBUaGVzZSBkZXNjcmliZSBzb21lIGltcG9ydGFudCBmZWF0dXJlcyBvZiB0aGUgZ2x5cGgKKyAgICogICAgICAgICAgICAgICAgIG91dGxpbmUsIGFzIHdlbGwgYXMgaG93IHRvIGFsaWduIHRoZW0uICBUaGV5IGFyZQorICAgKiAgICAgICAgICAgICAgICAgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBnbG9iYWwgaGludHMuCisgICAqCisgICAqIFRoZSBjdXJyZW50IEZyZWVUeXBlIGF1dG8taGludGVyIGRvZXMgYSBwcmV0dHkgZ29vZCBqb2Igd2hpbGUgcGVyZm9ybWluZworICAgKiBmYXN0IGNvbXB1dGF0aW9ucyBmb3IgYm90aCBnbG9iYWwgYW5kIGdseXBoIGhpbnRzLiAgSG93ZXZlciwgd2UgbWlnaHQgYmUKKyAgICogaW50ZXJlc3RlZCBpbiBpbnRyb2R1Y2luZyBtb3JlIGNvbXBsZXggYW5kIHBvd2VyZnVsIGFsZ29yaXRobXMgaW4gdGhlCisgICAqIGZ1dHVyZSwgbGlrZSB0aGUgb25lIGRlc2NyaWJlZCBpbiB0aGUgSm9obiBELiBIb2JieSBwYXBlciwgd2hpY2gKKyAgICogdW5mb3J0dW5hdGVseSByZXF1aXJlcyBhIGxvdCBtb3JlIGhvcnNlcG93ZXIuCisgICAqCisgICAqIEJlY2F1c2UgYSBzdWZmaWNpZW50bHkgc29waGlzdGljYXRlZCBmb250IG1hbmFnZW1lbnQgc3lzdGVtIHdvdWxkCisgICAqIHR5cGljYWxseSBpbXBsZW1lbnQgYW4gTFJVIGNhY2hlIG9mIG9wZW5lZCBmYWNlIG9iamVjdHMgdG8gcmVkdWNlIG1lbW9yeQorICAgKiB1c2FnZSwgaXQgaXMgYSBnb29kIGlkZWEgdG8gYmUgYWJsZSB0byBhdm9pZCByZWNvbXB1dGluZyBnbG9iYWwgaGludHMKKyAgICogZXZlcnkgdGltZSB0aGUgc2FtZSBmYWNlIGlzIHJlLW9wZW5lZC4KKyAgICoKKyAgICogV2UgdGh1cyBwcm92aWRlIHRoZSBhYmlsaXR5IHRvIGNhY2hlIGdsb2JhbCBoaW50cyBvdXRzaWRlIG9mIHRoZSBmYWNlCisgICAqIG9iamVjdCwgaW4gb3JkZXIgdG8gc3BlZWQgdXAgZm9udCByZS1vcGVuaW5nIHRpbWUuICBPZiBjb3Vyc2UsIHRoaXMKKyAgICogZmVhdHVyZSBpcyBwdXJlbHkgb3B0aW9uYWwsIHNvIG1vc3QgY2xpZW50IHByb2dyYW1zIHdvbid0IGV2ZW4gbm90aWNlCisgICAqIGl0LgorICAgKgorICAgKiBJIGluaXRpYWxseSB0aG91Z2h0IHRoYXQgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhlIGdseXBoCisgICAqIGhpbnRzIHRvby4gIEhvd2V2ZXIsIG15IGdlbmVyYWwgaWRlYSBub3cgaXMgdGhhdCBpZiB5b3UgcmVhbGx5IG5lZWQgdG8KKyAgICogY2FjaGUgdGhlc2UgdG9vLCB5b3UgYXJlIHNpbXBseSBpbiBuZWVkIG9mIGEgbmV3IGZvbnQgZm9ybWF0LCB3aGVyZSBhbGwKKyAgICogdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQgd2l0aGluIHRoZSBmb250IGZpbGUgYW5kIGRlY29kZWQgb24gdGhlCisgICAqIGZseS4KKyAgICoKKyAgICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTgwLDI3ICs3OSwzMSBAQAogICB0eXBlZGVmIHN0cnVjdCBGVF9BdXRvSGludGVyUmVjXyAgKkZUX0F1dG9IaW50ZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGhpbnRzIGNvbXB1dGVkIGZvciBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhlICAgKi8KLSAgLyogICAgcmVzdWx0aW5nIGRhdGEgaXMgZGlzc29jaWF0ZWQgZnJvbSB0aGUgZmFjZSBhbmQgd2lsbCBzdXJ2aXZlIGEgICAgICovCi0gIC8qICAgIGNhbGwgdG8gRlRfRG9uZV9GYWNlKCkuICBJdCBtdXN0IGJlIGRpc2NhcmRlZCB0aHJvdWdoIHRoZSBBUEkgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBhdXRvLWhpbnRlci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbF9oaW50cyA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBoaW50cy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsX2xlbiAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBnbG9iYWwgaGludHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0cmlldmUgdGhlIGdsb2JhbCBoaW50cyBjb21wdXRlZCBmb3IgYSBnaXZlbiBmYWNlIG9iamVjdC4gIFRoZQorICAgKiAgIHJlc3VsdGluZyBkYXRhIGlzIGRpc3NvY2lhdGVkIGZyb20gdGhlIGZhY2UgYW5kIHdpbGwgc3Vydml2ZSBhIGNhbGwgdG8KKyAgICogICBGVF9Eb25lX0ZhY2UoKS4gIEl0IG11c3QgYmUgZGlzY2FyZGVkIHRocm91Z2ggdGhlIEFQSQorICAgKiAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMoKS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGhpbnRlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBhdXRvLWhpbnRlci4KKyAgICoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGdsb2JhbF9oaW50cyA6OgorICAgKiAgICAgQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBnbG9iYWwgaGludHMuCisgICAqCisgICAqICAgZ2xvYmFsX2xlbiA6OgorICAgKiAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGdsb2JhbCBoaW50cy4KKyAgICovCiAgIHR5cGVkZWYgdm9pZAogICAoKkZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLApAQCAtMTA4LDY5ICsxMTEsNzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiAgICAgICAgICBnbG9iYWxfbGVuICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIHRoZSBnbG9iYWwgaGludHMgcmV0cmlldmVkIHRocm91Z2ggICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxHZXRGdW5jKCkuICBUaGlzIGlzIHRoZSBvbmx5IHdheSB0aGVzZSBoaW50cyAgICovCi0gIC8qICAgIGFyZSBmcmVlZCBmcm9tIG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgYXV0by1oaW50ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsIDo6IEEgcG9pbnRlciB0byByZXRyaWV2ZWQgZ2xvYmFsIGhpbnRzIHRvIGRpc2NhcmQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsRG9uZUZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIERpc2NhcmQgdGhlIGdsb2JhbCBoaW50cyByZXRyaWV2ZWQgdGhyb3VnaAorICAgKiAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYygpLiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdGhlc2UgaGludHMgYXJlCisgICAqICAgZnJlZWQgZnJvbSBtZW1vcnkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50ZXIgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBhdXRvLWhpbnRlciBtb2R1bGUuCisgICAqCisgICAqICAgZ2xvYmFsIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gcmV0cmlldmVkIGdsb2JhbCBoaW50cyB0byBkaXNjYXJkLgorICAgKi8KICAgdHlwZWRlZiB2b2lkCiAgICgqRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgZ2xvYmFsICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjb21wdXRlIHRoZSBnbG9iYWwgbWV0cmljcyBpbiBhIGdpdmVuICAgKi8KLSAgLyogICAgZm9udC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gZ2xvYmFsIGZvbnQgZGF0YSBjaGFuZ2VzIChlLmcuIE11bHRpcGxlICovCi0gIC8qICAgIE1hc3RlcnMgZm9udHMgd2hlcmUgYmxlbmQgY29vcmRpbmF0ZXMgY2hhbmdlKS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsUmVzZXRGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjb21wdXRlIHRoZSBnbG9iYWwgbWV0cmljcyBpbiBhIGdpdmVuIGZvbnQuCisgICAqICAgVGhpcyBpcyB1c2VmdWwgd2hlbiBnbG9iYWwgZm9udCBkYXRhIGNoYW5nZXMgKGUuZy4gTXVsdGlwbGUgTWFzdGVycworICAgKiAgIGZvbnRzIHdoZXJlIGJsZW5kIGNvb3JkaW5hdGVzIGNoYW5nZSkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBoaW50ZXIgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgYXV0by1oaW50ZXIuCisgICAqCisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGZhY2UuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkLCBzY2FsZSwgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBhICAgICAqLwotICAvKiAgICBnbHlwaCBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogVGhlIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYXBhYmxlIG9mIGxvYWRpbmcgY29tcG9zaXRlIGdseXBocyBieSBoaW50aW5nICAgICovCi0gIC8qICAgIGVhY2ggc3ViLWdseXBoIGluZGVwZW5kZW50bHkgKHdoaWNoIGltcHJvdmVzIHF1YWxpdHkpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgd2lsbCBjYWxsIHRoZSBmb250IGRyaXZlciB3aXRoIEBGVF9Mb2FkX0dseXBoLCB3aXRoICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBGVF9BdXRvSGludGVyX0dseXBoTG9hZEZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkLCBzY2FsZSwgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBhIGdseXBoCisgICAqICAgZnJvbSBhIGdpdmVuIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgZmFjZS4KKyAgICoKKyAgICogICBnbHlwaF9pbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIFRoZSBsb2FkIGZsYWdzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIGNhcGFibGUgb2YgbG9hZGluZyBjb21wb3NpdGUgZ2x5cGhzIGJ5IGhpbnRpbmcgZWFjaAorICAgKiAgIHN1Yi1nbHlwaCBpbmRlcGVuZGVudGx5ICh3aGljaCBpbXByb3ZlcyBxdWFsaXR5KS4KKyAgICoKKyAgICogICBJdCB3aWxsIGNhbGwgdGhlIGZvbnQgZHJpdmVyIHdpdGggQEZUX0xvYWRfR2x5cGgsIHdpdGgKKyAgICogICBARlRfTE9BRF9OT19TQ0FMRSBzZXQuCisgICAqLwogICB0eXBlZGVmIEZUX0Vycm9yCiAgICgqRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jKSggRlRfQXV0b0hpbnRlciAgaGludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgIHNsb3QsCkBAIC0xNzksMTQgKzE4OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgIGxvYWRfZmxhZ3MgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBhdXRvLWhpbnRlciBtb2R1bGUncyBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBhdXRvLWhpbnRlciBtb2R1bGUncyBpbnRlcmZhY2UuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWNfCiAgIHsKICAgICBGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYyAgcmVzZXRfZmFjZTsKQEAgLTE5Nyw3ICsyMDcsOCBAQAogICB9IEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlUmVjLCAqRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2U7CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworI2RlZmluZSBGVF9ERUNMQVJFX0FVVE9ISU5URVJfSU5URVJGQUNFKCBjbGFzc18gKSAgICAgICAgICAgIFwKKyAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMgIGNsYXNzXzsKIAogI2RlZmluZSBGVF9ERUZJTkVfQVVUT0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgIFwKICAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMTQsMjcgKzIyNSw2IEBACiAgICAgbG9hZF9nbHlwaF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9BVVRPSElOVEVSX0lOVEVSRkFDRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXNldF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dseXBoXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYyogIGNsYXp6ICkgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJlc2V0X2ZhY2UgICAgICAgID0gcmVzZXRfZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2xvYmFsX2hpbnRzICA9IGdldF9nbG9iYWxfaGludHNfOyAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9nbG9iYWxfaGludHMgPSBkb25lX2dsb2JhbF9oaW50c187ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZ2x5cGggICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwogCiBGVF9FTkRfSEVBREVSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2Zmb3R5cGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oCmluZGV4IDU3ZTc1OTEuLmEzMTZmZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2Zmb3R5cGVzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaApAQCAtMSwzMCArMSwyOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2Zmb3R5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIE9wZW5UeXBlL0NGRiBvYmplY3QgdHlwZSBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDE3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2Zmb3R5cGVzLmgKKyAqCisgKiAgIEJhc2ljIE9wZW5UeXBlL0NGRiBvYmplY3QgdHlwZSBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRk9UWVBFU19IXwogI2RlZmluZSBDRkZPVFlQRVNfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC0zMywxNCArMzIsMTQgQEAKICAgdHlwZWRlZiBUVF9GYWNlICBDRkZfRmFjZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIE9wZW5UeXBlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIENGRl9TaXplCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBzaXplIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBDRkZfU2l6ZVJlY18KICAgewogICAgIEZUX1NpemVSZWMgIHJvb3Q7CkBAIC00OSwxNCArNDgsMTQgQEAKICAgfSBDRkZfU2l6ZVJlYywgKkNGRl9TaXplOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gT3BlblR5cGUgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgQ0ZGX0dseXBoU2xvdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYW4gT3BlblR5cGUgZ2x5cGggc2xvdCBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0dseXBoU2xvdFJlY18KICAgewogICAgIEZUX0dseXBoU2xvdFJlYyAgcm9vdDsKQEAgLTcwLDE0ICs2OSwxNCBAQAogICB9IENGRl9HbHlwaFNsb3RSZWMsICpDRkZfR2x5cGhTbG90OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGludGVyZmFjZSB0byB0aGUgYGludGVybmFsJyBmaWVsZCBvZiBgRlRfU2l6ZScuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgQ0ZGX0ludGVybmFsCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgaW50ZXJmYWNlIHRvIHRoZSAnaW50ZXJuYWwnIGZpZWxkIG9mIGBGVF9TaXplYC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBDRkZfSW50ZXJuYWxSZWNfCiAgIHsKICAgICBQU0hfR2xvYmFscyAgdG9wZm9udDsKQEAgLTg2LDEwICs4NSwxMCBAQAogICB9IENGRl9JbnRlcm5hbFJlYywgKkNGRl9JbnRlcm5hbDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gcmVjb3JkLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9UcmFuc2Zvcm1fCiAgIHsKICAgICBGVF9GaXhlZCAgICB4eCwgeHk7ICAgICAvKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggY29lZmZpY2llbnRzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmgKaW5kZXggN2MwN2UxYS4uZjIxMTY3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaApAQCAtMSw2NiArMSw3MCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmdHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIE9wZW5UeXBlL0NGRiB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZnR5cGVzLmgKKyAqCisgKiAgIEJhc2ljIE9wZW5UeXBlL0NGRiB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24KKyAqICAgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRlRZUEVTX0hfCiAjZGVmaW5lIENGRlRZUEVTX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90MXRhYmxlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9JbmRleFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBDRkYgSW5kZXggdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RhcnQgICAgICAgOjogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBpbmRleCBieXRlIGluIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICAgICAgOjogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kZXguICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZfc2l6ZSAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBvYmplY3Qgb2Zmc2V0cyBpbiBpbmRleC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGFfb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBvZiBmaXJzdCBkYXRhIGJ5dGUgaW4gdGhlIGluZGV4J3MgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGFfc2l6ZSAgIDo6IFRoZSBzaXplIG9mIHRoZSBkYXRhIHRhYmxlIGluIHRoaXMgaW5kZXguICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyAgICAgOjogQSB0YWJsZSBvZiBlbGVtZW50IG9mZnNldHMgaW4gdGhlIGluZGV4LiAgTXVzdCBiZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGxvYWRlZCBleHBsaWNpdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnl0ZXMgICAgICAgOjogSWYgdGhlIGluZGV4IGlzIGxvYWRlZCBpbiBtZW1vcnksIGl0cyBieXRlcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBDRkZfSW5kZXhSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBDRkYgSW5kZXggdGFibGUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgc291cmNlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogICBzdGFydCA6OgorICAgKiAgICAgVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBpbmRleCBieXRlIGluIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICAgY291bnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGluZGV4LgorICAgKgorICAgKiAgIG9mZl9zaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiBvYmplY3Qgb2Zmc2V0cyBpbiBpbmRleC4KKyAgICoKKyAgICogICBkYXRhX29mZnNldCA6OgorICAgKiAgICAgVGhlIHBvc2l0aW9uIG9mIGZpcnN0IGRhdGEgYnl0ZSBpbiB0aGUgaW5kZXgncyBieXRlcy4KKyAgICoKKyAgICogICBkYXRhX3NpemUgOjoKKyAgICogICAgIFRoZSBzaXplIG9mIHRoZSBkYXRhIHRhYmxlIGluIHRoaXMgaW5kZXguCisgICAqCisgICAqICAgb2Zmc2V0cyA6OgorICAgKiAgICAgQSB0YWJsZSBvZiBlbGVtZW50IG9mZnNldHMgaW4gdGhlIGluZGV4LiAgTXVzdCBiZSBsb2FkZWQgZXhwbGljaXRseS4KKyAgICoKKyAgICogICBieXRlcyA6OgorICAgKiAgICAgSWYgdGhlIGluZGV4IGlzIGxvYWRlZCBpbiBtZW1vcnksIGl0cyBieXRlcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBDRkZfSW5kZXhSZWNfCiAgIHsKICAgICBGVF9TdHJlYW0gIHN0cmVhbTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvY29tcGlsZXItbWFjcm9zLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzE4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oCkBAIC0wLDAgKzEsMzA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oCisgKgorICogICBDb21waWxlci1zcGVjaWZpYyBtYWNybyBkZWZpbml0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgRnJlZVR5cGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKyNpZm5kZWYgSU5URVJOQUxfQ09NUElMRVJfTUFDUk9TX0hfCisjZGVmaW5lIElOVEVSTkFMX0NPTVBJTEVSX01BQ1JPU19IXworCisjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaD4KKworRlRfQkVHSU5fSEVBREVSCisKKyAgLyogRml4IGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBzZ2kgY29tcGlsZXIuICovCisjaWYgZGVmaW5lZCggX19zZ2kgKSAmJiAhZGVmaW5lZCggX19HTlVDX18gKQorIyAgaWYgZGVmaW5lZCggX0NPTVBJTEVSX1ZFUlNJT04gKSAmJiAoIF9DT01QSUxFUl9WRVJTSU9OID49IDczMCApCisjICAgIHByYWdtYSBzZXQgd29mZiAzNTA1CisjICBlbmRpZgorI2VuZGlmCisKKyAgLyogRml4IGNvbXBpbGVyIHdhcm5pbmcgd2l0aCBzZ2kgY29tcGlsZXIuICovCisjaWYgZGVmaW5lZCggX19zZ2kgKSAmJiAhZGVmaW5lZCggX19HTlVDX18gKQorIyAgaWYgZGVmaW5lZCggX0NPTVBJTEVSX1ZFUlNJT04gKSAmJiAoIF9DT01QSUxFUl9WRVJTSU9OID49IDczMCApCisjICAgIHByYWdtYSBzZXQgd29mZiAzNTA1CisjICBlbmRpZgorI2VuZGlmCisKKyAgLyoKKyAgICogV2hlbiBkZWZpbmluZyBhIG1hY3JvIHRoYXQgZXhwYW5kcyB0byBhIG5vbi10cml2aWFsIEMgc3RhdGVtZW50LCB1c2UKKyAgICogRlRfQkVHSU5fU1RNTlQgYW5kIEZUX0VORF9TVE1OVCB0byBlbmNsb3NlIHRoZSBtYWNybydzIGJvZHkuICBUaGlzCisgICAqIGVuc3VyZXMgdGhlcmUgYXJlIG5vIHN1cnByaXNlcyB3aGVuIHRoZSBtYWNybyBpcyBpbnZva2VkIGluIGNvbmRpdGlvbmFsCisgICAqIGJyYW5jaGVzLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiAgICNkZWZpbmUgIExPRyggLi4uICkgICAgICAgIFwKKyAgICogICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICBcCisgICAqICAgICAgIGlmICggbG9nZ2luZ19lbmFibGVkICkgXAorICAgKiAgICAgICAgIGxvZyggX19WQV9BUkdTX18gKTsgIFwKKyAgICogICAgIEZUX0VORF9TVE1OVAorICAgKi8KKyNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKKyNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKKworICAvKgorICAgKiBGVF9EVU1NWV9TVE1OVCBleHBhbmRzIHRvIGFuIGVtcHR5IEMgc3RhdGVtZW50LiAgVXNlZnVsIGZvcgorICAgKiBjb25kaXRpb25hbGx5IGRlZmluZWQgc3RhdGVtZW50IG1hY3Jvcy4KKyAgICoKKyAgICogRXhhbXBsZToKKyAgICoKKyAgICogICAjaWZkZWYgQlVJTERfQ09ORklHX0xPR0dJTkcKKyAgICogICAjZGVmaW5lICBMT0coIC4uLiApICAgICAgICAgXAorICAgKiAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICBcCisgICAqICAgICAgICBpZiAoIGxvZ2dpbmdfZW5hYmxlZCApIFwKKyAgICogICAgICAgICAgbG9nKCBfX1ZBX0FSR1NfXyApOyAgXAorICAgKiAgICAgIEZUX0VORF9TVE1OVAorICAgKiAgICNlbHNlCisgICAqICAgIyAgZGVmaW5lIExPRyggLi4uICkgIEZUX0RVTU1ZX1NUTU5UCisgICAqICAgI2VuZGlmCisgICAqLworI2RlZmluZSBGVF9EVU1NWV9TVE1OVCAgRlRfQkVHSU5fU1RNTlQgRlRfRU5EX1NUTU5UCisKKyNpZmRlZiBfV0lONjQKKyAgLyogb25seSA2NGJpdCBXaW5kb3dzIHVzZXMgdGhlIExMUDY0IGRhdGEgbW9kZWwsIGkuZS4sICovCisgIC8qIDMyLWJpdCBpbnRlZ2VycywgNjQtYml0IHBvaW50ZXJzLiAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9VSU5UX1RPX1BPSU5URVIoIHggKSAgKHZvaWQgKikodW5zaWduZWQgX19pbnQ2NCkoeCkKKyNlbHNlCisjZGVmaW5lIEZUX1VJTlRfVE9fUE9JTlRFUiggeCApICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSh4KQorI2VuZGlmCisKKyAgLyoKKyAgICogVXNlIGBGVF9UWVBFT0YoIHR5cGUgKWAgdG8gY2FzdCBhIHZhbHVlIHRvIGB0eXBlYC4gIFRoaXMgaXMgdXNlZnVsIHRvCisgICAqIHN1cHByZXNzIHNpZ25lZG5lc3MgY29tcGlsYXRpb24gd2FybmluZ3MgaW4gbWFjcm9zLgorICAgKgorICAgKiBFeGFtcGxlOgorICAgKgorICAgKiAgICNkZWZpbmUgUEFEXyggeCwgbiApICAoICh4KSAmIH5GVF9UWVBFT0YoIHggKSggKG4pIC0gMSApICkKKyAgICoKKyAgICogKFRoZSBgdHlwZW9mYCBjb25kaXRpb24gaXMgdGFrZW4gZnJvbSBnbnVsaWIncyBgaW50cHJvcHMuaGAgaGVhZGVyCisgICAqIGZpbGUuKQorICAgKi8KKyNpZiAoICggZGVmaW5lZCggX19HTlVDX18gKSAmJiBfX0dOVUNfXyA+PSAyICkgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICggZGVmaW5lZCggX19JQk1DX18gKSAmJiBfX0lCTUNfXyA+PSAxMjEwICYmICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVmaW5lZCggX19JQk1fX1RZUEVPRl9fICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKKyAgICAgICggZGVmaW5lZCggX19TVU5QUk9fQyApICYmIF9fU1VOUFJPX0MgPj0gMHg1MTEwICYmICFfX1NURENfXyApICkKKyNkZWZpbmUgRlRfVFlQRU9GKCB0eXBlICkgICggX190eXBlb2ZfXyAoIHR5cGUgKSApCisjZWxzZQorI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KKyNlbmRpZgorCisgIC8qCisgICAqIE1hcmsgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhcyBpbnRlcm5hbCB0byB0aGUgbGlicmFyeS4gIFRoaXMgZW5zdXJlcworICAgKiB0aGF0IGl0IHdpbGwgbm90IGJlIGV4cG9zZWQgYnkgZGVmYXVsdCB0byBjbGllbnQgY29kZSwgYW5kIGhlbHBzCisgICAqIGdlbmVyYXRlIHNtYWxsZXIgYW5kIGZhc3RlciBjb2RlIG9uIEVMRi1iYXNlZCBwbGF0Zm9ybXMuICBQbGFjZSB0aGlzCisgICAqIGJlZm9yZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgorICAgKi8KKworICAvKiBWaXN1YWwgQywgbWluZ3cgKi8KKyNpZiBkZWZpbmVkKCBfV0lOMzIgKQorI2RlZmluZSBGVF9JTlRFUk5BTF9GVU5DVElPTl9BVFRSSUJVVEUgIC8qIGVtcHR5ICovCisKKyAgLyogZ2NjLCBjbGFuZyAqLworI2VsaWYgKCBkZWZpbmVkKCBfX0dOVUNfXyApICYmIF9fR05VQ19fID49IDQgKSB8fCBkZWZpbmVkKCBfX2NsYW5nX18gKQorI2RlZmluZSBGVF9JTlRFUk5BTF9GVU5DVElPTl9BVFRSSUJVVEUgIFwKKyAgICAgICAgICBfX2F0dHJpYnV0ZV9fKCggdmlzaWJpbGl0eSggImhpZGRlbiIgKSApKQorCisgIC8qIFN1biAqLworI2VsaWYgZGVmaW5lZCggX19TVU5QUk9fQyApICYmIF9fU1VOUFJPX0MgPj0gMHg1NTAKKyNkZWZpbmUgRlRfSU5URVJOQUxfRlVOQ1RJT05fQVRUUklCVVRFICBfX2hpZGRlbgorCisjZWxzZQorI2RlZmluZSBGVF9JTlRFUk5BTF9GVU5DVElPTl9BVFRSSUJVVEUgIC8qIGVtcHR5ICovCisjZW5kaWYKKworICAvKgorICAgKiBGcmVlVHlwZSBzdXBwb3J0cyBjb21waWxhdGlvbiBvZiBpdHMgQyBzb3VyY2VzIHdpdGggYSBDKysgY29tcGlsZXIgKGluCisgICAqIEMrKyBtb2RlKTsgdGhpcyBpbnRyb2R1Y2VzIGEgbnVtYmVyIG9mIHN1YnRsZSBpc3N1ZXMuCisgICAqCisgICAqIFRoZSBtYWluIG9uZSBpcyB0aGF0IGEgQysrIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGFuZCBpdHMgZGVmaW5pdGlvbiBtdXN0CisgICAqIGhhdmUgdGhlIHNhbWUgJ2xpbmthZ2UnLiAgQmVjYXVzZSBhbGwgRnJlZVR5cGUgaGVhZGVycyBkZWNsYXJlIHRoZWlyCisgICAqIGZ1bmN0aW9ucyB3aXRoIEMgbGlua2FnZSAoaS5lLiwgd2l0aGluIGFuIGBleHRlcm4gIkMiIHsgLi4uIH1gIGJsb2NrCisgICAqIGR1ZSB0byB0aGUgbWFnaWMgb2YgRlRfQkVHSU5fSEVBREVSIGFuZCBGVF9FTkRfSEVBREVSKSwgdGhlaXIKKyAgICogZGVmaW5pdGlvbiBpbiBGcmVlVHlwZSBzb3VyY2VzIHNob3VsZCBhbHNvIGJlIHByZWZpeGVkIHdpdGggYGV4dGVybgorICAgKiAiQyJgIHdoZW4gY29tcGlsZWQgaW4gQysrIG1vZGUuCisgICAqCisgICAqIFRoZSBgRlRfRlVOQ1RJT05fREVDTEFSQVRJT05gIGFuZCBgRlRfRlVOQ1RJT05fREVGSU5JVElPTmAgbWFjcm9zIGFyZQorICAgKiBwcm92aWRlZCB0byBkZWFsIHdpdGggdGhpcyBjYXNlLCBhcyB3ZWxsIGFzIGBGVF9DQUxMQkFDS19ERUZgIGFuZCBpdHMKKyAgICogc2libGluZ3MgYmVsb3cuCisgICAqLworCisgIC8qCisgICAqIGBGVF9GVU5DVElPTl9ERUNMQVJBVElPTiggdHlwZSApYCBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIEMgZnVuY3Rpb24KKyAgICogZGVjbGFyYXRpb24gdG8gZW5zdXJlIGl0IHdpbGwgaGF2ZSBDIGxpbmthZ2Ugd2hlbiB0aGUgbGlicmFyeSBpcyBidWlsdAorICAgKiB3aXRoIGEgQysrIGNvbXBpbGVyLiAgVGhlIHBhcmFtZXRlciBpcyB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdHlwZSwgc28gYQorICAgKiBkZWNsYXJhdGlvbiB3b3VsZCBsb29rIGxpa2UKKyAgICoKKyAgICogICAgRlRfRlVOQ1RJT05fREVDTEFSQVRJT04oIGludCApCisgICAqICAgIGZvbyggaW50IHggKTsKKyAgICoKKyAgICogTk9URTogVGhpcyByZXF1aXJlcyB0aGF0IGFsbCB1c2VzIGFyZSBpbnNpZGUgb2YgYEZUX0JFR0lOX0hFQURFUiAuLi4KKyAgICogRlRfRU5EX0hFQURFUmAgYmxvY2tzLCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyBoYXZlIEMKKyAgICogbGlua2FnZSB3aGVuIHRoZSBoZWFkZXJzIGFyZSBpbmNsdWRlZCBieSBDKysgc291cmNlcy4KKyAgICoKKyAgICogTk9URTogRG8gbm90IHVzZSBkaXJlY3RseS4gIFVzZSBgRlRfTE9DQUxgLCBgRlRfQkFTRWAsIGFuZCBgRlRfRVhQT1JUYAorICAgKiBpbnN0ZWFkLgorICAgKi8KKyNkZWZpbmUgRlRfRlVOQ1RJT05fREVDTEFSQVRJT04oIHggKSAgZXh0ZXJuIHgKKworICAvKgorICAgKiBTYW1lIGFzIGBGVF9GVU5DVElPTl9ERUNMQVJBVElPTmAsIGJ1dCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW5zdGVhZC4KKyAgICoKKyAgICogTk9URTogRG8gbm90IHVzZSBkaXJlY3RseS4gIFVzZSBgRlRfTE9DQUxfREVGYCwgYEZUX0JBU0VfREVGYCwgYW5kCisgICAqIGBGVF9FWFBPUlRfREVGYCBpbnN0ZWFkLgorICAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9GVU5DVElPTl9ERUZJTklUSU9OKCB4ICkgIGV4dGVybiAiQyIgeAorI2Vsc2UKKyNkZWZpbmUgRlRfRlVOQ1RJT05fREVGSU5JVElPTiggeCApICB4CisjZW5kaWYKKworICAvKgorICAgKiBVc2UgYEZUX0xPQ0FMYCBhbmQgYEZUX0xPQ0FMX0RFRmAgdG8gZGVjbGFyZSBhbmQgZGVmaW5lLCByZXNwZWN0aXZlbHksCisgICAqIGFuIGludGVybmFsIEZyZWVUeXBlIGZ1bmN0aW9uIHRoYXQgaXMgb25seSB1c2VkIGJ5IHRoZSBzb3VyY2VzIG9mIGEKKyAgICogc2luZ2xlIGBzcmMvbW9kdWxlL2AgZGlyZWN0b3J5LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmUKKyAgICogdHVybmVkIGludG8gc3RhdGljIG9uZXMgYXQgYnVpbGQgdGltZSwgcmVzdWx0aW5nIGluIHNtYWxsZXIgYW5kIGZhc3RlcgorICAgKiBjb2RlLgorICAgKi8KKyNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCisKKyNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyB4CisjZGVmaW5lIEZUX0xPQ0FMX0RFRiggeCApICBzdGF0aWMgeAorCisjZWxzZQorCisjZGVmaW5lIEZUX0xPQ0FMKCB4ICkgICAgICBGVF9JTlRFUk5BTF9GVU5DVElPTl9BVFRSSUJVVEUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRlVOQ1RJT05fREVDTEFSQVRJT04oIHggKQorI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgRlRfRlVOQ1RJT05fREVGSU5JVElPTiggeCApCisKKyNlbmRpZiAgLyogRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVCAqLworCisgIC8qCisgICAqIFVzZSBgRlRfTE9DQUxfQVJSQVlgIGFuZCBgRlRfTE9DQUxfQVJSQVlfREVGYCB0byBkZWNsYXJlIGFuZCBkZWZpbmUsCisgICAqIHJlc3BlY3RpdmVseSwgYSBjb25zdGFudCBhcnJheSB0aGF0IG11c3QgYmUgYWNjZXNzZWQgZnJvbSBzZXZlcmFsCisgICAqIHNvdXJjZXMgaW4gdGhlIHNhbWUgYHNyYy9tb2R1bGUvYCBzdWItZGlyZWN0b3J5LCBhbmQgd2hpY2ggYXJlIGludGVybmFsCisgICAqIHRvIHRoZSBsaWJyYXJ5LgorICAgKi8KKyNkZWZpbmUgRlRfTE9DQUxfQVJSQVkoIHggKSAgICAgIEZUX0lOVEVSTkFMX0ZVTkNUSU9OX0FUVFJJQlVURSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm4gY29uc3QgeAorI2RlZmluZSBGVF9MT0NBTF9BUlJBWV9ERUYoIHggKSAgRlRfRlVOQ1RJT05fREVGSU5JVElPTiggY29uc3QgeCApCisKKyAgLyoKKyAgICogYFVzZSBGVF9CQVNFYCBhbmQgYEZUX0JBU0VfREVGYCB0byBkZWNsYXJlIGFuZCBkZWZpbmUsIHJlc3BlY3RpdmVseSwgYW4KKyAgICogaW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgYnkgbW9yZSB0aGFuIGEgc2luZ2xlIG1vZHVsZS4KKyAgICovCisjZGVmaW5lIEZUX0JBU0UoIHggKSAgICAgIEZUX0lOVEVSTkFMX0ZVTkNUSU9OX0FUVFJJQlVURSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZVTkNUSU9OX0RFQ0xBUkFUSU9OKCB4ICkKKyNkZWZpbmUgRlRfQkFTRV9ERUYoIHggKSAgRlRfRlVOQ1RJT05fREVGSU5JVElPTiggeCApCisKKworICAvKgorICAgKiBOT1RFOiBDb25kaXRpb25hbGx5IGRlZmluZSBgRlRfRVhQT1JUX1ZBUmAgZHVlIHRvIGl0cyBkZWZpbml0aW9uIGluCisgICAqIGBzcmMvc21vb3RoL2Z0Z3JheXMuaGAgdG8gbWFrZSB0aGUgaGVhZGVyIG1vcmUgcG9ydGFibGUuCisgICAqLworI2lmbmRlZiBGVF9FWFBPUlRfVkFSCisjZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgRlRfRlVOQ1RJT05fREVDTEFSQVRJT04oIHggKQorI2VuZGlmCisKKyAgLyogV2hlbiBjb21waWxpbmcgRnJlZVR5cGUgYXMgYSBETEwgb3IgRFNPIHdpdGggaGlkZGVuIHZpc2liaWxpdHksICAgKi8KKyAgLyogc29tZSBzeXN0ZW1zL2NvbXBpbGVycyBuZWVkIGEgc3BlY2lhbCBhdHRyaWJ1dGUgaW4gZnJvbnQgT1IgYWZ0ZXIgKi8KKyAgLyogdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVHdvIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHRvIGRlZmluZSAgICAgKi8KKyAgLyogZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IGBGVF9FWFBPUlRgIGFuZCBgRlRfRVhQT1JUX0RFRmAuICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBgRlRfRVhQT1JUKCByZXR1cm5fdHlwZSApYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogLSBgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgLi4uIHNvbWUgY29kZSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBgYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIGBGVF9FWFBPUlRgIGFuZCAgICAgICAgKi8KKyAgLyogYEZUX0VYUE9SVF9ERUZgIGhlcmUgaWYgeW91IHdhbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVG8gZXhwb3J0IGEgdmFyaWFibGUsIHVzZSBgRlRfRVhQT1JUX1ZBUmAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBTZWUgYGZyZWV0eXBlL2NvbmZpZy9jb21waWxlcl9tYWNyb3MuaGAgZm9yIHRoZSBgRlRfRVhQT1JUYCBkZWZpbml0aW9uICovCisjZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgRlRfRlVOQ1RJT05fREVGSU5JVElPTiggeCApCisKKyAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCisgIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiYCBmb3IgKi8KKyAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCisgIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLworICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KKyAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbiwgICAgICAgICovCisgIC8qIGxvY2F0ZWQgaW4gdGhlIHNhbWUgc291cmNlIGNvZGUgZmlsZSBhcyB0aGUgc3RydWN0dXJlIHRoYXQgdXNlcyAqLworICAvKiBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX0JBU0VfQ0FMTEJBQ0sgYW5kIEZUX0JBU0VfQ0FMTEJBQ0tfREVGIGFyZSB1c2VkIHRvIGRlY2xhcmUgICAqLworICAvKiBhbmQgZGVmaW5lIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHJlc3BlY3RpdmVseSwgaW4gYSBzaW1pbGFyIHdheSAgKi8KKyAgLyogYXMgRlRfQkFTRSBhbmQgRlRfQkFTRV9ERUYgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KKyAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KKyAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCisgIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsYCBvciBgX19mYXN0Y2FsbGAgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBGVF9DQUxMQkFDS19ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAorI2Vsc2UKKyNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIHN0YXRpYyAgeAorI2VuZGlmCisKKyNkZWZpbmUgRlRfQkFTRV9DQUxMQkFDSyggeCApICAgICAgRlRfRlVOQ1RJT05fREVDTEFSQVRJT04oIHggKQorI2RlZmluZSBGVF9CQVNFX0NBTExCQUNLX0RFRiggeCApICBGVF9GVU5DVElPTl9ERUZJTklUSU9OKCB4ICkKKworI2lmbmRlZiBGVF9DQUxMQkFDS19UQUJMRQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFICAgICAgZXh0ZXJuICJDIgorI2RlZmluZSBGVF9DQUxMQkFDS19UQUJMRV9ERUYgIGV4dGVybiAiQyIKKyNlbHNlCisjZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFICAgICAgZXh0ZXJuCisjZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgLyogbm90aGluZyAqLworI2VuZGlmCisjZW5kaWYgLyogRlRfQ0FMTEJBQ0tfVEFCTEUgKi8KKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgIC8qIElOVEVSTkFMX0NPTVBJTEVSX01BQ1JPU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmgKaW5kZXggODE4YTgxMi4uYzY1MzA3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oCkBAIC0xLDM3ICsxLDM3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhbGMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXJpdGhtZXRpYyBjb21wdXRhdGlvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNhbGMuaAorICoKKyAqICAgQXJpdGhtZXRpYyBjb21wdXRhdGlvbnMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVENBTENfSF8KICNkZWZpbmUgRlRDQUxDX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAorI2luY2x1ZGUgImNvbXBpbGVyLW1hY3Jvcy5oIgogCiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTXVsRGl2KCkgYW5kIEZUX011bEZpeCgpIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEZUX011bERpdigpIGFuZCBGVF9NdWxGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSCiAgIC8qIFByb3ZpZGUgYXNzZW1ibGVyIGZyYWdtZW50cyBmb3IgcGVyZm9ybWFuY2UtY3JpdGljYWwgZnVuY3Rpb25zLiAqLwpAQCAtMjQ2LDI5ICsyNDYsMzIgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRGl2X05vX1JvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uIGAoYSpiKS9jJyAgICovCi0gIC8qICAgICh3aXRob3V0IHJvdW5kaW5nKSB3aXRoIG1heGltdW0gYWNjdXJhY3kgKGl0IHVzZXMgYSA2NC1iaXQgICAgICAgICAqLwotICAvKiAgICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3NvciBzcGVjaWZpYyAqLwotICAvKiAgICBvcGVyYXRpb25zLCBidXQgaXMgYXQgbGVhc3QgY29tcGxldGVseSBwb3J0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBmaXJzdCBtdWx0aXBsaWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYiA6OiBUaGUgc2Vjb25kIG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGMgOjogVGhlIGRpdmlzb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0byAqLwotICAvKiAgICBkaXZpZGUgYnkgemVybzsgaXQgc2ltcGx5IHJldHVybnMgYE1heEludCcgb3IgYE1pbkludCcgZGVwZW5kaW5nICAgKi8KLSAgLyogICAgb24gdGhlIHNpZ25zIG9mIGBhJyBhbmQgYGInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX011bERpdl9Ob19Sb3VuZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbXB1dGF0aW9uICcoYSpiKS9jJworICAgKiAgICh3aXRob3V0IHJvdW5kaW5nKSB3aXRoIG1heGltdW0gYWNjdXJhY3kgKGl0IHVzZXMgYSA2NC1iaXQKKyAgICogICBpbnRlcm1lZGlhdGUgaW50ZWdlciB3aGVuZXZlciBuZWNlc3NhcnkpLgorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXNuJ3QgbmVjZXNzYXJpbHkgYXMgZmFzdCBhcyBzb21lIHByb2Nlc3Nvci1zcGVjaWZpYworICAgKiAgIG9wZXJhdGlvbnMsIGJ1dCBpcyBhdCBsZWFzdCBjb21wbGV0ZWx5IHBvcnRhYmxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgYSA6OgorICAgKiAgICAgVGhlIGZpcnN0IG11bHRpcGxpZXIuCisgICAqICAgYiA6OgorICAgKiAgICAgVGhlIHNlY29uZCBtdWx0aXBsaWVyLgorICAgKiAgIGMgOjoKKyAgICogICAgIFRoZSBkaXZpc29yLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIFRoZSByZXN1bHQgb2YgJyhhKmIpL2MnLiAgVGhpcyBmdW5jdGlvbiBuZXZlciB0cmFwcyB3aGVuIHRyeWluZyB0bworICAgKiAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyAnTWF4SW50JyBvciAnTWluSW50JyBkZXBlbmRpbmcgb24KKyAgICogICB0aGUgc2lnbnMgb2YgJ2EnIGFuZCAnYicuCisgICAqLwogICBGVF9CQVNFKCBGVF9Mb25nICkKICAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhLAogICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGIsCkBAIC0yNzYsMTIgKzI3OSwxMSBAQAogCiAKICAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9NYXRyaXhfTXVsdGlwbHkgd2hpY2ggc2NhbGVzIGl0cyByZXN1bHQgYWZ0ZXJ3YXJkcy4KLSAgICogIFRoZSBpZGVhIGlzIHRoYXQgYm90aCBgYScgYW5kIGBiJyBhcmUgc2NhbGVkIGJ5IGZhY3RvcnMgb2YgMTAgc28gdGhhdAotICAgKiAgdGhlIHZhbHVlcyBhcmUgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSB0byBnZXQgYSBjb3JyZWN0IHJlc3VsdCBkdXJpbmcKLSAgICogIHRoZSA2NGJpdCBtdWx0aXBsaWNhdGlvbi4gIExldCBgc2EnIGFuZCBgc2InIGJlIHRoZSBzY2FsaW5nIGZhY3RvcnMgb2YKLSAgICogIGBhJyBhbmQgYGInLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSByZXN1bHQgaXMKLSAgICogIGBzYSpzYicuCisgICAqIEEgdmFyaWFudCBvZiBGVF9NYXRyaXhfTXVsdGlwbHkgd2hpY2ggc2NhbGVzIGl0cyByZXN1bHQgYWZ0ZXJ3YXJkcy4gIFRoZQorICAgKiBpZGVhIGlzIHRoYXQgYm90aCBgYScgYW5kIGBiJyBhcmUgc2NhbGVkIGJ5IGZhY3RvcnMgb2YgMTAgc28gdGhhdCB0aGUKKyAgICogdmFsdWVzIGFyZSBhcyBwcmVjaXNlIGFzIHBvc3NpYmxlIHRvIGdldCBhIGNvcnJlY3QgcmVzdWx0IGR1cmluZyB0aGUKKyAgICogNjRiaXQgbXVsdGlwbGljYXRpb24uICBMZXQgYHNhJyBhbmQgYHNiJyBiZSB0aGUgc2NhbGluZyBmYWN0b3JzIG9mIGBhJworICAgKiBhbmQgYGInLCByZXNwZWN0aXZlbHksIHRoZW4gdGhlIHNjYWxpbmcgZmFjdG9yIG9mIHRoZSByZXN1bHQgaXMgYHNhKnNiJy4KICAgICovCiAgIEZUX0JBU0UoIHZvaWQgKQogICBGVF9NYXRyaXhfTXVsdGlwbHlfU2NhbGVkKCBjb25zdCBGVF9NYXRyaXgqICBhLApAQCAtMjkwLDggKzI5MiwyMyBAQAogCiAKICAgLyoKLSAgICogIEEgdmFyaWFudCBvZiBGVF9WZWN0b3JfVHJhbnNmb3JtLiAgU2VlIGNvbW1lbnRzIGZvcgotICAgKiAgRlRfTWF0cml4X011bHRpcGx5X1NjYWxlZC4KKyAgICogQ2hlY2sgYSBtYXRyaXguICBJZiB0aGUgdHJhbnNmb3JtYXRpb24gd291bGQgbGVhZCB0byBleHRyZW1lIHNoZWFyIG9yCisgICAqIGV4dHJlbWUgc2NhbGluZywgZm9yIGV4YW1wbGUsIHJldHVybiAwLiAgSWYgZXZlcnl0aGluZyBpcyBPSywgcmV0dXJuIDEuCisgICAqCisgICAqIEJhc2VkIG9uIGdlb21ldHJpYyBjb25zaWRlcmF0aW9ucyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBpbmVxdWFsaXR5IHRvCisgICAqIGlkZW50aWZ5IGEgZGVnZW5lcmF0ZSBtYXRyaXguCisgICAqCisgICAqICAgNTAgKiBhYnMoeHgqeXkgLSB4eSp5eCkgPCB4eF4yICsgeHleMiArIHl4XjIgKyB5eV4yCisgICAqCisgICAqIFZhbHVlIDUwIGlzIGhldXJpc3RpYy4KKyAgICovCisgIEZUX0JBU0UoIEZUX0Jvb2wgKQorICBGVF9NYXRyaXhfQ2hlY2soIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCApOworCisKKyAgLyoKKyAgICogQSB2YXJpYW50IG9mIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0uICBTZWUgY29tbWVudHMgZm9yCisgICAqIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQuCiAgICAqLwogICBGVF9CQVNFKCB2b2lkICkKICAgRlRfVmVjdG9yX1RyYW5zZm9ybV9TY2FsZWQoIEZUX1ZlY3RvciogICAgICAgIHZlY3RvciwKQEAgLTMwMCwyMiArMzE3LDIyIEBACiAKIAogICAvKgotICAgKiAgVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGEgdmVjdG9yIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCBsZW5ndGguCi0gICAqICBUaGUgbm9ybWFsaXplZCB2ZWN0b3IgaXMgYSAxNi4xNiBmaXhlZC1wb2ludCB1bml0IHZlY3RvciB3aXRoIGxlbmd0aAotICAgKiAgY2xvc2UgdG8gMHgxMDAwMC4gIFRoZSBhY2N1cmFjeSBvZiB0aGUgcmV0dXJuZWQgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8KLSAgICogIDE2IGJpdHMgYWxzby4gIFRoZSBmdW5jdGlvbiB1dGlsaXplcyBxdWljayBpbnZlcnNlIHNxdWFyZSByb290Ci0gICAqICBhcHByb3hpbWF0aW9uIHdpdGhvdXQgZGl2aXNpb25zIGFuZCBzcXVhcmUgcm9vdHMgcmVseWluZyBvbiBOZXd0b24ncwotICAgKiAgaXRlcmF0aW9ucyBpbnN0ZWFkLgorICAgKiBUaGlzIGZ1bmN0aW9uIG5vcm1hbGl6ZXMgYSB2ZWN0b3IgYW5kIHJldHVybnMgaXRzIG9yaWdpbmFsIGxlbmd0aC4gIFRoZQorICAgKiBub3JtYWxpemVkIHZlY3RvciBpcyBhIDE2LjE2IGZpeGVkLXBvaW50IHVuaXQgdmVjdG9yIHdpdGggbGVuZ3RoIGNsb3NlCisgICAqIHRvIDB4MTAwMDAuICBUaGUgYWNjdXJhY3kgb2YgdGhlIHJldHVybmVkIGxlbmd0aCBpcyBsaW1pdGVkIHRvIDE2IGJpdHMKKyAgICogYWxzby4gIFRoZSBmdW5jdGlvbiB1dGlsaXplcyBxdWljayBpbnZlcnNlIHNxdWFyZSByb290IGFwcHJveGltYXRpb24KKyAgICogd2l0aG91dCBkaXZpc2lvbnMgYW5kIHNxdWFyZSByb290cyByZWx5aW5nIG9uIE5ld3RvbidzIGl0ZXJhdGlvbnMKKyAgICogaW5zdGVhZC4KICAgICovCiAgIEZUX0JBU0UoIEZUX1VJbnQzMiApCiAgIEZUX1ZlY3Rvcl9Ob3JtTGVuKCBGVF9WZWN0b3IqICB2ZWN0b3IgKTsKIAogCiAgIC8qCi0gICAqICBSZXR1cm4gLTEsIDAsIG9yICsxLCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIGEgZ2l2ZW4gY29ybmVyLgotICAgKiAgV2UgdXNlIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0sIHdpdGggcG9zaXRpdmUgdmVydGljYWwgdmFsdWVzCi0gICAqICBnb2luZyB1cHdhcmRzLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgKzEgaWYgdGhlIGNvcm5lciB0dXJucyB0byB0aGUKLSAgICogIGxlZnQsIC0xIHRvIHRoZSByaWdodCwgYW5kIDAgZm9yIHVuZGVjaWRhYmxlIGNhc2VzLgorICAgKiBSZXR1cm4gLTEsIDAsIG9yICsxLCBkZXBlbmRpbmcgb24gdGhlIG9yaWVudGF0aW9uIG9mIGEgZ2l2ZW4gY29ybmVyLiAgV2UKKyAgICogdXNlIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0sIHdpdGggcG9zaXRpdmUgdmVydGljYWwgdmFsdWVzIGdvaW5nCisgICAqIHVwd2FyZHMuICBUaGUgZnVuY3Rpb24gcmV0dXJucyArMSBpZiB0aGUgY29ybmVyIHR1cm5zIHRvIHRoZSBsZWZ0LCAtMSB0bworICAgKiB0aGUgcmlnaHQsIGFuZCAwIGZvciB1bmRlY2lkYWJsZSBjYXNlcy4KICAgICovCiAgIEZUX0JBU0UoIEZUX0ludCApCiAgIGZ0X2Nvcm5lcl9vcmllbnRhdGlvbiggRlRfUG9zICBpbl94LApAQCAtMzI1LDkgKzM0Miw5IEBACiAKIAogICAvKgotICAgKiAgUmV0dXJuIFRSVUUgaWYgYSBjb3JuZXIgaXMgZmxhdCBvciBuZWFybHkgZmxhdC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgKiAgc2F5aW5nIHRoYXQgdGhlIGNvcm5lciBwb2ludCBpcyBjbG9zZSB0byBpdHMgbmVpZ2hib3JzLCBvciBpbnNpZGUgYW4KLSAgICogIGVsbGlwc2UgZGVmaW5lZCBieSB0aGUgbmVpZ2hib3IgZm9jYWwgcG9pbnRzIHRvIGJlIG1vcmUgcHJlY2lzZS4KKyAgICogUmV0dXJuIFRSVUUgaWYgYSBjb3JuZXIgaXMgZmxhdCBvciBuZWFybHkgZmxhdC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgKiBzYXlpbmcgdGhhdCB0aGUgY29ybmVyIHBvaW50IGlzIGNsb3NlIHRvIGl0cyBuZWlnaGJvcnMsIG9yIGluc2lkZSBhbgorICAgKiBlbGxpcHNlIGRlZmluZWQgYnkgdGhlIG5laWdoYm9yIGZvY2FsIHBvaW50cyB0byBiZSBtb3JlIHByZWNpc2UuCiAgICAqLwogICBGVF9CQVNFKCBGVF9JbnQgKQogICBmdF9jb3JuZXJfaXNfZmxhdCggRlRfUG9zICBpbl94LApAQCAtMzM3LDEwICszNTQsMTEgQEAKIAogCiAgIC8qCi0gICAqICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluZGV4LgorICAgKiBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluZGV4LgogICAgKi8KIAogI2lmbmRlZiAgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKKwogI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCiAgICAgKCBfX0dOVUNfXyA+IDMgfHwgKCBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQgKSApCiAKQEAgLTM1Miw5ICszNzAsMzQgQEAKIAogI2RlZmluZSBGVF9NU0IoIHggKSAgKCAzMSAtIF9fYnVpbHRpbl9jbHpsKCB4ICkgKQogCisjZW5kaWYgLyogX19HTlVDX18gKi8KKworCisjZWxpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICYmICggX01TQ19WRVIgPj0gMTQwMCApCisKKyNpZiBGVF9TSVpFT0ZfSU5UID09IDQKKworI2luY2x1ZGUgPGludHJpbi5oPgorI3ByYWdtYSBpbnRyaW5zaWMoIF9CaXRTY2FuUmV2ZXJzZSApCisKKyAgc3RhdGljIF9faW5saW5lIEZUX0ludDMyCisgIEZUX01TQl9pMzg2KCBGVF9VSW50MzIgIHggKQorICB7CisgICAgdW5zaWduZWQgbG9uZyAgd2hlcmU7CisKKworICAgIF9CaXRTY2FuUmV2ZXJzZSggJndoZXJlLCB4ICk7CisKKyAgICByZXR1cm4gKEZUX0ludDMyKXdoZXJlOworICB9CisKKyNkZWZpbmUgRlRfTVNCKCB4ICkgICggRlRfTVNCX2kzODYoIHggKSApCisKICNlbmRpZgogCi0jZW5kaWYgLyogX19HTlVDX18gKi8KKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisKICNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KIAogI2lmbmRlZiBGVF9NU0IKQEAgLTM2Niw4ICs0MDksOCBAQAogCiAKICAgLyoKLSAgICogIFJldHVybiBzcXJ0KHgqeCt5KnkpLCB3aGljaCBpcyB0aGUgc2FtZSBhcyBgRlRfVmVjdG9yX0xlbmd0aCcgYnV0IHVzZXMKLSAgICogIHR3byBmaXhlZC1wb2ludCBhcmd1bWVudHMgaW5zdGVhZC4KKyAgICogUmV0dXJuIHNxcnQoeCp4K3kqeSksIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGBGVF9WZWN0b3JfTGVuZ3RoJyBidXQgdXNlcworICAgKiB0d28gZml4ZWQtcG9pbnQgYXJndW1lbnRzIGluc3RlYWQuCiAgICAqLwogICBGVF9CQVNFKCBGVF9GaXhlZCApCiAgIEZUX0h5cG90KCBGVF9GaXhlZCAgeCwKQEAgLTM3NiwyMyArNDE5LDI0IEBACiAKICNpZiAwCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3FydEZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHNxdWFyZSByb290IG9mIGEgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCA6OiBUaGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgcm9vdCBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgc3FydCh4KScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmVyeSBmYXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1NxcnRGaXhlZAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ29tcHV0ZXMgdGhlIHNxdWFyZSByb290IG9mIGEgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWUuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICB4IDo6CisgICAqICAgICBUaGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgcm9vdCBmb3IuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIHJlc3VsdCBvZiAnc3FydCh4KScuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgbm90IHZlcnkgZmFzdC4KKyAgICovCiAgIEZUX0JBU0UoIEZUX0ludDMyICkKICAgRlRfU3FydEZpeGVkKCBGVF9JbnQzMiAgeCApOwogCkBAIC00MDUsMTggKzQ0OSwyNiBAQAogI2RlZmluZSBGMkRPVDE0X1RPX0ZJWEVEKCB4ICkgICggKEZUX0xvbmcpKHgpICogNCApICAgICAgLyogPDwgMiAgKi8KICNkZWZpbmUgRklYRURfVE9fSU5UKCB4ICkgICAgICAoIEZUX1JvdW5kRml4KCB4ICkgPj4gMTYgKQogCi0jZGVmaW5lIFJPVU5EX0YyNkRPVDYoIHggKSAgICAgKCB4ID49IDAgPyAoICAgICggKHgpICsgMzIgKSAmIC02NCApICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIC0oICggMzIgLSAoeCkgKSAmIC02NCApICkgKQorI2RlZmluZSBST1VORF9GMjZET1Q2KCB4ICkgICAgICggKCAoeCkgKyAzMiAtICggeCA8IDAgKSApICYgLTY0ICkKIAogICAvKgotICAgKiAgVGhlIGZvbGxvd2luZyBtYWNyb3MgaGF2ZSB0d28gcHVycG9zZXMuCisgICAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGhhdmUgdHdvIHB1cnBvc2VzLgogICAgKgotICAgKiAgLiBUYWcgcGxhY2VzIHdoZXJlIG92ZXJmbG93IGlzIGV4cGVjdGVkIGFuZCBoYXJtbGVzcy4KKyAgICogLSBUYWcgcGxhY2VzIHdoZXJlIG92ZXJmbG93IGlzIGV4cGVjdGVkIGFuZCBoYXJtbGVzcy4KICAgICoKLSAgICogIC4gQXZvaWQgcnVuLXRpbWUgc2FuaXRpemVyIGVycm9ycy4KKyAgICogLSBBdm9pZCBydW4tdGltZSBzYW5pdGl6ZXIgZXJyb3JzLgogICAgKgotICAgKiAgVXNlIHdpdGggY2FyZSEKKyAgICogVXNlIHdpdGggY2FyZSEKICAgICovCisjZGVmaW5lIEFERF9JTlQoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoRlRfSW50KSggKEZUX1VJbnQpKGEpICsgKEZUX1VJbnQpKGIpICkKKyNkZWZpbmUgU1VCX0lOVCggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChGVF9JbnQpKCAoRlRfVUludCkoYSkgLSAoRlRfVUludCkoYikgKQorI2RlZmluZSBNVUxfSU5UKCBhLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEZUX0ludCkoIChGVF9VSW50KShhKSAqIChGVF9VSW50KShiKSApCisjZGVmaW5lIE5FR19JTlQoIGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoRlRfSW50KSggKEZUX1VJbnQpMCAtIChGVF9VSW50KShhKSApCisKICNkZWZpbmUgQUREX0xPTkcoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChGVF9Mb25nKSggKEZUX1VMb25nKShhKSArIChGVF9VTG9uZykoYikgKQogI2RlZmluZSBTVUJfTE9ORyggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00MzUsNiArNDg3LDE5IEBACiAjZGVmaW5lIE5FR19JTlQzMiggYSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoRlRfSW50MzIpKCAoRlRfVUludDMyKTAgLSAoRlRfVUludDMyKShhKSApCiAKKyNpZmRlZiBGVF9MT05HNjQKKworI2RlZmluZSBBRERfSU5UNjQoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEZUX0ludDY0KSggKEZUX1VJbnQ2NCkoYSkgKyAoRlRfVUludDY0KShiKSApCisjZGVmaW5lIFNVQl9JTlQ2NCggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoRlRfSW50NjQpKCAoRlRfVUludDY0KShhKSAtIChGVF9VSW50NjQpKGIpICkKKyNkZWZpbmUgTVVMX0lOVDY0KCBhLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIChGVF9JbnQ2NCkoIChGVF9VSW50NjQpKGEpICogKEZUX1VJbnQ2NCkoYikgKQorI2RlZmluZSBORUdfSU5UNjQoIGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKEZUX0ludDY0KSggKEZUX1VJbnQ2NCkwIC0gKEZUX1VJbnQ2NCkoYSkgKQorCisjZW5kaWYgLyogRlRfTE9ORzY0ICovCisKIAogRlRfRU5EX0hFQURFUgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oCmluZGV4IDI5MmE0ZWUuLmRmNTM1N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oCkBAIC0xLDI0ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElNUE9SVEFOVDogQSBkZXNjcmlwdGlvbiBvZiBGcmVlVHlwZSdzIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgIGZvdW5kIGluIGBkb2NzL0RFQlVHLlRYVCcuICBSZWFkIGl0IGlmIHlvdSBuZWVkIHRvIHVzZSBvciAgICovCi0vKiAgICAgICAgICAgICB1bmRlcnN0YW5kIHRoaXMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0ZGVidWcuaAorICoKKyAqICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKgorICogSU1QT1JUQU5UOiBBIGRlc2NyaXB0aW9uIG9mIEZyZWVUeXBlJ3MgZGVidWdnaW5nIHN1cHBvcnQgY2FuIGJlCisgKiAgICAgICAgICAgICBmb3VuZCBpbiAnZG9jcy9ERUJVRy5UWFQnLiAgUmVhZCBpdCBpZiB5b3UgbmVlZCB0byB1c2Ugb3IKKyAqICAgICAgICAgICAgIHVuZGVyc3RhbmQgdGhpcyBjb2RlLgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRERUJVR19IXwpAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisKKyNpbmNsdWRlICJjb21waWxlci1tYWNyb3MuaCIKIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTQyLDEyICs0NCwxMiBAQAogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgdHJhY2UgZW51bXMgYXMgd2VsbCBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFycmF5IHdoZW4gdGhleSAgICAqLwotICAvKiBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIHRoZSB0cmFjZSBlbnVtcyBhcyB3ZWxsIGFzIHRoZSB0cmFjZSBsZXZlbHMgYXJyYXkgd2hlbiB0aGV5IGFyZQorICAgKiBuZWVkZWQuCisgICAqCisgICAqLwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKIApAQCAtNTYsMzggKzU4LDQzIEBACiAgIC8qIGRlZmluaW5nIHRoZSBlbnVtZXJhdGlvbiAqLwogICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXwogICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oPgogICAgIHRyYWNlX2NvdW50CiAKICAgfSBGVF9UcmFjZTsKIAogCi0gIC8qIGRlZmluaW5nIHRoZSBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIHByb3ZpZGVkIGJ5IGBzcmMvYmFzZS9mdGRlYnVnLmMnICovCi0gIGV4dGVybiBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07CisgIC8qIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCAqLworICAvKiBwcm92aWRlZCBieSBgc3JjL2Jhc2UvZnRkZWJ1Zy5jJyAgICAgICAgKi8KKyAgZXh0ZXJuIGludCogIGZ0X3RyYWNlX2xldmVsczsKIAogI3VuZGVmIEZUX1RSQUNFX0RFRgogCiAjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZSAqLwotICAvKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybworICAgKgorICAgKiBJTVBPUlRBTlQhCisgICAqCisgICAqIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZQorICAgKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLgorICAgKgorICAgKi8KIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKLSNkZWZpbmUgRlRfVFJBQ0UoIGxldmVsLCB2YXJmb3JtYXQgKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggZnRfdHJhY2VfbGV2ZWxzW0ZUX0NPTVBPTkVOVF0gPj0gbGV2ZWwgKSBcCi0gICAgICAgICAgICAgIEZUX01lc3NhZ2UgdmFyZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiB3ZSBuZWVkIHR3byBtYWNyb3MgaGVyZSB0byBtYWtlIGNwcCBleHBhbmQgYEZUX0NPTVBPTkVOVCcgKi8KKyNkZWZpbmUgRlRfVFJBQ0VfQ09NUCggeCApICAgRlRfVFJBQ0VfQ09NUF8oIHggKQorI2RlZmluZSBGVF9UUkFDRV9DT01QXyggeCApICB0cmFjZV8gIyMgeAorCisjZGVmaW5lIEZUX1RSQUNFKCBsZXZlbCwgdmFyZm9ybWF0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9UUkFDRV9DT01QKCBGVF9DT01QT05FTlQgKV0gPj0gbGV2ZWwgKSBcCisgICAgICAgICAgICAgIEZUX01lc3NhZ2UgdmFyZm9ybWF0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgfSB3aGlsZSAoIDAgKQogCiAjZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KQEAgLTk3LDYyICsxMDQsODUgQEAKICNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgdHJhY2UgY29tcG9uZW50cy4gIDAgaWYgRnJlZVR5cGUgMiBpcyBub3QgYnVpbHQgd2l0aCAqLwotICAvKiAgICBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mICAgICAgKi8KLSAgLyogICAgdGhlIGludGVybmFsIGBmdF90cmFjZV9sZXZlbHMnIGFycmF5IGJ5IGFuIGluZGV4LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1RyYWNlX0dldF9Db3VudAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNlIGNvbXBvbmVudHMuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIG51bWJlciBvZiB0cmFjZSBjb21wb25lbnRzLiAgMCBpZiBGcmVlVHlwZSAyIGlzIG5vdCBidWlsdCB3aXRoCisgICAqICAgRlRfREVCVUdfTEVWRUxfVFJBQ0UgZGVmaW5pdGlvbi4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBlbGVtZW50cyBvZiB0aGUKKyAgICogICBpbnRlcm5hbCB0cmFjZSBsZXZlbHMgYXJyYXkgYnkgYW4gaW5kZXguCisgICAqLwogICBGVF9CQVNFKCBGVF9JbnQgKQogICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbmFtZSBvZiBhIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBpbmRleCBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBjb21wb25lbnQuICBUaGlzIGlzIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgICAqLwotICAvKiAgICBDIHN0cmluZywgc28gZG8gbm90IGZyZWUgaXQgYWZ0ZXIgdXNlLiAgTlVMTCBpZiBGcmVlVHlwZSAyIGlzIG5vdCAgKi8KLSAgLyogICAgYnVpbHQgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9UcmFjZV9HZXRfQ291bnQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNlICAgICAgICovCi0gIC8qICAgIGNvbXBvbmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgRnJlZVR5cGUgMidzICAgICovCi0gIC8qICAgIGRlYnVnIGxldmVsIGluIHlvdXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9UcmFjZV9HZXRfTmFtZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIHRoZSBuYW1lIG9mIGEgdHJhY2UgY29tcG9uZW50LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgVGhlIGluZGV4IG9mIHRoZSB0cmFjZSBjb21wb25lbnQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVGhlIG5hbWUgb2YgdGhlIHRyYWNlIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZAorICAgKiAgIEN+c3RyaW5nLCBzbyBkbyBub3QgZnJlZSBpdCBhZnRlciB1c2UuICBgTlVMTGAgaWYgRnJlZVR5cGUgaXMgbm90CisgICAqICAgYnVpbHQgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBVc2UgQEZUX1RyYWNlX0dldF9Db3VudCB0byBnZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdHJhY2UKKyAgICogICBjb21wb25lbnRzLgorICAgKi8KICAgRlRfQkFTRSggY29uc3QgY2hhciogKQogICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG5lZWQgdHdvIG9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMhICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiBGVF9UUkFDRTAoKCAiVmFsdWUgaXMgJWkiLCBmb28gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGUgRlRfVFJBQ0VYIG1hY3JvcyBpcyBzZW50IHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfVHJhY2VfRGlzYWJsZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgU3dpdGNoIG9mZiB0cmFjaW5nIHRlbXBvcmFyaWx5LiAgSXQgY2FuIGJlIGFjdGl2YXRlZCBhZ2FpbiB3aXRoCisgICAqICAgQEZUX1RyYWNlX0VuYWJsZS4KKyAgICovCisgIEZUX0JBU0UoIHZvaWQgKQorICBGVF9UcmFjZV9EaXNhYmxlKCB2b2lkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX1RyYWNlX0VuYWJsZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQWN0aXZhdGUgdHJhY2luZy4gIFVzZSBpdCBhZnRlciB0cmFjaW5nIGhhcyBiZWVuIHN3aXRjaGVkIG9mZiB3aXRoCisgICAqICAgQEZUX1RyYWNlX0Rpc2FibGUuCisgICAqLworICBGVF9CQVNFKCB2b2lkICkKKyAgRlRfVHJhY2VfRW5hYmxlKCB2b2lkICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogWW91IG5lZWQgdHdvIG9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMhCisgICAqCisgICAqIEV4YW1wbGU6IEZUX1RSQUNFMCgoICJWYWx1ZSBpcyAlaSIsIGZvbyApKQorICAgKgorICAgKiBPdXRwdXQgb2YgdGhlIEZUX1RSQUNFWCBtYWNyb3MgaXMgc2VudCB0byBzdGRlcnIuCisgICAqCisgICAqLwogCiAjZGVmaW5lIEZUX1RSQUNFMCggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAwLCB2YXJmb3JtYXQgKQogI2RlZmluZSBGVF9UUkFDRTEoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMSwgdmFyZm9ybWF0ICkKQEAgLTE2NCwxMyArMTk0LDEzIEBACiAjZGVmaW5lIEZUX1RSQUNFNyggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA3LCB2YXJmb3JtYXQgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0VSUk9SIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGlzIG1hY3JvIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgdGhlIEZUX0VSUk9SIG1hY3JvLgorICAgKgorICAgKiBPdXRwdXQgb2YgdGhpcyBtYWNybyBpcyBzZW50IHRvIHN0ZGVyci4KKyAgICoKKyAgICovCiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgogCkBAIC0xODMsMTIgKzIxMywxMiBAQAogI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0FTU0VSVCBhbmQgRlRfVEhST1cgbWFjcm9zLiAgVGhlIGNhbGwgdG8gYEZUX1Rocm93JyAgICAgKi8KLSAgLyogbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IHNldCBhIGJyZWFrcG9pbnQgYXQgdGhpcyBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSB0aGUgRlRfQVNTRVJUIGFuZCBGVF9USFJPVyBtYWNyb3MuICBUaGUgY2FsbCB0byBgRlRfVGhyb3dgIG1ha2VzCisgICAqIGl0IHBvc3NpYmxlIHRvIGVhc2lseSBzZXQgYSBicmVha3BvaW50IGF0IHRoaXMgZnVuY3Rpb24uCisgICAqCisgICAqLwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKIApAQCAtMjE1LDExICsyNDUsMTEgQEAKICNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIGBGVF9NZXNzYWdlJyBhbmQgYEZUX1BhbmljJyB3aGVuIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZSBgRlRfTWVzc2FnZWAgYW5kIGBGVF9QYW5pY2Agd2hlbiBuZWVkZWQuCisgICAqCisgICAqLwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oCmluZGV4IDU4ZGQzNWEuLjdmMjI3MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcnYuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2LmgKQEAgLTEsMjggKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbnRlcm5hbCBmb250IGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0ZHJ2LmgKKyAqCisgKiAgIEZyZWVUeXBlIGludGVybmFsIGZvbnQgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZURFJWX0hfCiAjZGVmaW5lIEZURFJWX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+CiAKKyNpbmNsdWRlICJjb21waWxlci1tYWNyb3MuaCIKIAogRlRfQkVHSU5fSEVBREVSCiAKQEAgLTg3LDczICs4Nyw4MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRHJpdmVyX0NsYXNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbnQgZHJpdmVyIGNsYXNzLiAgVGhpcyBzdHJ1Y3R1cmUgbW9zdGx5IGNvbnRhaW5zIHBvaW50ZXJzIHRvICovCi0gIC8qICAgIGRyaXZlciBtZXRob2RzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvb3QgICAgICAgICAgICAgOjogVGhlIHBhcmVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIGZhY2Ugb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplX29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgc2l6ZSBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3Rfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBnbHlwaCBvYmplY3QgaW4gYnl0ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5pdF9mYWNlICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIGZhY2UgY29uc3RydWN0b3IuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb25lX2ZhY2UgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgZmFjZSBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXRfc2l6ZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzaXplIGNvbnN0cnVjdG9yLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9uZV9zaXplICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0X3Nsb3QgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRvbmVfc2xvdCAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzbG90IGRlc3RydWN0b3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZ2x5cGggICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gbG9hZCBhIGdseXBoIHRvIGEgc2xvdC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmllbGQgaXMgbWFuZGF0b3J5ISAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9rZXJuaW5nICAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdG8gcmV0dXJuIHRoZSB1bnNjYWxlZCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gcGFpciBvZiBnbHlwaHMuICBDYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzZXQgdG8gMCBpZiB0aGUgZm9ybWF0IGRvZXNuJ3Qgc3VwcG9ydCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAga2VybmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXR0YWNoX2ZpbGUgICAgICA6OiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBpcyB1c2VkIHRvIHJlYWQgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBkYXRhIGZvciBhIGZhY2UgZnJvbSBhbm90aGVyICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUvc3RyZWFtLiAgRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhZGQgZGF0YSBmcm9tIEFGTSBvciBQRk0gZmlsZXMgb24gYSBUeXBlIDEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSwgb3IgYSBDSURNYXAgb24gYSBDSUQta2V5ZWQgZmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2FkdmFuY2VzICAgICA6OiBBIGZ1bmN0aW9uIGhhbmRsZSB1c2VkIHRvIHJldHVybiBhZHZhbmNlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhzIG9mIGBjb3VudCcgZ2x5cGhzIChpbiBmb250IHVuaXRzKSwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IGBmaXJzdCcuICBUaGUgYHZlcnRpY2FsJyBmbGFnIG11c3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQgdG8gZ2V0IHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0cy4gIFRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYGFkdmFuY2VzJyBidWZmZXIgaXMgY2FsbGVyLWFsbG9jYXRlZC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBpZGVhIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYWJsZSB0byAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtIGRldmljZS1pbmRlcGVuZGVudCB0ZXh0IGxheW91dCB3aXRob3V0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGluZyBhIHNpbmdsZSBnbHlwaCBpbWFnZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVxdWVzdF9zaXplICAgICA6OiBBIGhhbmRsZSB0byBhIGZ1bmN0aW9uIHVzZWQgdG8gcmVxdWVzdCB0aGUgbmV3ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHNpemUuICBDYW4gYmUgc2V0IHRvIDAgaWYgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxpbmcgZG9uZSBpbiB0aGUgYmFzZSBsYXllciBzdWZmaWNlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlbGVjdF9zaXplICAgICAgOjogQSBoYW5kbGUgdG8gYSBmdW5jdGlvbiB1c2VkIHRvIHNlbGVjdCBhIG5ldyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIHNpemUuICBJdCBpcyB1c2VkIG9ubHkgaWYgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIGlzIHNldC4gIENhbiBiZSBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgdG8gMCBpZiB0aGUgc2NhbGluZyBkb25lIGluIHRoZSBiYXNlIGxheWVyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vc3QgZnVuY3Rpb24gcG9pbnRlcnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbG9hZF9nbHlwaCcsIGNhbiBiZSAqLwotICAvKiAgICBzZXQgdG8gMCB0byBpbmRpY2F0ZSBhIGRlZmF1bHQgYmVoYXZpb3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0RyaXZlcl9DbGFzc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIGZvbnQgZHJpdmVyIGNsYXNzLiAgVGhpcyBzdHJ1Y3R1cmUgbW9zdGx5IGNvbnRhaW5zIHBvaW50ZXJzIHRvCisgICAqICAgZHJpdmVyIG1ldGhvZHMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgcm9vdCA6OgorICAgKiAgICAgVGhlIHBhcmVudCBtb2R1bGUuCisgICAqCisgICAqICAgZmFjZV9vYmplY3Rfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgYSBmYWNlIG9iamVjdCBpbiBieXRlcy4KKyAgICoKKyAgICogICBzaXplX29iamVjdF9zaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBvZiBhIHNpemUgb2JqZWN0IGluIGJ5dGVzLgorICAgKgorICAgKiAgIHNsb3Rfb2JqZWN0X3NpemUgOjoKKyAgICogICAgIFRoZSBzaXplIG9mIGEgZ2x5cGggb2JqZWN0IGluIGJ5dGVzLgorICAgKgorICAgKiAgIGluaXRfZmFjZSA6OgorICAgKiAgICAgVGhlIGZvcm1hdC1zcGVjaWZpYyBmYWNlIGNvbnN0cnVjdG9yLgorICAgKgorICAgKiAgIGRvbmVfZmFjZSA6OgorICAgKiAgICAgVGhlIGZvcm1hdC1zcGVjaWZpYyBmYWNlIGRlc3RydWN0b3IuCisgICAqCisgICAqICAgaW5pdF9zaXplIDo6CisgICAqICAgICBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgY29uc3RydWN0b3IuCisgICAqCisgICAqICAgZG9uZV9zaXplIDo6CisgICAqICAgICBUaGUgZm9ybWF0LXNwZWNpZmljIHNpemUgZGVzdHJ1Y3Rvci4KKyAgICoKKyAgICogICBpbml0X3Nsb3QgOjoKKyAgICogICAgIFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogICBkb25lX3Nsb3QgOjoKKyAgICogICAgIFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBkZXN0cnVjdG9yLgorICAgKgorICAgKgorICAgKiAgIGxvYWRfZ2x5cGggOjoKKyAgICogICAgIEEgZnVuY3Rpb24gaGFuZGxlIHRvIGxvYWQgYSBnbHlwaCB0byBhIHNsb3QuICBUaGlzIGZpZWxkIGlzCisgICAqICAgICBtYW5kYXRvcnkhCisgICAqCisgICAqICAgZ2V0X2tlcm5pbmcgOjoKKyAgICogICAgIEEgZnVuY3Rpb24gaGFuZGxlIHRvIHJldHVybiB0aGUgdW5zY2FsZWQga2VybmluZyBmb3IgYSBnaXZlbiBwYWlyIG9mCisgICAqICAgICBnbHlwaHMuICBDYW4gYmUgc2V0IHRvIDAgaWYgdGhlIGZvcm1hdCBkb2Vzbid0IHN1cHBvcnQga2VybmluZy4KKyAgICoKKyAgICogICBhdHRhY2hfZmlsZSA6OgorICAgKiAgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGUgaXMgdXNlZCB0byByZWFkIGFkZGl0aW9uYWwgZGF0YSBmb3IgYSBmYWNlIGZyb20KKyAgICogICAgIGFub3RoZXIgZmlsZS9zdHJlYW0uICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhZGQgZGF0YSBmcm9tCisgICAqICAgICBBRk0gb3IgUEZNIGZpbGVzIG9uIGEgVHlwZSAxIGZhY2UsIG9yIGEgQ0lETWFwIG9uIGEgQ0lELWtleWVkIGZhY2UuCisgICAqCisgICAqICAgZ2V0X2FkdmFuY2VzIDo6CisgICAqICAgICBBIGZ1bmN0aW9uIGhhbmRsZSB1c2VkIHRvIHJldHVybiBhZHZhbmNlIHdpZHRocyBvZiAnY291bnQnIGdseXBocworICAgKiAgICAgKGluIGZvbnQgdW5pdHMpLCBzdGFydGluZyBhdCAnZmlyc3QnLiAgVGhlICd2ZXJ0aWNhbCcgZmxhZyBtdXN0IGJlCisgICAqICAgICBzZXQgdG8gZ2V0IHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0cy4gIFRoZSAnYWR2YW5jZXMnIGJ1ZmZlciBpcworICAgKiAgICAgY2FsbGVyLWFsbG9jYXRlZC4gIFRoZSBpZGVhIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgYWJsZSB0bworICAgKiAgICAgcGVyZm9ybSBkZXZpY2UtaW5kZXBlbmRlbnQgdGV4dCBsYXlvdXQgd2l0aG91dCBsb2FkaW5nIGEgc2luZ2xlCisgICAqICAgICBnbHlwaCBpbWFnZS4KKyAgICoKKyAgICogICByZXF1ZXN0X3NpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgZnVuY3Rpb24gdXNlZCB0byByZXF1ZXN0IHRoZSBuZXcgY2hhcmFjdGVyIHNpemUuICBDYW4KKyAgICogICAgIGJlIHNldCB0byAwIGlmIHRoZSBzY2FsaW5nIGRvbmUgaW4gdGhlIGJhc2UgbGF5ZXIgc3VmZmljZXMuCisgICAqCisgICAqICAgc2VsZWN0X3NpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgZnVuY3Rpb24gdXNlZCB0byBzZWxlY3QgYSBuZXcgZml4ZWQgc2l6ZS4gIEl0IGlzIHVzZWQKKyAgICogICAgIG9ubHkgaWYgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBpcyBzZXQuICBDYW4gYmUgc2V0IHRvIDAgaWYgdGhlCisgICAqICAgICBzY2FsaW5nIGRvbmUgaW4gdGhlIGJhc2UgbGF5ZXIgc3VmZmljZXMuCisgICAqIEBub3RlOgorICAgKiAgIE1vc3QgZnVuY3Rpb24gcG9pbnRlcnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgbG9hZF9nbHlwaGAsIGNhbiBiZSBzZXQKKyAgICogICB0byAwIHRvIGluZGljYXRlIGEgZGVmYXVsdCBiZWhhdmlvdXIuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyX0NsYXNzUmVjXwogICB7CiAgICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgIHJvb3Q7CkBAIC0xODQsNDUgKzE5MSwyOCBAQAogICB9IEZUX0RyaXZlcl9DbGFzc1JlYywgKkZUX0RyaXZlcl9DbGFzczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBGVF9Ecml2ZXJfQ2xhc3NSZWMgICAgICAqLwotICAvKiAgICBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfRHJpdmVyX0NsYXNzUmVjIHN0cnVjdC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bmN0aW9uIGhhcyB0byBiZSAqLwotICAvKiAgICBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICAgKi8KLSAgLyogICAgQW5kIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhIGBkZXN0cm95JyBmdW5jdGlvbiBuZWVkcyB0byBiZSAgICovCi0gIC8qICAgIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYGZ0aW5pdC5jJyAoZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMpIGFscmVhZHkgY29udGFpbnMgYSAgICovCi0gIC8qICAgIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgICAqLwotICAvKiAgICBkZXNjcmliZWQgaW4gYGZ0bW9kdWxlLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGljZSB0aGF0IHRoZSBjcmVhdGVkIGBjcmVhdGUnIGFuZCBgZGVzdHJveScgZnVuY3Rpb25zIGNhbGwgICAgICAqLwotICAvKiAgICBgcGljX2luaXQnIGFuZCBgcGljX2ZyZWUnIHRvIGFsbG93IHlvdSB0byBtYW51YWxseSBhbGxvY2F0ZSBhbmQgICAgKi8KLSAgLyogICAgaW5pdGlhbGl6ZSBhbnkgYWRkaXRpb25hbCBnbG9iYWwgZGF0YSwgbGlrZSBhIG1vZHVsZSBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGludGVyZmFjZSwgYW5kIHB1dCB0aGVtIGluIHRoZSBnbG9iYWwgcGljIGNvbnRhaW5lciBkZWZpbmVkIGluICAgICAqLwotICAvKiAgICBgZnRwaWMuaCcuICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGVtIGp1c3QgaW1wbGVtZW50IHRoZSBmdW5jdGlvbnMgYXMgKi8KLSAgLyogICAgZW1wdHkgdG8gcmVzb2x2ZSB0aGUgbGluayBlcnJvci4gIEFsc28gdGhlIGBwaWNfaW5pdCcgYW5kICAgICAgICAgICovCi0gIC8qICAgIGBwaWNfZnJlZScgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBgcGljLmgnLCB0byBiZSByZWZlcnJlZCAqLwotICAvKiAgICBieSBkcml2ZXIgZGVmaW5pdGlvbiBjYWxsaW5nIGBGVF9ERUZJTkVfRFJJVkVSJyBpbiBmb2xsb3dpbmcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyBpcyAgICAgKi8KLSAgLyogICAgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfREVDTEFSRV9EUklWRVIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBGVF9Ecml2ZXJfQ2xhc3NSZWMgc3RydWN0CisgICAqICAgaW5zdGFuY2UuCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9ERUZJTkVfRFJJVkVSCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfRHJpdmVyX0NsYXNzUmVjIHN0cnVjdC4KKyAgICoKKyAgICogICBgZnRpbml0LmNgIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyBhCisgICAqICAgbWVjaGFuaXNtIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGZvciB0aGUgZGVmYXVsdCBtb2R1bGVzIGRlc2NyaWJlZCBpbgorICAgKiAgIGBmdG1vZHVsZS5oYC4KKyAgICoKKyAgICogICBUaGUgc3RydWN0IHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZQorICAgKiAgIHRoZSBtYWNybyBpcyB1c2VkKS4KKyAgICovCiAjZGVmaW5lIEZUX0RFQ0xBUkVfRFJJVkVSKCBjbGFzc18gKSAgXAogICBGVF9DQUxMQkFDS19UQUJMRSAgICAgICAgICAgICAgICAgIFwKICAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICBjbGFzc187CkBAIC0yODksMTA4ICsyNzksNiBAQAogICAgIHNlbGVjdF9zaXplXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfRFJJVkVSKCBjbGFzc18gKSAgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApCi0KLSNkZWZpbmUgRlRfREVGSU5FX0RSSVZFUiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNsb3Rfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfc2xvdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGF0dGFjaF9maWxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2FkdmFuY2VzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1ZXN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNlbGVjdF9zaXplXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICkgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RyaXZlcl9DbGFzcyAgZGNsYXp6ID0gKEZUX0RyaXZlcl9DbGFzcyljbGF6ejsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBkY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGRjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZmFjZV9vYmplY3Rfc2l6ZSA9IGZhY2Vfb2JqZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zaXplX29iamVjdF9zaXplID0gc2l6ZV9vYmplY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNsb3Rfb2JqZWN0X3NpemUgPSBzbG90X29iamVjdF9zaXplXzsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X2ZhY2UgICAgICAgID0gaW5pdF9mYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfZmFjZSAgICAgICAgPSBkb25lX2ZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X3NpemUgICAgICAgID0gaW5pdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfc2l6ZSAgICAgICAgPSBkb25lX3NpemVfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X3Nsb3QgICAgICAgID0gaW5pdF9zbG90XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfc2xvdCAgICAgICAgPSBkb25lX3Nsb3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2dseXBoICAgICAgID0gbG9hZF9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2tlcm5pbmcgICAgICA9IGdldF9rZXJuaW5nXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hdHRhY2hfZmlsZSAgICAgID0gYXR0YWNoX2ZpbGVfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9hZHZhbmNlcyAgICAgPSBnZXRfYWR2YW5jZXNfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yZXF1ZXN0X3NpemUgICAgID0gcmVxdWVzdF9zaXplXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNlbGVjdF9zaXplICAgICAgPSBzZWxlY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKIEZUX0VORF9IRUFERVIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oCmluZGV4IGEwMDJmZGIuLjI3Yjg2NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmgKQEAgLTEsNDEgKzEsNDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2xvYWRyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z2xvYWRyLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBnbHlwaCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUR0xPQURSX0hfCiAjZGVmaW5lIEZUR0xPQURSX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBsb2FkZXIgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gbG9hZCBzZXZlcmFsIGdseXBocyAqLwotICAvKiAgICB0b2dldGhlciAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX0dseXBoTG9hZGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgZ2x5cGggbG9hZGVyIGlzIGFuIGludGVybmFsIG9iamVjdCB1c2VkIHRvIGxvYWQgc2V2ZXJhbCBnbHlwaHMKKyAgICogICB0b2dldGhlciAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N1YkdseXBoUmVjXwogICB7CiAgICAgRlRfSW50ICAgICBpbmRleDsKQEAgLTEzOCwxMyArMTM3LDYgQEAKICAgRlRfQkFTRSggdm9pZCApCiAgIEZUX0dseXBoTG9hZGVyX0FkZCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwogCi0gIC8qIGNvcHkgcG9pbnRzIGZyb20gb25lIGdseXBoIGxvYWRlciB0byBhbm90aGVyICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ29weVBvaW50cyggRlRfR2x5cGhMb2FkZXIgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgIHNvdXJjZSApOwotCi0gLyogKi8KLQogCiBGVF9FTkRfSEVBREVSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oCmluZGV4IGYyMmY5ZDUuLjYyMmVjNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaApAQCAtMSwxMCArMSwxMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRoYXNoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhhc2hpbmcgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRoYXNoLmgKKyAqCisgKiAgIEhhc2hpbmcgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKi8KIAogLyoKICAqIENvcHlyaWdodCAyMDAwIENvbXB1dGluZyBSZXNlYXJjaCBMYWJzLCBOZXcgTWV4aWNvIFN0YXRlIFVuaXZlcnNpdHkKQEAgLTMwLDIxICszMCwyMCBAQAogICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gY29kZSBmcm9tIGJkZi5jLHYgMS4yMiAyMDAwLzAzLzE2IDIwOjA4OjUwICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIHRha2VuIGZyb20gTWFyayBMZWlzaGVyJ3MgeG1iZGZlZCBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBjb2RlIGZyb20gYmRmLmMsdiAxLjIyIDIwMDAvMDMvMTYgMjA6MDg6NTAKKyAgICoKKyAgICogdGFrZW4gZnJvbSBNYXJrIExlaXNoZXIncyB4bWJkZmVkIHBhY2thZ2UKKyAgICoKKyAgICovCiAKIAogI2lmbmRlZiBGVEhBU0hfSF8KICNkZWZpbmUgRlRIQVNIX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaAppbmRleCAwNTRlYWVjLi5kZGIxOGIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1lbW9yeS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIG1lbW9yeSBtYW5hZ2VtZW50IG1hY3JvcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG1lbW9yeS5oCisgKgorICogICBUaGUgRnJlZVR5cGUgbWVtb3J5IG1hbmFnZW1lbnQgbWFjcm9zIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVE1FTU9SWV9IXwpAQCAtMjIsMjIgKzIyLDIzIEBACiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnR0eXBlcy5oPgogCisjaW5jbHVkZSAiY29tcGlsZXItbWFjcm9zLmgiCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0VUX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIHNldCBhbiBpbXBsaWNpdCBgZXJyb3InIHZhcmlhYmxlIHRvIGEgZ2l2ZW4gICovCi0gIC8qICAgIGV4cHJlc3Npb24ncyB2YWx1ZSAodXN1YWxseSBhIGZ1bmN0aW9uIGNhbGwpLCBhbmQgY29udmVydCBpdCB0byBhICAqLwotICAvKiAgICBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuZXZlciB0aGUgdmFsdWUgaXMgIT0gMC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfU0VUX0VSUk9SCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc2V0IGFuIGltcGxpY2l0ICdlcnJvcicgdmFyaWFibGUgdG8gYSBnaXZlbgorICAgKiAgIGV4cHJlc3Npb24ncyB2YWx1ZSAodXN1YWxseSBhIGZ1bmN0aW9uIGNhbGwpLCBhbmQgY29udmVydCBpdCB0byBhCisgICAqICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgd2hlbmV2ZXIgdGhlIHZhbHVlIGlzICE9IDAuCisgICAqLwogI3VuZGVmICBGVF9TRVRfRVJST1IKICNkZWZpbmUgRlRfU0VUX0VSUk9SKCBleHByZXNzaW9uICkgXAogICAgICAgICAgICggKCBlcnJvciA9IChleHByZXNzaW9uKSApICE9IDAgKQpAQCAtNTcsMTAgKzU4LDE4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKKyAgLyogVGhlIGNhbGN1bGF0aW9uIGBOVUxMICsgbicgaXMgdW5kZWZpbmVkIGluIEMuICBFdmVuIGlmIHRoZSByZXN1bHRpbmcgKi8KKyAgLyogcG9pbnRlciBkb2Vzbid0IGdldCBkZXJlZmVyZW5jZWQsIHRoaXMgY2F1c2VzIHdhcm5pbmdzIHdpdGggICAgICAgICAgKi8KKyAgLyogc2FuaXRpemVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogV2UgdGh1cyBwcm92aWRlIGEgbWFjcm8gdGhhdCBzaG91bGQgYmUgdXNlZCBpZiBgYmFzZScgY2FuIGJlIE5VTEwuICAgKi8KKyNkZWZpbmUgRlRfT0ZGU0VUKCBiYXNlLCBjb3VudCApICAoIChiYXNlKSA/IChiYXNlKSArIChjb3VudCkgOiBOVUxMICkKKworCiAgIC8qCi0gICAqICBDKysgcmVmdXNlcyB0byBoYW5kbGUgc3RhdGVtZW50cyBsaWtlIHAgPSAodm9pZCopYW55dGhpbmcsIHdpdGggYHAnIGEKLSAgICogIHR5cGVkIHBvaW50ZXIuICBTaW5jZSB3ZSBkb24ndCBoYXZlIGEgYHR5cGVvZicgb3BlcmF0b3IgaW4gc3RhbmRhcmQKLSAgICogIEMrKywgd2UgaGF2ZSB0byB1c2UgYSB0ZW1wbGF0ZSB0byBlbXVsYXRlIGl0LgorICAgKiBDKysgcmVmdXNlcyB0byBoYW5kbGUgc3RhdGVtZW50cyBsaWtlIHAgPSAodm9pZCopYW55dGhpbmcsIHdpdGggYHAnIGEKKyAgICogdHlwZWQgcG9pbnRlci4gIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBgdHlwZW9mJyBvcGVyYXRvciBpbiBzdGFuZGFyZCBDKyssCisgICAqIHdlIGhhdmUgdG8gdXNlIGEgdGVtcGxhdGUgdG8gZW11bGF0ZSBpdC4KICAgICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTA3LDggKzExNiw4IEBACiAKIAogICAvKgotICAgKiAgVGhlIGFsbG9jYXRpb24gZnVuY3Rpb25zIHJldHVybiBhIHBvaW50ZXIsIGFuZCB0aGUgZXJyb3IgY29kZQotICAgKiAgaXMgd3JpdHRlbiB0byB0aHJvdWdoIHRoZSBgcF9lcnJvcicgcGFyYW1ldGVyLgorICAgKiBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcmV0dXJuIGEgcG9pbnRlciwgYW5kIHRoZSBlcnJvciBjb2RlIGlzIHdyaXR0ZW4KKyAgICogdG8gdGhyb3VnaCB0aGUgYHBfZXJyb3InIHBhcmFtZXRlci4KICAgICovCiAKICAgLyogVGhlIGBxJyB2YXJpYW50cyBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IChgcScgZm9yIGBxdWljaycpIGRvbid0IGZpbGwgKi8KQEAgLTE1MywxMCArMTYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShzaXplKSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCiAKLSNkZWZpbmUgRlRfTUVNX0ZSRUUoIHB0ciApICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZ0X21lbV9mcmVlKCBtZW1vcnksIChwdHIpICk7IFwKLSAgICAgICAgICAgIChwdHIpID0gTlVMTDsgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgRlRfTUVNX0ZSRUUoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBmdF9tZW1fZnJlZSggbWVtb3J5LCAocHRyKSApICk7IFwKKyAgICAgICAgICAgIChwdHIpID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBGVF9FTkRfU1RNTlQKIAogI2RlZmluZSBGVF9NRU1fTkVXKCBwdHIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI1MywyMCArMjYyLDE5IEBACiAKIAogICAvKgotICAgKiAgUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzYWJsZSBlbGVtZW50cyBpbiBhbiBhcnJheS4KLSAgICogIFdlIGxpbWl0IG91cnNlbHZlcyB0byBJTlRfTUFYLCByYXRoZXIgdGhhbiBVSU5UX01BWCwgdG8gYXZvaWQKLSAgICogIGFueSBwcm9ibGVtcy4KKyAgICogUmV0dXJuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZGRyZXNzYWJsZSBlbGVtZW50cyBpbiBhbiBhcnJheS4gIFdlIGxpbWl0CisgICAqIG91cnNlbHZlcyB0byBJTlRfTUFYLCByYXRoZXIgdGhhbiBVSU5UX01BWCwgdG8gYXZvaWQgYW55IHByb2JsZW1zLgogICAgKi8KICNkZWZpbmUgRlRfQVJSQVlfTUFYKCBwdHIgKSAgICAgICAgICAgKCBGVF9JTlRfTUFYIC8gc2l6ZW9mICggKihwdHIpICkgKQogCiAjZGVmaW5lIEZUX0FSUkFZX0NIRUNLKCBwdHIsIGNvdW50ICkgICggKGNvdW50KSA8PSBGVF9BUlJBWV9NQVgoIHB0ciApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFjcm9zIGV4cGVjdCB0aGF0IHRoZWlyIHBvaW50ZXIgYXJndW1lbnQgaXMgICovCi0gIC8qIF90eXBlZF8gaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIGFycmF5IGVsZW1lbnQgc2l6ZXMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG1hY3JvcyBleHBlY3QgdGhhdCB0aGVpciBwb2ludGVyIGFyZ3VtZW50IGlzCisgICAqIF90eXBlZF8gaW4gb3JkZXIgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIGFycmF5IGVsZW1lbnQgc2l6ZXMuCisgICAqLwogCiAjZGVmaW5lIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXApAQCAtMzgyLDggKzM5MCw2IEBACiAjZGVmaW5lIEZUX1NUUkNQWU4oIGRzdCwgc3JjLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBmdF9tZW1fc3RyY3B5biggKGNoYXIqKWRzdCwgKGNvbnN0IGNoYXIqKShzcmMpLCAoRlRfVUxvbmcpKHNpemUpICkKIAotIC8qICovCi0KIAogRlRfRU5EX0hFQURFUgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaAppbmRleCAxYzNjNmFkLi4yNWRiMmM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgKQEAgLTEsNTUgKzEsNTQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcHJpdmF0ZSBiYXNlIGNsYXNzZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0b2Jqcy5oCisgKgorICogICBUaGUgRnJlZVR5cGUgcHJpdmF0ZSBiYXNlIGNsYXNzZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYWxsIGludGVybmFsIEZyZWVUeXBlIGNsYXNzZXMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYWxsIGludGVybmFsIEZyZWVUeXBlIGNsYXNzZXMuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRPQkpTX0hfCiAjZGVmaW5lIEZUT0JKU19IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1JFTkRFUl9ICi0jaW5jbHVkZSBGVF9TSVpFU19ICi0jaW5jbHVkZSBGVF9MQ0RfRklMVEVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0FVVE9ISU5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0cmVuZGVyLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzaXplcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bGNkZmlsLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KIAogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSNpbmNsdWRlIEZUX0lOQ1JFTUVOVEFMX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGluY3JlbS5oPgogI2VuZGlmCiAKKyNpbmNsdWRlICJjb21waWxlci1tYWNyb3MuaCIKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucy4KKyAgICovCiAjaWZuZGVmIFRSVUUKICNkZWZpbmUgVFJVRSAgMQogI2VuZGlmCkBAIC02MywyMCArNjIsMjAgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWluIGFuZCBtYXggZnVuY3Rpb25zIG1pc3NpbmcgaW4gQy4gIEFzIHVzdWFsLCBiZSBjYXJlZnVsIG5vdCB0byAgKi8KLSAgLyogd3JpdGUgdGhpbmdzIGxpa2UgRlRfTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1pbiBhbmQgbWF4IGZ1bmN0aW9ucyBtaXNzaW5nIGluIEMuICBBcyB1c3VhbCwgYmUgY2FyZWZ1bCBub3QgdG8KKyAgICogd3JpdGUgdGhpbmdzIGxpa2UgRlRfTUlOKCBhKyssIGIrKyApIHRvIGF2b2lkIHNpZGUgZWZmZWN0cy4KKyAgICovCiAjZGVmaW5lIEZUX01JTiggYSwgYiApICAoIChhKSA8IChiKSA/IChhKSA6IChiKSApCiAjZGVmaW5lIEZUX01BWCggYSwgYiApICAoIChhKSA+IChiKSA/IChhKSA6IChiKSApCiAKICNkZWZpbmUgRlRfQUJTKCBhICkgICAgICggKGEpIDwgMCA/IC0oYSkgOiAoYSkgKQogCiAgIC8qCi0gICAqICBBcHByb3hpbWF0ZSBzcXJ0KHgqeCt5KnkpIHVzaW5nIHRoZSBgYWxwaGEgbWF4IHBsdXMgYmV0YSBtaW4nCi0gICAqICBhbGdvcml0aG0uICBXZSB1c2UgYWxwaGEgPSAxLCBiZXRhID0gMy84LCBnaXZpbmcgdXMgcmVzdWx0cyB3aXRoIGEKLSAgICogIGxhcmdlc3QgZXJyb3IgbGVzcyB0aGFuIDclIGNvbXBhcmVkIHRvIHRoZSBleGFjdCB2YWx1ZS4KKyAgICogQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJyBhbGdvcml0aG0uCisgICAqIFdlIHVzZSBhbHBoYSA9IDEsIGJldGEgPSAzLzgsIGdpdmluZyB1cyByZXN1bHRzIHdpdGggYSBsYXJnZXN0IGVycm9yCisgICAqIGxlc3MgdGhhbiA3JSBjb21wYXJlZCB0byB0aGUgZXhhY3QgdmFsdWUuCiAgICAqLwogI2RlZmluZSBGVF9IWVBPVCggeCwgeSApICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKCB4ID0gRlRfQUJTKCB4ICksICAgICAgICAgICAgIFwKQEAgLTExMSw5ICsxMTAsOCBAQAogCiAKICAgLyoKLSAgICogIGNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbiBmdW5jdGlvbnMgLS0gc2luY2UgdGhlc2UgYXJlIHVzZWQgdG8gcGFyc2UKLSAgICogIGZvbnQgZmlsZXMsIHdlIG11c3Qgbm90IHVzZSB0aG9zZSBpbiA8Y3R5cGVzLmg+IHdoaWNoIGFyZQotICAgKiAgbG9jYWxlLWRlcGVuZGVudAorICAgKiBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24gZnVuY3Rpb25zIC0tIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHRvIHBhcnNlIGZvbnQKKyAgICogZmlsZXMsIHdlIG11c3Qgbm90IHVzZSB0aG9zZSBpbiA8Y3R5cGVzLmg+IHdoaWNoIGFyZSBsb2NhbGUtZGVwZW5kZW50CiAgICAqLwogI2RlZmluZSAgZnRfaXNkaWdpdCggeCApICAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSApCiAKQEAgLTE4Nyw3ICsxODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudF9zZWxlY3RvciApOwogCi0gIHR5cGVkZWYgRlRfQm9vbAorICB0eXBlZGVmIEZUX0ludAogICAoKkZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIHZhcmlhbnRfc2VsZWN0b3IgKTsKQEAgLTIyOCwxMCArMjI2LDggQEAKICAgfSBGVF9DTWFwX0NsYXNzUmVjOwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoIGNsYXNzXyApICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0ICBGVF9DTWFwX0NsYXNzUmVjIGNsYXNzXzsKKyNkZWZpbmUgRlRfREVDTEFSRV9DTUFQX0NMQVNTKCBjbGFzc18gKSAgICAgICAgICAgIFwKKyAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYyAgY2xhc3NfOwogCiAjZGVmaW5lIEZUX0RFRklORV9DTUFQX0NMQVNTKCAgICAgICBcCiAgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICBcCkBAIC0yNjAsNDUgKzI1Niw2IEBACiAgICAgdmFyaWFudGNoYXJfbGlzdF8gICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9DTUFQX0NMQVNTKCBjbGFzc18gKSAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKTsKLQotI2RlZmluZSBGVF9ERUZJTkVfQ01BUF9DTEFTUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NNYXBfQ2xhc3NSZWMqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zaXplICAgICAgICAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0ICAgICAgICAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lICAgICAgICAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX2luZGV4ICAgICAgID0gY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX25leHQgICAgICAgID0gY2hhcl9uZXh0XzsgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX3Zhcl9pbmRleCAgID0gY2hhcl92YXJfaW5kZXhfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFyX3Zhcl9kZWZhdWx0ID0gY2hhcl92YXJfZGVmYXVsdF87ICAgICAgICAgXAotICAgIGNsYXp6LT52YXJpYW50X2xpc3QgICAgID0gdmFyaWFudF9saXN0XzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jaGFydmFyaWFudF9saXN0ID0gY2hhcnZhcmlhbnRfbGlzdF87ICAgICAgICAgXAotICAgIGNsYXp6LT52YXJpYW50Y2hhcl9saXN0ID0gdmFyaWFudGNoYXJfbGlzdF87ICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAKICAgLyogY3JlYXRlIGEgbmV3IGNoYXJtYXAgYW5kIGFkZCBpdCB0byBjaGFybWFwLT5mYWNlICovCiAgIEZUX0JBU0UoIEZUX0Vycm9yICkKQEAgLTMxMiw5NSArMjY5LDkxIEBACiAgIEZUX0NNYXBfRG9uZSggRlRfQ01hcCAgY21hcCApOwogCiAKLSAgLyogYWRkcyBMQ0QgcGFkZGluZyB0byBNaW4gYW5kIE1heCBib3VuZGFyaWVzICovCisgIC8qIGFkZCBMQ0QgcGFkZGluZyB0byBDQm94ICovCiAgIEZUX0JBU0UoIHZvaWQgKQotICBmdF9sY2RfcGFkZGluZyggRlRfUG9zKiAgICAgICBNaW4sCi0gICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgIE1heCwKLSAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCApOworICBmdF9sY2RfcGFkZGluZyggRlRfQkJveCogICAgICAgIGNib3gsCisgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlICk7CiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwogCiAgIHR5cGVkZWYgdm9pZCAgKCpGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYykoIEZUX0JpdG1hcCogICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIHdlaWdodHMgKTsKIAogCiAgIC8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgTENEIGZpbHRlciwgYW4gaW4tcGxhY2UsIDUtdGFwIEZJUiBmaWx0ZXIuICovCiAgIEZUX0JBU0UoIHZvaWQgKQogICBmdF9sY2RfZmlsdGVyX2ZpciggRlRfQml0bWFwKiAgICAgICAgICAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgICAgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX0xjZEZpdmVUYXBGaWx0ZXIgIHdlaWdodHMgKTsKIAogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9JbnRlcm5hbFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVybmFsIGZpZWxkcyBvZiBlYWNoIEZUX0ZhY2UgICAgICAgICovCi0gIC8qICAgIG9iamVjdC4gIFRoZXNlIGZpZWxkcyBtYXkgY2hhbmdlIGJldHdlZW4gZGlmZmVyZW50IHJlbGVhc2VzIG9mICAgICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfcG9pbnRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIHVzZWQgdG8gc3RvcmUgdGhlIHZlY3RvcmlhbCBvdXRsaW5lICovCi0gIC8qICAgICAgb2YgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlIGtub3duIGluICAgICAqLwotICAvKiAgICAgIGFkdmFuY2UsIG9yIGlmIHRoZSBmYWNlIGlzbid0IHNjYWxhYmxlLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gMC4gKi8KLSAgLyogICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfY29udG91cnMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgdXNlZCB0byBzdG9yZSB0aGUgdmVjdG9yaWFsICAgICAgICovCi0gIC8qICAgICAgb3V0bGluZSBvZiBhbnkgZ2x5cGggaW4gdGhpcyBmYWNlLiAgSWYgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgICAgICAqLwotICAvKiAgICAgIGtub3duIGluIGFkdmFuY2UsIG9yIGlmIHRoZSBmYWNlIGlzbid0IHNjYWxhYmxlLCB0aGlzIHNob3VsZCBiZSAgKi8KLSAgLyogICAgICBzZXQgdG8gMC4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fbWF0cml4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIDJ4MiBtYXRyaXggb2YgMTYuMTYgY29lZmZpY2llbnRzIHVzZWQgdG8gdHJhbnNmb3JtIGdseXBoICAgICAgICovCi0gIC8qICAgICAgb3V0bGluZXMgYWZ0ZXIgdGhleSBhcmUgbG9hZGVkIGZyb20gdGhlIGZvbnQuICBPbmx5IHVzZWQgYnkgdGhlICAqLwotICAvKiAgICAgIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9kZWx0YSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgdHJhbnNsYXRpb24gdmVjdG9yIHVzZWQgdG8gdHJhbnNmb3JtIGdseXBoIG91dGxpbmVzIGFmdGVyIHRoZXkgKi8KLSAgLyogICAgICBhcmUgbG9hZGVkIGZyb20gdGhlIGZvbnQuICBPbmx5IHVzZWQgYnkgdGhlIGNvbnZlbmllbmNlICAgICAgICAgICovCi0gIC8qICAgICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX2ZsYWdzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU29tZSBmbGFncyB1c2VkIHRvIGNsYXNzaWZ5IHRoZSB0cmFuc2Zvcm0uICBPbmx5IHVzZWQgYnkgdGhlICAgICAqLwotICAvKiAgICAgIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlcnZpY2VzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgY2FjaGUgZm9yIGZyZXF1ZW50bHkgdXNlZCBzZXJ2aWNlcy4gIEl0IHNob3VsZCBiZSBvbmx5ICAgICAgICAgKi8KLSAgLyogICAgICBhY2Nlc3NlZCB3aXRoIHRoZSBtYWNybyBgRlRfRkFDRV9MT09LVVBfU0VSVklDRScuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbmNyZW1lbnRhbF9pbnRlcmZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBub24tbnVsbCwgdGhlIGludGVyZmFjZSB0aHJvdWdoIHdoaWNoIGdseXBoIGRhdGEgYW5kIG1ldHJpY3MgICovCi0gIC8qICAgICAgYXJlIGxvYWRlZCBpbmNyZW1lbnRhbGx5IGZvciBmYWNlcyB0aGF0IGRvIG5vdCBwcm92aWRlIGFsbCBvZiAgICAqLwotICAvKiAgICAgIHRoaXMgZGF0YSB3aGVuIGZpcnN0IG9wZW5lZC4gIFRoaXMgZmllbGQgZXhpc3RzIG9ubHkgaWYgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCBpcyBkZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub19zdGVtX2RhcmtlbmluZyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBPdmVycmlkZXMgdGhlIG1vZHVsZS1sZXZlbCBkZWZhdWx0LCBzZWUgQHN0ZW0tZGFya2VuaW5nW2NmZl0sICAgICovCi0gIC8qICAgICAgZm9yIGV4YW1wbGUuICBGQUxTRSBhbmQgVFJVRSB0b2dnbGUgc3RlbSBkYXJrZW5pbmcgb24gYW5kIG9mZiwgICAqLwotICAvKiAgICAgIHJlc3BlY3RpdmVseSwgdmFsdWV+LTEgbWVhbnMgdG8gdXNlIHRoZSBtb2R1bGUvZHJpdmVyIGRlZmF1bHQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmRvbV9zZWVkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHBvc2l0aXZlLCBvdmVycmlkZSB0aGUgc2VlZCB2YWx1ZSBmb3IgdGhlIENGRiBgcmFuZG9tJyAgICAgICAgKi8KLSAgLyogICAgICBvcGVyYXRvci4gIFZhbHVlfjAgbWVhbnMgdG8gdXNlIHRoZSBmb250J3MgdmFsdWUuICBWYWx1ZX4tMSAgICAgICovCi0gIC8qICAgICAgbWVhbnMgdG8gdXNlIHRoZSBDRkYgZHJpdmVyJ3MgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX3dlaWdodHMgICAgICA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxjZF9maWx0ZXJfZnVuYyAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgZmlsdGVyaW5nIHdlaWdodHMgICAgKi8KLSAgLyogICAgICBhbmQgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWZjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgaXMgICovCi0gIC8qICAgICAgY3JlYXRlZC4gIEBGVF9SZWZlcmVuY2VfRmFjZSBpbmNyZW1lbnRzIHRoaXMgY291bnRlciwgYW5kICAgICAgICAqLwotICAvKiAgICAgIEBGVF9Eb25lX0ZhY2Ugb25seSBkZXN0cm95cyBhIGZhY2UgaWYgdGhlIGNvdW50ZXIgaXN+MSwgICAgICAgICAgKi8KLSAgLyogICAgICBvdGhlcndpc2UgaXQgc2ltcGx5IGRlY3JlbWVudHMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9GYWNlX0ludGVybmFsUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfRmFjZSBvYmplY3QuCisgICAqICAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgRnJlZVR5cGUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbWF4X3BvaW50cyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgb3V0bGluZSBvZgorICAgKiAgICAgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlIGtub3duIGluIGFkdmFuY2UsCisgICAqICAgICBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuICBPbmx5CisgICAqICAgICByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4KKyAgICoKKyAgICogICBtYXhfY29udG91cnMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgb3V0bGluZQorICAgKiAgICAgb2YgYW55IGdseXBoIGluIHRoaXMgZmFjZS4gIElmIHRoaXMgdmFsdWUgY2Fubm90IGJlIGtub3duIGluCisgICAqICAgICBhZHZhbmNlLCBvciBpZiB0aGUgZmFjZSBpc24ndCBzY2FsYWJsZSwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIDAuCisgICAqICAgICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLgorICAgKgorICAgKiAgIHRyYW5zZm9ybV9tYXRyaXggOjoKKyAgICogICAgIEEgMngyIG1hdHJpeCBvZiAxNi4xNiBjb2VmZmljaWVudHMgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggb3V0bGluZXMKKyAgICogICAgIGFmdGVyIHRoZXkgYXJlIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSBjb252ZW5pZW5jZQorICAgKiAgICAgZnVuY3Rpb25zLgorICAgKgorICAgKiAgIHRyYW5zZm9ybV9kZWx0YSA6OgorICAgKiAgICAgQSB0cmFuc2xhdGlvbiB2ZWN0b3IgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggb3V0bGluZXMgYWZ0ZXIgdGhleSBhcmUKKyAgICogICAgIGxvYWRlZCBmcm9tIHRoZSBmb250LiAgT25seSB1c2VkIGJ5IHRoZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCisgICAqCisgICAqICAgdHJhbnNmb3JtX2ZsYWdzIDo6CisgICAqICAgICBTb21lIGZsYWdzIHVzZWQgdG8gY2xhc3NpZnkgdGhlIHRyYW5zZm9ybS4gIE9ubHkgdXNlZCBieSB0aGUKKyAgICogICAgIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKyAgICoKKyAgICogICBzZXJ2aWNlcyA6OgorICAgKiAgICAgQSBjYWNoZSBmb3IgZnJlcXVlbnRseSB1c2VkIHNlcnZpY2VzLiAgSXQgc2hvdWxkIGJlIG9ubHkgYWNjZXNzZWQKKyAgICogICAgIHdpdGggdGhlIG1hY3JvIGBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFYC4KKyAgICoKKyAgICogICBpbmNyZW1lbnRhbF9pbnRlcmZhY2UgOjoKKyAgICogICAgIElmIG5vbi1udWxsLCB0aGUgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggZ2x5cGggZGF0YSBhbmQgbWV0cmljcyBhcmUKKyAgICogICAgIGxvYWRlZCBpbmNyZW1lbnRhbGx5IGZvciBmYWNlcyB0aGF0IGRvIG5vdCBwcm92aWRlIGFsbCBvZiB0aGlzIGRhdGEKKyAgICogICAgIHdoZW4gZmlyc3Qgb3BlbmVkLiAgVGhpcyBmaWVsZCBleGlzdHMgb25seSBpZgorICAgKiAgICAgQEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgaXMgZGVmaW5lZC4KKyAgICoKKyAgICogICBub19zdGVtX2RhcmtlbmluZyA6OgorICAgKiAgICAgT3ZlcnJpZGVzIHRoZSBtb2R1bGUtbGV2ZWwgZGVmYXVsdCwgc2VlIEBzdGVtLWRhcmtlbmluZ1tjZmZdLCBmb3IKKyAgICogICAgIGV4YW1wbGUuICBGQUxTRSBhbmQgVFJVRSB0b2dnbGUgc3RlbSBkYXJrZW5pbmcgb24gYW5kIG9mZiwKKyAgICogICAgIHJlc3BlY3RpdmVseSwgdmFsdWV+LTEgbWVhbnMgdG8gdXNlIHRoZSBtb2R1bGUvZHJpdmVyIGRlZmF1bHQuCisgICAqCisgICAqICAgcmFuZG9tX3NlZWQgOjoKKyAgICogICAgIElmIHBvc2l0aXZlLCBvdmVycmlkZSB0aGUgc2VlZCB2YWx1ZSBmb3IgdGhlIENGRiAncmFuZG9tJyBvcGVyYXRvci4KKyAgICogICAgIFZhbHVlfjAgbWVhbnMgdG8gdXNlIHRoZSBmb250J3MgdmFsdWUuICBWYWx1ZX4tMSBtZWFucyB0byB1c2UgdGhlCisgICAqICAgICBDRkYgZHJpdmVyJ3MgZGVmYXVsdC4KKyAgICoKKyAgICogICBsY2Rfd2VpZ2h0cyA6OgorICAgKiAgIGxjZF9maWx0ZXJfZnVuYyA6OgorICAgKiAgICAgVGhlc2UgZmllbGRzIHNwZWNpZnkgdGhlIExDRCBmaWx0ZXJpbmcgd2VpZ2h0cyBhbmQgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICogICAgIGZvciBDbGVhclR5cGUtc3R5bGUgc3VicGl4ZWwgcmVuZGVyaW5nLgorICAgKgorICAgKiAgIHJlZmNvdW50IDo6CisgICAqICAgICBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfRmFjZSBzdHJ1Y3R1cmUgaXMKKyAgICogICAgIGNyZWF0ZWQuICBARlRfUmVmZXJlbmNlX0ZhY2UgaW5jcmVtZW50cyB0aGlzIGNvdW50ZXIsIGFuZAorICAgKiAgICAgQEZUX0RvbmVfRmFjZSBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQKKyAgICogICAgIHNpbXBseSBkZWNyZW1lbnRzIGl0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZhY2VfSW50ZXJuYWxSZWNfCiAgIHsKICAgICBGVF9NYXRyaXggIHRyYW5zZm9ybV9tYXRyaXg7CkBAIC00MjYsMzkgKzM3OSw0NCBAQAogICB9IEZUX0ZhY2VfSW50ZXJuYWxSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TbG90X0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfR2x5cGhTbG90ICAgKi8KLSAgLyogICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgICAgICovCi0gIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgICAgICAgIDo6IFRoZSBnbHlwaCBsb2FkZXIgb2JqZWN0IHVzZWQgdG8gbG9hZCBvdXRsaW5lcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgICAgICAgIDo6IFBvc3NpYmxlIHZhbHVlcyBhcmUgemVybyBvciAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HTFlQSF9PV05fQklUTUFQLiAgVGhlIGxhdHRlciBpbmRpY2F0ZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgRlRfR2x5cGhTbG90IHN0cnVjdHVyZSBvd25zIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfdHJhbnNmb3JtZWQgOjogQm9vbGVhbi4gIFNldCB0byBUUlVFIHdoZW4gdGhlIGxvYWRlZCBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdHJhbnNmb3JtZWQgdGhyb3VnaCBhIHNwZWNpZmljICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmb250IHRyYW5zZm9ybWF0aW9uLiAgVGhpcyBpcyBfbm90XyB0aGUgc2FtZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIGZhY2UgdHJhbnNmb3JtIHNldCB0aHJvdWdoICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NldF9UcmFuc2Zvcm0oKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbWF0cml4ICAgICAgOjogVGhlIDJ4MiBtYXRyaXggY29ycmVzcG9uZGluZyB0byB0aGUgZ2x5cGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLCBpZiBuZWNlc3NhcnkuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfZGVsdGEgICAgICAgOjogVGhlIDJkIHRyYW5zbGF0aW9uIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaCB0cmFuc2Zvcm1hdGlvbiwgaWYgbmVjZXNzYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaGludHMgICAgICAgOjogRm9ybWF0LXNwZWNpZmljIGdseXBoIGhpbnRzIG1hbmFnZW1lbnQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TbG90X0ludGVybmFsUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfR2x5cGhTbG90CisgICAqICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YKKyAgICogICBGcmVlVHlwZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBsb2FkZXIgOjoKKyAgICogICAgIFRoZSBnbHlwaCBsb2FkZXIgb2JqZWN0IHVzZWQgdG8gbG9hZCBvdXRsaW5lcyBpbnRvIHRoZSBnbHlwaCBzbG90LgorICAgKgorICAgKiAgIGZsYWdzIDo6CisgICAqICAgICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHplcm8gb3IgRlRfR0xZUEhfT1dOX0JJVE1BUC4gIFRoZSBsYXR0ZXIKKyAgICogICAgIGluZGljYXRlcyB0aGF0IHRoZSBGVF9HbHlwaFNsb3Qgc3RydWN0dXJlIG93bnMgdGhlIGJpdG1hcCBidWZmZXIuCisgICAqCisgICAqICAgZ2x5cGhfdHJhbnNmb3JtZWQgOjoKKyAgICogICAgIEJvb2xlYW4uICBTZXQgdG8gVFJVRSB3aGVuIHRoZSBsb2FkZWQgZ2x5cGggbXVzdCBiZSB0cmFuc2Zvcm1lZAorICAgKiAgICAgdGhyb3VnaCBhIHNwZWNpZmljIGZvbnQgdHJhbnNmb3JtYXRpb24uICBUaGlzIGlzIF9ub3RfIHRoZSBzYW1lIGFzCisgICAqICAgICB0aGUgZmFjZSB0cmFuc2Zvcm0gc2V0IHRocm91Z2ggRlRfU2V0X1RyYW5zZm9ybSgpLgorICAgKgorICAgKiAgIGdseXBoX21hdHJpeCA6OgorICAgKiAgICAgVGhlIDJ4MiBtYXRyaXggY29ycmVzcG9uZGluZyB0byB0aGUgZ2x5cGggdHJhbnNmb3JtYXRpb24sIGlmCisgICAqICAgICBuZWNlc3NhcnkuCisgICAqCisgICAqICAgZ2x5cGhfZGVsdGEgOjoKKyAgICogICAgIFRoZSAyZCB0cmFuc2xhdGlvbiB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2x5cGggdHJhbnNmb3JtYXRpb24sCisgICAqICAgICBpZiBuZWNlc3NhcnkuCisgICAqCisgICAqICAgZ2x5cGhfaGludHMgOjoKKyAgICogICAgIEZvcm1hdC1zcGVjaWZpYyBnbHlwaCBoaW50cyBtYW5hZ2VtZW50LgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIFRoZSBsb2FkIGZsYWdzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBARlRfTG9hZF9HbHlwaCB3aGlsZQorICAgKiAgICAgaW5pdGlhbGl6aW5nIHRoZSBnbHlwaCBzbG90LgorICAgKi8KIAogI2RlZmluZSBGVF9HTFlQSF9PV05fQklUTUFQICAweDFVCiAKQEAgLTQ3MSwyNiArNDI5LDMwIEBACiAgICAgRlRfVmVjdG9yICAgICAgIGdseXBoX2RlbHRhOwogICAgIHZvaWQqICAgICAgICAgICBnbHlwaF9oaW50czsKIAorICAgIEZUX0ludDMyICAgICAgICBsb2FkX2ZsYWdzOworCiAgIH0gRlRfR2x5cGhTbG90X0ludGVybmFsUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVybmFsIGZpZWxkcyBvZiBlYWNoIEZUX1NpemUgICAgICAgICovCi0gIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9kYXRhICAgICAgOjogRGF0YSBzcGVjaWZpYyB0byBhIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b2hpbnRfbW9kZSAgICA6OiBUaGUgdXNlZCBhdXRvLWhpbnRpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhdXRvaGludF9tZXRyaWNzIDo6IE1ldHJpY3MgdXNlZCBieSB0aGUgYXV0by1oaW50ZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9TaXplX0ludGVybmFsUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfU2l6ZSBvYmplY3QuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbW9kdWxlX2RhdGEgOjoKKyAgICogICAgIERhdGEgc3BlY2lmaWMgdG8gYSBkcml2ZXIgbW9kdWxlLgorICAgKgorICAgKiAgIGF1dG9oaW50X21vZGUgOjoKKyAgICogICAgIFRoZSB1c2VkIGF1dG8taGludGluZyBtb2RlLgorICAgKgorICAgKiAgIGF1dG9oaW50X21ldHJpY3MgOjoKKyAgICogICAgIE1ldHJpY3MgdXNlZCBieSB0aGUgYXV0by1oaW50ZXIuCisgICAqCisgICAqLwogCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9TaXplX0ludGVybmFsUmVjXwogICB7CkBAIC01MTUsMjEgKzQ3NywyNCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbW9kdWxlIG9iamVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtb2R1bGUncyBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIEZUX01vZHVsZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBtb2R1bGUgb2JqZWN0IGluc3RhbmNlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGNsYXp6IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIG1vZHVsZSdzIGNsYXNzLgorICAgKgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbGlicmFyeSBvYmplY3QuCisgICAqCisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfTW9kdWxlUmVjXwogICB7CiAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xheno7CkBAIC01NzIsMjcgKzUzNywyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfSElOVFNfTElHSFRMWSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kcyBhIG1vZHVsZSBhbmQgcmV0dXJucyBpdHMgc3BlY2lmaWMgaW50ZXJmYWNlIGFzIGEgdHlwZWxlc3MgICAgKi8KLSAgLyogICAgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbmFtZSA6OiBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIGJldHRlciBiZSBmYW1pbGlhciB3aXRoIEZyZWVUeXBlIGludGVybmFscyB0byBrbm93ICAgICAgKi8KLSAgLyogICAgd2hpY2ggbW9kdWxlIHRvIGxvb2sgZm9yLCBhbmQgd2hhdCBpdHMgaW50ZXJmYWNlIGlzIDotKSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBGaW5kcyBhIG1vZHVsZSBhbmQgcmV0dXJucyBpdHMgc3BlY2lmaWMgaW50ZXJmYWNlIGFzIGEgdHlwZWxlc3MKKyAgICogICBwb2ludGVyLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0LgorICAgKgorICAgKiAgIG1vZHVsZV9uYW1lIDo6CisgICAqICAgICBUaGUgbW9kdWxlJ3MgbmFtZSAoYXMgYW4gQVNDSUkgc3RyaW5nKS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgaWYgYXZhaWxhYmxlLCAwIG90aGVyd2lzZS4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgWW91IHNob3VsZCBiZXR0ZXIgYmUgZmFtaWxpYXIgd2l0aCBGcmVlVHlwZSBpbnRlcm5hbHMgdG8ga25vdyB3aGljaAorICAgKiAgIG1vZHVsZSB0byBsb29rIGZvciwgYW5kIHdoYXQgaXRzIGludGVyZmFjZSBpcyA6LSkKKyAgICovCiAgIEZUX0JBU0UoIGNvbnN0IHZvaWQqICkKICAgRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZF9uYW1lICk7CkBAIC02NDMsNDggKzYxMCw1MCBAQAogI2RlZmluZSBGVF9GQUNFX1NJWkUoIHggKSAgICAgRlRfRkFDRSggeCApLT5zaXplCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBnbHlwaCBzbG90IGZvciBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gZmFjZSBvYmplY3QuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgICAgICovCi0gIC8qICAgIHNsb3RzLiAgQWxsIG9mIHRoZW0gYXJlIGF1dG9tYXRpY2FsbHkgZGlzY2FyZGVkIHdoZW4gdGhlIGZhY2UgaXMgICAqLwotICAvKiAgICBkZXN0cm95ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2xvdCA6OiBBIGhhbmRsZSB0byBhIG5ldyBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfTmV3X0dseXBoU2xvdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgSXQgaXMgc29tZXRpbWVzIHVzZWZ1bCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgZ2x5cGggc2xvdCBmb3IgYSBnaXZlbgorICAgKiAgIGZhY2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNsb3RzLiAgQWxsCisgICAqICAgb2YgdGhlbSBhcmUgYXV0b21hdGljYWxseSBkaXNjYXJkZWQgd2hlbiB0aGUgZmFjZSBpcyBkZXN0cm95ZWQuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byBhIHBhcmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhc2xvdCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSBuZXcgZ2x5cGggc2xvdCBvYmplY3QuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0JBU0UoIEZUX0Vycm9yICkKICAgRlRfTmV3X0dseXBoU2xvdCggRlRfRmFjZSAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAqYXNsb3QgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gIFJlbWVtYmVyIGhvd2V2ZXIgdGhhdCBhbGwgc2xvdHMgYXJlICAqLwotICAvKiAgICBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCB3aXRoIGl0cyBwYXJlbnQuICBVc2luZyB0aGlzIGZ1bmN0aW9uIGlzICAgKi8KLSAgLyogICAgbm90IGFsd2F5cyBtYW5kYXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2xvdCA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0RvbmVfR2x5cGhTbG90CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEZXN0cm95cyBhIGdpdmVuIGdseXBoIHNsb3QuICBSZW1lbWJlciBob3dldmVyIHRoYXQgYWxsIHNsb3RzIGFyZQorICAgKiAgIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkIHdpdGggaXRzIHBhcmVudC4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gaXMgbm90CisgICAqICAgYWx3YXlzIG1hbmRhdG9yeS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIHNsb3QgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGdseXBoIHNsb3QuCisgICAqLwogICBGVF9CQVNFKCB2b2lkICkKICAgRlRfRG9uZV9HbHlwaFNsb3QoIEZUX0dseXBoU2xvdCAgc2xvdCApOwogCi0gLyogKi8KKyAgLyogKi8KIAogI2RlZmluZSBGVF9SRVFVRVNUX1dJRFRIKCByZXEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggKHJlcSktPmhvcmlSZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNzMwLDggKzY5OSw5IEBACiAgIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7CiAKIAotICAvKiBQcmVzZXQgYml0bWFwIG1ldHJpY3Mgb2YgYW4gb3V0bGluZSBnbHlwaHNsb3QgcHJpb3IgdG8gcmVuZGVyaW5nLiAqLwotICBGVF9CQVNFKCB2b2lkICkKKyAgLyogUHJlc2V0IGJpdG1hcCBtZXRyaWNzIG9mIGFuIG91dGxpbmUgZ2x5cGhzbG90IHByaW9yIHRvIHJlbmRlcmluZyAqLworICAvKiBhbmQgY2hlY2sgd2hldGhlciB0aGUgdHJ1bmNhdGVkIGJib3ggaXMgdG9vIGxhcmdlIGZvciByZW5kZXJpbmcuICovCisgIEZUX0JBU0UoIEZUX0Jvb2wgKQogICBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCggRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKTsKQEAgLTgwMiwyOCArNzcyLDMwIEBACiAjZGVmaW5lIEZUX0RSSVZFUl9DTEFTUyggeCApICBGVF9EUklWRVIoIHggKS0+Y2xhenoKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByb290IGZvbnQgZHJpdmVyIGNsYXNzLiAgQSBmb250IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgICAgICAqLwotICAvKiAgICBtYW5hZ2luZyBhbmQgbG9hZGluZyBmb250IGZpbGVzIG9mIGEgZ2l2ZW4gZm9ybWF0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcm9vdCAgICAgICAgIDo6IENvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHJvb3QgbW9kdWxlIGNsYXNzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjbGF6eiAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBmb250IGRyaXZlcidzIGNsYXNzLiAgTm90ZSB0aGF0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgTk9UIHJvb3QuY2xhenouICBgY2xhc3MnIHdhc24ndCB1c2VkICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBhcyBpdCBpcyBhIHJlc2VydmVkIHdvcmQgaW4gQysrLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZmFjZXNfbGlzdCAgIDo6IFRoZSBsaXN0IG9mIGZhY2VzIGN1cnJlbnRseSBvcGVuZWQgYnkgdGhpcyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZ2x5cGhfbG9hZGVyIDo6IFVudXNlZC4gIFVzZWQgdG8gYmUgZ2x5cGggbG9hZGVyIGZvciBhbGwgZmFjZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkIGJ5IHRoaXMgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBGVF9Ecml2ZXJSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSByb290IGZvbnQgZHJpdmVyIGNsYXNzLiAgQSBmb250IGRyaXZlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcKKyAgICogICBhbmQgbG9hZGluZyBmb250IGZpbGVzIG9mIGEgZ2l2ZW4gZm9ybWF0LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHJvb3QgOjoKKyAgICogICAgIENvbnRhaW5zIHRoZSBmaWVsZHMgb2YgdGhlIHJvb3QgbW9kdWxlIGNsYXNzLgorICAgKgorICAgKiAgIGNsYXp6IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGZvbnQgZHJpdmVyJ3MgY2xhc3MuICBOb3RlIHRoYXQgdGhpcyBpcyBOT1QKKyAgICogICAgIHJvb3QuY2xhenouICAnY2xhc3MnIHdhc24ndCB1c2VkIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBDKysuCisgICAqCisgICAqICAgZmFjZXNfbGlzdCA6OgorICAgKiAgICAgVGhlIGxpc3Qgb2YgZmFjZXMgY3VycmVudGx5IG9wZW5lZCBieSB0aGlzIGRyaXZlci4KKyAgICoKKyAgICogICBnbHlwaF9sb2FkZXIgOjoKKyAgICogICAgIFVudXNlZC4gIFVzZWQgdG8gYmUgZ2x5cGggbG9hZGVyIGZvciBhbGwgZmFjZXMgbWFuYWdlZCBieSB0aGlzCisgICAqICAgICBkcml2ZXIuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyUmVjXwogICB7CiAgICAgRlRfTW9kdWxlUmVjICAgICByb290OwpAQCAtODQ3LDcyICs4MTksNzcgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKiBUaGlzIGhvb2sgaXMgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgZGVidWdnZXIuICBJdCBtdXN0IGJlIHNldCB0byBhbiAqLwotICAvKiBhbHRlcm5hdGUgdHJ1ZXR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ERUJVR19IT09LX1RSVUVUWVBFICAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgRnJlZVR5cGUgbGlicmFyeSBjbGFzcy4gIFRoaXMgaXMgdGhlIHJvb3Qgb2YgYWxsIEZyZWVUeXBlICAgICAgKi8KLSAgLyogICAgZGF0YS4gIFVzZSBGVF9OZXdfTGlicmFyeSgpIHRvIGNyZWF0ZSBhIGxpYnJhcnkgb2JqZWN0LCBhbmQgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfTGlicmFyeSgpIHRvIGRpc2NhcmQgaXQgYW5kIGFsbCBjaGlsZCBvYmplY3RzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICAgICAgOjogVGhlIGxpYnJhcnkncyBtZW1vcnkgb2JqZWN0LiAgTWFuYWdlcyBtZW1vcnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb25fbWFqb3IgICAgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbl9taW5vciAgICA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uX3BhdGNoICAgIDo6IFRoZSBjdXJyZW50IHBhdGNoIGxldmVsIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9tb2R1bGVzICAgICAgOjogVGhlIG51bWJlciBvZiBtb2R1bGVzIGN1cnJlbnRseSByZWdpc3RlcmVkICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGlzIGxpYnJhcnkuICBUaGlzIGlzIHNldCB0byAwIGZvciBuZXcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMuICBOZXcgbW9kdWxlcyBhcmUgYWRkZWQgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgRlRfQWRkX01vZHVsZSgpIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlcyAgICAgICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgaGFuZGxlcyB0byB0aGUgY3VycmVudGx5ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCBtb2R1bGVzLiBOb3RlIHRoYXQgZWFjaCBmb250IGRyaXZlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGEgbGlzdCBvZiBpdHMgb3BlbmVkIGZhY2VzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlbmRlcmVycyAgICAgICAgOjogVGhlIGxpc3Qgb2YgcmVuZGVyZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cl9yZW5kZXJlciAgICAgOjogVGhlIGN1cnJlbnQgb3V0bGluZSByZW5kZXJlci4gIFRoaXMgaXMgYSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0Y3V0IHVzZWQgdG8gYXZvaWQgcGFyc2luZyB0aGUgbGlzdCBvbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBlYWNoIGNhbGwgdG8gRlRfT3V0bGluZV9SZW5kZXIoKS4gIEl0IGlzIGEgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIHRvIHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIGZvcm1hdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF1dG9faGludGVyICAgICAgOjogVGhlIGF1dG8taGludGVyIG1vZHVsZSBpbnRlcmZhY2UuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVidWdfaG9va3MgICAgICA6OiBBbiBhcnJheSBvZiBmb3VyIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWxsb3cgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXJzIHRvIGhvb2sgaW50byBhIGZvbnQgZm9ybWF0J3MgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVyLiAgQ3VycmVudGx5LCBvbmx5IHRoZSBUcnVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBieXRlY29kZSBkZWJ1Z2dlciB1c2VzIHRoaXMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsY2Rfd2VpZ2h0cyAgICAgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIgd2VpZ2h0cywgaWYgYW55LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsY2RfZmlsdGVyX2Z1bmMgIDo6IElmIHN1YnBpeGVsIHJlbmRlcmluZyBpcyBhY3RpdmF0ZWQsIHRoZSBMQ0QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJpbmcgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaWNfY29udGFpbmVyICAgIDo6IENvbnRhaW5zIGdsb2JhbCBzdHJ1Y3RzIGFuZCB0YWJsZXMsIGluc3RlYWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBvZiBkZWZpbmluZyB0aGVtIGdsb2JhbGx5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWZjb3VudCAgICAgICAgIDo6IEEgY291bnRlciBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBARlRfTGlicmFyeSBzdHJ1Y3R1cmUgaXMgY3JlYXRlZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1JlZmVyZW5jZV9MaWJyYXJ5IGluY3JlbWVudHMgdGhpcyBjb3VudGVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBARlRfRG9uZV9MaWJyYXJ5IG9ubHkgZGVzdHJveXMgYSBsaWJyYXJ5ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgY291bnRlciBpc34xLCBvdGhlcndpc2UgaXQgc2ltcGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVtZW50cyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgRlRfTGlicmFyeVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIEZyZWVUeXBlIGxpYnJhcnkgY2xhc3MuICBUaGlzIGlzIHRoZSByb290IG9mIGFsbCBGcmVlVHlwZSBkYXRhLgorICAgKiAgIFVzZSBGVF9OZXdfTGlicmFyeSgpIHRvIGNyZWF0ZSBhIGxpYnJhcnkgb2JqZWN0LCBhbmQgRlRfRG9uZV9MaWJyYXJ5KCkKKyAgICogICB0byBkaXNjYXJkIGl0IGFuZCBhbGwgY2hpbGQgb2JqZWN0cy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIFRoZSBsaWJyYXJ5J3MgbWVtb3J5IG9iamVjdC4gIE1hbmFnZXMgbWVtb3J5IGFsbG9jYXRpb24uCisgICAqCisgICAqICAgdmVyc2lvbl9tYWpvciA6OgorICAgKiAgICAgVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBsaWJyYXJ5LgorICAgKgorICAgKiAgIHZlcnNpb25fbWlub3IgOjoKKyAgICogICAgIFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4KKyAgICoKKyAgICogICB2ZXJzaW9uX3BhdGNoIDo6CisgICAqICAgICBUaGUgY3VycmVudCBwYXRjaCBsZXZlbCBvZiB0aGUgbGlicmFyeS4KKyAgICoKKyAgICogICBudW1fbW9kdWxlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBtb2R1bGVzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGhpbiB0aGlzIGxpYnJhcnkuCisgICAqICAgICBUaGlzIGlzIHNldCB0byAwIGZvciBuZXcgbGlicmFyaWVzLiAgTmV3IG1vZHVsZXMgYXJlIGFkZGVkIHRocm91Z2gKKyAgICogICAgIHRoZSBGVF9BZGRfTW9kdWxlKCkgQVBJIGZ1bmN0aW9uLgorICAgKgorICAgKiAgIG1vZHVsZXMgOjoKKyAgICogICAgIEEgdGFibGUgdXNlZCB0byBzdG9yZSBoYW5kbGVzIHRvIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAorICAgKiAgICAgbW9kdWxlcy4gTm90ZSB0aGF0IGVhY2ggZm9udCBkcml2ZXIgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBvcGVuZWQKKyAgICogICAgIGZhY2VzLgorICAgKgorICAgKiAgIHJlbmRlcmVycyA6OgorICAgKiAgICAgVGhlIGxpc3Qgb2YgcmVuZGVyZXJzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGhpbiB0aGUgbGlicmFyeS4KKyAgICoKKyAgICogICBjdXJfcmVuZGVyZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IG91dGxpbmUgcmVuZGVyZXIuICBUaGlzIGlzIGEgc2hvcnRjdXQgdXNlZCB0byBhdm9pZAorICAgKiAgICAgcGFyc2luZyB0aGUgbGlzdCBvbiBlYWNoIGNhbGwgdG8gRlRfT3V0bGluZV9SZW5kZXIoKS4gIEl0IGlzIGEKKyAgICogICAgIGhhbmRsZSB0byB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhlIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FCisgICAqICAgICBmb3JtYXQuCisgICAqCisgICAqICAgYXV0b19oaW50ZXIgOjoKKyAgICogICAgIFRoZSBhdXRvLWhpbnRlciBtb2R1bGUgaW50ZXJmYWNlLgorICAgKgorICAgKiAgIGRlYnVnX2hvb2tzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBmb3VyIGZ1bmN0aW9uIHBvaW50ZXJzIHRoYXQgYWxsb3cgZGVidWdnZXJzIHRvIGhvb2sgaW50bworICAgKiAgICAgYSBmb250IGZvcm1hdCdzIGludGVycHJldGVyLiAgQ3VycmVudGx5LCBvbmx5IHRoZSBUcnVlVHlwZSBieXRlY29kZQorICAgKiAgICAgZGVidWdnZXIgdXNlcyB0aGlzLgorICAgKgorICAgKiAgIGxjZF93ZWlnaHRzIDo6CisgICAqICAgICBUaGUgTENEIGZpbHRlciB3ZWlnaHRzIGZvciBDbGVhclR5cGUtc3R5bGUgc3VicGl4ZWwgcmVuZGVyaW5nLgorICAgKgorICAgKiAgIGxjZF9maWx0ZXJfZnVuYyA6OgorICAgKiAgICAgVGhlIExDRCBmaWx0ZXJpbmcgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGZvciBDbGVhclR5cGUtc3R5bGUgc3VicGl4ZWwKKyAgICogICAgIHJlbmRlcmluZy4KKyAgICoKKyAgICogICBsY2RfZ2VvbWV0cnkgOjoKKyAgICogICAgIFRoaXMgYXJyYXkgc3BlY2lmaWVzIExDRCBzdWJwaXhlbCBnZW9tZXRyeSBhbmQgY29udHJvbHMgSGFybW9ueSBMQ0QKKyAgICogICAgIHJlbmRlcmluZyB0ZWNobmlxdWUsIGFsdGVybmF0aXZlIHRvIENsZWFyVHlwZS4KKyAgICoKKyAgICogICBwaWNfY29udGFpbmVyIDo6CisgICAqICAgICBDb250YWlucyBnbG9iYWwgc3RydWN0cyBhbmQgdGFibGVzLCBpbnN0ZWFkIG9mIGRlZmluaW5nIHRoZW0KKyAgICogICAgIGdsb2JhbGx5LgorICAgKgorICAgKiAgIHJlZmNvdW50IDo6CisgICAqICAgICBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfTGlicmFyeSBzdHJ1Y3R1cmUgaXMKKyAgICogICAgIGNyZWF0ZWQuICBARlRfUmVmZXJlbmNlX0xpYnJhcnkgaW5jcmVtZW50cyB0aGlzIGNvdW50ZXIsIGFuZAorICAgKiAgICAgQEZUX0RvbmVfTGlicmFyeSBvbmx5IGRlc3Ryb3lzIGEgbGlicmFyeSBpZiB0aGUgY291bnRlciBpc34xLAorICAgKiAgICAgb3RoZXJ3aXNlIGl0IHNpbXBseSBkZWNyZW1lbnRzIGl0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0xpYnJhcnlSZWNfCiAgIHsKICAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OyAgICAgICAgICAgLyogbGlicmFyeSdzIG1lbW9yeSBtYW5hZ2VyICovCkBAIC05MzMsMTAgKzkxMCw4IEBACiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKICAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICAgICAgbGNkX3dlaWdodHM7ICAgICAgLyogZmlsdGVyIHdlaWdodHMsIGlmIGFueSAqLwogICAgIEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jICBsY2RfZmlsdGVyX2Z1bmM7ICAvKiBmaWx0ZXJpbmcgY2FsbGJhY2sgICAgICovCi0jZW5kaWYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgRlRfUElDX0NvbnRhaW5lciAgIHBpY19jb250YWluZXI7CisjZWxzZQorICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgICBsY2RfZ2VvbWV0cnlbM107ICAvKiBSR0Igc3VicGl4ZWwgcG9zaXRpb25zICovCiAjZW5kaWYKIAogICAgIEZUX0ludCAgICAgICAgICAgICByZWZjb3VudDsKQEAgLTk2NCwzOCArOTM5LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwogCiAgIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0ZhY2VfR2V0R2x5cGhOYW1lSW5kZXhGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKKyAgKCpGVF9GYWNlX0dldEdseXBoTmFtZUluZGV4RnVuYykoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICk7CiAKIAogI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlcyBhIG5ldyBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIHRoZSBuZXcgbWVtb3J5IG9iamVjdC4gIDAgaW4gY2FzZSBvZiBlcnJvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19NZW1vcnkKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZXMgYSBuZXcgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBBIHBvaW50ZXIgdG8gdGhlIG5ldyBtZW1vcnkgb2JqZWN0LiAgMCBpbiBjYXNlIG9mIGVycm9yLgorICAgKi8KICAgRlRfQkFTRSggRlRfTWVtb3J5ICkKICAgRlRfTmV3X01lbW9yeSggdm9pZCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZHMgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0aW9uOgorICAgKiAgIEZUX0RvbmVfTWVtb3J5CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBEaXNjYXJkcyBtZW1vcnkgbWFuYWdlci4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLgorICAgKi8KICAgRlRfQkFTRSggdm9pZCApCiAgIEZUX0RvbmVfTWVtb3J5KCBGVF9NZW1vcnkgIG1lbW9yeSApOwogCkBAIC0xMDEzLDM3ICs5ODksMTYgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICBQIEkgQyAgIFMgVSBQIFAgTyBSIFQgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogUElDIHN1cHBvcnQgbWFjcm9zIGZvciBmdGltYWdlLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIHN0cnVjdC4gICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW5jdGlvbiB3aWxsIG5lZWQgICAgKi8KLSAgLyogICAgdG8gYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIHN0cnVjdC4gIFRoZSBzdHJ1Y3QKKyAgICogICB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvIGlzCisgICAqICAgdXNlZCkuCisgICAqLwogI2RlZmluZSBGVF9ERUZJTkVfT1VUTElORV9GVU5DUyggICAgICAgICAgIFwKICAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTA2Miw0NyArMTAxNywxNyBAQAogICAgIGRlbHRhXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAotI2RlZmluZSBGVF9ERUZJTkVfT1VUTElORV9GVU5DUyggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtb3ZlX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxpbmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjdWJpY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNoaWZ0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZGVsdGFfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBJbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX091dGxpbmVfRnVuY3MqICBjbGF6eiApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW92ZV90byAgPSBtb3ZlX3RvXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5saW5lX3RvICA9IGxpbmVfdG9fOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmNvbmljX3RvID0gY29uaWNfdG9fOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y3ViaWNfdG8gPSBjdWJpY190b187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zaGlmdCAgICA9IHNoaWZ0XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRlbHRhICAgID0gZGVsdGFfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfUmFzdGVyX0Z1bmNzIHN0cnVjdC4gICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGFuIGluaXQgZnVuY3Rpb24gd2lsbCBuZWVkICAgICovCi0gIC8qICAgIHRvIGJlIGNhbGxlZCB3aXRoIGEgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBzdHJ1Y3Qgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gICAgICAgICovCi0gIC8qICAgIGlzIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0RFRklORV9SQVNURVJfRlVOQ1MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0LiAgVGhlIHN0cnVjdAorICAgKiAgIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gaXMKKyAgICogICB1c2VkKS4KKyAgICovCiAjZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoICAgIFwKICAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICBcCkBAIC0xMTIxLDQ3ICsxMDQ2LDE5IEBACiAgICAgcmFzdGVyX2RvbmVfICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1Jhc3Rlcl9GdW5jcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdseXBoX2Zvcm1hdCAgICA9IGdseXBoX2Zvcm1hdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfbmV3ICAgICAgPSByYXN0ZXJfbmV3XzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX3Jlc2V0ICAgID0gcmFzdGVyX3Jlc2V0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9zZXRfbW9kZSA9IHJhc3Rlcl9zZXRfbW9kZV87ICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfcmVuZGVyICAgPSByYXN0ZXJfcmVuZGVyXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX2RvbmUgICAgID0gcmFzdGVyX2RvbmVfOyAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKIAotICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0cmVuZGVyLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9HTFlQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9HbHlwaF9DbGFzcyBzdHJ1Y3QuICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW5jdGlvbiB3aWxsIG5lZWQgICAgKi8KLSAgLyogICAgdG8gYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0RFRklORV9HTFlQSAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIHN0cnVjdCB3aWxsIGJlIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUKKyAgICogICB0aGUgbWFjcm8gaXMgdXNlZCkuCisgICAqLworI2RlZmluZSBGVF9ERUNMQVJFX0dMWVBIKCBjbGFzc18gKSAgICAgICAgICAgICAgICBcCisgIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0dseXBoX0NsYXNzICBjbGFzc187CiAKICNkZWZpbmUgRlRfREVGSU5FX0dMWVBIKCAgICAgICAgICBcCiAgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgXApAQCAtMTE4Niw3MyArMTA4MywyNSBAQAogICAgIHByZXBhcmVfICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAotI2RlZmluZSBGVF9ERUZJTkVfR0xZUEgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvcHlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHByZXBhcmVfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0dseXBoX0NsYXNzKiAgY2xhenogKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9mb3JtYXQgICAgPSBmb3JtYXRfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9jb3B5ICAgICAgPSBjb3B5XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1fOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9iYm94ICAgICAgPSBiYm94XzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9wcmVwYXJlICAgPSBwcmVwYXJlXzsgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVDTEFSRV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBjcmVhdGUgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gd2lsbCAgICAgICovCi0gIC8qICAgIG5lZWQgdG8gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHdoZXJlIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzICAqLwotICAvKiAgICByZXR1cm5lZC4gIEFuZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgYSBgZGVzdHJveScgZnVuY3Rpb24gICAgKi8KLSAgLyogICAgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBmdGluaXQuYycgKGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKSBhbHJlYWR5IGNvbnRhaW5zICAgICAqLwotICAvKiAgICBhIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgKi8KLSAgLyogICAgZGVzY3JpYmVkIGluIGBmdG1vZHVsZS5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RpY2UgdGhhdCB0aGUgY3JlYXRlZCBgY3JlYXRlJyBhbmQgYGRlc3Ryb3knIGZ1bmN0aW9ucyBjYWxsICAgICAgKi8KLSAgLyogICAgYHBpY19pbml0JyBhbmQgYHBpY19mcmVlJyB0byBhbGxvdyB5b3UgdG8gbWFudWFsbHkgYWxsb2NhdGUgYW5kICAgICovCi0gIC8qICAgIGluaXRpYWxpemUgYW55IGFkZGl0aW9uYWwgZ2xvYmFsIGRhdGEsIGxpa2UgYSBtb2R1bGUgc3BlY2lmaWMgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UsIGFuZCBwdXQgdGhlbSBpbiB0aGUgZ2xvYmFsIHBpYyBjb250YWluZXIgZGVmaW5lZCBpbiAgICAgKi8KLSAgLyogICAgYGZ0cGljLmgnLiAgSWYgeW91IGRvbid0IG5lZWQgdGhlbSBqdXN0IGltcGxlbWVudCB0aGUgZnVuY3Rpb25zIGFzICovCi0gIC8qICAgIGVtcHR5IHRvIHJlc29sdmUgdGhlIGxpbmsgZXJyb3IuICBBbHNvIHRoZSBgcGljX2luaXQnIGFuZCAgICAgICAgICAqLwotICAvKiAgICBgcGljX2ZyZWUnIGZ1bmN0aW9ucyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gYHBpYy5oJywgdG8gYmUgcmVmZXJyZWQgKi8KLSAgLyogICAgYnkgdGhlIHJlbmRlcmVyIGRlZmluaXRpb24gY2FsbGluZyBgRlRfREVGSU5FX1JFTkRFUkVSJyBpbiB0aGUgICAgICovCi0gIC8qICAgIGZvbGxvd2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgc3RydWN0IHdpbGwgYmUgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvICAgICAgICAqLwotICAvKiAgICBpcyB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBtYWNybzoKKyAgICogICBGVF9ERUNMQVJFX1JFTkRFUkVSCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBVc2VkIHRvIGNyZWF0ZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QKKyAgICogICBpbnN0YW5jZS4KKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0RFRklORV9SRU5ERVJFUgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIEZUX1JlbmRlcmVyX0NsYXNzIHN0cnVjdC4KKyAgICoKKyAgICogICBUaGUgc3RydWN0IHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZQorICAgKiAgIHRoZSBtYWNybyBpcyB1c2VkKS4KKyAgICovCiAjZGVmaW5lIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGNsYXNzXyApICAgICAgICAgICAgICAgXAogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyApIGNsYXNzXzsKIApAQCAtMTI5NSwxNzYgKzExNDQsMzMgQEAKICAgICByYXN0ZXJfY2xhc3NfICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAotI2RlZmluZSBGVF9ERUNMQVJFX1JFTkRFUkVSKCBjbGFzc18gKSAgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApCi0KLSNkZWZpbmUgRlRfREVGSU5FX1JFTkRFUkVSKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZW5kZXJfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2dseXBoX2Nib3hfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzZXRfbW9kZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9jbGFzc18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICkgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9SZW5kZXJlcl9DbGFzcyogIHJjbGF6eiA9IChGVF9SZW5kZXJlcl9DbGFzcyopY2xheno7ICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCByY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIHJjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfUmVuZGVyZXJfQ2xhc3MqICBjbGF6eiA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gY2xhc3NfICMjIF9waWNfaW5pdCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZm9ybWF0ICAgID0gZ2x5cGhfZm9ybWF0XzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJlbmRlcl9nbHlwaCAgICA9IHJlbmRlcl9nbHlwaF87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dHJhbnNmb3JtX2dseXBoID0gdHJhbnNmb3JtX2dseXBoXzsgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2x5cGhfY2JveCAgPSBnZXRfZ2x5cGhfY2JveF87ICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNldF9tb2RlICAgICAgICA9IHNldF9tb2RlXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfY2xhc3MgICAgPSByYXN0ZXJfY2xhc3NfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gKEZUX01vZHVsZV9DbGFzcyopY2xheno7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qIFBJQyBzdXBwb3J0IG1hY3JvcyBmb3IgZnRtb2RhcGkuaCAqKi8KLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ3JlYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIChhbGxvY2F0ZSkgYSBuZXcgbW9kdWxlIGNsYXNzIG9iamVjdC4gICAgKi8KLSAgLyogICAgVGhlIG9iamVjdCdzIG1lbWJlcnMgYXJlIGluaXRpYWxpemVkLCBidXQgdGhlIG1vZHVsZSBpdHNlbGYgaXMgICAgICovCi0gIC8qICAgIG5vdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRwdXRfY2xhc3MgOjogSW5pdGlhbGl6ZWQgd2l0aCB0aGUgbmV3bHkgYWxsb2NhdGVkIGNsYXNzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9Nb2R1bGVfQ3JlYXRvcikoIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0Rlc3Ryb3llciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGRlc3Ryb3kgKGRlYWxsb2NhdGUpIGEgbW9kdWxlIGNsYXNzIG9iamVjdC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsYXp6ICA6OiBNb2R1bGUgY2xhc3MgdG8gZGVzdHJveS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfTW9kdWxlX0Rlc3Ryb3llcikoIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKLQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUNMQVJFX01PRFVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGNyZWF0ZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0NsYXNzIHN0cnVjdCBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX01PRFVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIGFuIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYSBgY3JlYXRlJyBmdW5jdGlvbiBuZWVkcyAgICAgKi8KLSAgLyogICAgdG8gYmUgY2FsbGVkIHdpdGggYSBwb2ludGVyIHdoZXJlIHRoZSBhbGxvY2F0ZWQgc3RydWN0dXJlIGlzICAgICAgICovCi0gIC8qICAgIHJldHVybmVkLiAgQW5kIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhIGBkZXN0cm95JyBmdW5jdGlvbiAgICAqLwotICAvKiAgICBuZWVkcyB0byBiZSBjYWxsZWQgdG8gcmVsZWFzZSB0aGF0IGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYGZ0aW5pdC5jJyAoZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMpIGFscmVhZHkgY29udGFpbnMgICAgICovCi0gIC8qICAgIGEgbWVjaGFuaXNtIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIGZvciB0aGUgZGVmYXVsdCBtb2R1bGVzICAgICAgICAqLwotICAvKiAgICBkZXNjcmliZWQgaW4gYGZ0bW9kdWxlLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGljZSB0aGF0IHRoZSBjcmVhdGVkIGBjcmVhdGUnIGFuZCBgZGVzdHJveScgZnVuY3Rpb25zIGNhbGwgICAgICAqLwotICAvKiAgICBgcGljX2luaXQnIGFuZCBgcGljX2ZyZWUnIHRvIGFsbG93IHlvdSB0byBtYW51YWxseSBhbGxvY2F0ZSBhbmQgICAgKi8KLSAgLyogICAgaW5pdGlhbGl6ZSBhbnkgYWRkaXRpb25hbCBnbG9iYWwgZGF0YSwgbGlrZSBhIG1vZHVsZSBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGludGVyZmFjZSwgYW5kIHB1dCB0aGVtIGluIHRoZSBnbG9iYWwgcGljIGNvbnRhaW5lciBkZWZpbmVkIGluICAgICAqLwotICAvKiAgICBgZnRwaWMuaCcuICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGVtIGp1c3QgaW1wbGVtZW50IHRoZSBmdW5jdGlvbnMgYXMgKi8KLSAgLyogICAgZW1wdHkgdG8gcmVzb2x2ZSB0aGUgbGluayBlcnJvci4gIEFsc28gdGhlIGBwaWNfaW5pdCcgYW5kICAgICAgICAgICovCi0gIC8qICAgIGBwaWNfZnJlZScgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBgcGljLmgnLCB0byBiZSByZWZlcnJlZCAqLwotICAvKiAgICBieSB0aGUgbW9kdWxlIGRlZmluaXRpb24gY2FsbGluZyBgRlRfREVGSU5FX01PRFVMRScgaW4gdGhlICAgICAgICAgKi8KLSAgLyogICAgZm9sbG93aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBzdHJ1Y3Qgd2lsbCBiZSAgICAgICAgKi8KLSAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gICAgICAgICovCi0gIC8qICAgIGlzIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9ST09UX01PRFVMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhbiBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0IGluc2lkZSAqLwotICAvKiAgICBhbm90aGVyIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGl0IG9yIGluIGEgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyAgKi8KLSAgLyogICAgdGhhdCBjb250YWluaW5nIHN0cnVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfREVDTEFSRV9NT0RVTEUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QKKyAgICogICBpbnN0YW5jZS4KKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0RFRklORV9NT0RVTEUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBhbiBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0LgorICAgKgorICAgKiAgIFRoZSBzdHJ1Y3Qgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlCisgICAqICAgdGhlIG1hY3JvIGlzIHVzZWQpLgorICAgKgorICAgKiBAbWFjcm86CisgICAqICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgYW4gRlRfTW9kdWxlX0NsYXNzIHN0cnVjdCBpbnNpZGUKKyAgICogICBhbm90aGVyIHN0cnVjdCB0aGF0IGNvbnRhaW5zIGl0IG9yIGluIGEgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyB0aGF0CisgICAqICAgY29udGFpbmluZyBzdHJ1Y3QuCisgICAqLwogI2RlZmluZSBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkgIFwKICAgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICAgICAgICAgICAgICBcCiAgIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgY2xhc3NfOwpAQCAtMTUyMywxMDAgKzEyMjksNiBAQAogICB9OwogCiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKTsgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0jZGVmaW5lIEZUX0RFRklORV9ST09UX01PRFVMRSggICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9mbGFncyAgICAgPSBmbGFnc187ICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfc2l6ZSAgICAgID0gc2l6ZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX25hbWUgICAgICA9IG5hbWVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV92ZXJzaW9uICAgPSB2ZXJzaW9uXzsgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfcmVxdWlyZXMgID0gcmVxdWlyZXNfOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9pbnRlcmZhY2UgPSBpbnRlcmZhY2VfOyAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2luaXQgICAgICA9IGluaXRfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9kb25lICAgICAgPSBkb25lXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5nZXRfaW50ZXJmYWNlICAgID0gZ2V0X2ludGVyZmFjZV87Ci0KLSNkZWZpbmUgRlRfREVGSU5FX01PRFVMRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICkgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGFzc18gIyMgX3BpY19mcmVlKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKSApICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBjbGFzc18gIyMgX3BpY19pbml0KCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX2ZsYWdzICAgICA9IGZsYWdzXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfc2l6ZSAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9uYW1lICAgICAgPSBuYW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX3ZlcnNpb24gICA9IHZlcnNpb25fOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfcmVxdWlyZXMgID0gcmVxdWlyZXNfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX2ludGVyZmFjZSA9IGludGVyZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9pbml0ICAgICAgPSBpbml0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX2RvbmUgICAgICA9IGRvbmVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfaW50ZXJmYWNlICAgID0gZ2V0X2ludGVyZmFjZV87ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCiBGVF9FTkRfSEVBREVSCiAKICNlbmRpZiAvKiBGVE9CSlNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNGYwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgKGRlY2xhcmF0aW9uKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE1vZHVsZXMgdGhhdCBvcmRpbmFyaWx5IGhhdmUgY29uc3QgZ2xvYmFsIGRhdGEgdGhhdCBuZWVkIGFkZHJlc3MgICAgICovCi0gIC8qICBjYW4gaW5zdGVhZCBkZWZpbmUgcG9pbnRlcnMgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBGVFBJQ19IXwotI2RlZmluZSBGVFBJQ19IXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfUElDX0NvbnRhaW5lcl8KLSAgewotICAgIC8qIHBpYyBjb250YWluZXJzIGZvciBiYXNlICovCi0gICAgdm9pZCogIGJhc2U7Ci0KLSAgICAvKiBwaWMgY29udGFpbmVycyBmb3IgbW9kdWxlcyAqLwotICAgIHZvaWQqICBhdXRvZml0OwotICAgIHZvaWQqICBjZmY7Ci0gICAgdm9pZCogIHBzaGludGVyOwotICAgIHZvaWQqICBwc25hbWVzOwotICAgIHZvaWQqICByYXN0ZXI7Ci0gICAgdm9pZCogIHNmbnQ7Ci0gICAgdm9pZCogIHNtb290aDsKLSAgICB2b2lkKiAgdHJ1ZXR5cGU7Ci0KLSAgfSBGVF9QSUNfQ29udGFpbmVyOwotCi0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyBmdW5jdGlvbiB0YWJsZXMsIHN0cnVjdHMsIGV0Yy4gKi8KLSAgLyogc3RvcmVkIGluIHRoZSBjb250YWluZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBmdF9waWNfY29udGFpbmVyX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0gIC8qIERlc3Ryb3kgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIuICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oCmluZGV4IGFiYmI2MjguLjgxZWMyOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwc3Byb3AuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cHNwcm9wLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cHNwcm9wLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHZXQgYW5kIHNldCBwcm9wZXJ0aWVzIG9mIFBvc3RTY3JpcHQgZHJpdmVycyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0cHNwcm9wLmgKKyAqCisgKiAgIEdldCBhbmQgc2V0IHByb3BlcnRpZXMgb2YgUG9zdFNjcmlwdCBkcml2ZXJzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRQU1BST1BfSF8KICNkZWZpbmUgRlRQU1BST1BfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaAppbmRleCAxYWNhNDhhLi4xYjdiMjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaApAQCAtMSwzMiArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZm9yay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEVtYmVkZGVkIHJlc291cmNlIGZvcmtzIGFjY2Vzc29yIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRyZm9yay5oCisgKgorICogICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIE1hc2F0YWtlIFlBTUFUTyBhbmQgUmVkaGF0IEsuSy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIERldmVsb3BtZW50IG9mIHRoZSBjb2RlIGluIHRoaXMgZmlsZSBpcyBzdXBwb3J0IG9mICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbmZvcm1hdGlvbi10ZWNobm9sb2d5IFByb21vdGlvbiBBZ2VuY3ksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZgorICogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4KKyAqLwogCiAKICNpZm5kZWYgRlRSRk9SS19IXwogI2RlZmluZSBGVFJGT1JLX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTcyLDg1ICs3MSw2NSBAQAogICB9IEZUX1JGb3JrX1J1bGU7CiAKICAgLyogRm9yIGZhc3QgdHJhbnNsYXRpb24gYmV0d2VlbiBydWxlIGluZGV4IGFuZCBydWxlIHR5cGUsCi0gICAqIHRoZSBtYWNyb3MgRlRfUkZPUktfeHh4IHNob3VsZCBiZSBrZXB0IGNvbnNpc3RlbnQgd2l0aAotICAgKiB0aGUgcmFjY2Vzc19ndWVzc19mdW5jcyB0YWJsZQorICAgKiB0aGUgbWFjcm9zIEZUX1JGT1JLX3h4eCBzaG91bGQgYmUga2VwdCBjb25zaXN0ZW50IHdpdGggdGhlCisgICAqIHJhY2Nlc3NfZ3Vlc3NfZnVuY3MgdGFibGUKICAgICovCiAgIHR5cGVkZWYgc3RydWN0IGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjXyB7CiAgICAgZnRfcmFjY2Vzc19ndWVzc19mdW5jICBmdW5jOwogICAgIEZUX1JGb3JrX1J1bGUgICAgICAgICAgdHlwZTsKICAgfSBmdF9yYWNjZXNzX2d1ZXNzX3JlYzsKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogCi0gIC8qIHRoaXMgYXJyYXkgaXMgYSBzdG9yYWdlIGluIG5vbi1QSUMgbW9kZSwgc28gOyBpcyBuZWVkZWQgaW4gRU5EICovCiAjZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAogICAgICAgICAgIHN0YXRpYyBjb25zdCB0eXBlIG5hbWVbXSA9IHsKICNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWSggZnVuY19zdWZmaXgsIHR5cGVfc3VmZml4ICkgIFwKICAgICAgICAgICB7IHJhY2Nlc3NfZ3Vlc3NfICMjIGZ1bmNfc3VmZml4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIEZUX1JGb3JrX1J1bGVfICMjIHR5cGVfc3VmZml4IH0sCisgIC8qIHRoaXMgYXJyYXkgaXMgYSBzdG9yYWdlLCB0aHVzIGEgZmluYWwgYDsnIGlzIG5lZWRlZCAqLwogI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VORCAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiB0aGlzIGFycmF5IGlzIGEgZnVuY3Rpb24gaW4gUElDIG1vZGUsIHNvIG5vIDsgaXMgbmVlZGVkIGluIEVORCAqLwotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0JFR0lOKCBuYW1lLCB0eXBlICkgIFwKLSAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfSW5pdF9UYWJsZV8gIyMgbmFtZSggdHlwZSogIHN0b3JhZ2UgKSAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHR5cGUqICBsb2NhbCA9IHN0b3JhZ2U7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGludCAgaSA9IDA7Ci0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoIGZ1bmNfc3VmZml4LCB0eXBlX3N1ZmZpeCApICBcCi0gICAgICAgICAgbG9jYWxbaV0uZnVuYyA9IHJhY2Nlc3NfZ3Vlc3NfICMjIGZ1bmNfc3VmZml4OyAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9jYWxbaV0udHlwZSA9IEZUX1JGb3JrX1J1bGVfICMjIHR5cGVfc3VmZml4OyAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotI2RlZmluZSBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VORCAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQogI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JhY2Nlc3NfR3Vlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEd1ZXNzIGEgZmlsZSBuYW1lIGFuZCBvZmZzZXQgd2hlcmUgdGhlIGFjdHVhbCByZXNvdXJjZSBmb3JrIGlzICAgICAqLwotICAvKiAgICBzdG9yZWQuICBUaGUgbWFjcm8gRlRfUkFDQ0VTU19OX1JVTEVTIGhvbGRzIHRoZSBudW1iZXIgb2YgICAgICAgICAgKi8KLSAgLyogICAgZ3Vlc3NpbmcgcnVsZXM7ICB0aGUgZ3Vlc3NlZCByZXN1bHQgZm9yIHRoZSBOdGggcnVsZSBpcyAgICAgICAgICAgICovCi0gIC8qICAgIHJlcHJlc2VudGVkIGFzIGEgdHJpcGxldDogYSBuZXcgZmlsZSBuYW1lIChuZXdfbmFtZXNbTl0pLCBhIGZpbGUgICAqLwotICAvKiAgICBvZmZzZXQgKG9mZnNldHNbTl0pLCBhbmQgYW4gZXJyb3IgY29kZSAoZXJyb3JzW05dKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlX25hbWUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgKGJhc2UpIGZpbGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgZm9yayB1c2VkIGZvciBzb21lICAgICAgICAgICovCi0gIC8qICAgICAgZ3Vlc3NpbmcgcnVsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19uYW1lcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIGd1ZXNzZWQgZmlsZSBuYW1lcyBpbiB3aGljaCB0aGUgcmVzb3VyY2UgZm9ya3MgbWF5ICAgKi8KLSAgLyogICAgICBleGlzdC4gIElmIGBuZXdfbmFtZXNbTl0nIGlzIE5VTEwsIHRoZSBndWVzc2VkIGZpbGUgbmFtZSBpcyAgICAgICovCi0gIC8qICAgICAgZXF1YWwgdG8gYGJhc2VfbmFtZScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2YgZ3Vlc3NlZCBmaWxlIG9mZnNldHMuICBgb2Zmc2V0c1tOXScgaG9sZHMgdGhlIGZpbGUgICAqLwotICAvKiAgICAgIG9mZnNldCBvZiB0aGUgcG9zc2libGUgc3RhcnQgb2YgdGhlIHJlc291cmNlIGZvcmsgaW4gZmlsZSAgICAgICAgKi8KLSAgLyogICAgICBgbmV3X25hbWVzW05dJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlcnJvcnMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBGcmVlVHlwZSBlcnJvciBjb2Rlcy4gIGBlcnJvcnNbTl0nIGlzIHRoZSBlcnJvciAgICAgICovCi0gIC8qICAgICAgY29kZSBvZiBOdGggZ3Vlc3NpbmcgcnVsZSBmdW5jdGlvbi4gIElmIGBlcnJvcnNbTl0nIGlzIG5vdCAgICAgICAqLwotICAvKiAgICAgIEZUX0Vycl9PaywgYG5ld19uYW1lc1tOXScgYW5kIGBvZmZzZXRzW05dJyBhcmUgbWVhbmluZ2xlc3MuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfUmFjY2Vzc19HdWVzcworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgR3Vlc3MgYSBmaWxlIG5hbWUgYW5kIG9mZnNldCB3aGVyZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkLgorICAgKiAgIFRoZSBtYWNybyBGVF9SQUNDRVNTX05fUlVMRVMgaG9sZHMgdGhlIG51bWJlciBvZiBndWVzc2luZyBydWxlczsgdGhlCisgICAqICAgZ3Vlc3NlZCByZXN1bHQgZm9yIHRoZSBOdGggcnVsZSBpcyByZXByZXNlbnRlZCBhcyBhIHRyaXBsZXQ6IGEgbmV3CisgICAqICAgZmlsZSBuYW1lIChuZXdfbmFtZXNbTl0pLCBhIGZpbGUgb2Zmc2V0IChvZmZzZXRzW05dKSwgYW5kIGFuIGVycm9yCisgICAqICAgY29kZSAoZXJyb3JzW05dKS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4KKyAgICoKKyAgICogICBiYXNlX25hbWUgOjoKKyAgICogICAgIFRoZSAoYmFzZSkgZmlsZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3JrIHVzZWQgZm9yIHNvbWUgZ3Vlc3NpbmcKKyAgICogICAgIHJ1bGVzLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIG5ld19uYW1lcyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgZ3Vlc3NlZCBmaWxlIG5hbWVzIGluIHdoaWNoIHRoZSByZXNvdXJjZSBmb3JrcyBtYXkKKyAgICogICAgIGV4aXN0LiAgSWYgJ25ld19uYW1lc1tOXScgaXMgYE5VTExgLCB0aGUgZ3Vlc3NlZCBmaWxlIG5hbWUgaXMgZXF1YWwKKyAgICogICAgIHRvIGBiYXNlX25hbWVgLgorICAgKgorICAgKiAgIG9mZnNldHMgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGd1ZXNzZWQgZmlsZSBvZmZzZXRzLiAgJ29mZnNldHNbTl0nIGhvbGRzIHRoZSBmaWxlCisgICAqICAgICBvZmZzZXQgb2YgdGhlIHBvc3NpYmxlIHN0YXJ0IG9mIHRoZSByZXNvdXJjZSBmb3JrIGluIGZpbGUKKyAgICogICAgICduZXdfbmFtZXNbTl0nLgorICAgKgorICAgKiAgIGVycm9ycyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgRnJlZVR5cGUgZXJyb3IgY29kZXMuICAnZXJyb3JzW05dJyBpcyB0aGUgZXJyb3IgY29kZSBvZgorICAgKiAgICAgTnRoIGd1ZXNzaW5nIHJ1bGUgZnVuY3Rpb24uICBJZiAnZXJyb3JzW05dJyBpcyBub3QgRlRfRXJyX09rLAorICAgKiAgICAgJ25ld19uYW1lc1tOXScgYW5kICdvZmZzZXRzW05dJyBhcmUgbWVhbmluZ2xlc3MuCisgICAqLwogICBGVF9CQVNFKCB2b2lkICkKICAgRlRfUmFjY2Vzc19HdWVzcyggRlRfTGlicmFyeSAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLApAQCAtMTYwLDM3ICsxMzksMzcgQEAKICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICAgZXJyb3JzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRlciBvZiByZXNvdXJjZSBmb3JrLiAgVGhlICAgICAgICAgKi8KLSAgLyogICAgaW5mb3JtYXRpb24gaW5jbHVkZXMgdGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0cywgYW5kIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAqLwotICAvKiAgICBgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMnIHJlcXVpcmVzIHRoZXNlIHR3byBkYXRhLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZm9ya19vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGZvcmsgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFwX29mZnNldCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgc3RhcnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmRhdGFfcG9zIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBkYXRhIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBHZXQgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRlciBvZiByZXNvdXJjZSBmb3JrLiAgVGhlIGluZm9ybWF0aW9uCisgICAqICAgaW5jbHVkZXMgdGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBtYXAgc3RhcnRzLCBhbmQgdGhlIGZpbGUKKyAgICogICBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgYEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzYAorICAgKiAgIHJlcXVpcmVzIHRoZXNlIHR3byBkYXRhLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbGlicmFyeSA6OgorICAgKiAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLgorICAgKgorICAgKiAgIHJmb3JrX29mZnNldCA6OgorICAgKiAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBmb3JrIHN0YXJ0cy4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBtYXBfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIG1hcCBzdGFydHMuCisgICAqCisgICAqICAgcmRhdGFfcG9zIDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0JBU0UoIEZUX0Vycm9yICkKICAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyggRlRfTGlicmFyeSAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLApAQCAtMTk5LDU1ICsxNzgsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmRhdGFfcG9zICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRhdGEgb2Zmc2V0cyBmb3IgYSB0YWcgaW4gYSByZXNvdXJjZSBmb3JrLiAgT2Zmc2V0cyBhcmUgICAgKi8KLSAgLyogICAgc3RvcmVkIGluIGFuIGFycmF5IGJlY2F1c2UsIGluIHNvbWUgY2FzZXMsIHJlc291cmNlcyBpbiBhIHJlc291cmNlICovCi0gIC8qICAgIGZvcmsgaGF2ZSB0aGUgc2FtZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSByZXNvdXJjZSB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNvcnRfYnlfcmVzX2lkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbiB0byBzb3J0IHRoZSBmcmFnbWVudGVkIHJlc291cmNlIGJ5IHRoZWlyIGlkcy4gICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZnJhZ21lbnRlZCByZXNvdXJjZXMgZm9yIGBQT1NUJyByZXNvdXJjZSBzaG91bGQgYmUgc29ydGVkICAgICovCi0gIC8qICAgICAgdG8gcmVzdG9yZSBUeXBlMSBmb250IHByb3Blcmx5LiAgRm9yIGBzZm50JyByZXNvdXJjZXMsIHNvcnRpbmcgICAqLwotICAvKiAgICAgIG1heSBpbmR1Y2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgdGhlIGZhY2VzIGluIGNvbXBhcmlzb24gdG8gdGhhdCAgKi8KLSAgLyogICAgICBieSBRdWlja0RyYXcgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHN0cmVhbSBvZmZzZXRzIGZvciB0aGUgcmVzb3VyY2UgZGF0YSBzcGVjaWZpZWQgYnkgYHRhZycuICAgICAqLwotICAvKiAgICAgIFRoaXMgYXJyYXkgaXMgYWxsb2NhdGVkIGJ5IHRoZSBmdW5jdGlvbiwgc28geW91IGhhdmUgdG8gY2FsbCAgICAgKi8KLSAgLyogICAgICBAZnRfbWVtX2ZyZWUgYWZ0ZXIgdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGVuZ3RoIG9mIG9mZnNldHMgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIEZUX0Vycl9PayBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9ybWFsbHkgeW91IHNob3VsZCB1c2UgYEZUX1JhY2Nlc3NfR2V0X0hlYWRlckluZm8nIHRvIGdldCB0aGUgICAgICovCi0gIC8qICAgIHZhbHVlIGZvciBgbWFwX29mZnNldCcgYW5kIGByZGF0YV9wb3MnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9SYWNjZXNzX0dldF9EYXRhT2Zmc2V0cworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgR2V0IHRoZSBkYXRhIG9mZnNldHMgZm9yIGEgdGFnIGluIGEgcmVzb3VyY2UgZm9yay4gIE9mZnNldHMgYXJlIHN0b3JlZAorICAgKiAgIGluIGFuIGFycmF5IGJlY2F1c2UsIGluIHNvbWUgY2FzZXMsIHJlc291cmNlcyBpbiBhIHJlc291cmNlIGZvcmsgaGF2ZQorICAgKiAgIHRoZSBzYW1lIHRhZy4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxpYnJhcnkgOjoKKyAgICogICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4KKyAgICoKKyAgICogICBtYXBfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIG1hcCBzdGFydHMuCisgICAqCisgICAqICAgcmRhdGFfcG9zIDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLgorICAgKgorICAgKiAgIHRhZyA6OgorICAgKiAgICAgVGhlIHJlc291cmNlIHRhZy4KKyAgICoKKyAgICogICBzb3J0X2J5X3Jlc19pZCA6OgorICAgKiAgICAgQSBCb29sZWFuIHRvIHNvcnQgdGhlIGZyYWdtZW50ZWQgcmVzb3VyY2UgYnkgdGhlaXIgaWRzLiAgVGhlCisgICAqICAgICBmcmFnbWVudGVkIHJlc291cmNlcyBmb3IgJ1BPU1QnIHJlc291cmNlIHNob3VsZCBiZSBzb3J0ZWQgdG8gcmVzdG9yZQorICAgKiAgICAgVHlwZTEgZm9udCBwcm9wZXJseS4gIEZvciAnc2ZudCcgcmVzb3VyY2VzLCBzb3J0aW5nIG1heSBpbmR1Y2UgYQorICAgKiAgICAgZGlmZmVyZW50IG9yZGVyIG9mIHRoZSBmYWNlcyBpbiBjb21wYXJpc29uIHRvIHRoYXQgYnkgUXVpY2tEcmF3IEFQSS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBvZmZzZXRzIDo6CisgICAqICAgICBUaGUgc3RyZWFtIG9mZnNldHMgZm9yIHRoZSByZXNvdXJjZSBkYXRhIHNwZWNpZmllZCBieSAndGFnJy4gIFRoaXMKKyAgICogICAgIGFycmF5IGlzIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24sIHNvIHlvdSBoYXZlIHRvIGNhbGwgQGZ0X21lbV9mcmVlCisgICAqICAgICBhZnRlciB1c2UuCisgICAqCisgICAqICAgY291bnQgOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2Ygb2Zmc2V0cyBhcnJheS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgRlRfRXJyX09rIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIE5vcm1hbGx5IHlvdSBzaG91bGQgdXNlIGBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvYCB0byBnZXQgdGhlIHZhbHVlCisgICAqICAgZm9yIGBtYXBfb2Zmc2V0YCBhbmQgYHJkYXRhX3Bvc2AuCisgICAqLwogICBGVF9CQVNFKCBGVF9FcnJvciApCiAgIEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2LmgKaW5kZXggZTAxYzE2Ny4uNmUxYTk0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oCkBAIC0xLDQwICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNlcnYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHNlcnYuaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRWFjaCBtb2R1bGUgY2FuIGV4cG9ydCBvbmUgb3IgbW9yZSBgc2VydmljZXMnLiAgRWFjaCBzZXJ2aWNlIGlzICAgICAgKi8KLSAgLyogIGlkZW50aWZpZWQgYnkgYSBjb25zdGFudCBzdHJpbmcgYW5kIG1vZGVsZWQgYnkgYSBwb2ludGVyOyB0aGUgbGF0dGVyICovCi0gIC8qICBnZW5lcmFsbHkgY29ycmVzcG9uZHMgdG8gYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBmdW5jdGlvbiBwb2ludGVycy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBhIHNlcnZpY2UncyBkYXRhIGNhbm5vdCBiZSBhIG1lcmUgZnVuY3Rpb24gcG9pbnRlciBiZWNhdXNlICovCi0gIC8qICBpbiBDIGl0IGlzIHBvc3NpYmxlIHRoYXQgZnVuY3Rpb24gcG9pbnRlcnMgbWlnaHQgYmUgaW1wbGVtZW50ZWQgICAgICAqLwotICAvKiAgZGlmZmVyZW50bHkgdGhhbiBkYXRhIHBvaW50ZXJzIChlLmcuIDQ4IGJpdHMgaW5zdGVhZCBvZiAzMikuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRWFjaCBtb2R1bGUgY2FuIGV4cG9ydCBvbmUgb3IgbW9yZSAnc2VydmljZXMnLiAgRWFjaCBzZXJ2aWNlIGlzCisgICAqIGlkZW50aWZpZWQgYnkgYSBjb25zdGFudCBzdHJpbmcgYW5kIG1vZGVsZWQgYnkgYSBwb2ludGVyOyB0aGUgbGF0dGVyCisgICAqIGdlbmVyYWxseSBjb3JyZXNwb25kcyB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nIGZ1bmN0aW9uIHBvaW50ZXJzLgorICAgKgorICAgKiBOb3RlIHRoYXQgYSBzZXJ2aWNlJ3MgZGF0YSBjYW5ub3QgYmUgYSBtZXJlIGZ1bmN0aW9uIHBvaW50ZXIgYmVjYXVzZSBpbgorICAgKiBDIGl0IGlzIHBvc3NpYmxlIHRoYXQgZnVuY3Rpb24gcG9pbnRlcnMgbWlnaHQgYmUgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkKKyAgICogdGhhbiBkYXRhIHBvaW50ZXJzIChlLmcuIDQ4IGJpdHMgaW5zdGVhZCBvZiAzMikuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRTRVJWX0hfCiAjZGVmaW5lIEZUU0VSVl9IXwogCisjaW5jbHVkZSAiY29tcGlsZXItbWFjcm9zLmgiCiAKIEZUX0JFR0lOX0hFQURFUgogCi0gIC8qCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgogICAgKiBAbWFjcm86CiAgICAqICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UKICAgICoKQEAgLTQ2LDE1ICs0OCwxNSBAQAogICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZS4KICAgICoKICAgICogICBpZCA6OgotICAgKiAgICAgQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgc2VydmljZSBhcyBkZWZpbmVkIGluIHRoZSBzZXJ2aWNlJ3MKLSAgICogICAgIGhlYWRlciBmaWxlcyAoZS5nLiBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMgd2hpY2ggZXhwYW5kcyB0bwotICAgKiAgICAgYG11bHRpLW1hc3RlcnMnKS4gIEl0IGlzIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aAotICAgKiAgICAgYEZUX1NFUlZJQ0VfSURfJy4KKyAgICogICAgIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UgYXMgZGVmaW5lZCBpbiB0aGUgc2VydmljZSdzIGhlYWRlcgorICAgKiAgICAgZmlsZXMgKGUuZy4gRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTIHdoaWNoIGV4cGFuZHMgdG8KKyAgICogICAgICdtdWx0aS1tYXN0ZXJzJykuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGgKKyAgICogICAgIGBGVF9TRVJWSUNFX0lEX2AuCiAgICAqCiAgICAqIEBvdXRwdXQ6CiAgICAqICAgcHRyIDo6Ci0gICAqICAgICBBIHZhcmlhYmxlIHRoYXQgcmVjZWl2ZXMgdGhlIHNlcnZpY2UgcG9pbnRlci4gIFdpbGwgYmUgTlVMTAotICAgKiAgICAgaWYgbm90IGZvdW5kLgorICAgKiAgICAgQSB2YXJpYWJsZSB0aGF0IHJlY2VpdmVzIHRoZSBzZXJ2aWNlIHBvaW50ZXIuICBXaWxsIGJlIGBOVUxMYCBpZiBub3QKKyAgICogICAgIGZvdW5kLgogICAgKi8KICNpZmRlZiBfX2NwbHVzcGx1cwogCkBAIC04NSw3ICs4Nyw4IEBACiAjZW5kaWYgLyogIUMrKyAqLwogCiAKLSAgLyoKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UKICAgICoKQEAgLTk3LDE1ICsxMDAsMTUgQEAKICAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCiAgICAqCiAgICAqICAgaWQgOjoKLSAgICogICAgIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UgYXMgZGVmaW5lZCBpbiB0aGUgc2VydmljZSdzCi0gICAqICAgICBoZWFkZXIgZmlsZXMgKGUuZy4gRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTIHdoaWNoIGV4cGFuZHMgdG8KLSAgICogICAgIGBtdWx0aS1tYXN0ZXJzJykuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGgKLSAgICogICAgIGBGVF9TRVJWSUNFX0lEXycuCisgICAqICAgICBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBzZXJ2aWNlIGFzIGRlZmluZWQgaW4gdGhlIHNlcnZpY2UncyBoZWFkZXIKKyAgICogICAgIGZpbGVzIChlLmcuIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUyB3aGljaCBleHBhbmRzIHRvCisgICAqICAgICAnbXVsdGktbWFzdGVycycpLiAgSXQgaXMgYXV0b21hdGljYWxseSBwcmVmaXhlZCB3aXRoCisgICAqICAgICBgRlRfU0VSVklDRV9JRF9gLgogICAgKgogICAgKiBAb3V0cHV0OgogICAgKiAgIHB0ciA6OgotICAgKiAgICAgQSB2YXJpYWJsZSB0aGF0IHJlY2VpdmVzIHRoZSBzZXJ2aWNlIHBvaW50ZXIuICBXaWxsIGJlIE5VTEwKLSAgICogICAgIGlmIG5vdCBmb3VuZC4KKyAgICogICAgIEEgdmFyaWFibGUgdGhhdCByZWNlaXZlcyB0aGUgc2VydmljZSBwb2ludGVyLiAgV2lsbCBiZSBgTlVMTGAgaWYgbm90CisgICAqICAgICBmb3VuZC4KICAgICovCiAjaWZkZWYgX19jcGx1c3BsdXMKIApAQCAtMTQ0LDggKzE0Nyw4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIF9kZXNjcmliZV8gYSBnaXZlbiBzZXJ2aWNlCi0gICAqICB0byB0aGUgbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIHRvIGJ1aWxkIHNpbXBsZSBzdGF0aWMgc2VydmljZSBsaXN0cy4KKyAgICogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBfZGVzY3JpYmVfIGEgZ2l2ZW4gc2VydmljZSB0byB0aGUKKyAgICogbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIHRvIGJ1aWxkIHNpbXBsZSBzdGF0aWMgc2VydmljZSBsaXN0cy4KICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9TZXJ2aWNlRGVzY1JlY18KICAgewpAQCAtMTU3LDM1ICsxNjAsMjYgQEAKICAgdHlwZWRlZiBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyogIEZUX1NlcnZpY2VEZXNjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBhcnJheSBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBzdHJ1Y3R1cmVzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkIGEgYGNyZWF0ZScgZnVuY3Rpb24gbmVlZHMgdG8gICovCi0gIC8qICAgIGJlIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0byByZXR1cm4gYW4gYWxsb2NhdGVkIGFycmF5LiAgQXMgc29vbiBhcyAqLwotICAvKiAgICBpdCBpcyBubyBsb25nZXIgbmVlZGVkLCBhIGBkZXN0cm95JyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgdG8gKi8KLSAgLyogICAgcmVsZWFzZSB0aGF0IGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG1hbnVhbGx5IGNhbGxlZCBmcm9tIHRoZSBgcGljX2luaXQnIGFuZCAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgb2YgeW91ciBtb2R1bGUgKHNlZSBGVF9ERUZJTkVfTU9EVUxFKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIG5vdCBkZWZpbmVkIHRoZSBhcnJheSB3aWxsIGJlICAgICAgICAgKi8KLSAgLyogICAgYWxsb2NhdGVkIGluIHRoZSBnbG9iYWwgc2NvcGUgKG9yIHRoZSBzY29wZSB3aGVyZSB0aGUgbWFjcm8gaXMgICAgICovCi0gIC8qICAgIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQG1hY3JvOgorICAgKiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEKKyAgICogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyCisgICAqICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMworICAgKiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQKKyAgICogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1CisgICAqICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNgorICAgKiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcKKyAgICogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM4CisgICAqICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOQorICAgKiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEwCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBVc2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgRlRfU2VydmljZURlc2NSZWMgc3RydWN0dXJlcy4KKyAgICoKKyAgICogICBUaGUgYXJyYXkgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlCisgICAqICAgdGhlIG1hY3JvIGlzIHVzZWQpLgorICAgKi8KICNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgKSAgICAgICAgICAgICAgICAgXAogICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM1Niw1MDQgKzM1MCwxNSBAQAogICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAyICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDMgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNCApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA1ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDYgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzYoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNyApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IHNlcnZfaWRfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNyApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA4ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9pZCAgID0gc2Vydl9pZF82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els3XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzgsIHNlcnZfZGF0YV84ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDkgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfaWQgICA9IHNlcnZfaWRfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbN10uc2Vydl9pZCAgID0gc2Vydl9pZF84OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV84OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els4XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbOF0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzkoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF84LCBzZXJ2X2RhdGFfOCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfOSwgc2Vydl9kYXRhXzkgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogMTAgKSApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IHNlcnZfaWRfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9pZCAgID0gc2Vydl9pZF83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els3XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbN10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzhdLnNlcnZfaWQgICA9IHNlcnZfaWRfOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els4XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbOV0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzldLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxMCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzgsIHNlcnZfZGF0YV84LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF85LCBzZXJ2X2RhdGFfOSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMTAsIHNlcnZfZGF0YV8xMCApICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAxMSApICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyAxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyAyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyA0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDVdLnNlcnZfaWQgICA9IHNlcnZfaWRfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyA1XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgNl0uc2Vydl9pZCAgID0gc2Vydl9pZF83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDZdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV83OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyA3XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgN10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDhdLnNlcnZfaWQgICA9IHNlcnZfaWRfOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WyA4XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfOTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsgOV0uc2Vydl9pZCAgID0gc2Vydl9pZF8xMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbIDldLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzEwXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxMF0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAKICAgLyoKLSAgICogIFBhcnNlIGEgbGlzdCBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBkZXNjcmlwdG9ycyBhbmQgbG9vayBmb3IKLSAgICogIGEgc3BlY2lmaWMgc2VydmljZSBieSBJRC4gIE5vdGUgdGhhdCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZQotICAgKiAgYXJyYXkgbXVzdCBiZSB7IE5VTEwsIE5VTEwgfSwgYW5kIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZAotICAgKiAgcmV0dXJuIE5VTEwgaWYgdGhlIHNlcnZpY2UgaXNuJ3QgYXZhaWxhYmxlLgorICAgKiBQYXJzZSBhIGxpc3Qgb2YgRlRfU2VydmljZURlc2NSZWMgZGVzY3JpcHRvcnMgYW5kIGxvb2sgZm9yIGEgc3BlY2lmaWMKKyAgICogc2VydmljZSBieSBJRC4gIE5vdGUgdGhhdCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBtdXN0IGJlIHsgTlVMTCwKKyAgICogTlVMTCB9LCBhbmQgdGhhdCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBOVUxMIGlmIHRoZSBzZXJ2aWNlIGlzbid0CisgICAqIGF2YWlsYWJsZS4KICAgICoKLSAgICogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgbW9kdWxlcyB0byBpbXBsZW1lbnQgdGhlaXIKLSAgICogIGBnZXRfc2VydmljZScgbWV0aG9kLgorICAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGJ5IG1vZHVsZXMgdG8gaW1wbGVtZW50IHRoZWlyIGBnZXRfc2VydmljZScKKyAgICogbWV0aG9kLgogICAgKi8KICAgRlRfQkFTRSggRlRfUG9pbnRlciApCiAgIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIEZUX1NlcnZpY2VEZXNjICBzZXJ2aWNlX2Rlc2NyaXB0b3JzLApAQCAtODY5LDE2ICszNzQsMTYgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgLyoKLSAgICogIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgYSBjYWNoZSBmb3Igc2V2ZXJhbCBmcmVxdWVudGx5IHVzZWQKLSAgICogIHNlcnZpY2VzLiAgSXQgaXMgdGhlIHR5cGUgb2YgYGZhY2UtPmludGVybmFsLT5zZXJ2aWNlcycuICBZb3UKLSAgICogIHNob3VsZCBvbmx5IHVzZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFIHRvIGFjY2VzcyBpdC4KKyAgICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBhIGNhY2hlIGZvciBzZXZlcmFsIGZyZXF1ZW50bHkgdXNlZAorICAgKiBzZXJ2aWNlcy4gIEl0IGlzIHRoZSB0eXBlIG9mIGBmYWNlLT5pbnRlcm5hbC0+c2VydmljZXMnLiAgWW91IHNob3VsZAorICAgKiBvbmx5IHVzZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFIHRvIGFjY2VzcyBpdC4KICAgICoKLSAgICogIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgdGhlIHR5cGUgRlRfUG9pbnRlciB0byByZWxheCBjb21waWxhdGlvbgotICAgKiAgZGVwZW5kZW5jaWVzLiAgV2UgYXNzdW1lIHRoZSBkZXZlbG9wZXIgaXNuJ3QgY29tcGxldGVseSBzdHVwaWQuCisgICAqIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgdGhlIHR5cGUgRlRfUG9pbnRlciB0byByZWxheCBjb21waWxhdGlvbgorICAgKiBkZXBlbmRlbmNpZXMuICBXZSBhc3N1bWUgdGhlIGRldmVsb3BlciBpc24ndCBjb21wbGV0ZWx5IHN0dXBpZC4KICAgICoKLSAgICogIEVhY2ggZmllbGQgbXVzdCBiZSBuYW1lZCBgc2VydmljZV9YWFhYJyB3aGVyZSBgWFhYJyBjb3JyZXNwb25kcyB0bwotICAgKiAgdGhlIGNvcnJlY3QgRlRfU0VSVklDRV9JRF9YWFhYIG1hY3JvLiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mCi0gICAqICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFIGJlbG93IGhvdyB0aGlzIGlzIGltcGxlbWVudGVkLgorICAgKiBFYWNoIGZpZWxkIG11c3QgYmUgbmFtZWQgYHNlcnZpY2VfWFhYWCcgd2hlcmUgYFhYWCcgY29ycmVzcG9uZHMgdG8gdGhlCisgICAqIGNvcnJlY3QgRlRfU0VSVklDRV9JRF9YWFhYIG1hY3JvLiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mCisgICAqIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgYmVsb3cgaG93IHRoaXMgaXMgaW1wbGVtZW50ZWQuCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfU2VydmljZUNhY2hlUmVjXwpAQCAtODk0LDE0ICszOTksMTUgQEAKIAogCiAgIC8qCi0gICAqICBBIG1hZ2ljIG51bWJlciB1c2VkIHdpdGhpbiB0aGUgc2VydmljZXMgY2FjaGUuCisgICAqIEEgbWFnaWMgbnVtYmVyIHVzZWQgd2l0aGluIHRoZSBzZXJ2aWNlcyBjYWNoZS4KICAgICovCiAKICAgLyogZW5zdXJlIHRoYXQgdmFsdWUgYDEnIGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBhIHBvaW50ZXIgKi8KICNkZWZpbmUgRlRfU0VSVklDRV9VTkFWQUlMQUJMRSAgKChGVF9Qb2ludGVyKX4oRlRfUHRyRGlzdCkxKQogCiAKLSAgLyoKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCiAgICAqIEBtYWNybzoKICAgICogICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFCiAgICAqCkBAIC05MTAsNyArNDE2LDcgQEAKICAgICogICB1c2luZyBpdHMgY2FjaGUuCiAgICAqCiAgICAqIEBpbnB1dDoKLSAgICogICBmYWNlOjoKKyAgICogICBmYWNlIDo6CiAgICAqICAgICBUaGUgc291cmNlIGZhY2UgaGFuZGxlIGNvbnRhaW5pbmcgdGhlIGNhY2hlLgogICAgKgogICAgKiAgIGZpZWxkIDo6CkBAIC05MjEsNyArNDI3LDcgQEAKICAgICoKICAgICogQG91dHB1dDoKICAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgcmVjZWl2aW5nIHRoZSBzZXJ2aWNlIGRhdGEuICBOVUxMIGlmIG5vdCBhdmFpbGFibGUuCisgICAqICAgICBBIHZhcmlhYmxlIHJlY2VpdmluZyB0aGUgc2VydmljZSBkYXRhLiAgYE5VTExgIGlmIG5vdCBhdmFpbGFibGUuCiAgICAqLwogI2lmZGVmIF9fY3BsdXNwbHVzCiAKQEAgLTk2OSw3ICs0NzUsNyBAQAogI2VuZGlmIC8qICFDKysgKi8KIAogICAvKgotICAgKiAgQSBtYWNybyB1c2VkIHRvIGRlZmluZSBuZXcgc2VydmljZSBzdHJ1Y3R1cmUgdHlwZXMuCisgICAqIEEgbWFjcm8gdXNlZCB0byBkZWZpbmUgbmV3IHNlcnZpY2Ugc3RydWN0dXJlIHR5cGVzLgogICAgKi8KIAogI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRSggbmFtZSApICAgICAgICAgICAgXApAQCAtOTgxLDMzICs0ODcsNiBAQAogCiAgIC8qICovCiAKLSAgLyoKLSAgICogIFRoZSBoZWFkZXIgZmlsZXMgY29udGFpbmluZyB0aGUgc2VydmljZXMuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfQkRGX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfQ0ZGX1RBQkxFX0xPQURfSCAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9DSURfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9IICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0ggICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9IICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0tFUk5JTkdfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSCA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0ggICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oPgotI2RlZmluZSBGVF9TRVJWSUNFX09QRU5UWVBFX1ZBTElEQVRFX0ggIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUEZSX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19IICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1NGTlRfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSCAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RUX0NNQVBfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1dJTkZOVF9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oPgotCi0gLyogKi8KLQogRlRfRU5EX0hFQURFUgogCiAjZW5kaWYgLyogRlRTRVJWX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgKaW5kZXggZjkwMDAyZi4uZTdkOTIyMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFN0cmVhbSBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzdHJlYW0uaAorICoKKyAqICAgU3RyZWFtIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRTVFJFQU1fSF8KQEAgLTIxLDggKzIxLDggQEAKIAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdHN5c3RlbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtOTYsMTMgKzk2LDEzIEBACiAgIC8qIFRoZSBzdHJ1Y3R1cmUgdHlwZSBtdXN0IGJlIHNldCBpbiB0aGUgRlRfU1RSVUNUVVJFIG1hY3JvIGJlZm9yZSAgICAgICAqLwogICAvKiBjYWxsaW5nIHRoZSBGVF9GUkFNRV9TVEFSVCgpIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0ZJRUxEX1NJWkUoIGYgKSBcCisjZGVmaW5lIEZUX0ZJRUxEX1NJWkUoIGYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIChGVF9CeXRlKXNpemVvZiAoICgoRlRfU1RSVUNUVVJFKikwKS0+ZiApCiAKLSNkZWZpbmUgRlRfRklFTERfU0laRV9ERUxUQSggZiApIFwKKyNkZWZpbmUgRlRfRklFTERfU0laRV9ERUxUQSggZiApICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgKEZUX0J5dGUpc2l6ZW9mICggKChGVF9TVFJVQ1RVUkUqKTApLT5mWzBdICkKIAotI2RlZmluZSBGVF9GSUVMRF9PRkZTRVQoIGYgKSBcCisjZGVmaW5lIEZUX0ZJRUxEX09GRlNFVCggZiApICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoRlRfVVNob3J0KSggb2Zmc2V0b2YoIEZUX1NUUlVDVFVSRSwgZiApICkKIAogI2RlZmluZSBGVF9GUkFNRV9GSUVMRCggZnJhbWVfb3AsIGZpZWxkICkgXApAQCAtMTQ3LDExICsxNDcsMTEgQEAKICNkZWZpbmUgRlRfRlJBTUVfU0tJUF9CWVRFUyggY291bnQgKSAgeyBmdF9mcmFtZV9za2lwLCBjb3VudCwgMCB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEludGVnZXIgZXh0cmFjdGlvbiBtYWNyb3MgLS0gdGhlIGBidWZmZXInIHBhcmFtZXRlciBtdXN0IEFMV0FZUyBiZSBvZiAqLwotICAvKiB0eXBlIGBjaGFyKicgb3IgZXF1aXZhbGVudCAoMS1ieXRlIGVsZW1lbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJbnRlZ2VyIGV4dHJhY3Rpb24gbWFjcm9zIC0tIHRoZSAnYnVmZmVyJyBwYXJhbWV0ZXIgbXVzdCBBTFdBWVMgYmUgb2YKKyAgICogdHlwZSAnY2hhcionIG9yIGVxdWl2YWxlbnQgKDEtYnl0ZSBlbGVtZW50cykuCisgICAqLwogCiAjZGVmaW5lIEZUX0JZVEVfKCBwLCBpICkgICggKChjb25zdCBGVF9CeXRlKikocCkpWyhpKV0gKQogCkBAIC0xNjUsNiArMTY1LDIxIEBACiAjZGVmaW5lIEZUX0JZVEVfVTMyKCBwLCBpLCBzICkgICggRlRfVUlOVDMyKCBGVF9CWVRFXyggcCwgaSApICkgPDwgKHMpICkKIAogCisgIC8qCisgICAqICAgIGZ1bmN0aW9uICAgICAgYWN0cyBvbiAgICAgIGluY3JlYXNlcyAgZG9lcyByYW5nZSAgIGZvciAgICBlbWl0cworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciAgICBjaGVja2luZyAgIGZyYW1lcyAgZXJyb3IKKyAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogICBGVF9QRUVLX1hYWCAgYnVmZmVyIHBvaW50ZXIgICAgICBubyAgICAgICAgIG5vICAgICAgICBubyAgICAgbm8KKyAgICogICBGVF9ORVhUX1hYWCAgYnVmZmVyIHBvaW50ZXIgICAgIHllcyAgICAgICAgIG5vICAgICAgICBubyAgICAgbm8KKyAgICogICBGVF9HRVRfWFhYICAgc3RyZWFtLT5jdXJzb3IgICAgIHllcyAgICAgICAgeWVzICAgICAgIHllcyAgICAgbm8KKyAgICogICBGVF9SRUFEX1hYWCAgc3RyZWFtLT5wb3MgICAgICAgIHllcyAgICAgICAgeWVzICAgICAgICBubyAgICB5ZXMKKyAgICovCisKKworICAvKgorICAgKiBgRlRfUEVFS19YWFgnIGFyZSBnZW5lcmljIG1hY3JvcyB0byBnZXQgZGF0YSBmcm9tIGEgYnVmZmVyIHBvc2l0aW9uLiAgTm8KKyAgICogc2FmZXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkLgorICAgKi8KICNkZWZpbmUgRlRfUEVFS19TSE9SVCggcCApICBGVF9JTlQxNiggRlRfQllURV9VMTYoIHAsIDAsIDggKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDEsIDAgKSApCiAKQEAgLTIxMyw3ICsyMjgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQogCi0KKyAgLyoKKyAgICogYEZUX05FWFRfWFhYJyBhcmUgZ2VuZXJpYyBtYWNyb3MgdG8gZ2V0IGRhdGEgZnJvbSBhIGJ1ZmZlciBwb3NpdGlvbgorICAgKiB3aGljaCBpcyB0aGVuIGluY3JlYXNlZCBhcHByb3ByaWF0ZWx5LiAgTm8gc2FmZXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkLgorICAgKi8KICNkZWZpbmUgRlRfTkVYVF9DSEFSKCBidWZmZXIgKSAgICAgICBcCiAgICAgICAgICAgKCAoc2lnbmVkIGNoYXIpKmJ1ZmZlcisrICkKIApAQCAtMjU4LDEwICsyNzYsMTQgQEAKICAgICAgICAgICAoICh1bnNpZ25lZCBsb25nKSggYnVmZmVyICs9IDQsIEZUX1BFRUtfVUxPTkdfTEUoIGJ1ZmZlciAtIDQgKSApICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBHRVRfeHh4eCgpIG1hY3JvIHVzZXMgYW4gaW1wbGljaXQgYHN0cmVhbScgdmFyaWFibGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIGBGVF9HRVRfWFhYYCBtYWNyb3MgdXNlIGFuIGltcGxpY2l0ICdzdHJlYW0nIHZhcmlhYmxlLgorICAgKgorICAgKiBOb3RlIHRoYXQgYSBjYWxsIHRvIGBGVF9TVFJFQU1fU0VFS2Agb3IgYEZUX1NUUkVBTV9QT1NgIGhhcyAqKm5vKioKKyAgICogZWZmZWN0IG9uIGBGVF9HRVRfWFhYYCEgIFRoZXkgb3BlcmF0ZSBvbiBgc3RyZWFtLT5wb3NgLCB3aGlsZQorICAgKiBgRlRfR0VUX1hYWGAgdXNlIGBzdHJlYW0tPmN1cnNvcmAuCisgICAqLwogI2lmIDAKICNkZWZpbmUgRlRfR0VUX01BQ1JPKCB0eXBlICkgICAgRlRfTkVYVF8gIyMgdHlwZSAoIHN0cmVhbS0+Y3Vyc29yICkKIApAQCAtMjk5LDEwICszMjEsMTggQEAKICNkZWZpbmUgRlRfR0VUX1VMT05HX0xFKCkgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZ0xFLCBGVF9VTG9uZyApCiAjZW5kaWYKIAorCiAjZGVmaW5lIEZUX1JFQURfTUFDUk8oIGZ1bmMsIHR5cGUsIHZhciApICAgICAgICBcCiAgICAgICAgICAgKCB2YXIgPSAodHlwZSlmdW5jKCBzdHJlYW0sICZlcnJvciApLCBcCiAgICAgICAgICAgICBlcnJvciAhPSBGVF9FcnJfT2sgKQogCisgIC8qCisgICAqIFRoZSBgRlRfUkVBRF9YWFgnIG1hY3JvcyB1c2UgaW1wbGljaXQgYHN0cmVhbScgYW5kIGBlcnJvcicgdmFyaWFibGVzLgorICAgKgorICAgKiBgRlRfUkVBRF9YWFgnIGNhbiBiZSBjb250cm9sbGVkIHdpdGggYEZUX1NUUkVBTV9TRUVLJyBhbmQKKyAgICogYEZUX1NUUkVBTV9QT1MnLiAgVGhleSB1c2UgdGhlIGZ1bGwgbWFjaGluZXJ5IHRvIGNoZWNrIHdoZXRoZXIgYSByZWFkIGlzCisgICAqIHZhbGlkLgorICAgKi8KICNkZWZpbmUgRlRfUkVBRF9CWVRFKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZENoYXIsIEZUX0J5dGUsIHZhciApCiAjZGVmaW5lIEZUX1JFQURfQ0hBUiggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRDaGFyLCBGVF9DaGFyLCB2YXIgKQogI2RlZmluZSBGVF9SRUFEX1NIT1JUKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0LCBGVF9TaG9ydCwgdmFyICkKQEAgLTM4NywxMiArNDE3LDE0IEBACiAKICAgLyogRW50ZXIgYSBmcmFtZSBvZiBgY291bnQnIGNvbnNlY3V0aXZlIGJ5dGVzIGluIGEgc3RyZWFtLiAgUmV0dXJucyBhbiAqLwogICAvKiBlcnJvciBpZiB0aGUgZnJhbWUgY291bGQgbm90IGJlIHJlYWQvYWNjZXNzZWQuICBUaGUgY2FsbGVyIGNhbiB1c2UgICovCi0gIC8qIHRoZSBGVF9TdHJlYW1fR2V0X1hYWCBmdW5jdGlvbnMgdG8gcmV0cmlldmUgZnJhbWUgZGF0YSB3aXRob3V0ICAgICAgKi8KKyAgLyogdGhlIGBGVF9TdHJlYW1fR2V0WFhYJyBmdW5jdGlvbnMgdG8gcmV0cmlldmUgZnJhbWUgZGF0YSB3aXRob3V0ICAgICAqLwogICAvKiBlcnJvciBjaGVja3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG11c3QgX2Fsd2F5c18gY2FsbCBGVF9TdHJlYW1fRXhpdEZyYW1lKCkgb25jZSB5b3UgaGF2ZSBlbnRlcmVkICAqLworICAvKiBZb3UgbXVzdCBfYWx3YXlzXyBjYWxsIGBGVF9TdHJlYW1fRXhpdEZyYW1lJyBvbmNlIHlvdSBoYXZlIGVudGVyZWQgICovCiAgIC8qIGEgc3RyZWFtIGZyYW1lISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOZXN0ZWQgZnJhbWVzIGFyZSBub3QgcGVybWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgRlRfQkFTRSggRlRfRXJyb3IgKQogICBGVF9TdHJlYW1fRW50ZXJGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICk7CkBAIC00MDEsMjUgKzQzMywyOSBAQAogICBGVF9CQVNFKCB2b2lkICkKICAgRlRfU3RyZWFtX0V4aXRGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKIAorCiAgIC8qIEV4dHJhY3QgYSBzdHJlYW0gZnJhbWUuICBJZiB0aGUgc3RyZWFtIGlzIGRpc2stYmFzZWQsIGEgaGVhcCBibG9jayAqLwogICAvKiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBieXRlcyBhcmUgcmVhZCBpbnRvIGl0LiAgSWYgdGhlIHN0cmVhbSAgKi8KLSAgLyogaXMgbWVtb3J5LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBzZXQgYSBwb2ludGVyIHRvIHRoZSBkYXRhLiAgICovCisgIC8qIGlzIG1lbW9yeS1iYXNlZCwgdGhpcyBmdW5jdGlvbiBzaW1wbHkgc2V0cyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEuICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogVXNlZnVsIHRvIG9wdGltaXplIGFjY2VzcyB0byBtZW1vcnktYmFzZWQgc3RyZWFtcyB0cmFuc3BhcmVudGx5LiAgICovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZXh0cmFjdGVkIGZyYW1lcyBtdXN0IGJlIGBmcmVlZCcgd2l0aCBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uICAgKi8KLSAgLyogRlRfU3RyZWFtX1JlbGVhc2VGcmFtZSgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBGVF9TdHJlYW1fR2V0WFhYJyBmdW5jdGlvbnMgY2FuJ3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQW4gZXh0cmFjdGVkIGZyYW1lIG11c3QgYmUgYGZyZWVkJyB3aXRoIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gICAgICovCisgIC8qIGBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgRlRfQkFTRSggRlRfRXJyb3IgKQogICBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKIAotICAvKiByZWxlYXNlIGFuIGV4dHJhY3QgZnJhbWUgKHNlZSBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lKSAqLworICAvKiByZWxlYXNlIGFuIGV4dHJhY3QgZnJhbWUgKHNlZSBgRlRfU3RyZWFtX0V4dHJhY3RGcmFtZScpICovCiAgIEZUX0JBU0UoIHZvaWQgKQogICBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKTsKIAorCiAgIC8qIHJlYWQgYSBieXRlIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwogICBGVF9CQVNFKCBGVF9DaGFyICkKICAgRlRfU3RyZWFtX0dldENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCmluZGV4IDgwOTJlNDEuLjU4YmQ3NzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHRyYWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJhY2luZyBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHRyYWNlLmgKKyAqCisgKiAgIFRyYWNpbmcgaGFuZGxpbmcgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgIC8qIGRlZmluaXRpb25zIG9mIHRyYWNlIGxldmVscyBmb3IgRnJlZVR5cGUgMiAqLwpAQCAtMjMsMjMgKzIzLDI0IEBACiAKICAgLyogYmFzZSBjb21wb25lbnRzICovCiBGVF9UUkFDRV9ERUYoIGNhbGMgKSAgICAgIC8qIGNhbGN1bGF0aW9ucyAgICAgICAgICAgIChmdGNhbGMuYykgICAqLworRlRfVFJBQ0VfREVGKCBnbG9hZGVyICkgICAvKiBnbHlwaCBsb2FkZXIgICAgICAgICAgICAoZnRnbG9hZHIuYykgKi8KK0ZUX1RSQUNFX0RFRiggZ2x5cGggKSAgICAgLyogZ2x5cGggbWFuYWdlbWVudCAgICAgICAgKGZ0Z2x5cGguYykgICovCiBGVF9UUkFDRV9ERUYoIG1lbW9yeSApICAgIC8qIG1lbW9yeSBtYW5hZ2VyICAgICAgICAgIChmdG9ianMuYykgICAqLwotRlRfVFJBQ0VfREVGKCBzdHJlYW0gKSAgICAvKiBzdHJlYW0gbWFuYWdlciAgICAgICAgICAoZnRzdHJlYW0uYykgKi8KK0ZUX1RSQUNFX0RFRiggaW5pdCApICAgICAgLyogaW5pdGlhbGl6YXRpb24gICAgICAgICAgKGZ0aW5pdC5jKSAgICovCiBGVF9UUkFDRV9ERUYoIGlvICkgICAgICAgIC8qIGkvbyBpbnRlcmZhY2UgICAgICAgICAgIChmdHN5c3RlbS5jKSAqLwogRlRfVFJBQ0VfREVGKCBsaXN0ICkgICAgICAvKiBsaXN0IG1hbmFnZW1lbnQgICAgICAgICAoZnRsaXN0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggaW5pdCApICAgICAgLyogaW5pdGlhbGl6YXRpb24gICAgICAgICAgKGZ0aW5pdC5jKSAgICovCiBGVF9UUkFDRV9ERUYoIG9ianMgKSAgICAgIC8qIGJhc2Ugb2JqZWN0cyAgICAgICAgICAgIChmdG9ianMuYykgICAqLwogRlRfVFJBQ0VfREVGKCBvdXRsaW5lICkgICAvKiBvdXRsaW5lIG1hbmFnZW1lbnQgICAgICAoZnRvdXRsbi5jKSAgKi8KLUZUX1RSQUNFX0RFRiggZ2x5cGggKSAgICAgLyogZ2x5cGggbWFuYWdlbWVudCAgICAgICAgKGZ0Z2x5cGguYykgICovCi1GVF9UUkFDRV9ERUYoIGdsb2FkZXIgKSAgIC8qIGdseXBoIGxvYWRlciAgICAgICAgICAgIChmdGdsb2Fkci5jKSAqLworRlRfVFJBQ0VfREVGKCBzdHJlYW0gKSAgICAvKiBzdHJlYW0gbWFuYWdlciAgICAgICAgICAoZnRzdHJlYW0uYykgKi8KIAorRlRfVFJBQ0VfREVGKCBiaXRtYXAgKSAgICAvKiBiaXRtYXAgbWFuaXB1bGF0aW9uICAgICAoZnRiaXRtYXAuYykgKi8KK0ZUX1RSQUNFX0RFRiggY2hlY2tzdW0gKSAgLyogYml0bWFwIGNoZWNrc3VtICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCitGVF9UUkFDRV9ERUYoIG1tICkgICAgICAgIC8qIE1NIGludGVyZmFjZSAgICAgICAgICAgIChmdG1tLmMpICAgICAqLworRlRfVFJBQ0VfREVGKCBwc3Byb3BzICkgICAvKiBQUyBkcml2ZXIgcHJvcGVydGllcyAgICAoZnRwc3Byb3AuYykgKi8KK0ZUX1RSQUNFX0RFRiggcmFjY2VzcyApICAgLyogcmVzb3VyY2UgZm9yayBhY2Nlc3NvciAgKGZ0cmZvcmsuYykgICovCiBGVF9UUkFDRV9ERUYoIHJhc3RlciApICAgIC8qIG1vbm9jaHJvbWUgcmFzdGVyaXplciAgIChmdHJhc3Rlci5jKSAqLwogRlRfVFJBQ0VfREVGKCBzbW9vdGggKSAgICAvKiBhbnRpLWFsaWFzaW5nIHJhc3RlciAgICAoZnRncmF5cy5jKSAgKi8KLUZUX1RSQUNFX0RFRiggbW0gKSAgICAgICAgLyogTU0gaW50ZXJmYWNlICAgICAgICAgICAgKGZ0bW0uYykgICAgICovCi1GVF9UUkFDRV9ERUYoIHJhY2Nlc3MgKSAgIC8qIHJlc291cmNlIGZvcmsgYWNjZXNzb3IgIChmdHJmb3JrLmMpICAqLwogRlRfVFJBQ0VfREVGKCBzeW50aCApICAgICAvKiBib2xkL3NsYW50IHN5bnRoZXNpemVyICAoZnRzeW50aC5jKSAgKi8KLUZUX1RSQUNFX0RFRiggYml0bWFwICkgICAgLyogYml0bWFwIGNoZWNrc3VtICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHBzcHJvcHMgKSAgIC8qIFBTIGRyaXZlciBwcm9wZXJ0aWVzICAgIChmdHBzcHJvcC5jKSAqLwogCiAgIC8qIENhY2hlIHN1Yi1zeXN0ZW0gKi8KIEZUX1RSQUNFX0RFRiggY2FjaGUgKSAgICAgLyogY2FjaGUgc3ViLXN5c3RlbSAgICAgICAgKGZ0Y2FjaGUuYywgZXRjLikgKi8KQEAgLTQ3LDIxICs0OCwyNSBAQAogICAvKiBTRk5UIGRyaXZlciBjb21wb25lbnRzICovCiBGVF9UUkFDRV9ERUYoIHNmZHJpdmVyICkgIC8qIFNGTlQgZm9udCBkcml2ZXIgICAgICAgIChzZmRyaXZlci5jKSAqLwogRlRfVFJBQ0VfREVGKCBzZm9ianMgKSAgICAvKiBTRk5UIG9iamVjdCBoYW5kbGVyICAgICAoc2ZvYmpzLmMpICAgKi8KK0ZUX1RSQUNFX0RFRiggc2Z3b2ZmICkgICAgLyogV09GRiBmb3JtYXQgaGFuZGxlciAgICAgKHNmd29mZi5jKSAgICovCitGVF9UUkFDRV9ERUYoIHNmd29mZjIgKSAgIC8qIFdPRkYyIGZvcm1hdCBoYW5kbGVyICAgIChzZndvZmYyLmMpICAqLworRlRfVFJBQ0VfREVGKCB0dGJkZiApICAgICAvKiBUcnVlVHlwZSBlbWJlZGRlZCBCREYgICAodHRiZGYuYykgICAgKi8KIEZUX1RSQUNFX0RFRiggdHRjbWFwICkgICAgLyogY2hhcm1hcCBoYW5kbGVyICAgICAgICAgKHR0Y21hcC5jKSAgICovCitGVF9UUkFDRV9ERUYoIHR0Y29sciApICAgIC8qIGdseXBoIGxheWVyIHRhYmxlICAgICAgICh0dGNvbHIuYykgICAqLworRlRfVFJBQ0VfREVGKCB0dGNwYWwgKSAgICAvKiBjb2xvciBwYWxldHRlIHRhYmxlICAgICAodHRjcGFsLmMpICAgKi8KIEZUX1RSQUNFX0RFRiggdHRrZXJuICkgICAgLyoga2VybmluZyBoYW5kbGVyICAgICAgICAgKHR0a2Vybi5jKSAgICovCiBGVF9UUkFDRV9ERUYoIHR0bG9hZCApICAgIC8qIGJhc2ljIFRydWVUeXBlIHRhYmxlcyAgICh0dGxvYWQuYykgICAqLwogRlRfVFJBQ0VfREVGKCB0dG10eCApICAgICAvKiBtZXRyaWNzLXJlbGF0ZWQgdGFibGVzICAodHRtdHguYykgICAgKi8KIEZUX1RSQUNFX0RFRiggdHRwb3N0ICkgICAgLyogUFMgdGFibGUgcHJvY2Vzc2luZyAgICAgKHR0cG9zdC5jKSAgICovCiBGVF9UUkFDRV9ERUYoIHR0c2JpdCApICAgIC8qIFRydWVUeXBlIHNiaXQgaGFuZGxpbmcgICh0dHNiaXQuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dGJkZiApICAgICAvKiBUcnVlVHlwZSBlbWJlZGRlZCBCREYgICAodHRiZGYuYykgICAgKi8KIAogICAvKiBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50cyAqLwogRlRfVFJBQ0VfREVGKCB0dGRyaXZlciApICAvKiBUVCBmb250IGRyaXZlciAgICAgICAgICAodHRkcml2ZXIuYykgKi8KIEZUX1RSQUNFX0RFRiggdHRnbG9hZCApICAgLyogVFQgZ2x5cGggbG9hZGVyICAgICAgICAgKHR0Z2xvYWQuYykgICovCitGVF9UUkFDRV9ERUYoIHR0Z3h2YXIgKSAgIC8qIFRydWVUeXBlIEdYIHZhciBoYW5kbGVyICh0dGd4dmFyLmMpICAqLwogRlRfVFJBQ0VfREVGKCB0dGludGVycCApICAvKiBieXRlY29kZSBpbnRlcnByZXRlciAgICAodHRpbnRlcnAuYykgKi8KIEZUX1RSQUNFX0RFRiggdHRvYmpzICkgICAgLyogVFQgb2JqZWN0cyBtYW5hZ2VyICAgICAgKHR0b2Jqcy5jKSAgICovCiBGVF9UUkFDRV9ERUYoIHR0cGxvYWQgKSAgIC8qIFRUIGRhdGEvcHJvZ3JhbSBsb2FkZXIgICh0dHBsb2FkLmMpICAqLwotRlRfVFJBQ0VfREVGKCB0dGd4dmFyICkgICAvKiBUcnVlVHlwZSBHWCB2YXIgaGFuZGxlciAodHRneHZhci5jKSAgKi8KIAogICAvKiBUeXBlIDEgZHJpdmVyIGNvbXBvbmVudHMgKi8KIEZUX1RSQUNFX0RFRiggdDFhZm0gKQpAQCAtNzIsMTQgKzc3LDE0IEBACiBGVF9UUkFDRV9ERUYoIHQxcGFyc2UgKQogCiAgIC8qIFBvc3RTY3JpcHQgaGVscGVyIG1vZHVsZSBgcHNhdXgnICovCi1GVF9UUkFDRV9ERUYoIHQxZGVjb2RlICkKIEZUX1RSQUNFX0RFRiggY2ZmZGVjb2RlICkKLUZUX1RSQUNFX0RFRiggcHNvYmpzICkKIEZUX1RSQUNFX0RFRiggcHNjb252ICkKK0ZUX1RSQUNFX0RFRiggcHNvYmpzICkKK0ZUX1RSQUNFX0RFRiggdDFkZWNvZGUgKQogCiAgIC8qIFBvc3RTY3JpcHQgaGludGluZyBtb2R1bGUgYHBzaGludGVyJyAqLwotRlRfVFJBQ0VfREVGKCBwc2hyZWMgKQogRlRfVFJBQ0VfREVGKCBwc2hhbGdvICkKK0ZUX1RSQUNFX0RFRiggcHNocmVjICkKIAogICAvKiBUeXBlIDIgZHJpdmVyIGNvbXBvbmVudHMgKi8KIEZUX1RSQUNFX0RFRiggY2ZmZHJpdmVyICkKQEAgLTExNyw3ICsxMjIsNiBAQAogRlRfVFJBQ0VfREVGKCBwZnIgKQogCiAgIC8qIE9wZW5UeXBlIHZhbGlkYXRpb24gY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBvdHZtb2R1bGUgKQogRlRfVFJBQ0VfREVGKCBvdHZjb21tb24gKQogRlRfVFJBQ0VfREVGKCBvdHZiYXNlICkKIEZUX1RSQUNFX0RFRiggb3R2Z2RlZiApCkBAIC0xMjUsMjkgKzEyOSwzMCBAQAogRlRfVFJBQ0VfREVGKCBvdHZnc3ViICkKIEZUX1RSQUNFX0RFRiggb3R2anN0ZiApCiBGVF9UUkFDRV9ERUYoIG90dm1hdGggKQorRlRfVFJBQ0VfREVGKCBvdHZtb2R1bGUgKQogCiAgIC8qIFRydWVUeXBlR1gvQUFUIHZhbGlkYXRpb24gY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBneHZtb2R1bGUgKQorRlRfVFJBQ0VfREVGKCBneHZic2xuICkKIEZUX1RSQUNFX0RFRiggZ3h2Y29tbW9uICkKIEZUX1RSQUNFX0RFRiggZ3h2ZmVhdCApCi1GVF9UUkFDRV9ERUYoIGd4dm1vcnQgKQotRlRfVFJBQ0VfREVGKCBneHZtb3J4ICkKLUZUX1RSQUNFX0RFRiggZ3h2YnNsbiApCiBGVF9UUkFDRV9ERUYoIGd4dmp1c3QgKQogRlRfVFJBQ0VfREVGKCBneHZrZXJuICkKLUZUX1RSQUNFX0RFRiggZ3h2b3BiZCApCi1GVF9UUkFDRV9ERUYoIGd4dnRyYWsgKQotRlRfVFJBQ0VfREVGKCBneHZwcm9wICkKK0ZUX1RSQUNFX0RFRiggZ3h2bW9kdWxlICkKK0ZUX1RSQUNFX0RFRiggZ3h2bW9ydCApCitGVF9UUkFDRV9ERUYoIGd4dm1vcnggKQogRlRfVFJBQ0VfREVGKCBneHZsY2FyICkKK0ZUX1RSQUNFX0RFRiggZ3h2b3BiZCApCitGVF9UUkFDRV9ERUYoIGd4dnByb3AgKQorRlRfVFJBQ0VfREVGKCBneHZ0cmFrICkKIAogICAvKiBhdXRvZml0IGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggYWZtb2R1bGUgKQotRlRfVFJBQ0VfREVGKCBhZmhpbnRzICkKIEZUX1RSQUNFX0RFRiggYWZjamsgKQorRlRfVFJBQ0VfREVGKCBhZmdsb2JhbCApCitGVF9UUkFDRV9ERUYoIGFmaGludHMgKQorRlRfVFJBQ0VfREVGKCBhZm1vZHVsZSApCiBGVF9UUkFDRV9ERUYoIGFmbGF0aW4gKQogRlRfVFJBQ0VfREVGKCBhZmxhdGluMiApCi1GVF9UUkFDRV9ERUYoIGFmd2FycCApCiBGVF9UUkFDRV9ERUYoIGFmc2hhcGVyICkKLUZUX1RSQUNFX0RFRiggYWZnbG9iYWwgKQorRlRfVFJBQ0VfREVGKCBhZndhcnAgKQogCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmgKaW5kZXggY2FkNDdhNS4uYTViYzZjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmgKQEAgLTEsMjcgKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dmFsaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB2YWxpZGF0aW9uIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0dmFsaWQuaAorICoKKyAqICAgRnJlZVR5cGUgdmFsaWRhdGlvbiBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRWQUxJRF9IXwogI2RlZmluZSBGVFZBTElEX0hfCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgIC8qIGZvciBmdF9zZXRqbXAgYW5kIGZ0X2xvbmdqbXAgKi8KKyNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0ggICAvKiBmb3IgZnRfam1wYnVmICovCiAKKyNpbmNsdWRlICJjb21waWxlci1tYWNyb3MuaCIKIAogRlRfQkVHSU5fSEVBREVSCiAKQEAgLTQyLDMxICs0MywzMSBAQAogICB0eXBlZGVmIHN0cnVjdCBGVF9WYWxpZGF0b3JSZWNfIHZvbGF0aWxlKiAgRlRfVmFsaWRhdG9yOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgdGhyZWUgZGlzdGluY3QgdmFsaWRhdGlvbiBsZXZlbHMgZGVmaW5lZCBoZXJlOiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX1ZBTElEQVRFX0RFRkFVTFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgdGFibGUgdGhhdCBwYXNzZXMgdGhpcyB2YWxpZGF0aW9uIGxldmVsIGNhbiBiZSB1c2VkIHJlbGlhYmx5IGJ5ICAgKi8KLSAgLyogICBGcmVlVHlwZS4gIEl0IGdlbmVyYWxseSBtZWFucyB0aGF0IGFsbCBvZmZzZXRzIGhhdmUgYmVlbiBjaGVja2VkIHRvICovCi0gIC8qICAgcHJldmVudCBvdXQtb2YtYm91bmQgcmVhZHMsIHRoYXQgYXJyYXkgY291bnRzIGFyZSBjb3JyZWN0LCBldGMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfVElHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYW5kICAqLwotICAvKiAgIGRvZXNuJ3QgY29udGFpbiBpbnZhbGlkIGRhdGEuICBGb3IgZXhhbXBsZSwgYSBjaGFybWFwIHRhYmxlIHRoYXQgICAgKi8KLSAgLyogICByZXR1cm5zIGludmFsaWQgZ2x5cGggaW5kaWNlcyB3aWxsIG5vdCBwYXNzLCBldmVuIHRob3VnaCBpdCBjYW4gICAgICovCi0gIC8qICAgYmUgdXNlZCB3aXRoIEZyZWVUeXBlIGluIGRlZmF1bHQgbW9kZSAodGhlIGxpYnJhcnkgd2lsbCBzaW1wbHkgICAgICAqLwotICAvKiAgIHJldHVybiBhbiBlcnJvciBsYXRlciB3aGVuIHRyeWluZyB0byBsb2FkIHRoZSBnbHlwaCkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSXQgYWxzbyBjaGVja3MgdGhhdCBmaWVsZHMgd2hpY2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIsIDQsIG9yIDgsICAqLwotICAvKiAgIGRvbid0IGhhdmUgaW5jb3JyZWN0IHZhbHVlcywgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX1ZBTElEQVRFX1BBUkFOT0lEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZm9yIGZvbnQgZGVidWdnaW5nLiAgQ2hlY2tzIHRoYXQgYSB0YWJsZSBmb2xsb3dzIHRoZSAgICAgICAgICAgKi8KLSAgLyogICBzcGVjaWZpY2F0aW9uIGJ5IDEwMCUuICBWZXJ5IGZldyBmb250cyB3aWxsIGJlIGFibGUgdG8gcGFzcyB0aGlzICAgICovCi0gIC8qICAgbGV2ZWwgYW55d2F5IGJ1dCBpdCBjYW4gYmUgdXNlZnVsIGZvciBjZXJ0YWluIHRvb2xzIGxpa2UgZm9udCAgICAgICAqLwotICAvKiAgIGVkaXRvcnMvY29udmVydGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGVyZSBhcmUgdGhyZWUgZGlzdGluY3QgdmFsaWRhdGlvbiBsZXZlbHMgZGVmaW5lZCBoZXJlOgorICAgKgorICAgKiBGVF9WQUxJREFURV9ERUZBVUxUIDo6CisgICAqICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYnkKKyAgICogICBGcmVlVHlwZS4gIEl0IGdlbmVyYWxseSBtZWFucyB0aGF0IGFsbCBvZmZzZXRzIGhhdmUgYmVlbiBjaGVja2VkIHRvCisgICAqICAgcHJldmVudCBvdXQtb2YtYm91bmQgcmVhZHMsIHRoYXQgYXJyYXkgY291bnRzIGFyZSBjb3JyZWN0LCBldGMuCisgICAqCisgICAqIEZUX1ZBTElEQVRFX1RJR0hUIDo6CisgICAqICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYW5kCisgICAqICAgZG9lc24ndCBjb250YWluIGludmFsaWQgZGF0YS4gIEZvciBleGFtcGxlLCBhIGNoYXJtYXAgdGFibGUgdGhhdAorICAgKiAgIHJldHVybnMgaW52YWxpZCBnbHlwaCBpbmRpY2VzIHdpbGwgbm90IHBhc3MsIGV2ZW4gdGhvdWdoIGl0IGNhbiBiZQorICAgKiAgIHVzZWQgd2l0aCBGcmVlVHlwZSBpbiBkZWZhdWx0IG1vZGUgKHRoZSBsaWJyYXJ5IHdpbGwgc2ltcGx5IHJldHVybiBhbgorICAgKiAgIGVycm9yIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlIGdseXBoKS4KKyAgICoKKyAgICogICBJdCBhbHNvIGNoZWNrcyB0aGF0IGZpZWxkcyB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiwgNCwgb3IgOCwKKyAgICogICBkb24ndCBoYXZlIGluY29ycmVjdCB2YWx1ZXMsIGV0Yy4KKyAgICoKKyAgICogRlRfVkFMSURBVEVfUEFSQU5PSUQgOjoKKyAgICogICBPbmx5IGZvciBmb250IGRlYnVnZ2luZy4gIENoZWNrcyB0aGF0IGEgdGFibGUgZm9sbG93cyB0aGUKKyAgICogICBzcGVjaWZpY2F0aW9uIGJ5IDEwMCUuICBWZXJ5IGZldyBmb250cyB3aWxsIGJlIGFibGUgdG8gcGFzcyB0aGlzIGxldmVsCisgICAqICAgYW55d2F5IGJ1dCBpdCBjYW4gYmUgdXNlZnVsIGZvciBjZXJ0YWluIHRvb2xzIGxpa2UgZm9udAorICAgKiAgIGVkaXRvcnMvY29udmVydGVycy4KKyAgICovCiAgIHR5cGVkZWYgZW51bSAgRlRfVmFsaWRhdGlvbkxldmVsXwogICB7CiAgICAgRlRfVkFMSURBVEVfREVGQVVMVCA9IDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTQ2ZTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaW50ZXJuYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVybmFsIGhlYWRlciBmaWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgYGZ0MmJ1aWxkLmgnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvIG5vdCBpbmNsdWRlIGl0IG1hbnVhbGx5ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0ggICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QSUNfSCAgICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1NUUkVBTV9IICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfTUVNT1JZX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfQ0FMQ19IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfSEFTSF9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfRFJJVkVSX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UUkFDRV9IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0ggICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfU0VSVklDRV9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfUkZPUktfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0ggICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9IICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX1BST1BTX0ggICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0cHNwcm9wLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX0NGRl9UWVBFU19IICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvY2ZmdHlwZXMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfQ0ZGX09CSkVDVFNfVFlQRVNfSCAgIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaD4KLQotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICovCi0KLSAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBjb25zdGFudCcgaGVyZSAqLwotICAvKiBpbiBvcmRlciB0byBjb21waWxlIGNsZWFubHkgd2l0aCB0aGUgbWF4aW11bSBsZXZlbCBvZiB3YXJuaW5ncy4gICovCi0gIC8qIEluIHBhcnRpY3VsYXIsIHRoZSB3YXJuaW5nIGNvbXBsYWlucyBhYm91dCBzdHVmZiBsaWtlIGB3aGlsZSgwKScgKi8KLSAgLyogd2hpY2ggaXMgdmVyeSB1c2VmdWwgaW4gbWFjcm8gZGVmaW5pdGlvbnMuICBUaGVyZSBpcyBubyBiZW5lZml0ICAqLwotICAvKiBpbiBoYXZpbmcgaXQgZW5hYmxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTI3ICkKLQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgKaW5kZXggZjc3MzgwZC4uOGUwYTI2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaApAQCAtMSw0NCArMSw0MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzYXV4LmgKKyAqCisgKiAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMKKyAqICAgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0FVWF9IXwogI2RlZmluZSBQU0FVWF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfVFlQRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0ZGX09CSkVDVFNfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oPgogCiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zdFNjcmlwdCBtb2R1bGVzIGRyaXZlciBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBQb3N0U2NyaXB0IG1vZHVsZXMgZHJpdmVyIGNsYXNzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0RyaXZlclJlY18KICAgewogICAgIEZUX0RyaXZlclJlYyAgcm9vdDsKQEAgLTY0LDIzICs2MywyNyBAQAogICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBQU19UYWJsZV9GdW5jc1JlY18qICBQU19UYWJsZV9GdW5jczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1RhYmxlX0Z1bmNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hbmFnZSBQU19UYWJsZSBvYmplY3RzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX2luaXQgICAgOjogVXNlZCB0byBpbml0aWFsaXplIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfZG9uZSAgICA6OiBGaW5hbGl6ZXMgcmVzcC4gZGVzdHJveSBhIGdpdmVuIHRhYmxlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9hZGQgICAgIDo6IEFkZHMgYSBuZXcgb2JqZWN0IHRvIGEgdGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX3JlbGVhc2UgOjogUmVsZWFzZXMgdGFibGUgZGF0YSwgdGhlbiBmaW5hbGl6ZXMgaXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgUFNfVGFibGVfRnVuY3NSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIG1hbmFnZSBQU19UYWJsZSBvYmplY3RzLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHRhYmxlX2luaXQgOjoKKyAgICogICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhIHRhYmxlLgorICAgKgorICAgKiAgIHRhYmxlX2RvbmUgOjoKKyAgICogICAgIEZpbmFsaXplcyByZXNwLiBkZXN0cm95IGEgZ2l2ZW4gdGFibGUuCisgICAqCisgICAqICAgdGFibGVfYWRkIDo6CisgICAqICAgICBBZGRzIGEgbmV3IG9iamVjdCB0byBhIHRhYmxlLgorICAgKgorICAgKiAgIHRhYmxlX3JlbGVhc2UgOjoKKyAgICogICAgIFJlbGVhc2VzIHRhYmxlIGRhdGEsIHRoZW4gZmluYWxpemVzIGl0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1RhYmxlX0Z1bmNzUmVjXwogICB7CiAgICAgRlRfRXJyb3IKQEAgLTkyLDEwICs5NSwxMCBAQAogICAgICgqZG9uZSkoIFBTX1RhYmxlICB0YWJsZSApOwogCiAgICAgRlRfRXJyb3IKLSAgICAoKmFkZCkoIFBTX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHgsCi0gICAgICAgICAgICB2b2lkKiAgICAgb2JqZWN0LAotICAgICAgICAgICAgRlRfVUludCAgIGxlbmd0aCApOworICAgICgqYWRkKSggUFNfVGFibGUgICAgIHRhYmxlLAorICAgICAgICAgICAgRlRfSW50ICAgICAgIGlkeCwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqICBvYmplY3QsCisgICAgICAgICAgICBGVF9VSW50ICAgICAgbGVuZ3RoICk7CiAKICAgICB2b2lkCiAgICAgKCpyZWxlYXNlKSggUFNfVGFibGUgIHRhYmxlICk7CkBAIC0xMDMsNDEgKzEwNiw0NyBAQAogICB9IFBTX1RhYmxlX0Z1bmNzUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBQU19UYWJsZSBpcyBhIHNpbXBsZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBhcnJheSBvZiBvYmplY3RzIGluICovCi0gIC8qICAgIGEgc2luZ2xlIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgICA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIGdyb3doZWFwJ3MgYmxvY2suICBUaGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgY2FuIGNoYW5nZSBiZXR3ZWVuIHR3byBvYmplY3QgYWRkcywgZHVlIHRvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHJlYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJzb3IgICAgOjogVGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBncm93IGhlYXAgd2l0aGluIGl0cyBibG9jay4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcGFjaXR5ICA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBoZWFwIGJsb2NrLiAgSW5jcmVtZW50cyBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgMWtCeXRlIGNodW5rcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXQgICAgICA6OiBTZXQgdG8gMHhERUFEQkVFRiBpZiBgZWxlbWVudHMnIGFuZCBgbGVuZ3RocycgaGF2ZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYmVlbiBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9lbGVtcyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2VsZW1zIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cyAgOjogQSB0YWJsZSBvZiBlbGVtZW50IGFkZHJlc3NlcyB3aXRoaW4gdGhlIGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aHMgICA6OiBBIHRhYmxlIG9mIGVsZW1lbnQgc2l6ZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgIDo6IFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAoYWxsb2MvcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgICAgIDo6IEEgdGFibGUgb2YgbWV0aG9kIHBvaW50ZXJzIGZvciB0aGlzIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBQU19UYWJsZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBQU19UYWJsZSBpcyBhIHNpbXBsZSBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBhcnJheSBvZiBvYmplY3RzIGluIGEKKyAgICogICBzaW5nbGUgbWVtb3J5IGJsb2NrLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGJsb2NrIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIGdyb3doZWFwJ3MgYmxvY2suICBUaGlzIGNhbiBjaGFuZ2UKKyAgICogICAgIGJldHdlZW4gdHdvIG9iamVjdCBhZGRzLCBkdWUgdG8gcmVhbGxvY2F0aW9uLgorICAgKgorICAgKiAgIGN1cnNvciA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgdG9wIG9mIHRoZSBncm93IGhlYXAgd2l0aGluIGl0cyBibG9jay4KKyAgICoKKyAgICogICBjYXBhY2l0eSA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcCBibG9jay4gIEluY3JlbWVudHMgYnkgMWtCeXRlIGNodW5rcy4KKyAgICoKKyAgICogICBpbml0IDo6CisgICAqICAgICBTZXQgdG8gMHhERUFEQkVFRiBpZiAnZWxlbWVudHMnIGFuZCAnbGVuZ3RocycgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKyAgICoKKyAgICogICBtYXhfZWxlbXMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZS4KKyAgICoKKyAgICogICBudW1fZWxlbXMgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZS4KKyAgICoKKyAgICogICBlbGVtZW50cyA6OgorICAgKiAgICAgQSB0YWJsZSBvZiBlbGVtZW50IGFkZHJlc3NlcyB3aXRoaW4gdGhlIGJsb2NrLgorICAgKgorICAgKiAgIGxlbmd0aHMgOjoKKyAgICogICAgIEEgdGFibGUgb2YgZWxlbWVudCBzaXplcyB3aXRoaW4gdGhlIGJsb2NrLgorICAgKgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgVGhlIG9iamVjdCB1c2VkIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAoYWxsb2MvcmVhbGxvYykuCisgICAqCisgICAqICAgZnVuY3MgOjoKKyAgICogICAgIEEgdGFibGUgb2YgbWV0aG9kIHBvaW50ZXJzIGZvciB0aGlzIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBQU19UYWJsZVJlY18KICAgewogICAgIEZUX0J5dGUqICAgICAgICAgICBibG9jazsgICAgICAgICAgLyogY3VycmVudCBtZW1vcnkgYmxvY2sgICAgICAgICAgICovCkBAIC00MjUsMjcgKzQzNCwzMyBAQAogICB9IFBTX1BhcnNlcl9GdW5jc1JlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1BhcnNlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgUFNfUGFyc2VyIGlzIGFuIG9iamVjdCB1c2VkIHRvIHBhcnNlIGEgVHlwZSAxIGZvbnQgdmVyeSBxdWlja2x5LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnNvciA6OiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgIDo6IFN0YXJ0IG9mIHRoZSBwcm9jZXNzZWQgdGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW1pdCAgOjogRW5kIG9mIHRoZSBwcm9jZXNzZWQgdGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVycm9yICA6OiBUaGUgbGFzdCBlcnJvciByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKGFsbG9jL3JlYWxsb2MpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jcyAgOjogQSB0YWJsZSBvZiBmdW5jdGlvbnMgZm9yIHRoZSBwYXJzZXIuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFBTX1BhcnNlclJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBQU19QYXJzZXIgaXMgYW4gb2JqZWN0IHVzZWQgdG8gcGFyc2UgYSBUeXBlIDEgZm9udCB2ZXJ5IHF1aWNrbHkuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgY3Vyc29yIDo6CisgICAqICAgICBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdGV4dC4KKyAgICoKKyAgICogICBiYXNlIDo6CisgICAqICAgICBTdGFydCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuCisgICAqCisgICAqICAgbGltaXQgOjoKKyAgICogICAgIEVuZCBvZiB0aGUgcHJvY2Vzc2VkIHRleHQuCisgICAqCisgICAqICAgZXJyb3IgOjoKKyAgICogICAgIFRoZSBsYXN0IGVycm9yIHJldHVybmVkLgorICAgKgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgVGhlIG9iamVjdCB1c2VkIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAoYWxsb2MvcmVhbGxvYykuCisgICAqCisgICAqICAgZnVuY3MgOjoKKyAgICogICAgIEEgdGFibGUgb2YgZnVuY3Rpb25zIGZvciB0aGUgcGFyc2VyLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1BhcnNlclJlY18KICAgewogICAgIEZUX0J5dGUqICAgY3Vyc29yOwpAQCAtNDg0LDUxICs0OTksNjcgQEAKICAgfSBQU19CdWlsZGVyX0Z1bmNzUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfQnVpbGRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgIDo6IFhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgOjogVGhlIGJhc2UgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3ggICAgICAgIDo6IFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeSAgICAgICAgOjogVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfYmVhcmluZyA6OiBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhfYmVndW4gICA6OiBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSBuZXcgcGF0aCBoYXMgYmVndW4uICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9wb2ludHMgIDo6IElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBubyBwb2ludHMgYXJlIGxvYWRlZC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub19yZWN1cnNlICAgOjogU2V0IGJ1dCBub3QgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3Nfb25seSA6OiBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCwgbm90IGxvYWQgYWxsIG9mIGl0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpc190MSAgICAgICAgOjogU2V0IGlmIGN1cnJlbnQgZm9udCB0eXBlIGlzIFR5cGUgMS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICAgICA6OiBBbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIGJ1aWxkZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgUFNfQnVpbGRlcgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LgorICAgKgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGdseXBoIDo6CisgICAqICAgICBUaGUgY3VycmVudCBnbHlwaCBzbG90LgorICAgKgorICAgKiAgIGxvYWRlciA6OgorICAgKiAgICAgWFhYCisgICAqCisgICAqICAgYmFzZSA6OgorICAgKiAgICAgVGhlIGJhc2UgZ2x5cGggb3V0bGluZS4KKyAgICoKKyAgICogICBjdXJyZW50IDo6CisgICAqICAgICBUaGUgY3VycmVudCBnbHlwaCBvdXRsaW5lLgorICAgKgorICAgKiAgIHBvc194IDo6CisgICAqICAgICBUaGUgaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4KKyAgICoKKyAgICogICBwb3NfeSA6OgorICAgKiAgICAgVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLgorICAgKgorICAgKiAgIGxlZnRfYmVhcmluZyA6OgorICAgKiAgICAgVGhlIGxlZnQgc2lkZSBiZWFyaW5nIHBvaW50LgorICAgKgorICAgKiAgIGFkdmFuY2UgOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIGFkdmFuY2UgdmVjdG9yLgorICAgKgorICAgKiAgIGJib3ggOjoKKyAgICogICAgIFVudXNlZC4KKyAgICoKKyAgICogICBwYXRoX2JlZ3VuIDo6CisgICAqICAgICBBIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRoYXQgYSBuZXcgcGF0aCBoYXMgYmVndW4uCisgICAqCisgICAqICAgbG9hZF9wb2ludHMgOjoKKyAgICogICAgIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBubyBwb2ludHMgYXJlIGxvYWRlZC4KKyAgICoKKyAgICogICBub19yZWN1cnNlIDo6CisgICAqICAgICBTZXQgYnV0IG5vdCB1c2VkLgorICAgKgorICAgKiAgIG1ldHJpY3Nfb25seSA6OgorICAgKiAgICAgQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSB0aGUgbWV0cmljcyBvZiBhCisgICAqICAgICBnaXZlbiBnbHlwaCwgbm90IGxvYWQgYWxsIG9mIGl0cyBwb2ludHMuCisgICAqCisgICAqICAgaXNfdDEgOjoKKyAgICogICAgIFNldCBpZiBjdXJyZW50IGZvbnQgdHlwZSBpcyBUeXBlIDEuCisgICAqCisgICAqICAgZnVuY3MgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgYnVpbGRlci4KKyAgICovCiAgIHN0cnVjdCAgUFNfQnVpbGRlcl8KICAgewogICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnk7CkBAIC03MjksNTQgKzc2MCw3MCBAQAogICB9IFQxX1BhcnNlU3RhdGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3R1cmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CdWlsZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQSBzdHJ1Y3R1cmUgdXNlZCBkdXJpbmcgZ2x5cGggbG9hZGluZyB0byBzdG9yZSBpdHMgb3V0bGluZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgICAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgICAgICAgOjogWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2UgICAgICAgICA6OiBUaGUgYmFzZSBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3VycmVudCAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfcG9pbnRzICAgOjogbWF4aW11bSBwb2ludHMgaW4gYnVpbGRlciBvdXRsaW5lICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9jb250b3VycyA6OiBNYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBidWlsZGVyIG91dGxpbmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3ggICAgICAgIDo6IFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeSAgICAgICAgOjogVGhlIHZlcnRpY2FsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfYmVhcmluZyA6OiBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcnNlX3N0YXRlICA6OiBBbiBlbnVtZXJhdGlvbiB3aGljaCBjb250cm9scyB0aGUgY2hhcnN0cmluZyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcGFyc2luZyBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfcG9pbnRzICA6OiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbm8gcG9pbnRzIGFyZSBsb2FkZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9fcmVjdXJzZSAgIDo6IFNldCBidXQgbm90IHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzX29ubHkgOjogQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRoZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGgsIG5vdCBsb2FkIGFsbCBvZiBpdHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnVuY3MgICAgICAgIDo6IEFuIGFycmF5IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGUgYnVpbGRlci4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUMV9CdWlsZGVyUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICAgQSBzdHJ1Y3R1cmUgdXNlZCBkdXJpbmcgZ2x5cGggbG9hZGluZyB0byBzdG9yZSBpdHMgb3V0bGluZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuCisgICAqCisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgZ2x5cGggOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIHNsb3QuCisgICAqCisgICAqICAgbG9hZGVyIDo6CisgICAqICAgICBYWFgKKyAgICoKKyAgICogICBiYXNlIDo6CisgICAqICAgICBUaGUgYmFzZSBnbHlwaCBvdXRsaW5lLgorICAgKgorICAgKiAgIGN1cnJlbnQgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUuCisgICAqCisgICAqICAgbWF4X3BvaW50cyA6OgorICAgKiAgICAgbWF4aW11bSBwb2ludHMgaW4gYnVpbGRlciBvdXRsaW5lCisgICAqCisgICAqICAgbWF4X2NvbnRvdXJzIDo6CisgICAqICAgICBNYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBidWlsZGVyIG91dGxpbmUuCisgICAqCisgICAqICAgcG9zX3ggOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLgorICAgKgorICAgKiAgIHBvc195IDo6CisgICAqICAgICBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuCisgICAqCisgICAqICAgbGVmdF9iZWFyaW5nIDo6CisgICAqICAgICBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuCisgICAqCisgICAqICAgYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuCisgICAqCisgICAqICAgYmJveCA6OgorICAgKiAgICAgVW51c2VkLgorICAgKgorICAgKiAgIHBhcnNlX3N0YXRlIDo6CisgICAqICAgICBBbiBlbnVtZXJhdGlvbiB3aGljaCBjb250cm9scyB0aGUgY2hhcnN0cmluZyBwYXJzaW5nIHN0YXRlLgorICAgKgorICAgKiAgIGxvYWRfcG9pbnRzIDo6CisgICAqICAgICBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbm8gcG9pbnRzIGFyZSBsb2FkZWQuCisgICAqCisgICAqICAgbm9fcmVjdXJzZSA6OgorICAgKiAgICAgU2V0IGJ1dCBub3QgdXNlZC4KKyAgICoKKyAgICogICBtZXRyaWNzX29ubHkgOjoKKyAgICogICAgIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgdGhlIG1ldHJpY3Mgb2YgYQorICAgKiAgICAgZ2l2ZW4gZ2x5cGgsIG5vdCBsb2FkIGFsbCBvZiBpdHMgcG9pbnRzLgorICAgKgorICAgKiAgIGZ1bmNzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhlIGJ1aWxkZXIuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVDFfQnVpbGRlclJlY18KICAgewogICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnk7CkBAIC04MTcsMTkgKzg2NCwxOSBAQAogCiAjaWYgMAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX1NVQlJTX0NBTExTIGRldGFpbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBzdWItcm91dGluZSAgICovCi0gIC8qIGNhbGxzIGR1cmluZyBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUKKyAgICogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuCisgICAqLwogI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDgKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCi0gIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFQxX01BWF9DSEFSU1RSSU5HX09QRVJBTkRTIGlzIHRoZSBjaGFyc3RyaW5nIHN0YWNrJ3MgY2FwYWNpdHkuICBBCisgICAqIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuCisgICAqLwogI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDMyCiAKICNlbmRpZiAvKiAwICovCkBAIC05OTMsNTMgKzEwNDAsNzAgQEAKICAgfSBDRkZfQnVpbGRlcl9GdW5jc1JlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdHVyZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9CdWlsZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIHN0cnVjdHVyZSB1c2VkIGR1cmluZyBnbHlwaCBsb2FkaW5nIHRvIHN0b3JlIGl0cyBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggbG9hZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgICAgICAgICA6OiBUaGUgYmFzZSBnbHlwaCBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJyZW50ICAgICAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc194ICAgICAgICAgOjogVGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3kgICAgICAgICA6OiBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2JlYXJpbmcgIDo6IFRoZSBsZWZ0IHNpZGUgYmVhcmluZyBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgICAgICAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYXRoX2JlZ3VuICAgIDo6IEEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIG5ldyBwYXRoIGhhcyBiZWd1bi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfcG9pbnRzICAgOjogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9fcmVjdXJzZSAgICA6OiBTZXQgYnV0IG5vdCB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzX29ubHkgIDo6IEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoLCBub3QgbG9hZCBhbGwgb2YgaXRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludHNfZnVuY3MgICA6OiBBdXhpbGlhcnkgcG9pbnRlciBmb3IgaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50c19nbG9iYWxzIDo6IEF1eGlsaWFyeSBwb2ludGVyIGZvciBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICAgICAgOjogQSB0YWJsZSBvZiBtZXRob2QgcG9pbnRlcnMgZm9yIHRoaXMgb2JqZWN0LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgQ0ZGX0J1aWxkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgICBBIHN0cnVjdHVyZSB1c2VkIGR1cmluZyBnbHlwaCBsb2FkaW5nIHRvIHN0b3JlIGl0cyBvdXRsaW5lLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBnbHlwaCA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZ2x5cGggc2xvdC4KKyAgICoKKyAgICogICBsb2FkZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIGxvYWRlci4KKyAgICoKKyAgICogICBiYXNlIDo6CisgICAqICAgICBUaGUgYmFzZSBnbHlwaCBvdXRsaW5lLgorICAgKgorICAgKiAgIGN1cnJlbnQgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIG91dGxpbmUuCisgICAqCisgICAqICAgcG9zX3ggOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIHRyYW5zbGF0aW9uIChpZiBjb21wb3NpdGUgZ2x5cGgpLgorICAgKgorICAgKiAgIHBvc195IDo6CisgICAqICAgICBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuCisgICAqCisgICAqICAgbGVmdF9iZWFyaW5nIDo6CisgICAqICAgICBUaGUgbGVmdCBzaWRlIGJlYXJpbmcgcG9pbnQuCisgICAqCisgICAqICAgYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuCisgICAqCisgICAqICAgYmJveCA6OgorICAgKiAgICAgVW51c2VkLgorICAgKgorICAgKiAgIHBhdGhfYmVndW4gOjoKKyAgICogICAgIEEgZmxhZyB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIG5ldyBwYXRoIGhhcyBiZWd1bi4KKyAgICoKKyAgICogICBsb2FkX3BvaW50cyA6OgorICAgKiAgICAgSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIG5vIHBvaW50cyBhcmUgbG9hZGVkLgorICAgKgorICAgKiAgIG5vX3JlY3Vyc2UgOjoKKyAgICogICAgIFNldCBidXQgbm90IHVzZWQuCisgICAqCisgICAqICAgbWV0cmljc19vbmx5IDo6CisgICAqICAgICBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlIHRoZSBtZXRyaWNzIG9mIGEKKyAgICogICAgIGdpdmVuIGdseXBoLCBub3QgbG9hZCBhbGwgb2YgaXRzIHBvaW50cy4KKyAgICoKKyAgICogICBoaW50c19mdW5jcyA6OgorICAgKiAgICAgQXV4aWxpYXJ5IHBvaW50ZXIgZm9yIGhpbnRpbmcuCisgICAqCisgICAqICAgaGludHNfZ2xvYmFscyA6OgorICAgKiAgICAgQXV4aWxpYXJ5IHBvaW50ZXIgZm9yIGhpbnRpbmcuCisgICAqCisgICAqICAgZnVuY3MgOjoKKyAgICogICAgIEEgdGFibGUgb2YgbWV0aG9kIHBvaW50ZXJzIGZvciB0aGlzIG9iamVjdC4KKyAgICovCiAgIHN0cnVjdCAgQ0ZGX0J1aWxkZXJfCiAgIHsKICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5OwpAQCAtMTIxMSwyNSArMTI3NSwyNyBAQAogICB0eXBlZGVmIHN0cnVjdCBBRk1fU3RyZWFtUmVjXyogIEFGTV9TdHJlYW07CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBRk1fUGFyc2VyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBBRk1fUGFyc2VyIGlzIGEgcGFyc2VyIGZvciB0aGUgQUZNIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgICAgOjogVGhlIG9iamVjdCB1c2VkIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAoYWxsb2MgYW5kICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHJlYWxsb2MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgOjogVGhpcyBpcyBhbiBvcGFxdWUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvbnRJbmZvICA6OiBUaGUgcmVzdWx0IHdpbGwgYmUgc3RvcmVkIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2luZGV4IDo6IEEgdXNlciBwcm92aWRlZCBmdW5jdGlvbiB0byBnZXQgYSBnbHlwaCBpbmRleCBieSBpdHMgICovCi0gIC8qICAgICAgICAgICAgICAgICBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgQUZNX1BhcnNlclJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQW4gQUZNX1BhcnNlciBpcyBhIHBhcnNlciBmb3IgdGhlIEFGTSBmaWxlcy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIFRoZSBvYmplY3QgdXNlZCBmb3IgbWVtb3J5IG9wZXJhdGlvbnMgKGFsbG9jIGFuZCByZWFsbG9jKS4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoaXMgaXMgYW4gb3BhcXVlIG9iamVjdC4KKyAgICoKKyAgICogICBGb250SW5mbyA6OgorICAgKiAgICAgVGhlIHJlc3VsdCB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICAgKgorICAgKiAgIGdldF9pbmRleCA6OgorICAgKiAgICAgQSB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIGdldCBhIGdseXBoIGluZGV4IGJ5IGl0cyBuYW1lLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9QYXJzZXJSZWNfCiAgIHsKICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKaW5kZXggZDI5MzE0ZS4uNjYzZTlkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKQEAgLTEsMzAgKzEsMjkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGludHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbnRlcmZhY2UgdG8gUG9zdHNjcmlwdC1zcGVjaWZpYyAoVHlwZSAxIGFuZCBUeXBlIDIpIGhpbnRzICAgICAgICAgICAqLwotLyogICAgcmVjb3JkZXJzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgVGhlc2UgYXJlIHVzZWQgdG8gc3VwcG9ydCBuYXRpdmUgICAgKi8KLS8qICAgIFQxL1QyIGhpbnRzIGluIHRoZSBgdHlwZTEnLCBgY2lkJywgYW5kIGBjZmYnIGZvbnQgZHJpdmVycy4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNoaW50cy5oCisgKgorICogICBJbnRlcmZhY2UgdG8gUG9zdHNjcmlwdC1zcGVjaWZpYyAoVHlwZSAxIGFuZCBUeXBlIDIpIGhpbnRzCisgKiAgIHJlY29yZGVycyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gIFRoZXNlIGFyZSB1c2VkIHRvIHN1cHBvcnQgbmF0aXZlCisgKiAgIFQxL1QyIGhpbnRzIGluIHRoZSAndHlwZTEnLCAnY2lkJywgYW5kICdjZmYnIGZvbnQgZHJpdmVycy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNISU5UU19IXwogI2RlZmluZSBQU0hJTlRTX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdDF0YWJsZXMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTczLDcgKzcyLDcgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAdHlwZToKICAgICogICBUMV9IaW50cwpAQCAtODYsMTYgKzg1LDE2IEBACiAgICAqICAgQFQxX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZS4gIFJlY29yZGluZyBnbHlwaCBoaW50cyBpcyBub3JtYWxseQogICAgKiAgIGFjaGlldmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBzY2hlbWU6CiAgICAqCi0gICAqICAgLSBPcGVuIGEgbmV3IGhpbnQgcmVjb3JkaW5nIHNlc3Npb24gYnkgY2FsbGluZyB0aGUgYG9wZW4nIG1ldGhvZC4KKyAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSAnb3BlbicgbWV0aG9kLgogICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgogICAgKgogICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgICAgbWV0aG9kIChgc3RlbScsIGBzdGVtMycsIG9yIGByZXNldCcpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbworICAgKiAgICAgbWV0aG9kICgnc3RlbScsICdzdGVtMycsIG9yICdyZXNldCcpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBkbwogICAgKiAgICAgbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgogICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KKyAgICogICAtIENsb3NlIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSAnY2xvc2UnIG1ldGhvZC4gIEl0CisgICAqICAgICByZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhlIGhpbnRzIHdlcmUgaW52YWxpZCBvciBzb21ldGhpbmcgc3RyYW5nZQorICAgKiAgICAgaGFwcGVuZWQgKGUuZy4sIG1lbW9yeSBzaG9ydGFnZSkuCiAgICAqCiAgICAqICAgVGhlIGhpbnRzIGFjY3VtdWxhdGVkIGluIHRoZSBvYmplY3QgY2FuIGxhdGVyIGJlIHVzZWQgYnkgdGhlCiAgICAqICAgUG9zdFNjcmlwdCBoaW50ZXIuCkBAIC0xMDQsNyArMTAzLDcgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgVDFfSGludHNSZWNfKiAgVDFfSGludHM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHR5cGU6CiAgICAqICAgVDFfSGludHNfRnVuY3MKQEAgLTExNyw3ICsxMTYsNyBAQAogICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9IaW50c19GdW5jc1JlY18qICBUMV9IaW50c19GdW5jczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgVDFfSGludHNfT3BlbkZ1bmMKQEAgLTEzOSwxNCArMTM4LDE0IEBACiAgICgqVDFfSGludHNfT3BlbkZ1bmMpKCBUMV9IaW50cyAgaGludHMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgVDFfSGludHNfU2V0U3RlbUZ1bmMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDFfSGludHMgY2xhc3MgdXNlZCB0byByZWNvcmQgYSBuZXcgaG9yaXpvbnRhbCBvcgotICAgKiAgIHZlcnRpY2FsIHN0ZW0uICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUeXBlIDEgYGhzdGVtJyBhbmQgYHZzdGVtJworICAgKiAgIHZlcnRpY2FsIHN0ZW0uICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBUeXBlIDEgJ2hzdGVtJyBhbmQgJ3ZzdGVtJwogICAgKiAgIG9wZXJhdG9ycy4KICAgICoKICAgICogQGlucHV0OgpAQCAtMTY0LDE1ICsxNjMsMTUgQEAKICAgICogICBVc2UgdmVydGljYWwgY29vcmRpbmF0ZXMgKHkpIGZvciBob3Jpem9udGFsIHN0ZW1zIChkaW09MCkuICBVc2UKICAgICogICBob3Jpem9udGFsIGNvb3JkaW5hdGVzICh4KSBmb3IgdmVydGljYWwgc3RlbXMgKGRpbT0xKS4KICAgICoKLSAgICogICBgY29vcmRzWzBdJyBpcyB0aGUgYWJzb2x1dGUgc3RlbSBwb3NpdGlvbiAobG93ZXN0IGNvb3JkaW5hdGUpOwotICAgKiAgIGBjb29yZHNbMV0nIGlzIHRoZSBsZW5ndGguCisgICAqICAgJ2Nvb3Jkc1swXScgaXMgdGhlIGFic29sdXRlIHN0ZW0gcG9zaXRpb24gKGxvd2VzdCBjb29yZGluYXRlKTsKKyAgICogICAnY29vcmRzWzFdJyBpcyB0aGUgbGVuZ3RoLgogICAgKgogICAgKiAgIFRoZSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvcgotICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgYGdob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQorICAgKiAgIC0yMS4gIEl0IGlzIGludGVycHJldGVkIGFzIGEgJ2dob3N0JyBzdGVtLCBhY2NvcmRpbmcgdG8gdGhlIFR5cGUgMQogICAgKiAgIHNwZWNpZmljYXRpb24uCiAgICAqCi0gICAqICAgSWYgdGhlIGxlbmd0aCBpcyAtMjEgKGNvcnJlc3BvbmRpbmcgdG8gYSBib3R0b20gZ2hvc3Qgc3RlbSksIHRoZW4KLSAgICogICB0aGUgcmVhbCBzdGVtIHBvc2l0aW9uIGlzIGBjb29yZHNbMF0rY29vcmRzWzFdJy4KKyAgICogICBJZiB0aGUgbGVuZ3RoIGlzIC0yMSAoY29ycmVzcG9uZGluZyB0byBhIGJvdHRvbSBnaG9zdCBzdGVtKSwgdGhlbiB0aGUKKyAgICogICByZWFsIHN0ZW0gcG9zaXRpb24gaXMgJ2Nvb3Jkc1swXStjb29yZHNbMV0nLgogICAgKgogICAgKi8KICAgdHlwZWRlZiB2b2lkCkBAIC0xODEsNyArMTgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIFQxX0hpbnRzX1NldFN0ZW0zRnVuYwpAQCAtMjE1LDcgKzIxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgVDFfSGludHNfUmVzZXRGdW5jCkBAIC0yMzgsNyArMjM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZW5kX3BvaW50ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIFQxX0hpbnRzX0Nsb3NlRnVuYwpAQCAtMjY3LDcgKzI2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdHlwZToKICAgICogICBUMV9IaW50c19BcHBseUZ1bmMKQEAgLTI5Nyw3ICsyOTYsNyBAQAogICAgKiAgIE9uIGlucHV0LCBhbGwgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZSBhcmUgaW4gZm9udCBjb29yZGluYXRlcy4gT24KICAgICogICBvdXRwdXQsIHRoZXkgYXJlIGluIDEvNjR0aCBvZiBwaXhlbHMuCiAgICAqCi0gICAqICAgVGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgYGdsb2JhbHMnIG9iamVjdCB3aGljaAorICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlICdnbG9iYWxzJyBvYmplY3Qgd2hpY2gKICAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCBhcyB0aGUgZ2x5cGguCiAgICAqCiAgICAqLwpAQCAtMzA4LDcgKzMwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBzdHJ1Y3Q6CiAgICAqICAgVDFfSGludHNfRnVuY3NSZWMKQEAgLTM2MCw3ICszNTksNyBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEB0eXBlOgogICAgKiAgIFQyX0hpbnRzCkBAIC0zNzMsMTYgKzM3MiwxNiBAQAogICAgKiAgIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUuICBSZWNvcmRpbmcgZ2x5cGggaGludHMgaXMgbm9ybWFsbHkKICAgICogICBhY2hpZXZlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgogICAgKgotICAgKiAgIC0gT3BlbiBhIG5ldyBoaW50IHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBvcGVuJyBtZXRob2QuCisgICAqICAgLSBPcGVuIGEgbmV3IGhpbnQgcmVjb3JkaW5nIHNlc3Npb24gYnkgY2FsbGluZyB0aGUgJ29wZW4nIG1ldGhvZC4KICAgICogICAgIFRoaXMgcmV3aW5kcyB0aGUgcmVjb3JkZXIgYW5kIHByZXBhcmUgaXQgZm9yIG5ldyBpbnB1dC4KICAgICoKICAgICogICAtIEZvciBlYWNoIGhpbnQgZm91bmQgaW4gdGhlIGdseXBoIGNoYXJzdHJpbmcsIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICogICAgIG1ldGhvZCAoYHN0ZW1zJywgYGhpbnRtYXNrJywgYGNvdW50ZXJzJykuICBOb3RlIHRoYXQgdGhlc2UKLSAgICogICAgIGZ1bmN0aW9ucyBkbyBub3QgcmV0dXJuIGFuIGVycm9yIGNvZGUuCisgICAqICAgICBtZXRob2QgKCdzdGVtcycsICdoaW50bWFzaycsICdjb3VudGVycycpLiAgTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucworICAgKiAgICAgZG8gbm90IHJldHVybiBhbiBlcnJvciBjb2RlLgogICAgKgotICAgKiAgIC0gQ2xvc2UgdGhlIHJlY29yZGluZyBzZXNzaW9uIGJ5IGNhbGxpbmcgdGhlIGBjbG9zZScgbWV0aG9kLiAgSXQKLSAgICogICAgIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiB0aGUgaGludHMgd2VyZSBpbnZhbGlkIG9yIHNvbWV0aGluZwotICAgKiAgICAgc3RyYW5nZSBoYXBwZW5lZCAoZS5nLiwgbWVtb3J5IHNob3J0YWdlKS4KKyAgICogICAtIENsb3NlIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSAnY2xvc2UnIG1ldGhvZC4gIEl0CisgICAqICAgICByZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhlIGhpbnRzIHdlcmUgaW52YWxpZCBvciBzb21ldGhpbmcgc3RyYW5nZQorICAgKiAgICAgaGFwcGVuZWQgKGUuZy4sIG1lbW9yeSBzaG9ydGFnZSkuCiAgICAqCiAgICAqICAgVGhlIGhpbnRzIGFjY3VtdWxhdGVkIGluIHRoZSBvYmplY3QgY2FuIGxhdGVyIGJlIHVzZWQgYnkgdGhlCiAgICAqICAgUG9zdHNjcmlwdCBoaW50ZXIuCkBAIC0zOTEsNyArMzkwLDcgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgVDJfSGludHNSZWNfKiAgVDJfSGludHM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQHR5cGU6CiAgICAqICAgVDJfSGludHNfRnVuY3MKQEAgLTQwNCw3ICs0MDMsNyBAQAogICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMl9IaW50c19GdW5jc1JlY18qICBUMl9IaW50c19GdW5jczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgVDJfSGludHNfT3BlbkZ1bmMKQEAgLTQyNiw3ICs0MjUsNyBAQAogICAoKlQyX0hpbnRzX09wZW5GdW5jKSggVDJfSGludHMgIGhpbnRzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0eXBlOgogICAgKiAgIFQyX0hpbnRzX1N0ZW1zRnVuYwpAQCAtNDM0LDcgKzQzMyw3IEBACiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQyX0hpbnRzIGNsYXNzIHVzZWQgdG8gc2V0IHRoZSB0YWJsZSBvZiBzdGVtcyBpbgogICAgKiAgIGVpdGhlciB0aGUgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBkaW1lbnNpb24uICBFcXVpdmFsZW50IHRvIHRoZQotICAgKiAgIGBoc3RlbScsIGB2c3RlbScsIGBoc3RlbWhtJywgYW5kIGB2c3RlbWhtJyBUeXBlIDIgb3BlcmF0b3JzLgorICAgKiAgICdoc3RlbScsICd2c3RlbScsICdoc3RlbWhtJywgYW5kICd2c3RlbWhtJyBUeXBlIDIgb3BlcmF0b3JzLgogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgaGludHMgOjoKQEAgLTQ0NywxOCArNDQ2LDE4IEBACiAgICAqICAgICBUaGUgbnVtYmVyIG9mIHN0ZW1zLgogICAgKgogICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgYGNvdW50JyAocG9zaXRpb24sbGVuZ3RoKSBwYWlycyBpbiAxNi4xNiBmb3JtYXQuCisgICAqICAgICBBbiBhcnJheSBvZiAnY291bnQnIChwb3NpdGlvbixsZW5ndGgpIHBhaXJzIGluIDE2LjE2IGZvcm1hdC4KICAgICoKICAgICogQG5vdGU6CiAgICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCiAgICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCiAgICAqCi0gICAqICAgVGhlcmUgYXJlIGAyKmNvdW50JyBlbGVtZW50cyBpbiB0aGUgYGNvb3JkcycgYXJyYXkuICBFYWNoIGV2ZW4KLSAgICogICBlbGVtZW50IGlzIGFuIGFic29sdXRlIHBvc2l0aW9uIGluIGZvbnQgdW5pdHMsIGVhY2ggb2RkIGVsZW1lbnQgaXMgYQotICAgKiAgIGxlbmd0aCBpbiBmb250IHVuaXRzLgorICAgKiAgIFRoZXJlIGFyZSAnMipjb3VudCcgZWxlbWVudHMgaW4gdGhlICdjb29yZHMnIGFycmF5LiAgRWFjaCBldmVuIGVsZW1lbnQKKyAgICogICBpcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBmb250IHVuaXRzLCBlYWNoIG9kZCBlbGVtZW50IGlzIGEgbGVuZ3RoIGluCisgICAqICAgZm9udCB1bml0cy4KICAgICoKLSAgICogICBBIGxlbmd0aCBjYW4gYmUgbmVnYXRpdmUsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBlaXRoZXIgLTIwIG9yCi0gICAqICAgLTIxLiAgSXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBgZ2hvc3QnIHN0ZW0sIGFjY29yZGluZyB0byB0aGUgVHlwZSAxCisgICAqICAgQSBsZW5ndGggY2FuIGJlIG5lZ2F0aXZlLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgZWl0aGVyIC0yMCBvciAtMjEuCisgICAqICAgSXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSAnZ2hvc3QnIHN0ZW0sIGFjY29yZGluZyB0byB0aGUgVHlwZSAxCiAgICAqICAgc3BlY2lmaWNhdGlvbi4KICAgICoKICAgICovCkBAIC00NjksMjIgKzQ2OCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRpbmF0ZXMgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3R5cGU6CiAgICAqICAgVDJfSGludHNfTWFza0Z1bmMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBoaW50bWFzayAodGhpcwotICAgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBgaGludG1hc2snIFR5cGUgMiBvcGVyYXRvcikuCisgICAqICAgY29ycmVzcG9uZHMgdG8gdGhlICdoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgIGhpbnRzIDo6CiAgICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgogICAgKgogICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGdseXBoIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IHRvIHdoaWNoIHRoZSBwcmV2aW91c2x5IGRlZmluZWQKLSAgICogICAgIG9yIGFjdGl2YXRlZCBoaW50cyBhcHBseS4KKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCB0byB3aGljaCB0aGUgcHJldmlvdXNseSBkZWZpbmVkIG9yCisgICAqICAgICBhY3RpdmF0ZWQgaGludHMgYXBwbHkuCiAgICAqCiAgICAqICAgYml0X2NvdW50IDo6CiAgICAqICAgICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGhpbnQgbWFzay4KQEAgLTQ5NCwxMyArNDkzLDEzIEBACiAgICAqCiAgICAqIEBub3RlOgogICAgKiAgIElmIHRoZSBoaW50bWFzayBzdGFydHMgdGhlIGNoYXJzdHJpbmcgKGJlZm9yZSBhbnkgZ2x5cGggcG9pbnQKLSAgICogICBkZWZpbml0aW9uKSwgdGhlIHZhbHVlIG9mIGBlbmRfcG9pbnQnIHNob3VsZCBiZSAwLgorICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludGAgc2hvdWxkIGJlIDAuCiAgICAqCi0gICAqICAgYGJpdF9jb3VudCcgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlIGBieXRlcycgYXJyYXk7IGl0CisgICAqICAgYGJpdF9jb3VudGAgaXMgdGhlIG51bWJlciBvZiBtZWFuaW5nZnVsIGJpdHMgaW4gdGhlICdieXRlcycgYXJyYXk7IGl0CiAgICAqICAgbXVzdCBiZSBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGhpbnRzIGRlZmluZWQgc28gZmFyIChpLmUuLAogICAgKiAgIGhvcml6b250YWwrdmVydGljYWxzKS4KICAgICoKLSAgICogICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKKyAgICogICBUaGUgJ2J5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKICAgICogICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCiAgICAqCiAgICAqLwpAQCAtNTExLDE0ICs1MTAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdHlwZToKICAgICogICBUMl9IaW50c19Db3VudGVyRnVuYwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGNvdW50ZXIgbWFzawotICAgKiAgICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBgaGludG1hc2snIFR5cGUgMiBvcGVyYXRvcikuCisgICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHNldCBhIGdpdmVuIGNvdW50ZXIgbWFzayAodGhpcworICAgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSAnaGludG1hc2snIFR5cGUgMiBvcGVyYXRvcikuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBoaW50cyA6OgpAQCAtNTM2LDEzICs1MzUsMTMgQEAKICAgICoKICAgICogQG5vdGU6CiAgICAqICAgSWYgdGhlIGhpbnRtYXNrIHN0YXJ0cyB0aGUgY2hhcnN0cmluZyAoYmVmb3JlIGFueSBnbHlwaCBwb2ludAotICAgKiAgIGRlZmluaXRpb24pLCB0aGUgdmFsdWUgb2YgYGVuZF9wb2ludCcgc2hvdWxkIGJlIDAuCisgICAqICAgZGVmaW5pdGlvbiksIHRoZSB2YWx1ZSBvZiBgZW5kX3BvaW50YCBzaG91bGQgYmUgMC4KICAgICoKLSAgICogICBgYml0X2NvdW50JyBpcyB0aGUgbnVtYmVyIG9mIG1lYW5pbmdmdWwgYml0cyBpbiB0aGUgYGJ5dGVzJyBhcnJheTsgaXQKKyAgICogICBgYml0X2NvdW50YCBpcyB0aGUgbnVtYmVyIG9mIG1lYW5pbmdmdWwgYml0cyBpbiB0aGUgJ2J5dGVzJyBhcnJheTsgaXQKICAgICogICBtdXN0IGJlIGVxdWFsIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgaGludHMgZGVmaW5lZCBzbyBmYXIgKGkuZS4sCiAgICAqICAgaG9yaXpvbnRhbCt2ZXJ0aWNhbHMpLgogICAgKgotICAgKiAgICBUaGUgYGJ5dGVzJyBhcnJheSBjYW4gY29tZSBkaXJlY3RseSBmcm9tIHRoZSBUeXBlIDIgY2hhcnN0cmluZyBhbmQKKyAgICogICAgVGhlICdieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCiAgICAqICAgIHJlc3BlY3RzIHRoZSBzYW1lIGZvcm1hdC4KICAgICoKICAgICovCkBAIC01NTIsNyArNTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdHlwZToKICAgICogICBUMl9IaW50c19DbG9zZUZ1bmMKQEAgLTU4MSwxNSArNTgwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBmdW5jdHlwZToKICAgICogICBUMl9IaW50c19BcHBseUZ1bmMKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBhcHBseSBoaW50cyB0byB0aGUKLSAgICogICBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuICBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYGNsb3NlJwotICAgKiAgIG1ldGhvZC4KKyAgICogICBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuICBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgJ2Nsb3NlJyBtZXRob2QuCiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICBoaW50cyA6OgpAQCAtNjExLDcgKzYwOSw3IEBACiAgICAqICAgT24gaW5wdXQsIGFsbCBwb2ludHMgd2l0aGluIHRoZSBvdXRsaW5lIGFyZSBpbiBmb250IGNvb3JkaW5hdGVzLiBPbgogICAgKiAgIG91dHB1dCwgdGhleSBhcmUgaW4gMS82NHRoIG9mIHBpeGVscy4KICAgICoKLSAgICogICBUaGUgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSBgZ2xvYmFscycgb2JqZWN0IHdoaWNoCisgICAqICAgVGhlIHNjYWxpbmcgdHJhbnNmb3JtYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUgJ2dsb2JhbHMnIG9iamVjdCB3aGljaAogICAgKiAgIG11c3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZSBmb250IHRoYW4gdGhlIGdseXBoLgogICAgKgogICAgKi8KQEAgLTYyMiw3ICs2MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAc3RydWN0OgogICAgKiAgIFQyX0hpbnRzX0Z1bmNzUmVjCkBAIC02ODAsOCArNjc4LDYgQEAKICAgdHlwZWRlZiBQU0hpbnRlcl9JbnRlcmZhY2UqICBQU0hpbnRlcl9TZXJ2aWNlOwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQogI2RlZmluZSBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKCAgICAgICAgXAogICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgXApAQCAtNjk0LDI1ICs2OTAsNiBAQAogICAgIGdldF90Ml9mdW5jc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9QU0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxzX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X3QxX2Z1bmNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfdDJfZnVuY3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hpbnRlcl9JbnRlcmZhY2UqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfZ2xvYmFsc19mdW5jcyA9IGdldF9nbG9iYWxzX2Z1bmNzXzsgICAgICAgICBcCi0gICAgY2xhenotPmdldF90MV9mdW5jcyAgICAgID0gZ2V0X3QxX2Z1bmNzXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3QyX2Z1bmNzICAgICAgPSBnZXRfdDJfZnVuY3NfOyAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwogCiBGVF9FTkRfSEVBREVSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaAppbmRleCA0YTllYzIwLi44MWY1YTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oCkBAIC0xLDI2ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIEJERiBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdmJkZi5oCisgKgorICogICBUaGUgRnJlZVR5cGUgQkRGIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgU1ZCREZfSF8KICNkZWZpbmUgU1ZCREZfSF8KIAotI2luY2x1ZGUgRlRfQkRGX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0YmRmLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC00Niw4ICs0Niw2IEBACiAgIH07CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCiAjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0JERlJlYyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaGFyc2V0X2lkXywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NiwyMCArNTQsNiBAQAogICAgIGdldF9jaGFyc2V0X2lkXywgZ2V0X3Byb3BlcnR5XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9CREZSZWMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhcnNldF9pZF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Byb3BlcnR5XyApICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX0JERlJlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfY2hhcnNldF9pZCA9IGdldF9jaGFyc2V0X2lkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3Byb3BlcnR5ICAgPSBnZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oCmluZGV4IGRiNjIzZTYuLjFkMmRiYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oCkBAIC0xLDI2ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmNmZnRsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIENGRiB0YWJsZXMgbG9hZGVyIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdmNmZnRsLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBDRkYgdGFibGVzIGxvYWRlciBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgU1ZDRkZUTF9IXwogI2RlZmluZSBTVkNGRlRMX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0ZGX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtNjUsOCArNjUsNiBAQAogICB9OwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQogI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9DRkZMT0FEUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RhbmRhcmRfZW5jb2RpbmdfLCAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX3ByaXZhdGVfZGljdF8sICAgICAgXApAQCAtODIsMjYgKzgwLDYgQEAKICAgICBibGVuZF9idWlsZF92ZWN0b3JfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9DRkZMT0FEUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3RhbmRhcmRfZW5jb2RpbmdfLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX3ByaXZhdGVfZGljdF8sICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZF9zZWxlY3RfZ2V0XywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9jaGVja192ZWN0b3JfLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9idWlsZF92ZWN0b3JfICkgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfQ0ZGTG9hZFJlYyogIGNsYXp6ICkgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfc3RhbmRhcmRfZW5jb2RpbmcgPSBnZXRfc3RhbmRhcmRfZW5jb2RpbmdfOyAgICAgXAotICAgIGNsYXp6LT5sb2FkX3ByaXZhdGVfZGljdCAgICAgPSBsb2FkX3ByaXZhdGVfZGljdF87ICAgICAgICAgXAotICAgIGNsYXp6LT5mZF9zZWxlY3RfZ2V0ICAgICAgICAgPSBmZF9zZWxlY3RfZ2V0XzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5ibGVuZF9jaGVja192ZWN0b3IgICAgPSBibGVuZF9jaGVja192ZWN0b3JfOyAgICAgICAgXAotICAgIGNsYXp6LT5ibGVuZF9idWlsZF92ZWN0b3IgICAgPSBibGVuZF9idWlsZF92ZWN0b3JfOyAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAKIEZUX0VORF9IRUFERVIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCmluZGV4IGNiNTlhYzYuLmJkNDlmMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmgKQEAgLTEsMjUgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Y2lkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgQ0lEIGZvbnQgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2Y2lkLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBDSUQgZm9udCBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMjAgYnkKKyAqIERlcmVrIENsZWdnIGFuZCBNaWNoYWVsIFRvZnRkYWwuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVkNJRF9IXwogI2RlZmluZSBTVkNJRF9IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTQ4LDggKzQ4LDYgQEAKICAgfTsKIAogCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQ0lEUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Jvc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pc19jaWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTU5LDI1ICs1Nyw2IEBACiAgICAgZ2V0X3Jvc18sIGdldF9pc19jaWRfLCBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yb3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXNfY2lkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyApICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9DSURSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfcm9zICAgICAgICAgICAgICAgICAgPSBnZXRfcm9zXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2lzX2NpZCAgICAgICAgICAgICAgID0gZ2V0X2lzX2NpZF87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9jaWRfZnJvbV9nbHlwaF9pbmRleCA9IGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF87ICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAgIC8qICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oCmluZGV4IDNiNzMyYmUuLjYxMTRkNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10LmgKQEAgLTEsMzQgKzEsMzQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Zm50Zm10LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZm9udCBmb3JtYXQgc2VydmljZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2Zm50Zm10LmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBmb250IGZvcm1hdCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVkZOVEZNVF9IXwogI2RlZmluZSBTVkZOVEZNVF9IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCiAgIC8qCi0gICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBvZiBhIGZhY2UncyBmb250IGRyaXZlciwKLSAgICogIGFjY29yZGluZyB0byB0aGUgWEZyZWU4NiBub21lbmNsYXR1cmUuICBOb3RlIHRoYXQgdGhlIHNlcnZpY2UgZGF0YQotICAgKiAgaXMgYSBzaW1wbGUgY29uc3RhbnQgc3RyaW5nIHBvaW50ZXIuCisgICAqIEEgdHJpdmlhbCBzZXJ2aWNlIHVzZWQgdG8gcmV0dXJuIHRoZSBuYW1lIG9mIGEgZmFjZSdzIGZvbnQgZHJpdmVyLAorICAgKiBhY2NvcmRpbmcgdG8gdGhlIFhGcmVlODYgbm9tZW5jbGF0dXJlLiAgTm90ZSB0aGF0IHRoZSBzZXJ2aWNlIGRhdGEgaXMgYQorICAgKiBzaW1wbGUgY29uc3RhbnQgc3RyaW5nIHBvaW50ZXIuCiAgICAqLwogCiAjZGVmaW5lIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQgICJmb250LWZvcm1hdCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaAppbmRleCBmMWE2OGUzLi5mOTQ0M2U0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0LmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oCkBAIC0xLDMzICsxLDMzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmdsZGljdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGRpY3Rpb25hcnkgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdmdsZGljdC5oCisgKgorICogICBUaGUgRnJlZVR5cGUgZ2x5cGggZGljdGlvbmFyeSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNWR0xESUNUX0hfCiAjZGVmaW5lIFNWR0xESUNUX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKICAgLyoKLSAgICogIEEgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIGdseXBoIG5hbWVzLCBhcyB3ZWxsIGFzIHRvIGZpbmQgdGhlCi0gICAqICBpbmRleCBvZiBhIGdpdmVuIGdseXBoIG5hbWUgaW4gYSBmb250LgorICAgKiBBIHNlcnZpY2UgdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcywgYXMgd2VsbCBhcyB0byBmaW5kIHRoZSBpbmRleCBvZgorICAgKiBhIGdpdmVuIGdseXBoIG5hbWUgaW4gYSBmb250LgogICAgKgogICAgKi8KIApAQCAtNDEsOCArNDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGJ1ZmZlcl9tYXggKTsKIAogICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICk7CisgICgqRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwogCiAKICAgRlRfREVGSU5FX1NFUlZJQ0UoIEdseXBoRGljdCApCkBAIC01Miw4ICs1Miw2IEBACiAgIH07CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCiAjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0dMWVBIRElDVFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfaW5kZXhfICkgICAgICAgICAgICAgICAgICBcCkBAIC02MiwyMyArNjAsNiBAQAogICAgIGdldF9uYW1lXywgbmFtZV9pbmRleF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfR0xZUEhESUNUUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9uYW1lXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9pbmRleF8gKSAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMqICBjbGF6eiApICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X25hbWUgICA9IGdldF9uYW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5uYW1lX2luZGV4ID0gbmFtZV9pbmRleF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCmluZGV4IGVkNzllYmUuLjgzYzJmMjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oCkBAIC0xLDM1ICsxLDM1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmd4dmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3ZneHZhbC5oCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNWR1hWQUxfSF8KICNkZWZpbmUgU1ZHWFZBTF9IXwogCi0jaW5jbHVkZSBGVF9HWF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRneHZhbC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCmluZGV4IGM3ZThmNmUuLjEzY2ZiMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaApAQCAtMSwyNiArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3ZrZXJuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBLZXJuaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3ZrZXJuLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBLZXJuaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVktFUk5fSF8KICNkZWZpbmUgU1ZLRVJOX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhYmxlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1ldHJpYy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1ldHJpYy5oCmluZGV4IGFiYWFjZGQuLjJiMzBlZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2bWV0cmljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgc2VydmljZXMgZm9yIG1ldHJpY3MgdmFyaWF0aW9ucyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2bWV0cmljLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBzZXJ2aWNlcyBmb3IgbWV0cmljcyB2YXJpYXRpb25zIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgU1ZNRVRSSUNfSF8KICNkZWZpbmUgU1ZNRVRSSUNfSF8KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAogICAvKgotICAgKiAgQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgYEhWQVIsIGBNVkFSJywgYW5kIGBWVkFSJyBPcGVuVHlwZSB0YWJsZXMuCisgICAqIEEgc2VydmljZSB0byBtYW5hZ2UgdGhlIGBIVkFSLCBgTVZBUicsIGFuZCBgVlZBUicgT3BlblR5cGUgdGFibGVzLgogICAgKgogICAgKi8KIApAQCAtOTMsOCArOTMsNiBAQAogICB9OwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQogI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9NRVRSSUNTVkFSSUFUSU9OU1JFQyggY2xhc3NfLCAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZHZhbmNlX2FkanVzdF8sICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2JfYWRqdXN0XywgICAgICAgXApAQCAtMTE2LDMyICsxMTQsNiBAQAogICAgIG1ldHJpY3NfYWRqdXN0XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9NRVRSSUNTVkFSSUFUSU9OU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhZHZhbmNlX2FkanVzdF8sICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2JfYWRqdXN0XywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNiX2FkanVzdF8sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhZHZhbmNlX2FkanVzdF8sICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c2JfYWRqdXN0XywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNiX2FkanVzdF8sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmdfYWRqdXN0XywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzX2FkanVzdF8gICkgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjKiAgY2xhenogKSBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5oYWR2YW5jZV9hZGp1c3QgPSBoYWR2YW5jZV9hZGp1c3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bHNiX2FkanVzdCAgICAgID0gbHNiX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJzYl9hZGp1c3QgICAgICA9IHJzYl9hZGp1c3RfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT52YWR2YW5jZV9hZGp1c3QgPSB2YWR2YW5jZV9hZGp1c3RfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dHNiX2FkanVzdCAgICAgID0gdHNiX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmJzYl9hZGp1c3QgICAgICA9IGJzYl9hZGp1c3RfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT52b3JnX2FkanVzdCAgICAgPSB2b3JnX2FkanVzdF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bWV0cmljc19hZGp1c3QgID0gbWV0cmljc19hZGp1c3RfOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCmluZGV4IGJjYmIzOGUuLjVhODA3NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oCkBAIC0xLDM0ICsxLDM0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdm1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhciBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdm1tLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVk1NX0hfCiAjZGVmaW5lIFNWTU1fSF8KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAogICAvKgotICAgKiAgQSBzZXJ2aWNlIHVzZWQgdG8gbWFuYWdlIG11bHRpcGxlLW1hc3RlcnMgZGF0YSBpbiBhIGdpdmVuIGZhY2UuCisgICAqIEEgc2VydmljZSB1c2VkIHRvIG1hbmFnZSBtdWx0aXBsZS1tYXN0ZXJzIGRhdGEgaW4gYSBnaXZlbiBmYWNlLgogICAgKgotICAgKiAgU2VlIHRoZSByZWxhdGVkIEFQSXMgaW4gYGZ0bW0uaCcgKEZUX01VTFRJUExFX01BU1RFUlNfSCkuCisgICAqIFNlZSB0aGUgcmVsYXRlZCBBUElzIGluIGBmdG1tLmgnIChGVF9NVUxUSVBMRV9NQVNURVJTX0gpLgogICAgKgogICAgKi8KIApAQCAtODYsODEgKzg2LDY1IEBACiAgIHR5cGVkZWYgdm9pZAogICAoKkZUX0RvbmVfQmxlbmRfRnVuYykoIEZUX0ZhY2UgKTsKIAorICB0eXBlZGVmIEZUX0Vycm9yCisgICgqRlRfU2V0X01NX1dlaWdodFZlY3Rvcl9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgd2VpZ2h0X3ZlY3RvciApOworCisgIHR5cGVkZWYgRlRfRXJyb3IKKyAgKCpGVF9HZXRfTU1fV2VpZ2h0VmVjdG9yX0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB3ZWlnaHRfdmVjdG9yICk7CisKIAogICBGVF9ERUZJTkVfU0VSVklDRSggTXVsdGlNYXN0ZXJzICkKICAgewotICAgIEZUX0dldF9NTV9GdW5jICAgICAgICAgIGdldF9tbTsKLSAgICBGVF9TZXRfTU1fRGVzaWduX0Z1bmMgICBzZXRfbW1fZGVzaWduOwotICAgIEZUX1NldF9NTV9CbGVuZF9GdW5jICAgIHNldF9tbV9ibGVuZDsKLSAgICBGVF9HZXRfTU1fQmxlbmRfRnVuYyAgICBnZXRfbW1fYmxlbmQ7Ci0gICAgRlRfR2V0X01NX1Zhcl9GdW5jICAgICAgZ2V0X21tX3ZhcjsKLSAgICBGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jICBzZXRfdmFyX2Rlc2lnbjsKLSAgICBGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jICBnZXRfdmFyX2Rlc2lnbjsKLSAgICBGVF9TZXRfSW5zdGFuY2VfRnVuYyAgICBzZXRfaW5zdGFuY2U7CisgICAgRlRfR2V0X01NX0Z1bmMgICAgICAgICAgICAgICBnZXRfbW07CisgICAgRlRfU2V0X01NX0Rlc2lnbl9GdW5jICAgICAgICBzZXRfbW1fZGVzaWduOworICAgIEZUX1NldF9NTV9CbGVuZF9GdW5jICAgICAgICAgc2V0X21tX2JsZW5kOworICAgIEZUX0dldF9NTV9CbGVuZF9GdW5jICAgICAgICAgZ2V0X21tX2JsZW5kOworICAgIEZUX0dldF9NTV9WYXJfRnVuYyAgICAgICAgICAgZ2V0X21tX3ZhcjsKKyAgICBGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jICAgICAgIHNldF92YXJfZGVzaWduOworICAgIEZUX0dldF9WYXJfRGVzaWduX0Z1bmMgICAgICAgZ2V0X3Zhcl9kZXNpZ247CisgICAgRlRfU2V0X0luc3RhbmNlX0Z1bmMgICAgICAgICBzZXRfaW5zdGFuY2U7CisgICAgRlRfU2V0X01NX1dlaWdodFZlY3Rvcl9GdW5jICBzZXRfbW1fd2VpZ2h0dmVjdG9yOworICAgIEZUX0dldF9NTV9XZWlnaHRWZWN0b3JfRnVuYyAgZ2V0X21tX3dlaWdodHZlY3RvcjsKIAogICAgIC8qIGZvciBpbnRlcm5hbCB1c2U7IG9ubHkgbmVlZGVkIGZvciBjb2RlIHNoYXJpbmcgYmV0d2VlbiBtb2R1bGVzICovCi0gICAgRlRfR2V0X1Zhcl9CbGVuZF9GdW5jICAgZ2V0X3Zhcl9ibGVuZDsKLSAgICBGVF9Eb25lX0JsZW5kX0Z1bmMgICAgICBkb25lX2JsZW5kOworICAgIEZUX0dldF9WYXJfQmxlbmRfRnVuYyAgZ2V0X3Zhcl9ibGVuZDsKKyAgICBGVF9Eb25lX0JsZW5kX0Z1bmMgICAgIGRvbmVfYmxlbmQ7CiAgIH07CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyggY2xhc3NfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2Rlc2lnbl8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2JsZW5kXywgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX2JsZW5kXywgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX3Zhcl8sICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Zhcl9kZXNpZ25fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Zhcl9kZXNpZ25fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2luc3RhbmNlXywgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Zhcl9ibGVuZF8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ibGVuZF8gKSAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgY2xhc3NfID0gICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21tXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X21tX2Rlc2lnbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21tX3Zhcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X3Zhcl9kZXNpZ25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3Zhcl9kZXNpZ25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X2luc3RhbmNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3Zhcl9ibGVuZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9ibGVuZF8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyggY2xhc3NfLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9kZXNpZ25fLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2JsZW5kXywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbW1fYmxlbmRfLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV92YXJfLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Zhcl9kZXNpZ25fLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFyX2Rlc2lnbl8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9pbnN0YW5jZV8sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3dlaWdodHZlY3Rvcl8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfd2VpZ2h0dmVjdG9yXywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YXJfYmxlbmRfLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV9ibGVuZF8gKSAgICAgIFwKKyAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjICBjbGFzc18gPSAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X21tXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzZXRfbW1fZGVzaWduXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF9tbV9ibGVuZF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfbW1fdmFyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF92YXJfZGVzaWduXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X3Zhcl9kZXNpZ25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzZXRfaW5zdGFuY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF93ZWlnaHR2ZWN0b3JfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X3dlaWdodHZlY3Rvcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnZXRfdmFyX2JsZW5kXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvbmVfYmxlbmRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2Rlc2lnbl8sICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fYmxlbmRfLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV9ibGVuZF8sICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX3Zhcl8sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFyX2Rlc2lnbl8sICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF92YXJfZGVzaWduXywgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2luc3RhbmNlXywgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfdmFyX2JsZW5kXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfYmxlbmRfICkgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyogIGNsYXp6ICkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbSAgICAgICAgID0gZ2V0X21tXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X21tX2Rlc2lnbiAgPSBzZXRfbW1fZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfbW1fYmxlbmQgICA9IHNldF9tbV9ibGVuZF87ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9tbV9ibGVuZCAgID0gZ2V0X21tX2JsZW5kXzsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X21tX3ZhciAgICAgPSBnZXRfbW1fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfdmFyX2Rlc2lnbiA9IHNldF92YXJfZGVzaWduXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF92YXJfZGVzaWduID0gZ2V0X3Zhcl9kZXNpZ25fOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X2luc3RhbmNlICAgPSBzZXRfaW5zdGFuY2VfOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfdmFyX2JsZW5kICA9IGdldF92YXJfYmxlbmRfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfYmxlbmQgICAgID0gZG9uZV9ibGVuZF87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQogICAvKiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKaW5kZXggMzEyOTQyOS4uNzYzZmIyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmgKQEAgLTEsMjYgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2b3R2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgT3BlblR5cGUgdmFsaWRhdGlvbiBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2b3R2YWwuaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIE9wZW5UeXBlIHZhbGlkYXRpb24gc2VydmljZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNWT1RWQUxfSF8KICNkZWZpbmUgU1ZPVFZBTF9IXwogCi0jaW5jbHVkZSBGVF9PUEVOVFlQRV9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdHZhbC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaAppbmRleCBlNjVkNTdlLi5iZGViYTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oCkBAIC0xLDI2ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBmci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJuYWwgUEZSIHNlcnZpY2UgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdnBmci5oCisgKgorICogICBJbnRlcm5hbCBQRlIgc2VydmljZSBmdW5jdGlvbnMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVlBGUl9IXwogI2RlZmluZSBTVlBGUl9IXwogCi0jaW5jbHVkZSBGVF9QRlJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRwZnIuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTU2LDcgKzU2LDYgQEAKIAogICB9OwogCi0gLyogKi8KIAogRlRfRU5EX0hFQURFUgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgKaW5kZXggNGE0OWQ4Yi4uOGVmNjJjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaApAQCAtMSwzNyArMSwzNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwb3N0bm0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBQb3N0U2NyaXB0IG5hbWUgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc3Zwb3N0bm0uaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgbmFtZSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNWUE9TVE5NX0hfCiAjZGVmaW5lIFNWUE9TVE5NX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAgIC8qCi0gICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBQb3N0U2NyaXB0IG5hbWUgb2YgYSBnaXZlbgotICAgKiAgZm9udCB3aGVuIGF2YWlsYWJsZS4gIFRoZSBgZ2V0X25hbWUnIGZpZWxkIHNob3VsZCBuZXZlciBiZSBOVUxMLgorICAgKiBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBQb3N0U2NyaXB0IG5hbWUgb2YgYSBnaXZlbiBmb250CisgICAqIHdoZW4gYXZhaWxhYmxlLiAgVGhlIGBnZXRfbmFtZScgZmllbGQgc2hvdWxkIG5ldmVyIGJlIGBOVUxMYC4KICAgICoKLSAgICogIFRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGNhbiByZXR1cm4gTlVMTCB0byBpbmRpY2F0ZSB0aGF0IHRoZQotICAgKiAgUG9zdFNjcmlwdCBuYW1lIGlzIG5vdCBhdmFpbGFibGUuCisgICAqIFRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGNhbiByZXR1cm4gYE5VTExgIHRvIGluZGljYXRlIHRoYXQgdGhlCisgICAqIFBvc3RTY3JpcHQgbmFtZSBpcyBub3QgYXZhaWxhYmxlLgogICAgKgotICAgKiAgVGhlIG5hbWUgaXMgb3duZWQgYnkgdGhlIGZhY2UgYW5kIHdpbGwgYmUgZGVzdHJveWVkIHdpdGggaXQuCisgICAqIFRoZSBuYW1lIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCB3aWxsIGJlIGRlc3Ryb3llZCB3aXRoIGl0LgogICAgKi8KIAogI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FICAicG9zdHNjcmlwdC1mb250LW5hbWUiCkBAIC00NywyOCArNDcsMTIgQEAKICAgfTsKIAogCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNGT05UTkFNRVJFQyggY2xhc3NfLCBnZXRfcHNfZm9udF9uYW1lXyApIFwKICAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgIFwKICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBnZXRfcHNfZm9udF9uYW1lXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKCBjbGFzc18sIGdldF9wc19mb250X25hbWVfICkgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyogIGNsYXp6ICkgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfcHNfZm9udF9uYW1lID0gZ2V0X3BzX2ZvbnRfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAgIC8qICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgKaW5kZXggYWRjMGJjZi4uOGY3NTU0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnByb3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHByb3BlcnR5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdnByb3AuaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIHByb3BlcnR5IHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVlBST1BfSF8KQEAgLTQ1LDggKzQ1LDYgQEAKICAgfTsKIAogCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFJPUEVSVElFU1JFQyggY2xhc3NfLCAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9wcm9wZXJ0eV8sICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgIFwKQEAgLTU2LDIwICs1NCw2IEBACiAgICAgZ2V0X3Byb3BlcnR5XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BST1BFUlRJRVNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcHJvcGVydHlfLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3Byb3BlcnR5XyApICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNldF9wcm9wZXJ0eSA9IHNldF9wcm9wZXJ0eV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfcHJvcGVydHkgPSBnZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQogICAvKiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaAppbmRleCA1NTg5NTc1Li5iNGRjZDgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oCkBAIC0xLDI1ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBzY21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgY2hhcm1hcCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdnBzY21hcC5oCisgKgorICogICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBjaGFybWFwIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVlBTQ01BUF9IXwogI2RlZmluZSBTVlBTQ01BUF9IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTI5LDI3ICsyOSwyNiBAQAogCiAKICAgLyoKLSAgICogIEFkb2JlIGdseXBoIG5hbWUgdG8gdW5pY29kZSB2YWx1ZS4KKyAgICogQWRvYmUgZ2x5cGggbmFtZSB0byB1bmljb2RlIHZhbHVlLgogICAgKi8KICAgdHlwZWRlZiBGVF9VSW50MzIKICAgKCpQU19Vbmljb2RlX1ZhbHVlRnVuYykoIGNvbnN0IGNoYXIqICBnbHlwaF9uYW1lICk7CiAKICAgLyoKLSAgICogIE1hY2ludG9zaCBuYW1lIGlkIHRvIGdseXBoIG5hbWUuICBOVUxMIGlmIGludmFsaWQgaW5kZXguCisgICAqIE1hY2ludG9zaCBuYW1lIGlkIHRvIGdseXBoIG5hbWUuICBgTlVMTGAgaWYgaW52YWxpZCBpbmRleC4KICAgICovCiAgIHR5cGVkZWYgY29uc3QgY2hhcioKICAgKCpQU19NYWNpbnRvc2hfTmFtZUZ1bmMpKCBGVF9VSW50ICBuYW1lX2luZGV4ICk7CiAKICAgLyoKLSAgICogIEFkb2JlIHN0YW5kYXJkIHN0cmluZyBJRCB0byBnbHlwaCBuYW1lLiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgorICAgKiBBZG9iZSBzdGFuZGFyZCBzdHJpbmcgSUQgdG8gZ2x5cGggbmFtZS4gIGBOVUxMYCBpZiBpbnZhbGlkIGluZGV4LgogICAgKi8KICAgdHlwZWRlZiBjb25zdCBjaGFyKgogICAoKlBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYykoIEZUX1VJbnQgIHN0cmluZ19pbmRleCApOwogCiAKICAgLyoKLSAgICogIFNpbXBsZSB1bmljb2RlIC0+IGdseXBoIGluZGV4IGNoYXJtYXAgYnVpbHQgZnJvbSBmb250IGdseXBoIG5hbWVzCi0gICAqICB0YWJsZS4KKyAgICogU2ltcGxlIHVuaWNvZGUgLT4gZ2x5cGggaW5kZXggY2hhcm1hcCBidWlsdCBmcm9tIGZvbnQgZ2x5cGggbmFtZXMgdGFibGUuCiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgUFNfVW5pTWFwXwogICB7CkBAIC03MSwxNiArNzAsMTYgQEAKIAogCiAgIC8qCi0gICAqICBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBnbHlwaCBuYW1lIGZvciBhIGdpdmVuIGluZGV4LiAgUmV0dXJucwotICAgKiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgorICAgKiBBIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYSBnbHlwaCBuYW1lIGZvciBhIGdpdmVuIGluZGV4LiAgUmV0dXJucworICAgKiBgTlVMTGAgaWYgaW52YWxpZCBpbmRleC4KICAgICovCiAgIHR5cGVkZWYgY29uc3QgY2hhcioKICAgKCpQU19HZXRHbHlwaE5hbWVGdW5jKSggRlRfUG9pbnRlciAgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgc3RyaW5nX2luZGV4ICk7CiAKICAgLyoKLSAgICogIEEgZnVuY3Rpb24gdXNlZCB0byByZWxlYXNlIHRoZSBnbHlwaCBuYW1lIHJldHVybmVkIGJ5Ci0gICAqICBQU19HZXRHbHlwaE5hbWVGdW5jLCB3aGVuIG5lZWRlZAorICAgKiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSB0aGUgZ2x5cGggbmFtZSByZXR1cm5lZCBieQorICAgKiBQU19HZXRHbHlwaE5hbWVGdW5jLCB3aGVuIG5lZWRlZAogICAgKi8KICAgdHlwZWRlZiB2b2lkCiAgICgqUFNfRnJlZUdseXBoTmFtZUZ1bmMpKCBGVF9Qb2ludGVyICBkYXRhLApAQCAtMTE4LDggKzExNyw2IEBACiAgIH07CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCiAjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX3ZhbHVlXywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMzYsMzUgKzEzMyw2IEBACiAgICAgYWRvYmVfc3RkX3N0cmluZ3NfLCBhZG9iZV9zdGRfZW5jb2RpbmdfLCBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX3ZhbHVlXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX25leHRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjaW50b3NoX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9zdHJpbmdzXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfZW5jb2RpbmdfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfZXhwZXJ0X2VuY29kaW5nXyApICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVfdmFsdWUgICAgICAgICA9IHVuaWNvZGVfdmFsdWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT51bmljb2Rlc19pbml0ICAgICAgICAgPSB1bmljb2Rlc19pbml0XzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dW5pY29kZXNfY2hhcl9pbmRleCAgID0gdW5pY29kZXNfY2hhcl9pbmRleF87ICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVzX2NoYXJfbmV4dCAgICA9IHVuaWNvZGVzX2NoYXJfbmV4dF87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tYWNpbnRvc2hfbmFtZSAgICAgICAgPSBtYWNpbnRvc2hfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YWRvYmVfc3RkX3N0cmluZ3MgICAgID0gYWRvYmVfc3RkX3N0cmluZ3NfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmFkb2JlX3N0ZF9lbmNvZGluZyAgICA9IGFkb2JlX3N0ZF9lbmNvZGluZ187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hZG9iZV9leHBlcnRfZW5jb2RpbmcgPSBhZG9iZV9leHBlcnRfZW5jb2RpbmdfOyAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQogICAvKiAqLwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaAppbmRleCA0MDhmNDA2Li4xZTcyNzZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oCkBAIC0xLDI2ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBzaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgaW5mbyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdnBzaW5mby5oCisgKgorICogICBUaGUgRnJlZVR5cGUgUG9zdFNjcmlwdCBpbmZvIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVlBTSU5GT19IXwogI2RlZmluZSBTVlBTSU5GT19IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC02Miw4ICs2Miw2IEBACiAgIH07CiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCiAjZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTSU5GT1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9pbmZvXywgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2dldF9mb250X2V4dHJhXywgICAgICAgICBcCkBAIC03NiwyOSArNzQsNiBAQAogICAgIGdldF9mb250X3ByaXZhdGVfLCBnZXRfZm9udF92YWx1ZV8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNJTkZPUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X2luZm9fLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfZ2V0X2ZvbnRfZXh0cmFfLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfZ2x5cGhfbmFtZXNfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ByaXZhdGVfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfdmFsdWVfICkgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0luZm9SZWMqICBjbGF6eiApICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfZ2V0X2ZvbnRfaW5mbyAgICA9IGdldF9mb250X2luZm9fOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF9leHRyYSAgID0gcHNfZ2V0X2ZvbnRfZXh0cmFfOyAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2hhc19nbHlwaF9uYW1lcyAgPSBoYXNfZ2x5cGhfbmFtZXNfOyAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfZ2V0X2ZvbnRfcHJpdmF0ZSA9IGdldF9mb250X3ByaXZhdGVfOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19nZXRfZm9udF92YWx1ZSAgID0gZ2V0X2ZvbnRfdmFsdWVfOyAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaAppbmRleCBlOGIzN2JjLi4zOWM4YjVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmgKQEAgLTEsMzMgKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2c2ZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2c2ZudC5oCisgKgorICogICBUaGUgRnJlZVR5cGUgU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVlNGTlRfSF8KICNkZWZpbmUgU1ZTRk5UX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhYmxlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKICAgLyoKLSAgICogIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlLgorICAgKiBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZS4KICAgICovCiAKICNkZWZpbmUgRlRfU0VSVklDRV9JRF9TRk5UX1RBQkxFICAic2ZudC10YWJsZSIKQEAgLTcwLDI3ICs3MCwxMiBAQAogICB9OwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQogI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKCBjbGFzc18sIGxvYWRfLCBnZXRfLCBpbmZvXyApICBcCiAgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1NGTlRfVGFibGVSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgIFwKICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGxvYWRfLCBnZXRfLCBpbmZvXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfU0ZOVF9UQUJMRVJFQyggY2xhc3NfLCBsb2FkXywgZ2V0XywgaW5mb18gKSBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyogIGNsYXp6ICkgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfdGFibGUgPSBsb2FkXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfdGFibGUgID0gZ2V0XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dGFibGVfaW5mbyA9IGluZm9fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmgKaW5kZXggY2QwZTZmZC4uYzE4YmIyMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaApAQCAtMSwyMCArMSwyMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z0dGNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZS9zZm50IGNtYXAgZXh0cmEgaW5mb3JtYXRpb24gc2VydmljZS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2dHRjbWFwLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZS9zZm50IGNtYXAgZXh0cmEgaW5mb3JtYXRpb24gc2VydmljZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogTWFzYXRha2UgWUFNQVRPLCBSZWRoYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogLyogRGV2ZWxvcG1lbnQgb2YgdGhpcyBzZXJ2aWNlIGlzIHN1cHBvcnQgb2YKICAgIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeSwgSmFwYW4uICovCkBAIC0yMiw4ICsyMiw4IEBACiAjaWZuZGVmIFNWVFRDTUFQX0hfCiAjZGVmaW5lIFNWVFRDTUFQX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhYmxlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtMzIsMjkgKzMyLDI4IEBACiAjZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCAgInR0LWNtYXBzIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfQ01hcEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgaW5mb3JtYXRpb24gICovCi0gIC8qICAgIHdoaWNoIGlzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBnZW5lcmljIEBGVF9DaGFyTWFwIHN0cnVjdHVyZS4gIFRoaXMgICAqLwotICAvKiAgICBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIEBGVF9HZXRfVFRfQ01hcF9JbmZvIGZ1bmN0aW9uLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYW5ndWFnZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbGFuZ3VhZ2UgSUQgdXNlZCBpbiBNYWMgZm9udHMuICBEZWZpbml0aW9ucyBvZiB2YWx1ZXMgYXJlIGluICovCi0gIC8qICAgICAgYHR0bmFtZWlkLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGNtYXAgZm9ybWF0LiAgT3BlblR5cGUgMS42IGRlZmluZXMgdGhlIGZvcm1hdHMgMCAoYnl0ZSAgICAgICAqLwotICAvKiAgICAgIGVuY29kaW5nIHRhYmxlKSwgMn4oaGlnaC1ieXRlIG1hcHBpbmcgdGhyb3VnaCB0YWJsZSksIDR+KHNlZ21lbnQgKi8KLSAgLyogICAgICBtYXBwaW5nIHRvIGRlbHRhIHZhbHVlcyksIDZ+KHRyaW1tZWQgdGFibGUgbWFwcGluZyksIDh+KG1peGVkICAgICovCi0gIC8qICAgICAgMTYtYml0IGFuZCAzMi1iaXQgY292ZXJhZ2UpLCAxMH4odHJpbW1lZCBhcnJheSksIDEyfihzZWdtZW50ZWQgICAqLwotICAvKiAgICAgIGNvdmVyYWdlKSwgMTN+KGxhc3QgcmVzb3J0IGZvbnQpLCBhbmQgMTQgKFVuaWNvZGUgVmFyaWF0aW9uICAgICAgKi8KLSAgLyogICAgICBTZXF1ZW5jZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9DTWFwSW5mbworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgaW5mb3JtYXRpb24KKyAgICogICB3aGljaCBpcyBub3QgY292ZXJlZCBieSB0aGUgZ2VuZXJpYyBARlRfQ2hhck1hcCBzdHJ1Y3R1cmUuICBUaGlzCisgICAqICAgc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBARlRfR2V0X1RUX0NNYXBfSW5mbyBmdW5jdGlvbi4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBsYW5ndWFnZSA6OgorICAgKiAgICAgVGhlIGxhbmd1YWdlIElEIHVzZWQgaW4gTWFjIGZvbnRzLiAgRGVmaW5pdGlvbnMgb2YgdmFsdWVzIGFyZSBpbgorICAgKiAgICAgYHR0bmFtZWlkLmhgLgorICAgKgorICAgKiAgIGZvcm1hdCA6OgorICAgKiAgICAgVGhlIGNtYXAgZm9ybWF0LiAgT3BlblR5cGUgMS42IGRlZmluZXMgdGhlIGZvcm1hdHMgMCAoYnl0ZSBlbmNvZGluZworICAgKiAgICAgdGFibGUpLCAyfihoaWdoLWJ5dGUgbWFwcGluZyB0aHJvdWdoIHRhYmxlKSwgNH4oc2VnbWVudCBtYXBwaW5nIHRvCisgICAqICAgICBkZWx0YSB2YWx1ZXMpLCA2fih0cmltbWVkIHRhYmxlIG1hcHBpbmcpLCA4fihtaXhlZCAxNi1iaXQgYW5kIDMyLWJpdAorICAgKiAgICAgY292ZXJhZ2UpLCAxMH4odHJpbW1lZCBhcnJheSksIDEyfihzZWdtZW50ZWQgY292ZXJhZ2UpLCAxM34obGFzdAorICAgKiAgICAgcmVzb3J0IGZvbnQpLCBhbmQgMTQgKFVuaWNvZGUgVmFyaWF0aW9uIFNlcXVlbmNlcykuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcEluZm9fCiAgIHsKICAgICBGVF9VTG9uZyAgbGFuZ3VhZ2U7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgVFRfQ01hcF9JbmZvX0dldEZ1bmMgIGdldF9jbWFwX2luZm87CiAgIH07CiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKIAogI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVENNQVBTUkVDKCBjbGFzc18sIGdldF9jbWFwX2luZm9fICkgIFwKICAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfVFRDTWFwc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICBcCkBAIC04MSwyMCArNzksNiBAQAogICAgIGdldF9jbWFwX2luZm9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9UVENNQVBTUkVDKCBjbGFzc18sIGdldF9jbWFwX2luZm9fICkgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfVFRDTWFwc1JlYyogIGNsYXp6ICkgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NtYXBfaW5mbyA9IGdldF9jbWFwX2luZm9fOyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KICAgLyogKi8KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCmluZGV4IDkyZTNjNTQuLjdhMTdlNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCkBAIC0xLDMzICsxLDMzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnR0ZW5nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFRydWVUeXBlIGVuZ2luZSBxdWVyeSBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzdnR0ZW5nLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZSBlbmdpbmUgcXVlcnkgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNWVFRFTkdfSF8KICNkZWZpbmUgU1ZUVEVOR19IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RhcGkuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCiAgIC8qCi0gICAqICBTRk5UIHRhYmxlIGxvYWRpbmcgc2VydmljZS4KKyAgICogU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UuCiAgICAqLwogCiAjZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FICAidHJ1ZXR5cGUtZW5naW5lIgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oCmluZGV4IDE2ZmFjMWMuLjkwYTgxZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgKQEAgLTEsMjUgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2dHRnbHlmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZ2x5cGggc2VydmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2dHRnbHlmLmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZSBnbHlwaCBzZXJ2aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKICNpZm5kZWYgU1ZUVEdMWUZfSF8KICNkZWZpbmUgU1ZUVEdMWUZfSF8KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFibGVzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC0zOSwyNSArMzksMTIgQEAKICAgfTsKIAogCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRHTFlGUkVDKCBjbGFzc18sIGdldF9sb2NhdGlvbl8gKSAgXAogICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UVEdseWZSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICBcCiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBnZXRfbG9jYXRpb25fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQyggY2xhc3NfLCBnZXRfbG9jYXRpb25fICkgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfVFRHbHlmUmVjKiAgY2xhenogKSAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2xvY2F0aW9uID0gZ2V0X2xvY2F0aW9uXzsgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCiAgIC8qICovCiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdndpbmZudC5oCmluZGV4IDgwZDQ4MWMuLjhjOTE1ZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmgKQEAgLTEsMjYgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2d2luZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgV2luZG93cyBGTlQvRk9OVCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN2d2luZm50LmgKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBXaW5kb3dzIEZOVC9GT05UIHNlcnZpY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBTVldJTkZOVF9IXwogI2RlZmluZSBTVldJTkZOVF9IXwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdHdpbmZudC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZm50LmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaAppbmRleCBmYjFlMzI3Li5iNGMxMmRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaApAQCAtMSw3MCArMSw3MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgYHNmbnQnIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2ZudC5oCisgKgorICogICBIaWdoLWxldmVsICdzZm50JyBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgU0ZOVF9IXwogI2RlZmluZSBTRk5UX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3dvZmZ0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSW5pdF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmlyc3QgcGFydCBvZiB0aGUgU0ZOVCBmYWNlIG9iamVjdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgZmluZHMgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIGluIGEgU0ZOVCBmaWxlIG9yIGNvbGxlY3Rpb24sIGFuZCBsb2FkIGl0cyBmb3JtYXQgdGFnIGluICAqLwotICAvKiAgICBmYWNlLT5mb3JtYXRfdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGZvbnQgZmlsZSdzIG9yaWdpbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGZvbnRzIGVtYmVkZGVkIGluIGEgYFRydWVUeXBlICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbGxlY3Rpb24nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25jZSB0aGUgZm9ybWF0IHRhZyBoYXMgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGZvbnQgZHJpdmVyLCBpdCAgICAgICovCi0gIC8qICAgIHNob3VsZCB0aGVuIGNhbGwgdGhlIFRUX0xvYWRfRmFjZV9GdW5jKCkgY2FsbGJhY2sgdG8gcmVhZCB0aGUgcmVzdCAqLwotICAvKiAgICBvZiB0aGUgU0ZOVCB0YWJsZXMgaW4gdGhlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVFRfSW5pdF9GYWNlX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZpcnN0IHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGZpbmRzIHRoZQorICAgKiAgIGZhY2UgaW4gYSBTRk5UIGZpbGUgb3IgY29sbGVjdGlvbiwgYW5kIGxvYWQgaXRzIGZvcm1hdCB0YWcgaW4KKyAgICogICBmYWNlLT5mb3JtYXRfdGFnLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgZmFjZV9pbmRleCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBUcnVlVHlwZSBmb250LCBpZiB3ZSBhcmUgb3BlbmluZyBhIGNvbGxlY3Rpb24sIGluCisgICAqICAgICBiaXRzIDAtMTUuICBUaGUgbnVtYmVyZWQgaW5zdGFuY2UgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZgorICAgKiAgICAgYXBwbGljYWJsZSwgaW4gYml0cyAxNi0zMC4KKyAgICoKKyAgICogICBudW1fcGFyYW1zIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAgICoKKyAgICogICBwYXJhbXMgOjoKKyAgICogICAgIE9wdGlvbmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBmb250IGZpbGUncyBvcmlnaW4uCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIGZvbnRzIGVtYmVkZGVkIGluIGEgJ1RydWVUeXBlIGNvbGxlY3Rpb24nLgorICAgKgorICAgKiAgIE9uY2UgdGhlIGZvcm1hdCB0YWcgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBmb250IGRyaXZlciwgaXQgc2hvdWxkCisgICAqICAgdGhlbiBjYWxsIHRoZSBUVF9Mb2FkX0ZhY2VfRnVuYygpIGNhbGxiYWNrIHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlCisgICAqICAgU0ZOVCB0YWJsZXMgaW4gdGhlIG9iamVjdC4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Jbml0X0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCkBAIC03MywzNiArNzYsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9GYWNlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vjb25kIHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGxvYWRzICAgICovCi0gIC8qICAgIHRoZSBjb21tb24gU0ZOVCB0YWJsZXMgKGhlYWQsIE9TLzIsIG1heHAsIG1ldHJpY3MsIGV0Yy4pIGluIHRoZSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVFRfSW5pdF9GYWNlX0Z1bmMoKS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9Mb2FkX0ZhY2VfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgU2Vjb25kIHBhcnQgb2YgdGhlIFNGTlQgZmFjZSBvYmplY3QgaW5pdGlhbGl6YXRpb24uICBUaGlzIGxvYWRzIHRoZQorICAgKiAgIGNvbW1vbiBTRk5UIHRhYmxlcyAoaGVhZCwgT1MvMiwgbWF4cCwgbWV0cmljcywgZXRjLikgaW4gdGhlIGZhY2UKKyAgICogICBvYmplY3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgY29sbGVjdGlvbiwgaW4KKyAgICogICAgIGJpdHMgMC0xNS4gIFRoZSBudW1iZXJlZCBpbnN0YW5jZSBpbmRleH4rfjEgb2YgYSBHWCAoc3ViKWZvbnQsIGlmCisgICAqICAgICBhcHBsaWNhYmxlLCBpbiBiaXRzIDE2LTMwLgorICAgKgorICAgKiAgIG51bV9wYXJhbXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgKgorICAgKiAgIHBhcmFtcyA6OgorICAgKiAgICAgT3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVFRfSW5pdF9GYWNlX0Z1bmMoKS4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Mb2FkX0ZhY2VfRnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCkBAIC0xMTEsNjQgKzExOCw2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Eb25lX0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNhbGxiYWNrIHVzZWQgdG8gZGVsZXRlIHRoZSBjb21tb24gU0ZOVCBkYXRhIGZyb20gYSBmYWNlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVFRfRG9uZV9GYWNlX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgY2FsbGJhY2sgdXNlZCB0byBkZWxldGUgdGhlIGNvbW1vbiBTRk5UIGRhdGEgZnJvbSBhIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGRlc3Ryb3kgdGhlIGZhY2Ugb2JqZWN0LgorICAgKi8KICAgdHlwZWRlZiB2b2lkCiAgICgqVFRfRG9uZV9GYWNlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogVGhlIGZhY2Ugb2JqZWN0IHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICA6OiBUaGUgdGFnIG9mIHRhYmxlIHRvIGxvYWQuICBVc2UgdGhlIHZhbHVlIDAgaWYgeW91IHdhbnQgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyICAgKi8KLSAgLyogICAgICAgICAgICAgIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUgdGFnIHRoYXQgeW91IGNhbiBmb3JnZSB3aXRoICAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZSBpZiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICB0YWcgPT0gMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBsZW5ndGggPT0gTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgd2hvbGUgdGFibGUuICBSZXR1cm5zIGFuIGVycm9yIGlmICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYG9mZnNldCcgPT0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCA9PSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRXhpdHMgaW1tZWRpYXRlbHk7IHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgdGFnJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoICE9IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgbmV4dCBgbGVuZ3RoJyBieXRlcyBvZiB0YWJsZSBvciBmb250LCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGBvZmZzZXQnIChpbiB0YWJsZSBvciBmb250IHRvbykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9Mb2FkX0FueV9GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4KKyAgICoKKyAgICogICB0YWcgOjoKKyAgICogICAgIFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgdGhlCisgICAqICAgICB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUKKyAgICogICAgIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aCB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uCisgICAqCisgICAqICAgb2Zmc2V0IDo6CisgICAqICAgICBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgdGhlIGZpbGUgaWYgdGFnID09IDApLgorICAgKgorICAgKiAgIGxlbmd0aCA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOgorICAgKgorICAgKiAgICAgSWYgYGxlbmd0aCA9PSBOVUxMYDogTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZgorICAgKiAgICAgJ29mZnNldCcgPT0gMCEKKyAgICoKKyAgICogICAgIElmIGAqbGVuZ3RoID09IDBgOiBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlCisgICAqICAgICBnaXZlbiB0YWJsZSBvciBvZiB0aGUgZm9udCBmaWxlLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mICd0YWcnLgorICAgKgorICAgKiAgICAgSWYgYCpsZW5ndGggIT0gMGA6IExvYWRzIHRoZSBuZXh0ICdsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsCisgICAqICAgICBzdGFydGluZyBhdCBvZmZzZXQgJ29mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBidWZmZXIgOjoKKyAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Mb2FkX0FueV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKQEAgLTE3NywzNCArMTg0LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB3aGV0aGVyIGFuIGVtYmVkZGVkIGJpdG1hcCAoYW4gYHNiaXQnKSBleGlzdHMgZm9yIGEgZ2l2ZW4gICAgKi8KLSAgLyogICAgZ2x5cGgsIGF0IGEgZ2l2ZW4gc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCAgOjogVGhlIGN1cnJlbnQgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyYW5nZSAgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXN0cmlrZSAgICAgICA6OiBUaGUgU0JpdCBzdHJpa2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGhfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gYEVCRFQnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudCBpZiBubyBzYml0IGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCAgICAgICovCi0gIC8qICAgIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQ2hlY2sgd2hldGhlciBhbiBlbWJlZGRlZCBiaXRtYXAgKGFuICdzYml0JykgZXhpc3RzIGZvciBhIGdpdmVuIGdseXBoLAorICAgKiAgIGF0IGEgZ2l2ZW4gc3RyaWtlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBnbHlwaF9pbmRleCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIHN0cmlrZV9pbmRleCA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgc3RyaWtlIGluZGV4LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIGFyYW5nZSA6OgorICAgKiAgICAgVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguCisgICAqCisgICAqICAgYXN0cmlrZSA6OgorICAgKiAgICAgVGhlIFNCaXQgc3RyaWtlIGNvbnRhaW5pbmcgdGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIGFnbHlwaF9vZmZzZXQgOjoKKyAgICogICAgIFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gJ0VCRFQnIHRhYmxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zCisgICAqICAgU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudCBpZiBubyBzYml0IGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCBnbHlwaC4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYykoIFRUX0ZhY2UgICAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgZ2x5cGhfaW5kZXgsCkBAIC0yMTQsNzggKzIyNiw4MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICphZ2x5cGhfb2Zmc2V0ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGJpZyBtZXRyaWNzIGZvciBhIGdpdmVuIGVtYmVkZGVkIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICAgICAgIDo6IFRoZSBTQml0IHJhbmdlIGNvbnRhaW5pbmcgdGhlIGdseXBoLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpZ19tZXRyaWNzIDo6IEEgYmlnIFNCaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZ2x5cGgncyBvZmZzZXQgd2l0aGluICAqLwotICAvKiAgICB0aGUgYEVCRFQnIHRhYmxlIGJlZm9yZSB0aGUgY2FsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBpbWFnZSBmb3JtYXQgdXNlcyB2YXJpYWJsZSBtZXRyaWNzLCB0aGUgc3RyZWFtIGN1cnNvciBpcyAgICAqLwotICAvKiAgICBwb3NpdGlvbmVkIGp1c3QgYWZ0ZXIgdGhlIG1ldHJpY3MgaGVhZGVyIGluIHRoZSBgRUJEVCcgdGFibGUgb24gICAgKi8KLSAgLyogICAgZnVuY3Rpb24gZXhpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEdldCB0aGUgYmlnIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gZW1iZWRkZWQgYml0bWFwLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgIHJhbmdlIDo6CisgICAqICAgICBUaGUgU0JpdCByYW5nZSBjb250YWluaW5nIHRoZSBnbHlwaC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBiaWdfbWV0cmljcyA6OgorICAgKiAgICAgQSBiaWcgU0JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgcG9zaXRpb25lZCBhdCB0aGUgZ2x5cGgncyBvZmZzZXQgd2l0aGluIHRoZQorICAgKiAgICdFQkRUJyB0YWJsZSBiZWZvcmUgdGhlIGNhbGwuCisgICAqCisgICAqICAgSWYgdGhlIGltYWdlIGZvcm1hdCB1c2VzIHZhcmlhYmxlIG1ldHJpY3MsIHRoZSBzdHJlYW0gY3Vyc29yIGlzCisgICAqICAgcG9zaXRpb25lZCBqdXN0IGFmdGVyIHRoZSBtZXRyaWNzIGhlYWRlciBpbiB0aGUgJ0VCRFQnIHRhYmxlIG9uCisgICAqICAgZnVuY3Rpb24gZXhpdC4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jKSggRlRfU3RyZWFtICAgICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAgcmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcyApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIGdseXBoIHNiaXQgaW1hZ2UgZnJvbSB0aGUgZm9udCByZXNvdXJjZS4gIFRoaXMgYWxzbyAgICovCi0gIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFwIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdGFyZ2V0IHBpeG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWV0cmljcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGJpZyBzYml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGggaW1hZ2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIGdseXBoIHNiaXQgZXhpc3RzIGZvciB0aGUgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWFwLmJ1ZmZlcicgZmllbGQgaXMgYWx3YXlzIGZyZWVkIGJlZm9yZSB0aGUgZ2x5cGggaXMgbG9hZGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9Mb2FkX1NCaXRfSW1hZ2VfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgTG9hZCBhIGdpdmVuIGdseXBoIHNiaXQgaW1hZ2UgZnJvbSB0aGUgZm9udCByZXNvdXJjZS4gIFRoaXMgYWxzbworICAgKiAgIHJldHVybnMgaXRzIG1ldHJpY3MuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHN0cmlrZV9pbmRleCA6OgorICAgKiAgICAgVGhlIHN0cmlrZSBpbmRleC4KKyAgICoKKyAgICogICBnbHlwaF9pbmRleCA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZ2x5cGggaW5kZXguCisgICAqCisgICAqICAgbG9hZF9mbGFncyA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgbG9hZCBmbGFncy4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgYW1hcCA6OgorICAgKiAgICAgVGhlIHRhcmdldCBwaXhtYXAuCisgICAqCisgICAqICAgYW1ldHJpY3MgOjoKKyAgICogICAgIEEgYmlnIHNiaXQgbWV0cmljcyBzdHJ1Y3R1cmUgZm9yIHRoZSBnbHlwaCBpbWFnZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyBnbHlwaAorICAgKiAgIHNiaXQgZXhpc3RzIGZvciB0aGUgaW5kZXguCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIFRoZSBgbWFwLmJ1ZmZlcmAgZmllbGQgaXMgYWx3YXlzIGZyZWVkIGJlZm9yZSB0aGUgZ2x5cGggaXMgbG9hZGVkLgorICAgKi8KICAgdHlwZWRlZiBGVF9FcnJvcgogICAoKlRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKQEAgLTI5NiwxMzAgKzMxMSwxNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgKmFtZXRyaWNzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYW4gc2JpdCBzdHJpa2UgZm9yIGEgZ2l2ZW4gc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcSAgICAgICAgICAgOjogVGhlIHNpemUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzdHJpa2VfaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBzYml0IHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vICAgICAqLwotICAvKiAgICBzYml0IHN0cmlrZSBleGlzdHMgZm9yIHRoZSBzZWxlY3RlZCBwcGVtIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFNlbGVjdCBhbiBzYml0IHN0cmlrZSBmb3IgYSBnaXZlbiBzaXplIHJlcXVlc3QuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHJlcSA6OgorICAgKiAgICAgVGhlIHNpemUgcmVxdWVzdC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhc3RyaWtlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIHNiaXQgc3RyaWtlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmIG5vIHNiaXQKKyAgICogICBzdHJpa2UgZXhpc3RzIGZvciB0aGUgc2VsZWN0ZWQgcHBlbSB2YWx1ZXMuCisgICAqLwogICB0eXBlZGVmIEZUX0Vycm9yCiAgICgqVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzICAgICAgIDo6IHRoZSBtZXRyaWNzIG9mIHRoZSBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgc3VjaCBzYml0IHN0cmlrZSBleGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgTG9hZCB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIHN0cmlrZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyaWtlX2luZGV4IDo6CisgICAqICAgICBUaGUgc3RyaWtlIGluZGV4LgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIG1ldHJpY3MgOjoKKyAgICogICAgIHRoZSBtZXRyaWNzIG9mIHRoZSBzdHJpa2UuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gc3VjaAorICAgKiAgIHNiaXQgc3RyaWtlIGV4aXN0cy4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgIHN0cmlrZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfUFNfTmFtZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTbmFtZSA6OiBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgV2lsbCBiZSBOVUxMIGluIGNhc2UgICAqLwotICAvKiAgICAgICAgICAgICAgb2YgZXJyb3IsIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9HZXRfUFNfTmFtZV9GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgaWR4IDo6CisgICAqICAgICBUaGUgZ2x5cGggaW5kZXguCisgICAqCisgICAqICAgUFNuYW1lIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgV2lsbCBiZSBgTlVMTGAgaW4gY2FzZSBvZiBlcnJvciwKKyAgICogICAgIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuCisgICAqCisgICAqICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9HZXRfUFNfTmFtZV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBQU25hbWUgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBtZXRyaWNzIHRhYmxlLCB3aGljaCBpcyBhIHRhYmxlIHdpdGggYSBob3Jpem9udGFsIGFuZCBhICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdGhlIHZlcnRpY2FsIG9uZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRfTWV0cmljc19GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIGEgbWV0cmljcyB0YWJsZSwgd2hpY2ggaXMgYSB0YWJsZSB3aXRoIGEgaG9yaXpvbnRhbCBhbmQgYQorICAgKiAgIHZlcnRpY2FsIHZlcnNpb24uCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogICB2ZXJ0aWNhbCA6OgorICAgKiAgICAgQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdGhlIHZlcnRpY2FsIG9uZS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgdHlwZWRlZiBGVF9FcnJvcgogICAoKlRUX0xvYWRfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGhlYWRlciBpbiBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIHZlcnRpY2FsIG1ldHJpY3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJlYXJpbmcgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBiZWFyaW5nLiAgU2V0IHRvIHplcm8gaW4gICovCi0gIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWFkdmFuY2UgOjogVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBhZHZhbmNlLiAgU2V0IHRvIHplcm8gaW4gICovCi0gIC8qICAgICAgICAgICAgICAgIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9HZXRfTWV0cmljc19GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGhlYWRlciBpbiBhIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICB2ZXJ0aWNhbCA6OgorICAgKiAgICAgQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdmVydGljYWwgbWV0cmljcy4KKyAgICoKKyAgICogICBnaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhYmVhcmluZyA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBiZWFyaW5nLiAgU2V0IHRvIHplcm8gaW4gY2FzZSBvZiBlcnJvci4KKyAgICoKKyAgICogICBhYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgKG9yIHZlcnRpY2FsKSBhZHZhbmNlLiAgU2V0IHRvIHplcm8gaW4gY2FzZSBvZiBlcnJvci4KKyAgICovCiAgIHR5cGVkZWYgdm9pZAogICAoKlRUX0dldF9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICB2ZXJ0aWNhbCwKQEAgLTQyOCw1NyArNDU3LDE2OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhYWR2YW5jZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJvbSB0aGUgYG5hbWUnIHRhYmxlLCByZXR1cm4gYSBnaXZlbiBFTkdMSVNIIG5hbWUgcmVjb3JkIGluICAgICAgICovCi0gIC8qICAgIEFTQ0lJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZWlkICAgOjogVGhlIG5hbWUgaWQgb2YgdGhlIG5hbWUgcmVjb3JkIHRvIHJldHVybi4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICAgOjogVGhlIGFkZHJlc3Mgb2YgYW4gYWxsb2NhdGVkIHN0cmluZyBwb2ludGVyLiAgTlVMTCBpZiAgICovCi0gIC8qICAgICAgICAgICAgICAgIG5vIG5hbWUgaXMgcHJlc2VudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9TZXRfUGFsZXR0ZV9GdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBjb2xvcnMgaW50byBgZmFjZS0+cGFsZXR0ZWAgZm9yIGEgZ2l2ZW4gcGFsZXR0ZSBpbmRleC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgaWR4IDo6CisgICAqICAgICBUaGUgcGFsZXR0ZSBpbmRleC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KKyAgdHlwZWRlZiBGVF9FcnJvcgorICAoKlRUX1NldF9QYWxldHRlX0Z1bmMpKCBUVF9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBpZHggKTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVFRfR2V0X0NvbHJfTGF5ZXJfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgSXRlcmF0aXZlbHkgZ2V0IHRoZSBjb2xvciBsYXllciBkYXRhIG9mIGEgZ2l2ZW4gZ2x5cGggaW5kZXguCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGJhc2VfZ2x5cGggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCB0aGUgY29sb3JlZCBnbHlwaCBsYXllcnMgYXJlIGFzc29jaWF0ZWQgd2l0aC4KKyAgICoKKyAgICogQGlub3V0OgorICAgKiAgIGl0ZXJhdG9yIDo6CisgICAqICAgICBBbiBARlRfTGF5ZXJJdGVyYXRvciBvYmplY3QuICBGb3IgdGhlIGZpcnN0IGNhbGwgeW91IHNob3VsZCBzZXQKKyAgICogICAgIGBpdGVyYXRvci0+cGAgdG8gYE5VTExgLiAgRm9yIGFsbCBmb2xsb3dpbmcgY2FsbHMsIHNpbXBseSB1c2UgdGhlCisgICAqICAgICBzYW1lIG9iamVjdCBhZ2Fpbi4KKyAgICoKKyAgICogQG91dHB1dDoKKyAgICogICBhZ2x5cGhfaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgY3VycmVudCBsYXllci4KKyAgICoKKyAgICogICBhY29sb3JfaW5kZXggOjoKKyAgICogICAgIFRoZSBjb2xvciBpbmRleCBpbnRvIHRoZSBmb250IGZhY2UncyBjb2xvciBwYWxldHRlIG9mIHRoZSBjdXJyZW50CisgICAqICAgICBsYXllci4gIFRoZSB2YWx1ZSAweEZGRkYgaXMgc3BlY2lhbDsgaXQgZG9lc24ndCByZWZlcmVuY2UgYSBwYWxldHRlCisgICAqICAgICBlbnRyeSBidXQgaW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgZm9yZWdyb3VuZCBjb2xvciBzaG91bGQgYmUgdXNlZAorICAgKiAgICAgaW5zdGVhZCAodG8gYmUgc2V0IHVwIGJ5IHRoZSBhcHBsaWNhdGlvbiBvdXRzaWRlIG9mIEZyZWVUeXBlKS4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBWYWx1ZX4xIGlmIGV2ZXJ5dGhpbmcgaXMgT0suICBJZiB0aGVyZSBhcmUgbm8gbW9yZSBsYXllcnMgKG9yIGlmIHRoZXJlCisgICAqICAgYXJlIG5vIGxheWVycyBhdCBhbGwpLCB2YWx1ZX4wIGdldHMgcmV0dXJuZWQuICBJbiBjYXNlIG9mIGFuIGVycm9yLAorICAgKiAgIHZhbHVlfjAgaXMgcmV0dXJuZWQgYWxzby4KKyAgICovCisgIHR5cGVkZWYgRlRfQm9vbAorICAoKlRUX0dldF9Db2xyX0xheWVyX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGJhc2VfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICphZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICphY29sb3JfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xheWVySXRlcmF0b3IqICBpdGVyYXRvciApOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9CbGVuZF9Db2xyX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEJsZW5kIHRoZSBiaXRtYXAgaW4gYG5ld19nbHlwaGAgaW50byBgYmFzZV9nbHlwaGAgdXNpbmcgdGhlIGNvbG9yCisgICAqICAgc3BlY2lmaWVkIGJ5IGBjb2xvcl9pbmRleGAuICBJZiBgY29sb3JfaW5kZXhgIGlzIDB4RkZGRiwgdXNlCisgICAqICAgYGZhY2UtPmZvcmVncm91bmRfY29sb3JgIGlmIGBmYWNlLT5oYXZlX2ZvcmVncm91bmRfY29sb3JgIGlzIHNldC4KKyAgICogICBPdGhlcndpc2UgY2hlY2sgYGZhY2UtPnBhbGV0dGVfZGF0YS5wYWxldHRlX2ZsYWdzYDogSWYgcHJlc2VudCBhbmQKKyAgICogICBARlRfUEFMRVRURV9GT1JfREFSS19CQUNLR1JPVU5EIGlzIHNldCwgdXNlIEJHUkEgdmFsdWUgMHhGRkZGRkZGRgorICAgKiAgICh3aGl0ZSBvcGFxdWUpLiAgT3RoZXJ3aXNlIHVzZSBCR1JBIHZhbHVlIDB4MDAwMDAwRkYgKGJsYWNrIG9wYXF1ZSkuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGNvbG9yX2luZGV4IDo6CisgICAqICAgICBDb2xvciBpbmRleCBmcm9tIHRoZSBDT0xSIHRhYmxlLgorICAgKgorICAgKiAgIGJhc2VfZ2x5cGggOjoKKyAgICogICAgIFNsb3QgZm9yIGJpdG1hcCB0byBiZSBtZXJnZWQgaW50by4gIFRoZSB1bmRlcmx5aW5nIGJpdG1hcCBtYXkgZ2V0CisgICAqICAgICByZWFsbG9jYXRlZC4KKyAgICoKKyAgICogICBuZXdfZ2x5cGggOjoKKyAgICogICAgIFNsb3QgdG8gYmUgaW5jb29wZXJhdGVkIGludG8gYGJhc2VfZ2x5cGhgLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICBSZXR1cm5zIGFuIGVycm9yIGlmCisgICAqICAgY29sb3JfaW5kZXggaXMgaW52YWxpZCBvciByZWFsbG9jYXRpb24gZmFpbHMuCisgICAqLworICB0eXBlZGVmIEZUX0Vycm9yCisgICgqVFRfQmxlbmRfQ29scl9GdW5jKSggVFRfRmFjZSAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgY29sb3JfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBiYXNlX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgbmV3X2dseXBoICk7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0dldF9OYW1lX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZyb20gdGhlICduYW1lJyB0YWJsZSwgcmV0dXJuIGEgZ2l2ZW4gRU5HTElTSCBuYW1lIHJlY29yZCBpbiBBU0NJSS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgbmFtZWlkIDo6CisgICAqICAgICBUaGUgbmFtZSBpZCBvZiB0aGUgbmFtZSByZWNvcmQgdG8gcmV0dXJuLgorICAgKgorICAgKiBAaW5vdXQ6CisgICAqICAgbmFtZSA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgYW4gYWxsb2NhdGVkIHN0cmluZyBwb2ludGVyLiAgYE5VTExgIGlmIG5vIG5hbWUgaXMKKyAgICogICAgIHByZXNlbnQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9HZXRfTmFtZV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICBuYW1laWQsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBuYW1lICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTmFtZV9JRF9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWFyY2ggd2hldGhlciBhbiBFTkdMSVNIIHZlcnNpb24gZm9yIGEgZ2l2ZW4gbmFtZSBJRCBpcyBpbiB0aGUgICAgKi8KLSAgLyogICAgYG5hbWUnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1laWQgICA6OiBUaGUgbmFtZSBpZCBvZiB0aGUgbmFtZSByZWNvcmQgdG8gcmV0dXJuLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aW4gICAgICA6OiBJZiBub24tbmVnYXRpdmUsIGFuIGluZGV4IGludG8gdGhlIGBuYW1lJyB0YWJsZSB3aXRoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgKDMsMSkgb3IgKDMsMCkgV2luZG93cyBlbnRyeS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcHBsZSAgICA6OiBJZiBub24tbmVnYXRpdmUsIGFuIGluZGV4IGludG8gdGhlIGBuYW1lJyB0YWJsZSB3aXRoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgKDEsMCkgQXBwbGUgZW50cnkuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMSBpZiB0aGVyZSBpcyBlaXRoZXIgYSB3aW4gb3IgYXBwbGUgZW50cnkgKG9yIGJvdGgpLCAwIG90aGVyaXdzZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0dldF9OYW1lX0lEX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFNlYXJjaCB3aGV0aGVyIGFuIEVOR0xJU0ggdmVyc2lvbiBmb3IgYSBnaXZlbiBuYW1lIElEIGlzIGluIHRoZSAnbmFtZScKKyAgICogICB0YWJsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgbmFtZWlkIDo6CisgICAqICAgICBUaGUgbmFtZSBpZCBvZiB0aGUgbmFtZSByZWNvcmQgdG8gcmV0dXJuLgorICAgKgorICAgKiBAb3V0cHV0OgorICAgKiAgIHdpbiA6OgorICAgKiAgICAgSWYgbm9uLW5lZ2F0aXZlLCBhbiBpbmRleCBpbnRvIHRoZSAnbmFtZScgdGFibGUgd2l0aCB0aGUKKyAgICogICAgIGNvcnJlc3BvbmRpbmcgKDMsMSkgb3IgKDMsMCkgV2luZG93cyBlbnRyeS4KKyAgICoKKyAgICogICBhcHBsZSA6OgorICAgKiAgICAgSWYgbm9uLW5lZ2F0aXZlLCBhbiBpbmRleCBpbnRvIHRoZSAnbmFtZScgdGFibGUgd2l0aCB0aGUKKyAgICogICAgIGNvcnJlc3BvbmRpbmcgKDEsMCkgQXBwbGUgZW50cnkuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgMSBpZiB0aGVyZSBpcyBlaXRoZXIgYSB3aW4gb3IgYXBwbGUgZW50cnkgKG9yIGJvdGgpLCAwIG90aGVyaXdzZS4KKyAgICovCiAgIHR5cGVkZWYgRlRfQm9vbAogICAoKlRUX0dldF9OYW1lX0lEX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgbmFtZWlkLApAQCAtNDg2LDQyICs2MjYsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICphcHBsZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBgZmFjZS0+Z290b190YWJsZScgdG8gc2VlayB0aGUgc3RyZWFtIHRvIHRoZSAgICAgKi8KLSAgLyogICAgc3RhcnQgb2YgdGhlIHRhYmxlLCBleGNlcHQgd2hpbGUgbG9hZGluZyB0aGUgZm9udCBkaXJlY3RvcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRfVGFibGVfRnVuYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgTG9hZCBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIGZ1bmN0aW9uIHVzZXMgYGZhY2UtPmdvdG9fdGFibGVgIHRvIHNlZWsgdGhlIHN0cmVhbSB0byB0aGUgc3RhcnQKKyAgICogICBvZiB0aGUgdGFibGUsIGV4Y2VwdCB3aGlsZSBsb2FkaW5nIHRoZSBmb250IGRpcmVjdG9yeS4KKyAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpUVF9Mb2FkX1RhYmxlX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWUgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdHlwZToKKyAgICogICBUVF9GcmVlX1RhYmxlX0Z1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEZyZWUgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpUVF9GcmVlX1RhYmxlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7CiAKQEAgLTUzNCw5ICs2NzcsMTQgQEAKICAgICogICAgUmV0dXJuIHRoZSBob3Jpem9udGFsIGtlcm5pbmcgdmFsdWUgYmV0d2VlbiB0d28gZ2x5cGhzLgogICAgKgogICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCi0gICAqICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBsZWZ0IGdseXBoIGluZGV4LgotICAgKiAgICByaWdodF9nbHlwaCA6OiBUaGUgcmlnaHQgZ2x5cGggaW5kZXguCisgICAqICAgIGZhY2UgOjoKKyAgICogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgICBsZWZ0X2dseXBoIDo6CisgICAqICAgICAgVGhlIGxlZnQgZ2x5cGggaW5kZXguCisgICAqCisgICAqICAgIHJpZ2h0X2dseXBoIDo6CisgICAqICAgICAgVGhlIHJpZ2h0IGdseXBoIGluZGV4LgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBUaGUga2VybmluZyB2YWx1ZSBpbiBmb250IHVuaXRzLgpAQCAtNTQ3LDE4ICs2OTUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcmlnaHRfZ2x5cGggKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGhvbGRzIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIGFuZCAgICAqLwotICAvKiAgICBmcmVlIHRoZSBiYXNpYyB0YWJsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gYSBgc2ZudCcgZm9udCBmaWxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGUgdmFyaW91cyB4eHhfRnVuYygpIGRlc2NyaXB0aW9ucyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFNGTlRfSW50ZXJmYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBob2xkcyBwb2ludGVycyB0byB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBhbmQgZnJlZQorICAgKiAgIHRoZSBiYXNpYyB0YWJsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gYSAnc2ZudCcgZm9udCBmaWxlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIENoZWNrIHRoZSB2YXJpb3VzIHh4eF9GdW5jKCkgZGVzY3JpcHRpb25zIGZvciBkZXRhaWxzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFNGTlRfSW50ZXJmYWNlXwogICB7CiAgICAgVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMgICAgICBnb3RvX3RhYmxlOwpAQCAtNjE2LDYgKzc2NCwxNCBAQAogICAgIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgc2V0X3NiaXRfc3RyaWtlOwogICAgIFRUX0xvYWRfU3RyaWtlX01ldHJpY3NfRnVuYyAgbG9hZF9zdHJpa2VfbWV0cmljczsKIAorICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9jcGFsOworICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9jb2xyOworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgZnJlZV9jcGFsOworICAgIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgICAgICAgZnJlZV9jb2xyOworICAgIFRUX1NldF9QYWxldHRlX0Z1bmMgICAgICAgICAgc2V0X3BhbGV0dGU7CisgICAgVFRfR2V0X0NvbHJfTGF5ZXJfRnVuYyAgICAgICBnZXRfY29scl9sYXllcjsKKyAgICBUVF9CbGVuZF9Db2xyX0Z1bmMgICAgICAgICAgIGNvbHJfYmxlbmQ7CisKICAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgIGdldF9tZXRyaWNzOwogCiAgICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICBnZXRfbmFtZTsKQEAgLTYyNyw3ICs3ODMsNiBAQAogICAvKiB0cmFuc2l0aW9uYWwgKi8KICAgdHlwZWRlZiBTRk5UX0ludGVyZmFjZSogICBTRk5UX1NlcnZpY2U7CiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKIAogI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICBcCiAgICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTY1OSw2ICs4MTQsMTMgQEAKICAgICAgICAgICBmcmVlX2VibGNfLCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHNldF9zYml0X3N0cmlrZV8sICAgICAgICAgICAgICBcCiAgICAgICAgICAgbG9hZF9zdHJpa2VfbWV0cmljc18sICAgICAgICAgIFwKKyAgICAgICAgICBsb2FkX2NwYWxfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGxvYWRfY29scl8sICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZnJlZV9jcGFsXywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBmcmVlX2NvbHJfLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNldF9wYWxldHRlXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgZ2V0X2NvbHJfbGF5ZXJfLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjb2xyX2JsZW5kXywgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBnZXRfbmFtZV9pZF8gKSAgICAgICAgICAgICAgICAgXApAQCAtNjkyLDg5ICs4NTQsMTggQEAKICAgICBmcmVlX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHNldF9zYml0X3N0cmlrZV8sICAgICAgICAgICAgICAgICAgICBcCiAgICAgbG9hZF9zdHJpa2VfbWV0cmljc18sICAgICAgICAgICAgICAgIFwKKyAgICBsb2FkX2NwYWxfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxvYWRfY29scl8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnJlZV9jcGFsXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcmVlX2NvbHJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNldF9wYWxldHRlXywgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ2V0X2NvbHJfbGF5ZXJfLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb2xyX2JsZW5kXywgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBnZXRfbmFtZV9pZF8gICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9OwogCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0lOVEVSTkFMKCBhLCBhXyApICBcCi0gICAgICAgICAgY2xhenotPmEgPSBhXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfbmFtZV9pZF8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRk5UX0ludGVyZmFjZSogIGNsYXp6ICkgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nb3RvX3RhYmxlICAgICAgICAgID0gZ290b190YWJsZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPmluaXRfZmFjZSAgICAgICAgICAgPSBpbml0X2ZhY2VfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9mYWNlICAgICAgICAgICA9IGxvYWRfZmFjZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX2ZhY2UgICAgICAgICAgID0gZG9uZV9mYWNlXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9pbnRlcmZhY2UgICAgICAgPSBnZXRfaW50ZXJmYWNlXzsgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9hbnkgICAgICAgICAgICA9IGxvYWRfYW55XzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2hlYWQgICAgICAgICAgID0gbG9hZF9oZWFkXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfaGhlYSAgICAgICAgICAgPSBsb2FkX2hoZWFfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9jbWFwICAgICAgICAgICA9IGxvYWRfY21hcF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX21heHAgICAgICAgICAgID0gbG9hZF9tYXhwXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfb3MyICAgICAgICAgICAgPSBsb2FkX29zMl87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9wb3N0ICAgICAgICAgICA9IGxvYWRfcG9zdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX25hbWUgICAgICAgICAgID0gbG9hZF9uYW1lXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmZyZWVfbmFtZSAgICAgICAgICAgPSBmcmVlX25hbWVfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9rZXJuICAgICAgICAgICA9IGxvYWRfa2Vybl87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2dhc3AgICAgICAgICAgID0gbG9hZF9nYXNwXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfcGNsdCAgICAgICAgICAgPSBsb2FkX3BjbHRfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9iaGVkICAgICAgICAgICA9IGxvYWRfYmhlZF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3NiaXRfaW1hZ2UgICAgID0gbG9hZF9zYml0X2ltYWdlXzsgICAgICBcCi0gICAgY2xhenotPmdldF9wc25hbWUgICAgICAgICAgPSBnZXRfcHNuYW1lXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZnJlZV9wc25hbWVzICAgICAgICA9IGZyZWVfcHNuYW1lc187ICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfa2VybmluZyAgICAgICAgID0gZ2V0X2tlcm5pbmdfOyAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZm9udF9kaXIgICAgICAgPSBsb2FkX2ZvbnRfZGlyXzsgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9obXR4ICAgICAgICAgICA9IGxvYWRfaG10eF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2VibGMgICAgICAgICAgID0gbG9hZF9lYmxjXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmZyZWVfZWJsYyAgICAgICAgICAgPSBmcmVlX2VibGNfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X3NiaXRfc3RyaWtlICAgICA9IHNldF9zYml0X3N0cmlrZV87ICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3N0cmlrZV9tZXRyaWNzID0gbG9hZF9zdHJpa2VfbWV0cmljc187ICBcCi0gICAgY2xhenotPmdldF9tZXRyaWNzICAgICAgICAgPSBnZXRfbWV0cmljc187ICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X25hbWUgICAgICAgICAgICA9IGdldF9uYW1lXzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfbmFtZV9pZCAgICAgICAgID0gZ2V0X25hbWVfaWRfOyAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCiAKIEZUX0VORF9IRUFERVIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaAppbmRleCAyMTE4ZTMzLi42YTBmZTVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaAorKysgYi9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaApAQCAtMSwzMiArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDF0eXBlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFR5cGUxL1R5cGUyIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxdHlwZXMuaAorICoKKyAqICAgQmFzaWMgVHlwZTEvVHlwZTIgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uCisgKiAgIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUMVRZUEVTX0hfCiAjZGVmaW5lIFQxVFlQRVNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfSEFTSF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL3QxdGFibGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0aGFzaC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC00NSwzNiArNDQsMzkgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBhIGN1c3RvbSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY2hhcnMgIDo6IFRoZSBudW1iZXIgb2YgY2hhcmFjdGVyIGNvZGVzIGluIHRoZSBlbmNvZGluZy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBVc3VhbGx5IDI1Ni4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb2RlX2ZpcnN0IDo6IFRoZSBsb3dlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvZGVfbGFzdCAgOjogVGhlIGhpZ2hlc3QgdmFsaWQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlIGVuY29kaW5nICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICsgMS4gV2hlbiBlcXVhbCB0byBjb2RlX2ZpcnN0IHRoZXJlIGFyZSBubyB2YWxpZCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX2luZGV4IDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW5kaWNlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfbmFtZSAgOjogQW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVDFfRW5jb2RpbmdSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIGEgY3VzdG9tIGVuY29kaW5nLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG51bV9jaGFycyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXIgY29kZXMgaW4gdGhlIGVuY29kaW5nLiAgVXN1YWxseSAyNTYuCisgICAqCisgICAqICAgY29kZV9maXJzdCA6OgorICAgKiAgICAgVGhlIGxvd2VzdCB2YWxpZCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgZW5jb2RpbmcuCisgICAqCisgICAqICAgY29kZV9sYXN0IDo6CisgICAqICAgICBUaGUgaGlnaGVzdCB2YWxpZCBjaGFyYWN0ZXIgY29kZSBpbiB0aGUgZW5jb2RpbmcgKyAxLiBXaGVuIGVxdWFsIHRvCisgICAqICAgICBjb2RlX2ZpcnN0IHRoZXJlIGFyZSBubyB2YWxpZCBjaGFyYWN0ZXIgY29kZXMuCisgICAqCisgICAqICAgY2hhcl9pbmRleCA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRpY2VzLgorICAgKgorICAgKiAgIGNoYXJfbmFtZSA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgY29ycmVzcG9uZGluZyBnbHlwaCBuYW1lcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUMV9FbmNvZGluZ1JlY1JlY18KICAgewogICAgIEZUX0ludCAgICAgICBudW1fY2hhcnM7CiAgICAgRlRfSW50ICAgICAgIGNvZGVfZmlyc3Q7CiAgICAgRlRfSW50ICAgICAgIGNvZGVfbGFzdDsKIAotICAgIEZUX1VTaG9ydCogICBjaGFyX2luZGV4OwotICAgIEZUX1N0cmluZyoqICBjaGFyX25hbWU7CisgICAgRlRfVVNob3J0KiAgICAgICAgIGNoYXJfaW5kZXg7CisgICAgY29uc3QgRlRfU3RyaW5nKiogIGNoYXJfbmFtZTsKIAogICB9IFQxX0VuY29kaW5nUmVjLCAqVDFfRW5jb2Rpbmc7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgKaW5kZXggMTBkZDMzNi4uYzM2MzQyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBTRk5UL1RydWVUeXBlIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dHR5cGVzLmgKKyAqCisgKiAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uCisgKiAgIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVFRZUEVTX0hfCiAjZGVmaW5lIFRUVFlQRVNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhYmxlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y29sb3IuaD4KIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KICNlbmRpZgogCiAKQEAgLTQ2LDI3ICs0NiwzMCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUQ19IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiAgICAqLwotICAvKiAgICB0aGUgZm9udCBoZWFkZXJzIG9mIGVhY2ggZGlzdGluY3QgVHJ1ZVR5cGUgZmFjZSBpbiB0aGUgZmlsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgIDo6IE11c3QgYmUgYHR0YyAnIHRvIGluZGljYXRlIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICA6OiBUaGUgbnVtYmVyIG9mIGZhY2VzIGluIHRoZSBjb2xsZWN0aW9uLiAgVGhlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGxvbmcsIGJ1dCAqLwotICAvKiAgICAgICAgICAgICAgIHdlIHVzZSBhIHNpZ25lZCBsb25nIHNpbmNlIHdlIG5lZWQgdGhlIHZhbHVlIC0xIGZvciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBzcGVjaWZpYyBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzIDo6IFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUQ19IZWFkZXJSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiB0aGUKKyAgICogICBmb250IGhlYWRlcnMgb2YgZWFjaCBkaXN0aW5jdCBUcnVlVHlwZSBmYWNlIGluIHRoZSBmaWxlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHRhZyA6OgorICAgKiAgICAgTXVzdCBiZSAndHRjficgdG8gaW5kaWNhdGUgYSBUcnVlVHlwZSBjb2xsZWN0aW9uLgorICAgKgorICAgKiAgIHZlcnNpb24gOjoKKyAgICogICAgIFRoZSB2ZXJzaW9uIG51bWJlci4KKyAgICoKKyAgICogICBjb3VudCA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBmYWNlcyBpbiB0aGUgY29sbGVjdGlvbi4gIFRoZSBzcGVjaWZpY2F0aW9uIHNheXMgdGhpcworICAgKiAgICAgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGxvbmcsIGJ1dCB3ZSB1c2UgYSBzaWduZWQgbG9uZyBzaW5jZSB3ZSBuZWVkCisgICAqICAgICB0aGUgdmFsdWUgLTEgZm9yIHNwZWNpZmljIHB1cnBvc2VzLgorICAgKgorICAgKiAgIG9mZnNldHMgOjoKKyAgICogICAgIFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVENfSGVhZGVyUmVjXwogICB7CiAgICAgRlRfVUxvbmcgICB0YWc7CkBAIC03NywyNSArODAsMzAgQEAKICAgfSBUVENfSGVhZGVyUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVCBmaWxlIGZvcm1hdCBoZWFkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0X3RhZyAgICAgOjogVGhlIGZvbnQgZm9ybWF0IHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fdGFibGVzICAgICA6OiBUaGUgbnVtYmVyIG9mIHRhYmxlcyBpbiBmaWxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlYXJjaF9yYW5nZSAgIDo6IE11c3QgYmUgYDE2ICogKG1heCBwb3dlciBvZiAyIDw9IG51bV90YWJsZXMpJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW50cnlfc2VsZWN0b3IgOjogTXVzdCBiZSBsb2cyIG9mIGBzZWFyY2hfcmFuZ2UgLyAxNicuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZV9zaGlmdCAgICA6OiBNdXN0IGJlIGBudW1fdGFibGVzICogMTYgLSBzZWFyY2hfcmFuZ2UnLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFNGTlRfSGVhZGVyUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTRk5UIGZpbGUgZm9ybWF0IGhlYWRlci4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBmb3JtYXRfdGFnIDo6CisgICAqICAgICBUaGUgZm9udCBmb3JtYXQgdGFnLgorICAgKgorICAgKiAgIG51bV90YWJsZXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgdGFibGVzIGluIGZpbGUuCisgICAqCisgICAqICAgc2VhcmNoX3JhbmdlIDo6CisgICAqICAgICBNdXN0IGJlICcxNiAqIChtYXggcG93ZXIgb2YgMiA8PSBudW1fdGFibGVzKScuCisgICAqCisgICAqICAgZW50cnlfc2VsZWN0b3IgOjoKKyAgICogICAgIE11c3QgYmUgbG9nMiBvZiAnc2VhcmNoX3JhbmdlIC8gMTYnLgorICAgKgorICAgKiAgIHJhbmdlX3NoaWZ0IDo6CisgICAqICAgICBNdXN0IGJlICdudW1fdGFibGVzICogMTYgLSBzZWFyY2hfcmFuZ2UnLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFNGTlRfSGVhZGVyUmVjXwogICB7CiAgICAgRlRfVUxvbmcgICBmb3JtYXRfdGFnOwpAQCAtMTA5LDI0ICsxMTcsMjggQEAKICAgfSBTRk5UX0hlYWRlclJlYywgKlNGTlRfSGVhZGVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgZ2l2ZW4gdGFibGUgb2YgYSBUcnVlVHlwZSBmb250LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGFnICAgICAgOjogQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVja1N1bSA6OiBUaGUgdGFibGUgY2hlY2tzdW0uICBUaGlzIHZhbHVlIGNhbiBiZSBpZ25vcmVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9mZnNldCAgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIHRhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUcnVlVHlwZSAqLwotICAvKiAgICAgICAgICAgICAgICBmb250IGluIGl0cyByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExlbmd0aCAgIDo6IFRoZSB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfVGFibGVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgVHJ1ZVR5cGUgZm9udC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBUYWcgOjoKKyAgICogICAgIEEgZm91ci1ieXRlcyB0YWcgZGVzY3JpYmluZyB0aGUgdGFibGUuCisgICAqCisgICAqICAgQ2hlY2tTdW0gOjoKKyAgICogICAgIFRoZSB0YWJsZSBjaGVja3N1bS4gIFRoaXMgdmFsdWUgY2FuIGJlIGlnbm9yZWQuCisgICAqCisgICAqICAgT2Zmc2V0IDo6CisgICAqICAgICBUaGUgb2Zmc2V0IG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCBpbiBpdHMKKyAgICogICAgIHJlc291cmNlLgorICAgKgorICAgKiAgIExlbmd0aCA6OgorICAgKiAgICAgVGhlIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1RhYmxlUmVjXwogICB7CiAgICAgRlRfVUxvbmcgIFRhZzsgICAgICAgIC8qICAgICAgICB0YWJsZSB0eXBlICovCkBAIC0xMzcsODkgKzE0OSwyMiBAQAogICB9IFRUX1RhYmxlUmVjLCAqVFRfVGFibGU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGX0hlYWRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGIGZpbGUgZm9ybWF0IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dPRkYvI1dPRkZIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkZfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICBzaWduYXR1cmU7Ci0gICAgRlRfVUxvbmcgICBmbGF2b3I7Ci0gICAgRlRfVUxvbmcgICBsZW5ndGg7Ci0gICAgRlRfVVNob3J0ICBudW1fdGFibGVzOwotICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7Ci0gICAgRlRfVUxvbmcgICB0b3RhbFNmbnRTaXplOwotICAgIEZUX1VTaG9ydCAgbWFqb3JWZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgbWlub3JWZXJzaW9uOwotICAgIEZUX1VMb25nICAgbWV0YU9mZnNldDsKLSAgICBGVF9VTG9uZyAgIG1ldGFMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBtZXRhT3JpZ0xlbmd0aDsKLSAgICBGVF9VTG9uZyAgIHByaXZPZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBwcml2TGVuZ3RoOwotCi0gIH0gV09GRl9IZWFkZXJSZWMsICpXT0ZGX0hlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdPRkZfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgV09GRiBmb250LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRhZyAgICAgICAgOjogQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT2Zmc2V0ICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgV09GRiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udCBpbiBpdHMgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcExlbmd0aCA6OiBDb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPcmlnTGVuZ3RoIDo6IFVuY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrU3VtICAgOjogVGhlIHRhYmxlIGNoZWNrc3VtLiAgVGhpcyB2YWx1ZSBjYW4gYmUgaWdub3JlZC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3JpZ09mZnNldCA6OiBUaGUgdW5jb21wcmVzc2VkIHRhYmxlIGZpbGUgb2Zmc2V0LiAgVGhpcyB2YWx1ZSBnZXRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgd2hpbGUgY29uc3RydWN0aW5nIHRoZSAodW5jb21wcmVzc2VkKSBTRk5UICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGhlYWRlci4gIEl0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIFdPRkYgZmlsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBXT0ZGX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIFRhZzsgICAgICAgICAgIC8qIHRhYmxlIElEICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VTG9uZyAgT2Zmc2V0OyAgICAgICAgLyogdGFibGUgZmlsZSBvZmZzZXQgICAgICAgICAqLwotICAgIEZUX1VMb25nICBDb21wTGVuZ3RoOyAgICAvKiBjb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAgICovCi0gICAgRlRfVUxvbmcgIE9yaWdMZW5ndGg7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKi8KLSAgICBGVF9VTG9uZyAgQ2hlY2tTdW07ICAgICAgLyogdW5jb21wcmVzc2VkIGNoZWNrc3VtICAgICAqLwotCi0gICAgRlRfVUxvbmcgIE9yaWdPZmZzZXQ7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBmaWxlIG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobm90IGluIHRoZSBXT0ZGIGZpbGUpICAgICAgICAgKi8KLSAgfSBXT0ZGX1RhYmxlUmVjLCAqV09GRl9UYWJsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvbmdNZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBsb25nIG1ldHJpY3Mgb2YgdGhlIGBobXR4JyBhbmQgYHZtdHgnICAgICAqLwotICAvKiAgICBUcnVlVHlwZSB0YWJsZXMuICBUaGUgdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodCBmb3IgdGhlIGdseXBoLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJlYXJpbmcgOjogVGhlIGxlZnQtc2lkZSBvciB0b3Atc2lkZSBiZWFyaW5nIGZvciB0aGUgZ2x5cGguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfTG9uZ01ldHJpY3NSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBsb25nIG1ldHJpY3Mgb2YgdGhlICdobXR4JyBhbmQgJ3ZtdHgnCisgICAqICAgVHJ1ZVR5cGUgdGFibGVzLiAgVGhlIHZhbHVlcyBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgYWR2YW5jZSA6OgorICAgKiAgICAgVGhlIGFkdmFuY2Ugd2lkdGggb3IgaGVpZ2h0IGZvciB0aGUgZ2x5cGguCisgICAqCisgICAqICAgYmVhcmluZyA6OgorICAgKiAgICAgVGhlIGxlZnQtc2lkZSBvciB0b3Atc2lkZSBiZWFyaW5nIGZvciB0aGUgZ2x5cGguCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfTG9uZ01ldHJpY3NSZWNfCiAgIHsKICAgICBGVF9VU2hvcnQgIGFkdmFuY2U7CkBAIC0yMjgsNDUgKzE3Myw1MSBAQAogICB9IFRUX0xvbmdNZXRyaWNzUmVjLCAqVFRfTG9uZ01ldHJpY3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TaG9ydE1ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlIHRvIG1vZGVsIHRoZSBzaG9ydCBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgKi8KLSAgLyogICAgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHR5cGU6CisgICAqICAgVFRfU2hvcnRNZXRyaWNzCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHNpbXBsZSB0eXBlIHRvIG1vZGVsIHRoZSBzaG9ydCBtZXRyaWNzIG9mIHRoZSAnaG10eCcgYW5kICd2bXR4JworICAgKiAgIHRhYmxlcy4KKyAgICovCiAgIHR5cGVkZWYgRlRfU2hvcnQgIFRUX1Nob3J0TWV0cmljczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05hbWVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIFRydWVUeXBlIG5hbWUgcmVjb3Jkcy4gIE5hbWUgcmVjb3JkcyBhcmUgdXNlZCAqLwotICAvKiAgICB0byBzdG9yZSBpbXBvcnRhbnQgc3RyaW5ncyBsaWtlIGZhbWlseSBuYW1lLCBzdHlsZSBuYW1lLCAgICAgICAgICAgKi8KLSAgLyogICAgY29weXJpZ2h0LCBldGMuIGluIF9sb2NhbGl6ZWRfIHZlcnNpb25zIChpLmUuLCBsYW5ndWFnZSwgZW5jb2RpbmcsICovCi0gIC8qICAgIGV0YykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtSUQgICA6OiBUaGUgSUQgb2YgdGhlIG5hbWUncyBlbmNvZGluZyBwbGF0Zm9ybS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmdJRCAgIDo6IFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBlbmNvZGluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYW5ndWFnZUlEICAgOjogVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGxhbmd1YWdlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVJRCAgICAgICA6OiBUaGUgSUQgc3BlY2lmeWluZyB3aGF0IGtpbmQgb2YgbmFtZSB0aGlzIGlzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nTGVuZ3RoIDo6IFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdPZmZzZXQgOjogVGhlIG9mZnNldCB0byB0aGUgc3RyaW5nIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZyAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZydzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZXNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYXJlIHVzdWFsbHkgVVRGLTE2IGVuY29kZWQgY2hhcmFjdGVycy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX05hbWVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIFRydWVUeXBlIG5hbWUgcmVjb3Jkcy4gIE5hbWUgcmVjb3JkcyBhcmUgdXNlZCB0bworICAgKiAgIHN0b3JlIGltcG9ydGFudCBzdHJpbmdzIGxpa2UgZmFtaWx5IG5hbWUsIHN0eWxlIG5hbWUsIGNvcHlyaWdodCwKKyAgICogICBldGMuIGluIF9sb2NhbGl6ZWRfIHZlcnNpb25zIChpLmUuLCBsYW5ndWFnZSwgZW5jb2RpbmcsIGV0YykuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgcGxhdGZvcm1JRCA6OgorICAgKiAgICAgVGhlIElEIG9mIHRoZSBuYW1lJ3MgZW5jb2RpbmcgcGxhdGZvcm0uCisgICAqCisgICAqICAgZW5jb2RpbmdJRCA6OgorICAgKiAgICAgVGhlIHBsYXRmb3JtLXNwZWNpZmljIElEIGZvciB0aGUgbmFtZSdzIGVuY29kaW5nLgorICAgKgorICAgKiAgIGxhbmd1YWdlSUQgOjoKKyAgICogICAgIFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBsYW5ndWFnZS4KKyAgICoKKyAgICogICBuYW1lSUQgOjoKKyAgICogICAgIFRoZSBJRCBzcGVjaWZ5aW5nIHdoYXQga2luZCBvZiBuYW1lIHRoaXMgaXMuCisgICAqCisgICAqICAgc3RyaW5nTGVuZ3RoIDo6CisgICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnl0ZXMuCisgICAqCisgICAqICAgc3RyaW5nT2Zmc2V0IDo6CisgICAqICAgICBUaGUgb2Zmc2V0IHRvIHRoZSBzdHJpbmcgaW4gdGhlICduYW1lJyB0YWJsZS4KKyAgICoKKyAgICogICBzdHJpbmcgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc3RyaW5nJ3MgYnl0ZXMuICBOb3RlIHRoYXQgdGhlc2UgYXJlIHVzdWFsbHkgVVRGLTE2CisgICAqICAgICBlbmNvZGVkIGNoYXJhY3RlcnMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfTmFtZVJlY18KICAgewogICAgIEZUX1VTaG9ydCAgcGxhdGZvcm1JRDsKQEAgLTI4NCwyMyArMjM1LDI2IEBACiAgIH0gVFRfTmFtZVJlYywgKlRUX05hbWU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9MYW5nVGFnUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBsYW5ndWFnZSB0YWcgcmVjb3JkcyBpbiBTRk5UIGBuYW1lJyB0YWJsZXMsICAgKi8KLSAgLyogICAgaW50cm9kdWNlZCBpbiBPcGVuVHlwZSB2ZXJzaW9uIDEuNi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nTGVuZ3RoIDo6IFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBieXRlcy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmdPZmZzZXQgOjogVGhlIG9mZnNldCB0byB0aGUgc3RyaW5nIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZyAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZydzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZXNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYXJlIFVURi0xNkJFIGVuY29kZWQgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX0xhbmdUYWdSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIGxhbmd1YWdlIHRhZyByZWNvcmRzIGluIFNGTlQgJ25hbWUnIHRhYmxlcywKKyAgICogICBpbnRyb2R1Y2VkIGluIE9wZW5UeXBlIHZlcnNpb24gMS42LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIHN0cmluZ0xlbmd0aCA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGJ5dGVzLgorICAgKgorICAgKiAgIHN0cmluZ09mZnNldCA6OgorICAgKiAgICAgVGhlIG9mZnNldCB0byB0aGUgc3RyaW5nIGluIHRoZSAnbmFtZScgdGFibGUuCisgICAqCisgICAqICAgc3RyaW5nIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHN0cmluZydzIGJ5dGVzLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBVVEYtMTZCRQorICAgKiAgICAgZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgVFRfTGFuZ1RhZ1JlY18KICAgewogICAgIEZUX1VTaG9ydCAgc3RyaW5nTGVuZ3RoOwpAQCAtMzE0LDMwICsyNjgsMzYgQEAKICAgfSBUVF9MYW5nVGFnUmVjLCAqVFRfTGFuZ1RhZzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05hbWVUYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSBuYW1lIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgICAgICAgICAgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtTmFtZVJlY29yZHMgICAgOjogVGhlIG51bWJlciBvZiBuYW1lcyBpbiB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdG9yYWdlT2Zmc2V0ICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBuYW1lIHRhYmxlIGluIHRoZSBgbmFtZScgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lcyAgICAgICAgICAgICA6OiBBbiBhcnJheSBvZiBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bUxhbmdUYWdSZWNvcmRzIDo6IFRoZSBudW1iZXIgb2YgbGFuZ3VhZ2UgdGFncyBpbiB0YWJsZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ1RhZ3MgICAgICAgICAgOjogQW4gYXJyYXkgb2YgbGFuZ3VhZ2UgdGFnIHJlY29yZHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgICAgICA6OiBUaGUgZmlsZSdzIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX05hbWVUYWJsZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIFRydWVUeXBlIG5hbWUgdGFibGUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgZm9ybWF0IDo6CisgICAqICAgICBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIHRhYmxlLgorICAgKgorICAgKiAgIG51bU5hbWVSZWNvcmRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIG5hbWVzIGluIHRhYmxlLgorICAgKgorICAgKiAgIHN0b3JhZ2VPZmZzZXQgOjoKKyAgICogICAgIFRoZSBvZmZzZXQgb2YgdGhlIG5hbWUgdGFibGUgaW4gdGhlICduYW1lJyBUcnVlVHlwZSB0YWJsZS4KKyAgICoKKyAgICogICBuYW1lcyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgbmFtZSByZWNvcmRzLgorICAgKgorICAgKiAgIG51bUxhbmdUYWdSZWNvcmRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGxhbmd1YWdlIHRhZ3MgaW4gdGFibGUuCisgICAqCisgICAqICAgbGFuZ1RhZ3MgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGxhbmd1YWdlIHRhZyByZWNvcmRzLgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIGZpbGUncyBpbnB1dCBzdHJlYW0uCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfTmFtZVRhYmxlUmVjXwogICB7CiAgICAgRlRfVVNob3J0ICAgICAgIGZvcm1hdDsKQEAgLTM2NCwyMSArMzI0LDIzIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0aW55IHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgZ2FzcCByYW5nZSBhY2NvcmRpbmcgdG8gdGhlICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBQRU0gIDo6IFRoZSBtYXhpbXVtIHBwZW0gdmFsdWUgdG8gd2hpY2ggYGdhc3BGbGFnJyBhcHBsaWVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcEZsYWcgOjogQSBmbGFnIGRlc2NyaWJpbmcgdGhlIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyAgICovCi0gIC8qICAgICAgICAgICAgICAgIG1vZGVzIHRvIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfR2FzcFJhbmdlUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHRpbnkgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnYXNwIHJhbmdlIGFjY29yZGluZyB0byB0aGUgVHJ1ZVR5cGUKKyAgICogICBzcGVjaWZpY2F0aW9uLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG1heFBQRU0gOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIHBwZW0gdmFsdWUgdG8gd2hpY2ggYGdhc3BGbGFnYCBhcHBsaWVzLgorICAgKgorICAgKiAgIGdhc3BGbGFnIDo6CisgICAqICAgICBBIGZsYWcgZGVzY3JpYmluZyB0aGUgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nIG1vZGVzIHRvIGJlCisgICAqICAgICB1c2VkLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BSYW5nZVJlY18KICAgewogICAgIEZUX1VTaG9ydCAgbWF4UFBFTTsKQEAgLTM5MSwyMiArMzUzLDI1IEBACiAjZGVmaW5lIFRUX0dBU1BfRE9HUkFZICAgMHgwMgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIFRydWVUeXBlIGBnYXNwJyB0YWJsZSB1c2VkIHRvIHNwZWNpZnkgICAgICovCi0gIC8qICAgIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyBiZWhhdmlvdXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtUmFuZ2VzICA6OiBUaGUgbnVtYmVyIG9mIGdhc3AgcmFuZ2VzIGluIHRhYmxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwUmFuZ2VzIDo6IEFuIGFycmF5IG9mIGdhc3AgcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX0dhc3BSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBUcnVlVHlwZSAnZ2FzcCcgdGFibGUgdXNlZCB0byBzcGVjaWZ5CisgICAqICAgZ3JpZC1maXR0aW5nIGFuZCBhbnRpLWFsaWFzaW5nIGJlaGF2aW91ci4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICB2ZXJzaW9uIDo6CisgICAqICAgICBUaGUgdmVyc2lvbiBudW1iZXIuCisgICAqCisgICAqICAgbnVtUmFuZ2VzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGdhc3AgcmFuZ2VzIGluIHRhYmxlLgorICAgKgorICAgKiAgIGdhc3BSYW5nZXMgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGdhc3AgcmFuZ2VzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BfCiAgIHsKICAgICBGVF9VU2hvcnQgICAgIHZlcnNpb247CkBAIC00MjksMzMgKzM5NCw0MSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgYmlnIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCBiaXRtYXAgICAqLwotICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQuICBUaGVzZSBhcmUgdXN1YWxseSBmb3VuZCBpbiB0aGUgICAgKi8KLSAgLyogICAgYEVCRFQnIChNaWNyb3NvZnQpIG9yIGBibG9jJyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgICAgIDo6IFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWCA6OiBUaGUgaG9yaXpvbnRhbCBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUJlYXJpbmdZIDo6IFRoZSBob3Jpem9udGFsIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQWR2YW5jZSAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWCA6OiBUaGUgdmVydGljYWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEJlYXJpbmdZIDo6IFRoZSB2ZXJ0aWNhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX1NCaXRfTWV0cmljc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBiaWcgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGJpdG1hcCBpbiBhCisgICAqICAgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAnRUJEVCcKKyAgICogICAoTWljcm9zb2Z0KSBvciAnYmxvYycgKEFwcGxlKSB0YWJsZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBoZWlnaHQgOjoKKyAgICogICAgIFRoZSBnbHlwaCBoZWlnaHQgaW4gcGl4ZWxzLgorICAgKgorICAgKiAgIHdpZHRoIDo6CisgICAqICAgICBUaGUgZ2x5cGggd2lkdGggaW4gcGl4ZWxzLgorICAgKgorICAgKiAgIGhvcmlCZWFyaW5nWCA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgbGVmdCBiZWFyaW5nLgorICAgKgorICAgKiAgIGhvcmlCZWFyaW5nWSA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgdG9wIGJlYXJpbmcuCisgICAqCisgICAqICAgaG9yaUFkdmFuY2UgOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIGFkdmFuY2UuCisgICAqCisgICAqICAgdmVydEJlYXJpbmdYIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgbGVmdCBiZWFyaW5nLgorICAgKgorICAgKiAgIHZlcnRCZWFyaW5nWSA6OgorICAgKiAgICAgVGhlIHZlcnRpY2FsIHRvcCBiZWFyaW5nLgorICAgKgorICAgKiAgIHZlcnRBZHZhbmNlIDo6CisgICAqICAgICBUaGUgdmVydGljYWwgYWR2YW5jZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X01ldHJpY3NSZWNfCiAgIHsKICAgICBGVF9VU2hvcnQgIGhlaWdodDsKQEAgLTQ3MiwyNyArNDQ1LDMyIEBACiAgIH0gVFRfU0JpdF9NZXRyaWNzUmVjLCAqVFRfU0JpdF9NZXRyaWNzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9TbWFsbE1ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBzbWFsbCBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICovCi0gIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAgICAqLwotICAvKiAgICBgRUJEVCcgKE1pY3Jvc29mdCkgb3IgdGhlIGBiZGF0JyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmVhcmluZ1ggOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nWSA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfU0JpdF9TbWFsbE1ldHJpY3NSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCB0aGUgc21hbGwgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGJpdG1hcCBpbgorICAgKiAgIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAnRUJEVCcKKyAgICogICAoTWljcm9zb2Z0KSBvciB0aGUgJ2JkYXQnIChBcHBsZSkgdGFibGUuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgaGVpZ2h0IDo6CisgICAqICAgICBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4KKyAgICoKKyAgICogICB3aWR0aCA6OgorICAgKiAgICAgVGhlIGdseXBoIHdpZHRoIGluIHBpeGVscy4KKyAgICoKKyAgICogICBiZWFyaW5nWCA6OgorICAgKiAgICAgVGhlIGxlZnQtc2lkZSBiZWFyaW5nLgorICAgKgorICAgKiAgIGJlYXJpbmdZIDo6CisgICAqICAgICBUaGUgdG9wLXNpZGUgYmVhcmluZy4KKyAgICoKKyAgICogICBhZHZhbmNlIDo6CisgICAqICAgICBUaGUgYWR2YW5jZSB3aWR0aCBvciBoZWlnaHQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TbWFsbF9NZXRyaWNzXwogICB7CiAgICAgRlRfQnl0ZSAgaGVpZ2h0OwpAQCAtNTA1LDU3ICs0ODMsNjAgQEAKICAgfSBUVF9TQml0X1NtYWxsTWV0cmljc1JlYywgKlRUX1NCaXRfU21hbGxNZXRyaWNzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgdGV4dCBsaW5lIG1ldHJpY3Mgb2YgYSBnaXZlbiAgICAgICovCi0gIC8qICAgIGJpdG1hcCBzdHJpa2UsIGZvciBlaXRoZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBhc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGRlc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfd2lkdGggICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAwIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X29mZnNldCAgICAgICAgICAgIDo6IE9mZnNldCBpbiBwaXhlbHMgdG8gbW92ZSB0aGUgY2FyZXQgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXIgcG9zaXRpb25pbmcuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9vcmlnaW5fU0IgICAgICAgICAgIDo6IE1pbmltdW0gb2YgaG9yaUJlYXJpbmdYIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX2FkdmFuY2VfU0IgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaG9yaUJlYXJpbmdYICsgd2lkdGggKSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQgKSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9iZWZvcmVfQkwgICAgICAgICAgIDo6IE1heGltdW0gb2YgaG9yaUJlYXJpbmdZIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9hZnRlcl9CTCAgICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpQmVhcmluZ1kgLSBoZWlnaHQgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdYIC0gd2lkdGggICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkcyAgICAgICAgICAgICAgICAgICAgOjogVW51c2VkICh0byBtYWtlIHRoZSBzaXplIG9mIHRoZSByZWNvcmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbXVsdGlwbGUgb2YgMzIgYml0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgdGV4dCBsaW5lIG1ldHJpY3Mgb2YgYSBnaXZlbiBiaXRtYXAKKyAgICogICBzdHJpa2UsIGZvciBlaXRoZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGxheW91dC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBhc2NlbmRlciA6OgorICAgKiAgICAgVGhlIGFzY2VuZGVyIGluIHBpeGVscy4KKyAgICoKKyAgICogICBkZXNjZW5kZXIgOjoKKyAgICogICAgIFRoZSBkZXNjZW5kZXIgaW4gcGl4ZWxzLgorICAgKgorICAgKiAgIG1heF93aWR0aCA6OgorICAgKiAgICAgVGhlIG1heGltdW0gZ2x5cGggd2lkdGggaW4gcGl4ZWxzLgorICAgKgorICAgKiAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgOjoKKyAgICogICAgIFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0IHRvIDEgZm9yIG5vbi1pdGFsaWMgZm9udHMuCisgICAqCisgICAqICAgY2FyZXRfc2xvcGVfZGVub21pbmF0b3IgOjoKKyAgICogICAgIFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0IHRvIDAgZm9yIG5vbi1pdGFsaWMgZm9udHMuCisgICAqCisgICAqICAgY2FyZXRfb2Zmc2V0IDo6CisgICAqICAgICBPZmZzZXQgaW4gcGl4ZWxzIHRvIG1vdmUgdGhlIGNhcmV0IGZvciBwcm9wZXIgcG9zaXRpb25pbmcuCisgICAqCisgICAqICAgbWluX29yaWdpbl9TQiA6OgorICAgKiAgICAgTWluaW11bSBvZiBob3JpQmVhcmluZ1ggKHJlc3AuICB2ZXJ0QmVhcmluZ1kpLgorICAgKiAgIG1pbl9hZHZhbmNlX1NCIDo6CisgICAqICAgICBNaW5pbXVtIG9mCisgICAqCisgICAqICAgICBob3Jpem9udGFsIGFkdmFuY2UgLSAoIGhvcmlCZWFyaW5nWCArIHdpZHRoICkKKyAgICoKKyAgICogICAgIHJlc3AuCisgICAqCisgICAqICAgICB2ZXJ0aWNhbCBhZHZhbmNlIC0gKCB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQgKQorICAgKgorICAgKiAgIG1heF9iZWZvcmVfQkwgOjoKKyAgICogICAgIE1heGltdW0gb2YgaG9yaUJlYXJpbmdZIChyZXNwLiAgdmVydEJlYXJpbmdZKS4KKyAgICoKKyAgICogICBtaW5fYWZ0ZXJfQkwgOjoKKyAgICogICAgIE1pbmltdW0gb2YKKyAgICoKKyAgICogICAgIGhvcmlCZWFyaW5nWSAtIGhlaWdodAorICAgKgorICAgKiAgICAgcmVzcC4KKyAgICoKKyAgICogICAgIHZlcnRCZWFyaW5nWCAtIHdpZHRoCisgICAqCisgICAqICAgcGFkcyA6OgorICAgKiAgICAgVW51c2VkICh0byBtYWtlIHRoZSBzaXplIG9mIHRoZSByZWNvcmQgYSBtdWx0aXBsZSBvZiAzMiBiaXRzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWNfCiAgIHsKICAgICBGVF9DaGFyICBhc2NlbmRlcjsKQEAgLTU3Myw0MyArNTU0LDUzIEBACiAgIH0gVFRfU0JpdF9MaW5lTWV0cmljc1JlYywgKlRUX1NCaXRfTGluZU1ldHJpY3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1JhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFRydWVUeXBlL09wZW5UeXBlIHN1YkluZGV4VGFibGUgYXMgZGVmaW5lZCBpbiB0aGUgYEVCTEMnICAgICAgICAgKi8KLSAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlyc3RfZ2x5cGggICA6OiBUaGUgZmlyc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYXN0X2dseXBoICAgIDo6IFRoZSBsYXN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluZGV4X2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBpbmRleCB0YWJsZS4gIFZhbGlkIHZhbHVlcyBhcmUgMSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRvIDUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltYWdlX2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBgRUJEVCcgaW1hZ2UgZGF0YS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1hZ2Vfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IHRvIGltYWdlIGRhdGEgaW4gYEVCRFQnLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbWFnZV9zaXplICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBzaXplIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaWdfbWV0cmljcyAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBiaWcgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBtZXRyaWNzIGZvciBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBnbHlwaHMgaW4gdGhlIGNvZGUgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9vZmZzZXRzIDo6IEZvciBpbmRleCBmb3JtYXRzIDEgYW5kIDMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2NvZGVzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBpbmRleCB0YWJsZSBpbiB0aGUgYEVCTEMnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBPbmx5IHVzZWQgZHVyaW5nIHN0cmlrZSBsb2FkaW5nLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfU0JpdF9SYW5nZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBUcnVlVHlwZS9PcGVuVHlwZSBzdWJJbmRleFRhYmxlIGFzIGRlZmluZWQgaW4gdGhlICdFQkxDJyAoTWljcm9zb2Z0KQorICAgKiAgIG9yICdibG9jJyAoQXBwbGUpIHRhYmxlcy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBmaXJzdF9nbHlwaCA6OgorICAgKiAgICAgVGhlIGZpcnN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4KKyAgICoKKyAgICogICBsYXN0X2dseXBoIDo6CisgICAqICAgICBUaGUgbGFzdCBnbHlwaCBpbmRleCBpbiB0aGUgcmFuZ2UuCisgICAqCisgICAqICAgaW5kZXhfZm9ybWF0IDo6CisgICAqICAgICBUaGUgZm9ybWF0IG9mIGluZGV4IHRhYmxlLiAgVmFsaWQgdmFsdWVzIGFyZSAxIHRvIDUuCisgICAqCisgICAqICAgaW1hZ2VfZm9ybWF0IDo6CisgICAqICAgICBUaGUgZm9ybWF0IG9mICdFQkRUJyBpbWFnZSBkYXRhLgorICAgKgorICAgKiAgIGltYWdlX29mZnNldCA6OgorICAgKiAgICAgVGhlIG9mZnNldCB0byBpbWFnZSBkYXRhIGluICdFQkRUJy4KKyAgICoKKyAgICogICBpbWFnZV9zaXplIDo6CisgICAqICAgICBGb3IgaW5kZXggZm9ybWF0cyAyIGFuZCA1LiAgVGhpcyBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGdseXBoCisgICAqICAgICBiaXRtYXAuCisgICAqCisgICAqICAgYmlnX21ldHJpY3MgOjoKKyAgICogICAgIEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBiaWcgbWV0cmljcyBmb3IgZWFjaCBnbHlwaAorICAgKiAgICAgYml0bWFwLgorICAgKgorICAgKiAgIG51bV9nbHlwaHMgOjoKKyAgICogICAgIEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBjb2RlCisgICAqICAgICBhcnJheS4KKyAgICoKKyAgICogICBnbHlwaF9vZmZzZXRzIDo6CisgICAqICAgICBGb3IgaW5kZXggZm9ybWF0cyAxIGFuZCAzLgorICAgKgorICAgKiAgIGdseXBoX2NvZGVzIDo6CisgICAqICAgICBGb3IgaW5kZXggZm9ybWF0cyA0IGFuZCA1LgorICAgKgorICAgKiAgIHRhYmxlX29mZnNldCA6OgorICAgKiAgICAgVGhlIG9mZnNldCBvZiB0aGUgaW5kZXggdGFibGUgaW4gdGhlICdFQkxDJyB0YWJsZS4gIE9ubHkgdXNlZCBkdXJpbmcKKyAgICogICAgIHN0cmlrZSBsb2FkaW5nLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfUmFuZ2VSZWNfCiAgIHsKICAgICBGVF9VU2hvcnQgICAgICAgICAgIGZpcnN0X2dseXBoOwpAQCAtNjMxLDQ3ICs2MjIsNTUgQEAKICAgfSBUVF9TQml0X1JhbmdlUmVjLCAqVFRfU0JpdF9SYW5nZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU3RyaWtlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc3RyaWtlIGluIHRoZSBgRUJMQycgICAgICAqLwotICAvKiAgICAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG51bV9pbmRleF9yYW5nZXMgOjogVGhlIG51bWJlciBvZiBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaW5kZXhfcmFuZ2VzICAgICA6OiBBbiBhcnJheSBvZiBnbHlwaCBpbmRleCByYW5nZXMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjb2xvcl9yZWYgICAgICAgIDo6IFVudXNlZC4gIGBjb2xvcl9yZWYnIGlzIHB1dCBpbiBmb3IgZnV0dXJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBlbmhhbmNlbWVudHMsIGJ1dCB0aGVzZSBmaWVsZHMgYXJlIGFscmVhZHkgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgaW4gdXNlIGJ5IG90aGVyIHBsYXRmb3JtcyAoZS5nLiBOZXd0b24pLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEZvciBkZXRhaWxzLCBwbGVhc2Ugc2VlICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGhvcmkgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgaG9yaXpvbnRhbCBsYXlvdXRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdmVydCAgICAgICAgICAgICA6OiBUaGUgbGluZSBtZXRyaWNzIGZvciB2ZXJ0aWNhbCBsYXlvdXRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydF9nbHlwaCAgICAgIDo6IFRoZSBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVuZF9nbHlwaCAgICAgICAgOjogVGhlIGhpZ2hlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeF9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB5X3BwZW0gICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgdmVydGljYWwgcGl4ZWxzIHBlciBFTS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGJpdF9kZXB0aCAgICAgICAgOjogVGhlIGJpdCBkZXB0aC4gIFZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFuZCA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZsYWdzICAgICAgICAgICAgOjogSXMgdGhpcyBhIHZlcnRpY2FsIG9yIGhvcml6b250YWwgc3RyaWtlPyAgRm9yICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGRldGFpbHMsIHBsZWFzZSBzZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9TQml0X1N0cmlrZVJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCBkZXNjcmliZSBhIGdpdmVuIGJpdG1hcCBzdHJpa2UgaW4gdGhlICdFQkxDJworICAgKiAgIChNaWNyb3NvZnQpIG9yICdibG9jJyAoQXBwbGUpIHRhYmxlcy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogIG51bV9pbmRleF9yYW5nZXMgOjoKKyAgICogICAgVGhlIG51bWJlciBvZiBpbmRleCByYW5nZXMuCisgICAqCisgICAqICBpbmRleF9yYW5nZXMgOjoKKyAgICogICAgQW4gYXJyYXkgb2YgZ2x5cGggaW5kZXggcmFuZ2VzLgorICAgKgorICAgKiAgY29sb3JfcmVmIDo6CisgICAqICAgIFVudXNlZC4gIGBjb2xvcl9yZWZgIGlzIHB1dCBpbiBmb3IgZnV0dXJlIGVuaGFuY2VtZW50cywgYnV0IHRoZXNlCisgICAqICAgIGZpZWxkcyBhcmUgYWxyZWFkeSBpbiB1c2UgYnkgb3RoZXIgcGxhdGZvcm1zIChlLmcuIE5ld3RvbikuICBGb3IKKyAgICogICAgZGV0YWlscywgcGxlYXNlIHNlZQorICAgKgorICAgKiAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sCisgICAqCisgICAqICBob3JpIDo6CisgICAqICAgIFRoZSBsaW5lIG1ldHJpY3MgZm9yIGhvcml6b250YWwgbGF5b3V0cy4KKyAgICoKKyAgICogIHZlcnQgOjoKKyAgICogICAgVGhlIGxpbmUgbWV0cmljcyBmb3IgdmVydGljYWwgbGF5b3V0cy4KKyAgICoKKyAgICogIHN0YXJ0X2dseXBoIDo6CisgICAqICAgIFRoZSBsb3dlc3QgZ2x5cGggaW5kZXggZm9yIHRoaXMgc3RyaWtlLgorICAgKgorICAgKiAgZW5kX2dseXBoIDo6CisgICAqICAgIFRoZSBoaWdoZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4KKyAgICoKKyAgICogIHhfcHBlbSA6OgorICAgKiAgICBUaGUgbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIHBlciBFTS4KKyAgICoKKyAgICogIHlfcHBlbSA6OgorICAgKiAgICBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uCisgICAqCisgICAqICBiaXRfZGVwdGggOjoKKyAgICogICAgVGhlIGJpdCBkZXB0aC4gIFZhbGlkIHZhbHVlcyBhcmUgMSwgMiwgNCwgYW5kIDguCisgICAqCisgICAqICBmbGFncyA6OgorICAgKiAgICBJcyB0aGlzIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBzdHJpa2U/ICBGb3IgZGV0YWlscywgcGxlYXNlIHNlZQorICAgKgorICAgKiAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2YmxvYy5odG1sCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TdHJpa2VSZWNfCiAgIHsKICAgICBGVF9JbnQgICAgICAgICAgICAgICAgICBudW1fcmFuZ2VzOwpAQCAtNjk1LDIxICs2OTQsMjQgQEAKICAgfSBUVF9TQml0X1N0cmlrZVJlYywgKlRUX1NCaXRfU3RyaWtlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9Db21wb25lbnRSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHRvIGRlc2NyaWJlIGEgY29tcG91bmQgc2JpdCBlbGVtZW50LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfY29kZSA6OiBUaGUgZWxlbWVudCdzIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X29mZnNldCAgIDo6IFRoZSBlbGVtZW50J3MgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlfb2Zmc2V0ICAgOjogVGhlIGVsZW1lbnQncyB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfU0JpdF9Db21wb25lbnRSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc2ltcGxlIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIGNvbXBvdW5kIHNiaXQgZWxlbWVudC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBnbHlwaF9jb2RlIDo6CisgICAqICAgICBUaGUgZWxlbWVudCdzIGdseXBoIGluZGV4LgorICAgKgorICAgKiAgIHhfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgZWxlbWVudCdzIGxlZnQgYmVhcmluZy4KKyAgICoKKyAgICogICB5X29mZnNldCA6OgorICAgKiAgICAgVGhlIGVsZW1lbnQncyB0b3AgYmVhcmluZy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0X0NvbXBvbmVudFJlY18KICAgewogICAgIEZUX1VTaG9ydCAgZ2x5cGhfY29kZTsKQEAgLTcxOSwyOCArNzIxLDM0IEBACiAgIH0gVFRfU0JpdF9Db21wb25lbnRSZWMsICpUVF9TQml0X0NvbXBvbmVudDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU2NhbGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc2NhbGluZyB0YWJsZSwgYXMgZGVmaW5lZCAqLwotICAvKiAgICBpbiB0aGUgYEVCU0MnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpICAgICAgICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnQgICAgICAgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB4X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHlfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9TQml0X1NjYWxlUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHNjYWxpbmcgdGFibGUsIGFzIGRlZmluZWQgaW4KKyAgICogICB0aGUgJ0VCU0MnIHRhYmxlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGhvcmkgOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIGxpbmUgbWV0cmljcy4KKyAgICoKKyAgICogICB2ZXJ0IDo6CisgICAqICAgICBUaGUgdmVydGljYWwgbGluZSBtZXRyaWNzLgorICAgKgorICAgKiAgIHhfcHBlbSA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uCisgICAqCisgICAqICAgeV9wcGVtIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uCisgICAqCisgICAqICAgeF9wcGVtX3N1YnN0aXR1dGUgOjoKKyAgICogICAgIFN1YnN0aXR1dGlvbiB4X3BwZW0gdmFsdWUuCisgICAqCisgICAqICAgeV9wcGVtX3N1YnN0aXR1dGUgOjoKKyAgICogICAgIFN1YnN0aXR1dGlvbiB5X3BwZW0gdmFsdWUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TY2FsZVJlY18KICAgewogICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIGhvcmk7CkBAIC03NjgsMjQgKzc3NiwyOCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfMjBSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi4wLiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mICAgICAqLwotICAvKiAgICBlYWNoIGdseXBoIGluIHRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgIDo6IFRoZSBudW1iZXIgb2YgbmFtZWQgZ2x5cGhzIGluIHRoZSB0YWJsZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9uYW1lcyAgICAgOjogVGhlIG51bWJlciBvZiBQUyBuYW1lcyBzdG9yZWQgaW4gdGhlIHRhYmxlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfaW5kaWNlcyA6OiBUaGUgaW5kaWNlcyBvZiB0aGUgZ2x5cGhzIGluIHRoZSBuYW1lcyBhcnJheXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9uYW1lcyAgIDo6IFRoZSBQUyBuYW1lcyBub3QgaW4gTWFjIEVuY29kaW5nLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX1Bvc3RfMjBSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi4wLiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mIGVhY2gKKyAgICogICBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG51bV9nbHlwaHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgbmFtZWQgZ2x5cGhzIGluIHRoZSB0YWJsZS4KKyAgICoKKyAgICogICBudW1fbmFtZXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgUFMgbmFtZXMgc3RvcmVkIGluIHRoZSB0YWJsZS4KKyAgICoKKyAgICogICBnbHlwaF9pbmRpY2VzIDo6CisgICAqICAgICBUaGUgaW5kaWNlcyBvZiB0aGUgZ2x5cGhzIGluIHRoZSBuYW1lcyBhcnJheXMuCisgICAqCisgICAqICAgZ2x5cGhfbmFtZXMgOjoKKyAgICogICAgIFRoZSBQUyBuYW1lcyBub3QgaW4gTWFjIEVuY29kaW5nLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjBSZWNfCiAgIHsKICAgICBGVF9VU2hvcnQgICBudW1fZ2x5cGhzOwpAQCAtNzk2LDIxICs4MDgsMjIgQEAKICAgfSBUVF9Qb3N0XzIwUmVjLCAqVFRfUG9zdF8yMDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfMjVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi41LiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mICAgICAqLwotICAvKiAgICBlYWNoIGdseXBoIGluIHRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgICAgOjogQW4gYXJyYXkgb2Ygc2lnbmVkIG9mZnNldHMgaW4gYSBub3JtYWwgTWFjICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIFBvc3RzY3JpcHQgbmFtZSBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX1Bvc3RfMjVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFBvc3RzY3JpcHQgbmFtZXMgc3ViLXRhYmxlLCBmb3JtYXQgMi41LiAgU3RvcmVzIHRoZSBQUyBuYW1lIG9mIGVhY2gKKyAgICogICBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIG51bV9nbHlwaHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSB0YWJsZS4KKyAgICoKKyAgICogICBvZmZzZXRzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBzaWduZWQgb2Zmc2V0cyBpbiBhIG5vcm1hbCBNYWMgUG9zdHNjcmlwdCBuYW1lIGVuY29kaW5nLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjVfCiAgIHsKICAgICBGVF9VU2hvcnQgIG51bV9nbHlwaHM7CkBAIC04MTksMjEgKzgzMiwyNCBAQAogICB9IFRUX1Bvc3RfMjVSZWMsICpUVF9Qb3N0XzI1OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyB0YWJsZSwgZWl0aGVyIGZvcm1hdCAyLjAgb3IgMi41LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVkICAgIDo6IEEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBQUyBuYW1lcyBhcmUgbG9hZGVkLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfMjAgOjogVGhlIHN1Yi10YWJsZSB1c2VkIGZvciBmb3JtYXQgMi4wLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF8yNSA6OiBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfUG9zdF9OYW1lc1JlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUG9zdHNjcmlwdCBuYW1lcyB0YWJsZSwgZWl0aGVyIGZvcm1hdCAyLjAgb3IgMi41LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGxvYWRlZCA6OgorICAgKiAgICAgQSBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIFBTIG5hbWVzIGFyZSBsb2FkZWQuCisgICAqCisgICAqICAgZm9ybWF0XzIwIDo6CisgICAqICAgICBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjAuCisgICAqCisgICAqICAgZm9ybWF0XzI1IDo6CisgICAqICAgICBUaGUgc3ViLXRhYmxlIHVzZWQgZm9yIGZvcm1hdCAyLjUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF9OYW1lc1JlY18KICAgewogICAgIEZUX0Jvb2wgIGxvYWRlZDsKQEAgLTg3OSwyNSArODk1LDI1IEBACiAKICAgLyoKICAgICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gc3VwcG9ydCBhIGBCREYgJyB0YWJsZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlCi0gICAqIG9mZmljaWFsIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBJdCBpcyBtYWlubHkgdXNlZCBpbiBTRk5ULWJhc2VkCi0gICAqIGJpdG1hcCBmb250cyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSBzZXQgb2YgQkRGIGZvbnRzLgorICAgKiBvZmZpY2lhbCBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgSXQgaXMgbWFpbmx5IHVzZWQgaW4gU0ZOVC1iYXNlZCBiaXRtYXAKKyAgICogZm9udHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmcm9tIGEgc2V0IG9mIEJERiBmb250cy4KICAgICoKICAgICogVGhlIGZvcm1hdCBvZiB0aGUgdGFibGUgaXMgYXMgZm9sbG93cy4KICAgICoKLSAgICogICBVU0hPUlQgICB2ZXJzaW9uICAgICAgYEJERiAnIHRhYmxlIHZlcnNpb24gbnVtYmVyLCBzaG91bGQgYmUgMHgwMDAxLgotICAgKiAgIFVTSE9SVCAgIHN0cmlrZUNvdW50ICBOdW1iZXIgb2Ygc3RyaWtlcyAoYml0bWFwIHNpemVzKSBpbiB0aGlzIHRhYmxlLgotICAgKiAgIFVMT05HICAgIHN0cmluZ1RhYmxlICBPZmZzZXQgKGZyb20gc3RhcnQgb2YgQkRGIHRhYmxlKSB0byBzdHJpbmcKKyAgICogICBVU0hPUlQgdmVyc2lvbiBgQkRGICcgdGFibGUgdmVyc2lvbiBudW1iZXIsIHNob3VsZCBiZSAweDAwMDEuICBVU0hPUlQKKyAgICogICBzdHJpa2VDb3VudCBOdW1iZXIgb2Ygc3RyaWtlcyAoYml0bWFwIHNpemVzKSBpbiB0aGlzIHRhYmxlLiAgVUxPTkcKKyAgICogICBzdHJpbmdUYWJsZSBPZmZzZXQgKGZyb20gc3RhcnQgb2YgQkRGIHRhYmxlKSB0byBzdHJpbmcKICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuCiAgICAqCiAgICAqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YgYHN0cmlrZUNvdW50JyBkZXNjcmlwdG9ycywgaGF2aW5nIHRoZQogICAgKiBmb2xsb3dpbmcgZm9ybWF0LgogICAgKgotICAgKiAgIFVTSE9SVCAgIHBwZW0gICAgICAgICBWZXJ0aWNhbCBwaXhlbHMgcGVyIEVNIGZvciB0aGlzIHN0cmlrZS4KLSAgICogICBVU0hPUlQgICBudW1JdGVtcyAgICAgTnVtYmVyIG9mIGl0ZW1zIGZvciB0aGlzIHN0cmlrZSAocHJvcGVydGllcyBhbmQKKyAgICogICBVU0hPUlQgcHBlbSBWZXJ0aWNhbCBwaXhlbHMgcGVyIEVNIGZvciB0aGlzIHN0cmlrZS4gIFVTSE9SVCBudW1JdGVtcworICAgKiAgIE51bWJlciBvZiBpdGVtcyBmb3IgdGhpcyBzdHJpa2UgKHByb3BlcnRpZXMgYW5kCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21zKS4gIE1heGltdW0gaXMgMjU1LgogICAgKgotICAgKiBUaGlzIGFycmF5IGluIHR1cm4gaXMgZm9sbG93ZWQgYnkgYHN0cmlrZUNvdW50JyB2YWx1ZSBzZXRzLiAgRWFjaAotICAgKiBgdmFsdWUgc2V0JyBpcyBhbiBhcnJheSBvZiBgbnVtSXRlbXMnIGl0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBmb3JtYXQuCisgICAqIFRoaXMgYXJyYXkgaW4gdHVybiBpcyBmb2xsb3dlZCBieSBgc3RyaWtlQ291bnQnIHZhbHVlIHNldHMuICBFYWNoIGB2YWx1ZQorICAgKiBzZXQnIGlzIGFuIGFycmF5IG9mIGBudW1JdGVtcycgaXRlbXMgd2l0aCB0aGUgZm9sbG93aW5nIGZvcm1hdC4KICAgICoKICAgICogICBVTE9ORyAgICBpdGVtX25hbWUgICAgT2Zmc2V0IGluIHN0cmluZyB0YWJsZSB0byBpdGVtIG5hbWUuCiAgICAqICAgVVNIT1JUICAgaXRlbV90eXBlICAgIFRoZSBpdGVtIHR5cGUuICBQb3NzaWJsZSB2YWx1ZXMgYXJlCkBAIC05NDUsMzEgKzk2MSwzMCBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzdHJ1Y3R1cmUvY2xhc3MgaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2UgaXQgaXMgY29tbW9uIHRvIHRoZSAgICAgICovCi0gIC8qIGZvbGxvd2luZyBmb3JtYXRzOiBUVEYsIE9wZW5UeXBlLVRULCBhbmQgT3BlblR5cGUtQ0ZGLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgY2xhc3NlcyBUVF9TaXplIGFuZCBUVF9HbHlwaFNsb3QgYXJlIG5vdCAgICAgICovCi0gIC8qIHNoYXJlZCBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSB0aHVzIGRlZmluZWQgaW4gYHR0b2Jqcy5oJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIHN0cnVjdHVyZS9jbGFzcyBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBpdCBpcyBjb21tb24gdG8gdGhlCisgICAqIGZvbGxvd2luZyBmb3JtYXRzOiBUVEYsIE9wZW5UeXBlLVRULCBhbmQgT3BlblR5cGUtQ0ZGLgorICAgKgorICAgKiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBjbGFzc2VzIFRUX1NpemUgYW5kIFRUX0dseXBoU2xvdCBhcmUgbm90IHNoYXJlZAorICAgKiBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSB0aHVzIGRlZmluZWQgaW4gYHR0b2Jqcy5oYC4KKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGZhY2UvZm9udCBvYmplY3QuICBBIFRUX0ZhY2UgZW5jYXBzdWxhdGVzICAgKi8KLSAgLyogICAgdGhlIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250ICAgICovCi0gIC8qICAgIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUVF9GYWNlIHN0cnVjdHVyZSBpcyBhbHNvIHVzZWQgYXMgYSBgcGFyZW50IGNsYXNzJyBmb3IgdGhlICAgICAqLwotICAvKiAgICBPcGVuVHlwZS1DRkYgY2xhc3MgKFQyX0ZhY2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAdHlwZToKKyAgICogICBUVF9GYWNlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGZhY2UvZm9udCBvYmplY3QuICBBIFRUX0ZhY2UgZW5jYXBzdWxhdGVzIHRoZQorICAgKiAgIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250IHJlc291cmNlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgVFRfRmFjZSBzdHJ1Y3R1cmUgaXMgYWxzbyB1c2VkIGFzIGEgJ3BhcmVudCBjbGFzcycgZm9yIHRoZQorICAgKiAgIE9wZW5UeXBlLUNGRiBjbGFzcyAoVDJfRmFjZSkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBUVF9GYWNlUmVjXyogIFRUX0ZhY2U7CiAKIApAQCAtOTgxLDMxICs5OTYsMzQgQEAKICAgdHlwZWRlZiBzdHJ1Y3QgVFRfTG9hZGVyUmVjXyogIFRUX0xvYWRlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgaW4gYnl0ZXMuICBTZXQgdG8gMCBpZiBub3QgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZWVrcyBhIHN0cmVhbSB0byB0aGUgc3RhcnQgb2YgYSBnaXZlbiBUcnVlVHlwZSB0YWJsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgdGFnIDo6CisgICAqICAgICBBIDQtYnl0ZSB0YWcgdXNlZCB0byBuYW1lIHRoZSB0YWJsZS4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBvdXRwdXQ6CisgICAqICAgbGVuZ3RoIDo6CisgICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSB0YWJsZSBpbiBieXRlcy4gIFNldCB0byAwIGlmIG5vdCBuZWVkZWQuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luLgorICAgKi8KICAgdHlwZWRlZiBGVF9FcnJvcgogICAoKlRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jKSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCkBAIC0xMDEzLDM0ICsxMDMxLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2Vla3MgYSBzdHJlYW0gdG8gdGhlIHN0YXJ0IG9mIGEgZ2l2ZW4gZ2x5cGggZWxlbWVudCwgYW5kIG9wZW5zIGEgICovCi0gIC8qICAgIGZyYW1lIGZvciBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggaW5kZXggOjogVGhlIGluZGV4IG9mIHRoZSBnbHlwaCB0byBhY2Nlc3MuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBnbHlwaCBhY2NvcmRpbmcgdG8gdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYGxvY2F0aW9ucycgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBieXRlX2NvdW50ICA6OiBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5IGVxdWl2YWxlbnQgdG8gRlRfU1RSRUFNX1NFRUsob2Zmc2V0KSAgICAgKi8KLSAgLyogICAgZm9sbG93ZWQgYnkgRlRfRlJBTUVfRU5URVIoYnl0ZV9jb3VudCkgd2l0aCB0aGUgbG9hZGVyJ3Mgc3RyZWFtLCAgICovCi0gIC8qICAgIGJ1dCBhbHRlcm5hdGl2ZSBmb3JtYXRzIChlLmcuIGNvbXByZXNzZWQgb25lcykgbWlnaHQgdXNlIHNvbWV0aGluZyAqLwotICAvKiAgICBkaWZmZXJlbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3R5cGU6CisgICAqICAgVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBTZWVrcyBhIHN0cmVhbSB0byB0aGUgc3RhcnQgb2YgYSBnaXZlbiBnbHlwaCBlbGVtZW50LCBhbmQgb3BlbnMgYQorICAgKiAgIGZyYW1lIGZvciBpdC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGxvYWRlciA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4KKyAgICoKKyAgICogICAgIGdseXBoIGluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggdG8gYWNjZXNzLgorICAgKgorICAgKiAgIG9mZnNldCA6OgorICAgKiAgICAgVGhlIG9mZnNldCBvZiB0aGUgZ2x5cGggYWNjb3JkaW5nIHRvIHRoZSAnbG9jYXRpb25zJyB0YWJsZS4KKyAgICoKKyAgICogICBieXRlX2NvdW50IDo6CisgICAqICAgICBUaGUgc2l6ZSBvZiB0aGUgZnJhbWUgaW4gYnl0ZXMuCisgICAqCisgICAqIEByZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBlcXVpdmFsZW50IHRvIEZUX1NUUkVBTV9TRUVLKG9mZnNldCkKKyAgICogICBmb2xsb3dlZCBieSBGVF9GUkFNRV9FTlRFUihieXRlX2NvdW50KSB3aXRoIHRoZSBsb2FkZXIncyBzdHJlYW0sIGJ1dAorICAgKiAgIGFsdGVybmF0aXZlIGZvcm1hdHMgKGUuZy4gY29tcHJlc3NlZCBvbmVzKSBtaWdodCB1c2Ugc29tZXRoaW5nCisgICAqICAgZGlmZmVyZW50LgorICAgKi8KICAgdHlwZWRlZiBGVF9FcnJvcgogICAoKlRUX0xvYWRlcl9TdGFydEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCkBAIC0xMDQ4LDM2ICsxMDY4LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBieXRlX2NvdW50ICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkcyBvbmUgZ2x5cGggZWxlbWVudCAoaXRzIGhlYWRlciwgYSBzaW1wbGUgZ2x5cGgsIG9yIGEgICAgICAgICAgKi8KLSAgLyogICAgY29tcG9zaXRlKSBmcm9tIHRoZSBsb2FkZXIncyBjdXJyZW50IHN0cmVhbSBmcmFtZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZWFkcyBvbmUgZ2x5cGggZWxlbWVudCAoaXRzIGhlYWRlciwgYSBzaW1wbGUgZ2x5cGgsIG9yIGEgY29tcG9zaXRlKQorICAgKiAgIGZyb20gdGhlIGxvYWRlcidzIGN1cnJlbnQgc3RyZWFtIGZyYW1lLgorICAgKgorICAgKiBAaW5wdXQ6CisgICAqICAgbG9hZGVyIDo6CisgICAqICAgICBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICB0eXBlZGVmIEZUX0Vycm9yCiAgICgqVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyX0VuZEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xvc2VzIHRoZSBjdXJyZW50IGxvYWRlciBzdHJlYW0gZnJhbWUgZm9yIHRoZSBnbHlwaC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyIDo6IFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGZ1bmN0eXBlOgorICAgKiAgIFRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIENsb3NlcyB0aGUgY3VycmVudCBsb2FkZXIgc3RyZWFtIGZyYW1lIGZvciB0aGUgZ2x5cGguCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBsb2FkZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IFRydWVUeXBlIGdseXBoIGxvYWRlciBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHZvaWQKICAgKCpUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIgKTsKIApAQCAtMTEyNCwyNzAgKzExNDYsMzE5IEBACiAjZGVmaW5lIFRUX0ZBQ0VfRkxBR19WQVJfTVZBUiAgKCAxIDw8IDggKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBGYWNlIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgZmFjZSBjbGFzcy4gIFRoZXNlIG9iamVjdHMgbW9kZWwgdGhlIHJlc29sdXRpb24gYW5kICAgKi8KLSAgLyogICAgcG9pbnQtc2l6ZSBpbmRlcGVuZGVudCBkYXRhIGZvdW5kIGluIGEgVHJ1ZVR5cGUgZm9udCBmaWxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgICAgICAgOjogVGhlIGJhc2UgRlRfRmFjZSBzdHJ1Y3R1cmUsIG1hbmFnZWQgYnkgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRjX2hlYWRlciAgICAgICAgICAgOjogVGhlIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLCB1c2VkIHdoZW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGEgYHR0YycgcmF0aGVyIHRoYW4gYSBgdHRmJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igb3JkaW5hcnkgZm9udCBmaWxlcywgdGhlIGZpZWxkICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYHR0Y19oZWFkZXIuY291bnQnIGlzIHNldCB0byAwLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfdGFnICAgICAgICAgICA6OiBUaGUgZm9udCBmb3JtYXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV90YWJsZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgVHJ1ZVR5cGUgdGFibGVzIGluIHRoaXMgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpcl90YWJsZXMgICAgICAgICAgIDo6IFRoZSBkaXJlY3Rvcnkgb2YgVHJ1ZVR5cGUgdGFibGVzIGZvciB0aGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZm9udCBoZWFkZXIgKGBoZWFkJyB0YWJsZSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIG9uIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcml6b250YWwgICAgICAgICAgIDo6IFRoZSBmb250J3MgaG9yaXpvbnRhbCBoZWFkZXIgKGBoaGVhJyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGlzIGZpZWxkIGFsc28gY29udGFpbnMgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgaG10eCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3Byb2ZpbGUgICAgICAgICAgOjogVGhlIGZvbnQncyBtYXhpbXVtIHByb2ZpbGUgdGFibGUuICBSZWFkIG9uICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgb3BlbmluZy4gIE5vdGUgdGhhdCBzb21lIG1heGltdW0gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgY2Fubm90IGJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBXZSB0aHVzIGRlZmluZSBhZGRpdGlvbmFsIGZpZWxkcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRvIGhvbGQgdGhlIGNvbXB1dGVkIG1heGltYS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWxfaW5mbyAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuIHRoZSBmb250IGZpbGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHZlcnRpY2FsIG1ldHJpY3MuICBJZiBub3QsIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsJyBmaWVsZCBpcyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIHZlcnRpY2FsIGhlYWRlciAoYHZoZWEnIHRhYmxlKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUgKGB2bXR4JyksIGlmIGZvdW5kLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6IFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGlmIHRoZSBgdmVydGljYWxfaW5mbycgZmllbGQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVzICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBuYW1lIHJlY29yZHMgd2l0aGluIHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZV90YWJsZSAgICAgICAgICAgOjogVGhlIHRhYmxlIG9mIG5hbWUgcmVjb3JkcyAoYG5hbWUnKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvczIgICAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIE9TLzIgdGFibGUgKGBPUy8yJykuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHQgICAgICAgICAgIDo6IFRoZSBmb250J3MgUG9zdFNjcmlwdCB0YWJsZSAoYHBvc3QnICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcyBhcmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGxvYWRlZCBieSB0aGUgZHJpdmVyIG9uIGZhY2Ugb3BlbmluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgYHR0cG9zdCcgbW9kdWxlIGZvciBtb3JlIGRldGFpbHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF90YWJsZSAgICAgICAgICAgOjogQWRkcmVzcyBvZiB0aGUgZmFjZSdzIGBjbWFwJyBTRk5UIHRhYmxlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1lbW9yeSAoaXQncyBhbiBleHRyYWN0ZWQgZnJhbWUpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF9zaXplICAgICAgICAgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGBjbWFwX3RhYmxlJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ290b190YWJsZSAgICAgICAgICAgOjogQSBmdW5jdGlvbiBjYWxsZWQgYnkgZWFjaCBUcnVlVHlwZSB0YWJsZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciB0byBwb3NpdGlvbiBhIHN0cmVhbSdzIGN1cnNvciB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYSBnaXZlbiB0YWJsZSBhY2NvcmRpbmcgdG8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIHRhZy4gIEl0IGRlZmF1bHRzIHRvIFRUX0dvdG9fRmFjZSBidXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBkaWZmZXJlbnQgZm9yIHN0cmFuZ2UgZm9ybWF0cyAoZS5nLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDQyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjY2Vzc19nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBhY2Nlc3MgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aXRoaW4gdGhlIGZhY2UncyBmb250IGZpbGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcmdldF9nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBmb3JnZXQgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIGxvYWRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlYWRfZ2x5cGhfaGVhZGVyICAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgZ2x5cGggaGVhZGVyLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBiZXR3ZWVuIGFuIGBhY2Nlc3MnIGFuZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvcmdldCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWFkX3NpbXBsZV9nbHlwaCAgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIHNpbXBsZSBnbHlwaC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciB3YXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCBiZWZvcmUgdGhlIGBmb3JnZXQnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVhZF9jb21wb3NpdGVfZ2x5cGggOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBjb21wb3NpdGUgZ2x5cGguICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgd2FzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLCBhbmQgYmVmb3JlIHRoZSBgZm9yZ2V0Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNmbnQgICAgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgU0ZOVCBzZXJ2aWNlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNuYW1lcyAgICAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBQb3N0U2NyaXB0IG5hbWVzIHNlcnZpY2UuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtbSAgICAgICAgICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIE11bHRpcGxlIE1hc3RlcnMgc2VydmljZS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhciAgICAgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgTWV0cmljcyBWYXJpYXRpb25zICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXggICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgaG9yaXpvbnRhbCBkZXZpY2UgbWV0cmljcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYGhkbXgnIHRhYmxlKS4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwICAgICAgICAgICAgICAgICA6OiBUaGUgZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHByb3BlcnRpZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgKGBnYXNwJykuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGNsdCAgICAgICAgICAgICAgICAgOjogVGhlIGBwY2x0JyBTRk5UIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fc2JpdF9zY2FsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc2NhbGVzIGZvciB0aGlzIGZvbnQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXRfc2NhbGVzICAgICAgICAgIDo6IEFycmF5IG9mIHNiaXQgc2NhbGVzIGVtYmVkZGVkIGluIHRoaXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUvT3BlblR5cGUgZm9udC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWVzICAgICA6OiBBIHRhYmxlIHVzZWQgdG8gc3RvcmUgdGhlIFBvc3RzY3JpcHQgbmFtZXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgIHRoZSBnbHlwaHMgZm9yIHRoaXMgZm9udC4gIFNlZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgIGB0dGNvbmZpZy5oJyBmb3IgY29tbWVudHMgb24gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgb3B0aW9uLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnRfcHJvZ3JhbV9zaXplICAgIDo6IFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgMCBpZiBub25lIGRlZmluZWQuICBJZ25vcmVkIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250X3Byb2dyYW0gICAgICAgICA6OiBUaGUgZmFjZSdzIGZvbnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgYXQgbG9hZCB0aW1lLCBhbHNvIHVzZWQgZHVyaW5nICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHJlbmRlcmluZy4gIENvbWVzIGZyb20gdGhlIGBmcGdtJyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9wcm9ncmFtX3NpemUgICAgIDo6IFRoZSBzaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGN2dCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9wcm9ncmFtICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgY3Z0IHByb2dyYW0gKGJ5dGVjb2RlIHN0cmVhbSkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBlYWNoIHRpbWUgYW4gaW5zdGFuY2Uvc2l6ZSBpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC9yZXNldC4gIENvbWVzIGZyb20gdGhlIGBwcmVwJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0X3NpemUgICAgICAgICAgICAgOjogU2l6ZSBvZiB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoaW4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMpLiAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Z0ICAgICAgICAgICAgICAgICAgOjogVGhlIGZhY2UncyBvcmlnaW5hbCBjb250cm9sIHZhbHVlIHRhYmxlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdGVzIGFyZSBleHByZXNzZWQgaW4gdW5zY2FsZWQgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gIENvbWVzIGZyb20gdGhlIGBjdnQgJyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbnRlcnByZXRlciAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGJ5dGVjb2RlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwcmV0ZXJzIGZpZWxkIGlzIGFsc28gdXNlZCB0byBob29rICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWJ1Z2dlciBpbiBgdHRkZWJ1ZycuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXh0cmEgICAgICAgICAgICAgICAgOjogUmVzZXJ2ZWQgZm9yIHRoaXJkLXBhcnR5IGZvbnQgZHJpdmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWUgICAgICA6OiBUaGUgUFMgbmFtZSBvZiB0aGUgZm9udC4gIFVzZWQgYnkgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX2xlbiAgICAgICAgICAgICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBgZ2x5ZicgdGFibGUuICBOZWVkZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX29mZnNldCAgICAgICAgICA6OiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGBnbHlmJyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlzX2NmZjIgICAgICAgICAgICAgIDo6IFNldCBpZiB0aGUgZm9udCBmb3JtYXQgaXMgQ0ZGMi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9ibGVuZCAgICAgICAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCBpZiB0aGUgZm9udCBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGJsZW5kZWQgKHRoaXMgaXMgZm9yIEdYIHZhcikuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxlbmQgICAgICAgICAgICAgICAgOjogQ29udGFpbnMgdGhlIGRhdGEgbmVlZGVkIHRvIGNvbnRyb2wgR1ggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhdGlvbiB0YWJsZXMgKHJhdGhlciBsaWtlIE11bHRpcGxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXN0ZXIgZGF0YSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcmlhdGlvbl9zdXBwb3J0ICAgIDo6IEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hpY2ggT3BlblR5cGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gZm9udCB2YXJpYXRpb24gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBpcyBwcmVzZW50LCB2YWxpZCwgYW5kIHVzYWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBUVF9GQUNFX0ZMQUdfVkFSX0ZWQVIgaXMgb25seSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZGVzaWduIGF4aXMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcl9wb3N0c2NyaXB0X3ByZWZpeCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgUG9zdFNjcmlwdCBuYW1lIHByZWZpeCBuZWVkZWQgZm9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0aW5nIGEgdmFyaWF0aW9uIGZvbnQgaW5zdGFuY2UncyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTIG5hbWUgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmFyX3Bvc3RzY3JpcHRfcHJlZml4X2xlbiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGB2YXJfcG9zdHNjcmlwdF9wcmVmaXgnICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcnpfbWV0cmljc19zaXplICAgIDo6IFRoZSBzaXplIG9mIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydF9tZXRyaWNzX3NpemUgICAgOjogVGhlIHNpemUgb2YgdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbG9jYXRpb25zICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBoIGxvY2F0aW9ucyBpbiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZmlsZS4gIFRoaXMgc2hvdWxkIGJlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCB0byB0aGUgbnVtYmVyIG9mIGdseXBocy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2xvY2F0aW9ucyAgICAgIDo6IEFuIGFycmF5IG9mIGxvbmdzLiAgVGhlc2UgYXJlIG9mZnNldHMgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBkYXRhIHdpdGhpbiB0aGUgYGdseWYnIHRhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnQgZmFjZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZG14X3RhYmxlICAgICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGBoZG14JyB0YWJsZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXhfdGFibGVfc2l6ZSAgICAgIDo6IFRoZSBzaXplIG9mIHRoZSBgaGRteCcgdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGRteF9yZWNvcmRfY291bnQgICAgOjogVGhlIG51bWJlciBvZiBoZG14IHJlY29yZHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZG14X3JlY29yZF9zaXplICAgICA6OiBUaGUgc2l6ZSBvZiBhIHNpbmdsZSBoZG14IHJlY29yZC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhkbXhfcmVjb3JkX3NpemVzICAgIDo6IEFuIGFycmF5IGhvbGRpbmcgdGhlIHBwZW0gc2l6ZXMgYXZhaWxhYmxlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYGhkbXgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXRfdGFibGUgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZm9udCdzIGVtYmVkZGVkIGJpdG1hcCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNiaXRfdGFibGVfc2l6ZSAgICAgIDo6IFRoZSBzaXplIG9mIGBzYml0X3RhYmxlJy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdF90YWJsZV90eXBlICAgICAgOjogVGhlIHNiaXQgdGFibGUgdHlwZSAoQ0JMQywgc2JpeCwgZXRjLikuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X251bV9zdHJpa2VzICAgICA6OiBUaGUgbnVtYmVyIG9mIHNiaXQgc3RyaWtlcyBleHBvc2VkIGJ5ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZVR5cGUncyBBUEksIG9taXR0aW5nIGludmFsaWQgc3RyaWtlcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3N0cmlrZV9tYXAgICAgICA6OiBBIG1hcHBpbmcgYmV0d2VlbiB0aGUgc3RyaWtlIGluZGljZXMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3NlZCBieSB0aGUgQVBJIGFuZCB0aGUgaW5kaWNlcyB1c2VkIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb250J3Mgc2JpdCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl90YWJsZSAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBga2VybicgdGFibGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBrZXJuX3RhYmxlX3NpemUgICAgICA6OiBUaGUgc2l6ZSBvZiB0aGUgYGtlcm4nIHRhYmxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9rZXJuX3RhYmxlcyAgICAgIDo6IFRoZSBudW1iZXIgb2Ygc3VwcG9ydGVkIGtlcm4gc3VidGFibGVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXAgdG8gMzI7IEZyZWVUeXBlIHJlY29nbml6ZXMgb25seSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbCBvbmVzIHdpdGggZm9ybWF0IDApLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBrZXJuX2F2YWlsX2JpdHMgICAgICA6OiBUaGUgYXZhaWxhYmlsaXR5IHN0YXR1cyBvZiBrZXJuIHN1YnRhYmxlczsgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYml0IG4gaXMgc2V0LCB0YWJsZSBuIGlzIGF2YWlsYWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBrZXJuX29yZGVyX2JpdHMgICAgICA6OiBUaGUgc29ydGVkbmVzcyBzdGF0dXMgb2Yga2VybiBzdWJ0YWJsZXM7ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYml0IG4gaXMgc2V0LCB0YWJsZSBuIGlzIHNvcnRlZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZGYgICAgICAgICAgICAgICAgICA6OiBEYXRhIHJlbGF0ZWQgdG8gYW4gU0ZOVCBmb250J3MgYGJkZicgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU7IHNlZSBgdHR0eXBlcy5oJy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3J6X21ldHJpY3Nfb2Zmc2V0ICA6OiBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlIGBobXR4JyB0YWJsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRfbWV0cmljc19vZmZzZXQgIDo6IFRoZSBmaWxlIG9mZnNldCBvZiB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgOjogRmxhZ3MgaWRlbnRpZnlpbmcgc3BlY2lhbCBieXRlY29kZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyAodXNlZCBieSB0aGUgdjM4IGltcGxlbWVudGF0aW9uICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwaF9jb21wYXRpYmlsaXR5X21vZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHdlIGFyZSBpbiBDbGVhclR5cGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlICh1c2VkIGJ5IHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYzOCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYnl0ZWNvZGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGViZHRfc3RhcnQgICAgICAgICAgIDo6IFRoZSBmaWxlIG9mZnNldCBvZiB0aGUgc2JpdCBkYXRhIHRhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0JEVCwgYmRhdCwgZXRjLikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGViZHRfc2l6ZSAgICAgICAgICAgIDo6IFRoZSBzaXplIG9mIHRoZSBzYml0IGRhdGEgdGFibGUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgRmFjZSBUeXBlCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfRmFjZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhlIFRydWVUeXBlIGZhY2UgY2xhc3MuICBUaGVzZSBvYmplY3RzIG1vZGVsIHRoZSByZXNvbHV0aW9uIGFuZAorICAgKiAgIHBvaW50LXNpemUgaW5kZXBlbmRlbnQgZGF0YSBmb3VuZCBpbiBhIFRydWVUeXBlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICByb290IDo6CisgICAqICAgICBUaGUgYmFzZSBGVF9GYWNlIHN0cnVjdHVyZSwgbWFuYWdlZCBieSB0aGUgYmFzZSBsYXllci4KKyAgICoKKyAgICogICB0dGNfaGVhZGVyIDo6CisgICAqICAgICBUaGUgVHJ1ZVR5cGUgY29sbGVjdGlvbiBoZWFkZXIsIHVzZWQgd2hlbiB0aGUgZmlsZSBpcyBhICd0dGMnIHJhdGhlcgorICAgKiAgICAgdGhhbiBhICd0dGYnLiAgRm9yIG9yZGluYXJ5IGZvbnQgZmlsZXMsIHRoZSBmaWVsZCBgdHRjX2hlYWRlci5jb3VudGAKKyAgICogICAgIGlzIHNldCB0byAwLgorICAgKgorICAgKiAgIGZvcm1hdF90YWcgOjoKKyAgICogICAgIFRoZSBmb250IGZvcm1hdCB0YWcuCisgICAqCisgICAqICAgbnVtX3RhYmxlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBUcnVlVHlwZSB0YWJsZXMgaW4gdGhpcyBmb250IGZpbGUuCisgICAqCisgICAqICAgZGlyX3RhYmxlcyA6OgorICAgKiAgICAgVGhlIGRpcmVjdG9yeSBvZiBUcnVlVHlwZSB0YWJsZXMgZm9yIHRoaXMgZm9udCBmaWxlLgorICAgKgorICAgKiAgIGhlYWRlciA6OgorICAgKiAgICAgVGhlIGZvbnQncyBmb250IGhlYWRlciAoJ2hlYWQnIHRhYmxlKS4gIFJlYWQgb24gZm9udCBvcGVuaW5nLgorICAgKgorICAgKiAgIGhvcml6b250YWwgOjoKKyAgICogICAgIFRoZSBmb250J3MgaG9yaXpvbnRhbCBoZWFkZXIgKCdoaGVhJyB0YWJsZSkuICBUaGlzIGZpZWxkIGFsc28KKyAgICogICAgIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSAoJ2htdHgnKS4KKyAgICoKKyAgICogICBtYXhfcHJvZmlsZSA6OgorICAgKiAgICAgVGhlIGZvbnQncyBtYXhpbXVtIHByb2ZpbGUgdGFibGUuICBSZWFkIG9uIGZvbnQgb3BlbmluZy4gIE5vdGUgdGhhdAorICAgKiAgICAgc29tZSBtYXhpbXVtIHZhbHVlcyBjYW5ub3QgYmUgdGFrZW4gZGlyZWN0bHkgZnJvbSB0aGlzIHRhYmxlLiAgV2UKKyAgICogICAgIHRodXMgZGVmaW5lIGFkZGl0aW9uYWwgZmllbGRzIGJlbG93IHRvIGhvbGQgdGhlIGNvbXB1dGVkIG1heGltYS4KKyAgICoKKyAgICogICB2ZXJ0aWNhbF9pbmZvIDo6CisgICAqICAgICBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW4gdGhlIGZvbnQgZmlsZSBjb250YWlucyB2ZXJ0aWNhbCBtZXRyaWNzLgorICAgKiAgICAgSWYgbm90LCB0aGUgdmFsdWUgb2YgdGhlICd2ZXJ0aWNhbCcgZmllbGQgaXMgdW5kZWZpbmVkLgorICAgKgorICAgKiAgIHZlcnRpY2FsIDo6CisgICAqICAgICBUaGUgZm9udCdzIHZlcnRpY2FsIGhlYWRlciAoJ3ZoZWEnIHRhYmxlKS4gIFRoaXMgZmllbGQgYWxzbyBjb250YWlucworICAgKiAgICAgdGhlIGFzc29jaWF0ZWQgdmVydGljYWwgbWV0cmljcyB0YWJsZSAoJ3ZtdHgnKSwgaWYgZm91bmQuCisgICAqICAgICBJTVBPUlRBTlQ6IFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGlzIHVuZGVmaW5lZCBpZiB0aGUKKyAgICogICAgIGB2ZXJ0aWNhbF9pbmZvYCBmaWVsZCBpcyB1bnNldC4KKyAgICoKKyAgICogICBudW1fbmFtZXMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgbmFtZSByZWNvcmRzIHdpdGhpbiB0aGlzIFRydWVUeXBlIGZvbnQuCisgICAqCisgICAqICAgbmFtZV90YWJsZSA6OgorICAgKiAgICAgVGhlIHRhYmxlIG9mIG5hbWUgcmVjb3JkcyAoJ25hbWUnKS4KKyAgICoKKyAgICogICBvczIgOjoKKyAgICogICAgIFRoZSBmb250J3MgT1MvMiB0YWJsZSAoJ09TLzInKS4KKyAgICoKKyAgICogICBwb3N0c2NyaXB0IDo6CisgICAqICAgICBUaGUgZm9udCdzIFBvc3RTY3JpcHQgdGFibGUgKCdwb3N0JyB0YWJsZSkuICBUaGUgUG9zdFNjcmlwdCBnbHlwaAorICAgKiAgICAgbmFtZXMgYXJlIG5vdCBsb2FkZWQgYnkgdGhlIGRyaXZlciBvbiBmYWNlIG9wZW5pbmcuICBTZWUgdGhlCisgICAqICAgICAndHRwb3N0JyBtb2R1bGUgZm9yIG1vcmUgZGV0YWlscy4KKyAgICoKKyAgICogICBjbWFwX3RhYmxlIDo6CisgICAqICAgICBBZGRyZXNzIG9mIHRoZSBmYWNlJ3MgJ2NtYXAnIFNGTlQgdGFibGUgaW4gbWVtb3J5IChpdCdzIGFuIGV4dHJhY3RlZAorICAgKiAgICAgZnJhbWUpLgorICAgKgorICAgKiAgIGNtYXBfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGBjbWFwX3RhYmxlYCBkZXNjcmliZWQgYWJvdmUuCisgICAqCisgICAqICAgZ290b190YWJsZSA6OgorICAgKiAgICAgQSBmdW5jdGlvbiBjYWxsZWQgYnkgZWFjaCBUcnVlVHlwZSB0YWJsZSBsb2FkZXIgdG8gcG9zaXRpb24gYQorICAgKiAgICAgc3RyZWFtJ3MgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIHRhYmxlIGFjY29yZGluZyB0byBpdHMgdGFnLgorICAgKiAgICAgSXQgZGVmYXVsdHMgdG8gVFRfR290b19GYWNlIGJ1dCBjYW4gYmUgZGlmZmVyZW50IGZvciBzdHJhbmdlIGZvcm1hdHMKKyAgICogICAgIChlLmcuICBUeXBlIDQyKS4KKyAgICoKKyAgICogICBhY2Nlc3NfZ2x5cGhfZnJhbWUgOjoKKyAgICogICAgIEEgZnVuY3Rpb24gdXNlZCB0byBhY2Nlc3MgdGhlIGZyYW1lIG9mIGEgZ2l2ZW4gZ2x5cGggd2l0aGluIHRoZQorICAgKiAgICAgZmFjZSdzIGZvbnQgZmlsZS4KKyAgICoKKyAgICogICBmb3JnZXRfZ2x5cGhfZnJhbWUgOjoKKyAgICogICAgIEEgZnVuY3Rpb24gdXNlZCB0byBmb3JnZXQgdGhlIGZyYW1lIG9mIGEgZ2l2ZW4gZ2x5cGggd2hlbiBhbGwgZGF0YQorICAgKiAgICAgaGFzIGJlZW4gbG9hZGVkLgorICAgKgorICAgKiAgIHJlYWRfZ2x5cGhfaGVhZGVyIDo6CisgICAqICAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIGdseXBoIGhlYWRlci4gIEl0IG11c3QgYmUgY2FsbGVkIGJldHdlZW4KKyAgICogICAgIGFuICdhY2Nlc3MnIGFuZCAnZm9yZ2V0Jy4KKyAgICoKKyAgICogICByZWFkX3NpbXBsZV9nbHlwaCA6OgorICAgKiAgICAgQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBzaW1wbGUgZ2x5cGguICBJdCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUKKyAgICogICAgIGhlYWRlciB3YXMgcmVhZCwgYW5kIGJlZm9yZSB0aGUgJ2ZvcmdldCcuCisgICAqCisgICAqICAgcmVhZF9jb21wb3NpdGVfZ2x5cGggOjoKKyAgICogICAgIEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgY29tcG9zaXRlIGdseXBoLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAgICogICAgIHRoZSBoZWFkZXIgd2FzIHJlYWQsIGFuZCBiZWZvcmUgdGhlICdmb3JnZXQnLgorICAgKgorICAgKiAgIHNmbnQgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgU0ZOVCBzZXJ2aWNlLgorICAgKgorICAgKiAgIHBzbmFtZXMgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgUG9zdFNjcmlwdCBuYW1lcyBzZXJ2aWNlLgorICAgKgorICAgKiAgIG1tIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIE11bHRpcGxlIE1hc3RlcnMgc2VydmljZS4KKyAgICoKKyAgICogICB2YXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgTWV0cmljcyBWYXJpYXRpb25zIHNlcnZpY2UuCisgICAqCisgICAqICAgaGRteCA6OgorICAgKiAgICAgVGhlIGZhY2UncyBob3Jpem9udGFsIGRldmljZSBtZXRyaWNzICgnaGRteCcgdGFibGUpLiAgVGhpcyB0YWJsZSBpcworICAgKiAgICAgb3B0aW9uYWwgaW4gVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuCisgICAqCisgICAqICAgZ2FzcCA6OgorICAgKiAgICAgVGhlIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyBwcm9wZXJ0aWVzIHRhYmxlICgnZ2FzcCcpLiAgVGhpcyB0YWJsZQorICAgKiAgICAgaXMgb3B0aW9uYWwgaW4gVHJ1ZVR5cGUvT3BlblR5cGUgZm9udHMuCisgICAqCisgICAqICAgcGNsdCA6OgorICAgKiAgICAgVGhlICdwY2x0JyBTRk5UIHRhYmxlLgorICAgKgorICAgKiAgIG51bV9zYml0X3NjYWxlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBzYml0IHNjYWxlcyBmb3IgdGhpcyBmb250LgorICAgKgorICAgKiAgIHNiaXRfc2NhbGVzIDo6CisgICAqICAgICBBcnJheSBvZiBzYml0IHNjYWxlcyBlbWJlZGRlZCBpbiB0aGlzIGZvbnQuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsCisgICAqICAgICBpbiBhIFRydWVUeXBlL09wZW5UeXBlIGZvbnQuCisgICAqCisgICAqICAgcG9zdHNjcmlwdF9uYW1lcyA6OgorICAgKiAgICAgQSB0YWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBQb3N0c2NyaXB0IG5hbWVzIG9mIHRoZSBnbHlwaHMgZm9yIHRoaXMKKyAgICogICAgIGZvbnQuICBTZWUgdGhlIGZpbGUgYHR0Y29uZmlnLmhgIGZvciBjb21tZW50cyBvbiB0aGUKKyAgICogICAgIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyBvcHRpb24uCisgICAqCisgICAqICAgcGFsZXR0ZV9kYXRhIDo6CisgICAqICAgICBTb21lIGZpZWxkcyBmcm9tIHRoZSAnQ1BBTCcgdGFibGUgdGhhdCBhcmUgZGlyZWN0bHkgaW5kZXhlZC4KKyAgICoKKyAgICogICBwYWxldHRlX2luZGV4IDo6CisgICAqICAgICBUaGUgY3VycmVudCBwYWxldHRlIGluZGV4LCBhcyBzZXQgYnkgQEZUX1BhbGV0dGVfU2VsZWN0LgorICAgKgorICAgKiAgIHBhbGV0dGUgOjoKKyAgICogICAgIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgcGFsZXR0ZSdzIGNvbG9ycy4KKyAgICoKKyAgICogICBoYXZlX2ZvcmVncm91bmRfY29sb3IgOjoKKyAgICogICAgIFRoZXJlIHdhcyBhIGNhbGwgdG8gQEZUX1BhbGV0dGVfU2V0X0ZvcmVncm91bmRfQ29sb3IuCisgICAqCisgICAqICAgZm9yZWdyb3VuZF9jb2xvciA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZm9yZWdyb3VuZCBjb2xvciBjb3JyZXNwb25kaW5nIHRvICdDUEFMJyBjb2xvciBpbmRleAorICAgKiAgICAgMHhGRkZGLiAgT25seSB2YWxpZCBpZiBgaGF2ZV9mb3JlZ3JvdW5kX2NvbG9yYCBpcyBzZXQuCisgICAqCisgICAqICAgZm9udF9wcm9ncmFtX3NpemUgOjoKKyAgICogICAgIFNpemUgaW4gYnl0ZWNvZGVzIG9mIHRoZSBmYWNlJ3MgZm9udCBwcm9ncmFtLiAgMCBpZiBub25lIGRlZmluZWQuCisgICAqICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuCisgICAqCisgICAqICAgZm9udF9wcm9ncmFtIDo6CisgICAqICAgICBUaGUgZmFjZSdzIGZvbnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSBleGVjdXRlZCBhdCBsb2FkIHRpbWUsCisgICAqICAgICBhbHNvIHVzZWQgZHVyaW5nIGdseXBoIHJlbmRlcmluZy4gIENvbWVzIGZyb20gdGhlICdmcGdtJyB0YWJsZS4KKyAgICogICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZvbnRzLgorICAgKgorICAgKiAgIGN2dF9wcm9ncmFtX3NpemUgOjoKKyAgICogICAgIFRoZSBzaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGN2dCBwcm9ncmFtLiAgSWdub3JlZCBmb3IgVHlwZSAyCisgICAqICAgICBmb250cy4KKyAgICoKKyAgICogICBjdnRfcHJvZ3JhbSA6OgorICAgKiAgICAgVGhlIGZhY2UncyBjdnQgcHJvZ3JhbSAoYnl0ZWNvZGUgc3RyZWFtKSBleGVjdXRlZCBlYWNoIHRpbWUgYW4KKyAgICogICAgIGluc3RhbmNlL3NpemUgaXMgY2hhbmdlZC9yZXNldC4gIENvbWVzIGZyb20gdGhlICdwcmVwJyB0YWJsZS4KKyAgICogICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4KKyAgICoKKyAgICogICBjdnRfc2l6ZSA6OgorICAgKiAgICAgU2l6ZSBvZiB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoaW4gZW50cmllcykuICBJZ25vcmVkIGZvciBUeXBlIDIKKyAgICogICAgIGZvbnRzLgorICAgKgorICAgKiAgIGN2dCA6OgorICAgKiAgICAgVGhlIGZhY2UncyBvcmlnaW5hbCBjb250cm9sIHZhbHVlIHRhYmxlLiAgQ29vcmRpbmF0ZXMgYXJlIGV4cHJlc3NlZAorICAgKiAgICAgaW4gdW5zY2FsZWQgZm9udCB1bml0cyAoaW4gMjYuNiBmb3JtYXQpLiAgQ29tZXMgZnJvbSB0aGUgJ2N2dH4nCisgICAqICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4KKyAgICoKKyAgICogICAgIElmIHZhcmllZCBieSB0aGUgYENWQVInIHRhYmxlLCBub24taW50ZWdlciB2YWx1ZXMgYXJlIHBvc3NpYmxlLgorICAgKgorICAgKiAgIGludGVycHJldGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVycyBmaWVsZCBpcyBhbHNvIHVzZWQKKyAgICogICAgIHRvIGhvb2sgdGhlIGRlYnVnZ2VyIGluICd0dGRlYnVnJy4KKyAgICoKKyAgICogICBleHRyYSA6OgorICAgKiAgICAgUmVzZXJ2ZWQgZm9yIHRoaXJkLXBhcnR5IGZvbnQgZHJpdmVycy4KKyAgICoKKyAgICogICBwb3N0c2NyaXB0X25hbWUgOjoKKyAgICogICAgIFRoZSBQUyBuYW1lIG9mIHRoZSBmb250LiAgVXNlZCBieSB0aGUgcG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UuCisgICAqCisgICAqICAgZ2x5Zl9sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlICdnbHlmJyB0YWJsZS4gIE5lZWRlZCBmb3IgbWFsZm9ybWVkICdsb2NhJyB0YWJsZXMuCisgICAqCisgICAqICAgZ2x5Zl9vZmZzZXQgOjoKKyAgICogICAgIFRoZSBmaWxlIG9mZnNldCBvZiB0aGUgJ2dseWYnIHRhYmxlLgorICAgKgorICAgKiAgIGlzX2NmZjIgOjoKKyAgICogICAgIFNldCBpZiB0aGUgZm9udCBmb3JtYXQgaXMgQ0ZGMi4KKyAgICoKKyAgICogICBkb2JsZW5kIDo6CisgICAqICAgICBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IGlmIHRoZSBmb250IHNob3VsZCBiZSBibGVuZGVkICh0aGlzIGlzIGZvciBHWAorICAgKiAgICAgdmFyKS4KKyAgICoKKyAgICogICBibGVuZCA6OgorICAgKiAgICAgQ29udGFpbnMgdGhlIGRhdGEgbmVlZGVkIHRvIGNvbnRyb2wgR1ggdmFyaWF0aW9uIHRhYmxlcyAocmF0aGVyIGxpa2UKKyAgICogICAgIE11bHRpcGxlIE1hc3RlciBkYXRhKS4KKyAgICoKKyAgICogICB2YXJpYXRpb25fc3VwcG9ydCA6OgorICAgKiAgICAgRmxhZ3MgdGhhdCBpbmRpY2F0ZSB3aGljaCBPcGVuVHlwZSBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gZm9udAorICAgKiAgICAgdmFyaWF0aW9uIHN1cHBvcnQgaXMgcHJlc2VudCwgdmFsaWQsIGFuZCB1c2FibGUuICBGb3IgZXhhbXBsZSwKKyAgICogICAgIFRUX0ZBQ0VfRkxBR19WQVJfRlZBUiBpcyBvbmx5IHNldCBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBkZXNpZ24KKyAgICogICAgIGF4aXMuCisgICAqCisgICAqICAgdmFyX3Bvc3RzY3JpcHRfcHJlZml4IDo6CisgICAqICAgICBUaGUgUG9zdFNjcmlwdCBuYW1lIHByZWZpeCBuZWVkZWQgZm9yIGNvbnN0cnVjdGluZyBhIHZhcmlhdGlvbiBmb250CisgICAqICAgICBpbnN0YW5jZSdzIFBTIG5hbWUgLgorICAgKgorICAgKiAgIHZhcl9wb3N0c2NyaXB0X3ByZWZpeF9sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIGB2YXJfcG9zdHNjcmlwdF9wcmVmaXhgIHN0cmluZy4KKyAgICoKKyAgICogICBob3J6X21ldHJpY3Nfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgdGhlICdobXR4JyB0YWJsZS4KKyAgICoKKyAgICogICB2ZXJ0X21ldHJpY3Nfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgdGhlICd2bXR4JyB0YWJsZS4KKyAgICoKKyAgICogICBudW1fbG9jYXRpb25zIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGdseXBoIGxvY2F0aW9ucyBpbiB0aGlzIFRydWVUeXBlIGZpbGUuICBUaGlzIHNob3VsZCBiZQorICAgKiAgICAgaWRlbnRpY2FsIHRvIHRoZSBudW1iZXIgb2YgZ2x5cGhzLiAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnRzLgorICAgKgorICAgKiAgIGdseXBoX2xvY2F0aW9ucyA6OgorICAgKiAgICAgQW4gYXJyYXkgb2YgbG9uZ3MuICBUaGVzZSBhcmUgb2Zmc2V0cyB0byBnbHlwaCBkYXRhIHdpdGhpbiB0aGUKKyAgICogICAgICdnbHlmJyB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250IGZhY2VzLgorICAgKgorICAgKiAgIGhkbXhfdGFibGUgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgJ2hkbXgnIHRhYmxlLgorICAgKgorICAgKiAgIGhkbXhfdGFibGVfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgdGhlICdoZG14JyB0YWJsZS4KKyAgICoKKyAgICogICBoZG14X3JlY29yZF9jb3VudCA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBoZG14IHJlY29yZHMuCisgICAqCisgICAqICAgaGRteF9yZWNvcmRfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgYSBzaW5nbGUgaGRteCByZWNvcmQuCisgICAqCisgICAqICAgaGRteF9yZWNvcmRfc2l6ZXMgOjoKKyAgICogICAgIEFuIGFycmF5IGhvbGRpbmcgdGhlIHBwZW0gc2l6ZXMgYXZhaWxhYmxlIGluIHRoZSAnaGRteCcgdGFibGUuCisgICAqCisgICAqICAgc2JpdF90YWJsZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBmb250J3MgZW1iZWRkZWQgYml0bWFwIGxvY2F0aW9uIHRhYmxlLgorICAgKgorICAgKiAgIHNiaXRfdGFibGVfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgYHNiaXRfdGFibGVgLgorICAgKgorICAgKiAgIHNiaXRfdGFibGVfdHlwZSA6OgorICAgKiAgICAgVGhlIHNiaXQgdGFibGUgdHlwZSAoQ0JMQywgc2JpeCwgZXRjLikuCisgICAqCisgICAqICAgc2JpdF9udW1fc3RyaWtlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBzYml0IHN0cmlrZXMgZXhwb3NlZCBieSBGcmVlVHlwZSdzIEFQSSwgb21pdHRpbmcKKyAgICogICAgIGludmFsaWQgc3RyaWtlcy4KKyAgICoKKyAgICogICBzYml0X3N0cmlrZV9tYXAgOjoKKyAgICogICAgIEEgbWFwcGluZyBiZXR3ZWVuIHRoZSBzdHJpa2UgaW5kaWNlcyBleHBvc2VkIGJ5IHRoZSBBUEkgYW5kIHRoZQorICAgKiAgICAgaW5kaWNlcyB1c2VkIGluIHRoZSBmb250J3Mgc2JpdCB0YWJsZS4KKyAgICoKKyAgICogICBjcGFsIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gZGF0YSByZWxhdGVkIHRvIHRoZSAnQ1BBTCcgdGFibGUuICBgTlVMTGAgaWYgdGhlIHRhYmxlCisgICAqICAgICBpcyBub3QgYXZhaWxhYmxlLgorICAgKgorICAgKiAgIGNvbHIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBkYXRhIHJlbGF0ZWQgdG8gdGhlICdDT0xSJyB0YWJsZS4gIGBOVUxMYCBpZiB0aGUgdGFibGUKKyAgICogICAgIGlzIG5vdCBhdmFpbGFibGUuCisgICAqCisgICAqICAga2Vybl90YWJsZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSAna2VybicgdGFibGUuCisgICAqCisgICAqICAga2Vybl90YWJsZV9zaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBvZiB0aGUgJ2tlcm4nIHRhYmxlLgorICAgKgorICAgKiAgIG51bV9rZXJuX3RhYmxlcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBzdXBwb3J0ZWQga2VybiBzdWJ0YWJsZXMgKHVwIHRvIDMyOyBGcmVlVHlwZQorICAgKiAgICAgcmVjb2duaXplcyBvbmx5IGhvcml6b250YWwgb25lcyB3aXRoIGZvcm1hdCAwKS4KKyAgICoKKyAgICogICBrZXJuX2F2YWlsX2JpdHMgOjoKKyAgICogICAgIFRoZSBhdmFpbGFiaWxpdHkgc3RhdHVzIG9mIGtlcm4gc3VidGFibGVzOyBpZiBiaXQgbiBpcyBzZXQsIHRhYmxlIG4KKyAgICogICAgIGlzIGF2YWlsYWJsZS4KKyAgICoKKyAgICogICBrZXJuX29yZGVyX2JpdHMgOjoKKyAgICogICAgIFRoZSBzb3J0ZWRuZXNzIHN0YXR1cyBvZiBrZXJuIHN1YnRhYmxlczsgaWYgYml0IG4gaXMgc2V0LCB0YWJsZSBuIGlzCisgICAqICAgICBzb3J0ZWQuCisgICAqCisgICAqICAgYmRmIDo6CisgICAqICAgICBEYXRhIHJlbGF0ZWQgdG8gYW4gU0ZOVCBmb250J3MgJ2JkZicgdGFibGU7IHNlZSBgdHR0eXBlcy5oYC4KKyAgICoKKyAgICogICBob3J6X21ldHJpY3Nfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlICdobXR4JyB0YWJsZS4KKyAgICoKKyAgICogICB2ZXJ0X21ldHJpY3Nfb2Zmc2V0IDo6CisgICAqICAgICBUaGUgZmlsZSBvZmZzZXQgb2YgdGhlICd2bXR4JyB0YWJsZS4KKyAgICoKKyAgICogICBzcGhfZm91bmRfZnVuY19mbGFncyA6OgorICAgKiAgICAgRmxhZ3MgaWRlbnRpZnlpbmcgc3BlY2lhbCBieXRlY29kZSBmdW5jdGlvbnMgKHVzZWQgYnkgdGhlIHYzOAorICAgKiAgICAgaW1wbGVtZW50YXRpb24gb2YgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyKS4KKyAgICoKKyAgICogICBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIDo6CisgICAqICAgICBUaGlzIGZsYWcgaXMgc2V0IGlmIHdlIGFyZSBpbiBDbGVhclR5cGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlCisgICAqICAgICAodXNlZCBieSB0aGUgdjM4IGltcGxlbWVudGF0aW9uIG9mIHRoZSBieXRlY29kZSBpbnRlcnByZXRlcikuCisgICAqCisgICAqICAgZWJkdF9zdGFydCA6OgorICAgKiAgICAgVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBzYml0IGRhdGEgdGFibGUgKENCRFQsIGJkYXQsIGV0Yy4pLgorICAgKgorICAgKiAgIGViZHRfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgdGhlIHNiaXQgZGF0YSB0YWJsZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9GYWNlUmVjXwogICB7CiAgICAgRlRfRmFjZVJlYyAgICAgICAgICAgIHJvb3Q7CkBAIC0xNDQ1LDExICsxNTE2LDExIEBACiAgICAgdm9pZCogICAgICAgICAgICAgICAgIHBzYXV4OwogCiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE9wdGlvbmFsIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIE9wdGlvbmFsIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlcworICAgICAqCisgICAgICovCiAKICAgICAvKiBncmlkLWZpdHRpbmcgYW5kIHNjYWxpbmcgdGFibGUgKi8KICAgICBUVF9HYXNwUmVjICAgICAgICAgICAgZ2FzcDsgICAgICAgICAgICAgICAgIC8qIHRoZSBgZ2FzcCcgdGFibGUgKi8KQEAgLTE0NjQsMTIgKzE1MzUsMTkgQEAKICAgICAvKiBwb3N0c2NyaXB0IG5hbWVzIHRhYmxlICovCiAgICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgIHBvc3RzY3JpcHRfbmFtZXM7CiAKKyAgICAvKiBnbHlwaCBjb2xvcnMgKi8KKyAgICBGVF9QYWxldHRlX0RhdGEgICAgICAgcGFsZXR0ZV9kYXRhOyAgICAgICAgIC8qIHNpbmNlIDIuMTAgKi8KKyAgICBGVF9VU2hvcnQgICAgICAgICAgICAgcGFsZXR0ZV9pbmRleDsKKyAgICBGVF9Db2xvciogICAgICAgICAgICAgcGFsZXR0ZTsKKyAgICBGVF9Cb29sICAgICAgICAgICAgICAgaGF2ZV9mb3JlZ3JvdW5kX2NvbG9yOworICAgIEZUX0NvbG9yICAgICAgICAgICAgICBmb3JlZ3JvdW5kX2NvbG9yOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUcnVlVHlwZS1zcGVjaWZpYyBmaWVsZHMgKGlnbm9yZWQgYnkgdGhlIENGRiBkcml2ZXIpICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIFRydWVUeXBlLXNwZWNpZmljIGZpZWxkcyAoaWdub3JlZCBieSB0aGUgQ0ZGIGRyaXZlcikKKyAgICAgKgorICAgICAqLwogCiAgICAgLyogdGhlIGZvbnQgcHJvZ3JhbSwgaWYgYW55ICovCiAgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGZvbnRfcHJvZ3JhbV9zaXplOwpAQCAtMTQ4MSwxOSArMTU1OSwxOSBAQAogCiAgICAgLyogdGhlIG9yaWdpbmFsLCB1bnNjYWxlZCwgY29udHJvbCB2YWx1ZSB0YWJsZSAqLwogICAgIEZUX1VMb25nICAgICAgICAgICAgICBjdnRfc2l6ZTsKLSAgICBGVF9TaG9ydCogICAgICAgICAgICAgY3Z0OworICAgIEZUX0ludDMyKiAgICAgICAgICAgICBjdnQ7CiAKICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIHVzZS4gIFRoaXMgaXMgYWxzbyAqLwogICAgIC8qIHVzZWQgdG8gaG9vayB0aGUgZGVidWdnZXIgZm9yIHRoZSBgdHRkZWJ1ZycgdXRpbGl0eS4gICAgICAgICovCiAgICAgVFRfSW50ZXJwcmV0ZXIgICAgICAgIGludGVycHJldGVyOwogCiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE90aGVyIHRhYmxlcyBvciBmaWVsZHMuIFRoaXMgaXMgdXNlZCBieSBkZXJpdmF0aXZlIGZvcm1hdHMgbGlrZSAgICAgKi8KLSAgICAvKiBPcGVuVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICoKKyAgICAgKiBPdGhlciB0YWJsZXMgb3IgZmllbGRzLiBUaGlzIGlzIHVzZWQgYnkgZGVyaXZhdGl2ZSBmb3JtYXRzIGxpa2UKKyAgICAgKiBPcGVuVHlwZS4KKyAgICAgKgorICAgICAqLwogCiAgICAgRlRfR2VuZXJpYyAgICAgICAgICAgIGV4dHJhOwogCkBAIC0xNTYyLDQwICsxNjQwLDUzIEBACiAgICAgRlRfVUxvbmcgICAgICAgICAgICAgIGViZHRfc2l6ZTsKICNlbmRpZgogCisgICAgLyogc2luY2UgMi4xMCAqLworICAgIHZvaWQqICAgICAgICAgICAgICAgICBjcGFsOworICAgIHZvaWQqICAgICAgICAgICAgICAgICBjb2xyOworCiAgIH0gVFRfRmFjZVJlYzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBUVF9HbHlwaFpvbmVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIGdseXBoIHpvbmUgaXMgdXNlZCB0byBsb2FkLCBzY2FsZSBhbmQgaGludCBnbHlwaCBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICAgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtYXhfcG9pbnRzICAgOjogVGhlIG1heGltdW0gc2l6ZSBpbiBwb2ludHMgb2YgdGhlIHpvbmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG1heF9jb250b3VycyA6OiBNYXggc2l6ZSBpbiBsaW5rcyBjb250b3VycyBvZiB0aGUgem9uZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbl9wb2ludHMgICAgIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHpvbmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBuX2NvbnRvdXJzICAgOjogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNvbnRvdXJzIGluIHRoZSB6b25lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9yZyAgICAgICAgICA6OiBUaGUgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgKGZvbnQgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdW5pdHMvc2NhbGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGN1ciAgICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBjb29yZGluYXRlcyAoc2NhbGVkL2hpbnRlZCkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgdGFncyAgICAgICAgIDo6IFRoZSBwb2ludCBjb250cm9sIHRhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjb250b3VycyAgICAgOjogVGhlIGNvbnRvdXJzIGVuZCBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGZpcnN0X3BvaW50ICA6OiBPZmZzZXQgb2YgdGhlIGN1cnJlbnQgc3ViZ2x5cGgncyBmaXJzdCBwb2ludC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICAgVFRfR2x5cGhab25lUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGdseXBoIHpvbmUgaXMgdXNlZCB0byBsb2FkLCBzY2FsZSBhbmQgaGludCBnbHlwaCBvdXRsaW5lCisgICAqICAgY29vcmRpbmF0ZXMuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuCisgICAqCisgICAqICAgbWF4X3BvaW50cyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gc2l6ZSBpbiBwb2ludHMgb2YgdGhlIHpvbmUuCisgICAqCisgICAqICAgbWF4X2NvbnRvdXJzIDo6CisgICAqICAgICBNYXggc2l6ZSBpbiBsaW5rcyBjb250b3VycyBvZiB0aGUgem9uZS4KKyAgICoKKyAgICogICBuX3BvaW50cyA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgem9uZS4KKyAgICoKKyAgICogICBuX2NvbnRvdXJzIDo6CisgICAqICAgICBUaGUgY3VycmVudCBudW1iZXIgb2YgY29udG91cnMgaW4gdGhlIHpvbmUuCisgICAqCisgICAqICAgb3JnIDo6CisgICAqICAgICBUaGUgb3JpZ2luYWwgZ2x5cGggY29vcmRpbmF0ZXMgKGZvbnQgdW5pdHMvc2NhbGVkKS4KKyAgICoKKyAgICogICBjdXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIGNvb3JkaW5hdGVzIChzY2FsZWQvaGludGVkKS4KKyAgICoKKyAgICogICB0YWdzIDo6CisgICAqICAgICBUaGUgcG9pbnQgY29udHJvbCB0YWdzLgorICAgKgorICAgKiAgIGNvbnRvdXJzIDo6CisgICAqICAgICBUaGUgY29udG91cnMgZW5kIHBvaW50cy4KKyAgICoKKyAgICogICBmaXJzdF9wb2ludCA6OgorICAgKiAgICAgT2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YmdseXBoJ3MgZmlyc3QgcG9pbnQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfR2x5cGhab25lUmVjXwogICB7CiAgICAgRlRfTWVtb3J5ICAgbWVtb3J5OwpAQCAtMTYyMCwxNCArMTcxMSwxNCBAQAogICB0eXBlZGVmIHN0cnVjdCBUVF9FeGVjQ29udGV4dFJlY18qICBUVF9FeGVjQ29udGV4dDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEB0eXBlOgorICAgKiAgIFRUX1NpemUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBUVF9TaXplUmVjXyogIFRUX1NpemU7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC93b2ZmdHlwZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvd29mZnR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3NGExMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvd29mZnR5cGVzLmgKQEAgLTAsMCArMSwzMTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogd29mZnR5cGVzLmgKKyAqCisgKiAgIEJhc2ljIFdPRkYvV09GRjIgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uCisgKiAgIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2lmbmRlZiBXT0ZGVFlQRVNfSF8KKyNkZWZpbmUgV09GRlRZUEVTX0hfCisKKworI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFibGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisKKworRlRfQkVHSU5fSEVBREVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBXT0ZGX0hlYWRlclJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgV09GRiBmaWxlIGZvcm1hdCBoZWFkZXIuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgU2VlCisgICAqCisgICAqICAgICBodHRwczovL3d3dy53My5vcmcvVFIvV09GRi8jV09GRkhlYWRlcgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkZfSGVhZGVyUmVjXworICB7CisgICAgRlRfVUxvbmcgICBzaWduYXR1cmU7CisgICAgRlRfVUxvbmcgICBmbGF2b3I7CisgICAgRlRfVUxvbmcgICBsZW5ndGg7CisgICAgRlRfVVNob3J0ICBudW1fdGFibGVzOworICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7CisgICAgRlRfVUxvbmcgICB0b3RhbFNmbnRTaXplOworICAgIEZUX1VTaG9ydCAgbWFqb3JWZXJzaW9uOworICAgIEZUX1VTaG9ydCAgbWlub3JWZXJzaW9uOworICAgIEZUX1VMb25nICAgbWV0YU9mZnNldDsKKyAgICBGVF9VTG9uZyAgIG1ldGFMZW5ndGg7CisgICAgRlRfVUxvbmcgICBtZXRhT3JpZ0xlbmd0aDsKKyAgICBGVF9VTG9uZyAgIHByaXZPZmZzZXQ7CisgICAgRlRfVUxvbmcgICBwcml2TGVuZ3RoOworCisgIH0gV09GRl9IZWFkZXJSZWMsICpXT0ZGX0hlYWRlcjsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFdPRkZfVGFibGVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgV09GRiBmb250LgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIFRhZyA6OgorICAgKiAgICAgQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4KKyAgICoKKyAgICogICBPZmZzZXQgOjoKKyAgICogICAgIFRoZSBvZmZzZXQgb2YgdGhlIHRhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBXT0ZGIGZvbnQgaW4gaXRzCisgICAqICAgICByZXNvdXJjZS4KKyAgICoKKyAgICogICBDb21wTGVuZ3RoIDo6CisgICAqICAgICBDb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLgorICAgKgorICAgKiAgIE9yaWdMZW5ndGggOjoKKyAgICogICAgIFVuY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKGluIGJ5dGVzKS4KKyAgICoKKyAgICogICBDaGVja1N1bSA6OgorICAgKiAgICAgVGhlIHRhYmxlIGNoZWNrc3VtLiAgVGhpcyB2YWx1ZSBjYW4gYmUgaWdub3JlZC4KKyAgICoKKyAgICogICBPcmlnT2Zmc2V0IDo6CisgICAqICAgICBUaGUgdW5jb21wcmVzc2VkIHRhYmxlIGZpbGUgb2Zmc2V0LiAgVGhpcyB2YWx1ZSBnZXRzIGNvbXB1dGVkIHdoaWxlCisgICAqICAgICBjb25zdHJ1Y3RpbmcgdGhlICh1bmNvbXByZXNzZWQpIFNGTlQgaGVhZGVyLiAgSXQgaXMgbm90IGNvbnRhaW5lZCBpbgorICAgKiAgICAgdGhlIFdPRkYgZmlsZS4KKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBXT0ZGX1RhYmxlUmVjXworICB7CisgICAgRlRfVUxvbmcgIFRhZzsgICAgICAgICAgIC8qIHRhYmxlIElEICAgICAgICAgICAgICAgICAgKi8KKyAgICBGVF9VTG9uZyAgT2Zmc2V0OyAgICAgICAgLyogdGFibGUgZmlsZSBvZmZzZXQgICAgICAgICAqLworICAgIEZUX1VMb25nICBDb21wTGVuZ3RoOyAgICAvKiBjb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAgICovCisgICAgRlRfVUxvbmcgIE9yaWdMZW5ndGg7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKi8KKyAgICBGVF9VTG9uZyAgQ2hlY2tTdW07ICAgICAgLyogdW5jb21wcmVzc2VkIGNoZWNrc3VtICAgICAqLworCisgICAgRlRfVUxvbmcgIE9yaWdPZmZzZXQ7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBmaWxlIG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobm90IGluIHRoZSBXT0ZGIGZpbGUpICAgICAgICAgKi8KKyAgfSBXT0ZGX1RhYmxlUmVjLCAqV09GRl9UYWJsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFdPRkYyX1R0Y0ZvbnRSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIE1ldGFkYXRhIGZvciBhIFRUQyBmb250IGVudHJ5IGluIFdPRkYyLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGZsYXZvciA6OgorICAgKiAgICAgVFRDIGZvbnQgZmxhdm9yLgorICAgKgorICAgKiAgIG51bV90YWJsZXMgOjoKKyAgICogICAgIE51bWJlciBvZiB0YWJsZXMgaW4gVFRDLCBpbmRpY2F0aW5nIG51bWJlciBvZiBlbGVtZW50cyBpbgorICAgKiAgICAgYHRhYmxlX2luZGljZXNgLgorICAgKgorICAgKiAgIHRhYmxlX2luZGljZXMgOjoKKyAgICogICAgIEFycmF5IG9mIHRhYmxlIGluZGljZXMgZm9yIGVhY2ggVFRDIGZvbnQuCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgV09GRjJfVHRjRm9udFJlY18KKyAgeworICAgIEZUX1VMb25nICAgIGZsYXZvcjsKKyAgICBGVF9VU2hvcnQgICBudW1fdGFibGVzOworICAgIEZUX1VTaG9ydCogIHRhYmxlX2luZGljZXM7CisKKyAgfSBXT0ZGMl9UdGNGb250UmVjLCAqV09GRjJfVHRjRm9udDsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFdPRkYyX0hlYWRlclJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgV09GRjIgZmlsZSBmb3JtYXQgaGVhZGVyLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIFNlZQorICAgKgorICAgKiAgICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dPRkYyLyN3b2ZmMjBIZWFkZXIKKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZmllbGRzIGByZXNlcnZlZGAsIGBtYWpvclZlcnNpb25gIGFuZAorICAgKiAgIGBtaW5vclZlcnNpb25gLCBzbyB0aGV5IGFyZSBub3QgaW5jbHVkZWQuICBUaGUgYHRvdGFsU2ZudFNpemVgIGZpZWxkCisgICAqICAgZG9lcyBub3QgbmVjZXNzYXJpbHkgcmVwcmVzZW50IHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkCisgICAqICAgU0ZOVCBmb250IHN0cmVhbSwgc28gdGhhdCBpcyB1c2VkIGFzIGEgcmVmZXJlbmNlIHZhbHVlIGluc3RlYWQuCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgV09GRjJfSGVhZGVyUmVjXworICB7CisgICAgRlRfVUxvbmcgICBzaWduYXR1cmU7CisgICAgRlRfVUxvbmcgICBmbGF2b3I7CisgICAgRlRfVUxvbmcgICBsZW5ndGg7CisgICAgRlRfVVNob3J0ICBudW1fdGFibGVzOworICAgIEZUX1VMb25nICAgdG90YWxTZm50U2l6ZTsKKyAgICBGVF9VTG9uZyAgIHRvdGFsQ29tcHJlc3NlZFNpemU7CisgICAgRlRfVUxvbmcgICBtZXRhT2Zmc2V0OworICAgIEZUX1VMb25nICAgbWV0YUxlbmd0aDsKKyAgICBGVF9VTG9uZyAgIG1ldGFPcmlnTGVuZ3RoOworICAgIEZUX1VMb25nICAgcHJpdk9mZnNldDsKKyAgICBGVF9VTG9uZyAgIHByaXZMZW5ndGg7CisKKyAgICBGVF9VTG9uZyAgIHVuY29tcHJlc3NlZF9zaXplOyAgICAvKiB1bmNvbXByZXNzZWQgYnJvdGxpIHN0cmVhbSBzaXplICovCisgICAgRlRfVUxvbmcgICBjb21wcmVzc2VkX29mZnNldDsgICAgLyogY29tcHJlc3NlZCBzdHJlYW0gb2Zmc2V0ICAgICAgICAqLworICAgIEZUX1VMb25nICAgaGVhZGVyX3ZlcnNpb247ICAgICAgIC8qIHZlcnNpb24gb2Ygb3JpZ2luYWwgVFRDIEhlYWRlciAgKi8KKyAgICBGVF9VU2hvcnQgIG51bV9mb250czsgICAgICAgICAgICAvKiBudW1iZXIgb2YgZm9udHMgaW4gVFRDICAgICAgICAgICovCisgICAgRlRfVUxvbmcgICBhY3R1YWxfc2ZudF9zaXplOyAgICAgLyogYWN0dWFsIHNpemUgb2Ygc2ZudCBzdHJlYW0gICAgICAqLworCisgICAgV09GRjJfVHRjRm9udCAgdHRjX2ZvbnRzOyAgICAgICAgLyogbWV0YWRhdGEgZm9yIGZvbnRzIGluIGEgVFRDICAgICAqLworCisgIH0gV09GRjJfSGVhZGVyUmVjLCAqV09GRjJfSGVhZGVyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgV09GRjJfVGFibGVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgV09GRjIgZm9udC4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBTZWUKKyAgICoKKyAgICogICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XT0ZGMi8jdGFibGVfZGlyX2Zvcm1hdAorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkYyX1RhYmxlUmVjXworICB7CisgICAgRlRfQnl0ZSAgIEZsYWdCeXRlOyAgICAgICAgICAgLyogdGFibGUgdHlwZSBhbmQgZmxhZ3MgICAgICAqLworICAgIEZUX1VMb25nICBUYWc7ICAgICAgICAgICAgICAgIC8qIHRhYmxlIGZpbGUgb2Zmc2V0ICAgICAgICAgKi8KKyAgICBGVF9VTG9uZyAgZHN0X2xlbmd0aDsgICAgICAgICAvKiB1bmNvbXByZXNzZWQgdGFibGUgbGVuZ3RoICovCisgICAgRlRfVUxvbmcgIFRyYW5zZm9ybUxlbmd0aDsgICAgLyogdHJhbnNmb3JtZWQgbGVuZ3RoICAgICAgICAqLworCisgICAgRlRfVUxvbmcgIGZsYWdzOyAgICAgICAgICAgICAgLyogY2FsY3VsYXRlZCBmbGFncyAgICAgICAgICAqLworICAgIEZUX1VMb25nICBzcmNfb2Zmc2V0OyAgICAgICAgIC8qIGNvbXByZXNzZWQgdGFibGUgb2Zmc2V0ICAgKi8KKyAgICBGVF9VTG9uZyAgc3JjX2xlbmd0aDsgICAgICAgICAvKiBjb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAgICovCisgICAgRlRfVUxvbmcgIGRzdF9vZmZzZXQ7ICAgICAgICAgLyogdW5jb21wcmVzc2VkIHRhYmxlIG9mZnNldCAqLworCisgIH0gV09GRjJfVGFibGVSZWMsICpXT0ZGMl9UYWJsZTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFdPRkYyX0luZm9SZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIE1ldGFkYXRhIGZvciBXT0ZGMiBmb250IHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciByZWNvbnN0cnVjdGlvbiBvZgorICAgKiAgIHNmbnQgdGFibGVzLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIGhlYWRlcl9jaGVja3N1bSA6OgorICAgKiAgICAgQ2hlY2tzdW0gb2YgU0ZOVCBvZmZzZXQgdGFibGUuCisgICAqCisgICAqICAgbnVtX2dseXBocyA6OgorICAgKiAgICAgTnVtYmVyIG9mIGdseXBocyBpbiB0aGUgZm9udC4KKyAgICoKKyAgICogICBudW1faG1ldHJpY3MgOjoKKyAgICogICAgIGBudW1iZXJPZkhNZXRyaWNzYCBmaWVsZCBpbiB0aGUgJ2hoZWEnIHRhYmxlLgorICAgKgorICAgKiAgIHhfbWlucyA6OgorICAgKiAgICAgYHhNaW5gIHZhbHVlcyBvZiBnbHlwaCBib3VuZGluZyBib3guCisgICAqCisgICAqICAgZ2x5Zl90YWJsZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBgZ2x5ZicgdGFibGUgcmVjb3JkLgorICAgKgorICAgKiAgIGxvY2FfdGFibGUgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgYGxvY2EnIHRhYmxlIHJlY29yZC4KKyAgICoKKyAgICogICBoZWFkX3RhYmxlIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGBoZWFkJyB0YWJsZSByZWNvcmQuCisgICAqLworICB0eXBlZGVmIHN0cnVjdCAgV09GRjJfSW5mb1JlY18KKyAgeworICAgIEZUX1VMb25nICAgaGVhZGVyX2NoZWNrc3VtOworICAgIEZUX1VTaG9ydCAgbnVtX2dseXBoczsKKyAgICBGVF9VU2hvcnQgIG51bV9obWV0cmljczsKKyAgICBGVF9TaG9ydCogIHhfbWluczsKKworICAgIFdPRkYyX1RhYmxlICBnbHlmX3RhYmxlOworICAgIFdPRkYyX1RhYmxlICBsb2NhX3RhYmxlOworICAgIFdPRkYyX1RhYmxlICBoZWFkX3RhYmxlOworCisgIH0gV09GRjJfSW5mb1JlYywgKldPRkYyX0luZm87CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBXT0ZGMl9TdWJzdHJlYW1SZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHN1YnN0cmVhbSBpbiB0aGUgdHJhbnNmb3JtZWQKKyAgICogICAnZ2x5ZicgdGFibGUgaW4gYSBXT0ZGMiBzdHJlYW0uCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgc3RhcnQgOjoKKyAgICogICAgIEJlZ2lubmluZyBvZiB0aGUgc3Vic3RyZWFtIHJlbGF0aXZlIHRvIHVuY29tcHJlc3NlZCB0YWJsZSBzdHJlYW0uCisgICAqCisgICAqICAgb2Zmc2V0IDo6CisgICAqICAgICBPZmZzZXQgb2YgdGhlIHN1YnN0cmVhbSByZWxhdGl2ZSB0byB1bmNvbXByZXNzZWQgdGFibGUgc3RyZWFtLgorICAgKgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIFNpemUgb2YgdGhlIHN1YnN0cmVhbS4KKyAgICovCisgIHR5cGVkZWYgc3RydWN0ICBXT0ZGMl9TdWJzdHJlYW1SZWNfCisgIHsKKyAgICBGVF9VTG9uZyAgc3RhcnQ7CisgICAgRlRfVUxvbmcgIG9mZnNldDsKKyAgICBGVF9VTG9uZyAgc2l6ZTsKKworICB9IFdPRkYyX1N1YnN0cmVhbVJlYywgKldPRkYyX1N1YnN0cmVhbTsKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFdPRkYyX1BvaW50UmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBwb2ludCBpbiB0aGUgdHJhbnNmb3JtZWQKKyAgICogICAnZ2x5ZicgdGFibGUgaW4gYSBXT0ZGMiBzdHJlYW0uCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgeCA6OgorICAgKiAgICAgeC1jb29yZGluYXRlIG9mIHBvaW50LgorICAgKgorICAgKiAgIHkgOjoKKyAgICogICAgIHktY29vcmRpbmF0ZSBvZiBwb2ludC4KKyAgICoKKyAgICogICBvbl9jdXJ2ZSA6OgorICAgKiAgICAgU2V0IGlmIHBvaW50IGlzIG9uLWN1cnZlLgorICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkYyX1BvaW50UmVjXworICB7CisgICAgRlRfSW50ICAgeDsKKyAgICBGVF9JbnQgICB5OworICAgIEZUX0Jvb2wgIG9uX2N1cnZlOworCisgIH0gV09GRjJfUG9pbnRSZWMsICpXT0ZGMl9Qb2ludDsKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBXT0ZGVFlQRVNfSF8gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCBiL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaAppbmRleCAzNTAzYzI2Li40MjZlMTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS90MXRhYmxlcy5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MXRhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgVHlwZSAxL1R5cGUgMiB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbiAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDF0YWJsZXMuaAorICoKKyAqICAgQmFzaWMgVHlwZSAxL1R5cGUgMiB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbgorICogICBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVDFUQUJMRVNfSF8KICNkZWZpbmUgVDFUQUJMRVNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCiAjaWZkZWYgRlJFRVRZUEVfSAogI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKQEAgLTM0LDU4ICszMyw1OCBAQAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlMV90YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlfjEgKFBvc3RTY3JpcHQpIHNwZWNpZmljIGZvbnQgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgVHlwZSAxLXNwZWNpZmljIHRhYmxlcywgICAgKi8KLSAgLyogICAgaW5jbHVkaW5nIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBvdGhlciBQb3N0U2NyaXB0IGZvbnQgZm9ybWF0cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Qcml2YXRlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZURpY3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlSW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hhc19QU19HbHlwaF9OYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUFNfRm9udF9JbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9QU19Gb250X1ZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQmxlbmRfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VuY29kaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19EaWN0X0tleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgdHlwZTFfdGFibGVzCisgICAqCisgICAqIEB0aXRsZToKKyAgICogICBUeXBlIDEgVGFibGVzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBUeXBlfjEtc3BlY2lmaWMgZm9udCB0YWJsZXMuCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgVHlwZX4xLXNwZWNpZmljIHRhYmxlcywKKyAgICogICBpbmNsdWRpbmcgc3RydWN0dXJlcyByZWxhdGVkIHRvIG90aGVyIFBvc3RTY3JpcHQgZm9udCBmb3JtYXRzLgorICAgKgorICAgKiBAb3JkZXI6CisgICAqICAgUFNfRm9udEluZm9SZWMKKyAgICogICBQU19Gb250SW5mbworICAgKiAgIFBTX1ByaXZhdGVSZWMKKyAgICogICBQU19Qcml2YXRlCisgICAqCisgICAqICAgQ0lEX0ZhY2VEaWN0UmVjCisgICAqICAgQ0lEX0ZhY2VEaWN0CisgICAqICAgQ0lEX0ZhY2VJbmZvUmVjCisgICAqICAgQ0lEX0ZhY2VJbmZvCisgICAqCisgICAqICAgRlRfSGFzX1BTX0dseXBoX05hbWVzCisgICAqICAgRlRfR2V0X1BTX0ZvbnRfSW5mbworICAgKiAgIEZUX0dldF9QU19Gb250X1ByaXZhdGUKKyAgICogICBGVF9HZXRfUFNfRm9udF9WYWx1ZQorICAgKgorICAgKiAgIFQxX0JsZW5kX0ZsYWdzCisgICAqICAgVDFfRW5jb2RpbmdUeXBlCisgICAqICAgUFNfRGljdF9LZXlzCisgICAqCisgICAqLwogCiAKICAgLyogTm90ZSB0aGF0IHdlIHNlcGFyYXRlIGZvbnQgZGF0YSBpbiBQU19Gb250SW5mb1JlYyBhbmQgUFNfUHJpdmF0ZVJlYyAqLwogICAvKiBzdHJ1Y3R1cmVzIGluIG9yZGVyIHRvIHN1cHBvcnQgTXVsdGlwbGUgTWFzdGVyIGZvbnRzLiAgICAgICAgICAgICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHlwZX4xIG9yIFR5cGV+MiBGb250SW5mbyBkaWN0aW9uYXJ5LiAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMsIGVhY2ggaW5zdGFuY2UgaGFzIGl0cyBvd24gICAgICovCi0gIC8qICAgIEZvbnRJbmZvIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgUFNfRm9udEluZm9SZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIEZvbnRJbmZvIGRpY3Rpb25hcnkuCisgICAqICAgTm90ZSB0aGF0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMsIGVhY2ggaW5zdGFuY2UgaGFzIGl0cyBvd24KKyAgICogICBGb250SW5mbyBkaWN0aW9uYXJ5LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0ZvbnRJbmZvUmVjXwogICB7CiAgICAgRlRfU3RyaW5nKiAgdmVyc2lvbjsKQEAgLTEwMSw0MCArMTAwLDM5IEBACiAgIH0gUFNfRm9udEluZm9SZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFBTX0ZvbnRJbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBQU19Gb250SW5mb1JlY18qICBQU19Gb250SW5mbzsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Gb250SW5mb1JlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICAqLwotICAvKiAgICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUMV9Gb250SW5mbworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX0ZvbnRJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQga2VwdAorICAgKiAgIHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiBGcmVlVHlwZS4KKyAgICovCiAgIHR5cGVkZWYgUFNfRm9udEluZm9SZWMgIFQxX0ZvbnRJbmZvOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFR5cGV+MSBvciBUeXBlfjIgcHJpdmF0ZSBkaWN0aW9uYXJ5LiAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBmb3IgTXVsdGlwbGUgTWFzdGVyIGZvbnRzLCBlYWNoIGluc3RhbmNlIGhhcyBpdHMgb3duICAgICAqLwotICAvKiAgICBQcml2YXRlIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFBTX1ByaXZhdGVSZWMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIHByaXZhdGUgZGljdGlvbmFyeS4gIE5vdGUKKyAgICogICB0aGF0IGZvciBNdWx0aXBsZSBNYXN0ZXIgZm9udHMsIGVhY2ggaW5zdGFuY2UgaGFzIGl0cyBvd24gUHJpdmF0ZQorICAgKiAgIGRpY3Rpb25hcnkuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgUFNfUHJpdmF0ZVJlY18KICAgewogICAgIEZUX0ludCAgICAgdW5pcXVlX2lkOwpAQCAtMTc2LDU2ICsxNzQsNTUgQEAKICAgfSBQU19Qcml2YXRlUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBQU19Qcml2YXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIEBQU19Qcml2YXRlUmVjIHN0cnVjdHVyZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IFBTX1ByaXZhdGVSZWNfKiAgUFNfUHJpdmF0ZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX1ByaXZhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQFBTX1ByaXZhdGVSZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCAgICAqLwotICAvKiAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAgKi8KLSAgLyogICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUMV9Qcml2YXRlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Qcml2YXRlUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQga2VwdAorICAgKiAgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mIEZyZWVUeXBlLgorICAgKi8KICAgdHlwZWRlZiBQU19Qcml2YXRlUmVjICBUMV9Qcml2YXRlOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQmxlbmRfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzZXQgb2YgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGJsZW5kIGRpY3Rpb25hcnkgKGZvbnQgaW5mbyBvciBwcml2YXRlKS4gIFVzZWQgdG8gc3VwcG9ydCAgICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRIIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1NDQUxFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfQkxVRV9TSElGVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgVDFfQmxlbmRfRmxhZ3MKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc2V0IG9mIGZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggZmllbGRzIGFyZSBwcmVzZW50IGluIGEgZ2l2ZW4KKyAgICogICBibGVuZCBkaWN0aW9uYXJ5IChmb250IGluZm8gb3IgcHJpdmF0ZSkuICBVc2VkIHRvIHN1cHBvcnQgTXVsdGlwbGUKKyAgICogICBNYXN0ZXJzIGZvbnRzLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTiA6OgorICAgKiAgIFQxX0JMRU5EX1VOREVSTElORV9USElDS05FU1MgOjoKKyAgICogICBUMV9CTEVORF9JVEFMSUNfQU5HTEUgOjoKKyAgICogICBUMV9CTEVORF9CTFVFX1ZBTFVFUyA6OgorICAgKiAgIFQxX0JMRU5EX09USEVSX0JMVUVTIDo6CisgICAqICAgVDFfQkxFTkRfU1RBTkRBUkRfV0lEVEggOjoKKyAgICogICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQgOjoKKyAgICogICBUMV9CTEVORF9TVEVNX1NOQVBfV0lEVEhTIDo6CisgICAqICAgVDFfQkxFTkRfU1RFTV9TTkFQX0hFSUdIVFMgOjoKKyAgICogICBUMV9CTEVORF9CTFVFX1NDQUxFIDo6CisgICAqICAgVDFfQkxFTkRfQkxVRV9TSElGVCA6OgorICAgKiAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUyA6OgorICAgKiAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUyA6OgorICAgKiAgIFQxX0JMRU5EX0ZPUkNFX0JPTEQgOjoKKyAgICovCiAgIHR5cGVkZWYgZW51bSAgVDFfQmxlbmRfRmxhZ3NfCiAgIHsKICAgICAvKiByZXF1aXJlZCBmaWVsZHMgaW4gYSBGb250SW5mbyBibGVuZCBkaWN0aW9uYXJ5ICovCkBAIC0yNTIsNyArMjQ5LDcgQEAKIAogCiAgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBUMV9CbGVuZF9GbGFncycgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBUMV9CbGVuZF9GbGFnc2AgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIHQxX2JsZW5kX3VuZGVybGluZV9wb3NpdGlvbiAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTgogI2RlZmluZSB0MV9ibGVuZF91bmRlcmxpbmVfdGhpY2tuZXNzICBUMV9CTEVORF9VTkRFUkxJTkVfVEhJQ0tORVNTCiAjZGVmaW5lIHQxX2JsZW5kX2l0YWxpY19hbmdsZSAgICAgICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRQpAQCAtMzMwLDE0ICszMjcsMjMgQEAKICAgdHlwZWRlZiBQU19CbGVuZFJlYyAgVDFfQmxlbmQ7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZURpY3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBkYXRhIGluIGEgQ0lEIHRvcC1sZXZlbCBkaWN0aW9uYXJ5LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIENJRF9GYWNlRGljdFJlYworICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXByZXNlbnQgZGF0YSBpbiBhIENJRCB0b3AtbGV2ZWwgZGljdGlvbmFyeS4gIEluCisgICAqICAgbW9zdCBjYXNlcywgdGhleSBhcmUgcGFydCBvZiB0aGUgZm9udCdzICcvRkRBcnJheScgYXJyYXkuICBXaXRoaW4gYQorICAgKiAgIENJRCBmb250IGZpbGUsIHN1Y2ggKGludGVybmFsKSBzdWJmb250IGRpY3Rpb25hcmllcyBhcmUgZW5jbG9zZWQgYnkKKyAgICogICAnJUFET0JlZ2luRm9udERpY3QnIGFuZCAnJUFET0VuZEZvbnREaWN0JyBjb21tZW50cy4KKyAgICoKKyAgICogICBOb3RlIHRoYXQgYENJRF9GYWNlRGljdFJlY2AgbWlzc2VzIGEgZmllbGQgZm9yIHRoZSAnL0ZvbnROYW1lJworICAgKiAgIGtleXdvcmQsIHNwZWNpZnlpbmcgdGhlIHN1YmZvbnQncyBuYW1lICh0aGUgdG9wLWxldmVsIGZvbnQgbmFtZSBpcworICAgKiAgIGdpdmVuIGJ5IHRoZSAnL0NJREZvbnROYW1lJyBrZXl3b3JkKS4gIFRoaXMgaXMgYW4gb3ZlcnNpZ2h0LCBidXQgaXQKKyAgICogICBkb2Vzbid0IGxpbWl0IHRoZSAnY2lkJyBmb250IG1vZHVsZSdzIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSBGcmVlVHlwZQorICAgKiAgIG5laXRoZXIgbmVlZHMgdGhpcyBlbnRyeSBub3IgZ2l2ZXMgYWNjZXNzIHRvIENJRCBzdWJmb250cy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZURpY3RSZWNfCiAgIHsKICAgICBQU19Qcml2YXRlUmVjICBwcml2YXRlX2RpY3Q7CkBAIC0zNDUsOCArMzUxLDggQEAKICAgICBGVF9VSW50ICAgICAgICBsZW5fYnVpbGRjaGFyOwogICAgIEZUX0ZpeGVkICAgICAgIGZvcmNlYm9sZF90aHJlc2hvbGQ7CiAgICAgRlRfUG9zICAgICAgICAgc3Ryb2tlX3dpZHRoOwotICAgIEZUX0ZpeGVkICAgICAgIGV4cGFuc2lvbl9mYWN0b3I7Ci0KKyAgICBGVF9GaXhlZCAgICAgICBleHBhbnNpb25fZmFjdG9yOyAgIC8qIHRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgcHJpdmF0ZV9kaWN0LT5leHBhbnNpb25fZmFjdG9yJyAqLwogICAgIEZUX0J5dGUgICAgICAgIHBhaW50X3R5cGU7CiAgICAgRlRfQnl0ZSAgICAgICAgZm9udF90eXBlOwogICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwpAQCAtMzU5LDM4ICszNjUsMzggQEAKICAgfSBDSURfRmFjZURpY3RSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZURpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEBDSURfRmFjZURpY3RSZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIENJRF9GYWNlRGljdAorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VEaWN0UmVjIHN0cnVjdHVyZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IENJRF9GYWNlRGljdFJlY18qICBDSURfRmFjZURpY3Q7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRm9udERpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VEaWN0UmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgKi8KLSAgLyogICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICovCi0gIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgQ0lEX0ZvbnREaWN0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VEaWN0UmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQKKyAgICogICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZgorICAgKiAgIEZyZWVUeXBlLgorICAgKi8KICAgdHlwZWRlZiBDSURfRmFjZURpY3RSZWMgIENJRF9Gb250RGljdDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlSW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IENJRCBGYWNlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgQ0lEX0ZhY2VJbmZvUmVjCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBDSUQgRmFjZSBpbmZvcm1hdGlvbi4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZUluZm9SZWNfCiAgIHsKICAgICBGVF9TdHJpbmcqICAgICAgY2lkX2ZvbnRfbmFtZTsKQEAgLTQyMSw0NyArNDI3LDQ1IEBACiAgIH0gQ0lEX0ZhY2VJbmZvUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBDSURfRmFjZUluZm8KKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgQENJRF9GYWNlSW5mb1JlYyBzdHJ1Y3R1cmUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZUluZm9SZWNfKiAgQ0lEX0ZhY2VJbmZvOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIENJRF9JbmZvCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBDSURfRmFjZUluZm9SZWMuICBJdCBpcyBkZXByZWNhdGVkIGJ1dCBrZXB0CisgICAqICB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgRnJlZVR5cGUuCisgICAqLwogICB0eXBlZGVmIENJRF9GYWNlSW5mb1JlYyAgQ0lEX0luZm87CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX0hhc19QU19HbHlwaF9OYW1lcwogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHVybiB0cnVlIGlmIGEgZ2l2ZW4gZmFjZSBwcm92aWRlcyByZWxpYWJsZSBQb3N0U2NyaXB0IGdseXBoCi0gICAqICAgIG5hbWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHVzaW5nIHRoZSBARlRfSEFTX0dMWVBIX05BTUVTIG1hY3JvLAotICAgKiAgICBleGNlcHQgdGhhdCBjZXJ0YWluIGZvbnRzIChtb3N0bHkgVHJ1ZVR5cGUpIGNvbnRhaW4gaW5jb3JyZWN0Ci0gICAqICAgIGdseXBoIG5hbWUgdGFibGVzLgorICAgKiAgICBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgcmVsaWFibGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcy4KKyAgICogICAgVGhpcyBpcyBzaW1pbGFyIHRvIHVzaW5nIHRoZSBARlRfSEFTX0dMWVBIX05BTUVTIG1hY3JvLCBleGNlcHQgdGhhdAorICAgKiAgICBjZXJ0YWluIGZvbnRzIChtb3N0bHkgVHJ1ZVR5cGUpIGNvbnRhaW4gaW5jb3JyZWN0IGdseXBoIG5hbWUgdGFibGVzLgogICAgKgogICAgKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgY2FsbGVyIGlzIHN1cmUgdGhhdCB0aGUgZ2x5cGgKICAgICogICAgbmFtZXMgcmV0dXJuZWQgYnkgQEZUX0dldF9HbHlwaF9OYW1lIGFyZSByZWxpYWJsZS4KICAgICoKICAgICogQGlucHV0OgogICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIGZhY2UgaGFuZGxlCisgICAqICAgICAgZmFjZSBoYW5kbGUKICAgICoKICAgICogQHJldHVybjoKICAgICogICAgQm9vbGVhbi4gIFRydWUgaWYgZ2x5cGggbmFtZXMgYXJlIHJlbGlhYmxlLgpAQCAtNDcxLDcgKzQ3NSw3IEBACiAgIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgICBGVF9HZXRfUFNfRm9udF9JbmZvCkBAIC00ODIsMjIgKzQ4NiwyMiBAQAogICAgKgogICAgKiBAaW5wdXQ6CiAgICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgUG9zdFNjcmlwdCBmYWNlIGhhbmRsZS4KKyAgICogICAgICBQb3N0U2NyaXB0IGZhY2UgaGFuZGxlLgogICAgKgogICAgKiBAb3V0cHV0OgogICAgKiAgICBhZm9udF9pbmZvIDo6Ci0gICAqICAgICAgIE91dHB1dCBmb250IGluZm8gc3RydWN0dXJlIHBvaW50ZXIuCisgICAqICAgICAgT3V0cHV0IGZvbnQgaW5mbyBzdHJ1Y3R1cmUgcG9pbnRlci4KICAgICoKICAgICogQHJldHVybjoKICAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KICAgICoKICAgICogQG5vdGU6Ci0gICAqICAgIFN0cmluZyBwb2ludGVycyB3aXRoaW4gdGhlIEBQU19Gb250SW5mb1JlYyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuICBNaXNzaW5nIGVudHJpZXMKLSAgICogICAgaW4gdGhlIGZvbnQncyBGb250SW5mbyBkaWN0aW9uYXJ5IGFyZSByZXByZXNlbnRlZCBieSBOVUxMIHBvaW50ZXJzLgorICAgKiAgICBTdHJpbmcgcG9pbnRlcnMgd2l0aGluIHRoZSBAUFNfRm9udEluZm9SZWMgc3RydWN0dXJlIGFyZSBvd25lZCBieSB0aGUKKyAgICogICAgZmFjZSBhbmQgZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLiAgTWlzc2luZyBlbnRyaWVzIGluCisgICAqICAgIHRoZSBmb250J3MgRm9udEluZm8gZGljdGlvbmFyeSBhcmUgcmVwcmVzZW50ZWQgYnkgYE5VTExgIHBvaW50ZXJzLgogICAgKgogICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdFNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiB3aWxsCi0gICAqICAgIHJldHVybiB0aGUgYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvciBjb2RlLgorICAgKiAgICByZXR1cm4gdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudGAgZXJyb3IgY29kZS4KICAgICoKICAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQpAQCAtNTA1LDcgKzUwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvICBhZm9udF9pbmZvICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZnVuY3Rpb246CiAgICAqICAgIEZUX0dldF9QU19Gb250X1ByaXZhdGUKQEAgLTUxNiwxMSArNTIwLDExIEBACiAgICAqCiAgICAqIEBpbnB1dDoKICAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBQb3N0U2NyaXB0IGZhY2UgaGFuZGxlLgorICAgKiAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCiAgICAqCiAgICAqIEBvdXRwdXQ6CiAgICAqICAgIGFmb250X3ByaXZhdGUgOjoKLSAgICogICAgICAgT3V0cHV0IHByaXZhdGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgcG9pbnRlci4KKyAgICogICAgICBPdXRwdXQgcHJpdmF0ZSBkaWN0aW9uYXJ5IHN0cnVjdHVyZSBwb2ludGVyLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgpAQCAtNTMwLDcgKzUzNCw3IEBACiAgICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCiAgICAqCiAgICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KKyAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudGAgZXJyb3IgY29kZS4KICAgICoKICAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQpAQCAtNTM4LDI1ICs1NDIsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfUHJpdmF0ZSAgYWZvbnRfcHJpdmF0ZSApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRW5jb2RpbmdUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgYEVuY29kaW5nJyBlbnRyeSBpbiBhIFR5cGUgMSAgICAgICAgICovCi0gIC8qICAgIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FTkNPRElOR19UWVBFX0FSUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfSVNPTEFUSU4xIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjQuOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBUMV9FbmNvZGluZ1R5cGUKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIGVudW1lcmF0aW9uIGRlc2NyaWJpbmcgdGhlICdFbmNvZGluZycgZW50cnkgaW4gYSBUeXBlIDEgZGljdGlvbmFyeS4KKyAgICoKKyAgICogQHZhbHVlczoKKyAgICogICBUMV9FTkNPRElOR19UWVBFX05PTkUgOjoKKyAgICogICBUMV9FTkNPRElOR19UWVBFX0FSUkFZIDo6CisgICAqICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCA6OgorICAgKiAgIFQxX0VOQ09ESU5HX1RZUEVfSVNPTEFUSU4xIDo6CisgICAqICAgVDFfRU5DT0RJTkdfVFlQRV9FWFBFUlQgOjoKKyAgICoKKyAgICogQHNpbmNlOgorICAgKiAgIDIuNC44CisgICAqLwogICB0eXBlZGVmIGVudW0gIFQxX0VuY29kaW5nVHlwZV8KICAgewogICAgIFQxX0VOQ09ESU5HX1RZUEVfTk9ORSA9IDAsCkBAIC01NjgsNjYgKzU3MSw2NiBAQAogICB9IFQxX0VuY29kaW5nVHlwZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RpY3RfS2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgaW4gY2FsbHMgdG8gQEZUX0dldF9QU19Gb250X1ZhbHVlIHRvIGlkZW50aWZ5ICAqLwotICAvKiAgICB0aGUgVHlwZX4xIGRpY3Rpb25hcnkgZW50cnkgdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GT05UX01BVFJJWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9OVF9CQk9YIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1BBSU5UX1RZUEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GT05UX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVU5JUVVFX0lEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9DSEFSX1NUUklOR1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9DSEFSX1NUUklOR19LRVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0VOQ09ESU5HX1RZUEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9FTkNPRElOR19FTlRSWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX1NVQlJTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1NVQlIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVERfSFcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1REX1ZXIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9CTFVFX1ZBTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9CTFVFX1ZBTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfQkxVRV9GVVpaIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9PVEhFUl9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9PVEhFUl9CTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0ZBTUlMWV9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZBTUlMWV9CTFVFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX09USEVSX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfU0NBTEUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9CTFVFX1NISUZUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9IIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1NURU1fU05BUF9IIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1RFTV9TTkFQX1YgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPUkNFX0JPTEQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9STkRfU1RFTV9VUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTUlOX0ZFQVRVUkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0xFTl9JViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9QQVNTV09SRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTEFOR1VBR0VfR1JPVVAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1ZFUlNJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OT1RJQ0UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRlVMTF9OQU1FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZBTUlMWV9OQU1FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9XRUlHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfSVNfRklYRURfUElUQ0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1VOREVSTElORV9QT1NJVElPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9VTkRFUkxJTkVfVEhJQ0tORVNTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRlNfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0lUQUxJQ19BTkdMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjQuOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBQU19EaWN0X0tleXMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIGVudW1lcmF0aW9uIHVzZWQgaW4gY2FsbHMgdG8gQEZUX0dldF9QU19Gb250X1ZhbHVlIHRvIGlkZW50aWZ5IHRoZQorICAgKiAgIFR5cGV+MSBkaWN0aW9uYXJ5IGVudHJ5IHRvIHJldHJpZXZlLgorICAgKgorICAgKiBAdmFsdWVzOgorICAgKiAgIFBTX0RJQ1RfRk9OVF9UWVBFIDo6CisgICAqICAgUFNfRElDVF9GT05UX01BVFJJWCA6OgorICAgKiAgIFBTX0RJQ1RfRk9OVF9CQk9YIDo6CisgICAqICAgUFNfRElDVF9QQUlOVF9UWVBFIDo6CisgICAqICAgUFNfRElDVF9GT05UX05BTUUgOjoKKyAgICogICBQU19ESUNUX1VOSVFVRV9JRCA6OgorICAgKiAgIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUyA6OgorICAgKiAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkdfS0VZIDo6CisgICAqICAgUFNfRElDVF9DSEFSX1NUUklORyA6OgorICAgKiAgIFBTX0RJQ1RfRU5DT0RJTkdfVFlQRSA6OgorICAgKiAgIFBTX0RJQ1RfRU5DT0RJTkdfRU5UUlkgOjoKKyAgICogICBQU19ESUNUX05VTV9TVUJSUyA6OgorICAgKiAgIFBTX0RJQ1RfU1VCUiA6OgorICAgKiAgIFBTX0RJQ1RfU1REX0hXIDo6CisgICAqICAgUFNfRElDVF9TVERfVlcgOjoKKyAgICogICBQU19ESUNUX05VTV9CTFVFX1ZBTFVFUyA6OgorICAgKiAgIFBTX0RJQ1RfQkxVRV9WQUxVRSA6OgorICAgKiAgIFBTX0RJQ1RfQkxVRV9GVVpaIDo6CisgICAqICAgUFNfRElDVF9OVU1fT1RIRVJfQkxVRVMgOjoKKyAgICogICBQU19ESUNUX09USEVSX0JMVUUgOjoKKyAgICogICBQU19ESUNUX05VTV9GQU1JTFlfQkxVRVMgOjoKKyAgICogICBQU19ESUNUX0ZBTUlMWV9CTFVFIDo6CisgICAqICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTIDo6CisgICAqICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSA6OgorICAgKiAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSA6OgorICAgKiAgIFBTX0RJQ1RfQkxVRV9TSElGVCA6OgorICAgKiAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9IIDo6CisgICAqICAgUFNfRElDVF9TVEVNX1NOQVBfSCA6OgorICAgKiAgIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9WIDo6CisgICAqICAgUFNfRElDVF9TVEVNX1NOQVBfViA6OgorICAgKiAgIFBTX0RJQ1RfRk9SQ0VfQk9MRCA6OgorICAgKiAgIFBTX0RJQ1RfUk5EX1NURU1fVVAgOjoKKyAgICogICBQU19ESUNUX01JTl9GRUFUVVJFIDo6CisgICAqICAgUFNfRElDVF9MRU5fSVYgOjoKKyAgICogICBQU19ESUNUX1BBU1NXT1JEIDo6CisgICAqICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCA6OgorICAgKiAgIFBTX0RJQ1RfVkVSU0lPTiA6OgorICAgKiAgIFBTX0RJQ1RfTk9USUNFIDo6CisgICAqICAgUFNfRElDVF9GVUxMX05BTUUgOjoKKyAgICogICBQU19ESUNUX0ZBTUlMWV9OQU1FIDo6CisgICAqICAgUFNfRElDVF9XRUlHSFQgOjoKKyAgICogICBQU19ESUNUX0lTX0ZJWEVEX1BJVENIIDo6CisgICAqICAgUFNfRElDVF9VTkRFUkxJTkVfUE9TSVRJT04gOjoKKyAgICogICBQU19ESUNUX1VOREVSTElORV9USElDS05FU1MgOjoKKyAgICogICBQU19ESUNUX0ZTX1RZUEUgOjoKKyAgICogICBQU19ESUNUX0lUQUxJQ19BTkdMRSA6OgorICAgKgorICAgKiBAc2luY2U6CisgICAqICAgMi40LjgKKyAgICovCiAgIHR5cGVkZWYgZW51bSAgUFNfRGljdF9LZXlzXwogICB7CiAgICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgZGljdGlvbmFyeSAqLwpAQCAtNjg3LDcgKzY5MCw3IEBACiAgIH0gUFNfRGljdF9LZXlzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGZ1bmN0aW9uOgogICAgKiAgICBGVF9HZXRfUFNfRm9udF9WYWx1ZQpAQCAtNjk3LDU3ICs3MDAsNTcgQEAKICAgICoKICAgICogQGlucHV0OgogICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCisgICAqICAgICAgUG9zdFNjcmlwdCBmYWNlIGhhbmRsZS4KICAgICoKICAgICogICAga2V5IDo6Ci0gICAqICAgICAgIEFuIGVudW1lcmF0aW9uIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZGljdGlvbmFyeSBrZXkgdG8gcmV0cmlldmUuCisgICAqICAgICAgQW4gZW51bWVyYXRpb24gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkaWN0aW9uYXJ5IGtleSB0byByZXRyaWV2ZS4KICAgICoKICAgICogICAgaWR4IDo6Ci0gICAqICAgICAgIEZvciBhcnJheSB2YWx1ZXMsIHRoaXMgc3BlY2lmaWVzIHRoZSBpbmRleCB0byBiZSByZXR1cm5lZC4KKyAgICogICAgICBGb3IgYXJyYXkgdmFsdWVzLCB0aGlzIHNwZWNpZmllcyB0aGUgaW5kZXggdG8gYmUgcmV0dXJuZWQuCiAgICAqCiAgICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIEEgcG9pbnRlciB0byBtZW1vcnkgaW50byB3aGljaCB0byB3cml0ZSB0aGUgdmFsdWUuCisgICAqICAgICAgQSBwb2ludGVyIHRvIG1lbW9yeSBpbnRvIHdoaWNoIHRvIHdyaXRlIHRoZSB2YWx1ZS4KICAgICoKICAgICogICAgdmFsZW5fbGVuIDo6Ci0gICAqICAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lbW9yeSBzdXBwbGllZCBmb3IgdGhlIHZhbHVlLgorICAgKiAgICAgIFRoZSBzaXplLCBpbiBieXRlcywgb2YgdGhlIG1lbW9yeSBzdXBwbGllZCBmb3IgdGhlIHZhbHVlLgogICAgKgogICAgKiBAb3V0cHV0OgogICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBUaGUgdmFsdWUgbWF0Y2hpbmcgdGhlIGFib3ZlIGtleSwgaWYgaXQgZXhpc3RzLgorICAgKiAgICAgIFRoZSB2YWx1ZSBtYXRjaGluZyB0aGUgYWJvdmUga2V5LCBpZiBpdCBleGlzdHMuCiAgICAqCiAgICAqIEByZXR1cm46Ci0gICAqICAgIFRoZSBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdGVkCi0gICAqICAgIHZhbHVlIChpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZSkuCisgICAqICAgIFRoZSBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdGVkIHZhbHVlCisgICAqICAgIChpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZSkuCiAgICAqCiAgICAqIEBub3RlOgogICAgKiAgICBUaGUgdmFsdWVzIHJldHVybmVkIGFyZSBub3QgcG9pbnRlcnMgaW50byB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyBvZgotICAgKiAgICB0aGUgZmFjZSwgYnV0IGFyZSBgZnJlc2gnIGNvcGllcywgc28gdGhhdCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlbQorICAgKiAgICB0aGUgZmFjZSwgYnV0IGFyZSAnZnJlc2gnIGNvcGllcywgc28gdGhhdCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlbQogICAgKiAgICBiZWxvbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgVGhpcyBhbHNvIGVuZm9yY2VzIHRoZQotICAgKiAgICBgcmVhZC1vbmx5JyBuYXR1cmUgb2YgdGhlc2UgdmFsdWVzLCBpLmUuLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZQorICAgKiAgICAncmVhZC1vbmx5JyBuYXR1cmUgb2YgdGhlc2UgdmFsdWVzLCBpLmUuLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZQogICAgKiAgICB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGZhY2UuCiAgICAqCi0gICAqICAgIGB2YWx1ZScgaXMgYSB2b2lkIHBvaW50ZXIgYmVjYXVzZSB0aGUgdmFsdWVzIHJldHVybmVkIGNhbiBiZSBvZgorICAgKiAgICBgdmFsdWVgIGlzIGEgdm9pZCBwb2ludGVyIGJlY2F1c2UgdGhlIHZhbHVlcyByZXR1cm5lZCBjYW4gYmUgb2YKICAgICogICAgdmFyaW91cyB0eXBlcy4KICAgICoKLSAgICogICAgSWYgZWl0aGVyIGB2YWx1ZScgaXMgTlVMTCBvciBgdmFsdWVfbGVuJyBpcyB0b28gc21hbGwsIGp1c3QgdGhlCisgICAqICAgIElmIGVpdGhlciBgdmFsdWVgIGlzIGBOVUxMYCBvciBgdmFsdWVfbGVuYCBpcyB0b28gc21hbGwsIGp1c3QgdGhlCiAgICAqICAgIHJlcXVpcmVkIG1lbW9yeSBzaXplIGZvciB0aGUgcmVxdWVzdGVkIGVudHJ5IGlzIHJldHVybmVkLgogICAgKgotICAgKiAgICBUaGUgYGlkeCcgcGFyYW1ldGVyIGlzIHVzZWQsIG5vdCBvbmx5IHRvIHJldHJpZXZlIGVsZW1lbnRzIG9mLCBmb3IKKyAgICogICAgVGhlIGBpZHhgIHBhcmFtZXRlciBpcyB1c2VkLCBub3Qgb25seSB0byByZXRyaWV2ZSBlbGVtZW50cyBvZiwgZm9yCiAgICAqICAgIGV4YW1wbGUsIHRoZSBGb250TWF0cml4IG9yIEZvbnRCQm94LCBidXQgYWxzbyB0byByZXRyaWV2ZSBuYW1lIGtleXMKICAgICogICAgZnJvbSB0aGUgQ2hhclN0cmluZ3MgZGljdGlvbmFyeSwgYW5kIHRoZSBjaGFyc3RyaW5ncyB0aGVtc2VsdmVzLiAgSXQKICAgICogICAgaXMgaWdub3JlZCBmb3IgYXRvbWljIHZhbHVlcy4KICAgICoKLSAgICogICAgUFNfRElDVF9CTFVFX1NDQUxFIHJldHVybnMgYSB2YWx1ZSB0aGF0IGlzIHNjYWxlZCB1cCBieSAxMDAwLiAgVG8KLSAgICogICAgZ2V0IHRoZSB2YWx1ZSBhcyBpbiB0aGUgZm9udCBzdHJlYW0sIHlvdSBuZWVkIHRvIGRpdmlkZSBieQotICAgKiAgICA2NTUzNjAwMC4wICh0byByZW1vdmUgdGhlIEZUX0ZpeGVkIHNjYWxlLCBhbmQgdGhlIHgxMDAwIHNjYWxlKS4KKyAgICogICAgYFBTX0RJQ1RfQkxVRV9TQ0FMRWAgcmV0dXJucyBhIHZhbHVlIHRoYXQgaXMgc2NhbGVkIHVwIGJ5IDEwMDAuICBUbworICAgKiAgICBnZXQgdGhlIHZhbHVlIGFzIGluIHRoZSBmb250IHN0cmVhbSwgeW91IG5lZWQgdG8gZGl2aWRlIGJ5IDY1NTM2MDAwLjAKKyAgICogICAgKHRvIHJlbW92ZSB0aGUgRlRfRml4ZWQgc2NhbGUsIGFuZCB0aGUgeDEwMDAgc2NhbGUpLgogICAgKgogICAgKiAgICBJTVBPUlRBTlQ6IE9ubHkga2V5L3ZhbHVlIHBhaXJzIHJlYWQgYnkgdGhlIEZyZWVUeXBlIGludGVycHJldGVyIGNhbgotICAgKiAgICBiZSByZXRyaWV2ZWQuICBTbywgZm9yIGV4YW1wbGUsIFBvc3RTY3JpcHQgcHJvY2VkdXJlcyBzdWNoIGFzIE5QLAotICAgKiAgICBORCwgYW5kIFJEIGFyZSBub3QgYXZhaWxhYmxlLiAgQXJiaXRyYXJ5IGtleXMgYXJlLCBvYnZpb3VzbHksIG5vdCBiZQorICAgKiAgICBiZSByZXRyaWV2ZWQuICBTbywgZm9yIGV4YW1wbGUsIFBvc3RTY3JpcHQgcHJvY2VkdXJlcyBzdWNoIGFzIE5QLCBORCwKKyAgICogICAgYW5kIFJEIGFyZSBub3QgYXZhaWxhYmxlLiAgQXJiaXRyYXJ5IGtleXMgYXJlLCBvYnZpb3VzbHksIG5vdCBiZQogICAgKiAgICBhdmFpbGFibGUgZWl0aGVyLgogICAgKgogICAgKiAgICBJZiB0aGUgZm9udCdzIGZvcm1hdCBpcyBub3QgUG9zdFNjcmlwdC1iYXNlZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gICAqICAgIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCisgICAqICAgIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnRgIGVycm9yIGNvZGUuCiAgICAqCiAgICAqIEBzaW5jZToKICAgICogICAgMi40LjgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaCBiL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaAppbmRleCA4NjA1MTgzLi4yYjJlZDRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oCkBAIC0xLDc4ICsxLDc4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG5hbWVpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgbmFtZSBJRCBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dG5hbWVpZC5oCisgKgorICogICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVE5BTUVJRF9IXwogI2RlZmluZSBUVE5BTUVJRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHNlY3Rpb246CisgICAqICAgdHJ1ZXR5cGVfdGFibGVzCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpbiB0aGUgbmFtZSAgICAgICAgKi8KLSAgLyogcmVjb3JkcyBvZiBhbiBTRk5UIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlICdwbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGluIHRoZSBuYW1lIHJlY29yZHMKKyAgICogb2YgYW4gU0ZOVCAnbmFtZScgdGFibGUuCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZW51bToKICAgICogICBUVF9QTEFURk9STV9YWFgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWQnIGlkZW50aWZpZXIgY29kZSBpbgorICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWRgIGlkZW50aWZpZXIgY29kZSBpbgogICAgKiAgIEBGVF9DaGFyTWFwUmVjIGFuZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlcy4KICAgICoKICAgICogQHZhbHVlczoKICAgICogICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIDo6CiAgICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlCisgICAqICAgICBTZWUgQFRUX0FQUExFX0lEX1hYWCBmb3IgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWRgIHZhbHVlcy4gIE5vdGUKICAgICogICAgIHRoYXQgbmFtZSBlbnRyaWVzIGluIHRoaXMgZm9ybWF0IGFyZSBjb2RlZCBhcyBiaWctZW5kaWFuIFVDUy0yCiAgICAqICAgICBjaGFyYWN0ZXIgY29kZXMgX29ubHlfLgogICAgKgogICAgKiAgIFRUX1BMQVRGT1JNX01BQ0lOVE9TSCA6OgotICAgKiAgICAgVXNlZCBieSBBcHBsZSB0byBpbmRpY2F0ZSBhIE1hY09TLXNwZWNpZmljIGNoYXJtYXAgYW5kL29yIG5hbWUgZW50cnkuCi0gICAqICAgICBTZWUgQFRUX01BQ19JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlIHRoYXQKLSAgICogICAgIG1vc3QgVHJ1ZVR5cGUgZm9udHMgY29udGFpbiBhbiBBcHBsZSByb21hbiBjaGFybWFwIHRvIGJlIHVzYWJsZSBvbgotICAgKiAgICAgTWFjT1Mgc3lzdGVtcyAoZXZlbiBpZiB0aGV5IGNvbnRhaW4gYSBNaWNyb3NvZnQgY2hhcm1hcCBhcyB3ZWxsKS4KKyAgICogICAgIFVzZWQgYnkgQXBwbGUgdG8gaW5kaWNhdGUgYSBNYWNPUy1zcGVjaWZpYyBjaGFybWFwIGFuZC9vciBuYW1lCisgICAqICAgICBlbnRyeS4gIFNlZSBAVFRfTUFDX0lEX1hYWCBmb3IgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWRgIHZhbHVlcy4KKyAgICogICAgIE5vdGUgdGhhdCBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYW4gQXBwbGUgcm9tYW4gY2hhcm1hcCB0byBiZQorICAgKiAgICAgdXNhYmxlIG9uIE1hY09TIHN5c3RlbXMgKGV2ZW4gaWYgdGhleSBjb250YWluIGEgTWljcm9zb2Z0IGNoYXJtYXAgYXMKKyAgICogICAgIHdlbGwpLgogICAgKgogICAgKiAgIFRUX1BMQVRGT1JNX0lTTyA6OgotICAgKiAgICAgVGhpcyB2YWx1ZSB3YXMgdXNlZCB0byBzcGVjaWZ5IElTTy9JRUMgMTA2NDYgY2hhcm1hcHMuICBJdCBpcyBob3dldmVyCi0gICAqICAgICBub3cgZGVwcmVjYXRlZC4gIFNlZSBAVFRfSVNPX0lEX1hYWCBmb3IgYSBsaXN0IG9mIGNvcnJlc3BvbmRpbmcKLSAgICogICAgIGBlbmNvZGluZ19pZCcgdmFsdWVzLgorICAgKiAgICAgVGhpcyB2YWx1ZSB3YXMgdXNlZCB0byBzcGVjaWZ5IElTTy9JRUMgMTA2NDYgY2hhcm1hcHMuICBJdCBpcworICAgKiAgICAgaG93ZXZlciBub3cgZGVwcmVjYXRlZC4gIFNlZSBAVFRfSVNPX0lEX1hYWCBmb3IgYSBsaXN0IG9mCisgICAqICAgICBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZGAgdmFsdWVzLgogICAgKgogICAgKiAgIFRUX1BMQVRGT1JNX01JQ1JPU09GVCA6OgogICAgKiAgICAgVXNlZCBieSBNaWNyb3NvZnQgdG8gaW5kaWNhdGUgV2luZG93cy1zcGVjaWZpYyBjaGFybWFwcy4gIFNlZQotICAgKiAgICAgQFRUX01TX0lEX1hYWCBmb3IgYSBsaXN0IG9mIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCisgICAqICAgICBAVFRfTVNfSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWRgIHZhbHVlcy4KICAgICogICAgIE5vdGUgdGhhdCBtb3N0IGZvbnRzIGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAgdXNpbmcKLSAgICogICAgIChUVF9QTEFURk9STV9NSUNST1NPRlQsIEBUVF9NU19JRF9VTklDT0RFX0NTKS4KKyAgICogICAgIChgVFRfUExBVEZPUk1fTUlDUk9TT0ZUYCwgQFRUX01TX0lEX1VOSUNPREVfQ1MpLgogICAgKgogICAgKiAgIFRUX1BMQVRGT1JNX0NVU1RPTSA6OgogICAgKiAgICAgVXNlZCB0byBpbmRpY2F0ZSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBjaGFybWFwcy4KQEAgLTkxLDEzICs5MSwxMyBAQAogI2RlZmluZSBUVF9QTEFURk9STV9BRE9CRSAgICAgICAgICA3IC8qIGFydGlmaWNpYWwgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgVFRfQVBQTEVfSURfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKKyAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkYCBmb3IKICAgICogICBAVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgogICAgKgogICAgKiBAdmFsdWVzOgpAQCAtMTE3LDggKzExNyw4IEBACiAgICAqICAgICBVbmljb2RlIDMuMSBhbmQgYmV5b25kLCB1c2luZyBVVEYtMzIuCiAgICAqCiAgICAqICAgVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiA6OgotICAgKiAgICAgRnJvbSBBZG9iZSwgbm90IEFwcGxlLiAgTm90IGEgbm9ybWFsIGNtYXAuICBTcGVjaWZpZXMgdmFyaWF0aW9ucwotICAgKiAgICAgb24gYSByZWFsIGNtYXAuCisgICAqICAgICBGcm9tIEFkb2JlLCBub3QgQXBwbGUuICBOb3QgYSBub3JtYWwgY21hcC4gIFNwZWNpZmllcyB2YXJpYXRpb25zIG9uCisgICAqICAgICBhIHJlYWwgY21hcC4KICAgICoKICAgICogICBUVF9BUFBMRV9JRF9GVUxMX1VOSUNPREUgOjoKICAgICogICAgIFVzZWQgZm9yIGZhbGxiYWNrIGZvbnRzIHRoYXQgcHJvdmlkZSBjb21wbGV0ZSBVbmljb2RlIGNvdmVyYWdlIHdpdGgKQEAgLTEzNCwxMyArMTM0LDEzIEBACiAjZGVmaW5lIFRUX0FQUExFX0lEX0ZVTExfVU5JQ09ERSAgICAgIDYgLyogdXNlZCB3aXRoIHR5cGUgMTMgY21hcHMgICAgICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgVFRfTUFDX0lEX1hYWAogICAgKgogICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCisgICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZGAgZm9yCiAgICAqICAgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgogICAgKi8KIApAQCAtMTgwLDE0ICsxODAsMTQgQEAKICNkZWZpbmUgVFRfTUFDX0lEX1VOSU5URVJQICAgICAgICAgICAgIDMyCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIFRUX0lTT19JRF9YWFgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9JU08gY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KKyAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkYCBmb3IgQFRUX1BMQVRGT1JNX0lTTworICAgKiAgIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCiAgICAqCiAgICAqICAgVGhlaXIgdXNlIGlzIG5vdyBkZXByZWNhdGVkLgogICAgKgpAQCAtMjA1LDEzICsyMDUsMTMgQEAKICNkZWZpbmUgVFRfSVNPX0lEXzg4NTlfMSAgICAgIDIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgVFRfTVNfSURfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKKyAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkYCBmb3IKICAgICogICBAVFRfUExBVEZPUk1fTUlDUk9TT0ZUIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCiAgICAqCiAgICAqIEB2YWx1ZXM6CkBAIC0yMTksMTYgKzIxOSwxNSBAQAogICAgKiAgICAgTWljcm9zb2Z0IHN5bWJvbCBlbmNvZGluZy4gIFNlZSBARlRfRU5DT0RJTkdfTVNfU1lNQk9MLgogICAgKgogICAgKiAgIFRUX01TX0lEX1VOSUNPREVfQ1MgOjoKLSAgICogICAgIE1pY3Jvc29mdCBXR0w0IGNoYXJtYXAsIG1hdGNoaW5nIFVuaWNvZGUuICBTZWUKLSAgICogICAgIEBGVF9FTkNPRElOR19VTklDT0RFLgorICAgKiAgICAgTWljcm9zb2Z0IFdHTDQgY2hhcm1hcCwgbWF0Y2hpbmcgVW5pY29kZS4gIFNlZSBARlRfRU5DT0RJTkdfVU5JQ09ERS4KICAgICoKICAgICogICBUVF9NU19JRF9TSklTIDo6CiAgICAqICAgICBTaGlmdCBKSVMgSmFwYW5lc2UgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX1NKSVMuCiAgICAqCiAgICAqICAgVFRfTVNfSURfUFJDIDo6CiAgICAqICAgICBDaGluZXNlIGVuY29kaW5ncyBhcyB1c2VkIGluIHRoZSBQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYSAoUFJDKS4KLSAgICogICAgIFRoaXMgbWVhbnMgdGhlIGVuY29kaW5ncyBHQn4yMzEyIGFuZCBpdHMgc3VwZXJzZXRzIEdCSyBhbmQKLSAgICogICAgIEdCfjE4MDMwLiAgU2VlIEBGVF9FTkNPRElOR19QUkMuCisgICAqICAgICBUaGlzIG1lYW5zIHRoZSBlbmNvZGluZ3MgR0J+MjMxMiBhbmQgaXRzIHN1cGVyc2V0cyBHQksgYW5kIEdCfjE4MDMwLgorICAgKiAgICAgU2VlIEBGVF9FTkNPRElOR19QUkMuCiAgICAqCiAgICAqICAgVFRfTVNfSURfQklHXzUgOjoKICAgICogICAgIFRyYWRpdGlvbmFsIENoaW5lc2UgYXMgdXNlZCBpbiBUYWl3YW4gYW5kIEhvbmcgS29uZy4gIFNlZQpAQCAtMjU4LDE0ICsyNTcsMTQgQEAKICNkZWZpbmUgVFRfTVNfSURfR0IyMzEyICBUVF9NU19JRF9QUkMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICoKICAgICogQGVudW06CiAgICAqICAgVFRfQURPQkVfSURfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fQURPQkUgY2hhcm1hcHMuICBUaGlzIGlzIGEgRnJlZVR5cGUtc3BlY2lmaWMgZXh0ZW5zaW9uIQorICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWRgIGZvciBAVFRfUExBVEZPUk1fQURPQkUKKyAgICogICBjaGFybWFwcy4gIFRoaXMgaXMgYSBGcmVlVHlwZS1zcGVjaWZpYyBleHRlbnNpb24hCiAgICAqCiAgICAqIEB2YWx1ZXM6CiAgICAqICAgVFRfQURPQkVfSURfU1RBTkRBUkQgOjoKQEAgLTI4NCwxNCArMjgzLDE0IEBACiAjZGVmaW5lIFRUX0FET0JFX0lEX0xBVElOXzEgICAzCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIFRUX01BQ19MQU5HSURfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKICAgICogICBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGxhbmd1YWdlIGlkZW50aWZpZXIgZmllbGQgaW4gdGhlIG5hbWUgcmVjb3JkcwotICAgKiAgIG9mIHRoZSBTRk5UIGBuYW1lJyB0YWJsZSBpZiB0aGUgYHBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMKKyAgICogICBvZiB0aGUgU0ZOVCAnbmFtZScgdGFibGUgaWYgdGhlICdwbGF0Zm9ybScgaWRlbnRpZmllciBjb2RlIGlzCiAgICAqICAgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSC4gIFRoZXNlIHZhbHVlcyBhcmUgYWxzbyB1c2VkIGFzIHJldHVybiB2YWx1ZXMKICAgICogICBmb3IgZnVuY3Rpb24gQEZUX0dldF9DTWFwX0xhbmd1YWdlX0lELgogICAgKgpAQCAtNDI0LDI0ICs0MjMsMjQgQEAKICNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9ST01BTl9TQ1JJUFQgICAgMTUwCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIFRUX01TX0xBTkdJRF9YWFgKICAgICoKICAgICogQGRlc2NyaXB0aW9uOgogICAgKiAgIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzCi0gICAqICAgb2YgdGhlIFNGTlQgYG5hbWUnIHRhYmxlIGlmIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcworICAgKiAgIG9mIHRoZSBTRk5UICduYW1lJyB0YWJsZSBpZiB0aGUgJ3BsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMKICAgICogICBAVFRfUExBVEZPUk1fTUlDUk9TT0ZULiAgVGhlc2UgdmFsdWVzIGFyZSBhbHNvIHVzZWQgYXMgcmV0dXJuIHZhbHVlcwogICAgKiAgIGZvciBmdW5jdGlvbiBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQuCiAgICAqCiAgICAqICAgVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIE1pY3Jvc29mdCdzIElEcyBpcwogICAgKgotICAgKiAgICAgaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9nbG9iYWxkZXYvcmVmZXJlbmNlL2xjaWQtYWxsLm1zcHggLAorICAgKiAgICAgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy9kZXNrdG9wL0ludGwvbGFuZ3VhZ2UtaWRlbnRpZmllci1jb25zdGFudHMtYW5kLXN0cmluZ3MgLAogICAgKgogICAgKiAgIGhvd2V2ZXIsIHdlIG9ubHkgcHJvdmlkZSBtYWNyb3MgZm9yIGxhbmd1YWdlIGlkZW50aWZpZXJzIHByZXNlbnQgaW4KICAgICogICB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbjogTWljcm9zb2Z0IGhhcyBhYmFuZG9uZWQgdGhlIGNvbmNlcHQgb2YKLSAgICogICBMQ0lEcyAobGFuZ3VhZ2UgY29kZSBpZGVudGlmaWVycyksIGFuZCBmb3JtYXR+MSBvZiB0aGUgYG5hbWUnIHRhYmxlCisgICAqICAgTENJRHMgKGxhbmd1YWdlIGNvZGUgaWRlbnRpZmllcnMpLCBhbmQgZm9ybWF0fjEgb2YgdGhlICduYW1lJyB0YWJsZQogICAgKiAgIHByb3ZpZGVzIGEgYmV0dGVyIG1lY2hhbmlzbSBmb3IgbGFuZ3VhZ2VzIG5vdCBjb3ZlcmVkIGhlcmUuCiAgICAqCiAgICAqICAgTW9yZSBsZWdhY3kgdmFsdWVzIG5vdCBsaXN0ZWQgaW4gdGhlIHJlZmVyZW5jZSBjYW4gYmUgZm91bmQgaW4gdGhlCkBAIC03ODAsMTQgKzc3OSwxNCBAQAogICAgICAgICAgIFRUX01TX0xBTkdJRF9VSUdIVVJfUFJDCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCiAgICAqIEBlbnVtOgogICAgKiAgIFRUX05BTUVfSURfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBQb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIGBuYW1lJyBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgb2YKLSAgICogICBhbiBTRk5UIGBuYW1lJyB0YWJsZS4gIFRoZXNlIHZhbHVlcyBhcmUgcGxhdGZvcm0gaW5kZXBlbmRlbnQuCisgICAqICAgUG9zc2libGUgdmFsdWVzIG9mIHRoZSAnbmFtZScgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mCisgICAqICAgYW4gU0ZOVCAnbmFtZScgdGFibGUuICBUaGVzZSB2YWx1ZXMgYXJlIHBsYXRmb3JtIGluZGVwZW5kZW50LgogICAgKi8KIAogI2RlZmluZSBUVF9OQU1FX0lEX0NPUFlSSUdIVCAgICAgICAgICAgICAgMApAQCAtODM0LDE0ICs4MzMsMTQgQEAKICNkZWZpbmUgVFRfTkFNRV9JRF9QUkVGRVJSRURfU1VCRkFNSUxZICBUVF9OQU1FX0lEX1RZUE9HUkFQSElDX1NVQkZBTUlMWQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgKgogICAgKiBAZW51bToKICAgICogICBUVF9VQ1JfWFhYCiAgICAqCiAgICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBQb3NzaWJsZSBiaXQgbWFzayB2YWx1ZXMgZm9yIHRoZSBgdWxVbmljb2RlUmFuZ2VYJyBmaWVsZHMgaW4gYW4gU0ZOVAotICAgKiAgIGBPUy8yJyB0YWJsZS4KKyAgICogICBQb3NzaWJsZSBiaXQgbWFzayB2YWx1ZXMgZm9yIHRoZSBgdWxVbmljb2RlUmFuZ2VYYCBmaWVsZHMgaW4gYW4gU0ZOVAorICAgKiAgICdPUy8yJyB0YWJsZS4KICAgICovCiAKICAgLyogdWxVbmljb2RlUmFuZ2UxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmgKaW5kZXggY2U2YTYxNy4uYzhmYTM1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaApAQCAtMSwyOCArMSwyNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdGFibGVzIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0dGFibGVzLmgKKyAqCisgKiAgIEJhc2ljIFNGTlQvVHJ1ZVR5cGUgdGFibGVzIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UKKyAqICAgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFRUVEFCTEVTX0hfCiAjZGVmaW5lIFRUVEFCTEVTX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC0zMyw1MyArMzIsNTUgQEAKIAogRlRfQkVHSU5fSEVBREVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgVGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgc3BlY2lmaWMgdGFibGUgdHlwZXMgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHNvbWUgYmFzaWMgdGFibGVzIHNwZWNpZmljIHRvICovCi0gIC8qICAgIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBhcyB3ZWxsIGFzIHNvbWUgcm91dGluZXMgdXNlZCB0byBhY2Nlc3MgYW5kICAqLwotICAvKiAgICBwcm9jZXNzIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSG9yaUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9PUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1BDTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFibGVfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzZWN0aW9uOgorICAgKiAgIHRydWV0eXBlX3RhYmxlcworICAgKgorICAgKiBAdGl0bGU6CisgICAqICAgVHJ1ZVR5cGUgVGFibGVzCisgICAqCisgICAqIEBhYnN0cmFjdDoKKyAgICogICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZSB0eXBlcyBhbmQgZnVuY3Rpb25zLgorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHNvbWUgYmFzaWMgdGFibGVzIHNwZWNpZmljIHRvCisgICAqICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGFzIHdlbGwgYXMgc29tZSByb3V0aW5lcyB1c2VkIHRvIGFjY2VzcyBhbmQKKyAgICogICBwcm9jZXNzIHRoZW0uCisgICAqCisgICAqIEBvcmRlcjoKKyAgICogICBUVF9IZWFkZXIKKyAgICogICBUVF9Ib3JpSGVhZGVyCisgICAqICAgVFRfVmVydEhlYWRlcgorICAgKiAgIFRUX09TMgorICAgKiAgIFRUX1Bvc3RzY3JpcHQKKyAgICogICBUVF9QQ0xUCisgICAqICAgVFRfTWF4UHJvZmlsZQorICAgKgorICAgKiAgIEZUX1NmbnRfVGFnCisgICAqICAgRlRfR2V0X1NmbnRfVGFibGUKKyAgICogICBGVF9Mb2FkX1NmbnRfVGFibGUKKyAgICogICBGVF9TZm50X1RhYmxlX0luZm8KKyAgICoKKyAgICogICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRAorICAgKiAgIEZUX0dldF9DTWFwX0Zvcm1hdAorICAgKgorICAgKiAgIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlIGZvbnQgaGVhZGVyIHRhYmxlLiAgQWxsIGZpZWxkcyAgICAgKi8KLSAgLyogICAgZm9sbG93IHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9IZWFkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgZm9udCBoZWFkZXIgdGFibGUuICBBbGwgZmllbGRzIGZvbGxvdworICAgKiAgIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgVGhlIDY0LWJpdCB0aW1lc3RhbXBzIGFyZSBzdG9yZWQgaW4KKyAgICogICB0d28tZWxlbWVudCBhcnJheXMgYENyZWF0ZWRgIGFuZCBgTW9kaWZpZWRgLCBmaXJzdCB0aGUgdXBwZXIgdGhlbgorICAgKiAgIHRoZSBsb3dlciAzMn5iaXRzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0hlYWRlcl8KICAgewogICAgIEZUX0ZpeGVkICAgVGFibGVfVmVyc2lvbjsKQEAgLTkxLDggKzkyLDggQEAKICAgICBGVF9VU2hvcnQgIEZsYWdzOwogICAgIEZUX1VTaG9ydCAgVW5pdHNfUGVyX0VNOwogCi0gICAgRlRfTG9uZyAgICBDcmVhdGVkIFsyXTsKLSAgICBGVF9Mb25nICAgIE1vZGlmaWVkWzJdOworICAgIEZUX1VMb25nICAgQ3JlYXRlZCBbMl07CisgICAgRlRfVUxvbmcgICBNb2RpZmllZFsyXTsKIAogICAgIEZUX1Nob3J0ICAgeE1pbjsKICAgICBGVF9TaG9ydCAgIHlNaW47CkBAIC0xMDksOTMgKzExMCw5MyBAQAogICB9IFRUX0hlYWRlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0hvcmlIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIsIHRoZSBgaGhlYScgICAgICAqLwotICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUsICAgICAgKi8KLSAgLyogICAgYGhtdHgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICA6OiBUaGUgdGFibGUgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgYXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3Qgb2YgYWxsICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlIGZvbnQgZGVzaWduZXIsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9Bc2NlbmRlcicgZmllbGQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYE9TLzInIHRhYmxlIGluc3RlYWQgaWYgeW91IHdhbnQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzY2VuZGVyICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGRlc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIGJvdHRvbS1tb3N0IG9mICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBuZWdhdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBgT1MvMicgdGFibGUgaW5zdGVhZCBpZiB5b3UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50IHRoZSBjb3JyZWN0IG9uZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX0dhcCAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlX1dpZHRoX01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsIGFkdmFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCBjYW4gYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIHdpZHRoIG9mIGFuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyYml0cmFyeSBzdHJpbmcgb2YgdGV4dC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZyAgOjogVGhlIG1pbmltdW0gbGVmdCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9SaWdodF9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gcmlnaHQgc2lkZSBiZWFyaW5nIG9mIGFsbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhNYXhfRXh0ZW50ICAgICAgICAgICAgOjogVGhlIG1heGltdW0gaG9yaXpvbnRhbCBleHRlbnQgKGkuZS4sIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB3aWR0aCcgb2YgYSBnbHlwaCdzIGJvdW5kaW5nIGJveCkgZm9yICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SaXNlICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SdW4gICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9PZmZzZXQgICAgICAgICAgIDo6IFRoZSBjdXJzb3IncyBvZmZzZXQgZm9yIHNsYW50ZWQgZm9udHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2VydmVkICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljX0RhdGFfRm9ybWF0ICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1iZXJfT2ZfSE1ldHJpY3MgICAgIDo6IE51bWJlciBvZiBITWV0cmljcyBlbnRyaWVzIGluIHRoZSBgaG10eCcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSBzbWFsbGVyIHRoYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYGNhcmV0X1Nsb3BlX1Jpc2UnLCAqLwotICAvKiAgICBgY2FyZXRfU2xvcGVfUnVuJywgYW5kIGBjYXJldF9PZmZzZXQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX0hvcmlIZWFkZXIKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgaG9yaXpvbnRhbCBoZWFkZXIsIHRoZSAnaGhlYScgdGFibGUsCisgICAqICAgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUsICdobXR4Jy4KKyAgICoKKyAgICogQGZpZWxkczoKKyAgICogICBWZXJzaW9uIDo6CisgICAqICAgICBUaGUgdGFibGUgdmVyc2lvbi4KKyAgICoKKyAgICogICBBc2NlbmRlciA6OgorICAgKiAgICAgVGhlIGZvbnQncyBhc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZQorICAgKiAgICAgdG9wLW1vc3Qgb2YgYWxsIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4KKyAgICoKKyAgICogICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUKKyAgICogICAgIGZvbnQgZGVzaWduZXIsIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgZ2x5cGhzIGZvdW5kCisgICAqICAgICBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLgorICAgKgorICAgKiAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyYCBmaWVsZCBvZiB0aGUgJ09TLzInIHRhYmxlIGluc3RlYWQKKyAgICogICAgIGlmIHlvdSB3YW50IHRoZSBjb3JyZWN0IG9uZS4KKyAgICoKKyAgICogICBEZXNjZW5kZXIgOjoKKyAgICogICAgIFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlCisgICAqICAgICBib3R0b20tbW9zdCBvZiBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgaXMgbmVnYXRpdmUuCisgICAqCisgICAqICAgICBUaGlzIHZhbHVlIGlzIGludmFsaWQgaW4gbWFueSBmb250cywgYXMgaXQgaXMgdXN1YWxseSBzZXQgYnkgdGhlCisgICAqICAgICBmb250IGRlc2lnbmVyLCBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlIGdseXBocyBmb3VuZAorICAgKiAgICAgaW4gdGhlIGZvbnQgKG1heWJlIEFTQ0lJKS4KKyAgICoKKyAgICogICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXJgIGZpZWxkIG9mIHRoZSAnT1MvMicgdGFibGUKKyAgICogICAgIGluc3RlYWQgaWYgeW91IHdhbnQgdGhlIGNvcnJlY3Qgb25lLgorICAgKgorICAgKiAgIExpbmVfR2FwIDo6CisgICAqICAgICBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQKKyAgICogICAgIGRlc2NlbmRlciB0byBnZXQgdGhlIEJUQiwgaS5lLiwgdGhlIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlCisgICAqICAgICBmb3IgdGhlIGZvbnQuCisgICAqCisgICAqICAgYWR2YW5jZV9XaWR0aF9NYXggOjoKKyAgICogICAgIFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsIGFkdmFuY2Ugd2lkdGhzIGZvdW5kIGluIHRoZSBmb250LgorICAgKiAgICAgSXQgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSB3aWR0aCBvZiBhbiBhcmJpdHJhcnkgc3RyaW5nCisgICAqICAgICBvZiB0ZXh0LgorICAgKgorICAgKiAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZyA6OgorICAgKiAgICAgVGhlIG1pbmltdW0gbGVmdCBzaWRlIGJlYXJpbmcgb2YgYWxsIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuCisgICAqCisgICAqICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZyA6OgorICAgKiAgICAgVGhlIG1pbmltdW0gcmlnaHQgc2lkZSBiZWFyaW5nIG9mIGFsbCBnbHlwaHMgd2l0aGluIHRoZSBmb250LgorICAgKgorICAgKiAgIHhNYXhfRXh0ZW50IDo6CisgICAqICAgICBUaGUgbWF4aW11bSBob3Jpem9udGFsIGV4dGVudCAoaS5lLiwgdGhlICd3aWR0aCcgb2YgYSBnbHlwaCdzCisgICAqICAgICBib3VuZGluZyBib3gpIGZvciBhbGwgZ2x5cGhzIGluIHRoZSBmb250LgorICAgKgorICAgKiAgIGNhcmV0X1Nsb3BlX1Jpc2UgOjoKKyAgICogICAgIFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyBzbG9wZSBvZiB0aGUgY3Vyc29yCisgICAqICAgICAoc2xvcGU9cmlzZS9ydW4pLgorICAgKgorICAgKiAgIGNhcmV0X1Nsb3BlX1J1biA6OgorICAgKiAgICAgVGhlIHJ1biBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3Mgc2xvcGUuCisgICAqCisgICAqICAgY2FyZXRfT2Zmc2V0IDo6CisgICAqICAgICBUaGUgY3Vyc29yJ3Mgb2Zmc2V0IGZvciBzbGFudGVkIGZvbnRzLgorICAgKgorICAgKiAgIFJlc2VydmVkIDo6CisgICAqICAgICA4fnJlc2VydmVkIGJ5dGVzLgorICAgKgorICAgKiAgIG1ldHJpY19EYXRhX0Zvcm1hdCA6OgorICAgKiAgICAgQWx3YXlzfjAuCisgICAqCisgICAqICAgbnVtYmVyX09mX0hNZXRyaWNzIDo6CisgICAqICAgICBOdW1iZXIgb2YgSE1ldHJpY3MgZW50cmllcyBpbiB0aGUgJ2htdHgnIHRhYmxlIC0tIHRoaXMgdmFsdWUgY2FuIGJlCisgICAqICAgICBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnQuCisgICAqCisgICAqICAgbG9uZ19tZXRyaWNzIDo6CisgICAqICAgICBBIHBvaW50ZXIgaW50byB0aGUgJ2htdHgnIHRhYmxlLgorICAgKgorICAgKiAgIHNob3J0X21ldHJpY3MgOjoKKyAgICogICAgIEEgcG9pbnRlciBpbnRvIHRoZSAnaG10eCcgdGFibGUuCisgICAqCisgICAqIEBub3RlOgorICAgKiAgIEZvciBhbiBPcGVuVHlwZSB2YXJpYXRpb24gZm9udCwgdGhlIHZhbHVlcyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyBjYW4KKyAgICogICBjaGFuZ2UgYWZ0ZXIgYSBjYWxsIHRvIEBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAoYW5kIGZyaWVuZHMpIGlmCisgICAqICAgdGhlIGZvbnQgY29udGFpbnMgYW4gJ01WQVInIHRhYmxlOiBgY2FyZXRfU2xvcGVfUmlzZWAsCisgICAqICAgYGNhcmV0X1Nsb3BlX1J1bmAsIGFuZCBgY2FyZXRfT2Zmc2V0YC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9Ib3JpSGVhZGVyXwogICB7CiAgICAgRlRfRml4ZWQgICBWZXJzaW9uOwpAQCAtMjE5LDcgKzIyMCw3IEBACiAKICAgICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IGRlZmluZWQgYnkgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKi8KICAgICAvKiBidXQgdGhleSBhcmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgKi8KLSAgICAvKiBgaG10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAnaG10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgIHZvaWQqICAgICAgbG9uZ19tZXRyaWNzOwogICAgIHZvaWQqICAgICAgc2hvcnRfbWV0cmljczsKQEAgLTIyNyw5NyArMjI4LDkzIEBACiAgIH0gVFRfSG9yaUhlYWRlcjsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSB2ZXJ0aWNhbCBoZWFkZXIsIHRoZSBgdmhlYScgICAqLwotICAvKiAgICB0YWJsZSwgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNhbCBtZXRyaWNzIHRhYmxlLCAgICAgICAgKi8KLSAgLyogICAgYHZtdHgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgOjogVGhlIHRhYmxlIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBc2NlbmRlciAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlIHRvcC1tb3N0IG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBgT1MvMicgdGFibGUgaW5zdGVhZCBpZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NlbmRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLW1vc3Qgb2YgYWxsIGdseXBoIHBvaW50cyBmb3VuZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgSXQgaXMgbmVnYXRpdmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTQ0lJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcicgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBgT1MvMicgdGFibGUgaW5zdGVhZCBpZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3Ugd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZCBkZXNjZW5kZXIgdG8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IHRoZSBCVEIsIGkuZS4sIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lLXRvLWJhc2VsaW5lIGRpc3RhbmNlIGZvciB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2VfSGVpZ2h0X01heCAgICAgIDo6IFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlIGhlaWdodHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCBvZiBhbiBhcmJpdHJhcnkgc3RyaW5nIG9mIHRleHQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX1RvcF9TaWRlX0JlYXJpbmcgICAgOjogVGhlIG1pbmltdW0gdG9wIHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmcgOjogVGhlIG1pbmltdW0gYm90dG9tIHNpZGUgYmVhcmluZyBvZiBhbGwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU1heF9FeHRlbnQgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gdmVydGljYWwgZXh0ZW50IChpLmUuLCB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBoZWlnaHQnIG9mIGEgZ2x5cGgncyBib3VuZGluZyBib3gpIGZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgIDo6IFRoZSByaXNlIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZSBvZiB0aGUgY3Vyc29yIChzbG9wZT1yaXNlL3J1bikuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgIDo6IFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG9wZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X09mZnNldCAgICAgICAgICAgIDo6IFRoZSBjdXJzb3IncyBvZmZzZXQgZm9yIHNsYW50ZWQgZm9udHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bWJlcl9PZl9WTWV0cmljcyAgICAgIDo6IE51bWJlciBvZiBWTWV0cmljcyBlbnRyaWVzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdm10eCcgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICAgOjogQSBwb2ludGVyIGludG8gdGhlIGB2bXR4JyB0YWJsZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYEFzY2VuZGVyJywgICAgICAgICAqLwotICAvKiAgICBgRGVzY2VuZGVyJywgYExpbmVfR2FwJywgYGNhcmV0X1Nsb3BlX1Jpc2UnLCBgY2FyZXRfU2xvcGVfUnVuJywgICAgKi8KLSAgLyogICAgYW5kIGBjYXJldF9PZmZzZXQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9WZXJ0SGVhZGVyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgdmVydGljYWwgaGVhZGVyLCB0aGUgJ3ZoZWEnCisgICAqICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljYWwgbWV0cmljcyB0YWJsZSwgJ3ZtdHgnLgorICAgKgorICAgKiBAZmllbGRzOgorICAgKiAgIFZlcnNpb24gOjoKKyAgICogICAgIFRoZSB0YWJsZSB2ZXJzaW9uLgorICAgKgorICAgKiAgIEFzY2VuZGVyIDo6CisgICAqICAgICBUaGUgZm9udCdzIGFzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlCisgICAqICAgICB0b3AtbW9zdCBvZiBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LgorICAgKgorICAgKiAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZQorICAgKiAgICAgZm9udCBkZXNpZ25lciwgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBnbHlwaHMgZm91bmQKKyAgICogICAgIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuCisgICAqCisgICAqICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvQXNjZW5kZXJgIGZpZWxkIG9mIHRoZSAnT1MvMicgdGFibGUgaW5zdGVhZAorICAgKiAgICAgaWYgeW91IHdhbnQgdGhlIGNvcnJlY3Qgb25lLgorICAgKgorICAgKiAgIERlc2NlbmRlciA6OgorICAgKiAgICAgVGhlIGZvbnQncyBkZXNjZW5kZXIsIGkuZS4sIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUKKyAgICogICAgIGJvdHRvbS1tb3N0IG9mIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICBJdCBpcyBuZWdhdGl2ZS4KKyAgICoKKyAgICogICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUKKyAgICogICAgIGZvbnQgZGVzaWduZXIsIGFuZCBvZnRlbiByZWZsZWN0cyBvbmx5IGEgcG9ydGlvbiBvZiB0aGUgZ2x5cGhzIGZvdW5kCisgICAqICAgICBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLgorICAgKgorICAgKiAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0Rlc2NlbmRlcmAgZmllbGQgb2YgdGhlICdPUy8yJyB0YWJsZQorICAgKiAgICAgaW5zdGVhZCBpZiB5b3Ugd2FudCB0aGUgY29ycmVjdCBvbmUuCisgICAqCisgICAqICAgTGluZV9HYXAgOjoKKyAgICogICAgIFRoZSBmb250J3MgbGluZSBnYXAsIGkuZS4sIHRoZSBkaXN0YW5jZSB0byBhZGQgdG8gdGhlIGFzY2VuZGVyIGFuZAorICAgKiAgICAgZGVzY2VuZGVyIHRvIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UKKyAgICogICAgIGZvciB0aGUgZm9udC4KKyAgICoKKyAgICogICBhZHZhbmNlX0hlaWdodF9NYXggOjoKKyAgICogICAgIFRoaXMgZmllbGQgaXMgdGhlIG1heGltdW0gb2YgYWxsIGFkdmFuY2UgaGVpZ2h0cyBmb3VuZCBpbiB0aGUgZm9udC4KKyAgICogICAgIEl0IGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gaGVpZ2h0IG9mIGFuIGFyYml0cmFyeSBzdHJpbmcKKyAgICogICAgIG9mIHRleHQuCisgICAqCisgICAqICAgbWluX1RvcF9TaWRlX0JlYXJpbmcgOjoKKyAgICogICAgIFRoZSBtaW5pbXVtIHRvcCBzaWRlIGJlYXJpbmcgb2YgYWxsIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuCisgICAqCisgICAqICAgbWluX0JvdHRvbV9TaWRlX0JlYXJpbmcgOjoKKyAgICogICAgIFRoZSBtaW5pbXVtIGJvdHRvbSBzaWRlIGJlYXJpbmcgb2YgYWxsIGdseXBocyB3aXRoaW4gdGhlIGZvbnQuCisgICAqCisgICAqICAgeU1heF9FeHRlbnQgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIHZlcnRpY2FsIGV4dGVudCAoaS5lLiwgdGhlICdoZWlnaHQnIG9mIGEgZ2x5cGgncworICAgKiAgICAgYm91bmRpbmcgYm94KSBmb3IgYWxsIGdseXBocyBpbiB0aGUgZm9udC4KKyAgICoKKyAgICogICBjYXJldF9TbG9wZV9SaXNlIDo6CisgICAqICAgICBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3Mgc2xvcGUgb2YgdGhlIGN1cnNvcgorICAgKiAgICAgKHNsb3BlPXJpc2UvcnVuKS4KKyAgICoKKyAgICogICBjYXJldF9TbG9wZV9SdW4gOjoKKyAgICogICAgIFRoZSBydW4gY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzIHNsb3BlLgorICAgKgorICAgKiAgIGNhcmV0X09mZnNldCA6OgorICAgKiAgICAgVGhlIGN1cnNvcidzIG9mZnNldCBmb3Igc2xhbnRlZCBmb250cy4KKyAgICoKKyAgICogICBSZXNlcnZlZCA6OgorICAgKiAgICAgOH5yZXNlcnZlZCBieXRlcy4KKyAgICoKKyAgICogICBtZXRyaWNfRGF0YV9Gb3JtYXQgOjoKKyAgICogICAgIEFsd2F5c34wLgorICAgKgorICAgKiAgIG51bWJlcl9PZl9WTWV0cmljcyA6OgorICAgKiAgICAgTnVtYmVyIG9mIFZNZXRyaWNzIGVudHJpZXMgaW4gdGhlICd2bXR4JyB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZQorICAgKiAgICAgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmb250LgorICAgKgorICAgKiAgIGxvbmdfbWV0cmljcyA6OgorICAgKiAgICAgQSBwb2ludGVyIGludG8gdGhlICd2bXR4JyB0YWJsZS4KKyAgICoKKyAgICogICBzaG9ydF9tZXRyaWNzIDo6CisgICAqICAgICBBIHBvaW50ZXIgaW50byB0aGUgJ3ZtdHgnIHRhYmxlLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgY2FuCisgICAqICAgY2hhbmdlIGFmdGVyIGEgY2FsbCB0byBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgKGFuZCBmcmllbmRzKSBpZgorICAgKiAgIHRoZSBmb250IGNvbnRhaW5zIGFuICdNVkFSJyB0YWJsZTogYEFzY2VuZGVyYCwgYERlc2NlbmRlcmAsCisgICAqICAgYExpbmVfR2FwYCwgYGNhcmV0X1Nsb3BlX1Jpc2VgLCBgY2FyZXRfU2xvcGVfUnVuYCwgYW5kIGBjYXJldF9PZmZzZXRgLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1ZlcnRIZWFkZXJfCiAgIHsKICAgICBGVF9GaXhlZCAgIFZlcnNpb247CkBAIC0zNDEsNyArMzM4LDcgQEAKIAogICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAqLwogICAgIC8qIGJ1dCB0aGV5IGFyZSB1c2VkIHRvIGNvbm5lY3QgdGhlIG1ldHJpY3MgaGVhZGVyIHRvIHRoZSByZWxldmFudCAgICAqLwotICAgIC8qIGB2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICd2bXR4JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAgICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7CiAgICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOwpAQCAtMzQ5LDMzICszNDYsMzEgQEAKICAgfSBUVF9WZXJ0SGVhZGVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfT1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gbW9kZWwgYSBUcnVlVHlwZSBgT1MvMicgdGFibGUuICBBbGwgZmllbGRzIGNvbXBseSAgICovCi0gIC8qICAgIHRvIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgdGhhdCBkbyBub3QgaW5jbHVkZSBhbiAgICAgICovCi0gIC8qICAgIGBPUy8yJyB0YWJsZS4gIEluIHRoaXMgY2FzZSwgdGhlIGB2ZXJzaW9uJyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvICAqLwotICAvKiAgICAweEZGRkYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYHNDYXBIZWlnaHQnLCAgICAgICAqLwotICAvKiAgICBgc1R5cG9Bc2NlbmRlcicsIGBzVHlwb0Rlc2NlbmRlcicsIGBzVHlwb0xpbmVHYXAnLCBgc3hIZWlnaHQnLCAgICAgKi8KLSAgLyogICAgYHVzV2luQXNjZW50JywgYHVzV2luRGVzY2VudCcsIGB5U3RyaWtlb3V0UG9zaXRpb24nLCAgICAgICAgICAgICAgICovCi0gIC8qICAgIGB5U3RyaWtlb3V0U2l6ZScsIGB5U3Vic2NyaXB0WE9mZnNldCcsIGB5U3ViU2NyaXB0WFNpemUnLCAgICAgICAgICAqLwotICAvKiAgICBgeVN1YnNjcmlwdFlPZmZzZXQnLCBgeVN1YnNjcmlwdFlTaXplJywgYHlTdXBlcnNjcmlwdFhPZmZzZXQnLCAgICAgKi8KLSAgLyogICAgYHlTdXBlcnNjcmlwdFhTaXplJywgYHlTdXBlcnNjcmlwdFlPZmZzZXQnLCBhbmQgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGB5U3VwZXJzY3JpcHRZU2l6ZScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zc2libGUgdmFsdWVzIGZvciBiaXRzIGluIHRoZSBgdWxVbmljb2RlUmFuZ2VYJyBmaWVsZHMgYXJlIGdpdmVuICovCi0gIC8qICAgIGJ5IHRoZSBAVFRfVUNSX1hYWCBtYWNyb3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBzdHJ1Y3Q6CisgICAqICAgVFRfT1MyCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlICdPUy8yJyB0YWJsZS4gIEFsbCBmaWVsZHMgY29tcGx5IHRvCisgICAqICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uCisgICAqCisgICAqICAgTm90ZSB0aGF0IHdlIG5vdyBzdXBwb3J0IG9sZCBNYWMgZm9udHMgdGhhdCBkbyBub3QgaW5jbHVkZSBhbiAnT1MvMicKKyAgICogICB0YWJsZS4gIEluIHRoaXMgY2FzZSwgdGhlIGB2ZXJzaW9uYCBmaWVsZCBpcyBhbHdheXMgc2V0IHRvIDB4RkZGRi4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgRm9yIGFuIE9wZW5UeXBlIHZhcmlhdGlvbiBmb250LCB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIGNhbgorICAgKiAgIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgZnJpZW5kcykgaWYKKyAgICogICB0aGUgZm9udCBjb250YWlucyBhbiAnTVZBUicgdGFibGU6IGBzQ2FwSGVpZ2h0YCwgYHNUeXBvQXNjZW5kZXJgLAorICAgKiAgIGBzVHlwb0Rlc2NlbmRlcmAsIGBzVHlwb0xpbmVHYXBgLCBgc3hIZWlnaHRgLCBgdXNXaW5Bc2NlbnRgLAorICAgKiAgIGB1c1dpbkRlc2NlbnRgLCBgeVN0cmlrZW91dFBvc2l0aW9uYCwgYHlTdHJpa2VvdXRTaXplYCwKKyAgICogICBgeVN1YnNjcmlwdFhPZmZzZXRgLCBgeVN1YlNjcmlwdFhTaXplYCwgYHlTdWJzY3JpcHRZT2Zmc2V0YCwKKyAgICogICBgeVN1YnNjcmlwdFlTaXplYCwgYHlTdXBlcnNjcmlwdFhPZmZzZXRgLCBgeVN1cGVyc2NyaXB0WFNpemVgLAorICAgKiAgIGB5U3VwZXJzY3JpcHRZT2Zmc2V0YCwgYW5kIGB5U3VwZXJzY3JpcHRZU2l6ZWAuCisgICAqCisgICAqICAgUG9zc2libGUgdmFsdWVzIGZvciBiaXRzIGluIHRoZSBgdWxVbmljb2RlUmFuZ2VYYCBmaWVsZHMgYXJlIGdpdmVuIGJ5CisgICAqICAgdGhlIEBUVF9VQ1JfWFhYIG1hY3Jvcy4KKyAgICovCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX09TMl8KICAgewpAQCAtNDM1LDIzICs0MzAsMjMgQEAKICAgfSBUVF9PUzI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gIEFsbCBmaWVsZHMgY29tcGx5ICAgKi8KLSAgLyogICAgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICBUaGlzIHN0cnVjdHVyZSBkb2VzIG5vdCByZWZlcmVuY2UgICovCi0gIC8qICAgIGEgZm9udCdzIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXM7IHVzZSBARlRfR2V0X0dseXBoX05hbWUgdG8gICAgICAgICAqLwotICAvKiAgICByZXRyaWV2ZSB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgKi8KLSAgLyogICAgY2FuIGNoYW5nZSBhZnRlciBhIGNhbGwgdG8gQEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzIChhbmQgICAgICovCi0gIC8qICAgIGZyaWVuZHMpIGlmIHRoZSBmb250IGNvbnRhaW5zIGFuIGBNVkFSJyB0YWJsZTogYHVuZGVybGluZVBvc2l0aW9uJyAqLwotICAvKiAgICBhbmQgYHVuZGVybGluZVRoaWNrbmVzcycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAc3RydWN0OgorICAgKiAgIFRUX1Bvc3RzY3JpcHQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEEgc3RydWN0dXJlIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgJ3Bvc3QnIHRhYmxlLiAgQWxsIGZpZWxkcyBjb21wbHkgdG8KKyAgICogICB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4gIFRoaXMgc3RydWN0dXJlIGRvZXMgbm90IHJlZmVyZW5jZSBhCisgICAqICAgZm9udCdzIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXM7IHVzZSBARlRfR2V0X0dseXBoX05hbWUgdG8gcmV0cmlldmUKKyAgICogICB0aGVtLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBGb3IgYW4gT3BlblR5cGUgdmFyaWF0aW9uIGZvbnQsIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHMgY2FuCisgICAqICAgY2hhbmdlIGFmdGVyIGEgY2FsbCB0byBARlRfU2V0X1Zhcl9EZXNpZ25fQ29vcmRpbmF0ZXMgKGFuZCBmcmllbmRzKSBpZgorICAgKiAgIHRoZSBmb250IGNvbnRhaW5zIGFuICdNVkFSJyB0YWJsZTogYHVuZGVybGluZVBvc2l0aW9uYCBhbmQKKyAgICogICBgdW5kZXJsaW5lVGhpY2tuZXNzYC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0c2NyaXB0XwogICB7CiAgICAgRlRfRml4ZWQgIEZvcm1hdFR5cGU7CkBAIC00NjQsMjEgKzQ1OSwyMSBAQAogICAgIEZUX1VMb25nICBtaW5NZW1UeXBlMTsKICAgICBGVF9VTG9uZyAgbWF4TWVtVHlwZTE7CiAKLSAgICAvKiBHbHlwaCBuYW1lcyBmb2xsb3cgaW4gdGhlIGBwb3N0JyB0YWJsZSwgYnV0IHdlIGRvbid0ICovCisgICAgLyogR2x5cGggbmFtZXMgZm9sbG93IGluIHRoZSAncG9zdCcgdGFibGUsIGJ1dCB3ZSBkb24ndCAqLwogICAgIC8qIGxvYWQgdGhlbSBieSBkZWZhdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICB9IFRUX1Bvc3RzY3JpcHQ7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9QQ0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlIGBQQ0xUJyB0YWJsZS4gIEFsbCBmaWVsZHMgY29tcGx5ICAgKi8KLSAgLyogICAgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9QQ0xUCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBBIHN0cnVjdHVyZSB0byBtb2RlbCBhIFRydWVUeXBlICdQQ0xUJyB0YWJsZS4gIEFsbCBmaWVsZHMgY29tcGx5IHRvCisgICAqICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfUENMVF8KICAgewogICAgIEZUX0ZpeGVkICAgVmVyc2lvbjsKQEAgLTUwMCw3MCArNDk1LDc1IEBACiAgIH0gVFRfUENMVDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX01heFByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYXhpbXVtIHByb2ZpbGUgKGBtYXhwJykgdGFibGUgY29udGFpbnMgbWFueSBtYXggdmFsdWVzLCB3aGljaCAqLwotICAvKiAgICBjYW4gYmUgdXNlZCB0byBwcmUtYWxsb2NhdGUgYXJyYXlzIGZvciBzcGVlZGluZyB1cCBnbHlwaCBsb2FkaW5nICAgKi8KLSAgLyogICAgYW5kIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgIDo6IFRoZSB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1HbHlwaHMgICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyBUcnVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQb2ludHMgICAgICAgICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29tcG9zaXRlUG9pbnRzJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29udG91cnMgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYG1heENvbXBvc2l0ZUNvbnRvdXJzJy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbXBvc2l0ZVBvaW50cyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhQb2ludHMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb3NpdGVDb250b3VycyAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29udG91cnMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Wm9uZXMgICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiB6b25lcyB1c2VkIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4VHdpbGlnaHRQb2ludHMgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgaW4gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2lsaWdodCB6b25lIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U3RvcmFnZSAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlIGFyZWEgdXNlZCBmb3IgZ2x5cGggaGludGluZy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4RnVuY3Rpb25EZWZzICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmdW5jdGlvbiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heEluc3RydWN0aW9uRGVmcyAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhTdGFja0VsZW1lbnRzICAgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGVsZW1lbnRzIHVzZWQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIFRydWVUeXBlIG9wY29kZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb25lbnRFbGVtZW50cyAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXBsZSAoaS5lLiwgbm9uLSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSkgZ2x5cGhzIGluIGEgY29tcG9zaXRlIGdseXBoLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb25lbnREZXB0aCAgICAgOjogVGhlIG1heGltdW0gbmVzdGluZyBkZXB0aCBvZiBjb21wb3NpdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGR1cmluZyBmb250IGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQHN0cnVjdDoKKyAgICogICBUVF9NYXhQcm9maWxlCisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBUaGUgbWF4aW11bSBwcm9maWxlICgnbWF4cCcpIHRhYmxlIGNvbnRhaW5zIG1hbnkgbWF4IHZhbHVlcywgd2hpY2ggY2FuCisgICAqICAgYmUgdXNlZCB0byBwcmUtYWxsb2NhdGUgYXJyYXlzIGZvciBzcGVlZGluZyB1cCBnbHlwaCBsb2FkaW5nIGFuZAorICAgKiAgIGhpbnRpbmcuCisgICAqCisgICAqIEBmaWVsZHM6CisgICAqICAgdmVyc2lvbiA6OgorICAgKiAgICAgVGhlIHZlcnNpb24gbnVtYmVyLgorICAgKgorICAgKiAgIG51bUdseXBocyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyBUcnVlVHlwZSBmb250LgorICAgKgorICAgKiAgIG1heFBvaW50cyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUKKyAgICogICAgIGFsc28gYG1heENvbXBvc2l0ZVBvaW50c2AuCisgICAqCisgICAqICAgbWF4Q29udG91cnMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhIG5vbi1jb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguCisgICAqICAgICBTZWUgYWxzbyBgbWF4Q29tcG9zaXRlQ29udG91cnNgLgorICAgKgorICAgKiAgIG1heENvbXBvc2l0ZVBvaW50cyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZQorICAgKiAgICAgYWxzbyBgbWF4UG9pbnRzYC4KKyAgICoKKyAgICogICBtYXhDb21wb3NpdGVDb250b3VycyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGEgY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlCisgICAqICAgICBhbHNvIGBtYXhDb250b3Vyc2AuCisgICAqCisgICAqICAgbWF4Wm9uZXMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiB6b25lcyB1c2VkIGZvciBnbHlwaCBoaW50aW5nLgorICAgKgorICAgKiAgIG1heFR3aWxpZ2h0UG9pbnRzIDo6CisgICAqICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSB0d2lsaWdodCB6b25lIHVzZWQgZm9yIGdseXBoCisgICAqICAgICBoaW50aW5nLgorICAgKgorICAgKiAgIG1heFN0b3JhZ2UgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc3RvcmFnZSBhcmVhIHVzZWQgZm9yIGdseXBoCisgICAqICAgICBoaW50aW5nLgorICAgKgorICAgKiAgIG1heEZ1bmN0aW9uRGVmcyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZQorICAgKiAgICAgZm9yIHRoaXMgZm9udC4KKyAgICoKKyAgICogICBtYXhJbnN0cnVjdGlvbkRlZnMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbiBkZWZpbml0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUKKyAgICogICAgIGJ5dGVjb2RlIGZvciB0aGlzIGZvbnQuCisgICAqCisgICAqICAgbWF4U3RhY2tFbGVtZW50cyA6OgorICAgKiAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWNrIGVsZW1lbnRzIHVzZWQgZHVyaW5nIGJ5dGVjb2RlCisgICAqICAgICBpbnRlcnByZXRhdGlvbi4KKyAgICoKKyAgICogICBtYXhTaXplT2ZJbnN0cnVjdGlvbnMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBUcnVlVHlwZSBvcGNvZGVzIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuCisgICAqCisgICAqICAgbWF4Q29tcG9uZW50RWxlbWVudHMgOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW1wbGUgKGkuZS4sIG5vbi1jb21wb3NpdGUpIGdseXBocyBpbiBhCisgICAqICAgICBjb21wb3NpdGUgZ2x5cGguCisgICAqCisgICAqICAgbWF4Q29tcG9uZW50RGVwdGggOjoKKyAgICogICAgIFRoZSBtYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgY29tcG9zaXRlIGdseXBocy4KKyAgICoKKyAgICogQG5vdGU6CisgICAqICAgVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGR1cmluZyBmb250IGxvYWRpbmcuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfTWF4UHJvZmlsZV8KICAgewogICAgIEZUX0ZpeGVkICAgdmVyc2lvbjsKQEAgLTU4NSwzMSArNTg1LDM4IEBACiAgIH0gVFRfTWF4UHJvZmlsZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHRvIHNwZWNpZnkgaW5kaWNlcyBvZiBTRk5UIHRhYmxlcyBsb2FkZWQgYW5kIHBhcnNlZCAqLwotICAvKiAgICBieSBGcmVlVHlwZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgYW4gU0ZOVCBmb250LiAgVXNlZCBpbiB0aGUgICAgKi8KLSAgLyogICAgQEZUX0dldF9TZm50X1RhYmxlIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9IRUFEIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9IZWFkZXIgc3RydWN0dXJlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX01BWFAgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX01heFByb2ZpbGUgc3RydWN0dXJlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfT1MyICA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfT1MyIHN0cnVjdHVyZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9ISEVBIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9Ib3JpSGVhZGVyIHN0cnVjdHVyZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX1ZIRUEgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX1ZlcnRIZWFkZXIgc3RydWN0dXJlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfUE9TVCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUG9zdHNjcmlwdCBzdHJ1Y3R1cmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9QQ0xUIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9QQ0xUIHN0cnVjdHVyZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGVudW06CisgICAqICAgRlRfU2ZudF9UYWcKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIEFuIGVudW1lcmF0aW9uIHRvIHNwZWNpZnkgaW5kaWNlcyBvZiBTRk5UIHRhYmxlcyBsb2FkZWQgYW5kIHBhcnNlZCBieQorICAgKiAgIEZyZWVUeXBlIGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiBhbiBTRk5UIGZvbnQuICBVc2VkIGluIHRoZQorICAgKiAgIEBGVF9HZXRfU2ZudF9UYWJsZSBBUEkgZnVuY3Rpb24uCisgICAqCisgICAqIEB2YWx1ZXM6CisgICAqICAgRlRfU0ZOVF9IRUFEIDo6CisgICAqICAgICBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfSGVhZGVyIHN0cnVjdHVyZS4KKyAgICoKKyAgICogICBGVF9TRk5UX01BWFAgOjoKKyAgICogICAgIFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9NYXhQcm9maWxlIHN0cnVjdHVyZS4KKyAgICoKKyAgICogICBGVF9TRk5UX09TMiA6OgorICAgKiAgICAgVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX09TMiBzdHJ1Y3R1cmUuCisgICAqCisgICAqICAgRlRfU0ZOVF9ISEVBIDo6CisgICAqICAgICBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfSG9yaUhlYWRlciBzdHJ1Y3R1cmUuCisgICAqCisgICAqICAgRlRfU0ZOVF9WSEVBIDo6CisgICAqICAgICBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfVmVydEhlYWRlciBzdHJ1Y3R1cmUuCisgICAqCisgICAqICAgRlRfU0ZOVF9QT1NUIDo6CisgICAqICAgICBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUG9zdHNjcmlwdCBzdHJ1Y3R1cmUuCisgICAqCisgICAqICAgRlRfU0ZOVF9QQ0xUIDo6CisgICAqICAgICBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUENMVCBzdHJ1Y3R1cmUuCisgICAqLwogICB0eXBlZGVmIGVudW0gIEZUX1NmbnRfVGFnXwogICB7CiAgICAgRlRfU0ZOVF9IRUFELApAQCAtNjI0LDcgKzYzMSw3IEBACiAKICAgfSBGVF9TZm50X1RhZzsKIAotICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgY29ycmVzcG9uZGluZyBgRlRfU2ZudF9UYWcnICovCisgIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9TZm50X1RhZ2AgKi8KICAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBmdF9zZm50X2hlYWQgIEZUX1NGTlRfSEVBRAogI2RlZmluZSBmdF9zZm50X21heHAgIEZUX1NGTlRfTUFYUApAQCAtNjM1LDQ0ICs2NDIsNDYgQEAKICNkZWZpbmUgZnRfc2ZudF9wY2x0ICBGVF9TRk5UX1BDTFQKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBnaXZlbiBTRk5UIHRhYmxlIHN0b3JlZCB3aXRoaW4gYSBmYWNlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBUaGUgaW5kZXggb2YgdGhlIFNGTlQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlLWxlc3MgcG9pbnRlciB0byB0aGUgdGFibGUuICBUaGlzIHdpbGwgYmUgTlVMTCBpbiBjYXNlIG9mICAgICovCi0gIC8qICAgIGVycm9yLCBvciBpZiB0aGUgY29ycmVzcG9uZGluZyB0YWJsZSB3YXMgbm90IGZvdW5kICpPUiogbG9hZGVkICAgICAqLwotICAvKiAgICBmcm9tIHRoZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBhIHR5cGVjYXN0IGFjY29yZGluZyB0byBgdGFnJyB0byBhY2Nlc3MgdGhlIHN0cnVjdHVyZSAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdGFibGUgaXMgb3duZWQgYnkgdGhlIGZhY2Ugb2JqZWN0IGFuZCBkaXNhcHBlYXJzIHdpdGggaXQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgdG8gYWNjZXNzIFNGTlQgdGFibGVzIHRoYXQgYXJlIGxvYWRlZCAqLwotICAvKiAgICBieSB0aGUgc2ZudCwgdHJ1ZXR5cGUsIGFuZCBvcGVudHlwZSBkcml2ZXJzLiAgU2VlIEBGVF9TZm50X1RhZyBmb3IgKi8KLSAgLyogICAgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGFuIGV4YW1wbGUgaG93IHRvIGFjY2VzcyB0aGUgYHZoZWEnIHRhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRUX1ZlcnRIZWFkZXIqICB2ZXJ0X2hlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHZlcnRfaGVhZGVyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIChUVF9WZXJ0SGVhZGVyKilGVF9HZXRfU2ZudF9UYWJsZSggZmFjZSwgRlRfU0ZOVF9WSEVBICk7ICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBmdW5jdGlvbjoKKyAgICogICBGVF9HZXRfU2ZudF9UYWJsZQorICAgKgorICAgKiBAZGVzY3JpcHRpb246CisgICAqICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIGdpdmVuIFNGTlQgdGFibGUgc3RvcmVkIHdpdGhpbiBhIGZhY2UuCisgICAqCisgICAqIEBpbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlLgorICAgKgorICAgKiAgIHRhZyA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBTRk5UIHRhYmxlLgorICAgKgorICAgKiBAcmV0dXJuOgorICAgKiAgIEEgdHlwZS1sZXNzIHBvaW50ZXIgdG8gdGhlIHRhYmxlLiAgVGhpcyB3aWxsIGJlIGBOVUxMYCBpbiBjYXNlIG9mCisgICAqICAgZXJyb3IsIG9yIGlmIHRoZSBjb3JyZXNwb25kaW5nIHRhYmxlIHdhcyBub3QgZm91bmQgKipPUioqIGxvYWRlZCBmcm9tCisgICAqICAgdGhlIGZpbGUuCisgICAqCisgICAqICAgVXNlIGEgdHlwZWNhc3QgYWNjb3JkaW5nIHRvIGB0YWdgIHRvIGFjY2VzcyB0aGUgc3RydWN0dXJlIGVsZW1lbnRzLgorICAgKgorICAgKiBAbm90ZToKKyAgICogICBUaGUgdGFibGUgaXMgb3duZWQgYnkgdGhlIGZhY2Ugb2JqZWN0IGFuZCBkaXNhcHBlYXJzIHdpdGggaXQuCisgICAqCisgICAqICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWZ1bCB0byBhY2Nlc3MgU0ZOVCB0YWJsZXMgdGhhdCBhcmUgbG9hZGVkIGJ5CisgICAqICAgdGhlIHNmbnQsIHRydWV0eXBlLCBhbmQgb3BlbnR5cGUgZHJpdmVycy4gIFNlZSBARlRfU2ZudF9UYWcgZm9yIGEKKyAgICogICBsaXN0LgorICAgKgorICAgKiBAZXhhbXBsZToKKyAgICogICBIZXJlIGlzIGFuIGV4YW1wbGUgZGVtb25zdHJhdGluZyBhY2Nlc3MgdG8gdGhlICd2aGVhJyB0YWJsZS4KKyAgICoKKyAgICogICBgYGAKKyAgICogICAgIFRUX1ZlcnRIZWFkZXIqICB2ZXJ0X2hlYWRlcjsKKyAgICoKKyAgICoKKyAgICogICAgIHZlcnRfaGVhZGVyID0KKyAgICogICAgICAgKFRUX1ZlcnRIZWFkZXIqKUZUX0dldF9TZm50X1RhYmxlKCBmYWNlLCBGVF9TRk5UX1ZIRUEgKTsKKyAgICogICBgYGAKKyAgICovCiAgIEZUX0VYUE9SVCggdm9pZCogKQogICBGVF9HZXRfU2ZudF9UYWJsZSggRlRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICk7CkBAIC02OTEsOCArNzAwLDggQEAKICAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KICAgICoKICAgICogICB0YWcgOjoKLSAgICogICAgIFRoZSBmb3VyLWJ5dGUgdGFnIG9mIHRoZSB0YWJsZSB0byBsb2FkLiAgVXNlIHZhbHVlfjAgaWYgeW91IHdhbnQKLSAgICogICAgIHRvIGFjY2VzcyB0aGUgd2hvbGUgZm9udCBmaWxlLiAgT3RoZXJ3aXNlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCisgICAqICAgICBUaGUgZm91ci1ieXRlIHRhZyBvZiB0aGUgdGFibGUgdG8gbG9hZC4gIFVzZSB2YWx1ZX4wIGlmIHlvdSB3YW50IHRvCisgICAqICAgICBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZS4gIE90aGVyd2lzZSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZQogICAgKiAgICAgZGVmaW5pdGlvbnMgZm91bmQgaW4gdGhlIEBGVF9UUlVFVFlQRV9UQUdTX0ggZmlsZSwgb3IgZm9yZ2UgYSBuZXcKICAgICogICAgIG9uZSB3aXRoIEBGVF9NQUtFX1RBRy4KICAgICoKQEAgLTcwNiwxMCArNzE1LDEwIEBACiAgICAqCiAgICAqIEBpbm91dDoKICAgICogICBsZW5ndGggOjoKLSAgICogICAgIElmIHRoZSBgbGVuZ3RoJyBwYXJhbWV0ZXIgaXMgTlVMTCwgdHJ5IHRvIGxvYWQgdGhlIHdob2xlIHRhYmxlLgorICAgKiAgICAgSWYgdGhlIGBsZW5ndGhgIHBhcmFtZXRlciBpcyBgTlVMTGAsIHRyeSB0byBsb2FkIHRoZSB3aG9sZSB0YWJsZS4KICAgICogICAgIFJldHVybiBhbiBlcnJvciBjb2RlIGlmIGl0IGZhaWxzLgogICAgKgotICAgKiAgICAgRWxzZSwgaWYgYCpsZW5ndGgnIGlzfjAsIGV4aXQgaW1tZWRpYXRlbHkgd2hpbGUgcmV0dXJuaW5nIHRoZQorICAgKiAgICAgRWxzZSwgaWYgYCpsZW5ndGhgIGlzfjAsIGV4aXQgaW1tZWRpYXRlbHkgd2hpbGUgcmV0dXJuaW5nIHRoZQogICAgKiAgICAgdGFibGUncyAob3IgZmlsZSkgZnVsbCBzaXplIGluIGl0LgogICAgKgogICAgKiAgICAgRWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdGFibGUgb3IgZmlsZSwgZnJvbSB0aGUKQEAgLTcyMCwyMSArNzI5LDIxIEBACiAgICAqCiAgICAqIEBub3RlOgogICAgKiAgIElmIHlvdSBuZWVkIHRvIGRldGVybWluZSB0aGUgdGFibGUncyBsZW5ndGggeW91IHNob3VsZCBmaXJzdCBjYWxsIHRoaXMKLSAgICogICBmdW5jdGlvbiB3aXRoIGAqbGVuZ3RoJyBzZXQgdG9+MCwgYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgKiAgIGZ1bmN0aW9uIHdpdGggYCpsZW5ndGhgIHNldCB0b34wLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CiAgICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIEZUX1VMb25nICBsZW5ndGggPSAwOworICAgKiAgIGBgYAorICAgKiAgICAgRlRfVUxvbmcgIGxlbmd0aCA9IDA7CiAgICAqCiAgICAqCi0gICAqICAgICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIE5VTEwsICZsZW5ndGggKTsKLSAgICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIHRhYmxlIGRvZXMgbm90IGV4aXN0IC4uLiB9CisgICAqICAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCBOVUxMLCAmbGVuZ3RoICk7CisgICAqICAgICBpZiAoIGVycm9yICkgeyAuLi4gdGFibGUgZG9lcyBub3QgZXhpc3QgLi4uIH0KICAgICoKLSAgICogICAgICAgYnVmZmVyID0gbWFsbG9jKCBsZW5ndGggKTsKLSAgICogICAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsgLi4uIG5vdCBlbm91Z2ggbWVtb3J5IC4uLiB9CisgICAqICAgICBidWZmZXIgPSBtYWxsb2MoIGxlbmd0aCApOworICAgKiAgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsgLi4uIG5vdCBlbm91Z2ggbWVtb3J5IC4uLiB9CiAgICAqCi0gICAqICAgICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIGJ1ZmZlciwgJmxlbmd0aCApOwotICAgKiAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gY291bGQgbm90IGxvYWQgdGFibGUgLi4uIH0KLSAgICogICAgIH0KKyAgICogICAgIGVycm9yID0gRlRfTG9hZF9TZm50X1RhYmxlKCBmYWNlLCB0YWcsIDAsIGJ1ZmZlciwgJmxlbmd0aCApOworICAgKiAgICAgaWYgKCBlcnJvciApIHsgLi4uIGNvdWxkIG5vdCBsb2FkIHRhYmxlIC4uLiB9CisgICAqICAgYGBgCiAgICAqCiAgICAqICAgTm90ZSB0aGF0IHN0cnVjdHVyZXMgbGlrZSBAVFRfSGVhZGVyIG9yIEBUVF9PUzIgY2FuJ3QgYmUgdXNlZCB3aXRoCiAgICAqICAgdGhpcyBmdW5jdGlvbjsgdGhleSBhcmUgbGltaXRlZCB0byBARlRfR2V0X1NmbnRfVGFibGUuICBSZWFzb24gaXMgdGhhdApAQCAtNzY4LDE0ICs3NzcsMTQgQEAKICAgICoKICAgICogQGlub3V0OgogICAgKiAgIHRhZyA6OgotICAgKiAgICAgVGhlIG5hbWUgdGFnIG9mIHRoZSBTRk5UIHRhYmxlLiAgSWYgdGhlIHZhbHVlIGlzIE5VTEwsIGB0YWJsZV9pbmRleCcKLSAgICogICAgIGlzIGlnbm9yZWQsIGFuZCBgbGVuZ3RoJyByZXR1cm5zIHRoZSBudW1iZXIgb2YgU0ZOVCB0YWJsZXMgaW4gdGhlCi0gICAqICAgICBmb250LgorICAgKiAgICAgVGhlIG5hbWUgdGFnIG9mIHRoZSBTRk5UIHRhYmxlLiAgSWYgdGhlIHZhbHVlIGlzIGBOVUxMYCwKKyAgICogICAgIGB0YWJsZV9pbmRleGAgaXMgaWdub3JlZCwgYW5kIGBsZW5ndGhgIHJldHVybnMgdGhlIG51bWJlciBvZiBTRk5UCisgICAqICAgICB0YWJsZXMgaW4gdGhlIGZvbnQuCiAgICAqCiAgICAqIEBvdXRwdXQ6CiAgICAqICAgbGVuZ3RoIDo6Ci0gICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBTRk5UIHRhYmxlIChvciB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzLCBkZXBlbmRpbmcKLSAgICogICAgIG9uIGB0YWcnKS4KKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIFNGTlQgdGFibGUgKG9yIHRoZSBudW1iZXIgb2YgU0ZOVCB0YWJsZXMsCisgICAqICAgICBkZXBlbmRpbmcgb24gYHRhZ2ApLgogICAgKgogICAgKiBAcmV0dXJuOgogICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCkBAIC03OTIsNDYgKzgwMSw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAqbGVuZ3RoICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gY21hcCBsYW5ndWFnZSBJRCBhcyBzcGVjaWZpZWQgaW4gdGhlIE9wZW5UeXBlIHN0YW5kYXJkLiAgICAgKi8KLSAgLyogICAgRGVmaW5pdGlvbnMgb2YgbGFuZ3VhZ2UgSUQgdmFsdWVzIGFyZSBpbiBmaWxlIEBGVF9UUlVFVFlQRV9JRFNfSC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBsYW5ndWFnZSBJRCBvZiBgY2hhcm1hcCcuICBJZiBgY2hhcm1hcCcgZG9lc24ndCBiZWxvbmcgdG8gYW4gICAqLwotICAvKiAgICBTRk5UIGZhY2UsIGp1c3QgcmV0dXJufjAgYXMgdGhlIGRlZmF1bHQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBhIGZvcm1hdH4xNCBjbWFwICh0byBhY2Nlc3MgVW5pY29kZSBJVlMpLCB0aGUgcmV0dXJuIHZhbHVlIGlzICAqLwotICAvKiAgICAweEZGRkZGRkZGLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiBjbWFwIGxhbmd1YWdlIElEIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlblR5cGUgc3RhbmRhcmQuCisgICAqICAgRGVmaW5pdGlvbnMgb2YgbGFuZ3VhZ2UgSUQgdmFsdWVzIGFyZSBpbiBmaWxlIEBGVF9UUlVFVFlQRV9JRFNfSC4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGNoYXJtYXAgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgbGFuZ3VhZ2UgSUQgb2YgYGNoYXJtYXBgLiAgSWYgYGNoYXJtYXBgIGRvZXNuJ3QgYmVsb25nIHRvIGFuIFNGTlQKKyAgICogICBmYWNlLCBqdXN0IHJldHVybn4wIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgKgorICAgKiAgIEZvciBhIGZvcm1hdH4xNCBjbWFwICh0byBhY2Nlc3MgVW5pY29kZSBJVlMpLCB0aGUgcmV0dXJuIHZhbHVlIGlzCisgICAqICAgMHhGRkZGRkZGRi4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfVUxvbmcgKQogICBGVF9HZXRfQ01hcF9MYW5ndWFnZV9JRCggRlRfQ2hhck1hcCAgY2hhcm1hcCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBmb3JtYXQgb2YgYW4gU0ZOVCBgY21hcCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHRhcmdldCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb3JtYXQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGFuIFNGTlQgICAqLwotICAvKiAgICBmYWNlLCByZXR1cm4gLTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZnVuY3Rpb246CisgICAqICAgRlRfR2V0X0NNYXBfRm9ybWF0CisgICAqCisgICAqIEBkZXNjcmlwdGlvbjoKKyAgICogICBSZXR1cm4gdGhlIGZvcm1hdCBvZiBhbiBTRk5UICdjbWFwJyB0YWJsZS4KKyAgICoKKyAgICogQGlucHV0OgorICAgKiAgIGNoYXJtYXAgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4KKyAgICoKKyAgICogQHJldHVybjoKKyAgICogICBUaGUgZm9ybWF0IG9mIGBjaGFybWFwYC4gIElmIGBjaGFybWFwYCBkb2Vzbid0IGJlbG9uZyB0byBhbiBTRk5UIGZhY2UsCisgICAqICAgcmV0dXJuIC0xLgorICAgKi8KICAgRlRfRVhQT1JUKCBGVF9Mb25nICkKICAgRlRfR2V0X0NNYXBfRm9ybWF0KCBGVF9DaGFyTWFwICBjaGFybWFwICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmggYi9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCmluZGV4IGU1Y2VlNjguLjNjOWZiZDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmgKKysrIGIvaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaApAQCAtMSwyNyArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHR0YWdzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRhZ3MgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHR0YWdzLmgKKyAqCisgKiAgIFRhZ3MgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFRUQUdTX0hfCiAjZGVmaW5lIFRUQUdTX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogI2lmZGVmIEZSRUVUWVBFX0gKICNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCkBAIC00Niw2ICs0NSw4IEBACiAjZGVmaW5lIFRUQUdfQ0ZGMiAgRlRfTUFLRV9UQUcoICdDJywgJ0YnLCAnRicsICcyJyApCiAjZGVmaW5lIFRUQUdfQ0lEICAgRlRfTUFLRV9UQUcoICdDJywgJ0knLCAnRCcsICcgJyApCiAjZGVmaW5lIFRUQUdfY21hcCAgRlRfTUFLRV9UQUcoICdjJywgJ20nLCAnYScsICdwJyApCisjZGVmaW5lIFRUQUdfQ09MUiAgRlRfTUFLRV9UQUcoICdDJywgJ08nLCAnTCcsICdSJyApCisjZGVmaW5lIFRUQUdfQ1BBTCAgRlRfTUFLRV9UQUcoICdDJywgJ1AnLCAnQScsICdMJyApCiAjZGVmaW5lIFRUQUdfY3ZhciAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAnYScsICdyJyApCiAjZGVmaW5lIFRUQUdfY3Z0ICAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAndCcsICcgJyApCiAjZGVmaW5lIFRUQUdfRFNJRyAgRlRfTUFLRV9UQUcoICdEJywgJ1MnLCAnSScsICdHJyApCkBAIC0xMDUsNiArMTA2LDcgQEAKICNkZWZpbmUgVFRBR192bXR4ICBGVF9NQUtFX1RBRyggJ3YnLCAnbScsICd0JywgJ3gnICkKICNkZWZpbmUgVFRBR19WVkFSICBGVF9NQUtFX1RBRyggJ1YnLCAnVicsICdBJywgJ1InICkKICNkZWZpbmUgVFRBR193T0ZGICBGVF9NQUtFX1RBRyggJ3cnLCAnTycsICdGJywgJ0YnICkKKyNkZWZpbmUgVFRBR193T0YyICBGVF9NQUtFX1RBRyggJ3cnLCAnTycsICdGJywgJzInICkKIAogLyogdXNlZCBieSAiS2V5Ym9hcmQuZGZvbnQiIG9uIGxlZ2FjeSBNYWMgT1MgWCAqLwogI2RlZmluZSBUVEFHXzB4QTVrYmQgIEZUX01BS0VfVEFHKCAweEE1LCAnaycsICdiJywgJ2QnICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZnQyYnVpbGQuaCBiL2luY2x1ZGUvZnQyYnVpbGQuaAppbmRleCBlN2NlOTliLi5iNGZkMWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Z0MmJ1aWxkLmgKKysrIGIvaW5jbHVkZS9mdDJidWlsZC5oCkBAIC0xLDM0ICsxLDM0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdDJidWlsZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgMiBidWlsZCBhbmQgc2V0dXAgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdDJidWlsZC5oCisgKgorICogICBGcmVlVHlwZSAyIGJ1aWxkIGFuZCBzZXR1cCBtYWNyb3MuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyB0aGUgYGVudHJ5IHBvaW50JyBmb3IgRnJlZVR5cGUgaGVhZGVyIGZpbGUgaW5jbHVzaW9ucy4gIEl0IGlzICovCi0gIC8qIHRoZSBvbmx5IGhlYWRlciBmaWxlIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBkaXJlY3RseTsgYWxsIG90aGVyICAgICAqLwotICAvKiBGcmVlVHlwZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggbWFjcm8gbmFtZXMgKGFmdGVyICAgICAgKi8KLSAgLyogaW5jbHVkaW5nIGBmdDJidWlsZC5oJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHR5cGljYWwgZXhhbXBsZSBpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBpcyB0aGUgJ2VudHJ5IHBvaW50JyBmb3IgRnJlZVR5cGUgaGVhZGVyIGZpbGUgaW5jbHVzaW9ucywgdG8gYmUKKyAgICogbG9hZGVkIGJlZm9yZSBhbGwgb3RoZXIgaGVhZGVyIGZpbGVzLgorICAgKgorICAgKiBBIHR5cGljYWwgZXhhbXBsZSBpcworICAgKgorICAgKiBgYGAKKyAgICogICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KKyAgICogICAjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyAgICogYGBgCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlQyQlVJTERfSF8KZGlmZiAtLWdpdCBhL21lc29uLmJ1aWxkIGIvbWVzb24uYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL21lc29uLmJ1aWxkCkBAIC0wLDAgKzEsMzY4IEBACisjCisjIE1lc29uIHByb2plY3QgZmlsZSBmb3IgRnJlZVR5cGUgMgorIworCisjIENvcHlyaWdodCAoQykgMjAyMCBieQorIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCisjIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKKyMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKKyMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKKyMgZnVsbHkuCisKKworcHJvamVjdCgnZnJlZXR5cGUyJywgJ2MnLAorICBtZXNvbl92ZXJzaW9uOiAnPj0gMC41NS4wJywKKyAgZGVmYXVsdF9vcHRpb25zOiBbJ2RlZmF1bHRfbGlicmFyeT1ib3RoJ10sCispCisKKyMKKyMgUnVsZXMgdG8gY29tcGlsZSB0aGUgRnJlZVR5cGUgMiBsaWJyYXJ5IGl0c2VsZgorIworCisKKyMgQXBwYXJlbnRseSBtZXNvbiBkb2Vzbid0IHByb3ZpZGUgYSByZWFkX2ZpbGUoKSBmdW5jdGlvbiwgc28gaW5zdGVhZAorIyBydW5uaW5nIGFuIGV4dGVybmFsIGNvbW1hbmQgaXMgcmVxdWlyZWQuCisKK3B5dGhvbiA9IGltcG9ydCgncHl0aG9uJykKK3B5dGhvbl9leGUgPSBweXRob24uZmluZF9pbnN0YWxsYXRpb24ocmVxdWlyZWQ6IHRydWUpCisKK2Z0Ml92ZXJzaW9uID0gcnVuX2NvbW1hbmQocHl0aG9uX2V4ZSwKKyAgZmlsZXMoJ2J1aWxkcy9tZXNvbi9leHRyYWN0X2ZyZWV0eXBlX3ZlcnNpb24ucHknKSwKKyAgZmlsZXMoJ2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCcpKS5zdGRvdXQoKS5zdHJpcCgpCisKK2Z0Ml9saWJ0b29sX3ZlcnNpb24gPSBydW5fY29tbWFuZChweXRob25fZXhlLAorICBmaWxlcygnYnVpbGRzL21lc29uL2V4dHJhY3RfbGlidG9vbF92ZXJzaW9uLnB5JyksCisgICctLXNvdmVyc2lvbicsCisgIGZpbGVzKCdidWlsZHMvdW5peC9jb25maWd1cmUucmF3JykpLnN0ZG91dCgpLnN0cmlwKCkKKworZnQyX2luY2x1ZGVzID0gaW5jbHVkZV9kaXJlY3RvcmllcygnaW5jbHVkZScpCisKKworIyBHZW5lcmF0ZSBhIGN1c3RvbSBgZnRtb2R1bGUuaGAgdmVyc2lvbiBiYXNlZCBvbiB0aGUgY29udGVudCBvZgorIyBgbW9kdWxlcy5jZmdgLgorCitmdG1vZHVsZV9oID0gY3VzdG9tX3RhcmdldCgnZnRtb2R1bGUuaCcsCisgIG91dHB1dDogJ2Z0bW9kdWxlLmgnLAorICBpbnB1dDogJ21vZHVsZXMuY2ZnJywKKyAgY29tbWFuZDogW3B5dGhvbl9leGUsIGZpbGVzKCdidWlsZHMvbWVzb24vcGFyc2VfbW9kdWxlc19jZmcucHknKSwKKyAgICAgICAgICAgICctLWZvcm1hdD1mdG1vZHVsZS5oJywgJ0BJTlBVVEAnLCAnLS1vdXRwdXQnLCAnQE9VVFBVVEAnXSwKKyAgaW5zdGFsbDogdHJ1ZSwKKyAgaW5zdGFsbF9kaXI6ICdpbmNsdWRlL2ZyZWV0eXBlMi9mcmVldHlwZS9jb25maWcnLAorKQorZnQyX3NvdXJjZXMgPSBbZnRtb2R1bGVfaF0KKworCisjIEZyZWVUeXBlIDIgbW9kdWxlcy4KKworZnRfbWFpbl9tb2R1bGVzID0gcnVuX2NvbW1hbmQocHl0aG9uX2V4ZSwKKyAgZmlsZXMoJ2J1aWxkcy9tZXNvbi9wYXJzZV9tb2R1bGVzX2NmZy5weScpLAorICAnLS1mb3JtYXQ9bWFpbi1tb2R1bGVzJywKKyAgZmlsZXMoJ21vZHVsZXMuY2ZnJykpLnN0ZG91dCgpLnN0cmlwKCkuc3BsaXQoKQorCitmdDJfc291cmNlcyArPSBmaWxlcyhbCisgICdzcmMvYmFzZS9mdGJhc2UuYycsCisgICdzcmMvYmFzZS9mdGluaXQuYycsCitdKQorCitmb3JlYWNoIG1vZDogZnRfbWFpbl9tb2R1bGVzCisgIHNvdXJjZSA9IG1vZAorICBpZiBtb2QgPT0gJ3dpbmZvbnRzJworICAgIHNvdXJjZSA9ICd3aW5mbnQnCisgIGVsaWYgbW9kID09ICdjaWQnCisgICAgc291cmNlID0gJ3R5cGUxY2lkJworICBlbmRpZgorICBmdDJfc291cmNlcyArPSAnc3JjL0AwQC9AMUAuYycuZm9ybWF0KG1vZCwgc291cmNlKQorZW5kZm9yZWFjaAorCisjIE5PVEU6IFRoZSBgZ3ppcGAgYW5kIGBiemlwMmAgYXV4IG1vZHVsZXMgYXJlIGhhbmRsZWQgdGhyb3VnaCBvcHRpb25zLgorZnRfYXV4X21vZHVsZXMgPSBydW5fY29tbWFuZChweXRob25fZXhlLAorICBmaWxlcygnYnVpbGRzL21lc29uL3BhcnNlX21vZHVsZXNfY2ZnLnB5JyksCisgICctLWZvcm1hdD1hdXgtbW9kdWxlcycsCisgIGZpbGVzKCdtb2R1bGVzLmNmZycpKS5zdGRvdXQoKS5zdHJpcCgpLnNwbGl0KCkKKworZm9yZWFjaCBhdXhtb2Q6IGZ0X2F1eF9tb2R1bGVzCisgIHNvdXJjZSA9IGF1eG1vZAorICAjIE1vc3Qgc291cmNlcyBhcmUgbmFtZWQgYHNyYy88bW9kdWxlPi88bW9kdWxlPi5jYCwgYnV0IHRoZXJlIGFyZSBhIGZldworICAjIGV4Y2VwdGlvbnMgaGFuZGxlZCBoZXJlLgorICBpZiBhdXhtb2QgPT0gJ2NhY2hlJworICAgIHNvdXJjZSA9ICdmdGNhY2hlJworICBlbGlmIGF1eG1vZCA9PSAnbHp3JworICAgIHNvdXJjZSA9ICdmdGx6dycKKyAgZWxpZiBhdXhtb2QgPT0gJ2d6aXAnIG9yIGF1eG1vZCA9PSAnYnppcDInCisgICAgIyBIYW5kbGVkIHRocm91Z2ggb3B0aW9ucyBpbnN0ZWFkLCBzZWUgYmVsb3cuCisgICAgY29udGludWUKKyAgZW5kaWYKKyAgZnQyX3NvdXJjZXMgKz0gJ3NyYy9AMEAvQDFALmMnLmZvcm1hdChhdXhtb2QsIHNvdXJjZSkKK2VuZGZvcmVhY2gKKworCisjIEZyZWVUeXBlIDIgYmFzZSBleHRlbnNpb25zLgorIyBOb3JtYWxseSBjb25maWd1cmVkIHRocm91Z2ggYG1vZHVsZXMuY2ZnYC4KKworYmFzZV9leHRlbnNpb25zID0gcnVuX2NvbW1hbmQocHl0aG9uX2V4ZSwKKyAgZmlsZXMoJ2J1aWxkcy9tZXNvbi9wYXJzZV9tb2R1bGVzX2NmZy5weScpLAorICAnLS1mb3JtYXQ9YmFzZS1leHRlbnNpb25zLWxpc3QnLAorICBmaWxlcygnbW9kdWxlcy5jZmcnKSkuc3Rkb3V0KCkuc3BsaXQoKQorCitmb3JlYWNoIGV4dDogYmFzZV9leHRlbnNpb25zCisgIGZ0Ml9zb3VyY2VzICs9IGZpbGVzKCdzcmMvYmFzZS8nICsgZXh0KQorZW5kZm9yZWFjaAorCisKKyMgSGVhZGVyIGZpbGVzLgorCitmdDJfcHVibGljX2hlYWRlcnMgPSBmaWxlcyhbCisgICdpbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdGFkdmFuYy5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRiYm94LmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcHRlcnMuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Y29sb3IuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0ZHJpdmVyLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdGVycmRlZi5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Zm50Zm10LmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3LmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdHBhcmFtcy5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdHNuYW1lcy5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0c3ludGguaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9mdHRyaWdvbi5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvZnR3aW5mbnQuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oJywKK10pCisKK2Z0Ml9jb25maWdfaGVhZGVycyA9IGZpbGVzKFsKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgnLAorICAnaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2ludGVnZXItdHlwZXMuaCcsCisgICdpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9tYWMtc3VwcG9ydC5oJywKKyAgJ2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL3B1YmxpYy1tYWNyb3MuaCcsCitdKQorCitmdDJfZGVmaW5lcyA9IFtdCisKKworIyBTeXN0ZW0gc3VwcG9ydCBmaWxlLgorCitjYyA9IG1lc29uLmdldF9jb21waWxlcignYycpCisKKyMgTk9URTogbXN5czIgb24gV2luZG93cyBoYXMgYHVuaXN0ZC5oYCBhbmQgYGZjbnRsLmhgIGJ1dCBub3QgYHN5cy9tbWFuLmhgIQoraGFzX3VuaXN0ZF9oID0gY2MuaGFzX2hlYWRlcigndW5pc3RkLmgnKQoraGFzX2ZjbnRsX2ggPSBjYy5oYXNfaGVhZGVyKCdmY250bC5oJykKK2hhc19zeXNfbW1hbl9oID0gY2MuaGFzX2hlYWRlcignc3lzL21tYW4uaCcpCisKK2lmIGhhc191bmlzdGRfaAorICBmdDJfZGVmaW5lcyArPSBbJy1ESEFWRV9VTklTVERfSD0xJ10KK2VuZGlmCitpZiBoYXNfZmNudGxfaAorICBmdDJfZGVmaW5lcyArPSBbJy1ESEFWRV9GQ05UTF9IJ10KK2VuZGlmCisKK21tYXBfb3B0aW9uID0gZ2V0X29wdGlvbignbW1hcCcpCitpZiBtbWFwX29wdGlvbi5hdXRvKCkKKyAgdXNlX21tYXAgPSBoYXNfdW5pc3RkX2ggYW5kIGhhc19mY250bF9oIGFuZCBoYXNfc3lzX21tYW5faAorZWxzZQorICB1c2VfbW1hcCA9IG1tYXBfb3B0aW9uLmVuYWJsZWQoKQorZW5kaWYKK2lmIHVzZV9tbWFwCisgICMgVGhpcyB2ZXJzaW9uIG9mIGZ0c3lzdGVtLmMgdXNlcyBtbWFwKCkgdG8gcmVhZCBpbnB1dCBmb250IGZpbGVzLgorICBmdDJfc291cmNlcyArPSBmaWxlcyhbJ2J1aWxkcy91bml4L2Z0c3lzdGVtLmMnLF0pCitlbHNlCisgIGZ0Ml9zb3VyY2VzICs9IGZpbGVzKFsnc3JjL2Jhc2UvZnRzeXN0ZW0uYycsXSkKK2VuZGlmCisKKworIyBEZWJ1ZyBzdXBwb3J0IGZpbGUKKyMKKyMgTk9URTogU29tZSBzcGVjaWFsaXplZCB2ZXJzaW9ucyBleGlzdCBmb3Igb3RoZXIgcGxhdGZvcm1zIG5vdCBzdXBwb3J0ZWQgYnkKKyMgTWVzb24uICBNb3N0IGltcGxlbWVudGF0aW9uIGRpZmZlcmVuY2VzIGFyZSBleHRyZW1lbHkgbWlub3IsIGkuZS4sIGluIHRoZQorIyBpbXBsZW1lbnRhdGlvbiBvZiBGVF9NZXNzYWdlKCkgYW5kIEZUX1BhbmljKCksIGFuZCBnZXR0aW5nIHRoZSBgRlQyX0RFQlVHYAorIyB2YWx1ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCwgd2hlbiB0aGlzIGlzIHN1cHBvcnRlZC4gIEEgc21hbGxlciByZWZhY3RvcgorIyBtaWdodCBtYWtlIHRoZXNlIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIG11Y2ggc21hbGxlciwgYW5kIGNvdWxkIGJlIG1vdmVkCisjIGludG8gYGZ0c3lzdGVtLmNgIGFzIHdlbGwuCisjCitpZiBob3N0X21hY2hpbmUuc3lzdGVtKCkgPT0gJ3dpbmRvd3MnCisgIGZ0Ml9kZWJ1Z19zcmMgPSAnYnVpbGRzL3dpbmRvd3MvZnRkZWJ1Zy5jJworZWxzZQorICBmdDJfZGVidWdfc3JjID0gJ3NyYy9iYXNlL2Z0ZGVidWcuYycKK2VuZGlmCitmdDJfc291cmNlcyArPSBmaWxlcyhbZnQyX2RlYnVnX3NyY10pCisKK2Z0Ml9kZXBzID0gW10KKworCisjIEdlbmVyYXRlIGBmdG9wdGlvbi5oYCBiYXNlZCBvbiBhdmFpbGFibGUgZGVwZW5kZW5jaWVzLgorCitmdG9wdGlvbl9jb21tYW5kID0gW3B5dGhvbl9leGUsCisgIGZpbGVzKCdidWlsZHMvbWVzb24vcHJvY2Vzc19mdG9wdGlvbl9oLnB5JyksCisgICdASU5QVVRAJywgJy0tb3V0cHV0PUBPVVRQVVRAJ10KKworIyBHWmlwIHN1cHBvcnQKK3psaWJfb3B0aW9uID0gZ2V0X29wdGlvbignemxpYicpCitpZiB6bGliX29wdGlvbiA9PSAnZGlzYWJsZWQnCisgIGZ0b3B0aW9uX2NvbW1hbmQgKz0gWyctLWRpc2FibGU9RlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiddCitlbHNlCisgIGZ0b3B0aW9uX2NvbW1hbmQgKz0gWyctLWVuYWJsZT1GVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCJ10KKyAgaWYgemxpYl9vcHRpb24gPT0gJ2J1aWx0aW4nCisgICAgZnRvcHRpb25fY29tbWFuZCArPSBbJy0tZGlzYWJsZT1GVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCJ10KKyAgZWxzZQorICAgICMgUHJvYmUgZm9yIHRoZSBzeXN0ZW0gdmVyc2lvbi4KKyAgICB6bGliX3N5c3RlbSA9IGRlcGVuZGVuY3koJ3psaWInLCByZXF1aXJlZDogemxpYl9vcHRpb24gPT0gJ3N5c3RlbScpCisgICAgZnQyX2RlcHMgKz0gW3psaWJfc3lzdGVtXQorICAgIGZ0b3B0aW9uX2NvbW1hbmQgKz0gWyctLWVuYWJsZT1GVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCJ10KKyAgZW5kaWYKKyAgZnQyX3NvdXJjZXMgKz0gZmlsZXMoWydzcmMvZ3ppcC9mdGd6aXAuYycsXSkKK2VuZGlmCisKKyMgQlppcDIgc3VwcG9ydAorIworIyBJTVBPUlRBTlQgTk9URTogV2l0aG91dCBgc3RhdGljOiBmYWxzZWAgaGVyZSwgTWVzb24gd2lsbCBmaW5kIGJvdGggdGhlCisjIHN0YXRpYyBsaWJyYXJ5IHZlcnNpb24gYW5kIHRoZSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIHdoZW4gdGhleSBhcmUKKyMgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0sIGFuZCB3aWxsIHRyeSB0byBsaW5rIHRoZW0gKmJvdGgqIHRvIHRoZSBmaW5hbAorIyBsaWJyYXJ5IQorYnppcDJfZGVwID0gbWVzb24uZ2V0X2NvbXBpbGVyKCdjJykuZmluZF9saWJyYXJ5KCdiejInLAorICAgICAgICAgICAgICBzdGF0aWM6IGZhbHNlLAorICAgICAgICAgICAgICByZXF1aXJlZDogZ2V0X29wdGlvbignYnppcDInKSkKK2lmIGJ6aXAyX2RlcC5mb3VuZCgpCisgIGZ0b3B0aW9uX2NvbW1hbmQgKz0gWyctLWVuYWJsZT1GVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiddCisgIGZ0Ml9zb3VyY2VzICs9IGZpbGVzKFsnc3JjL2J6aXAyL2Z0YnppcDIuYycsXSkKKyAgZnQyX2RlcHMgKz0gW2J6aXAyX2RlcF0KK2VuZGlmCisKKyMgUE5HIHN1cHBvcnQKK2xpYnBuZ19kZXAgPSBkZXBlbmRlbmN5KCdsaWJwbmcnLCByZXF1aXJlZDogZ2V0X29wdGlvbigncG5nJykpCitmdG9wdGlvbl9jb21tYW5kICs9IFsnLS1lbmFibGU9RlRfQ09ORklHX09QVElPTl9VU0VfUE5HJ10KK2Z0Ml9kZXBzICs9IFtsaWJwbmdfZGVwXQorCisjIEhhcmZidXp6IHN1cHBvcnQKK2hhcmZidXp6X2RlcCA9IGRlcGVuZGVuY3koJ2hhcmZidXp6JywKKyAgICAgICAgICAgICAgICAgdmVyc2lvbjogJz49IDEuOC4wJywKKyAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGdldF9vcHRpb24oJ2hhcmZidXp6JykpCitmdG9wdGlvbl9jb21tYW5kICs9IFsnLS1lbmFibGU9RlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlonXQorZnQyX2RlcHMgKz0gW2hhcmZidXp6X2RlcF0KKworIyBCcm90bGkgZGVjb21wcmVzc2lvbiBzdXBwb3J0Citicm90bGlfZGVwID0gZGVwZW5kZW5jeSgnbGliYnJvdGxpZGVjJywgcmVxdWlyZWQ6IGdldF9vcHRpb24oJ2Jyb3RsaScpKQorZnRvcHRpb25fY29tbWFuZCArPSBbJy0tZW5hYmxlPUZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSSddCitmdDJfZGVwcyArPSBbYnJvdGxpX2RlcF0KKworIyBXZSBjYW4gbm93IGdlbmVyYXRlIGBmdG9wdGlvbi5oYC4KK2Z0b3B0aW9uX2ggPSBjdXN0b21fdGFyZ2V0KCdmdG9wdGlvbi5oJywKKyAgaW5wdXQ6ICdpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oJywKKyAgb3V0cHV0OiAnZnRvcHRpb24uaCcsCisgIGNvbW1hbmQ6IGZ0b3B0aW9uX2NvbW1hbmQsCisgIGluc3RhbGw6IHRydWUsCisgIGluc3RhbGxfZGlyOiAnaW5jbHVkZS9mcmVldHlwZTIvZnJlZXR5cGUvY29uZmlnJywKKykKK2Z0Ml9zb3VyY2VzICs9IGZ0b3B0aW9uX2gKKworCisjIFFVRVNUSU9OOiBXaGF0IGlmIHRoZSBjb21waWxlciBkb2Vzbid0IHN1cHBvcnQgYC1EYCBidXQgdXNlcyBgL0RgIGluc3RlYWQKKyMgYXMgb24gV2luZG93cz8KKyMKKyMgT3RoZXIgYnVpbGQgc3lzdGVtcyBoYXZlIHNvbWV0aGluZyBsaWtlIGNfZGVmaW5lcyB0byBsaXN0IGRlZmluZXMgaW4gYQorIyBtb3JlIHBvcnRhYmxlIHdheS4gIEZvciBub3cgYXNzdW1lIHRoZSBjb21waWxlciBzdXBwb3J0cyBgLURgIChoaW50OiBWaXN1YWwKKyMgU3R1ZGlvIGRvZXMpLgorZnQyX2RlZmluZXMgKz0gWyctREZUMl9CVUlMRF9MSUJSQVJZPTEnXQorCisKKyMgRW5zdXJlIHRoYXQgdGhlIGBmdG9wdGlvbi5oYCBmaWxlIGdlbmVyYXRlZCBhYm92ZSB3aWxsIGJlIHVzZWQgdG8gYnVpbGQKKyMgRnJlZVR5cGUuICBVbmZvcnR1bmF0ZWx5LCBhbmQgdmVyeSBzdXJwcmlzaW5nbHksIGNvbmZpZ3VyZV9maWxlKCkgZG9lcyBub3QKKyMgc3VwcG9ydCBwdXR0aW5nIHRoZSBvdXRwdXQgZmlsZSBpbiBhIHN1Yi1kaXJlY3RvcnksIHNvIHdlIGhhdmUgdG8gb3ZlcnJpZGUKKyMgdGhlIGRlZmF1bHQgd2hpY2ggaXMgYDxmcmVldHlwZS9jb25maWcvZnRvcHRpb24uaD5gLgorIworIyBJdCB3b3VsZCBiZSBjbGVhbmVyIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGRpcmVjdGx5IGludG8KKyMgYCR7TUVTT05fQlVJTERfRElSfS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaGAuICBTZWUKKyMgJ2h0dHBzOi8vZ2l0aHViLmNvbS9tZXNvbmJ1aWxkL21lc29uL2lzc3Vlcy8yMzIwJyBmb3IgZGV0YWlscy4KK2Z0Ml9kZWZpbmVzICs9IFsnLURGVF9DT05GSUdfT1BUSU9OU19IPTxmdG9wdGlvbi5oPiddCisKK2Z0Ml9jX2FyZ3MgPSBmdDJfZGVmaW5lcworaWYgY2MuaGFzX2Z1bmN0aW9uX2F0dHJpYnV0ZSgndmlzaWJpbGl0eTpoaWRkZW4nKQorICBmdDJfY19hcmdzICs9IFsnLWZ2aXNpYmlsaXR5PWhpZGRlbiddCitlbmRpZgorCitmdDJfbGliID0gbGlicmFyeSgnZnJlZXR5cGUnLAorICBzb3VyY2VzOiBmdDJfc291cmNlcyArIFtmdG1vZHVsZV9oXSwKKyAgY19hcmdzOiBmdDJfY19hcmdzLAorICBpbmNsdWRlX2RpcmVjdG9yaWVzOiBmdDJfaW5jbHVkZXMsCisgIGRlcGVuZGVuY2llczogZnQyX2RlcHMsCisgIGluc3RhbGw6IHRydWUsCisgIHZlcnNpb246IGZ0Ml9saWJ0b29sX3ZlcnNpb24sCispCisKKworIyBUbyBiZSB1c2VkIGJ5IG90aGVyIHByb2plY3RzIGluY2x1ZGluZyB0aGlzIG9uZSB0aHJvdWdoIHN1YnByb2plY3QoKS4KK2ZyZWV0eXBlMl9kZXAgPSBkZWNsYXJlX2RlcGVuZGVuY3koCisgIGluY2x1ZGVfZGlyZWN0b3JpZXM6IGZ0Ml9pbmNsdWRlcywKKyAgbGlua193aXRoOiBmdDJfbGliLAorICB2ZXJzaW9uOiBmdDJfbGlidG9vbF92ZXJzaW9uKQorCisKKyMgTk9URTogVXNpbmcgYm90aCBgaW5zdGFsbF9kaXJgIGFuZCBgc3ViZGlyYCBkb2Vzbid0IHNlZW0gdG8gd29yayBiZWxvdywKKyMgaS5lLiwgdGhlIHN1YmRpciB2YWx1ZSBzZWVtcyB0byBiZSBpZ25vcmVkLCBjb250cmFyeSB0byBleGFtcGxlcyBpbiB0aGUKKyMgTWVzb24gZG9jdW1lbnRhdGlvbi4KK2luc3RhbGxfaGVhZGVycygnaW5jbHVkZS9mdDJidWlsZC5oJywKKyAgIGluc3RhbGxfZGlyOiAnaW5jbHVkZS9mcmVldHlwZTInKQoraW5zdGFsbF9oZWFkZXJzKGZ0Ml9wdWJsaWNfaGVhZGVycywKKyAgaW5zdGFsbF9kaXI6ICdpbmNsdWRlL2ZyZWV0eXBlMi9mcmVldHlwZScpCitpbnN0YWxsX2hlYWRlcnMoZnQyX2NvbmZpZ19oZWFkZXJzLAorICBpbnN0YWxsX2RpcjogJ2luY2x1ZGUvZnJlZXR5cGUyL2ZyZWV0eXBlL2NvbmZpZycpCisKKworIyBUT0RPKGRhdmlkKTogRGVjbGFyZV9kZXBlbmRlbmN5KCkgZm9yIHVzaW5nIHRoaXMgaW4gYSBNZXNvbiBzdWJwcm9qZWN0CisjCitwa2djb25maWcgPSBpbXBvcnQoJ3BrZ2NvbmZpZycpCitwa2djb25maWcuZ2VuZXJhdGUoZnQyX2xpYiwKKyAgZmlsZWJhc2U6ICdmcmVldHlwZTInLAorICBuYW1lOiAnRnJlZVR5cGUgMicsCisgIGRlc2NyaXB0aW9uOiAnQSBmcmVlLCBoaWdoLXF1YWxpdHksIGFuZCBwb3J0YWJsZSBmb250IGVuZ2luZS4nLAorICB1cmw6ICdodHRwczovL2ZyZWV0eXBlLm9yZycsCisgIHN1YmRpcnM6ICdmcmVldHlwZTInLAorICB2ZXJzaW9uOiBmdDJfbGlidG9vbF92ZXJzaW9uLAorKQorCisKKyMgTk9URTogVW5saWtlIHRoZSBvbGQgYG1ha2UgcmVmZG9jYCBjb21tYW5kLCB0aGlzIGdlbmVyYXRlcyB0aGUKKyMgZG9jdW1lbnRhdGlvbiB1bmRlciBgJEJVSUxEL2RvY3MvYCBzaW5jZSBNZXNvbiBkb2Vzbid0IHN1cHBvcnQgbW9kaWZ5aW5nCisjIHRoZSBzb3VyY2Ugcm9vdCBkaXJlY3RvcnkgKHdoaWNoIGlzIGEgZ29vZCB0aGluZykuCitnZW5fZG9jcyA9IGN1c3RvbV90YXJnZXQoJ2ZyZWV0eXBlMiByZWZlcmVuY2UgZG9jdW1lbnRhdGlvbicsCisgIG91dHB1dDogJ2RvY3MnLAorICBpbnB1dDogZnQyX3B1YmxpY19oZWFkZXJzICsgZnQyX2NvbmZpZ19oZWFkZXJzLAorICBjb21tYW5kOiBbcHl0aG9uX2V4ZSwKKyAgICBmaWxlcygnYnVpbGRzL21lc29uL2dlbmVyYXRlX3JlZmVyZW5jZV9kb2NzLnB5JyksCisgICAgJy0tdmVyc2lvbj0nICsgZnQyX3ZlcnNpb24sCisgICAgJy0taW5wdXQtZGlyPScgKyBtZXNvbi5zb3VyY2Vfcm9vdCgpLAorICAgICctLW91dHB1dC1kaXI9QE9VVFBVVEAnCisgIF0sCispCisKKyMgRU9GCmRpZmYgLS1naXQgYS9tZXNvbl9vcHRpb25zLnR4dCBiL21lc29uX29wdGlvbnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWQxNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZXNvbl9vcHRpb25zLnR4dApAQCAtMCwwICsxLDQ3IEBACisjCisjIG1lc29uX29wdGlvbnMudHh0CisjCisKKyMgQ29weXJpZ2h0IChDKSAyMDIwIGJ5CisjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKKyMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAorIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQorIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAorIyBmdWxseS4KKworCitvcHRpb24oJ3psaWInLAorICB0eXBlOiAnY29tYm8nLAorICBjaG9pY2VzOiBbJ2Rpc2FibGVkJywgJ2F1dG8nLCAnYnVpbHRpbicsICdzeXN0ZW0nXSwKKyAgdmFsdWU6ICdhdXRvJywKKyAgZGVzY3JpcHRpb246ICdTdXBwb3J0IHJlYWRpbmcgZ3ppcC1jb21wcmVzc2VkIGZvbnQgZmlsZXMuJykKKworb3B0aW9uKCdiemlwMicsCisgIHR5cGU6ICdmZWF0dXJlJywKKyAgdmFsdWU6ICdhdXRvJywKKyAgZGVzY3JpcHRpb246ICdTdXBwb3J0IHJlYWRpbmcgYnppcDItY29tcHJlc3NlZCBmb250IGZpbGVzLicpCisKK29wdGlvbigncG5nJywKKyAgdHlwZTogJ2ZlYXR1cmUnLAorICB2YWx1ZTogJ2F1dG8nLAorICBkZXNjcmlwdGlvbjogJ1N1cHBvcnQgY29sb3IgYml0bWFwIGdseXBoIGZvcm1hdHMgaW4gdGhlIFBORyBmb3JtYXQuJworICAgICAgICAgICAgICAgKyAnUmVxdWlyZXMgbGlicG5nLicpCisKK29wdGlvbignaGFyZmJ1enonLAorICB0eXBlOiAnZmVhdHVyZScsCisgIHZhbHVlOiAnYXV0bycsCisgIGRlc2NyaXB0aW9uOiAnVXNlIEhhcmZidXp6IGxpYnJhcnkgdG8gaW1wcm92ZSBhdXRvLWhpbnRpbmcuJworICAgICAgICAgICAgICAgKyAnIElmIGF2YWlsYWJsZSwgbWFueSBnbHlwaHMgbm90IGRpcmVjdGx5IGFkZHJlc3NhYmxlJworICAgICAgICAgICAgICAgKyAnIGJ5IGEgZm9udFwncyBjaGFyYWN0ZXIgbWFwIHdpbGwgYmUgaGludGVkIGFsc28uJykKKworb3B0aW9uKCdicm90bGknLAorICB0eXBlOiAnZmVhdHVyZScsCisgIHZhbHVlOiAnYXV0bycsCisgIGRlc2NyaXB0aW9uOiAnVXNlIEJyb3RsaSBsaWJyYXJ5IHRvIHN1cHBvcnQgZGVjb21wcmVzc2luZyBXT0ZGMiBmb250cy4nKQorCitvcHRpb24oJ21tYXAnLAorICB0eXBlOiAnZmVhdHVyZScsCisgIHZhbHVlOiAnYXV0bycsCisgIGRlc2NyaXB0aW9uOiAnVXNlIG1tYXAoKSB0byBvcGVuIGZvbnQgZmlsZXMgZm9yIGZhc3RlciBwYXJzaW5nLicpCmRpZmYgLS1naXQgYS9tb2R1bGVzLmNmZyBiL21vZHVsZXMuY2ZnCmluZGV4IDRiZjM0NDUuLmQ2Y2RiZTUgMTAwNjQ0Ci0tLSBhL21vZHVsZXMuY2ZnCisrKyBiL21vZHVsZXMuY2ZnCkBAIC0xLDYgKzEsNiBAQAogIyBtb2R1bGVzLmNmZwogIwotIyBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTM3LDcgKzM3LDYgQEAKICMgUG9zdFNjcmlwdCBUeXBlIDEgZm9udCBkcml2ZXIuCiAjCiAjIFRoaXMgZHJpdmVyIG5lZWRzIHRoZSBgcHNhdXgnLCBgcHNoaW50ZXInLCBhbmQgYHBzbmFtZXMnIG1vZHVsZXMuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCiBGT05UX01PRFVMRVMgKz0gdHlwZTEKIAogIyBDRkYvT3BlblR5cGUgZm9udCBkcml2ZXIuCkBAIC00OCwzMCArNDcsMjQgQEAKICMgVHlwZSAxIENJRC1rZXllZCBmb250IGRyaXZlci4KICMKICMgVGhpcyBkcml2ZXIgbmVlZHMgdGhlIGBwc2F1eCcsIGBwc2hpbnRlcicsIGFuZCBgcHNuYW1lcycgbW9kdWxlcy4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KIEZPTlRfTU9EVUxFUyArPSBjaWQKIAogIyBQRlIvVHJ1ZURvYyBmb250IGRyaXZlci4gIFNlZSBvcHRpb25hbCBleHRlbnNpb24gZnRwZnIuYyBiZWxvdyBhbHNvLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogRk9OVF9NT0RVTEVTICs9IHBmcgogCiAjIFBvc3RTY3JpcHQgVHlwZSA0MiBmb250IGRyaXZlci4KICMKICMgVGhpcyBkcml2ZXIgbmVlZHMgdGhlIGB0cnVldHlwZScgYW5kIGBwc2F1eCcgbW9kdWxlcy4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KIEZPTlRfTU9EVUxFUyArPSB0eXBlNDIKIAogIyBXaW5kb3dzIEZPTlQvRk5UIGZvbnQgZHJpdmVyLiAgU2VlIG9wdGlvbmFsIGV4dGVuc2lvbiBmdHdpbmZudC5jIGJlbG93CiAjIGFsc28uCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCiBGT05UX01PRFVMRVMgKz0gd2luZm9udHMKIAogIyBQQ0YgZm9udCBkcml2ZXIuICBJZiBkZWJ1Z2dpbmcgYW5kIHRyYWNpbmcgaXMgZW5hYmxlZCwgbmVlZHMgYGZ0Yml0bWFwLmMnLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogRk9OVF9NT0RVTEVTICs9IHBjZgogCiAjIEJERiBmb250IGRyaXZlci4gIFNlZSBvcHRpb25hbCBleHRlbnNpb24gZnRiZGYuYyBiZWxvdyBhbHNvLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogRk9OVF9NT0RVTEVTICs9IGJkZgogCiAjIFNGTlQgZmlsZXMgc3VwcG9ydC4gIElmIHVzZWQgd2l0aG91dCBgdHJ1ZXR5cGUnIG9yIGBjZmYnLCBpdCBzdXBwb3J0cwpAQCAtMTE0LDQxICsxMDcsMzQgQEAKICMgRnJlZVR5cGUncyBjYWNoZSBzdWItc3lzdGVtIChxdWl0ZSBzdGFibGUgYnV0IHN0aWxsIGluIGJldGEgLS0gdGhpcyBtZWFucwogIyB0aGF0IGl0cyBwdWJsaWMgQVBJIGlzIHN1YmplY3QgdG8gY2hhbmdlIGlmIG5lY2Vzc2FyeSkuICBTZWUKICMgaW5jbHVkZS9mcmVldHlwZS9mdGNhY2hlLmguICBOZWVkcyBgZnRnbHlwaC5jJy4KLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KIEFVWF9NT0RVTEVTICs9IGNhY2hlCiAKICMgVHJ1ZVR5cGUgR1gvQUFUIHRhYmxlIHZhbGlkYXRpb24uICBOZWVkcyBgZnRneHZhbC5jJyBiZWxvdy4KICMKLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KICMgQVVYX01PRFVMRVMgKz0gZ3h2YWxpZAogCiAjIFN1cHBvcnQgZm9yIHN0cmVhbXMgY29tcHJlc3NlZCB3aXRoIGd6aXAgKGZpbGVzIHdpdGggc3VmZml4IC5neikuCiAjCiAjIFNlZSBpbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oIGZvciB0aGUgQVBJLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogQVVYX01PRFVMRVMgKz0gZ3ppcAogCiAjIFN1cHBvcnQgZm9yIHN0cmVhbXMgY29tcHJlc3NlZCB3aXRoIExaVyAoZmlsZXMgd2l0aCBzdWZmaXggLlopLgogIwogIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdGx6dy5oIGZvciB0aGUgQVBJLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogQVVYX01PRFVMRVMgKz0gbHp3CiAKICMgU3VwcG9ydCBmb3Igc3RyZWFtcyBjb21wcmVzc2VkIHdpdGggYnppcDIgKGZpbGVzIHdpdGggc3VmZml4IC5iejIpLgogIwogIyBTZWUgaW5jbHVkZS9mcmVldHlwZS9mdGJ6aXAyLmggZm9yIHRoZSBBUEkuCi0jIE5vIEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQuCiBBVVhfTU9EVUxFUyArPSBiemlwMgogCiAjIE9wZW5UeXBlIHRhYmxlIHZhbGlkYXRpb24uICBOZWVkcyBgZnRvdHZhbC5jJyBiZWxvdy4KICMKLSMgTm8gRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4KICMgQVVYX01PRFVMRVMgKz0gb3R2YWxpZAogCiAjIEF1eGlsaWFyeSBQb3N0U2NyaXB0IGRyaXZlciBjb21wb25lbnQgdG8gc2hhcmUgY29tbW9uIGNvZGUuCiAjCiAjIFRoaXMgbW9kdWxlIGRlcGVuZHMgb24gYHBzbmFtZXMnLgotIyBObyBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LgogQVVYX01PRFVMRVMgKz0gcHNhdXgKIAogIyBTdXBwb3J0IGZvciBQb3N0U2NyaXB0IGdseXBoIG5hbWVzLgpkaWZmIC0tZ2l0IGEvc3JjL0phbWZpbGUgYi9zcmMvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyNDgwYy4uMDAwMDAwMAotLS0gYS9zcmMvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIDsKLQotZm9yIHh4IGluICQoRlQyX0NPTVBPTkVOVFMpCi17Ci0gIFN1YkluY2x1ZGUgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSAkKHh4KSA7Ci19Ci0KLSMgZW5kIG9mIHNyYyBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9KYW1maWxlIGIvc3JjL2F1dG9maXQvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiODY2ZS4uMDAwMDAwMAotLS0gYS9zcmMvYXV0b2ZpdC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9hdXRvZml0IEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDMtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciBGVDJfVE9QIHNyYyBhdXRvZml0IDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gICMgZGVmaW5lIEZUMl9BVVRPRklUMiB0byBlbmFibGUgZXhwZXJpbWVudGFsIGxhdGluIGhpbnRlciByZXBsYWNlbWVudAotICBpZiAkKEZUMl9BVVRPRklUMikKLSAgewotICAgIENDRkxBR1MgKz0gRlRfT1BUSU9OX0FVVE9GSVQyIDsKLSAgfQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gYWZhbmdsZXMKLSAgICAgICAgICAgICAgIGFmYmx1ZQotICAgICAgICAgICAgICAgYWZjamsKLSAgICAgICAgICAgICAgIGFmZHVtbXkKLSAgICAgICAgICAgICAgIGFmZ2xvYmFsCi0gICAgICAgICAgICAgICBhZmhpbnRzCi0gICAgICAgICAgICAgICBhZmluZGljCi0gICAgICAgICAgICAgICBhZmxhdGluCi0gICAgICAgICAgICAgICBhZmxvYWRlcgotICAgICAgICAgICAgICAgYWZtb2R1bGUKLSAgICAgICAgICAgICAgIGFmcGljCi0gICAgICAgICAgICAgICBhZnJhbmdlcwotICAgICAgICAgICAgICAgYWZzaGFwZXIKLSAgICAgICAgICAgICAgIGFmd2FycAotICAgICAgICAgICAgICAgOwotCi0gICAgaWYgJChGVDJfQVVUT0ZJVDIpCi0gICAgewotICAgICAgX3NvdXJjZXMgKz0gYWZsYXRpbjIgOwotICAgIH0KLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IGF1dG9maXQgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvYXV0b2ZpdCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jIGIvc3JjL2F1dG9maXQvYWZhbmdsZXMuYwppbmRleCBjNjVhM2FlLi5hMmQ0NWViIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5jCisrKyBiL3NyYy9hdXRvZml0L2FmYW5nbGVzLmMKQEAgLTEsMjggKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmYW5nbGVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBSb3V0aW5lcyB1c2VkIHRvIGNvbXB1dGUgdmVjdG9yIGFuZ2xlcyB3aXRoIGxpbWl0ZWQgYWNjdXJhY3kgICAgICAgICAqLwotLyogICAgYW5kIHZlcnkgaGlnaCBzcGVlZC4gIEl0IGFsc28gY29udGFpbnMgc29ydGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmFuZ2xlcy5jCisgKgorICogICBSb3V0aW5lcyB1c2VkIHRvIGNvbXB1dGUgdmVjdG9yIGFuZ2xlcyB3aXRoIGxpbWl0ZWQgYWNjdXJhY3kKKyAqICAgYW5kIHZlcnkgaGlnaCBzcGVlZC4gIEl0IGFsc28gY29udGFpbnMgc29ydGluZyByb3V0aW5lcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZ0eXBlcy5oIgogCiAKICAgLyoKLSAgICogIFdlIGFyZSBub3QgdXNpbmcgYGFmX2FuZ2xlX2F0YW4nIGFueW1vcmUsIGJ1dCB3ZSBrZWVwIHRoZSBzb3VyY2UKLSAgICogIGNvZGUgYmVsb3cganVzdCBpbiBjYXNlLi4uCisgICAqIFdlIGFyZSBub3QgdXNpbmcgYGFmX2FuZ2xlX2F0YW4nIGFueW1vcmUsIGJ1dCB3ZSBrZWVwIHRoZSBzb3VyY2UKKyAgICogY29kZSBiZWxvdyBqdXN0IGluIGNhc2UuLi4KICAgICovCiAKIApAQCAtMzAsMTYgKzMwLDE2IEBACiAKIAogICAvKgotICAgKiAgVGhlIHRyaWNrIGhlcmUgaXMgdG8gcmVhbGl6ZSB0aGF0IHdlIGRvbid0IG5lZWQgYSB2ZXJ5IGFjY3VyYXRlIGFuZ2xlCi0gICAqICBhcHByb3hpbWF0aW9uLiAgV2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgcmVzdWx0IG9mIGBhZl9hbmdsZV9hdGFuJyB0bwotICAgKiAgb25seSBjb21wYXJlIHRoZSBzaWduIG9mIGFuZ2xlIGRpZmZlcmVuY2VzLCBvciBjaGVjayB3aGV0aGVyIGl0cwotICAgKiAgbWFnbml0dWRlIGlzIHZlcnkgc21hbGwuCisgICAqIFRoZSB0cmljayBoZXJlIGlzIHRvIHJlYWxpemUgdGhhdCB3ZSBkb24ndCBuZWVkIGEgdmVyeSBhY2N1cmF0ZSBhbmdsZQorICAgKiBhcHByb3hpbWF0aW9uLiAgV2UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgcmVzdWx0IG9mIGBhZl9hbmdsZV9hdGFuJyB0bworICAgKiBvbmx5IGNvbXBhcmUgdGhlIHNpZ24gb2YgYW5nbGUgZGlmZmVyZW5jZXMsIG9yIGNoZWNrIHdoZXRoZXIgaXRzCisgICAqIG1hZ25pdHVkZSBpcyB2ZXJ5IHNtYWxsLgogICAgKgotICAgKiAgVGhlIGFwcHJveGltYXRpb24KKyAgICogVGhlIGFwcHJveGltYXRpb24KICAgICoKLSAgICogICAgZHkgKiBQSSAvICh8ZHh8K3xkeXwpCisgICAqICAgZHkgKiBQSSAvICh8ZHh8K3xkeXwpCiAgICAqCi0gICAqICBzaG91bGQgYmUgZW5vdWdoLCBhbmQgbXVjaCBmYXN0ZXIgdG8gY29tcHV0ZS4KKyAgICogc2hvdWxkIGJlIGVub3VnaCwgYW5kIG11Y2ggZmFzdGVyIHRvIGNvbXB1dGUuCiAgICAqLwogICBGVF9MT0NBTF9ERUYoIEFGX0FuZ2xlICkKICAgYWZfYW5nbGVfYXRhbiggRlRfRml4ZWQgIGR4LApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZhbmdsZXMuaCBiL3NyYy9hdXRvZml0L2FmYW5nbGVzLmgKaW5kZXggZjMzZjllMS4uMThkN2RhZSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZhbmdsZXMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmFuZ2xlcy5oCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqICBhZmFuZ2xlcy5oCisgKiBhZmFuZ2xlcy5oCiAgKgotICogIFRoaXMgaXMgYSBkdW1teSBmaWxlLCB1c2VkIHRvIHBsZWFzZSB0aGUgYnVpbGQgc3lzdGVtLiAgSXQgaXMgbmV2ZXIKLSAqICBpbmNsdWRlZCBieSB0aGUgYXV0by1maXR0ZXIgc291cmNlcy4KKyAqIFRoaXMgaXMgYSBkdW1teSBmaWxlLCB1c2VkIHRvIHBsZWFzZSB0aGUgYnVpbGQgc3lzdGVtLiAgSXQgaXMgbmV2ZXIKKyAqIGluY2x1ZGVkIGJ5IHRoZSBhdXRvLWZpdHRlciBzb3VyY2VzLgogICoKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZibHVlLmMgYi9zcmMvYXV0b2ZpdC9hZmJsdWUuYwppbmRleCBlNDA3OGZkLi45ZWJmZmRkIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmJsdWUuYworKysgYi9zcmMvYXV0b2ZpdC9hZmJsdWUuYwpAQCAtMSwyMiArMSwyMiBAQAogLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUgUGVybCBzY3JpcHQgYGFmYmx1ZS5wbCcsICovCiAvKiB1c2luZyBkYXRhIGZyb20gZmlsZSBgYWZibHVlLmRhdCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZibHVlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZibHVlLmMKKyAqCisgKiAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZ0eXBlcy5oIgpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgJ1wwJywKICAgICAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHhBOCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkwJywgJ1x4QUEnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MCcsICdceEFDJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTAnLCAnXHhCRicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkxJywgJ1x4ODMnLCAgLyog8JCQqCDwkJCqIPCQkKwg8JCQvyDwkJGDICovCiAgICAgJ1wwJywKLSAgICAnXHhFMCcsICdceEE0JywgJ1x4OTUnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhBRScsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceDg1JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4ODYnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhBNScsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEE3JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QUQnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhCNicsICAvKiDgpJUg4KSuIOCkhSDgpIYg4KSlIOCkpyDgpK0g4KS2ICovCisgICAgJ1x4RTAnLCAnXHhBNCcsICdceDk1JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QTgnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHhBRScsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceDg5JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4OUInLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHg5RicsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceEEwJywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QTEnLCAgLyog4KSVIOCkqCDgpK4g4KSJIOCkmyDgpJ8g4KSgIOCkoSAqLwogICAgICdcMCcsCiAgICAgJ1x4RTAnLCAnXHhBNCcsICdceDg4JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4OTAnLCAnICcsICdceEUwJywgJ1x4QTQnLCAnXHg5MycsICcgJywgJ1x4RTAnLCAnXHhBNCcsICdceDk0JywgJyAnLCAnXHhFMCcsICdceEE0JywgJ1x4QkYnLCAnICcsICdceEUwJywgJ1x4QTUnLCAnXHg4MCcsICcgJywgJ1x4RTAnLCAnXHhBNScsICdceDhCJywgJyAnLCAnXHhFMCcsICdceEE1JywgJ1x4OEMnLCAgLyog4KSIIOCkkCDgpJMg4KSUIOCkvyDgpYAg4KWLIOCljCAqLwogICAgICdcMCcsCkBAIC0yOTYsNiArMjk2LDI0IEBACiAgICAgJ1wwJywKICAgICAnXHhFMCcsICdceEI0JywgJ1x4OUYnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHhBMCcsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceEE3JywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4QjYnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHg5OCcsICcgJywgJ1x4RTAnLCAnXHhCNCcsICdceDlBJywgJyAnLCAnXHhFMCcsICdceEI0JywgJ1x4QTUnLCAnICcsICdceEUwJywgJ1x4QjQnLCAnXHhCMicsICAvKiDgtJ8g4LSgIOC0pyDgtLYg4LSYIOC0miDgtKUg4LSyICovCiAgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg4MCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4ODEnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceDgyJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg4MycsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4OEYnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceDlBJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg5RicsICAvKiDwlrmAIPCWuYEg8Ja5giDwlrmDIPCWuY8g8Ja5miDwlrmfICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg4MCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4ODEnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceDgyJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg4MycsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4OEYnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceDlBJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHg5MicsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4OTMnLCAgLyog8Ja5gCDwlrmBIPCWuYIg8Ja5gyDwlrmPIPCWuZog8Ja5kiDwlrmTICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhBNCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QUMnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEE3JywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhCNCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QjYnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEJFJywgIC8qIPCWuaQg8Ja5rCDwlrmnIPCWubQg8Ja5tiDwlrm+ICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhBMCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QTEnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEEyJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhCOScsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QjMnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEFFJywgIC8qIPCWuaAg8Ja5oSDwlrmiIPCWubkg8Ja5syDwlrmuICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhBMCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QTEnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEEyJywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhCMycsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QUQnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEJEJywgIC8qIPCWuaAg8Ja5oSDwlrmiIPCWubMg8Ja5rSDwlrm9ICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QjknLCAnXHhBNScsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEI5JywgJ1x4QTgnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCOScsICdceEE5JywgIC8qIPCWuaUg8Ja5qCDwlrmpICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDk2JywgJ1x4QkEnLCAnXHg4MCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEJBJywgJ1x4ODUnLCAnICcsICdceEYwJywgJ1x4OTYnLCAnXHhCQScsICdceDg4JywgJyAnLCAnXHhGMCcsICdceDk2JywgJ1x4QkEnLCAnXHg4NCcsICcgJywgJ1x4RjAnLCAnXHg5NicsICdceEJBJywgJ1x4OEQnLCAgLyog8Ja6gCDwlrqFIPCWuogg8Ja6hCDwlrqNICovCisgICAgJ1wwJywKKyAgICAnXHhFMScsICdceEEwJywgJ1x4QjMnLCAnICcsICdceEUxJywgJ1x4QTAnLCAnXHhCNCcsICcgJywgJ1x4RTEnLCAnXHhBMCcsICdceEI2JywgJyAnLCAnXHhFMScsICdceEEwJywgJ1x4QkQnLCAnICcsICdceEUxJywgJ1x4QTEnLCAnXHg4MicsICcgJywgJ1x4RTEnLCAnXHhBMScsICdceDhBJywgJyAnLCAnXHhFMicsICdceDgwJywgJ1x4OEQnLCAnXHhFMScsICdceEExJywgJ1x4QTEnLCAnXHhFMicsICdceDgwJywgJ1x4OEQnLCAnICcsICdceEUyJywgJ1x4ODAnLCAnXHg4RCcsICdceEUxJywgJ1x4QTEnLCAnXHhCMycsICdceEUyJywgJ1x4ODAnLCAnXHg4RCcsICAvKiDhoLMg4aC0IOGgtiDhoL0g4aGCIOGhiiDigI3hoaHigI0g4oCN4aGz4oCNICovCisgICAgJ1wwJywKKyAgICAnXHhFMScsICdceEExJywgJ1x4ODMnLCAgLyog4aGDICovCisgICAgJ1wwJywKICAgICAnXHhFMScsICdceDgwJywgJ1x4ODEnLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg4MicsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDg0JywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4OTInLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg5RCcsICcgJywgJ1x4RTEnLCAnXHg4MScsICdceEE1JywgJyAnLCAnXHhFMScsICdceDgxJywgJ1x4OEEnLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4QicsICAvKiDhgIEg4YCCIOGAhCDhgJIg4YCdIOGBpSDhgYog4YGLICovCiAgICAgJ1wwJywKICAgICAnXHhFMScsICdceDgwJywgJ1x4ODQnLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg4RScsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDkyJywgJyAnLCAnXHhFMScsICdceDgwJywgJ1x4OTUnLCAnICcsICdceEUxJywgJ1x4ODAnLCAnXHg5NycsICcgJywgJ1x4RTEnLCAnXHg4MCcsICdceDlEJywgJyAnLCAnXHhFMScsICdceDgxJywgJ1x4OEEnLCAnICcsICdceEUxJywgJ1x4ODEnLCAnXHg4QicsICAvKiDhgIQg4YCOIOGAkiDhgJUg4YCXIOGAnSDhgYog4YGLICovCkBAIC0zMzYsNiArMzU0LDEyIEBACiAgICAgJ1wwJywKICAgICAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg4MCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4ODInLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDg2JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHg4OCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4OEEnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHg5MicsICdceDkyJywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4OTInLCAnXHhBMCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceDkyJywgJ1x4QTknLCAgLyog8JCSgCDwkJKCIPCQkoYg8JCSiCDwkJKKIPCQkpIg8JCSoCDwkJKpICovCiAgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDkwJywgJ1x4QjQnLCAnXHg4MycsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEI0JywgJ1x4ODAnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhCNCcsICdceDg2JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QjQnLCAnXHg5NicsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEI0JywgJ1x4OTUnLCAgLyog8JC0gyDwkLSAIPCQtIYg8JC0liDwkLSVICovCisgICAgJ1wwJywKKyAgICAnXHhGMCcsICdceDkwJywgJ1x4QjQnLCAnXHg5NCcsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEI0JywgJ1x4OTYnLCAnICcsICdceEYwJywgJ1x4OTAnLCAnXHhCNCcsICdceDk1JywgJyAnLCAnXHhGMCcsICdceDkwJywgJ1x4QjQnLCAnXHg5MScsICcgJywgJ1x4RjAnLCAnXHg5MCcsICdceEI0JywgJ1x4OTAnLCAgLyog8JC0lCDwkLSWIPCQtJUg8JC0kSDwkLSQICovCisgICAgJ1wwJywKKyAgICAnXHhEOScsICdceDgwJywgIC8qINmAICovCisgICAgJ1wwJywKICAgICAnXHhFQScsICdceEEyJywgJ1x4OUMnLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg5RScsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceEIzJywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4ODInLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg5NicsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceDkyJywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4OUQnLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg5QicsICAvKiDqopwg6qKeIOqisyDqooIg6qKWIOqikiDqop0g6qKbICovCiAgICAgJ1wwJywKICAgICAnXHhFQScsICdceEEyJywgJ1x4ODInLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHhBOCcsICcgJywgJ1x4RUEnLCAnXHhBMicsICdceEJBJywgJyAnLCAnXHhFQScsICdceEEyJywgJ1x4QTQnLCAnICcsICdceEVBJywgJ1x4QTInLCAnXHg4RScsICAvKiDqooIg6qKoIOqiuiDqoqQg6qKOICovCkBAIC00ODQsMTQgKzUwOCwxNCBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0hBS01BX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX0NIQUtNQV9ERVNDRU5ERVIsIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1RPUCwgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfQk9UVE9NLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU01BTExfQk9UVE9NLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX1RPUCwgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NVUFNfQk9UVE9NLCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19UT1AsICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX0JPVFRPTSwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU01BTExfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NNQUxMX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TVVBTX0JPVFRPTSwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19DQVJJQU5fVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FSSUFOX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCkBAIC01OTEsNiArNjE1LDkgQEAKICAgICB7IEFGX0JMVUVfU1RSSU5HX0hFQlJFV19CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19IRUJSRVdfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FOTkFEQV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX0tBWUFIX0xJX1RPUCwgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FZQUhfTElfQk9UVE9NLCAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKQEAgLTYwOSw5ICs2MzYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX0tITUVSX1NZTUJPTFNfV0FOSU5HX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfS0FOTkFEQV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19LQU5OQURBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfTEFPX1RPUCwgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19MQU9fQk9UVE9NLCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LApAQCAtNjQ5LDYgKzY3MywxOCBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFMQVlBTEFNX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX01BTEFZQUxBTV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX0NBUElUQUxfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9GX1RPUCwgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfREVTQ0VOREVSLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX0RJR0lUX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTU9OR09MSUFOX1RPUF9CQVNFLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTU9OR09MSUFOX0JPVFRPTV9CQVNFLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LApAQCAtNjgwLDYgKzcxNiwxMCBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19PU01BTllBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX1JPSElOR1lBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19ST0hJTkdZQV9KT0lOLCAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fTkVVVFJBTCB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfU0FVUkFTSFRSQV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKQEAgLTcwNyw5ICs3NDcsNiBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfVEVMVUdVX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgIHsgQUZfQkxVRV9TVFJJTkdfVElGSU5BR0gsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0sCi0gICAgeyBBRl9CTFVFX1NUUklOR19USUZJTkFHSCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfVEhBSV9CT1RUT00sICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LApAQCAtNzE5LDYgKzc1Niw5IEBACiAgICAgeyBBRl9CTFVFX1NUUklOR19USEFJX0xBUkdFX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19USEFJX0RJR0lUX1RPUCwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBBRl9CTFVFX1NUUklOR19USUZJTkFHSCwgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfSwKKyAgICB7IEFGX0JMVUVfU1RSSU5HX1RJRklOQUdILCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBRl9CTFVFX1NUUklOR19WQUlfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9LAogICAgIHsgQUZfQkxVRV9TVFJJTkdfVkFJX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmJsdWUuY2luIGIvc3JjL2F1dG9maXQvYWZibHVlLmNpbgppbmRleCA0OTEzZTJlLi5jNmE2OTdmIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmJsdWUuY2luCisrKyBiL3NyYy9hdXRvZml0L2FmYmx1ZS5jaW4KQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmYmx1ZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBkYXRhIGZvciBibHVlIHN0cmluZ3MgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmYmx1ZS5jCisgKgorICogICBBdXRvLWZpdHRlciBkYXRhIGZvciBibHVlIHN0cmluZ3MgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgImFmdHlwZXMuaCIKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmYmx1ZS5kYXQgYi9zcmMvYXV0b2ZpdC9hZmJsdWUuZGF0CmluZGV4IGJjMmYwZDIuLmIxOWI4ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmYmx1ZS5kYXQKKysrIGIvc3JjL2F1dG9maXQvYWZibHVlLmRhdApAQCAtMSwxNSArMSwxNSBAQAotLy8gIGFmYmx1ZS5kYXQKKy8vIGFmYmx1ZS5kYXQKIC8vCi0vLyAgICBBdXRvLWZpdHRlciBkYXRhIGZvciBibHVlIHN0cmluZ3MuCisvLyAgIEF1dG8tZml0dGVyIGRhdGEgZm9yIGJsdWUgc3RyaW5ncy4KIC8vCi0vLyAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieQotLy8gIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKy8vIENvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CisvLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAvLwotLy8gIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLS8vICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotLy8gIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotLy8gIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotLy8gIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKy8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKy8vIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisvLyBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKy8vIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorLy8gdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgogCiAKIC8vIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIHNwZWNpZmljIHRvIGJsdWUgem9uZXMuICBJdCBnZXRzIHByb2Nlc3NlZCBieQpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgIvCQkKgg8JCQqiDwkJCsIPCQkL8g8JCRgyIKIAogICBBRl9CTFVFX1NUUklOR19ERVZBTkFHQVJJX0JBU0UKLSAgICAi4KSVIOCkriDgpIUg4KSGIOCkpSDgpKcg4KStIOCktiIKKyAgICAi4KSVIOCkqCDgpK4g4KSJIOCkmyDgpJ8g4KSgIOCkoSIKICAgQUZfQkxVRV9TVFJJTkdfREVWQU5BR0FSSV9UT1AKICAgICAi4KSIIOCkkCDgpJMg4KSUIOCkvyDgpYAg4KWLIOCljCIKICAgLy8gbm90ZSB0aGF0IHNvbWUgZm9udHMgaGF2ZSBleHRyZW1lIHZhcmlhdGlvbiBpbiB0aGUgaGVpZ2h0IG9mIHRoZQpAQCAtMzkyLDYgKzM5MiwyNiBAQAogICBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fQk9UVE9NCiAgICAgIuC0nyDgtKAg4LSnIOC0tiDgtJgg4LSaIOC0pSDgtLIiCiAKKyAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9UT1AKKyAgICAi8Ja5gCDwlrmBIPCWuYIg8Ja5gyDwlrmPIPCWuZog8Ja5nyIKKyAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9CT1RUT00KKyAgICAi8Ja5gCDwlrmBIPCWuYIg8Ja5gyDwlrmPIPCWuZog8Ja5kiDwlrmTIgorICBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9GX1RPUAorICAgICLwlrmkIPCWuawg8Ja5pyDwlrm0IPCWubYg8Ja5viIKKyAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfVE9QCisgICAgIvCWuaAg8Ja5oSDwlrmiIPCWubkg8Ja5syDwlrmuIgorICBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9CT1RUT00KKyAgICAi8Ja5oCDwlrmhIPCWuaIg8Ja5syDwlrmtIPCWub0iCisgIEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX1NNQUxMX0RFU0NFTkRFUgorICAgICLwlrmlIPCWuagg8Ja5qSIKKyAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fRElHSVRfVE9QCisgICAgIvCWuoAg8Ja6hSDwlrqIIPCWuoQg8Ja6jSIKKworICBBRl9CTFVFX1NUUklOR19NT05HT0xJQU5fVE9QX0JBU0UKKyAgICAi4aCzIOGgtCDhoLYg4aC9IOGhgiDhoYog4oCN4aGh4oCNIOKAjeGhs+KAjSIKKyAgQUZfQkxVRV9TVFJJTkdfTU9OR09MSUFOX0JPVFRPTV9CQVNFCisgICAgIuGhgyIKKwogICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX1RPUAogICAgICLhgIEg4YCCIOGAhCDhgJIg4YCdIOGBpSDhgYog4YGLIgogICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX0JPVFRPTQpAQCAtNDM4LDYgKzQ1OCwxMyBAQAogICBBRl9CTFVFX1NUUklOR19PU01BTllBX0JPVFRPTQogICAgICLwkJKAIPCQkoIg8JCShiDwkJKIIPCQkoog8JCSkiDwkJKgIPCQkqkiCiAKKyAgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfVE9QCisgICAgIvCQtIMg8JC0gCDwkLSGIPCQtJYg8JC0lSIKKyAgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfQk9UVE9NCisgICAgIvCQtJQg8JC0liDwkLSVIPCQtJEg8JC0kCIKKyAgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfSk9JTgorICAgICLZgCIKKwogICBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX1RPUAogICAgICLqopwg6qKeIOqisyDqooIg6qKWIOqikiDqop0g6qKbIgogICBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX0JPVFRPTQpAQCAtNzI5LDE0ICs3NTYsMTQgQEAKICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICBBRl9CTFVFX1NUUklOR1NFVF9DQU5TCi0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfVE9QLCAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX0JPVFRPTSwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9CT1RUT00sICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19UT1AsICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NVUFNfQk9UVE9NLCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfVE9QLCAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX0JPVFRPTSwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9UT1AsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX0NBTkFESUFOX1NZTExBQklDU19TTUFMTF9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgeyBBRl9CTFVFX1NUUklOR19DQU5BRElBTl9TWUxMQUJJQ1NfU1VQU19UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FOQURJQU5fU1lMTEFCSUNTX1NVUFNfQk9UVE9NLCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgQUZfQkxVRV9TVFJJTkdTRVRfQ0FSSQogICAgIHsgQUZfQkxVRV9TVFJJTkdfQ0FSSUFOX1RPUCwgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgfQpAQCAtODY5LDYgKzg5NiwxMSBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfSEVCUkVXX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgIEFGX0JMVUVfU1RSSU5HU0VUX0tOREEKKyAgICB7IEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9CisgICAgeyBBRl9CTFVFX1NUUklOR19LQU5OQURBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICBBRl9CTFVFX1NUUklOR1NFVF9LQUxJCiAgICAgeyBBRl9CTFVFX1NUUklOR19LQVlBSF9MSV9UT1AsICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQpAQCAtODkzLDExICs5MjUsNiBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfS0hNRVJfU1lNQk9MU19XQU5JTkdfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gIEFGX0JMVUVfU1RSSU5HU0VUX0tOREEKLSAgICB7IEFGX0JMVUVfU1RSSU5HX0tBTk5BREFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19LQU5OQURBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQogICBBRl9CTFVFX1NUUklOR1NFVF9MQU8KICAgICB7IEFGX0JMVUVfU1RSSU5HX0xBT19UT1AsICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9CkBAIC05NDcsNiArOTc0LDIyIEBACiAgICAgeyBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgQUZfQkxVRV9TVFJJTkdTRVRfTUVERgorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9CT1RUT00sICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfRl9UT1AsICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfVE9QLCAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9YX0hFSUdIVCAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX1NNQUxMX0JPVFRPTSwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX1NNQUxMX0RFU0NFTkRFUiwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX0RJR0lUX1RPUCwgICAgICAgQUZfQkxVRV9QUk9QRVJUWV9MQVRJTl9UT1AgICAgICAgIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICBBRl9CTFVFX1NUUklOR1NFVF9NT05HCisgICAgeyBBRl9CTFVFX1NUUklOR19NT05HT0xJQU5fVE9QX0JBU0UsICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KKyAgICB7IEFGX0JMVUVfU1RSSU5HX01PTkdPTElBTl9CT1RUT01fQkFTRSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgQUZfQkxVRV9TVFJJTkdTRVRfTVlNUgogICAgIHsgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9UT1AsICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fWF9IRUlHSFQgICB9CkBAIC05OTIsNiArMTAzNSwxMiBAQAogICAgIHsgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9CT1RUT00sIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgQUZfQkxVRV9TVFJJTkdTRVRfUk9IRworICAgIHsgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfSk9JTiwgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX05FVVRSQUwgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgIEFGX0JMVUVfU1RSSU5HU0VUX1NBVVIKICAgICB7IEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9CiAgICAgeyBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX0JPVFRPTSwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTAzMywxMSArMTA4Miw2IEBACiAgICAgeyBBRl9CTFVFX1NUUklOR19URUxVR1VfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgQUZfQkxVRV9TVFJJTkdTRVRfVEZORwotICAgIHsgQUZfQkxVRV9TVFJJTkdfVElGSU5BR0gsIEFGX0JMVUVfUFJPUEVSVFlfTEFUSU5fVE9QIH0KLSAgICB7IEFGX0JMVUVfU1RSSU5HX1RJRklOQUdILCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgeyBBRl9CTFVFX1NUUklOR19NQVgsICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCiAgIEFGX0JMVUVfU1RSSU5HU0VUX1RIQUkKICAgICB7IEFGX0JMVUVfU1RSSU5HX1RIQUlfVE9QLCAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1hfSEVJR0hUICAgfQpAQCAtMTA0OSw2ICsxMDkzLDExIEBACiAgICAgeyBBRl9CTFVFX1NUUklOR19USEFJX0RJR0lUX1RPUCwgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICB7IEFGX0JMVUVfU1RSSU5HX01BWCwgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgIEFGX0JMVUVfU1RSSU5HU0VUX1RGTkcKKyAgICB7IEFGX0JMVUVfU1RSSU5HX1RJRklOQUdILCBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9CisgICAgeyBBRl9CTFVFX1NUUklOR19USUZJTkFHSCwgMCAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIHsgQUZfQkxVRV9TVFJJTkdfTUFYLCAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICBBRl9CTFVFX1NUUklOR1NFVF9WQUlJCiAgICAgeyBBRl9CTFVFX1NUUklOR19WQUlfVE9QLCAgICBBRl9CTFVFX1BST1BFUlRZX0xBVElOX1RPUCB9CiAgICAgeyBBRl9CTFVFX1NUUklOR19WQUlfQk9UVE9NLCAwICAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmJsdWUuaCBiL3NyYy9hdXRvZml0L2FmYmx1ZS5oCmluZGV4IGRlMzFlMjUuLjQ4NmQ2NjMgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmYmx1ZS5oCisrKyBiL3NyYy9hdXRvZml0L2FmYmx1ZS5oCkBAIC0xLDIyICsxLDIyIEBACiAvKiBUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSBQZXJsIHNjcmlwdCBgYWZibHVlLnBsJywgKi8KIC8qIHVzaW5nIGRhdGEgZnJvbSBmaWxlIGBhZmJsdWUuZGF0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmJsdWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmJsdWUuaAorICoKKyAqICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZCTFVFX0hfCkBAIC0yMTIsNTYgKzIxMiw2OCBAQAogICAgIEFGX0JMVUVfU1RSSU5HX0xJU1VfQk9UVE9NID0gMzUwNiwKICAgICBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fVE9QID0gMzUzOCwKICAgICBBRl9CTFVFX1NUUklOR19NQUxBWUFMQU1fQk9UVE9NID0gMzU4MiwKLSAgICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX1RPUCA9IDM2MTQsCi0gICAgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9CT1RUT00gPSAzNjQ2LAotICAgIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQVNDRU5ERVIgPSAzNjc4LAotICAgIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfREVTQ0VOREVSID0gMzcwNiwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fVE9QID0gMzczOCwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fQk9UVE9NID0gMzc2MiwKLSAgICBBRl9CTFVFX1NUUklOR19OS09fU01BTExfVE9QID0gMzc3NywKLSAgICBBRl9CTFVFX1NUUklOR19OS09fU01BTExfQk9UVE9NID0gMzc4NiwKLSAgICBBRl9CTFVFX1NUUklOR19PTF9DSElLSSA9IDM3OTgsCi0gICAgQUZfQkxVRV9TVFJJTkdfT0xEX1RVUktJQ19UT1AgPSAzODIyLAotICAgIEFGX0JMVUVfU1RSSU5HX09MRF9UVVJLSUNfQk9UVE9NID0gMzgzNywKLSAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX1RPUCA9IDM4NTcsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9CT1RUT00gPSAzODk3LAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX0NBUElUQUxfREVTQ0VOREVSID0gMzkyNywKLSAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9UT1AgPSAzOTQyLAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0JPVFRPTSA9IDM5ODIsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfQVNDRU5ERVIgPSA0MDIyLAotICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0RFU0NFTkRFUiA9IDQwNDcsCi0gICAgQUZfQkxVRV9TVFJJTkdfT1NNQU5ZQV9UT1AgPSA0MDYyLAotICAgIEFGX0JMVUVfU1RSSU5HX09TTUFOWUFfQk9UVE9NID0gNDEwMiwKLSAgICBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX1RPUCA9IDQxNDIsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0FVUkFTSFRSQV9CT1RUT00gPSA0MTc0LAotICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fVE9QID0gNDE5NCwKLSAgICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX0JPVFRPTSA9IDQyMDQsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9ERVNDRU5ERVIgPSA0MjI5LAotICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fU01BTExfVE9QID0gNDIzOSwKLSAgICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX1NNQUxMX0JPVFRPTSA9IDQyNzQsCi0gICAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9UT1AgPSA0Mjg5LAotICAgIEFGX0JMVUVfU1RSSU5HX1NJTkhBTEFfQk9UVE9NID0gNDMyMSwKLSAgICBBRl9CTFVFX1NUUklOR19TSU5IQUxBX0RFU0NFTkRFUiA9IDQzNTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX1RPUCA9IDQzOTcsCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX0JPVFRPTSA9IDQ0MjEsCi0gICAgQUZfQkxVRV9TVFJJTkdfU1VOREFORVNFX0RFU0NFTkRFUiA9IDQ0NTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfVEFJX1ZJRVRfVE9QID0gNDQ2MSwKLSAgICBBRl9CTFVFX1NUUklOR19UQUlfVklFVF9CT1RUT00gPSA0NDgxLAotICAgIEFGX0JMVUVfU1RSSU5HX1RBTUlMX1RPUCA9IDQ0OTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfVEFNSUxfQk9UVE9NID0gNDUyNSwKLSAgICBBRl9CTFVFX1NUUklOR19URUxVR1VfVE9QID0gNDU1NywKLSAgICBBRl9CTFVFX1NUUklOR19URUxVR1VfQk9UVE9NID0gNDU4NSwKLSAgICBBRl9CTFVFX1NUUklOR19USEFJX1RPUCA9IDQ2MTMsCi0gICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9CT1RUT00gPSA0NjM3LAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfQVNDRU5ERVIgPSA0NjY1LAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfTEFSR0VfQVNDRU5ERVIgPSA0Njc3LAotICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfREVTQ0VOREVSID0gNDY4OSwKLSAgICBBRl9CTFVFX1NUUklOR19USEFJX0xBUkdFX0RFU0NFTkRFUiA9IDQ3MDUsCi0gICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9ESUdJVF9UT1AgPSA0NzEzLAotICAgIEFGX0JMVUVfU1RSSU5HX1RJRklOQUdIID0gNDcyNSwKLSAgICBBRl9CTFVFX1NUUklOR19WQUlfVE9QID0gNDc1NywKLSAgICBBRl9CTFVFX1NUUklOR19WQUlfQk9UVE9NID0gNDc4OSwKLSAgICBhZl9ibHVlXzFfMSA9IDQ4MjAsCisgICAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fQ0FQSVRBTF9UT1AgPSAzNjE0LAorICAgIEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX0NBUElUQUxfQk9UVE9NID0gMzY0OSwKKyAgICBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9GX1RPUCA9IDM2ODksCisgICAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fU01BTExfVE9QID0gMzcxOSwKKyAgICBBRl9CTFVFX1NUUklOR19NRURFRkFJRFJJTl9TTUFMTF9CT1RUT00gPSAzNzQ5LAorICAgIEFGX0JMVUVfU1RSSU5HX01FREVGQUlEUklOX1NNQUxMX0RFU0NFTkRFUiA9IDM3NzksCisgICAgQUZfQkxVRV9TVFJJTkdfTUVERUZBSURSSU5fRElHSVRfVE9QID0gMzc5NCwKKyAgICBBRl9CTFVFX1NUUklOR19NT05HT0xJQU5fVE9QX0JBU0UgPSAzODE5LAorICAgIEFGX0JMVUVfU1RSSU5HX01PTkdPTElBTl9CT1RUT01fQkFTRSA9IDM4NjMsCisgICAgQUZfQkxVRV9TVFJJTkdfTVlBTk1BUl9UT1AgPSAzODY3LAorICAgIEFGX0JMVUVfU1RSSU5HX01ZQU5NQVJfQk9UVE9NID0gMzg5OSwKKyAgICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX0FTQ0VOREVSID0gMzkzMSwKKyAgICBBRl9CTFVFX1NUUklOR19NWUFOTUFSX0RFU0NFTkRFUiA9IDM5NTksCisgICAgQUZfQkxVRV9TVFJJTkdfTktPX1RPUCA9IDM5OTEsCisgICAgQUZfQkxVRV9TVFJJTkdfTktPX0JPVFRPTSA9IDQwMTUsCisgICAgQUZfQkxVRV9TVFJJTkdfTktPX1NNQUxMX1RPUCA9IDQwMzAsCisgICAgQUZfQkxVRV9TVFJJTkdfTktPX1NNQUxMX0JPVFRPTSA9IDQwMzksCisgICAgQUZfQkxVRV9TVFJJTkdfT0xfQ0hJS0kgPSA0MDUxLAorICAgIEFGX0JMVUVfU1RSSU5HX09MRF9UVVJLSUNfVE9QID0gNDA3NSwKKyAgICBBRl9CTFVFX1NUUklOR19PTERfVFVSS0lDX0JPVFRPTSA9IDQwOTAsCisgICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfQ0FQSVRBTF9UT1AgPSA0MTEwLAorICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX0NBUElUQUxfQk9UVE9NID0gNDE1MCwKKyAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9DQVBJVEFMX0RFU0NFTkRFUiA9IDQxODAsCisgICAgQUZfQkxVRV9TVFJJTkdfT1NBR0VfU01BTExfVE9QID0gNDE5NSwKKyAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9CT1RUT00gPSA0MjM1LAorICAgIEFGX0JMVUVfU1RSSU5HX09TQUdFX1NNQUxMX0FTQ0VOREVSID0gNDI3NSwKKyAgICBBRl9CTFVFX1NUUklOR19PU0FHRV9TTUFMTF9ERVNDRU5ERVIgPSA0MzAwLAorICAgIEFGX0JMVUVfU1RSSU5HX09TTUFOWUFfVE9QID0gNDMxNSwKKyAgICBBRl9CTFVFX1NUUklOR19PU01BTllBX0JPVFRPTSA9IDQzNTUsCisgICAgQUZfQkxVRV9TVFJJTkdfUk9ISU5HWUFfVE9QID0gNDM5NSwKKyAgICBBRl9CTFVFX1NUUklOR19ST0hJTkdZQV9CT1RUT00gPSA0NDIwLAorICAgIEFGX0JMVUVfU1RSSU5HX1JPSElOR1lBX0pPSU4gPSA0NDQ1LAorICAgIEFGX0JMVUVfU1RSSU5HX1NBVVJBU0hUUkFfVE9QID0gNDQ0OCwKKyAgICBBRl9CTFVFX1NUUklOR19TQVVSQVNIVFJBX0JPVFRPTSA9IDQ0ODAsCisgICAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9UT1AgPSA0NTAwLAorICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fQk9UVE9NID0gNDUxMCwKKyAgICBBRl9CTFVFX1NUUklOR19TSEFWSUFOX0RFU0NFTkRFUiA9IDQ1MzUsCisgICAgQUZfQkxVRV9TVFJJTkdfU0hBVklBTl9TTUFMTF9UT1AgPSA0NTQ1LAorICAgIEFGX0JMVUVfU1RSSU5HX1NIQVZJQU5fU01BTExfQk9UVE9NID0gNDU4MCwKKyAgICBBRl9CTFVFX1NUUklOR19TSU5IQUxBX1RPUCA9IDQ1OTUsCisgICAgQUZfQkxVRV9TVFJJTkdfU0lOSEFMQV9CT1RUT00gPSA0NjI3LAorICAgIEFGX0JMVUVfU1RSSU5HX1NJTkhBTEFfREVTQ0VOREVSID0gNDY1OSwKKyAgICBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfVE9QID0gNDcwMywKKyAgICBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfQk9UVE9NID0gNDcyNywKKyAgICBBRl9CTFVFX1NUUklOR19TVU5EQU5FU0VfREVTQ0VOREVSID0gNDc1OSwKKyAgICBBRl9CTFVFX1NUUklOR19UQUlfVklFVF9UT1AgPSA0NzY3LAorICAgIEFGX0JMVUVfU1RSSU5HX1RBSV9WSUVUX0JPVFRPTSA9IDQ3ODcsCisgICAgQUZfQkxVRV9TVFJJTkdfVEFNSUxfVE9QID0gNDc5OSwKKyAgICBBRl9CTFVFX1NUUklOR19UQU1JTF9CT1RUT00gPSA0ODMxLAorICAgIEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9UT1AgPSA0ODYzLAorICAgIEFGX0JMVUVfU1RSSU5HX1RFTFVHVV9CT1RUT00gPSA0ODkxLAorICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfVE9QID0gNDkxOSwKKyAgICBBRl9CTFVFX1NUUklOR19USEFJX0JPVFRPTSA9IDQ5NDMsCisgICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9BU0NFTkRFUiA9IDQ5NzEsCisgICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9MQVJHRV9BU0NFTkRFUiA9IDQ5ODMsCisgICAgQUZfQkxVRV9TVFJJTkdfVEhBSV9ERVNDRU5ERVIgPSA0OTk1LAorICAgIEFGX0JMVUVfU1RSSU5HX1RIQUlfTEFSR0VfREVTQ0VOREVSID0gNTAxMSwKKyAgICBBRl9CTFVFX1NUUklOR19USEFJX0RJR0lUX1RPUCA9IDUwMTksCisgICAgQUZfQkxVRV9TVFJJTkdfVElGSU5BR0ggPSA1MDMxLAorICAgIEFGX0JMVUVfU1RSSU5HX1ZBSV9UT1AgPSA1MDYzLAorICAgIEFGX0JMVUVfU1RSSU5HX1ZBSV9CT1RUT00gPSA1MDk1LAorICAgIGFmX2JsdWVfMV8xID0gNTEyNiwKICNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX0NKSwogICAgIEFGX0JMVUVfU1RSSU5HX0NKS19UT1AgPSBhZl9ibHVlXzFfMSArIDEsCiAgICAgQUZfQkxVRV9TVFJJTkdfQ0pLX0JPVFRPTSA9IGFmX2JsdWVfMV8xICsgMjAzLApAQCAtMzQ1LDM0ICszNTcsMzcgQEAKICAgICBBRl9CTFVFX1NUUklOR1NFVF9HVUpSID0gMTEyLAogICAgIEFGX0JMVUVfU1RSSU5HU0VUX0dVUlUgPSAxMTgsCiAgICAgQUZfQkxVRV9TVFJJTkdTRVRfSEVCUiA9IDEyNCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9LQUxJID0gMTI4LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tITVIgPSAxMzQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfS0hNUyA9IDE0MCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9LTkRBID0gMTQzLAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tOREEgPSAxMjgsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfS0FMSSA9IDEzMSwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9LSE1SID0gMTM3LAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX0tITVMgPSAxNDMsCiAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTEFPID0gMTQ2LAogICAgIEFGX0JMVUVfU1RSSU5HU0VUX0xBVE4gPSAxNTIsCiAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTEFUQiA9IDE1OSwKICAgICBBRl9CTFVFX1NUUklOR1NFVF9MQVRQID0gMTY2LAogICAgIEFGX0JMVUVfU1RSSU5HU0VUX0xJU1UgPSAxNzMsCiAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTUxZTSA9IDE3NiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9NWU1SID0gMTc5LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX05LT08gPSAxODQsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfTk9ORSA9IDE4OSwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9PTENLID0gMTkwLAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX09SS0ggPSAxOTMsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfT1NHRSA9IDE5NiwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9PU01BID0gMjA0LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NBVVIgPSAyMDcsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfU0hBVyA9IDIxMCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9TSU5IID0gMjE2LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NVTkQgPSAyMjAsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfVEFNTCA9IDIyNCwKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9UQVZUID0gMjI3LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RFTFUgPSAyMzAsCi0gICAgQUZfQkxVRV9TVFJJTkdTRVRfVEZORyA9IDIzMywKLSAgICBBRl9CTFVFX1NUUklOR1NFVF9USEFJID0gMjM2LAotICAgIEFGX0JMVUVfU1RSSU5HU0VUX1ZBSUkgPSAyNDQsCi0gICAgYWZfYmx1ZV8yXzEgPSAyNDcsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfTUVERiA9IDE3OSwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9NT05HID0gMTg3LAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX01ZTVIgPSAxOTAsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfTktPTyA9IDE5NSwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9OT05FID0gMjAwLAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX09MQ0sgPSAyMDEsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfT1JLSCA9IDIwNCwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9PU0dFID0gMjA3LAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX09TTUEgPSAyMTUsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfUk9IRyA9IDIxOCwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9TQVVSID0gMjIyLAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX1NIQVcgPSAyMjUsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfU0lOSCA9IDIzMSwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9TVU5EID0gMjM1LAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RBTUwgPSAyMzksCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfVEFWVCA9IDI0MiwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9URUxVID0gMjQ1LAorICAgIEFGX0JMVUVfU1RSSU5HU0VUX1RIQUkgPSAyNDgsCisgICAgQUZfQkxVRV9TVFJJTkdTRVRfVEZORyA9IDI1NiwKKyAgICBBRl9CTFVFX1NUUklOR1NFVF9WQUlJID0gMjU5LAorICAgIGFmX2JsdWVfMl8xID0gMjYyLAogI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fQ0pLCiAgICAgQUZfQkxVRV9TVFJJTkdTRVRfSEFOSSA9IGFmX2JsdWVfMl8xICsgMCwKICAgICBhZl9ibHVlXzJfMV8xID0gYWZfYmx1ZV8yXzEgKyAyLApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZibHVlLmhpbiBiL3NyYy9hdXRvZml0L2FmYmx1ZS5oaW4KaW5kZXggNjgyMTQ3Yy4uMzk1NzAyNyAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZibHVlLmhpbgorKysgYi9zcmMvYXV0b2ZpdC9hZmJsdWUuaGluCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmJsdWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmJsdWUuaAorICoKKyAqICAgQXV0by1maXR0ZXIgZGF0YSBmb3IgYmx1ZSBzdHJpbmdzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZCTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmNqay5jIGIvc3JjL2F1dG9maXQvYWZjamsuYwppbmRleCAyMWI2YmZmLi4zYjM0MGNkIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmNqay5jCisrKyBiL3NyYy9hdXRvZml0L2FmY2prLmMKQEAgLTEsMzMgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmY2prLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBDSksgd3JpdGluZyBzeXN0ZW0gKGJvZHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmY2prLmMKKyAqCisgKiAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIENKSyB3cml0aW5nIHN5c3RlbSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogICAvKgotICAgKiAgVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBha2l0bydzIGF1dG9oaW50IHBhdGNoLCBhcmNoaXZlZCBhdAorICAgKiBUaGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIGFraXRvJ3MgYXV0b2hpbnQgcGF0Y2gsIGFyY2hpdmVkIGF0CiAgICAqCi0gICAqICBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwNTEyMTkxNjA0NTQvaHR0cDovL3d3dy5rZGUuZ3IuanA6ODAvfmFraXRvL3BhdGNoL2ZyZWV0eXBlMi8yLjEuNy8KKyAgICogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDUxMjE5MTYwNDU0L2h0dHA6Ly93d3cua2RlLmdyLmpwOjgwL35ha2l0by9wYXRjaC9mcmVldHlwZTIvMi4xLjcvCiAgICAqCiAgICAqLwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0FEVkFOQ0VTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGFkdmFuYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgImFmZ2xvYmFsLmgiCi0jaW5jbHVkZSAiYWZwaWMuaCIKICNpbmNsdWRlICJhZmxhdGluLmgiCiAjaW5jbHVkZSAiYWZjamsuaCIKIApAQCAtNDQsMTQgKzQyLDE0IEBACiAjZW5kaWYKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9hZmNqaworI2RlZmluZSBGVF9DT01QT05FTlQgIGFmY2prCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkyLDIzICs5MCwyOSBAQAogICAgICAgQUZfQ0pLTWV0cmljc1JlYyAgZHVtbXlbMV07CiAgICAgICBBRl9TY2FsZXIgICAgICAgICBzY2FsZXIgPSAmZHVtbXktPnJvb3Quc2NhbGVyOwogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzID0gbWV0cmljcy0+cm9vdC5nbG9iYWxzOworICAgICAgQUZfU3R5bGVDbGFzcyAgIHN0eWxlX2NsYXNzICA9IG1ldHJpY3MtPnJvb3Quc3R5bGVfY2xhc3M7CisgICAgICBBRl9TY3JpcHRDbGFzcyAgc2NyaXB0X2NsYXNzID0gYWZfc2NyaXB0X2NsYXNzZXNbc3R5bGVfY2xhc3MtPnNjcmlwdF07CisKKyAgICAgIC8qIElmIEhhcmZCdXp6IGlzIG5vdCBhdmFpbGFibGUsIHdlIG5lZWQgYSBwb2ludGVyIHRvIGEgc2luZ2xlICovCisgICAgICAvKiB1bnNpZ25lZCBsb25nIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCisgICAgICB2b2lkKiAgICAgc2hhcGVyX2J1ZjsKKyNlbHNlCisgICAgICBGVF9VTG9uZyAgc2hhcGVyX2J1Zl87CisgICAgICB2b2lkKiAgICAgc2hhcGVyX2J1ZiA9ICZzaGFwZXJfYnVmXzsKICNlbmRpZgogCi0gICAgICBBRl9TdHlsZUNsYXNzICAgc3R5bGVfY2xhc3MgID0gbWV0cmljcy0+cm9vdC5zdHlsZV9jbGFzczsKLSAgICAgIEFGX1NjcmlwdENsYXNzICBzY3JpcHRfY2xhc3MgPSBBRl9TQ1JJUFRfQ0xBU1NFU19HRVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV9jbGFzcy0+c2NyaXB0XTsKLQotICAgICAgdm9pZCogICAgICAgIHNoYXBlcl9idWY7CiAgICAgICBjb25zdCBjaGFyKiAgcDsKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAgICAgICBGVF9VTG9uZyAgY2ggPSAwOwogI2VuZGlmCiAKLSAgICAgIHAgICAgICAgICAgPSBzY3JpcHRfY2xhc3MtPnN0YW5kYXJkX2NoYXJzdHJpbmc7CisgICAgICBwID0gc2NyaXB0X2NsYXNzLT5zdGFuZGFyZF9jaGFyc3RyaW5nOworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKICAgICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOworI2VuZGlmCiAKICAgICAgIC8qIFdlIGNoZWNrIGEgbGlzdCBvZiBzdGFuZGFyZCBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IG1hdGNoIHdpbnMuICovCiAKQEAgLTE1Myw3ICsxNTcsNyBAQAogICAgICAgaWYgKCAhZ2x5cGhfaW5kZXggKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIEZUX1RSQUNFNSgoICJzdGFuZGFyZCBjaGFyYWN0ZXI6IFUrJTA0bFggKGdseXBoIGluZGV4ICVkKVxuIiwKKyAgICAgIEZUX1RSQUNFNSgoICJzdGFuZGFyZCBjaGFyYWN0ZXI6IFUrJTA0bFggKGdseXBoIGluZGV4ICVsZClcbiIsCiAgICAgICAgICAgICAgICAgICBjaCwgZ2x5cGhfaW5kZXggKSk7CiAKICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgZ2x5cGhfaW5kZXgsIEZUX0xPQURfTk9fU0NBTEUgKTsKQEAgLTE5MywxMCArMTk3LDEwIEBACiAgICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICAgIC8qCi0gICAgICAgICAqICBXZSBhc3N1bWUgdGhhdCB0aGUgZ2x5cGhzIHNlbGVjdGVkIGZvciB0aGUgc3RlbSB3aWR0aAotICAgICAgICAgKiAgY29tcHV0YXRpb24gYXJlIGBmZWF0dXJlbGVzcycgZW5vdWdoIHNvIHRoYXQgdGhlIGxpbmtpbmcKLSAgICAgICAgICogIGFsZ29yaXRobSB3b3JrcyBmaW5lIHdpdGhvdXQgYWRqdXN0bWVudHMgb2YgaXRzIHNjb3JpbmcKLSAgICAgICAgICogIGZ1bmN0aW9uLgorICAgICAgICAgKiBXZSBhc3N1bWUgdGhhdCB0aGUgZ2x5cGhzIHNlbGVjdGVkIGZvciB0aGUgc3RlbSB3aWR0aAorICAgICAgICAgKiBjb21wdXRhdGlvbiBhcmUgYGZlYXR1cmVsZXNzJyBlbm91Z2ggc28gdGhhdCB0aGUgbGlua2luZworICAgICAgICAgKiBhbGdvcml0aG0gd29ya3MgZmluZSB3aXRob3V0IGFkanVzdG1lbnRzIG9mIGl0cyBzY29yaW5nCisgICAgICAgICAqIGZ1bmN0aW9uLgogICAgICAgICAgKi8KICAgICAgICAgYWZfbGF0aW5faGludHNfbGlua19zZWdtZW50cyggaGludHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCkBAIC0yNTYsOSArMjYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICBkaW0gPT0gQUZfRElNRU5TSU9OX1ZFUlQgPyAiaG9yaXpvbnRhbCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAidmVydGljYWwiICkpOwogCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJWQgKHN0YW5kYXJkKSIsIGF4aXMtPnN0YW5kYXJkX3dpZHRoICkpOworICAgICAgICAgIEZUX1RSQUNFNSgoICIgICVsZCAoc3RhbmRhcmQpIiwgYXhpcy0+c3RhbmRhcmRfd2lkdGggKSk7CiAgICAgICAgICAgZm9yICggaSA9IDE7IGkgPCBheGlzLT53aWR0aF9jb3VudDsgaSsrICkKLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgJWQiLCBheGlzLT53aWR0aHNbaV0ub3JnICkpOworICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAlbGQiLCBheGlzLT53aWR0aHNbaV0ub3JnICkpOwogCiAgICAgICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKICAgICAgICAgfQpAQCAtMjk2LDcgKzMwMCwxNCBAQAogICAgIEFGX0JsdWVfU3RyaW5nc2V0ICAgICAgICAgYnNzID0gc2MtPmJsdWVfc3RyaW5nc2V0OwogICAgIGNvbnN0IEFGX0JsdWVfU3RyaW5nUmVjKiAgYnMgID0gJmFmX2JsdWVfc3RyaW5nc2V0c1tic3NdOwogCi0gICAgdm9pZCogIHNoYXBlcl9idWY7CisgICAgLyogSWYgSGFyZkJ1enogaXMgbm90IGF2YWlsYWJsZSwgd2UgbmVlZCBhIHBvaW50ZXIgdG8gYSBzaW5nbGUgKi8KKyAgICAvKiB1bnNpZ25lZCBsb25nIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCisgICAgdm9pZCogICAgIHNoYXBlcl9idWY7CisjZWxzZQorICAgIEZUX1VMb25nICBzaGFwZXJfYnVmXzsKKyAgICB2b2lkKiAgICAgc2hhcGVyX2J1ZiA9ICZzaGFwZXJfYnVmXzsKKyNlbmRpZgogCiAKICAgICAvKiB3ZSB3YWxrIG92ZXIgdGhlIGJsdWUgY2hhcmFjdGVyIHN0cmluZ3MgYXMgc3BlY2lmaWVkIGluIHRoZSAgICovCkBAIC0zMDcsNyArMzE4LDkgQEAKICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIKICAgICAgICAgICAgICAgICAiXG4iICkpOwogCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKICAgICBzaGFwZXJfYnVmID0gYWZfc2hhcGVyX2J1Zl9jcmVhdGUoIGZhY2UgKTsKKyNlbmRpZgogCiAgICAgZm9yICggOyBicy0+c3RyaW5nICE9IEFGX0JMVUVfU1RSSU5HX01BWDsgYnMrKyApCiAgICAgewpAQCAtNDgzLDggKzQ5Niw4IEBACiAgICAgICBpZiAoIG51bV9mbGF0cyA9PSAwICYmIG51bV9maWxscyA9PSAwICkKICAgICAgIHsKICAgICAgICAgLyoKLSAgICAgICAgICogIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKLSAgICAgICAgICogIHdlIHdpbGwgc2ltcGx5IGlnbm9yZSBpdCB0aGVuCisgICAgICAgICAqIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKKyAgICAgICAgICogd2Ugd2lsbCBzaW1wbHkgaWdub3JlIGl0IHRoZW4KICAgICAgICAgICovCiAgICAgICAgIEZUX1RSQUNFNSgoICIgIGVtcHR5XG4iICkpOwogICAgICAgICBjb250aW51ZTsKQEAgLTU2NSwxNSArNTc4LDI1IEBACiAgICAgRlRfQm9vbCAgIHN0YXJ0ZWQgPSAwLCBzYW1lX3dpZHRoID0gMTsKICAgICBGVF9GaXhlZCAgYWR2YW5jZSA9IDAsIG9sZF9hZHZhbmNlID0gMDsKIAotICAgIHZvaWQqICBzaGFwZXJfYnVmOworICAgIC8qIElmIEhhcmZCdXp6IGlzIG5vdCBhdmFpbGFibGUsIHdlIG5lZWQgYSBwb2ludGVyIHRvIGEgc2luZ2xlICovCisgICAgLyogdW5zaWduZWQgbG9uZyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgorICAgIHZvaWQqICAgICBzaGFwZXJfYnVmOworI2Vsc2UKKyAgICBGVF9VTG9uZyAgc2hhcGVyX2J1Zl87CisgICAgdm9pZCogICAgIHNoYXBlcl9idWYgPSAmc2hhcGVyX2J1Zl87CisjZW5kaWYKIAogICAgIC8qIGluIGFsbCBzdXBwb3J0ZWQgY2hhcm1hcHMsIGRpZ2l0cyBoYXZlIGNoYXJhY3RlciBjb2RlcyAweDMwLTB4MzkgKi8KICAgICBjb25zdCBjaGFyICAgZGlnaXRzW10gPSAiMCAxIDIgMyA0IDUgNiA3IDggOSI7CiAgICAgY29uc3QgY2hhciogIHA7CiAKIAotICAgIHAgICAgICAgICAgPSBkaWdpdHM7CisgICAgcCA9IGRpZ2l0czsKKworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCiAgICAgc2hhcGVyX2J1ZiA9IGFmX3NoYXBlcl9idWZfY3JlYXRlKCBmYWNlICk7CisjZW5kaWYKIAogICAgIHdoaWxlICggKnAgKQogICAgIHsKQEAgLTcwNCw3ICs3MjcsNyBAQAogCiAgICAgICAgIGRlbHRhMiA9IEZUX011bEZpeCggZGVsdGEyLCBzY2FsZSApOwogCi0gICAgICAgIEZUX1RSQUNFNSgoICJkZWx0YTogJWQiLCBkZWx0YTEgKSk7CisgICAgICAgIEZUX1RSQUNFNSgoICJkZWx0YTogJWxkIiwgZGVsdGExICkpOwogICAgICAgICBpZiAoIGRlbHRhMiA8IDMyICkKICAgICAgICAgICBkZWx0YTIgPSAwOwogI2lmIDAKQEAgLTcxMyw3ICs3MzYsNyBAQAogI2VuZGlmCiAgICAgICAgIGVsc2UKICAgICAgICAgICBkZWx0YTIgPSBGVF9QSVhfUk9VTkQoIGRlbHRhMiApOwotICAgICAgICBGVF9UUkFDRTUoKCAiLyVkXG4iLCBkZWx0YTIgKSk7CisgICAgICAgIEZUX1RSQUNFNSgoICIvJWxkXG4iLCBkZWx0YTIgKSk7CiAKICAgICAgICAgaWYgKCBkZWx0YTEgPCAwICkKICAgICAgICAgICBkZWx0YTIgPSAtZGVsdGEyOwpAQCAtNzgyLDcgKzgwNSw3IEBACiAgIHsKICAgICBBRl9BeGlzSGludHMgIGF4aXMgICAgICAgICAgPSAmaGludHMtPmF4aXNbZGltXTsKICAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRzICAgICAgPSBheGlzLT5zZWdtZW50czsKLSAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBzZWdtZW50cyArIGF4aXMtPm51bV9zZWdtZW50czsKKyAgICBBRl9TZWdtZW50ICAgIHNlZ21lbnRfbGltaXQgPSBGVF9PRkZTRVQoIHNlZ21lbnRzLCBheGlzLT5udW1fc2VnbWVudHMgKTsKICAgICBGVF9FcnJvciAgICAgIGVycm9yOwogICAgIEFGX1NlZ21lbnQgICAgc2VnOwogCkBAIC04OTAsMTEgKzkxMywxMSBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogIG5vdyBjb21wdXRlIHRoZSBgc2VyaWYnIHNlZ21lbnRzCisgICAgICogbm93IGNvbXB1dGUgdGhlIGBzZXJpZicgc2VnbWVudHMKICAgICAgKgotICAgICAqICBJbiBIYW56aSwgc29tZSBzdHJva2VzIGFyZSB3aWRlciBvbiBvbmUgb3IgYm90aCBvZiB0aGUgZW5kcy4KLSAgICAgKiAgV2UgZWl0aGVyIGlkZW50aWZ5IHRoZSBzdGVtcyBvbiB0aGUgZW5kcyBhcyBzZXJpZnMgb3IgcmVtb3ZlCi0gICAgICogIHRoZSBsaW5rYWdlLCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZiB0aGUgc3RlbXMuCisgICAgICogSW4gSGFuemksIHNvbWUgc3Ryb2tlcyBhcmUgd2lkZXIgb24gb25lIG9yIGJvdGggb2YgdGhlIGVuZHMuCisgICAgICogV2UgZWl0aGVyIGlkZW50aWZ5IHRoZSBzdGVtcyBvbiB0aGUgZW5kcyBhcyBzZXJpZnMgb3IgcmVtb3ZlCisgICAgICogdGhlIGxpbmthZ2UsIGRlcGVuZGluZyBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdGVtcy4KICAgICAgKgogICAgICAqLwogCkBAIC0xMDAwLDIxICsxMDIzLDIxIEBACiAgICAgc2NhbGUgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gaGludHMtPnhfc2NhbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoaW50cy0+eV9zY2FsZTsKIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSBiZWdpbiBieSBnZW5lcmF0aW5nIGEgc29ydGVkIHRhYmxlIG9mIGVkZ2VzIGZvciB0aGUgY3VycmVudCAgICAqLwotICAgIC8qIGRpcmVjdGlvbi4gIFRvIGRvIHNvLCB3ZSBzaW1wbHkgc2NhbiBlYWNoIHNlZ21lbnQgYW5kIHRyeSB0byBmaW5kICovCi0gICAgLyogYW4gZWRnZSBpbiBvdXIgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBpdHMgcG9zaXRpb24uICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIElmIG5vIGVkZ2UgaXMgZm91bmQsIHdlIGNyZWF0ZSBhbmQgaW5zZXJ0IGEgbmV3IGVkZ2UgaW4gdGhlICAgICAgICovCi0gICAgLyogc29ydGVkIHRhYmxlLiAgT3RoZXJ3aXNlLCB3ZSBzaW1wbHkgYWRkIHRoZSBzZWdtZW50IHRvIHRoZSBlZGdlJ3MgKi8KLSAgICAvKiBsaXN0IHdoaWNoIGlzIHRoZW4gcHJvY2Vzc2VkIGluIHRoZSBzZWNvbmQgc3RlcCB0byBjb21wdXRlIHRoZSAgICAqLwotICAgIC8qIGVkZ2UncyBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOb3RlIHRoYXQgdGhlIGVkZ2VzIHRhYmxlIGlzIHNvcnRlZCBhbG9uZyB0aGUgc2VnbWVudC9lZGdlICAgICAgICAqLwotICAgIC8qIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICoKKyAgICAgKiBXZSBiZWdpbiBieSBnZW5lcmF0aW5nIGEgc29ydGVkIHRhYmxlIG9mIGVkZ2VzIGZvciB0aGUgY3VycmVudAorICAgICAqIGRpcmVjdGlvbi4gIFRvIGRvIHNvLCB3ZSBzaW1wbHkgc2NhbiBlYWNoIHNlZ21lbnQgYW5kIHRyeSB0byBmaW5kCisgICAgICogYW4gZWRnZSBpbiBvdXIgdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBpdHMgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBJZiBubyBlZGdlIGlzIGZvdW5kLCB3ZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZQorICAgICAqIHNvcnRlZCB0YWJsZS4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IGFkZCB0aGUgc2VnbWVudCB0byB0aGUgZWRnZSdzCisgICAgICogbGlzdCB3aGljaCBpcyB0aGVuIHByb2Nlc3NlZCBpbiB0aGUgc2Vjb25kIHN0ZXAgdG8gY29tcHV0ZSB0aGUKKyAgICAgKiBlZGdlJ3MgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgZWRnZXMgdGFibGUgaXMgc29ydGVkIGFsb25nIHRoZSBzZWdtZW50L2VkZ2UKKyAgICAgKiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqLwogCiAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBGVF9NdWxGaXgoIGxheGlzLT5lZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKQEAgLTExMTQsMTcgKzExMzcsMTcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogR29vZCwgd2Ugbm93IGNvbXB1dGUgZWFjaCBlZGdlJ3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlICAgKi8KLSAgICAvKiBzZWdtZW50cyBmb3VuZCBvbiBpdHMgcG9zaXRpb24uICBCYXNpY2FsbHksIHRoZXNlIGFyZSAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gdGhlIGVkZ2UncyBtYWluIGRpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSBzdGVtIGVkZ2UsIHNlcmlmIGVkZ2Ugb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RlbSB0aGVuKSAqLwotICAgIC8qICAtIHJvdW5kZWQgZWRnZSwgc3RyYWlnaHQgb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RyYWlnaHQpICovCi0gICAgLyogIC0gbGluayBmb3IgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIEdvb2QsIHdlIG5vdyBjb21wdXRlIGVhY2ggZWRnZSdzIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIHNlZ21lbnRzIGZvdW5kIG9uIGl0cyBwb3NpdGlvbi4gIEJhc2ljYWxseSwgdGhlc2UgYXJlCisgICAgICoKKyAgICAgKiAtIHRoZSBlZGdlJ3MgbWFpbiBkaXJlY3Rpb24KKyAgICAgKiAtIHN0ZW0gZWRnZSwgc2VyaWYgZWRnZSBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdGVtIHRoZW4pCisgICAgICogLSByb3VuZGVkIGVkZ2UsIHN0cmFpZ2h0IG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0cmFpZ2h0KQorICAgICAqIC0gbGluayBmb3IgZWRnZQorICAgICAqCisgICAgICovCiAKICAgICAvKiBmaXJzdCBvZiBhbGwsIHNldCB0aGUgYGVkZ2UnIGZpZWxkIGluIGVhY2ggc2VnbWVudCAtLSB0aGlzIGlzICovCiAgICAgLyogcmVxdWlyZWQgaW4gb3JkZXIgdG8gY29tcHV0ZSBlZGdlIGxpbmtzICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTE2MCw2ICsxMTgzLDggQEAKIAogCiAgICAgICAgIHNlZyA9IGVkZ2UtPmZpcnN0OworICAgICAgICBpZiAoICFzZWcgKQorICAgICAgICAgIGdvdG8gU2tpcF9Mb29wOwogCiAgICAgICAgIGRvCiAgICAgICAgIHsKQEAgLTExNzQsNyArMTE5OSw3IEBACiAKICAgICAgICAgICAvKiBjaGVjayBmb3IgbGlua3MgLS0gaWYgc2VnLT5zZXJpZiBpcyBzZXQsIHRoZW4gc2VnLT5saW5rIG11c3QgKi8KICAgICAgICAgICAvKiBiZSBpZ25vcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpc19zZXJpZiA9IChGVF9Cb29sKSggc2VnLT5zZXJpZiAmJiBzZWctPnNlcmlmLT5lZGdlICE9IGVkZ2UgKTsKKyAgICAgICAgICBpc19zZXJpZiA9IEZUX0JPT0woIHNlZy0+c2VyaWYgJiYgc2VnLT5zZXJpZi0+ZWRnZSAhPSBlZGdlICk7CiAKICAgICAgICAgICBpZiAoIHNlZy0+bGluayB8fCBpc19zZXJpZiApCiAgICAgICAgICAgewpAQCAtMTIxNSwxMyArMTI0MCwxNCBAQAogICAgICAgICAgICAgICBlZGdlMi0+ZmxhZ3MgfD0gQUZfRURHRV9TRVJJRjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZWRnZS0+bGluayAgPSBlZGdlMjsKKyAgICAgICAgICAgICAgZWRnZS0+bGluayA9IGVkZ2UyOwogICAgICAgICAgIH0KIAogICAgICAgICAgIHNlZyA9IHNlZy0+ZWRnZV9uZXh0OwogCiAgICAgICAgIH0gd2hpbGUgKCBzZWcgIT0gZWRnZS0+Zmlyc3QgKTsKIAorICAgICAgU2tpcF9Mb29wOgogICAgICAgICAvKiBzZXQgdGhlIHJvdW5kL3N0cmFpZ2h0IGZsYWdzICovCiAgICAgICAgIGVkZ2UtPmZsYWdzID0gQUZfRURHRV9OT1JNQUw7CiAKQEAgLTEzNjQsOCArMTM5MCw4IEBACiAgICAgYWZfZ2x5cGhfaGludHNfcmVzY2FsZSggaGludHMsIChBRl9TdHlsZU1ldHJpY3MpbWV0cmljcyApOwogCiAgICAgLyoKLSAgICAgKiAgY29ycmVjdCB4X3NjYWxlIGFuZCB5X3NjYWxlIHdoZW4gbmVlZGVkLCBzaW5jZSB0aGV5IG1heSBoYXZlCi0gICAgICogIGJlZW4gbW9kaWZpZWQgYWZfY2prX3NjYWxlX2RpbSBhYm92ZQorICAgICAqIGNvcnJlY3QgeF9zY2FsZSBhbmQgeV9zY2FsZSB3aGVuIG5lZWRlZCwgc2luY2UgdGhleSBtYXkgaGF2ZQorICAgICAqIGJlZW4gbW9kaWZpZWQgYWZfY2prX3NjYWxlX2RpbSBhYm92ZQogICAgICAqLwogICAgIGhpbnRzLT54X3NjYWxlID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uc2NhbGU7CiAgICAgaGludHMtPnhfZGVsdGEgPSBtZXRyaWNzLT5heGlzW0FGX0RJTUVOU0lPTl9IT1JaXS5kZWx0YTsKQEAgLTEzODQsMjEgKzE0MTAsMjEgQEAKICAgICBvdGhlcl9mbGFncyAgPSAwOwogCiAgICAgLyoKLSAgICAgKiAgV2Ugc25hcCB0aGUgd2lkdGggb2YgdmVydGljYWwgc3RlbXMgZm9yIHRoZSBtb25vY2hyb21lIGFuZAotICAgICAqICBob3Jpem9udGFsIExDRCByZW5kZXJpbmcgdGFyZ2V0cyBvbmx5LgorICAgICAqIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKKyAgICAgKiBob3Jpem9udGFsIExDRCByZW5kZXJpbmcgdGFyZ2V0cyBvbmx5LgogICAgICAqLwogICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9NT05PIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICkKICAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX0hPUlpfU05BUDsKIAogICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIGhvcml6b250YWwgc3RlbXMgZm9yIHRoZSBtb25vY2hyb21lIGFuZAotICAgICAqICB2ZXJ0aWNhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KKyAgICAgKiBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKKyAgICAgKiB2ZXJ0aWNhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICkKICAgICAgIG90aGVyX2ZsYWdzIHw9IEFGX0xBVElOX0hJTlRTX1ZFUlRfU05BUDsKIAogICAgIC8qCi0gICAgICogIFdlIGFkanVzdCBzdGVtcyB0byBmdWxsIHBpeGVscyB1bmxlc3MgaW4gYGxpZ2h0JyBvciBgbGNkJyBtb2RlLgorICAgICAqIFdlIGFkanVzdCBzdGVtcyB0byBmdWxsIHBpeGVscyB1bmxlc3MgaW4gYGxpZ2h0JyBvciBgbGNkJyBtb2RlLgogICAgICAqLwogICAgIGlmICggbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MSUdIVCAmJiBtb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xDRCApCiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19TVEVNX0FESlVTVDsKQEAgLTE2MTcsNyArMTY0Myw3IEBACiAKICAgICBzdGVtX2VkZ2UtPnBvcyA9IGJhc2VfZWRnZS0+cG9zICsgZml0dGVkX3dpZHRoOwogCi0gICAgRlRfVFJBQ0U1KCggIiAgQ0pLTElOSzogZWRnZSAlZCBAJWQgKG9wb3M9JS4yZikgbGlua2VkIHRvICUuMmYsIgorICAgIEZUX1RSQUNFNSgoICIgIENKS0xJTks6IGVkZ2UgJWxkIEAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gJS4yZiwiCiAgICAgICAgICAgICAgICAgIiBkaXN0IHdhcyAlLjJmLCBub3cgJS4yZlxuIiwKICAgICAgICAgICAgICAgICBzdGVtX2VkZ2UgLSBoaW50cy0+YXhpc1tkaW1dLmVkZ2VzLCBzdGVtX2VkZ2UtPmZwb3MsCiAgICAgICAgICAgICAgICAgc3RlbV9lZGdlLT5vcG9zIC8gNjQuMCwgc3RlbV9lZGdlLT5wb3MgLyA2NC4wLApAQCAtMTgzOSw3ICsxODY1LDcgQEAKICAgICAgICAgICBjb250aW51ZTsKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIEZUX1RSQUNFNSgoICIgIENKS0JMVUU6IGVkZ2UgJWQgQCVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gJS4yZiwiCisgICAgICAgIEZUX1RSQUNFNSgoICIgIENKS0JMVUU6IGVkZ2UgJWxkIEAlZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICUuMmYsIgogICAgICAgICAgICAgICAgICAgICAiIHdhcyAlLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICBlZGdlMSAtIGVkZ2VzLCBlZGdlMS0+ZnBvcywgZWRnZTEtPm9wb3MgLyA2NC4wLAogICAgICAgICAgICAgICAgICAgICBibHVlLT5maXQgLyA2NC4wLCBlZGdlMS0+cG9zIC8gNjQuMCApKTsKQEAgLTE5MDMsNyArMTkyOSw3IEBACiAgICAgICAvKiB0aGlzIHNob3VsZCBub3QgaGFwcGVuLCBidXQgaXQncyBiZXR0ZXIgdG8gYmUgc2FmZSAqLwogICAgICAgaWYgKCBlZGdlMi0+Ymx1ZV9lZGdlICkKICAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U1KCggIkFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyLWVkZ2VzICkpOworICAgICAgICBGVF9UUkFDRTUoKCAiQVNTRVJUSU9OIEZBSUxFRCBmb3IgZWRnZSAlbGRcbiIsIGVkZ2UyLWVkZ2VzICkpOwogCiAgICAgICAgIGFmX2Nqa19hbGlnbl9saW5rZWRfZWRnZSggaGludHMsIGRpbSwgZWRnZTIsIGVkZ2UgKTsKICAgICAgICAgZWRnZS0+ZmxhZ3MgfD0gQUZfRURHRV9ET05FOwpAQCAtMjA5NCw4ICsyMTIwLDggQEAKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIC8qCi0gICAgICogIG5vdyBoaW50IHRoZSByZW1haW5pbmcgZWRnZXMgKHNlcmlmcyBhbmQgc2luZ2xlKSBpbiBvcmRlcgotICAgICAqICB0byBjb21wbGV0ZSBvdXIgcHJvY2Vzc2luZworICAgICAqIG5vdyBoaW50IHRoZSByZW1haW5pbmcgZWRnZXMgKHNlcmlmcyBhbmQgc2luZ2xlKSBpbiBvcmRlcgorICAgICAqIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCiAgICAgICovCiAgICAgZm9yICggZWRnZSA9IGVkZ2VzOyBlZGdlIDwgZWRnZV9saW1pdDsgZWRnZSsrICkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmNqay5oIGIvc3JjL2F1dG9maXQvYWZjamsuaAppbmRleCBkMjI5YzBjLi5mZDBmNDUxIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmNqay5oCisrKyBiL3NyYy9hdXRvZml0L2FmY2prLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmY2prLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBDSksgd3JpdGluZyBzeXN0ZW0gKHNwZWNpZmljYXRpb24pLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmY2prLmgKKyAqCisgKiAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIENKSyB3cml0aW5nIHN5c3RlbSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEFGQ0pLX0hfCkBAIC00MSw5ICs0MSw5IEBACiAKIAogICAvKgotICAgKiAgQ0pLIGdseXBocyB0ZW5kIHRvIGZpbGwgdGhlIHNxdWFyZS4gIFNvIHdlIGhhdmUgYm90aCB2ZXJ0aWNhbCBhbmQKLSAgICogIGhvcml6b250YWwgYmx1ZSB6b25lcy4gIEJ1dCBzb21lIGdseXBocyBoYXZlIGZsYXQgYm91bmRpbmcgc3Ryb2tlcyB0aGF0Ci0gICAqICBsZWF2ZSBzb21lIHNwYWNlIGJldHdlZW4gbmVpZ2hib3VyIGdseXBocy4KKyAgICogQ0pLIGdseXBocyB0ZW5kIHRvIGZpbGwgdGhlIHNxdWFyZS4gIFNvIHdlIGhhdmUgYm90aCB2ZXJ0aWNhbCBhbmQKKyAgICogaG9yaXpvbnRhbCBibHVlIHpvbmVzLiAgQnV0IHNvbWUgZ2x5cGhzIGhhdmUgZmxhdCBib3VuZGluZyBzdHJva2VzIHRoYXQKKyAgICogbGVhdmUgc29tZSBzcGFjZSBiZXR3ZWVuIG5laWdoYm91ciBnbHlwaHMuCiAgICAqLwogCiAjZGVmaW5lIEFGX0NKS19JU19UT1BfQkxVRSggYiApIFwKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmY292ZXIuaCBiL3NyYy9hdXRvZml0L2FmY292ZXIuaAppbmRleCA2ZWViOGZjLi4wMzA4NWFkIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZmNvdmVyLmgKKysrIGIvc3JjL2F1dG9maXQvYWZjb3Zlci5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmNvdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgY292ZXJhZ2VzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmNvdmVyLmgKKyAqCisgKiAgIEF1dG8tZml0dGVyIGNvdmVyYWdlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICAgLyogVGhpcyBoZWFkZXIgZmlsZSBjYW4gYmUgaW5jbHVkZWQgbXVsdGlwbGUgdGltZXMuICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmR1bW15LmMgYi9zcmMvYXV0b2ZpdC9hZmR1bW15LmMKaW5kZXggZjMwYzUxNy4uNzdkMzFkZiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZkdW1teS5jCisrKyBiL3NyYy9hdXRvZml0L2FmZHVtbXkuYwpAQCAtMSwyMCArMSwyMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZkdW1teS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGR1bW15IHJvdXRpbmVzIHRvIGJlIHVzZWQgaWYgbm8gaGludGluZyBzaG91bGQgYmUgICAgICAgICovCi0vKiAgICBwZXJmb3JtZWQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmZHVtbXkuYworICoKKyAqICAgQXV0by1maXR0ZXIgZHVtbXkgcm91dGluZXMgdG8gYmUgdXNlZCBpZiBubyBoaW50aW5nIHNob3VsZCBiZQorICogICBwZXJmb3JtZWQgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgImFmZHVtbXkuaCIKQEAgLTM4LDEzICszOCwxNSBAQAogCiAKICAgc3RhdGljIEZUX0Vycm9yCi0gIGFmX2R1bW15X2hpbnRzX2FwcGx5KCBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFGX0dseXBoSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgb3V0bGluZSApCisgIGFmX2R1bW15X2hpbnRzX2FwcGx5KCBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgICBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcyApCiAgIHsKICAgICBGVF9FcnJvciAgZXJyb3I7CiAKICAgICBGVF9VTlVTRUQoIGdseXBoX2luZGV4ICk7CisgICAgRlRfVU5VU0VEKCBtZXRyaWNzICk7CiAKIAogICAgIGVycm9yID0gYWZfZ2x5cGhfaGludHNfcmVsb2FkKCBoaW50cywgb3V0bGluZSApOwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZkdW1teS5oIGIvc3JjL2F1dG9maXQvYWZkdW1teS5oCmluZGV4IGIzODJhY2QuLmVmZDc5OWUgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmZHVtbXkuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmR1bW15LmgKQEAgLTEsMjAgKzEsMjAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmZHVtbXkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBkdW1teSByb3V0aW5lcyB0byBiZSB1c2VkIGlmIG5vIGhpbnRpbmcgc2hvdWxkIGJlICAgICAgICAqLwotLyogICAgcGVyZm9ybWVkIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmR1bW15LmgKKyAqCisgKiAgIEF1dG8tZml0dGVyIGR1bW15IHJvdXRpbmVzIHRvIGJlIHVzZWQgaWYgbm8gaGludGluZyBzaG91bGQgYmUKKyAqICAgcGVyZm9ybWVkIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZEVU1NWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZlcnJvcnMuaCBiL3NyYy9hdXRvZml0L2FmZXJyb3JzLmgKaW5kZXggZTVkZTU0My4uZjkwODk5OSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZlcnJvcnMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmVycm9ycy5oCkBAIC0xLDMyICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmVycm9ycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0b2ZpdHRlciBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmVycm9ycy5oCisgKgorICogICBBdXRvZml0dGVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQXV0b2ZpdHRlciBlcnJvciBlbnVtZXJhdGlvbiAgICAgICAgICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBBdXRvZml0dGVyIGVycm9yIGVudW1lcmF0aW9uCisgICAqIGNvbnN0YW50cy4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgQUZFUlJPUlNfSF8KICNkZWZpbmUgQUZFUlJPUlNfSF8KIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQUZfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0F1dG9maXQKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAjZW5kaWYgLyogQUZFUlJPUlNfSF8gKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuYyBiL3NyYy9hdXRvZml0L2FmZ2xvYmFsLmMKaW5kZXggM2QwOWM1My4uZDUxMjk0MiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuYworKysgYi9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5jCkBAIC0xLDM1ICsxLDM1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmdsb2JhbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgcm91dGluZXMgdG8gY29tcHV0ZSBnbG9iYWwgaGludGluZyB2YWx1ZXMgKGJvZHkpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmdsb2JhbC5jCisgKgorICogICBBdXRvLWZpdHRlciByb3V0aW5lcyB0byBjb21wdXRlIGdsb2JhbCBoaW50aW5nIHZhbHVlcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZnbG9iYWwuaCIKICNpbmNsdWRlICJhZnJhbmdlcy5oIgogI2luY2x1ZGUgImFmc2hhcGVyLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2FmZ2xvYmFsCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgYWZnbG9iYWwKIAogCiAgIC8qIGdldCB3cml0aW5nIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMgKi8KQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICJhZndydHN5cy5oIgogCiAjaW5jbHVkZSAiYWZlcnJvcnMuaCIKLSNpbmNsdWRlICJhZnBpYy5oIgogCiAKICN1bmRlZiAgU0NSSVBUCkBAIC02Nyw4ICs2Niw2IEBACiAjaW5jbHVkZSAiYWZzdHlsZXMuaCIKIAogCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICN1bmRlZiAgV1JJVElOR19TWVNURU0KICNkZWZpbmUgV1JJVElOR19TWVNURU0oIHdzLCBXUyApICAgICAgICAgICAgICAgXAogICAgICAgICAgICZhZl8gIyMgd3MgIyMgX3dyaXRpbmdfc3lzdGVtX2NsYXNzLApAQCAtMTEwLDggKzEwNyw2IEBACiAgICAgTlVMTCAgLyogZG8gbm90IHJlbW92ZSAqLwogICB9OwogCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fUElDICovCi0KIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKQEAgLTE1OSwxMiArMTU0LDEyIEBACiAgICAgfQogCiAgICAgLyogc2NhbiBlYWNoIHN0eWxlIGluIGEgVW5pY29kZSBjaGFybWFwICovCi0gICAgZm9yICggc3MgPSAwOyBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107IHNzKysgKQorICAgIGZvciAoIHNzID0gMDsgYWZfc3R5bGVfY2xhc3Nlc1tzc107IHNzKysgKQogICAgIHsKICAgICAgIEFGX1N0eWxlQ2xhc3MgICAgICAgc3R5bGVfY2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZl9zdHlsZV9jbGFzc2VzW3NzXTsKICAgICAgIEFGX1NjcmlwdENsYXNzICAgICAgc2NyaXB0X2NsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRl9TQ1JJUFRfQ0xBU1NFU19HRVRbc3R5bGVfY2xhc3MtPnNjcmlwdF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZfc2NyaXB0X2NsYXNzZXNbc3R5bGVfY2xhc3MtPnNjcmlwdF07CiAgICAgICBBRl9TY3JpcHRfVW5pUmFuZ2UgIHJhbmdlOwogCiAKQEAgLTE3Miw4ICsxNjcsOCBAQAogICAgICAgICBjb250aW51ZTsKIAogICAgICAgLyoKLSAgICAgICAqICBTY2FuIGFsbCBVbmljb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgYW5kIHNldCB0aGUgY29ycmVzcG9uZGluZwotICAgICAgICogIGdseXBoIHN0eWxlIGluZGV4LgorICAgICAgICogU2NhbiBhbGwgVW5pY29kZSBwb2ludHMgaW4gdGhlIHJhbmdlIGFuZCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAqIGdseXBoIHN0eWxlIGluZGV4LgogICAgICAgICovCiAgICAgICBpZiAoIHN0eWxlX2NsYXNzLT5jb3ZlcmFnZSA9PSBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKICAgICAgIHsKQEAgLTI0Niw5ICsyNDEsOSBAQAogICAgIH0KIAogICAgIC8qIGhhbmRsZSB0aGUgcmVtYWluaW5nIGRlZmF1bHQgT3BlblR5cGUgZmVhdHVyZXMgLi4uICovCi0gICAgZm9yICggc3MgPSAwOyBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107IHNzKysgKQorICAgIGZvciAoIHNzID0gMDsgYWZfc3R5bGVfY2xhc3Nlc1tzc107IHNzKysgKQogICAgIHsKLSAgICAgIEFGX1N0eWxlQ2xhc3MgIHN0eWxlX2NsYXNzID0gQUZfU1RZTEVfQ0xBU1NFU19HRVRbc3NdOworICAgICAgQUZfU3R5bGVDbGFzcyAgc3R5bGVfY2xhc3MgPSBhZl9zdHlsZV9jbGFzc2VzW3NzXTsKIAogCiAgICAgICBpZiAoIHN0eWxlX2NsYXNzLT5jb3ZlcmFnZSA9PSBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKQEAgLTI1Niw3ICsyNTEsNyBAQAogICAgIH0KIAogICAgIC8qIC4uLiBhbmQgZmluYWxseSB0aGUgZGVmYXVsdCBPcGVuVHlwZSBmZWF0dXJlcyBvZiB0aGUgZGVmYXVsdCBzY3JpcHQgKi8KLSAgICBhZl9zaGFwZXJfZ2V0X2NvdmVyYWdlKCBnbG9iYWxzLCBBRl9TVFlMRV9DTEFTU0VTX0dFVFtkZmx0XSwgZ3N0eWxlcywgMSApOworICAgIGFmX3NoYXBlcl9nZXRfY292ZXJhZ2UoIGdsb2JhbHMsIGFmX3N0eWxlX2NsYXNzZXNbZGZsdF0sIGdzdHlsZXMsIDEgKTsKIAogICAgIC8qIG1hcmsgQVNDSUkgZGlnaXRzICovCiAgICAgZm9yICggaSA9IDB4MzA7IGkgPD0gMHgzOTsgaSsrICkKQEAgLTI3MCw4ICsyNjUsOCBAQAogCiAgIEV4aXQ6CiAgICAgLyoKLSAgICAgKiAgQnkgZGVmYXVsdCwgYWxsIHVuY292ZXJlZCBnbHlwaHMgYXJlIHNldCB0byB0aGUgZmFsbGJhY2sgc3R5bGUuCi0gICAgICogIFhYWDogU2hvdWxkbid0IHdlIGRpc2FibGUgaGludGluZyBvciBkbyBzb21ldGhpbmcgc2ltaWxhcj8KKyAgICAgKiBCeSBkZWZhdWx0LCBhbGwgdW5jb3ZlcmVkIGdseXBocyBhcmUgc2V0IHRvIHRoZSBmYWxsYmFjayBzdHlsZS4KKyAgICAgKiBYWFg6IFNob3VsZG4ndCB3ZSBkaXNhYmxlIGhpbnRpbmcgb3IgZG8gc29tZXRoaW5nIHNpbWlsYXI/CiAgICAgICovCiAgICAgaWYgKCBnbG9iYWxzLT5tb2R1bGUtPmZhbGxiYWNrX3N0eWxlICE9IEFGX1NUWUxFX1VOQVNTSUdORUQgKQogICAgIHsKQEAgLTI5NSw5ICsyOTAsOSBAQAogICAgICAgICAgICAgICAgICI9PT09PT09PT09PT09PVxuIgogICAgICAgICAgICAgICAgICJcbiIgKSk7CiAKLSAgICBmb3IgKCBzcyA9IDA7IEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsgc3MrKyApCisgICAgZm9yICggc3MgPSAwOyBhZl9zdHlsZV9jbGFzc2VzW3NzXTsgc3MrKyApCiAgICAgewotICAgICAgQUZfU3R5bGVDbGFzcyAgc3R5bGVfY2xhc3MgPSBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107CisgICAgICBBRl9TdHlsZUNsYXNzICBzdHlsZV9jbGFzcyA9IGFmX3N0eWxlX2NsYXNzZXNbc3NdOwogICAgICAgRlRfVUludCAgICAgICAgY291bnQgICAgICAgPSAwOwogICAgICAgRlRfTG9uZyAgICAgICAgaWR4OwogCkBAIC0zMTEsNyArMzA2LDcgQEAKICAgICAgICAgICBpZiAoICEoIGNvdW50ICUgMTAgKSApCiAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiICIgKSk7CiAKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgaWR4ICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWxkIiwgaWR4ICkpOwogICAgICAgICAgIGNvdW50Kys7CiAKICAgICAgICAgICBpZiAoICEoIGNvdW50ICUgMTAgKSApCkBAIC0zOTcsOSArMzkyLDkgQEAKICAgICAgICAgaWYgKCBnbG9iYWxzLT5tZXRyaWNzW25uXSApCiAgICAgICAgIHsKICAgICAgICAgICBBRl9TdHlsZUNsYXNzICAgICAgICAgIHN0eWxlX2NsYXNzID0KLSAgICAgICAgICAgIEFGX1NUWUxFX0NMQVNTRVNfR0VUW25uXTsKKyAgICAgICAgICAgIGFmX3N0eWxlX2NsYXNzZXNbbm5dOwogICAgICAgICAgIEFGX1dyaXRpbmdTeXN0ZW1DbGFzcyAgd3JpdGluZ19zeXN0ZW1fY2xhc3MgPQotICAgICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVRbc3R5bGVfY2xhc3MtPndyaXRpbmdfc3lzdGVtXTsKKyAgICAgICAgICAgIGFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXNbc3R5bGVfY2xhc3MtPndyaXRpbmdfc3lzdGVtXTsKIAogCiAgICAgICAgICAgaWYgKCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfbWV0cmljc19kb25lICkKQEAgLTQ0OCw4ICs0NDMsOSBAQAogICAgICAgc3R5bGUgPSAoQUZfU3R5bGUpKCBnbG9iYWxzLT5nbHlwaF9zdHlsZXNbZ2luZGV4XSAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGX1NUWUxFX1VOQVNTSUdORUQgICAgICAgICAgICk7CiAKLSAgICBzdHlsZV9jbGFzcyAgICAgICAgICA9IEFGX1NUWUxFX0NMQVNTRVNfR0VUW3N0eWxlXTsKLSAgICB3cml0aW5nX3N5c3RlbV9jbGFzcyA9IEFGX1dSSVRJTkdfU1lTVEVNX0NMQVNTRVNfR0VUCisgIEFnYWluOgorICAgIHN0eWxlX2NsYXNzICAgICAgICAgID0gYWZfc3R5bGVfY2xhc3Nlc1tzdHlsZV07CisgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MgPSBhZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZV9jbGFzcy0+d3JpdGluZ19zeXN0ZW1dOwogCiAgICAgbWV0cmljcyA9IGdsb2JhbHMtPm1ldHJpY3Nbc3R5bGVdOwpAQCAtNDc1LDYgKzQ3MSwxNiBAQAogICAgICAgICAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MtPnN0eWxlX21ldHJpY3NfZG9uZSggbWV0cmljcyApOwogCiAgICAgICAgICAgRlRfRlJFRSggbWV0cmljcyApOworCisgICAgICAgICAgLyogaW50ZXJuYWwgZXJyb3IgY29kZSAtMSBpbmRpY2F0ZXMgICAqLworICAgICAgICAgIC8qIHRoYXQgbm8gYmx1ZSB6b25lcyBoYXZlIGJlZW4gZm91bmQgKi8KKyAgICAgICAgICBpZiAoIGVycm9yID09IC0xICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdHlsZSA9IChBRl9TdHlsZSkoIGdsb2JhbHMtPmdseXBoX3N0eWxlc1tnaW5kZXhdICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfU1RZTEVfVU5BU1NJR05FRCAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGdvdG8gQWdhaW47CisgICAgICAgICAgfQorCiAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAgICAgICB9CkBAIC00OTQsOSArNTAwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4ICkKICAgewogICAgIGlmICggZ2luZGV4IDwgKEZUX1VMb25nKWdsb2JhbHMtPmdseXBoX2NvdW50ICkKLSAgICAgIHJldHVybiAoRlRfQm9vbCkoIGdsb2JhbHMtPmdseXBoX3N0eWxlc1tnaW5kZXhdICYgQUZfRElHSVQgKTsKKyAgICAgIHJldHVybiBGVF9CT09MKCBnbG9iYWxzLT5nbHlwaF9zdHlsZXNbZ2luZGV4XSAmIEFGX0RJR0lUICk7CiAKLSAgICByZXR1cm4gKEZUX0Jvb2wpMDsKKyAgICByZXR1cm4gRlRfQk9PTCggMCApOwogICB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuaCBiL3NyYy9hdXRvZml0L2FmZ2xvYmFsLmgKaW5kZXggNDg5ZWQ0Ni4uZmVjZjdhZiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZnbG9iYWwuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmdsb2JhbC5oCkBAIC0xLDIwICsxLDIwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmdsb2JhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgcm91dGluZXMgdG8gY29tcHV0ZSBnbG9iYWwgaGludGluZyB2YWx1ZXMgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZnbG9iYWwuaAorICoKKyAqICAgQXV0by1maXR0ZXIgcm91dGluZXMgdG8gY29tcHV0ZSBnbG9iYWwgaGludGluZyB2YWx1ZXMKKyAqICAgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBBRkdMT0JBTF9IXwpAQCAtNjAsOCArNjAsOCBAQAogCiAKICAgLyoKLSAgICogIERlZmF1bHQgdmFsdWVzIGFuZCBmbGFncyBmb3IgYm90aCBhdXRvZml0dGVyIGdsb2JhbHMgKGZvdW5kIGluCi0gICAqICBBRl9Nb2R1bGVSZWMpIGFuZCBmYWNlIGdsb2JhbHMgKGluIEFGX0ZhY2VHbG9iYWxzUmVjKS4KKyAgICogRGVmYXVsdCB2YWx1ZXMgYW5kIGZsYWdzIGZvciBib3RoIGF1dG9maXR0ZXIgZ2xvYmFscyAoZm91bmQgaW4KKyAgICogQUZfTW9kdWxlUmVjKSBhbmQgZmFjZSBnbG9iYWxzIChpbiBBRl9GYWNlR2xvYmFsc1JlYykuCiAgICAqLwogCiAgIC8qIGluZGV4IG9mIGZhbGxiYWNrIHN0eWxlIGluIGBhZl9zdHlsZV9jbGFzc2VzJyAqLwpAQCAtOTgsOCArOTgsOCBAQAogCiAKICAgLyoKLSAgICogIE5vdGUgdGhhdCBnbHlwaF9zdHlsZXNbXSBtYXBzIGVhY2ggZ2x5cGggdG8gYW4gaW5kZXggaW50byB0aGUKLSAgICogIGBhZl9zdHlsZV9jbGFzc2VzJyBhcnJheS4KKyAgICogTm90ZSB0aGF0IGdseXBoX3N0eWxlc1tdIG1hcHMgZWFjaCBnbHlwaCB0byBhbiBpbmRleCBpbnRvIHRoZQorICAgKiBgYWZfc3R5bGVfY2xhc3NlcycgYXJyYXkuCiAgICAqCiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgQUZfRmFjZUdsb2JhbHNSZWNfCkBAIC0xNDAsOCArMTQwLDggQEAKIAogCiAgIC8qCi0gICAqICBtb2RlbCB0aGUgZ2xvYmFsIGhpbnRzIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZSwgZGVjb21wb3NlZCBpbnRvCi0gICAqICBzdHlsZS1zcGVjaWZpYyBpdGVtcworICAgKiBtb2RlbCB0aGUgZ2xvYmFsIGhpbnRzIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZSwgZGVjb21wb3NlZCBpbnRvCisgICAqIHN0eWxlLXNwZWNpZmljIGl0ZW1zCiAgICAqLwogCiAgIEZUX0xPQ0FMKCBGVF9FcnJvciApCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmhpbnRzLmMgYi9zcmMvYXV0b2ZpdC9hZmhpbnRzLmMKaW5kZXggMDY2NmRiYy4uYThlMDA4OSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZoaW50cy5jCisrKyBiL3NyYy9hdXRvZml0L2FmaGludHMuYwpAQCAtMSwzNSArMSwzNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZoaW50cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZoaW50cy5jCisgKgorICogICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJhZmhpbnRzLmgiCiAjaW5jbHVkZSAiYWZlcnJvcnMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9hZmhpbnRzCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgYWZoaW50cwogCiAKICAgLyogR2V0IG5ldyBzZWdtZW50IGZvciBnaXZlbiBheGlzLiAqLwpAQCAtMjk3LDYgKzI5NywxOSBAQAogICB9CiAKIAorICBzdGF0aWMgaW50CisgIGFmX2dldF9zdHJvbmdfZWRnZV9pbmRleCggQUZfR2x5cGhIaW50cyAgaGludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZfRWRnZSogICAgICAgc3Ryb25nX2VkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIGRpbWVuc2lvbiApCisgIHsKKyAgICBBRl9BeGlzSGludHMgIGF4aXMgID0gJmhpbnRzLT5heGlzW2RpbWVuc2lvbl07CisgICAgQUZfRWRnZSAgICAgICBlZGdlcyA9IGF4aXMtPmVkZ2VzOworCisKKyAgICByZXR1cm4gQUZfSU5ERVhfTlVNKCBzdHJvbmdfZWRnZXNbZGltZW5zaW9uXSwgZWRnZXMgKTsKKyAgfQorCisKICNpZmRlZiBfX2NwbHVzcGx1cwogICBleHRlcm4gIkMiIHsKICNlbmRpZgpAQCAtMzE3LDggKzMzMCwxMCBAQAogICAgIHsKICAgICAgIEFGX0RVTVAoKCAiICBpbmRleCAgaGVkZ2UgIGhzZWcgIHZlZGdlICB2c2VnICBmbGFncyAiCiAgICAgICAgICAgICAgLyogIiAgWFhYWFggIFhYWFhYIFhYWFhYICBYWFhYWCBYWFhYWCAgWFhYWFhYIiAqLwotICAgICAgICAgICAgICAgICIgIHhvcmcgIHlvcmcgIHhzY2FsZSAgeXNjYWxlICAgeGZpdCAgICB5Zml0IiApKTsKKyAgICAgICAgICAgICAgICAiICB4b3JnICB5b3JnICB4c2NhbGUgIHlzY2FsZSAgIHhmaXQgICAgeWZpdCAiCiAgICAgICAgICAgICAgLyogIiBYWFhYWCBYWFhYWCBYWFhYLlhYIFhYWFguWFggWFhYWC5YWCBYWFhYLlhYIiAqLworICAgICAgICAgICAgICAgICIgIGhiZWYgIGhhZnQgIHZiZWYgIHZhZnQiICkpOworICAgICAgICAgICAgIC8qICIgWFhYWFggWFhYWFggWFhYWFggWFhYWFgiICovCiAgICAgfQogICAgIGVsc2UKICAgICAgIEFGX0RVTVAoKCAiICAobm9uZSlcbiIgKSk7CkBAIC0zMzAsNiArMzQ1LDcgQEAKICAgICAgIGludCAgc2VnbWVudF9pZHhfMSA9IGFmX2dldF9zZWdtZW50X2luZGV4KCBoaW50cywgcG9pbnRfaWR4LCAxICk7CiAKICAgICAgIGNoYXIgIGJ1ZjFbMTZdLCBidWYyWzE2XSwgYnVmM1sxNl0sIGJ1ZjRbMTZdOworICAgICAgY2hhciAgYnVmNVsxNl0sIGJ1ZjZbMTZdLCBidWY3WzE2XSwgYnVmOFsxNl07CiAKIAogICAgICAgLyogaW5zZXJ0IGV4dHJhIG5ld2xpbmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNvbnRvdXIgKi8KQEAgLTM0MCw3ICszNTYsOCBAQAogICAgICAgfQogCiAgICAgICBBRl9EVU1QKCggIiAgJTVkICAlNXMgJTVzICAlNXMgJTVzICAlcyIKLSAgICAgICAgICAgICAgICAiICU1ZCAlNWQgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmZcbiIsCisgICAgICAgICAgICAgICAgIiAlNWQgJTVkICU3LjJmICU3LjJmICU3LjJmICU3LjJmIgorICAgICAgICAgICAgICAgICIgJTVzICU1cyAlNXMgJTVzXG4iLAogICAgICAgICAgICAgICAgIHBvaW50X2lkeCwKICAgICAgICAgICAgICAgICBhZl9wcmludF9pZHgoIGJ1ZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZl9nZXRfZWRnZV9pbmRleCggaGludHMsIHNlZ21lbnRfaWR4XzEsIDEgKSApLApAQCAtMzU5LDcgKzM3NiwyMCBAQAogICAgICAgICAgICAgICAgIHBvaW50LT5veCAvIDY0LjAsCiAgICAgICAgICAgICAgICAgcG9pbnQtPm95IC8gNjQuMCwKICAgICAgICAgICAgICAgICBwb2ludC0+eCAvIDY0LjAsCi0gICAgICAgICAgICAgICAgcG9pbnQtPnkgLyA2NC4wICkpOworICAgICAgICAgICAgICAgIHBvaW50LT55IC8gNjQuMCwKKworICAgICAgICAgICAgICAgIGFmX3ByaW50X2lkeCggYnVmNSwgYWZfZ2V0X3N0cm9uZ19lZGdlX2luZGV4KCBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQtPmJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSApICksCisgICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWY2LCBhZl9nZXRfc3Ryb25nX2VkZ2VfaW5kZXgoIGhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC0+YWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKSApLAorICAgICAgICAgICAgICAgIGFmX3ByaW50X2lkeCggYnVmNywgYWZfZ2V0X3N0cm9uZ19lZGdlX2luZGV4KCBoaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQtPmJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApICksCisgICAgICAgICAgICAgICAgYWZfcHJpbnRfaWR4KCBidWY4LCBhZl9nZXRfc3Ryb25nX2VkZ2VfaW5kZXgoIGhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludC0+YWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKSApICkpOwogICAgIH0KICAgICBBRl9EVU1QKCggIlxuIiApKTsKICAgfQpAQCAtNTE5LDcgKzU0OSw3IEBACiAgICAgKm9mZnNldCAgPSAoIGRpbSA9PSBBRl9ESU1FTlNJT05fSE9SWiApID8gc2VnLT5maXJzdC0+ZngKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBzZWctPmZpcnN0LT5meTsKICAgICBpZiAoIHNlZy0+ZWRnZSApCi0gICAgICAqaXNfYmx1ZSA9IChGVF9Cb29sKSggc2VnLT5lZGdlLT5ibHVlX2VkZ2UgIT0gMCApOworICAgICAgKmlzX2JsdWUgPSBGVF9CT09MKCBzZWctPmVkZ2UtPmJsdWVfZWRnZSApOwogICAgIGVsc2UKICAgICAgICppc19ibHVlID0gRkFMU0U7CiAKQEAgLTU1OCw4ICs1ODgsOCBAQAogCiAKICAgICAgIC8qCi0gICAgICAgKiAgbm90ZTogQUZfRElNRU5TSU9OX0hPUlogY29ycmVzcG9uZHMgdG8gX3ZlcnRpY2FsXyBlZGdlcwotICAgICAgICogICAgICAgIHNpbmNlIHRoZXkgaGF2ZSBhIGNvbnN0YW50IFggY29vcmRpbmF0ZS4KKyAgICAgICAqIG5vdGU6IEFGX0RJTUVOU0lPTl9IT1JaIGNvcnJlc3BvbmRzIHRvIF92ZXJ0aWNhbF8gZWRnZXMKKyAgICAgICAqICAgICAgIHNpbmNlIHRoZXkgaGF2ZSBhIGNvbnN0YW50IFggY29vcmRpbmF0ZS4KICAgICAgICAqLwogICAgICAgaWYgKCBkaW1lbnNpb24gPT0gQUZfRElNRU5TSU9OX0hPUlogKQogICAgICAgICBBRl9EVU1QKCggIlRhYmxlIG9mICVzIGVkZ2VzICgxcHg9JS4yZnUsIDEwdT0lLjJmcHgpOlxuIiwKQEAgLTY4MSw4ICs3MTEsOCBAQAogICAgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7CiAKICAgICAvKgotICAgICAqICBub3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBmcmVlIHRoZSBzZWdtZW50IGFuZCBlZGdlCi0gICAgICogIGJ1ZmZlcnMgc2luY2UgdGhleSBhcmUgcmVhbGx5IHdpdGhpbiB0aGUgaGludHMtPnBvaW50cyBhcnJheQorICAgICAqIG5vdGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGZyZWUgdGhlIHNlZ21lbnQgYW5kIGVkZ2UKKyAgICAgKiBidWZmZXJzIHNpbmNlIHRoZXkgYXJlIHJlYWxseSB3aXRoaW4gdGhlIGhpbnRzLT5wb2ludHMgYXJyYXkKICAgICAgKi8KICAgICBmb3IgKCBkaW0gPSAwOyBkaW0gPCBBRl9ESU1FTlNJT05fTUFYOyBkaW0rKyApCiAgICAgewpAQCAtNzc2LDkgKzgwNiw5IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiAgdGhlbiByZWFsbG9jYXRlIHRoZSBwb2ludHMgYXJyYXlzIGlmIG5lY2Vzc2FyeSAtLQotICAgICAqICBub3RlIHRoYXQgd2UgcmVzZXJ2ZSB0d28gYWRkaXRpb25hbCBwb2ludCBwb3NpdGlvbnMsIHVzZWQgdG8KLSAgICAgKiAgaGludCBtZXRyaWNzIGFwcHJvcHJpYXRlbHkKKyAgICAgKiB0aGVuIHJlYWxsb2NhdGUgdGhlIHBvaW50cyBhcnJheXMgaWYgbmVjZXNzYXJ5IC0tCisgICAgICogbm90ZSB0aGF0IHdlIHJlc2VydmUgdHdvIGFkZGl0aW9uYWwgcG9pbnQgcG9zaXRpb25zLCB1c2VkIHRvCisgICAgICogaGludCBtZXRyaWNzIGFwcHJvcHJpYXRlbHkKICAgICAgKi8KICAgICBuZXdfbWF4ID0gKEZUX1VJbnQpKCBvdXRsaW5lLT5uX3BvaW50cyArIDIgKTsKICAgICBvbGRfbWF4ID0gKEZUX1VJbnQpaGludHMtPm1heF9wb2ludHM7CkBAIC04OTgsNiArOTI4LDE0IEBACiAgICAgICAgICAgICAgIHByZXYgICAgID0gZW5kOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KKworI2lmZGVmIEZUX0RFQlVHX0FVVE9GSVQKKyAgICAgICAgICBwb2ludC0+YmVmb3JlWzBdID0gTlVMTDsKKyAgICAgICAgICBwb2ludC0+YmVmb3JlWzFdID0gTlVMTDsKKyAgICAgICAgICBwb2ludC0+YWZ0ZXJbMF0gID0gTlVMTDsKKyAgICAgICAgICBwb2ludC0+YWZ0ZXJbMV0gID0gTlVMTDsKKyNlbmRpZgorCiAgICAgICAgIH0KICAgICAgIH0KIApAQCAtOTE4LDE1ICs5NTYsMTUgQEAKIAogICAgICAgewogICAgICAgICAvKgotICAgICAgICAgKiAgQ29tcHV0ZSBkaXJlY3Rpb25zIG9mIGBpbicgYW5kIGBvdXQnIHZlY3RvcnMuCisgICAgICAgICAqIENvbXB1dGUgZGlyZWN0aW9ucyBvZiBgaW4nIGFuZCBgb3V0JyB2ZWN0b3JzLgogICAgICAgICAgKgotICAgICAgICAgKiAgTm90ZSB0aGF0IGRpc3RhbmNlcyBiZXR3ZWVuIHBvaW50cyB0aGF0IGFyZSB2ZXJ5IG5lYXIgdG8gZWFjaAotICAgICAgICAgKiAgb3RoZXIgYXJlIGFjY3VtdWxhdGVkLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBhdXRvLWhpbnRlciBlaXRoZXIKLSAgICAgICAgICogIHByZXBlbmRzIHRoZSBzbWFsbCB2ZWN0b3JzIGJldHdlZW4gbmVhciBwb2ludHMgdG8gdGhlIGZpcnN0Ci0gICAgICAgICAqICBub24tbmVhciB2ZWN0b3IsIG9yIHRoZSBzdW0gb2Ygc21hbGwgdmVjdG9yIGxlbmd0aHMgZXhjZWVkcyBhCi0gICAgICAgICAqICB0aHJlc2hvbGQsIHRodXMgYGdyb3VwaW5nJyB0aGUgc21hbGwgdmVjdG9ycy4gIEFsbCBpbnRlcm1lZGlhdGUKLSAgICAgICAgICogIHBvaW50cyBhcmUgdGFnZ2VkIGFzIHdlYWs7IHRoZSBkaXJlY3Rpb25zIGFyZSBhZGp1c3RlZCBhbHNvIHRvCi0gICAgICAgICAqICBiZSBlcXVhbCB0byB0aGUgYWNjdW11bGF0ZWQgb25lLgorICAgICAgICAgKiBOb3RlIHRoYXQgZGlzdGFuY2VzIGJldHdlZW4gcG9pbnRzIHRoYXQgYXJlIHZlcnkgbmVhciB0byBlYWNoCisgICAgICAgICAqIG90aGVyIGFyZSBhY2N1bXVsYXRlZC4gIEluIG90aGVyIHdvcmRzLCB0aGUgYXV0by1oaW50ZXIgZWl0aGVyCisgICAgICAgICAqIHByZXBlbmRzIHRoZSBzbWFsbCB2ZWN0b3JzIGJldHdlZW4gbmVhciBwb2ludHMgdG8gdGhlIGZpcnN0CisgICAgICAgICAqIG5vbi1uZWFyIHZlY3Rvciwgb3IgdGhlIHN1bSBvZiBzbWFsbCB2ZWN0b3IgbGVuZ3RocyBleGNlZWRzIGEKKyAgICAgICAgICogdGhyZXNob2xkLCB0aHVzIGBncm91cGluZycgdGhlIHNtYWxsIHZlY3RvcnMuICBBbGwgaW50ZXJtZWRpYXRlCisgICAgICAgICAqIHBvaW50cyBhcmUgdGFnZ2VkIGFzIHdlYWs7IHRoZSBkaXJlY3Rpb25zIGFyZSBhZGp1c3RlZCBhbHNvIHRvCisgICAgICAgICAqIGJlIGVxdWFsIHRvIHRoZSBhY2N1bXVsYXRlZCBvbmUuCiAgICAgICAgICAqLwogCiAgICAgICAgIEZUX0ludCAgbmVhcl9saW1pdDIgPSAyICogbmVhcl9saW1pdCAtIDE7CkBAIC05NTYsMTIgKzk5NCwxMiBAQAogICAgICAgICAgICAgb3V0X3kgPSBwb2ludC0+ZnkgLSBwcmV2LT5meTsKIAogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBXZSB1c2UgVGF4aWNhYiBtZXRyaWNzIHRvIG1lYXN1cmUgdGhlIHZlY3RvciBsZW5ndGguCisgICAgICAgICAgICAgKiBXZSB1c2UgVGF4aWNhYiBtZXRyaWNzIHRvIG1lYXN1cmUgdGhlIHZlY3RvciBsZW5ndGguCiAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICogIE5vdGUgdGhhdCB0aGUgYWNjdW11bGF0ZWQgZGlzdGFuY2VzIHNvIGZhciBjb3VsZCBoYXZlIHRoZQotICAgICAgICAgICAgICogIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiB0aGUgZGlzdGFuY2UgbWVhc3VyZWQgaGVyZS4gIEZvciB0aGlzCi0gICAgICAgICAgICAgKiAgcmVhc29uIHdlIHVzZSBgbmVhcl9saW1pdDInIGZvciB0aGUgY29tcGFyaXNvbiB0byBnZXQgYQotICAgICAgICAgICAgICogIG5vbi1uZWFyIHBvaW50IGV2ZW4gaW4gdGhlIHdvcnN0IGNhc2UuCisgICAgICAgICAgICAgKiBOb3RlIHRoYXQgdGhlIGFjY3VtdWxhdGVkIGRpc3RhbmNlcyBzbyBmYXIgY291bGQgaGF2ZSB0aGUKKyAgICAgICAgICAgICAqIG9wcG9zaXRlIGRpcmVjdGlvbiBvZiB0aGUgZGlzdGFuY2UgbWVhc3VyZWQgaGVyZS4gIEZvciB0aGlzCisgICAgICAgICAgICAgKiByZWFzb24gd2UgdXNlIGBuZWFyX2xpbWl0MicgZm9yIHRoZSBjb21wYXJpc29uIHRvIGdldCBhCisgICAgICAgICAgICAgKiBub24tbmVhciBwb2ludCBldmVuIGluIHRoZSB3b3JzdCBjYXNlLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoIEZUX0FCUyggb3V0X3ggKSArIEZUX0FCUyggb3V0X3kgKSA+PSBuZWFyX2xpbWl0MiApCiAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTc5LDExICsxMDE3LDExIEBACiAgICAgICAgICAgY3VyciA9IGZpcnN0OwogCiAgICAgICAgICAgLyoKLSAgICAgICAgICAgKiAgV2UgYWJ1c2UgdGhlIGB1JyBhbmQgYHYnIGZpZWxkcyB0byBzdG9yZSBpbmRleCBkZWx0YXMgdG8gdGhlCi0gICAgICAgICAgICogIG5leHQgYW5kIHByZXZpb3VzIG5vbi1uZWFyIHBvaW50LCByZXNwZWN0aXZlbHkuCisgICAgICAgICAgICogV2UgYWJ1c2UgdGhlIGB1JyBhbmQgYHYnIGZpZWxkcyB0byBzdG9yZSBpbmRleCBkZWx0YXMgdG8gdGhlCisgICAgICAgICAgICogbmV4dCBhbmQgcHJldmlvdXMgbm9uLW5lYXIgcG9pbnQsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgKgotICAgICAgICAgICAqICBUbyBhdm9pZCBwcm9ibGVtcyB3aXRoIG5vdCBoYXZpbmcgbm9uLW5lYXIgcG9pbnRzLCB3ZSBwb2ludCB0bwotICAgICAgICAgICAqICBgZmlyc3QnIGJ5IGRlZmF1bHQgYXMgdGhlIG5leHQgbm9uLW5lYXIgcG9pbnQuCisgICAgICAgICAgICogVG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBub3QgaGF2aW5nIG5vbi1uZWFyIHBvaW50cywgd2UgcG9pbnQgdG8KKyAgICAgICAgICAgKiBgZmlyc3QnIGJ5IGRlZmF1bHQgYXMgdGhlIG5leHQgbm9uLW5lYXIgcG9pbnQuCiAgICAgICAgICAgICoKICAgICAgICAgICAgKi8KICAgICAgICAgICBjdXJyLT51ICA9IChGVF9Qb3MpKCBmaXJzdCAtIGN1cnIgKTsKQEAgLTEwMzUsMTIgKzEwNzMsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qCi0gICAgICAgICAqICBUaGUgbmV4dCBzdGVwIGlzIHRvIGBzaW1wbGlmeScgYW4gb3V0bGluZSdzIHRvcG9sb2d5IHNvIHRoYXQgd2UKLSAgICAgICAgICogIGNhbiBpZGVudGlmeSBsb2NhbCBleHRyZW1hIG1vcmUgcmVsaWFibHk6IEEgc2VyaWVzIG9mCi0gICAgICAgICAqICBub24taG9yaXpvbnRhbCBvciBub24tdmVydGljYWwgdmVjdG9ycyBwb2ludGluZyBpbnRvIHRoZSBzYW1lCi0gICAgICAgICAqICBxdWFkcmFudCBhcmUgaGFuZGxlZCBhcyBhIHNpbmdsZSwgbG9uZyB2ZWN0b3IuICBGcm9tIGEKLSAgICAgICAgICogIHRvcG9sb2dpY2FsIHBvaW50IG9mIHRoZSB2aWV3LCB0aGUgaW50ZXJtZWRpYXRlIHBvaW50cyBhcmUgb2Ygbm8KLSAgICAgICAgICogIGludGVyZXN0IGFuZCB0aHVzIHRhZ2dlZCBhcyB3ZWFrLgorICAgICAgICAgKiBUaGUgbmV4dCBzdGVwIGlzIHRvIGBzaW1wbGlmeScgYW4gb3V0bGluZSdzIHRvcG9sb2d5IHNvIHRoYXQgd2UKKyAgICAgICAgICogY2FuIGlkZW50aWZ5IGxvY2FsIGV4dHJlbWEgbW9yZSByZWxpYWJseTogQSBzZXJpZXMgb2YKKyAgICAgICAgICogbm9uLWhvcml6b250YWwgb3Igbm9uLXZlcnRpY2FsIHZlY3RvcnMgcG9pbnRpbmcgaW50byB0aGUgc2FtZQorICAgICAgICAgKiBxdWFkcmFudCBhcmUgaGFuZGxlZCBhcyBhIHNpbmdsZSwgbG9uZyB2ZWN0b3IuICBGcm9tIGEKKyAgICAgICAgICogdG9wb2xvZ2ljYWwgcG9pbnQgb2YgdGhlIHZpZXcsIHRoZSBpbnRlcm1lZGlhdGUgcG9pbnRzIGFyZSBvZiBubworICAgICAgICAgKiBpbnRlcmVzdCBhbmQgdGh1cyB0YWdnZWQgYXMgd2Vhay4KICAgICAgICAgICovCiAKICAgICAgICAgZm9yICggcG9pbnQgPSBwb2ludHM7IHBvaW50IDwgcG9pbnRfbGltaXQ7IHBvaW50KysgKQpAQCAtMTA4MCw5ICsxMTE4LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qCi0gICAgICAgICAqICBGaW5hbGx5LCBjaGVjayBmb3IgcmVtYWluaW5nIHdlYWsgcG9pbnRzLiAgRXZlcnl0aGluZyBlbHNlIG5vdAotICAgICAgICAgKiAgY29sbGVjdGVkIGluIGVkZ2VzIHNvIGZhciBpcyB0aGVuIGltcGxpY2l0bHkgY2xhc3NpZmllZCBhcyBzdHJvbmcKLSAgICAgICAgICogIHBvaW50cy4KKyAgICAgICAgICogRmluYWxseSwgY2hlY2sgZm9yIHJlbWFpbmluZyB3ZWFrIHBvaW50cy4gIEV2ZXJ5dGhpbmcgZWxzZSBub3QKKyAgICAgICAgICogY29sbGVjdGVkIGluIGVkZ2VzIHNvIGZhciBpcyB0aGVuIGltcGxpY2l0bHkgY2xhc3NpZmllZCBhcyBzdHJvbmcKKyAgICAgICAgICogcG9pbnRzLgogICAgICAgICAgKi8KIAogICAgICAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludF9saW1pdDsgcG9pbnQrKyApCkBAIC0xMzA5LDYgKzEzNDcsMTIgQEAKICAgICAgICAgaWYgKCBkZWx0YSA+PSAwICkKICAgICAgICAgewogICAgICAgICAgIHUgPSBlZGdlLT5wb3MgLSAoIGVkZ2UtPm9wb3MgLSBvdSApOworCisjaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAorICAgICAgICAgIHBvaW50LT5iZWZvcmVbZGltXSA9IGVkZ2U7CisgICAgICAgICAgcG9pbnQtPmFmdGVyW2RpbV0gID0gTlVMTDsKKyNlbmRpZgorCiAgICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKICAgICAgICAgfQogCkBAIC0xMzE4LDYgKzEzNjIsMTIgQEAKICAgICAgICAgaWYgKCBkZWx0YSA+PSAwICkKICAgICAgICAgewogICAgICAgICAgIHUgPSBlZGdlLT5wb3MgKyAoIG91IC0gZWRnZS0+b3BvcyApOworCisjaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAorICAgICAgICAgIHBvaW50LT5iZWZvcmVbZGltXSA9IE5VTEw7CisgICAgICAgICAgcG9pbnQtPmFmdGVyW2RpbV0gID0gZWRnZTsKKyNlbmRpZgorCiAgICAgICAgICAgZ290byBTdG9yZV9Qb2ludDsKICAgICAgICAgfQogCkBAIC0xMzY0LDYgKzE0MTQsMTIgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgLyogd2UgYXJlIG9uIHRoZSBlZGdlICovCiAgICAgICAgICAgICAgIHUgPSBlZGdlLT5wb3M7CisKKyNpZmRlZiBGVF9ERUJVR19BVVRPRklUCisgICAgICAgICAgICAgIHBvaW50LT5iZWZvcmVbZGltXSA9IE5VTEw7CisgICAgICAgICAgICAgIHBvaW50LT5hZnRlcltkaW1dICA9IE5VTEw7CisjZW5kaWYKKwogICAgICAgICAgICAgICBnb3RvIFN0b3JlX1BvaW50OwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KQEAgLTEzNzQsNiArMTQzMCwxMSBAQAogICAgICAgICAgICAgQUZfRWRnZSAgYWZ0ZXIgID0gZWRnZXMgKyBtaW4gKyAwOwogCiAKKyNpZmRlZiBGVF9ERUJVR19BVVRPRklUCisgICAgICAgICAgICBwb2ludC0+YmVmb3JlW2RpbV0gPSBiZWZvcmU7CisgICAgICAgICAgICBwb2ludC0+YWZ0ZXJbZGltXSAgPSBhZnRlcjsKKyNlbmRpZgorCiAgICAgICAgICAgICAvKiBhc3NlcnQoIGJlZm9yZSAmJiBhZnRlciAmJiBiZWZvcmUgIT0gYWZ0ZXIgKSAqLwogICAgICAgICAgICAgaWYgKCBiZWZvcmUtPnNjYWxlID09IDAgKQogICAgICAgICAgICAgICBiZWZvcmUtPnNjYWxlID0gRlRfRGl2Rml4KCBhZnRlci0+cG9zIC0gYmVmb3JlLT5wb3MsCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmhpbnRzLmggYi9zcmMvYXV0b2ZpdC9hZmhpbnRzLmgKaW5kZXggMzMyNmViYy4uNjM5N2YwOSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZoaW50cy5oCisrKyBiL3NyYy9hdXRvZml0L2FmaGludHMuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZoaW50cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZoaW50cy5oCisgKgorICogICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZISU5UU19IXwpAQCAtMjYsOCArMjYsOCBAQAogRlRfQkVHSU5fSEVBREVSCiAKICAgLyoKLSAgICogIFRoZSBkZWZpbml0aW9uIG9mIG91dGxpbmUgZ2x5cGggaGludHMuICBUaGVzZSBhcmUgc2hhcmVkIGJ5IGFsbAotICAgKiAgd3JpdGluZyBzeXN0ZW0gYW5hbHlzaXMgcm91dGluZXMgKHVudGlsIG5vdykuCisgICAqIFRoZSBkZWZpbml0aW9uIG9mIG91dGxpbmUgZ2x5cGggaGludHMuICBUaGVzZSBhcmUgc2hhcmVkIGJ5IGFsbAorICAgKiB3cml0aW5nIHN5c3RlbSBhbmFseXNpcyByb3V0aW5lcyAodW50aWwgbm93KS4KICAgICovCiAKICAgdHlwZWRlZiBlbnVtICBBRl9EaW1lbnNpb25fCkBAIC01NiwxNTMgKzU2LDE1MyBAQAogCiAKICAgLyoKLSAgICogIFRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBtb3N0bHkgdGFrZW4gZnJvbSB0aGUgYXJ0aWNsZQorICAgKiBUaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9ucyBhcmUgbW9zdGx5IHRha2VuIGZyb20gdGhlIGFydGljbGUKICAgICoKLSAgICogICAgUmVhbC1UaW1lIEdyaWQgRml0dGluZyBvZiBUeXBvZ3JhcGhpYyBPdXRsaW5lcworICAgKiAgIFJlYWwtVGltZSBHcmlkIEZpdHRpbmcgb2YgVHlwb2dyYXBoaWMgT3V0bGluZXMKICAgICoKLSAgICogIGJ5IERhdmlkIFR1cm5lciBhbmQgV2VybmVyIExlbWJlcmcKKyAgICogYnkgRGF2aWQgVHVybmVyIGFuZCBXZXJuZXIgTGVtYmVyZwogICAgKgotICAgKiAgICBodHRwczovL3d3dy50dWcub3JnL1RVR2JvYXQvQXJ0aWNsZXMvdGIyNC0zL2xlbWJlcmcucGRmCisgICAqICAgaHR0cHM6Ly93d3cudHVnLm9yZy9UVUdib2F0L0FydGljbGVzL3RiMjQtMy9sZW1iZXJnLnBkZgogICAgKgotICAgKiAgd2l0aCBhcHByb3ByaWF0ZSB1cGRhdGVzLgorICAgKiB3aXRoIGFwcHJvcHJpYXRlIHVwZGF0ZXMuCiAgICAqCiAgICAqCi0gICAqICBTZWdtZW50cworICAgKiBTZWdtZW50cwogICAgKgotICAgKiAgICBgYWZfe2NqayxsYXRpbiwuLi59X2hpbnRzX2NvbXB1dGVfc2VnbWVudHMnIGFyZSB0aGUgZnVuY3Rpb25zIHRvCi0gICAqICAgIGZpbmQgc2VnbWVudHMgaW4gYW4gb3V0bGluZS4KKyAgICogICBgYWZfe2NqayxsYXRpbiwuLi59X2hpbnRzX2NvbXB1dGVfc2VnbWVudHMnIGFyZSB0aGUgZnVuY3Rpb25zIHRvCisgICAqICAgZmluZCBzZWdtZW50cyBpbiBhbiBvdXRsaW5lLgogICAgKgotICAgKiAgICBBIHNlZ21lbnQgaXMgYSBzZXJpZXMgb2YgYXQgbGVhc3QgdHdvIGNvbnNlY3V0aXZlIHBvaW50cyB0aGF0IGFyZQotICAgKiAgICBhcHByb3hpbWF0ZWx5IGFsaWduZWQgYWxvbmcgYSBjb29yZGluYXRlIGF4aXMuICBUaGUgYW5hbHlzaXMgdG8gZG8KLSAgICogICAgc28gaXMgc3BlY2lmaWMgdG8gYSB3cml0aW5nIHN5c3RlbS4KKyAgICogICBBIHNlZ21lbnQgaXMgYSBzZXJpZXMgb2YgYXQgbGVhc3QgdHdvIGNvbnNlY3V0aXZlIHBvaW50cyB0aGF0IGFyZQorICAgKiAgIGFwcHJveGltYXRlbHkgYWxpZ25lZCBhbG9uZyBhIGNvb3JkaW5hdGUgYXhpcy4gIFRoZSBhbmFseXNpcyB0byBkbworICAgKiAgIHNvIGlzIHNwZWNpZmljIHRvIGEgd3JpdGluZyBzeXN0ZW0uCiAgICAqCiAgICAqCi0gICAqICBFZGdlcworICAgKiBFZGdlcwogICAgKgotICAgKiAgICBgYWZfe2NqayxsYXRpbiwuLi59X2hpbnRzX2NvbXB1dGVfZWRnZXMnIGFyZSB0aGUgZnVuY3Rpb25zIHRvIGZpbmQKLSAgICogICAgZWRnZXMuCisgICAqICAgYGFmX3tjamssbGF0aW4sLi4ufV9oaW50c19jb21wdXRlX2VkZ2VzJyBhcmUgdGhlIGZ1bmN0aW9ucyB0byBmaW5kCisgICAqICAgZWRnZXMuCiAgICAqCi0gICAqICAgIEFzIHNvb24gYXMgc2VnbWVudHMgYXJlIGRlZmluZWQsIHRoZSBhdXRvLWhpbnRlciBncm91cHMgdGhlbSBpbnRvCi0gICAqICAgIGVkZ2VzLiAgQW4gZWRnZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBwb3NpdGlvbiBvbiB0aGUgbWFpbgotICAgKiAgICBkaW1lbnNpb24gdGhhdCBjb2xsZWN0cyBvbmUgb3IgbW9yZSBzZWdtZW50cyAoYWxsb3dpbmcgZm9yIGEgc21hbGwKLSAgICogICAgdGhyZXNob2xkKS4KKyAgICogICBBcyBzb29uIGFzIHNlZ21lbnRzIGFyZSBkZWZpbmVkLCB0aGUgYXV0by1oaW50ZXIgZ3JvdXBzIHRoZW0gaW50bworICAgKiAgIGVkZ2VzLiAgQW4gZWRnZSBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSBwb3NpdGlvbiBvbiB0aGUgbWFpbgorICAgKiAgIGRpbWVuc2lvbiB0aGF0IGNvbGxlY3RzIG9uZSBvciBtb3JlIHNlZ21lbnRzIChhbGxvd2luZyBmb3IgYSBzbWFsbAorICAgKiAgIHRocmVzaG9sZCkuCiAgICAqCi0gICAqICAgIEFzIGFuIGV4YW1wbGUsIHRoZSBgbGF0aW4nIHdyaXRpbmcgc3lzdGVtIGZpcnN0IHRyaWVzIHRvIGdyaWQtZml0Ci0gICAqICAgIGVkZ2VzLCB0aGVuIHRvIGFsaWduIHNlZ21lbnRzIG9uIHRoZSBlZGdlcyB1bmxlc3MgaXQgZGV0ZWN0cyB0aGF0Ci0gICAqICAgIHRoZXkgZm9ybSBhIHNlcmlmLgorICAgKiAgIEFzIGFuIGV4YW1wbGUsIHRoZSBgbGF0aW4nIHdyaXRpbmcgc3lzdGVtIGZpcnN0IHRyaWVzIHRvIGdyaWQtZml0CisgICAqICAgZWRnZXMsIHRoZW4gdG8gYWxpZ24gc2VnbWVudHMgb24gdGhlIGVkZ2VzIHVubGVzcyBpdCBkZXRlY3RzIHRoYXQKKyAgICogICB0aGV5IGZvcm0gYSBzZXJpZi4KICAgICoKICAgICoKLSAgICogICAgICAgICAgICAgICAgICAgICAgQSAgICAgICAgICBICi0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0gICAqICAgICAgICAgQyAgICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgIEYKLSAgICogICAgICAgICAgKy0tLS0tLTwtLS0tLSsgICAgICAgICstLS0tLTwtLS0tLS0rCi0gICAqICAgICAgICAgIHwgICAgICAgICAgICAgQiAgICAgIEcgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0+LS0tLS0tLS0tLS0tLS0tLS0tKwotICAgKiAgICAgICAgIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFCisgICAqICAgICAgICAgICAgICAgICAgICAgQSAgICAgICAgICBICisgICAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAgICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAorICAgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8CisgICAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKyAgICogICAgICAgIEMgICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICBGCisgICAqICAgICAgICAgKy0tLS0tLTwtLS0tLSsgICAgICAgICstLS0tLTwtLS0tLS0rCisgICAqICAgICAgICAgfCAgICAgICAgICAgICBCICAgICAgRyAgICAgICAgICAgICB8CisgICAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLT4tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAqICAgICAgICBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRQogICAgKgogICAgKgotICAgKiAgU3RlbXMKKyAgICogU3RlbXMKICAgICoKLSAgICogICAgU3RlbXMgYXJlIGRldGVjdGVkIGJ5IGBhZl97Y2prLGxhdGluLC4uLn1faGludF9lZGdlcycuCisgICAqICAgU3RlbXMgYXJlIGRldGVjdGVkIGJ5IGBhZl97Y2prLGxhdGluLC4uLn1faGludF9lZGdlcycuCiAgICAqCi0gICAqICAgIFNlZ21lbnRzIG5lZWQgdG8gYmUgYGxpbmtlZCcgdG8gb3RoZXIgb25lcyBpbiBvcmRlciB0byBkZXRlY3Qgc3RlbXMuCi0gICAqICAgIEEgc3RlbSBpcyBtYWRlIG9mIHR3byBzZWdtZW50cyB0aGF0IGZhY2UgZWFjaCBvdGhlciBpbiBvcHBvc2l0ZQotICAgKiAgICBkaXJlY3Rpb25zIGFuZCB0aGF0IGFyZSBzdWZmaWNpZW50bHkgY2xvc2UgdG8gZWFjaCBvdGhlci4gIFVzaW5nCi0gICAqICAgIHZvY2FidWxhcnkgZnJvbSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiwgc3RlbSBzZWdtZW50cyBmb3JtIGEKLSAgICogICAgYGJsYWNrIGRpc3RhbmNlJy4KKyAgICogICBTZWdtZW50cyBuZWVkIHRvIGJlIGBsaW5rZWQnIHRvIG90aGVyIG9uZXMgaW4gb3JkZXIgdG8gZGV0ZWN0IHN0ZW1zLgorICAgKiAgIEEgc3RlbSBpcyBtYWRlIG9mIHR3byBzZWdtZW50cyB0aGF0IGZhY2UgZWFjaCBvdGhlciBpbiBvcHBvc2l0ZQorICAgKiAgIGRpcmVjdGlvbnMgYW5kIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBjbG9zZSB0byBlYWNoIG90aGVyLiAgVXNpbmcKKyAgICogICB2b2NhYnVsYXJ5IGZyb20gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24sIHN0ZW0gc2VnbWVudHMgZm9ybSBhCisgICAqICAgYGJsYWNrIGRpc3RhbmNlJy4KICAgICoKLSAgICogICAgSW4gdGhlIGFib3ZlIEFTQ0lJIGRyYXdpbmcsIHRoZSBob3Jpem9udGFsIHNlZ21lbnRzIGFyZSBCQywgREUsIGFuZAotICAgKiAgICBGRzsgdGhlIHZlcnRpY2FsIHNlZ21lbnRzIGFyZSBBQiwgQ0QsIEVGLCBhbmQgR0guCisgICAqICAgSW4gdGhlIGFib3ZlIEFTQ0lJIGRyYXdpbmcsIHRoZSBob3Jpem9udGFsIHNlZ21lbnRzIGFyZSBCQywgREUsIGFuZAorICAgKiAgIEZHOyB0aGUgdmVydGljYWwgc2VnbWVudHMgYXJlIEFCLCBDRCwgRUYsIGFuZCBHSC4KICAgICoKLSAgICogICAgRWFjaCBzZWdtZW50IGhhcyBhdCBtb3N0IG9uZSBgYmVzdCcgY2FuZGlkYXRlIHRvIGZvcm0gYSBibGFjawotICAgKiAgICBkaXN0YW5jZSwgb3Igbm8gY2FuZGlkYXRlIGF0IGFsbC4gIE5vdGljZSB0aGF0IHR3byBkaXN0aW5jdCBzZWdtZW50cwotICAgKiAgICBjYW4gaGF2ZSB0aGUgc2FtZSBjYW5kaWRhdGUsIHdoaWNoIGZyZXF1ZW50bHkgbWVhbnMgYSBzZXJpZi4KKyAgICogICBFYWNoIHNlZ21lbnQgaGFzIGF0IG1vc3Qgb25lIGBiZXN0JyBjYW5kaWRhdGUgdG8gZm9ybSBhIGJsYWNrCisgICAqICAgZGlzdGFuY2UsIG9yIG5vIGNhbmRpZGF0ZSBhdCBhbGwuICBOb3RpY2UgdGhhdCB0d28gZGlzdGluY3Qgc2VnbWVudHMKKyAgICogICBjYW4gaGF2ZSB0aGUgc2FtZSBjYW5kaWRhdGUsIHdoaWNoIGZyZXF1ZW50bHkgbWVhbnMgYSBzZXJpZi4KICAgICoKLSAgICogICAgQSBzdGVtIGlzIHJlY29nbml6ZWQgYnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb246CisgICAqICAgQSBzdGVtIGlzIHJlY29nbml6ZWQgYnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb246CiAgICAqCi0gICAqICAgICAgYmVzdCBzZWdtZW50XzEgPSBzZWdtZW50XzIgJiYgYmVzdCBzZWdtZW50XzIgPSBzZWdtZW50XzEKKyAgICogICAgIGJlc3Qgc2VnbWVudF8xID0gc2VnbWVudF8yICYmIGJlc3Qgc2VnbWVudF8yID0gc2VnbWVudF8xCiAgICAqCi0gICAqICAgIFRoZSBiZXN0IGNhbmRpZGF0ZSBpcyBzdG9yZWQgaW4gZmllbGQgYGxpbmsnIGluIHN0cnVjdHVyZQotICAgKiAgICBgQUZfU2VnbWVudCcuCisgICAqICAgVGhlIGJlc3QgY2FuZGlkYXRlIGlzIHN0b3JlZCBpbiBmaWVsZCBgbGluaycgaW4gc3RydWN0dXJlCisgICAqICAgYEFGX1NlZ21lbnQnLgogICAgKgotICAgKiAgICBJbiB0aGUgYWJvdmUgQVNDSUkgZHJhd2luZywgdGhlIGJlc3QgY2FuZGlkYXRlIGZvciBib3RoIEFCIGFuZCBDRCBpcwotICAgKiAgICBHSCwgd2hpbGUgdGhlIGJlc3QgY2FuZGlkYXRlIGZvciBHSCBpcyBBQi4gIFNpbWlsYXJseSwgdGhlIGJlc3QKLSAgICogICAgY2FuZGlkYXRlIGZvciBFRiBhbmQgR0ggaXMgQUIsIHdoaWxlIHRoZSBiZXN0IGNhbmRpZGF0ZSBmb3IgQUIgaXMKLSAgICogICAgR0guCisgICAqICAgSW4gdGhlIGFib3ZlIEFTQ0lJIGRyYXdpbmcsIHRoZSBiZXN0IGNhbmRpZGF0ZSBmb3IgYm90aCBBQiBhbmQgQ0QgaXMKKyAgICogICBHSCwgd2hpbGUgdGhlIGJlc3QgY2FuZGlkYXRlIGZvciBHSCBpcyBBQi4gIFNpbWlsYXJseSwgdGhlIGJlc3QKKyAgICogICBjYW5kaWRhdGUgZm9yIEVGIGFuZCBHSCBpcyBBQiwgd2hpbGUgdGhlIGJlc3QgY2FuZGlkYXRlIGZvciBBQiBpcworICAgKiAgIEdILgogICAgKgotICAgKiAgICBUaGUgZGV0ZWN0aW9uIGFuZCBoYW5kbGluZyBvZiBzdGVtcyBpcyBkZXBlbmRlbnQgb24gdGhlIHdyaXRpbmcKLSAgICogICAgc3lzdGVtLgorICAgKiAgIFRoZSBkZXRlY3Rpb24gYW5kIGhhbmRsaW5nIG9mIHN0ZW1zIGlzIGRlcGVuZGVudCBvbiB0aGUgd3JpdGluZworICAgKiAgIHN5c3RlbS4KICAgICoKICAgICoKLSAgICogIFNlcmlmcworICAgKiBTZXJpZnMKICAgICoKLSAgICogICAgU2VyaWZzIGFyZSBkZXRlY3RlZCBieSBgYWZfe2NqayxsYXRpbiwuLi59X2hpbnRfZWRnZXMnLgorICAgKiAgIFNlcmlmcyBhcmUgZGV0ZWN0ZWQgYnkgYGFmX3tjamssbGF0aW4sLi4ufV9oaW50X2VkZ2VzJy4KICAgICoKLSAgICogICAgSW4gY29tcGFyaXNvbiB0byBhIHN0ZW0sIGEgc2VyaWYgKGFzIGhhbmRsZWQgYnkgdGhlIGF1dG8taGludGVyCi0gICAqICAgIG1vZHVsZSB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIGBsYXRpbicgd3JpdGluZyBzeXN0ZW0pIGhhcworICAgKiAgIEluIGNvbXBhcmlzb24gdG8gYSBzdGVtLCBhIHNlcmlmIChhcyBoYW5kbGVkIGJ5IHRoZSBhdXRvLWhpbnRlcgorICAgKiAgIG1vZHVsZSB0aGF0IHRha2VzIGNhcmUgb2YgdGhlIGBsYXRpbicgd3JpdGluZyBzeXN0ZW0pIGhhcwogICAgKgotICAgKiAgICAgIGJlc3Qgc2VnbWVudF8xID0gc2VnbWVudF8yICYmIGJlc3Qgc2VnbWVudF8yICE9IHNlZ21lbnRfMQorICAgKiAgICAgYmVzdCBzZWdtZW50XzEgPSBzZWdtZW50XzIgJiYgYmVzdCBzZWdtZW50XzIgIT0gc2VnbWVudF8xCiAgICAqCi0gICAqICAgIHdoZXJlIHNlZ21lbnRfMSBjb3JyZXNwb25kcyB0byB0aGUgc2VyaWYgc2VnbWVudCAoQ0QgYW5kIEVGIGluIHRoZQotICAgKiAgICBhYm92ZSBBU0NJSSBkcmF3aW5nKS4KKyAgICogICB3aGVyZSBzZWdtZW50XzEgY29ycmVzcG9uZHMgdG8gdGhlIHNlcmlmIHNlZ21lbnQgKENEIGFuZCBFRiBpbiB0aGUKKyAgICogICBhYm92ZSBBU0NJSSBkcmF3aW5nKS4KICAgICoKLSAgICogICAgVGhlIGJlc3QgY2FuZGlkYXRlIGlzIHN0b3JlZCBpbiBmaWVsZCBgc2VyaWYnIGluIHN0cnVjdHVyZQotICAgKiAgICBgQUZfU2VnbWVudCcgKGFuZCBgbGluaycgaXMgc2V0IHRvIE5VTEwpLgorICAgKiAgIFRoZSBiZXN0IGNhbmRpZGF0ZSBpcyBzdG9yZWQgaW4gZmllbGQgYHNlcmlmJyBpbiBzdHJ1Y3R1cmUKKyAgICogICBgQUZfU2VnbWVudCcgKGFuZCBgbGluaycgaXMgc2V0IHRvIE5VTEwpLgogICAgKgogICAgKgotICAgKiAgVG91Y2hlZCBwb2ludHMKKyAgICogVG91Y2hlZCBwb2ludHMKICAgICoKLSAgICogICAgQSBwb2ludCBpcyBjYWxsZWQgYHRvdWNoZWQnIGlmIGl0IGhhcyBiZWVuIHByb2Nlc3NlZCBzb21laG93IGJ5IHRoZQotICAgKiAgICBhdXRvLWhpbnRlci4gIEl0IGJhc2ljYWxseSBtZWFucyB0aGF0IGl0IHNob3VsZG4ndCBiZSBtb3ZlZCBhZ2FpbgotICAgKiAgICAob3IgbW92ZWQgb25seSB1bmRlciBjZXJ0YWluIGNvbnN0cmFpbnRzIHRvIHByZXNlcnZlIHRoZSBhbHJlYWR5Ci0gICAqICAgIGFwcGxpZWQgcHJvY2Vzc2luZykuCisgICAqICAgQSBwb2ludCBpcyBjYWxsZWQgYHRvdWNoZWQnIGlmIGl0IGhhcyBiZWVuIHByb2Nlc3NlZCBzb21laG93IGJ5IHRoZQorICAgKiAgIGF1dG8taGludGVyLiAgSXQgYmFzaWNhbGx5IG1lYW5zIHRoYXQgaXQgc2hvdWxkbid0IGJlIG1vdmVkIGFnYWluCisgICAqICAgKG9yIG1vdmVkIG9ubHkgdW5kZXIgY2VydGFpbiBjb25zdHJhaW50cyB0byBwcmVzZXJ2ZSB0aGUgYWxyZWFkeQorICAgKiAgIGFwcGxpZWQgcHJvY2Vzc2luZykuCiAgICAqCiAgICAqCi0gICAqICBGbGF0IGFuZCByb3VuZCBzZWdtZW50cworICAgKiBGbGF0IGFuZCByb3VuZCBzZWdtZW50cwogICAgKgotICAgKiAgICBTZWdtZW50cyBhcmUgYHJvdW5kJyBvciBgZmxhdCcsIGRlcGVuZGluZyBvbiB0aGUgc2VyaWVzIG9mIHBvaW50cwotICAgKiAgICB0aGF0IGRlZmluZSB0aGVtLiAgQSBzZWdtZW50IGlzIHJvdW5kIGlmIHRoZSBuZXh0IGFuZCBwcmV2aW91cyBwb2ludAotICAgKiAgICBvZiBhbiBleHRyZW11bSAod2hpY2ggY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBwb2ludCBvciBzZXF1ZW5jZSBvZgotICAgKiAgICBwb2ludHMpIGFyZSBib3RoIGNvbmljIG9yIGN1YmljIGNvbnRyb2wgcG9pbnRzLiAgT3RoZXJ3aXNlLCBhCi0gICAqICAgIHNlZ21lbnQgd2l0aCBhbiBleHRyZW11bSBpcyBmbGF0LgorICAgKiAgIFNlZ21lbnRzIGFyZSBgcm91bmQnIG9yIGBmbGF0JywgZGVwZW5kaW5nIG9uIHRoZSBzZXJpZXMgb2YgcG9pbnRzCisgICAqICAgdGhhdCBkZWZpbmUgdGhlbS4gIEEgc2VnbWVudCBpcyByb3VuZCBpZiB0aGUgbmV4dCBhbmQgcHJldmlvdXMgcG9pbnQKKyAgICogICBvZiBhbiBleHRyZW11bSAod2hpY2ggY2FuIGJlIGVpdGhlciBhIHNpbmdsZSBwb2ludCBvciBzZXF1ZW5jZSBvZgorICAgKiAgIHBvaW50cykgYXJlIGJvdGggY29uaWMgb3IgY3ViaWMgY29udHJvbCBwb2ludHMuICBPdGhlcndpc2UsIGEKKyAgICogICBzZWdtZW50IHdpdGggYW4gZXh0cmVtdW0gaXMgZmxhdC4KICAgICoKICAgICoKLSAgICogIFN0cm9uZyBQb2ludHMKKyAgICogU3Ryb25nIFBvaW50cwogICAgKgotICAgKiAgICBFeHBlcmllbmNlIGhhcyBzaG93biB0aGF0IHBvaW50cyBub3QgcGFydCBvZiBhbiBlZGdlIG5lZWQgdG8gYmUKLSAgICogICAgaW50ZXJwb2xhdGVkIGxpbmVhcmx5IGJldHdlZW4gdGhlaXIgdHdvIGNsb3Nlc3QgZWRnZXMsIGV2ZW4gaWYgdGhlc2UKLSAgICogICAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb250b3VyIG9mIHRob3NlIHBhcnRpY3VsYXIgcG9pbnRzLiAgVHlwaWNhbAotICAgKiAgICBjYW5kaWRhdGVzIGZvciB0aGlzIGFyZQorICAgKiAgIEV4cGVyaWVuY2UgaGFzIHNob3duIHRoYXQgcG9pbnRzIG5vdCBwYXJ0IG9mIGFuIGVkZ2UgbmVlZCB0byBiZQorICAgKiAgIGludGVycG9sYXRlZCBsaW5lYXJseSBiZXR3ZWVuIHRoZWlyIHR3byBjbG9zZXN0IGVkZ2VzLCBldmVuIGlmIHRoZXNlCisgICAqICAgYXJlIG5vdCBwYXJ0IG9mIHRoZSBjb250b3VyIG9mIHRob3NlIHBhcnRpY3VsYXIgcG9pbnRzLiAgVHlwaWNhbAorICAgKiAgIGNhbmRpZGF0ZXMgZm9yIHRoaXMgYXJlCiAgICAqCi0gICAqICAgIC0gYW5nbGUgcG9pbnRzIChpLmUuLCBwb2ludHMgd2hlcmUgdGhlIGBpbicgYW5kIGBvdXQnIGRpcmVjdGlvbgotICAgKiAgICAgIGRpZmZlciBncmVhdGx5KQorICAgKiAgIC0gYW5nbGUgcG9pbnRzIChpLmUuLCBwb2ludHMgd2hlcmUgdGhlIGBpbicgYW5kIGBvdXQnIGRpcmVjdGlvbgorICAgKiAgICAgZGlmZmVyIGdyZWF0bHkpCiAgICAqCi0gICAqICAgIC0gaW5mbGVjdGlvbiBwb2ludHMgKGkuZS4sIHdoZXJlIHRoZSBgaW4nIGFuZCBgb3V0JyBhbmdsZXMgYXJlIHRoZQotICAgKiAgICAgIHNhbWUsIGJ1dCB0aGUgY3VydmF0dXJlIGNoYW5nZXMgc2lnbikgW2N1cnJlbnRseSwgc3VjaCBwb2ludHMKLSAgICogICAgICBhcmVuJ3QgaGFuZGxlZCBzcGVjaWFsbHkgaW4gdGhlIGF1dG8taGludGVyXQorICAgKiAgIC0gaW5mbGVjdGlvbiBwb2ludHMgKGkuZS4sIHdoZXJlIHRoZSBgaW4nIGFuZCBgb3V0JyBhbmdsZXMgYXJlIHRoZQorICAgKiAgICAgc2FtZSwgYnV0IHRoZSBjdXJ2YXR1cmUgY2hhbmdlcyBzaWduKSBbY3VycmVudGx5LCBzdWNoIHBvaW50cworICAgKiAgICAgYXJlbid0IGhhbmRsZWQgc3BlY2lhbGx5IGluIHRoZSBhdXRvLWhpbnRlcl0KICAgICoKLSAgICogICAgYGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMnIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRha2VzCi0gICAqICAgIGNhcmUgb2Ygc3VjaCBzaXR1YXRpb25zOyBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBUcnVlVHlwZSBgSVAnCi0gICAqICAgIGhpbnRpbmcgaW5zdHJ1Y3Rpb24uCisgICAqICAgYGFmX2dseXBoX2hpbnRzX2FsaWduX3N0cm9uZ19wb2ludHMnIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRha2VzCisgICAqICAgY2FyZSBvZiBzdWNoIHNpdHVhdGlvbnM7IGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIFRydWVUeXBlIGBJUCcKKyAgICogICBoaW50aW5nIGluc3RydWN0aW9uLgogICAgKgogICAgKgotICAgKiAgV2VhayBQb2ludHMKKyAgICogV2VhayBQb2ludHMKICAgICoKLSAgICogICAgT3RoZXIgcG9pbnRzIGluIHRoZSBvdXRsaW5lIG11c3QgYmUgaW50ZXJwb2xhdGVkIHVzaW5nIHRoZQotICAgKiAgICBjb29yZGluYXRlcyBvZiB0aGVpciBwcmV2aW91cyBhbmQgbmV4dCB1bmZpdHRlZCBjb250b3VyIG5laWdoYm91cnMuCi0gICAqICAgIFRoZXNlIGFyZSBjYWxsZWQgYHdlYWsgcG9pbnRzJyBhbmQgYXJlIHRvdWNoZWQgYnkgdGhlIGZ1bmN0aW9uCi0gICAqICAgIGBhZl9nbHlwaF9oaW50c19hbGlnbl93ZWFrX3BvaW50cycsIGVxdWl2YWxlbnQgdG8gdGhlIFRydWVUeXBlIGBJVVAnCi0gICAqICAgIGhpbnRpbmcgaW5zdHJ1Y3Rpb24uICBUeXBpY2FsIGNhbmRpZGF0ZXMgYXJlIGNvbnRyb2wgcG9pbnRzIGFuZAotICAgKiAgICBwb2ludHMgb24gdGhlIGNvbnRvdXIgd2l0aG91dCBhIG1ham9yIGRpcmVjdGlvbi4KKyAgICogICBPdGhlciBwb2ludHMgaW4gdGhlIG91dGxpbmUgbXVzdCBiZSBpbnRlcnBvbGF0ZWQgdXNpbmcgdGhlCisgICAqICAgY29vcmRpbmF0ZXMgb2YgdGhlaXIgcHJldmlvdXMgYW5kIG5leHQgdW5maXR0ZWQgY29udG91ciBuZWlnaGJvdXJzLgorICAgKiAgIFRoZXNlIGFyZSBjYWxsZWQgYHdlYWsgcG9pbnRzJyBhbmQgYXJlIHRvdWNoZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAqICAgYGFmX2dseXBoX2hpbnRzX2FsaWduX3dlYWtfcG9pbnRzJywgZXF1aXZhbGVudCB0byB0aGUgVHJ1ZVR5cGUgYElVUCcKKyAgICogICBoaW50aW5nIGluc3RydWN0aW9uLiAgVHlwaWNhbCBjYW5kaWRhdGVzIGFyZSBjb250cm9sIHBvaW50cyBhbmQKKyAgICogICBwb2ludHMgb24gdGhlIGNvbnRvdXIgd2l0aG91dCBhIG1ham9yIGRpcmVjdGlvbi4KICAgICoKLSAgICogICAgVGhlIG1ham9yIGVmZmVjdCBpcyB0byByZWR1Y2UgcG9zc2libGUgZGlzdG9ydGlvbiBjYXVzZWQgYnkKLSAgICogICAgYWxpZ25tZW50IG9mIGVkZ2VzIGFuZCBzdHJvbmcgcG9pbnRzLCB0aHVzIHdlYWsgcG9pbnRzIGFyZSBwcm9jZXNzZWQKLSAgICogICAgYWZ0ZXIgc3Ryb25nIHBvaW50cy4KKyAgICogICBUaGUgbWFqb3IgZWZmZWN0IGlzIHRvIHJlZHVjZSBwb3NzaWJsZSBkaXN0b3J0aW9uIGNhdXNlZCBieQorICAgKiAgIGFsaWdubWVudCBvZiBlZGdlcyBhbmQgc3Ryb25nIHBvaW50cywgdGh1cyB3ZWFrIHBvaW50cyBhcmUgcHJvY2Vzc2VkCisgICAqICAgYWZ0ZXIgc3Ryb25nIHBvaW50cy4KICAgICovCiAKIApAQCAtMjUyLDYgKzI1MiwxMiBAQAogICAgIEFGX1BvaW50ICAgbmV4dDsgICAgIC8qIG5leHQgcG9pbnQgaW4gY29udG91ciAgICAgKi8KICAgICBBRl9Qb2ludCAgIHByZXY7ICAgICAvKiBwcmV2aW91cyBwb2ludCBpbiBjb250b3VyICovCiAKKyNpZmRlZiBGVF9ERUJVR19BVVRPRklUCisgICAgLyogdHJhY2sgYGJlZm9yZScgYW5kIGBhZnRlcicgZWRnZXMgZm9yIHN0cm9uZyBwb2ludHMgKi8KKyAgICBBRl9FZGdlICAgIGJlZm9yZVsyXTsKKyAgICBBRl9FZGdlICAgIGFmdGVyWzJdOworI2VuZGlmCisKICAgfSBBRl9Qb2ludFJlYzsKIAogCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZmluZGljLmMgYi9zcmMvYXV0b2ZpdC9hZmluZGljLmMKaW5kZXggZGZiZWE1Zi4uYmMyODM3YSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZpbmRpYy5jCisrKyBiL3NyYy9hdXRvZml0L2FmaW5kaWMuYwpAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZpbmRpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIEluZGljIHdyaXRpbmcgc3lzdGVtIChib2R5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSYWh1bCBCaGFsZXJhbyA8cmFodWwuYmhhbGVyYW9AcmVkaGF0LmNvbT4sIDxiLnJhaHVsLnBtQGdtYWlsLmNvbT4uICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZpbmRpYy5jCisgKgorICogICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBJbmRpYyB3cml0aW5nIHN5c3RlbSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMjAgYnkKKyAqIFJhaHVsIEJoYWxlcmFvIDxyYWh1bC5iaGFsZXJhb0ByZWRoYXQuY29tPiwgPGIucmFodWwucG1AZ21haWwuY29tPi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZ0eXBlcy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZpbmRpYy5oIGIvc3JjL2F1dG9maXQvYWZpbmRpYy5oCmluZGV4IDU2ODg3MzguLjA4OGI4OGIgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmaW5kaWMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmluZGljLmgKQEAgLTEsMjAgKzEsMjAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmaW5kaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBJbmRpYyB3cml0aW5nIHN5c3RlbSAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJhaHVsIEJoYWxlcmFvIDxyYWh1bC5iaGFsZXJhb0ByZWRoYXQuY29tPiwgPGIucmFodWwucG1AZ21haWwuY29tPi4gICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmluZGljLmgKKyAqCisgKiAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIEluZGljIHdyaXRpbmcgc3lzdGVtCisgKiAgIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAyMCBieQorICogUmFodWwgQmhhbGVyYW8gPHJhaHVsLmJoYWxlcmFvQHJlZGhhdC5jb20+LCA8Yi5yYWh1bC5wbUBnbWFpbC5jb20+LgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZJTkRJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbi5jIGIvc3JjL2F1dG9maXQvYWZsYXRpbi5jCmluZGV4IDlmMWI1NDAuLjIxZWMwMmUgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmbGF0aW4uYworKysgYi9zcmMvYXV0b2ZpdC9hZmxhdGluLmMKQEAgLTEsMjcgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiB3cml0aW5nIHN5c3RlbSAoYm9keSkuICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmbGF0aW4uYworICoKKyAqICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9BRFZBTkNFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRhZHZhbmMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKICNpbmNsdWRlICJhZmdsb2JhbC5oIgotI2luY2x1ZGUgImFmcGljLmgiCiAjaW5jbHVkZSAiYWZsYXRpbi5oIgogI2luY2x1ZGUgImFmZXJyb3JzLmgiCiAKQEAgLTMxLDE0ICsyOSwxNCBAQAogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZsYXRpbgorI2RlZmluZSBGVF9DT01QT05FTlQgIGFmbGF0aW4KIAogCiAgIC8qIG5lZWRlZCBmb3IgY29tcHV0YXRpb24gb2Ygcm91bmQgdnMuIGZsYXQgc2VnbWVudHMgKi8KQEAgLTgzLDI0ICs4MSwzMCBAQAogICAgICAgQUZfTGF0aW5NZXRyaWNzUmVjICBkdW1teVsxXTsKICAgICAgIEFGX1NjYWxlciAgICAgICAgICAgc2NhbGVyID0gJmR1bW15LT5yb290LnNjYWxlcjsKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscyA9IG1ldHJpY3MtPnJvb3QuZ2xvYmFsczsKKyAgICAgIEFGX1N0eWxlQ2xhc3MgICBzdHlsZV9jbGFzcyAgPSBtZXRyaWNzLT5yb290LnN0eWxlX2NsYXNzOworICAgICAgQUZfU2NyaXB0Q2xhc3MgIHNjcmlwdF9jbGFzcyA9IGFmX3NjcmlwdF9jbGFzc2VzW3N0eWxlX2NsYXNzLT5zY3JpcHRdOworCisgICAgICAvKiBJZiBIYXJmQnV6eiBpcyBub3QgYXZhaWxhYmxlLCB3ZSBuZWVkIGEgcG9pbnRlciB0byBhIHNpbmdsZSAqLworICAgICAgLyogdW5zaWduZWQgbG9uZyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgorICAgICAgdm9pZCogICAgIHNoYXBlcl9idWY7CisjZWxzZQorICAgICAgRlRfVUxvbmcgIHNoYXBlcl9idWZfOworICAgICAgdm9pZCogICAgIHNoYXBlcl9idWYgPSAmc2hhcGVyX2J1Zl87CiAjZW5kaWYKIAotICAgICAgQUZfU3R5bGVDbGFzcyAgIHN0eWxlX2NsYXNzICA9IG1ldHJpY3MtPnJvb3Quc3R5bGVfY2xhc3M7Ci0gICAgICBBRl9TY3JpcHRDbGFzcyAgc2NyaXB0X2NsYXNzID0gQUZfU0NSSVBUX0NMQVNTRVNfR0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVfY2xhc3MtPnNjcmlwdF07Ci0KLSAgICAgIHZvaWQqICAgICAgICBzaGFwZXJfYnVmOwogICAgICAgY29uc3QgY2hhciogIHA7CiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogICAgICAgRlRfVUxvbmcgIGNoID0gMDsKICNlbmRpZgogCi0gICAgICBwICAgICAgICAgID0gc2NyaXB0X2NsYXNzLT5zdGFuZGFyZF9jaGFyc3RyaW5nOwotICAgICAgc2hhcGVyX2J1ZiA9IGFmX3NoYXBlcl9idWZfY3JlYXRlKCBmYWNlICk7CiAKKyAgICAgIHAgPSBzY3JpcHRfY2xhc3MtPnN0YW5kYXJkX2NoYXJzdHJpbmc7CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgorICAgICAgc2hhcGVyX2J1ZiA9IGFmX3NoYXBlcl9idWZfY3JlYXRlKCBmYWNlICk7CisjZW5kaWYKICAgICAgIC8qCiAgICAgICAgKiBXZSBjaGVjayBhIGxpc3Qgb2Ygc3RhbmRhcmQgY2hhcmFjdGVycyB0byBjYXRjaCBmZWF0dXJlcyBsaWtlCiAgICAgICAgKiBgYzJzYycgKHNtYWxsIGNhcHMgZnJvbSBjYXBzKSB0aGF0IGRvbid0IGNvbnRhaW4gbG93ZXJjYXNlIGxldHRlcnMKQEAgLTE0NCw5ICsxNDgsMTMgQEAKICAgICAgIGFmX3NoYXBlcl9idWZfZGVzdHJveSggZmFjZSwgc2hhcGVyX2J1ZiApOwogCiAgICAgICBpZiAoICFnbHlwaF9pbmRleCApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNSgoICJzdGFuZGFyZCBjaGFyYWN0ZXIgbWlzc2luZzsiCisgICAgICAgICAgICAgICAgICAgICIgdXNpbmcgZmFsbGJhY2sgc3RlbSB3aWR0aHNcbiIgKSk7CiAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KIAotICAgICAgRlRfVFJBQ0U1KCggInN0YW5kYXJkIGNoYXJhY3RlcjogVSslMDRsWCAoZ2x5cGggaW5kZXggJWQpXG4iLAorICAgICAgRlRfVFJBQ0U1KCggInN0YW5kYXJkIGNoYXJhY3RlcjogVSslMDRsWCAoZ2x5cGggaW5kZXggJWxkKVxuIiwKICAgICAgICAgICAgICAgICAgIGNoLCBnbHlwaF9pbmRleCApKTsKIAogICAgICAgZXJyb3IgPSBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgRlRfTE9BRF9OT19TQ0FMRSApOwpAQCAtMTg2LDEwICsxOTQsMTAgQEAKICAgICAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAgICAgLyoKLSAgICAgICAgICogIFdlIGFzc3VtZSB0aGF0IHRoZSBnbHlwaHMgc2VsZWN0ZWQgZm9yIHRoZSBzdGVtIHdpZHRoCi0gICAgICAgICAqICBjb21wdXRhdGlvbiBhcmUgYGZlYXR1cmVsZXNzJyBlbm91Z2ggc28gdGhhdCB0aGUgbGlua2luZwotICAgICAgICAgKiAgYWxnb3JpdGhtIHdvcmtzIGZpbmUgd2l0aG91dCBhZGp1c3RtZW50cyBvZiBpdHMgc2NvcmluZwotICAgICAgICAgKiAgZnVuY3Rpb24uCisgICAgICAgICAqIFdlIGFzc3VtZSB0aGF0IHRoZSBnbHlwaHMgc2VsZWN0ZWQgZm9yIHRoZSBzdGVtIHdpZHRoCisgICAgICAgICAqIGNvbXB1dGF0aW9uIGFyZSBgZmVhdHVyZWxlc3MnIGVub3VnaCBzbyB0aGF0IHRoZSBsaW5raW5nCisgICAgICAgICAqIGFsZ29yaXRobSB3b3JrcyBmaW5lIHdpdGhvdXQgYWRqdXN0bWVudHMgb2YgaXRzIHNjb3JpbmcKKyAgICAgICAgICogZnVuY3Rpb24uCiAgICAgICAgICAqLwogICAgICAgICBhZl9sYXRpbl9oaW50c19saW5rX3NlZ21lbnRzKCBoaW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKQEAgLTI0OSw5ICsyNTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgIGRpbSA9PSBBRl9ESU1FTlNJT05fVkVSVCA/ICJob3Jpem9udGFsIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJ2ZXJ0aWNhbCIgKSk7CiAKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICAlZCAoc3RhbmRhcmQpIiwgYXhpcy0+c3RhbmRhcmRfd2lkdGggKSk7CisgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJWxkIChzdGFuZGFyZCkiLCBheGlzLT5zdGFuZGFyZF93aWR0aCApKTsKICAgICAgICAgICBmb3IgKCBpID0gMTsgaSA8IGF4aXMtPndpZHRoX2NvdW50OyBpKysgKQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAlZCIsIGF4aXMtPndpZHRoc1tpXS5vcmcgKSk7CisgICAgICAgICAgICBGVF9UUkFDRTUoKCAiICVsZCIsIGF4aXMtPndpZHRoc1tpXS5vcmcgKSk7CiAKICAgICAgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwogICAgICAgICB9CkBAIC0zMDcsNyArMzE1LDcgQEAKICAgLyogRmluZCBhbGwgYmx1ZSB6b25lcy4gIEZsYXQgc2VnbWVudHMgZ2l2ZSB0aGUgcmVmZXJlbmNlIHBvaW50cywgKi8KICAgLyogcm91bmQgc2VnbWVudHMgdGhlIG92ZXJzaG9vdCBwb3NpdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotICBzdGF0aWMgdm9pZAorICBzdGF0aWMgaW50CiAgIGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyggQUZfTGF0aW5NZXRyaWNzICBtZXRyaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgZmFjZSApCiAgIHsKQEAgLTMyOSw3ICszMzcsMTQgQEAKIAogICAgIEZUX1BvcyAgZmxhdF90aHJlc2hvbGQgPSBGTEFUX1RIUkVTSE9MRCggbWV0cmljcy0+dW5pdHNfcGVyX2VtICk7CiAKLSAgICB2b2lkKiAgc2hhcGVyX2J1ZjsKKyAgICAvKiBJZiBIYXJmQnV6eiBpcyBub3QgYXZhaWxhYmxlLCB3ZSBuZWVkIGEgcG9pbnRlciB0byBhIHNpbmdsZSAqLworICAgIC8qIHVuc2lnbmVkIGxvbmcgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKKyAgICB2b2lkKiAgICAgc2hhcGVyX2J1ZjsKKyNlbHNlCisgICAgRlRfVUxvbmcgIHNoYXBlcl9idWZfOworICAgIHZvaWQqICAgICBzaGFwZXJfYnVmID0gJnNoYXBlcl9idWZfOworI2VuZGlmCiAKIAogICAgIC8qIHdlIHdhbGsgb3ZlciB0aGUgYmx1ZSBjaGFyYWN0ZXIgc3RyaW5ncyBhcyBzcGVjaWZpZWQgaW4gdGhlICovCkBAIC0zMzksNyArMzU0LDkgQEAKICAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgogICAgICAgICAgICAgICAgICJcbiIgKSk7CiAKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgogICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOworI2VuZGlmCiAKICAgICBmb3IgKCA7IGJzLT5zdHJpbmcgIT0gQUZfQkxVRV9TVFJJTkdfTUFYOyBicysrICkKICAgICB7CkBAIC04ODQsOCArOTAxLDggQEAKICAgICAgIGlmICggbnVtX2ZsYXRzID09IDAgJiYgbnVtX3JvdW5kcyA9PSAwICkKICAgICAgIHsKICAgICAgICAgLyoKLSAgICAgICAgICogIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKLSAgICAgICAgICogIHdlIHdpbGwgc2ltcGx5IGlnbm9yZSBpdCB0aGVuCisgICAgICAgICAqIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKKyAgICAgICAgICogd2Ugd2lsbCBzaW1wbHkgaWdub3JlIGl0IHRoZW4KICAgICAgICAgICovCiAgICAgICAgIEZUX1RSQUNFNSgoICIgIGVtcHR5XG4iICkpOwogICAgICAgICBjb250aW51ZTsKQEAgLTk2NywxMCArOTg0LDExIEBACiAKICAgICBhZl9zaGFwZXJfYnVmX2Rlc3Ryb3koIGZhY2UsIHNoYXBlcl9idWYgKTsKIAotICAgIC8qIHdlIGZpbmFsbHkgY2hlY2sgd2hldGhlciBibHVlIHpvbmVzIGFyZSBvcmRlcmVkOyAqLwotICAgIC8qIGByZWYnIGFuZCBgc2hvb3QnIHZhbHVlcyBvZiB0d28gYmx1ZSB6b25lcyBtdXN0IG5vdCBvdmVybGFwICovCiAgICAgaWYgKCBheGlzLT5ibHVlX2NvdW50ICkKICAgICB7CisgICAgICAvKiB3ZSBmaW5hbGx5IGNoZWNrIHdoZXRoZXIgYmx1ZSB6b25lcyBhcmUgb3JkZXJlZDsgICAgICAgICAgICAqLworICAgICAgLyogYHJlZicgYW5kIGBzaG9vdCcgdmFsdWVzIG9mIHR3byBibHVlIHpvbmVzIG11c3Qgbm90IG92ZXJsYXAgKi8KKwogICAgICAgRlRfVUludCAgICAgICBpOwogICAgICAgQUZfTGF0aW5CbHVlICBibHVlX3NvcnRlZFtBRl9CTFVFX1NUUklOR1NFVF9NQVhfTEVOICsgMl07CiAKQEAgLTEwMTMsMTcgKzEwMzEsNDAgQEAKICAgICAgICAgewogICAgICAgICAgICphID0gKmI7CiAgICAgICAgICAgRlRfVFJBQ0U1KCggImJsdWUgem9uZSBvdmVybGFwOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGFkanVzdGluZyAlcyAlZCB0byAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIiBhZGp1c3RpbmcgJXMgJWxkIHRvICVsZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBhX2lzX3RvcCA/ICJvdmVyc2hvb3QiIDogInJlZmVyZW5jZSIsCiAgICAgICAgICAgICAgICAgICAgICAgYmx1ZV9zb3J0ZWRbaV0gLSBheGlzLT5ibHVlcywKICAgICAgICAgICAgICAgICAgICAgICAqYSApKTsKICAgICAgICAgfQogICAgICAgfQorCisgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOworCisgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIC8qIGRpc2FibGUgaGludGluZyBmb3IgdGhlIGN1cnJlbnQgc3R5bGUgaWYgdGhlcmUgYXJlIG5vIGJsdWUgem9uZXMgKi8KIAotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7CisgICAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscyA9IG1ldHJpY3MtPnJvb3QuZ2xvYmFsczsKKyAgICAgIEZUX1VTaG9ydCogICAgICBnc3R5bGVzID0gZ2xvYmFscy0+Z2x5cGhfc3R5bGVzOwogCi0gICAgcmV0dXJuOworICAgICAgRlRfTG9uZyAgaTsKKworCisgICAgICBGVF9UUkFDRTUoKCAibm8gYmx1ZSB6b25lcyBmb3VuZDoiCisgICAgICAgICAgICAgICAgICAiIGhpbnRpbmcgZGlzYWJsZWQgZm9yIHRoaXMgc3R5bGVcbiIgKSk7CisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgZ2xvYmFscy0+Z2x5cGhfY291bnQ7IGkrKyApCisgICAgICB7CisgICAgICAgIGlmICggKCBnc3R5bGVzW2ldICYgQUZfU1RZTEVfTUFTSyApID09IHNjLT5zdHlsZSApCisgICAgICAgICAgZ3N0eWxlc1tpXSA9IEFGX1NUWUxFX05PTkVfREZMVDsKKyAgICAgIH0KKworICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQogICB9CiAKIApAQCAtMTAzNiwxNSArMTA3NywyNSBAQAogICAgIEZUX0Jvb2wgICBzdGFydGVkID0gMCwgc2FtZV93aWR0aCA9IDE7CiAgICAgRlRfRml4ZWQgIGFkdmFuY2UgPSAwLCBvbGRfYWR2YW5jZSA9IDA7CiAKLSAgICB2b2lkKiAgc2hhcGVyX2J1ZjsKKyAgICAvKiBJZiBIYXJmQnV6eiBpcyBub3QgYXZhaWxhYmxlLCB3ZSBuZWVkIGEgcG9pbnRlciB0byBhIHNpbmdsZSAqLworICAgIC8qIHVuc2lnbmVkIGxvbmcgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKKyAgICB2b2lkKiAgICAgc2hhcGVyX2J1ZjsKKyNlbHNlCisgICAgRlRfVUxvbmcgIHNoYXBlcl9idWZfOworICAgIHZvaWQqICAgICBzaGFwZXJfYnVmID0gJnNoYXBlcl9idWZfOworI2VuZGlmCiAKICAgICAvKiBpbiBhbGwgc3VwcG9ydGVkIGNoYXJtYXBzLCBkaWdpdHMgaGF2ZSBjaGFyYWN0ZXIgY29kZXMgMHgzMC0weDM5ICovCiAgICAgY29uc3QgY2hhciAgIGRpZ2l0c1tdID0gIjAgMSAyIDMgNCA1IDYgNyA4IDkiOwogICAgIGNvbnN0IGNoYXIqICBwOwogCiAKLSAgICBwICAgICAgICAgID0gZGlnaXRzOworICAgIHAgPSBkaWdpdHM7CisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9IQVJGQlVaWgogICAgIHNoYXBlcl9idWYgPSBhZl9zaGFwZXJfYnVmX2NyZWF0ZSggZmFjZSApOworI2VuZGlmCiAKICAgICB3aGlsZSAoICpwICkKICAgICB7CkBAIC0xMDkyLDYgKzExNDMsOCBAQAogICBhZl9sYXRpbl9tZXRyaWNzX2luaXQoIEFGX0xhdGluTWV0cmljcyAgbWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgIGZhY2UgKQogICB7CisgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOworCiAgICAgRlRfQ2hhck1hcCAgb2xkbWFwID0gZmFjZS0+Y2hhcm1hcDsKIAogCkBAIC0xMTAwLDEyICsxMTUzLDE4IEBACiAgICAgaWYgKCAhRlRfU2VsZWN0X0NoYXJtYXAoIGZhY2UsIEZUX0VOQ09ESU5HX1VOSUNPREUgKSApCiAgICAgewogICAgICAgYWZfbGF0aW5fbWV0cmljc19pbml0X3dpZHRocyggbWV0cmljcywgZmFjZSApOwotICAgICAgYWZfbGF0aW5fbWV0cmljc19pbml0X2JsdWVzKCBtZXRyaWNzLCBmYWNlICk7CisgICAgICBpZiAoIGFmX2xhdGluX21ldHJpY3NfaW5pdF9ibHVlcyggbWV0cmljcywgZmFjZSApICkKKyAgICAgIHsKKyAgICAgICAgLyogdXNlIGludGVybmFsIGVycm9yIGNvZGUgdG8gaW5kaWNhdGUgbWlzc2luZyBibHVlIHpvbmVzICovCisgICAgICAgIGVycm9yID0gLTE7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KICAgICAgIGFmX2xhdGluX21ldHJpY3NfY2hlY2tfZGlnaXRzKCBtZXRyaWNzLCBmYWNlICk7CiAgICAgfQogCisgIEV4aXQ6CiAgICAgRlRfU2V0X0NoYXJtYXAoIGZhY2UsIG9sZG1hcCApOwotICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgcmV0dXJuIGVycm9yOwogICB9CiAKIApAQCAtMTIyMCw3ICsxMjc5LDcgQEAKICAgICAgICAgICAgICAgICAiYWZfbGF0aW5fbWV0cmljc19zY2FsZV9kaW06IgogICAgICAgICAgICAgICAgICIgeCBoZWlnaHQgYWxpZ25tZW50IChzdHlsZSBgJXMnKTpcbiIKICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICIgdmVydGljYWwgc2NhbGluZyBjaGFuZ2VkIGZyb20gJS41ZiB0byAlLjVmIChieSAlZCUlKVxuIgorICAgICAgICAgICAgICAgICIgdmVydGljYWwgc2NhbGluZyBjaGFuZ2VkIGZyb20gJS41ZiB0byAlLjVmIChieSAlbGQlJSlcbiIKICAgICAgICAgICAgICAgICAiXG4iLAogICAgICAgICAgICAgICAgIGFmX3N0eWxlX25hbWVzW21ldHJpY3MtPnJvb3Quc3R5bGVfY2xhc3MtPnN0eWxlXSwKICAgICAgICAgICAgICAgICBzY2FsZSAvIDY1NTM2LjAsCkBAIC0xMjczLDcgKzEzMzIsNyBAQAogICAgICAgd2lkdGgtPmN1ciA9IEZUX011bEZpeCggd2lkdGgtPm9yZywgc2NhbGUgKTsKICAgICAgIHdpZHRoLT5maXQgPSB3aWR0aC0+Y3VyOwogCi0gICAgICBGVF9UUkFDRTUoKCAiICAlZCBzY2FsZWQgdG8gJS4yZlxuIiwKKyAgICAgIEZUX1RSQUNFNSgoICIgICVsZCBzY2FsZWQgdG8gJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgIHdpZHRoLT5vcmcsCiAgICAgICAgICAgICAgICAgICB3aWR0aC0+Y3VyIC8gNjQuMCApKTsKICAgICB9CkBAIC0xMjgzLDcgKzEzNDIsNyBAQAogICAgIC8qIGFuIGV4dHJhLWxpZ2h0IGF4aXMgY29ycmVzcG9uZHMgdG8gYSBzdGFuZGFyZCB3aWR0aCB0aGF0IGlzICovCiAgICAgLyogc21hbGxlciB0aGFuIDUvOCBwaXhlbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBheGlzLT5leHRyYV9saWdodCA9Ci0gICAgICAoRlRfQm9vbCkoIEZUX011bEZpeCggYXhpcy0+c3RhbmRhcmRfd2lkdGgsIHNjYWxlICkgPCAzMiArIDggKTsKKyAgICAgIEZUX0JPT0woIEZUX011bEZpeCggYXhpcy0+c3RhbmRhcmRfd2lkdGgsIHNjYWxlICkgPCAzMiArIDggKTsKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAgICAgaWYgKCBheGlzLT5leHRyYV9saWdodCApCkBAIC0xNDE0LDE4ICsxNDczLDE4IEBACiAgICAgICAgIEFGX0xhdGluQmx1ZSAgYmx1ZSA9ICZheGlzLT5ibHVlc1tubl07CiAKIAotICAgICAgICBGVF9UUkFDRTUoKCAiICByZWZlcmVuY2UgJWQ6ICVkIHNjYWxlZCB0byAlLjJmJXNcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgb3ZlcnNob290ICVkOiAlZCBzY2FsZWQgdG8gJS4yZiVzXG4iLAorICAgICAgICBGVF9UUkFDRTUoKCAiICByZWZlcmVuY2UgJWQ6ICVsZCBzY2FsZWQgdG8gJS4yZiVzXG4iCisgICAgICAgICAgICAgICAgICAgICIgIG92ZXJzaG9vdCAlZDogJWxkIHNjYWxlZCB0byAlLjJmJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIG5uLAogICAgICAgICAgICAgICAgICAgICBibHVlLT5yZWYub3JnLAogICAgICAgICAgICAgICAgICAgICBibHVlLT5yZWYuZml0IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgYmx1ZS0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX0FDVElWRSA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIChpbmFjdGl2ZSkiLAorICAgICAgICAgICAgICAgICAgICAoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgKSA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiAoaW5hY3RpdmUpIiwKICAgICAgICAgICAgICAgICAgICAgbm4sCiAgICAgICAgICAgICAgICAgICAgIGJsdWUtPnNob290Lm9yZywKICAgICAgICAgICAgICAgICAgICAgYmx1ZS0+c2hvb3QuZml0IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgYmx1ZS0+ZmxhZ3MgJiBBRl9MQVRJTl9CTFVFX0FDVElWRSA/ICIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIChpbmFjdGl2ZSkiICkpOworICAgICAgICAgICAgICAgICAgICAoIGJsdWUtPmZsYWdzICYgQUZfTEFUSU5fQkxVRV9BQ1RJVkUgKSA/ICIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiAoaW5hY3RpdmUpIiApKTsKICAgICAgIH0KICNlbmRpZgogICAgIH0KQEAgLTE4NTAsNyArMTkwOSw3IEBACiAgICAgLyogc2Vuc2UgLS0gdGhpcyBpcyB1c2VkIHRvIGJldHRlciBkZXRlY3QgYW5kIGlnbm9yZSBzZXJpZnMgICAqLwogICAgIHsKICAgICAgIEFGX1NlZ21lbnQgIHNlZ21lbnRzICAgICA9IGF4aXMtPnNlZ21lbnRzOwotICAgICAgQUZfU2VnbWVudCAgc2VnbWVudHNfZW5kID0gc2VnbWVudHMgKyBheGlzLT5udW1fc2VnbWVudHM7CisgICAgICBBRl9TZWdtZW50ICBzZWdtZW50c19lbmQgPSBGVF9PRkZTRVQoIHNlZ21lbnRzLCBheGlzLT5udW1fc2VnbWVudHMgKTsKIAogCiAgICAgICBmb3IgKCBzZWdtZW50ID0gc2VnbWVudHM7IHNlZ21lbnQgPCBzZWdtZW50c19lbmQ7IHNlZ21lbnQrKyApCkBAIC0xOTY3LDE3ICsyMDI2LDE3IEBACiAgICAgICAgICAgaWYgKCBsZW4gPj0gbGVuX3RocmVzaG9sZCApCiAgICAgICAgICAgewogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBUaGUgc2NvcmUgaXMgdGhlIHN1bSBvZiB0d28gZGVtZXJpdHMgaW5kaWNhdGluZyB0aGUKLSAgICAgICAgICAgICAqICBgYmFkbmVzcycgb2YgYSBmaXQsIG1lYXN1cmVkIGFsb25nIHRoZSBzZWdtZW50cycgbWFpbiBheGlzCi0gICAgICAgICAgICAgKiAgYW5kIG9ydGhvZ29uYWwgdG8gaXQsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAqIFRoZSBzY29yZSBpcyB0aGUgc3VtIG9mIHR3byBkZW1lcml0cyBpbmRpY2F0aW5nIHRoZQorICAgICAgICAgICAgICogYGJhZG5lc3MnIG9mIGEgZml0LCBtZWFzdXJlZCBhbG9uZyB0aGUgc2VnbWVudHMnIG1haW4gYXhpcworICAgICAgICAgICAgICogYW5kIG9ydGhvZ29uYWwgdG8gaXQsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiAgbyBUaGUgbGVzcyBvdmVybGFwcGluZyBhbG9uZyB0aGUgbWFpbiBheGlzLCB0aGUgd29yc2UgaXQKLSAgICAgICAgICAgICAqICAgIGlzLCBjYXVzaW5nIGEgbGFyZ2VyIGRlbWVyaXQuCisgICAgICAgICAgICAgKiAtIFRoZSBsZXNzIG92ZXJsYXBwaW5nIGFsb25nIHRoZSBtYWluIGF4aXMsIHRoZSB3b3JzZSBpdAorICAgICAgICAgICAgICogICBpcywgY2F1c2luZyBhIGxhcmdlciBkZW1lcml0LgogICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICBvIFRoZSBuZWFyZXIgdGhlIG9ydGhvZ29uYWwgZGlzdGFuY2UgdG8gYSBzdGVtIHdpZHRoLCB0aGUKLSAgICAgICAgICAgICAqICAgIGJldHRlciBpdCBpcywgY2F1c2luZyBhIHNtYWxsZXIgZGVtZXJpdC4gIEZvciBzaW1wbGljaXR5LAotICAgICAgICAgICAgICogICAgaG93ZXZlciwgd2Ugb25seSBpbmNyZWFzZSB0aGUgZGVtZXJpdCBmb3IgdmFsdWVzIHRoYXQKLSAgICAgICAgICAgICAqICAgIGV4Y2VlZCB0aGUgbGFyZ2VzdCBzdGVtIHdpZHRoLgorICAgICAgICAgICAgICogLSBUaGUgbmVhcmVyIHRoZSBvcnRob2dvbmFsIGRpc3RhbmNlIHRvIGEgc3RlbSB3aWR0aCwgdGhlCisgICAgICAgICAgICAgKiAgIGJldHRlciBpdCBpcywgY2F1c2luZyBhIHNtYWxsZXIgZGVtZXJpdC4gIEZvciBzaW1wbGljaXR5LAorICAgICAgICAgICAgICogICBob3dldmVyLCB3ZSBvbmx5IGluY3JlYXNlIHRoZSBkZW1lcml0IGZvciB2YWx1ZXMgdGhhdAorICAgICAgICAgICAgICogICBleGNlZWQgdGhlIGxhcmdlc3Qgc3RlbSB3aWR0aC4KICAgICAgICAgICAgICAqLwogCiAgICAgICAgICAgICBGVF9Qb3MgIGRpc3QgPSBwb3MyIC0gcG9zMTsKQEAgLTIwNDksMTMgKzIxMDgsOCBAQAogICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKICAgICBBRl9MYXRpbkF4aXMgIGxheGlzICA9ICYoKEFGX0xhdGluTWV0cmljcyloaW50cy0+bWV0cmljcyktPmF4aXNbZGltXTsKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgQUZfRmFjZUdsb2JhbHMgIGdsb2JhbHMgPSBoaW50cy0+bWV0cmljcy0+Z2xvYmFsczsKLSNlbmRpZgotCiAgICAgQUZfU3R5bGVDbGFzcyAgIHN0eWxlX2NsYXNzICA9IGhpbnRzLT5tZXRyaWNzLT5zdHlsZV9jbGFzczsKLSAgICBBRl9TY3JpcHRDbGFzcyAgc2NyaXB0X2NsYXNzID0gQUZfU0NSSVBUX0NMQVNTRVNfR0VUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlX2NsYXNzLT5zY3JpcHRdOworICAgIEFGX1NjcmlwdENsYXNzICBzY3JpcHRfY2xhc3MgPSBhZl9zY3JpcHRfY2xhc3Nlc1tzdHlsZV9jbGFzcy0+c2NyaXB0XTsKIAogICAgIEZUX0Jvb2wgIHRvcF90b19ib3R0b21faGludGluZyA9IDA7CiAKQEAgLTIwODYsOSArMjE0MCw5IEBACiAgICAgICB0b3BfdG9fYm90dG9tX2hpbnRpbmcgPSBzY3JpcHRfY2xhc3MtPnRvcF90b19ib3R0b21faGludGluZzsKIAogICAgIC8qCi0gICAgICogIFdlIGlnbm9yZSBhbGwgc2VnbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIDEgcGl4ZWwgaW4gbGVuZ3RoCi0gICAgICogIHRvIGF2b2lkIG1hbnkgcHJvYmxlbXMgd2l0aCBzZXJpZiBmb250cy4gIFdlIGNvbXB1dGUgdGhlCi0gICAgICogIGNvcnJlc3BvbmRpbmcgdGhyZXNob2xkIGluIGZvbnQgdW5pdHMuCisgICAgICogV2UgaWdub3JlIGFsbCBzZWdtZW50cyB0aGF0IGFyZSBsZXNzIHRoYW4gMSBwaXhlbCBpbiBsZW5ndGgKKyAgICAgKiB0byBhdm9pZCBtYW55IHByb2JsZW1zIHdpdGggc2VyaWYgZm9udHMuICBXZSBjb21wdXRlIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgdGhyZXNob2xkIGluIGZvbnQgdW5pdHMuCiAgICAgICovCiAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQogICAgICAgc2VnbWVudF9sZW5ndGhfdGhyZXNob2xkID0gRlRfRGl2Rml4KCA2NCwgaGludHMtPnlfc2NhbGUgKTsKQEAgLTIwOTYsMjYgKzIxNTAsMjYgQEAKICAgICAgIHNlZ21lbnRfbGVuZ3RoX3RocmVzaG9sZCA9IDA7CiAKICAgICAvKgotICAgICAqICBTaW1pbGFybHksIHdlIGlnbm9yZSBzZWdtZW50cyB0aGF0IGhhdmUgYSB3aWR0aCBkZWx0YQotICAgICAqICBsYXJnZXIgdGhhbiAwLjVweCAoaS5lLiwgYSB3aWR0aCBsYXJnZXIgdGhhbiAxcHgpLgorICAgICAqIFNpbWlsYXJseSwgd2UgaWdub3JlIHNlZ21lbnRzIHRoYXQgaGF2ZSBhIHdpZHRoIGRlbHRhCisgICAgICogbGFyZ2VyIHRoYW4gMC41cHggKGkuZS4sIGEgd2lkdGggbGFyZ2VyIHRoYW4gMXB4KS4KICAgICAgKi8KICAgICBzZWdtZW50X3dpZHRoX3RocmVzaG9sZCA9IEZUX0RpdkZpeCggMzIsIHNjYWxlICk7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlIGN1cnJlbnQgICAgKi8KLSAgICAvKiBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkgdG8gZmluZCAqLwotICAgIC8qIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJZiBubyBlZGdlIGlzIGZvdW5kLCB3ZSBjcmVhdGUgYW5kIGluc2VydCBhIG5ldyBlZGdlIGluIHRoZSAgICAgICAqLwotICAgIC8qIHNvcnRlZCB0YWJsZS4gIE90aGVyd2lzZSwgd2Ugc2ltcGx5IGFkZCB0aGUgc2VnbWVudCB0byB0aGUgZWRnZSdzICovCi0gICAgLyogbGlzdCB3aGljaCBnZXRzIHByb2Nlc3NlZCBpbiB0aGUgc2Vjb25kIHN0ZXAgdG8gY29tcHV0ZSB0aGUgICAgICAgKi8KLSAgICAvKiBlZGdlJ3MgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogTm90ZSB0aGF0IHRoZSB0YWJsZSBvZiBlZGdlcyBpcyBzb3J0ZWQgYWxvbmcgdGhlIHNlZ21lbnQvZWRnZSAgICAgKi8KLSAgICAvKiBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogV2UgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlIGN1cnJlbnQKKyAgICAgKiBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkgdG8gZmluZAorICAgICAqIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLgorICAgICAqCisgICAgICogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUKKyAgICAgKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncworICAgICAqIGxpc3Qgd2hpY2ggZ2V0cyBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlCisgICAgICogZWRnZSdzIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIHRhYmxlIG9mIGVkZ2VzIGlzIHNvcnRlZCBhbG9uZyB0aGUgc2VnbWVudC9lZGdlCisgICAgICogcG9zaXRpb24uCisgICAgICoKKyAgICAgKi8KIAogICAgIC8qIGFzc3VyZSB0aGF0IGVkZ2UgZGlzdGFuY2UgdGhyZXNob2xkIGlzIGF0IG1vc3QgMC4yNXB4ICovCiAgICAgZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQgPSBGVF9NdWxGaXgoIGxheGlzLT5lZGdlX2Rpc3RhbmNlX3RocmVzaG9sZCwKQEAgLTIyMzcsMTcgKzIyOTEsMTcgQEAKICAgICB9CiAKIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBHb29kLCB3ZSBub3cgY29tcHV0ZSBlYWNoIGVkZ2UncyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byB0aGUgICAqLwotICAgIC8qIHNlZ21lbnRzIGZvdW5kIG9uIGl0cyBwb3NpdGlvbi4gIEJhc2ljYWxseSwgdGhlc2UgYXJlICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSB0aGUgZWRnZSdzIG1haW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAtIHN0ZW0gZWRnZSwgc2VyaWYgZWRnZSBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdGVtIHRoZW4pICovCi0gICAgLyogIC0gcm91bmRlZCBlZGdlLCBzdHJhaWdodCBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdHJhaWdodCkgKi8KLSAgICAvKiAgLSBsaW5rIGZvciBlZGdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqCisgICAgICogR29vZCwgd2Ugbm93IGNvbXB1dGUgZWFjaCBlZGdlJ3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlCisgICAgICogc2VnbWVudHMgZm91bmQgb24gaXRzIHBvc2l0aW9uLiAgQmFzaWNhbGx5LCB0aGVzZSBhcmUKKyAgICAgKgorICAgICAqIC0gdGhlIGVkZ2UncyBtYWluIGRpcmVjdGlvbgorICAgICAqIC0gc3RlbSBlZGdlLCBzZXJpZiBlZGdlIG9yIGJvdGggKHdoaWNoIGRlZmF1bHRzIHRvIHN0ZW0gdGhlbikKKyAgICAgKiAtIHJvdW5kZWQgZWRnZSwgc3RyYWlnaHQgb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RyYWlnaHQpCisgICAgICogLSBsaW5rIGZvciBlZGdlCisgICAgICoKKyAgICAgKi8KIAogICAgIC8qIGZpcnN0IG9mIGFsbCwgc2V0IHRoZSBgZWRnZScgZmllbGQgaW4gZWFjaCBzZWdtZW50IC0tIHRoaXMgaXMgKi8KICAgICAvKiByZXF1aXJlZCBpbiBvcmRlciB0byBjb21wdXRlIGVkZ2UgbGlua3MgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMjU5LDcgKzIzMTMsNyBAQAogICAgICAqLwogICAgIHsKICAgICAgIEFGX0VkZ2UgIGVkZ2VzICAgICAgPSBheGlzLT5lZGdlczsKLSAgICAgIEFGX0VkZ2UgIGVkZ2VfbGltaXQgPSBlZGdlcyArIGF4aXMtPm51bV9lZGdlczsKKyAgICAgIEFGX0VkZ2UgIGVkZ2VfbGltaXQgPSBGVF9PRkZTRVQoIGVkZ2VzLCBheGlzLT5udW1fZWRnZXMgKTsKICAgICAgIEFGX0VkZ2UgIGVkZ2U7CiAKIApAQCAtMjMwOSw5ICsyMzYzLDkgQEAKIAogICAgICAgICAgIC8qIGNoZWNrIGZvciBsaW5rcyAtLSBpZiBzZWctPnNlcmlmIGlzIHNldCwgdGhlbiBzZWctPmxpbmsgbXVzdCAqLwogICAgICAgICAgIC8qIGJlIGlnbm9yZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlzX3NlcmlmID0gKEZUX0Jvb2wpKCBzZWctPnNlcmlmICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5zZXJpZi0+ZWRnZSAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgIT0gZWRnZSApOworICAgICAgICAgIGlzX3NlcmlmID0gRlRfQk9PTCggc2VnLT5zZXJpZiAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmLT5lZGdlICAgICAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgIT0gZWRnZSApOwogCiAgICAgICAgICAgaWYgKCAoIHNlZy0+bGluayAmJiBzZWctPmxpbmstPmVkZ2UgKSB8fCBpc19zZXJpZiApCiAgICAgICAgICAgewpAQCAtMjU0Niw4ICsyNjAwLDggQEAKICAgICBhZl9nbHlwaF9oaW50c19yZXNjYWxlKCBoaW50cywgKEFGX1N0eWxlTWV0cmljcyltZXRyaWNzICk7CiAKICAgICAvKgotICAgICAqICBjb3JyZWN0IHhfc2NhbGUgYW5kIHlfc2NhbGUgaWYgbmVlZGVkLCBzaW5jZSB0aGV5IG1heSBoYXZlCi0gICAgICogIGJlZW4gbW9kaWZpZWQgYnkgYGFmX2xhdGluX21ldHJpY3Nfc2NhbGVfZGltJyBhYm92ZQorICAgICAqIGNvcnJlY3QgeF9zY2FsZSBhbmQgeV9zY2FsZSBpZiBuZWVkZWQsIHNpbmNlIHRoZXkgbWF5IGhhdmUKKyAgICAgKiBiZWVuIG1vZGlmaWVkIGJ5IGBhZl9sYXRpbl9tZXRyaWNzX3NjYWxlX2RpbScgYWJvdmUKICAgICAgKi8KICAgICBoaW50cy0+eF9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLnNjYWxlOwogICAgIGhpbnRzLT54X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uZGVsdGE7CkBAIC0yNTY2LDIxICsyNjIwLDIxIEBACiAgICAgb3RoZXJfZmxhZ3MgID0gMDsKIAogICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KKyAgICAgKiBXZSBzbmFwIHRoZSB3aWR0aCBvZiB2ZXJ0aWNhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCisgICAgICogaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7CiAKICAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCisgICAgICogV2Ugc25hcCB0aGUgd2lkdGggb2YgaG9yaXpvbnRhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCisgICAgICogdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCiAgICAgICovCiAgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7CiAKICAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KKyAgICAgKiBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgJiYgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQogICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7CkBAIC0yNTg5LDExICsyNjQzLDExIEBACiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19NT05POwogCiAgICAgLyoKLSAgICAgKiAgSW4gYGxpZ2h0JyBvciBgbGNkJyBtb2RlIHdlIGRpc2FibGUgaG9yaXpvbnRhbCBoaW50aW5nIGNvbXBsZXRlbHkuCi0gICAgICogIFdlIGFsc28gZG8gaXQgaWYgdGhlIGZhY2UgaXMgaXRhbGljLgorICAgICAqIEluIGBsaWdodCcgb3IgYGxjZCcgbW9kZSB3ZSBkaXNhYmxlIGhvcml6b250YWwgaGludGluZyBjb21wbGV0ZWx5LgorICAgICAqIFdlIGFsc28gZG8gaXQgaWYgdGhlIGZhY2UgaXMgaXRhbGljLgogICAgICAqCi0gICAgICogIEhvd2V2ZXIsIGlmIHdhcnBpbmcgaXMgZW5hYmxlZCAod2hpY2ggb25seSB3b3JrcyBpbiBgbGlnaHQnIGhpbnRpbmcKLSAgICAgKiAgbW9kZSksIGFkdmFuY2Ugd2lkdGhzIGdldCBhZGp1c3RlZCwgdG9vLgorICAgICAqIEhvd2V2ZXIsIGlmIHdhcnBpbmcgaXMgZW5hYmxlZCAod2hpY2ggb25seSB3b3JrcyBpbiBgbGlnaHQnIGhpbnRpbmcKKyAgICAgKiBtb2RlKSwgYWR2YW5jZSB3aWR0aHMgZ2V0IGFkanVzdGVkLCB0b28uCiAgICAgICovCiAgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xJR0hUIHx8IG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEIHx8CiAgICAgICAgICAoIGZhY2UtPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19JVEFMSUMgKSAhPSAwICAgICAgICAgICkKQEAgLTI4OTAsNyArMjk0NCw3IEBACiAKICAgICBzdGVtX2VkZ2UtPnBvcyA9IGJhc2VfZWRnZS0+cG9zICsgZml0dGVkX3dpZHRoOwogCi0gICAgRlRfVFJBQ0U1KCggIiAgTElOSzogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gJS4yZiwiCisgICAgRlRfVFJBQ0U1KCggIiAgTElOSzogZWRnZSAlbGQgKG9wb3M9JS4yZikgbGlua2VkIHRvICUuMmYsIgogICAgICAgICAgICAgICAgICIgZGlzdCB3YXMgJS4yZiwgbm93ICUuMmZcbiIsCiAgICAgICAgICAgICAgICAgc3RlbV9lZGdlIC0gaGludHMtPmF4aXNbZGltXS5lZGdlcywgc3RlbV9lZGdlLT5vcG9zIC8gNjQuMCwKICAgICAgICAgICAgICAgICBzdGVtX2VkZ2UtPnBvcyAvIDY0LjAsIGRpc3QgLyA2NC4wLCBmaXR0ZWRfd2lkdGggLyA2NC4wICkpOwpAQCAtMjkzNiwxMyArMjk5MCw4IEBACiAgICAgQUZfRWRnZSAgICAgICBhbmNob3IgICAgID0gTlVMTDsKICAgICBGVF9JbnQgICAgICAgIGhhc19zZXJpZnMgPSAwOwogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBBRl9GYWNlR2xvYmFscyAgZ2xvYmFscyA9IGhpbnRzLT5tZXRyaWNzLT5nbG9iYWxzOwotI2VuZGlmCi0KICAgICBBRl9TdHlsZUNsYXNzICAgc3R5bGVfY2xhc3MgID0gaGludHMtPm1ldHJpY3MtPnN0eWxlX2NsYXNzOwotICAgIEFGX1NjcmlwdENsYXNzICBzY3JpcHRfY2xhc3MgPSBBRl9TQ1JJUFRfQ0xBU1NFU19HRVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVfY2xhc3MtPnNjcmlwdF07CisgICAgQUZfU2NyaXB0Q2xhc3MgIHNjcmlwdF9jbGFzcyA9IGFmX3NjcmlwdF9jbGFzc2VzW3N0eWxlX2NsYXNzLT5zY3JpcHRdOwogCiAgICAgRlRfQm9vbCAgdG9wX3RvX2JvdHRvbV9oaW50aW5nID0gMDsKIApAQCAtMjk3NiwxMiArMzAyNSwxMiBAQAogICAgICAgICBlZGdlMiA9IGVkZ2UtPmxpbms7CiAKICAgICAgICAgLyoKLSAgICAgICAgICogIElmIGEgc3RlbSBjb250YWlucyBib3RoIGEgbmV1dHJhbCBhbmQgYSBub24tbmV1dHJhbCBibHVlIHpvbmUsCi0gICAgICAgICAqICBza2lwIHRoZSBuZXV0cmFsIG9uZS4gIE90aGVyd2lzZSwgb3V0bGluZXMgd2l0aCBkaWZmZXJlbnQKLSAgICAgICAgICogIGRpcmVjdGlvbnMgbWlnaHQgYmUgaW5jb3JyZWN0bHkgYWxpZ25lZCBhdCB0aGUgc2FtZSB2ZXJ0aWNhbAotICAgICAgICAgKiAgcG9zaXRpb24uCisgICAgICAgICAqIElmIGEgc3RlbSBjb250YWlucyBib3RoIGEgbmV1dHJhbCBhbmQgYSBub24tbmV1dHJhbCBibHVlIHpvbmUsCisgICAgICAgICAqIHNraXAgdGhlIG5ldXRyYWwgb25lLiAgT3RoZXJ3aXNlLCBvdXRsaW5lcyB3aXRoIGRpZmZlcmVudAorICAgICAgICAgKiBkaXJlY3Rpb25zIG1pZ2h0IGJlIGluY29ycmVjdGx5IGFsaWduZWQgYXQgdGhlIHNhbWUgdmVydGljYWwKKyAgICAgICAgICogcG9zaXRpb24uCiAgICAgICAgICAqCi0gICAgICAgICAqICBJZiB3ZSBoYXZlIHR3byBuZXV0cmFsIGJsdWUgem9uZXMsIHNraXAgb25lIG9mIHRoZW0uCisgICAgICAgICAqIElmIHdlIGhhdmUgdHdvIG5ldXRyYWwgYmx1ZSB6b25lcywgc2tpcCBvbmUgb2YgdGhlbS4KICAgICAgICAgICoKICAgICAgICAgICovCiAgICAgICAgIGlmICggZWRnZS0+Ymx1ZV9lZGdlICYmIGVkZ2UyICYmIGVkZ2UyLT5ibHVlX2VkZ2UgKQpAQCAtMzAxOSwxMiArMzA2OCwxMiBAQAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKICAgICAgICAgaWYgKCAhYW5jaG9yICkKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCTFVFX0FOQ0hPUjogZWRnZSAlZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICUuMmYsIgotICAgICAgICAgICAgICAgICAgICAgICIgd2FzICUuMmYgKGFuY2hvcj1lZGdlICVkKVxuIiwKKyAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCTFVFX0FOQ0hPUjogZWRnZSAlbGQgKG9wb3M9JS4yZikgc25hcHBlZCB0byAlLjJmLCIKKyAgICAgICAgICAgICAgICAgICAgICAiIHdhcyAlLjJmIChhbmNob3I9ZWRnZSAlbGQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGVkZ2UxIC0gZWRnZXMsIGVkZ2UxLT5vcG9zIC8gNjQuMCwgYmx1ZS0+Zml0IC8gNjQuMCwKICAgICAgICAgICAgICAgICAgICAgICBlZGdlMS0+cG9zIC8gNjQuMCwgZWRnZSAtIGVkZ2VzICkpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgQkxVRTogZWRnZSAlZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICUuMmYsIgorICAgICAgICAgIEZUX1RSQUNFNSgoICIgIEJMVUU6IGVkZ2UgJWxkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gJS4yZiwiCiAgICAgICAgICAgICAgICAgICAgICAgIiB3YXMgJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICBlZGdlMSAtIGVkZ2VzLCBlZGdlMS0+b3BvcyAvIDY0LjAsIGJsdWUtPmZpdCAvIDY0LjAsCiAgICAgICAgICAgICAgICAgICAgICAgZWRnZTEtPnBvcyAvIDY0LjAgKSk7CkBAIC0zMDczLDcgKzMxMjIsNyBAQAogICAgICAgLyogdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGl0J3MgYmV0dGVyIHRvIGJlIHNhZmUgKi8KICAgICAgIGlmICggZWRnZTItPmJsdWVfZWRnZSApCiAgICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIEFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWRcbiIsIGVkZ2UyIC0gZWRnZXMgKSk7CisgICAgICAgIEZUX1RSQUNFNSgoICIgIEFTU0VSVElPTiBGQUlMRUQgZm9yIGVkZ2UgJWxkXG4iLCBlZGdlMiAtIGVkZ2VzICkpOwogCiAgICAgICAgIGFmX2xhdGluX2FsaWduX2xpbmtlZF9lZGdlKCBoaW50cywgZGltLCBlZGdlMiwgZWRnZSApOwogICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7CkBAIC0zMTQxLDcgKzMxOTAsNyBAQAogICAgICAgICBhbmNob3IgICAgICAgPSBlZGdlOwogICAgICAgICBlZGdlLT5mbGFncyB8PSBBRl9FREdFX0RPTkU7CiAKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIGFuZCAlZCAob3Bvcz0lLjJmKSIKKyAgICAgICAgRlRfVFJBQ0U1KCggIiAgQU5DSE9SOiBlZGdlICVsZCAob3Bvcz0lLjJmKSBhbmQgJWxkIChvcG9zPSUuMmYpIgogICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gJS4yZiBhbmQgJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKICAgICAgICAgICAgICAgICAgICAgZWRnZTIgLSBlZGdlcywgZWRnZTItPm9wb3MgLyA2NC4wLApAQCAtMzE3MCw3ICszMjE5LDcgQEAKIAogICAgICAgICBpZiAoIGVkZ2UyLT5mbGFncyAmIEFGX0VER0VfRE9ORSApCiAgICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBBREpVU1Q6IGVkZ2UgJWQgKHBvcz0lLjJmKSBtb3ZlZCB0byAlLjJmXG4iLAorICAgICAgICAgIEZUX1RSQUNFNSgoICIgIEFESlVTVDogZWRnZSAlbGQgKHBvcz0lLjJmKSBtb3ZlZCB0byAlLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZS0+cG9zIC8gNjQuMCwKICAgICAgICAgICAgICAgICAgICAgICAoIGVkZ2UyLT5wb3MgLSBjdXJfbGVuICkgLyA2NC4wICkpOwogCkBAIC0zMjExLDcgKzMyNjAsNyBAQAogICAgICAgICAgIGVkZ2UtPnBvcyAgPSBjdXJfcG9zMSAtIGN1cl9sZW4gLyAyOwogICAgICAgICAgIGVkZ2UyLT5wb3MgPSBjdXJfcG9zMSArIGN1cl9sZW4gLyAyOwogCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU1RFTTogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gJWQgKG9wb3M9JS4yZikiCisgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU1RFTTogZWRnZSAlbGQgKG9wb3M9JS4yZikgbGlua2VkIHRvICVsZCAob3Bvcz0lLjJmKSIKICAgICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gJS4yZiBhbmQgJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAogICAgICAgICAgICAgICAgICAgICAgIGVkZ2UyIC0gZWRnZXMsIGVkZ2UyLT5vcG9zIC8gNjQuMCwKQEAgLTMyNDIsNyArMzI5MSw3IEBACiAgICAgICAgICAgZWRnZS0+cG9zICA9ICggZGVsdGExIDwgZGVsdGEyICkgPyBjdXJfcG9zMSA6IGN1cl9wb3MyOwogICAgICAgICAgIGVkZ2UyLT5wb3MgPSBlZGdlLT5wb3MgKyBjdXJfbGVuOwogCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU1RFTTogZWRnZSAlZCAob3Bvcz0lLjJmKSBsaW5rZWQgdG8gJWQgKG9wb3M9JS4yZikiCisgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU1RFTTogZWRnZSAlbGQgKG9wb3M9JS4yZikgbGlua2VkIHRvICVsZCAob3Bvcz0lLjJmKSIKICAgICAgICAgICAgICAgICAgICAgICAiIHNuYXBwZWQgdG8gJS4yZiBhbmQgJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsIGVkZ2UtPm9wb3MgLyA2NC4wLAogICAgICAgICAgICAgICAgICAgICAgIGVkZ2UyIC0gZWRnZXMsIGVkZ2UyLT5vcG9zIC8gNjQuMCwKQEAgLTMyNjUsNyArMzMxNCw3IEBACiAgICAgICAgICAgaWYgKCBlZGdlLT5saW5rICYmIEZUX0FCUyggZWRnZS0+bGluay0+cG9zIC0gZWRnZVstMV0ucG9zICkgPiAxNiApCiAgICAgICAgICAgewogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCT1VORDogZWRnZSAlZCAocG9zPSUuMmYpIG1vdmVkIHRvICUuMmZcbiIsCisgICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBCT1VORDogZWRnZSAlbGQgKHBvcz0lLjJmKSBtb3ZlZCB0byAlLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0+cG9zIC8gNjQuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VbLTFdLnBvcyAvIDY0LjAgKSk7CkBAIC0zMzQ0LDggKzMzOTMsOCBAQAogICAgIGlmICggaGFzX3NlcmlmcyB8fCAhYW5jaG9yICkKICAgICB7CiAgICAgICAvKgotICAgICAgICogIG5vdyBoaW50IHRoZSByZW1haW5pbmcgZWRnZXMgKHNlcmlmcyBhbmQgc2luZ2xlKSBpbiBvcmRlcgotICAgICAgICogIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCisgICAgICAgKiBub3cgaGludCB0aGUgcmVtYWluaW5nIGVkZ2VzIChzZXJpZnMgYW5kIHNpbmdsZSkgaW4gb3JkZXIKKyAgICAgICAqIHRvIGNvbXBsZXRlIG91ciBwcm9jZXNzaW5nCiAgICAgICAgKi8KICAgICAgIGZvciAoIGVkZ2UgPSBlZGdlczsgZWRnZSA8IGVkZ2VfbGltaXQ7IGVkZ2UrKyApCiAgICAgICB7CkBAIC0zMzY3LDcgKzM0MTYsNyBAQAogICAgICAgICBpZiAoIGRlbHRhIDwgNjQgKyAxNiApCiAgICAgICAgIHsKICAgICAgICAgICBhZl9sYXRpbl9hbGlnbl9zZXJpZl9lZGdlKCBoaW50cywgZWRnZS0+c2VyaWYsIGVkZ2UgKTsKLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBTRVJJRjogZWRnZSAlZCAob3Bvcz0lLjJmKSBzZXJpZiB0byAlZCAob3Bvcz0lLjJmKSIKKyAgICAgICAgICBGVF9UUkFDRTUoKCAiICBTRVJJRjogZWRnZSAlbGQgKG9wb3M9JS4yZikgc2VyaWYgdG8gJWxkIChvcG9zPSUuMmYpIgogICAgICAgICAgICAgICAgICAgICAgICIgYWxpZ25lZCB0byAlLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsCiAgICAgICAgICAgICAgICAgICAgICAgZWRnZS0+c2VyaWYgLSBlZGdlcywgZWRnZS0+c2VyaWYtPm9wb3MgLyA2NC4wLApAQCAtMzM3Nyw3ICszNDI2LDcgQEAKICAgICAgICAgewogICAgICAgICAgIGVkZ2UtPnBvcyA9IEZUX1BJWF9ST1VORCggZWRnZS0+b3BvcyApOwogICAgICAgICAgIGFuY2hvciAgICA9IGVkZ2U7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgU0VSSUZfQU5DSE9SOiBlZGdlICVkIChvcG9zPSUuMmYpIgorICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNFUklGX0FOQ0hPUjogZWRnZSAlbGQgKG9wb3M9JS4yZikiCiAgICAgICAgICAgICAgICAgICAgICAgIiBzbmFwcGVkIHRvICUuMmZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgZWRnZS1lZGdlcywgZWRnZS0+b3BvcyAvIDY0LjAsIGVkZ2UtPnBvcyAvIDY0LjAgKSk7CiAgICAgICAgIH0KQEAgLTM0MDUsOCArMzQ1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPnBvcyAtIGJlZm9yZS0+cG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5vcG9zIC0gYmVmb3JlLT5vcG9zICk7CiAKLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNFUklGX0xJTksxOiBlZGdlICVkIChvcG9zPSUuMmYpIHNuYXBwZWQgdG8gJS4yZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSAlZCAob3Bvcz0lLjJmKVxuIiwKKyAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNFUklGX0xJTksxOiBlZGdlICVsZCAob3Bvcz0lLjJmKSBzbmFwcGVkIHRvICUuMmYiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gJWxkIChvcG9zPSUuMmYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwKICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsCiAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgLSBlZGdlcywgYmVmb3JlLT5vcG9zIC8gNjQuMCApKTsKQEAgLTM0MTUsNyArMzQ2NCw3IEBACiAgICAgICAgICAgewogICAgICAgICAgICAgZWRnZS0+cG9zID0gYW5jaG9yLT5wb3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgKCAoIGVkZ2UtPm9wb3MgLSBhbmNob3ItPm9wb3MgKyAxNiApICYgfjMxICk7Ci0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBTRVJJRl9MSU5LMjogZWRnZSAlZCAob3Bvcz0lLjJmKSIKKyAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIFNFUklGX0xJTksyOiBlZGdlICVsZCAob3Bvcz0lLjJmKSIKICAgICAgICAgICAgICAgICAgICAgICAgICIgc25hcHBlZCB0byAlLjJmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZWRnZSAtIGVkZ2VzLCBlZGdlLT5vcG9zIC8gNjQuMCwgZWRnZS0+cG9zIC8gNjQuMCApKTsKICAgICAgICAgICB9CkBAIC0zNDM1LDcgKzM0ODQsNyBAQAogICAgICAgICAgIGlmICggZWRnZS0+bGluayAmJiBGVF9BQlMoIGVkZ2UtPmxpbmstPnBvcyAtIGVkZ2VbLTFdLnBvcyApID4gMTYgKQogICAgICAgICAgIHsKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgQk9VTkQ6IGVkZ2UgJWQgKHBvcz0lLjJmKSBtb3ZlZCB0byAlLjJmXG4iLAorICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgQk9VTkQ6IGVkZ2UgJWxkIChwb3M9JS4yZikgbW92ZWQgdG8gJS4yZlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UgLSBlZGdlcywKICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2UtPnBvcyAvIDY0LjAsCiAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlWy0xXS5wb3MgLyA2NC4wICkpOwpAQCAtMzQ1Niw3ICszNTA1LDcgQEAKICAgICAgICAgICBpZiAoIGVkZ2UtPmxpbmsgJiYgRlRfQUJTKCBlZGdlLT5saW5rLT5wb3MgLSBlZGdlWy0xXS5wb3MgKSA+IDE2ICkKICAgICAgICAgICB7CiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIEJPVU5EOiBlZGdlICVkIChwb3M9JS4yZikgbW92ZWQgdG8gJS4yZlxuIiwKKyAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIEJPVU5EOiBlZGdlICVsZCAocG9zPSUuMmYpIG1vdmVkIHRvICUuMmZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlIC0gZWRnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5wb3MgLyA2NC4wLAogICAgICAgICAgICAgICAgICAgICAgICAgZWRnZVsxXS5wb3MgLyA2NC4wICkpOwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbi5oIGIvc3JjL2F1dG9maXQvYWZsYXRpbi5oCmluZGV4IDQzMmNjY2MuLjYyYmM0YzggMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmbGF0aW4uaAorKysgYi9zcmMvYXV0b2ZpdC9hZmxhdGluLmgKQEAgLTEsMjAgKzEsMjAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbGF0aW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiB3cml0aW5nIHN5c3RlbSAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmxhdGluLmgKKyAqCisgKiAgIEF1dG8tZml0dGVyIGhpbnRpbmcgcm91dGluZXMgZm9yIGxhdGluIHdyaXRpbmcgc3lzdGVtCisgKiAgIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZMQVRJTl9IXwpAQCAtNDUsOSArNDUsOSBAQAogCiAKICAgLyoKLSAgICogIFRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb25zIGNvdWxkIGJlIGVtYmVkZGVkIGluIHRoZSBmaWxlIGBhZmxhdGluLmMnOwotICAgKiAgdGhleSBoYXZlIGJlZW4gbWFkZSBzZW1pLXB1YmxpYyB0byBhbGxvdyBhbHRlcm5hdGUgd3JpdGluZyBzeXN0ZW0KLSAgICogIGhpbnRlcnMgdG8gcmUtdXNlIHNvbWUgb2YgdGhlbS4KKyAgICogVGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnMgY291bGQgYmUgZW1iZWRkZWQgaW4gdGhlIGZpbGUgYGFmbGF0aW4uYyc7CisgICAqIHRoZXkgaGF2ZSBiZWVuIG1hZGUgc2VtaS1wdWJsaWMgdG8gYWxsb3cgYWx0ZXJuYXRlIHdyaXRpbmcgc3lzdGVtCisgICAqIGhpbnRlcnMgdG8gcmUtdXNlIHNvbWUgb2YgdGhlbS4KICAgICovCiAKIApAQCAtMTYxLDggKzE2MSw4IEBACiAKIAogICAvKgotICAgKiAgVGhlIG5leHQgZnVuY3Rpb25zIHNob3VsZG4ndCBub3JtYWxseSBiZSBleHBvcnRlZC4gIEhvd2V2ZXIsIG90aGVyCi0gICAqICB3cml0aW5nIHN5c3RlbXMgbWlnaHQgbGlrZSB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIGFzLWlzLgorICAgKiBUaGUgbmV4dCBmdW5jdGlvbnMgc2hvdWxkbid0IG5vcm1hbGx5IGJlIGV4cG9ydGVkLiAgSG93ZXZlciwgb3RoZXIKKyAgICogd3JpdGluZyBzeXN0ZW1zIG1pZ2h0IGxpa2UgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucyBhcy1pcy4KICAgICovCiAgIEZUX0xPQ0FMKCBGVF9FcnJvciApCiAgIGFmX2xhdGluX2hpbnRzX2NvbXB1dGVfc2VnbWVudHMoIEFGX0dseXBoSGludHMgIGhpbnRzLApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuYyBiL3NyYy9hdXRvZml0L2FmbGF0aW4yLmMKaW5kZXggNWM3MTM3OC4uOTAyZjM5OCAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuYworKysgYi9zcmMvYXV0b2ZpdC9hZmxhdGluMi5jCkBAIC0zLDI1ICszLDI1IEBACiAvKiAgICAgICAgICAgIG1hcmtlZCBhcyBleHBlcmltZW50YWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxhdGluMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0gKGJvZHkpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmxhdGluMi5jCisgKgorICogICBBdXRvLWZpdHRlciBoaW50aW5nIHJvdXRpbmVzIGZvciBsYXRpbiB3cml0aW5nIHN5c3RlbSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSBGVF9BRFZBTkNFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRhZHZhbmMuaD4KIAogCiAjaWZkZWYgRlRfT1BUSU9OX0FVVE9GSVQyCkBAIC0zNywxNCArMzcsMTQgQEAKICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2FmbGF0aW4yCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgYWZsYXRpbjIKIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQpAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgICAgICAgICAvKiBBdm9pZCBzaW5nbGUtcG9pbnQgY29udG91cnMgc2luY2UgdGhleSBhcmUgbmV2ZXIgcmFzdGVyaXplZC4gKi8KICAgICAgICAgICAgIC8qIEluIHNvbWUgZm9udHMsIHRoZXkgY29ycmVzcG9uZCB0byBtYXJrIGF0dGFjaG1lbnQgcG9pbnRzICAgICAqLwogICAgICAgICAgICAgLyogd2hpY2ggYXJlIHdheSBvdXRzaWRlIG9mIHRoZSBnbHlwaCdzIHJlYWwgb3V0bGluZS4gICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIGxhc3QgPT0gZmlyc3QgKQorICAgICAgICAgICAgaWYgKCBsYXN0IDw9IGZpcnN0ICkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgaWYgKCBBRl9MQVRJTl9JU19UT1BfQkxVRSggYmIgKSApCkBAIC0yOTksNiArMjk5LDcgQEAKICAgICAgICAgLyogbm93IGNoZWNrIHdoZXRoZXIgdGhlIHBvaW50IGJlbG9uZ3MgdG8gYSBzdHJhaWdodCBvciByb3VuZCAgICovCiAgICAgICAgIC8qIHNlZ21lbnQ7IHdlIGZpcnN0IG5lZWQgdG8gZmluZCBpbiB3aGljaCBjb250b3VyIHRoZSBleHRyZW11bSAqLwogICAgICAgICAvKiBsaWVzLCB0aGVuIGluc3BlY3QgaXRzIHByZXZpb3VzIGFuZCBuZXh0IHBvaW50cyAgICAgICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBiZXN0X3BvaW50ID49IDAgKQogICAgICAgICB7CiAgICAgICAgICAgRlRfUG9zICBiZXN0X3ggPSBwb2ludHNbYmVzdF9wb2ludF0ueDsKICAgICAgICAgICBGVF9JbnQgIHN0YXJ0LCBlbmQsIHByZXYsIG5leHQ7CkBAIC0zNTgsOCArMzU5LDggQEAKICAgICAgIGlmICggbnVtX2ZsYXRzID09IDAgJiYgbnVtX3JvdW5kcyA9PSAwICkKICAgICAgIHsKICAgICAgICAgLyoKLSAgICAgICAgICogIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKLSAgICAgICAgICogIHdlIHdpbGwgc2ltcGx5IGlnbm9yZSBpdCB0aGVuCisgICAgICAgICAqIHdlIGNvdWxkbid0IGZpbmQgYSBzaW5nbGUgZ2x5cGggdG8gY29tcHV0ZSB0aGlzIGJsdWUgem9uZSwKKyAgICAgICAgICogd2Ugd2lsbCBzaW1wbHkgaWdub3JlIGl0IHRoZW4KICAgICAgICAgICovCiAgICAgICAgIEZUX1RSQUNFNSgoICIgIGVtcHR5XG4iICkpOwogICAgICAgICBjb250aW51ZTsKQEAgLTYzMiw3ICs2MzMsNyBAQAogICAgIC8qIGFuIGV4dHJhLWxpZ2h0IGF4aXMgY29ycmVzcG9uZHMgdG8gYSBzdGFuZGFyZCB3aWR0aCB0aGF0IGlzICovCiAgICAgLyogc21hbGxlciB0aGFuIDUvOCBwaXhlbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBheGlzLT5leHRyYV9saWdodCA9Ci0gICAgICAoRlRfQm9vbCkoIEZUX011bEZpeCggYXhpcy0+c3RhbmRhcmRfd2lkdGgsIHNjYWxlICkgPCAzMiArIDggKTsKKyAgICAgIEZUX0JPT0woIEZUX011bEZpeCggYXhpcy0+c3RhbmRhcmRfd2lkdGgsIHNjYWxlICkgPCAzMiArIDggKTsKIAogICAgIGlmICggZGltID09IEFGX0RJTUVOU0lPTl9WRVJUICkKICAgICB7CkBAIC0xMTA4LDEzICsxMTA5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFGX0RJUl9SSUdIVDsKIAogICAgIC8qCi0gICAgICogIFdlIHdhbnQgdG8gaWdub3JlIHZlcnkgc21hbGwgKG1vc3RseSBzZXJpZikgc2VnbWVudHMsIHdlIGRvIHRoYXQKLSAgICAgKiAgYnkgaWdub3JpbmcgdGhvc2UgdGhhdCB3aG9zZSBsZW5ndGggaXMgbGVzcyB0aGFuIGEgZ2l2ZW4gZnJhY3Rpb24KLSAgICAgKiAgb2YgdGhlIHN0YW5kYXJkIHdpZHRoLiBJZiB0aGVyZSBpcyBubyBzdGFuZGFyZCB3aWR0aCwgd2UgaWdub3JlCi0gICAgICogIHRob3NlIHRoYXQgYXJlIGxlc3MgdGhhbiBhIGdpdmVuIHNpemUgaW4gcGl4ZWxzCisgICAgICogV2Ugd2FudCB0byBpZ25vcmUgdmVyeSBzbWFsbCAobW9zdGx5IHNlcmlmKSBzZWdtZW50cywgd2UgZG8gdGhhdAorICAgICAqIGJ5IGlnbm9yaW5nIHRob3NlIHRoYXQgd2hvc2UgbGVuZ3RoIGlzIGxlc3MgdGhhbiBhIGdpdmVuIGZyYWN0aW9uCisgICAgICogb2YgdGhlIHN0YW5kYXJkIHdpZHRoLiBJZiB0aGVyZSBpcyBubyBzdGFuZGFyZCB3aWR0aCwgd2UgaWdub3JlCisgICAgICogdGhvc2UgdGhhdCBhcmUgbGVzcyB0aGFuIGEgZ2l2ZW4gc2l6ZSBpbiBwaXhlbHMKICAgICAgKgotICAgICAqICBhbHNvLCB1bmxpbmsgc2VyaWYgc2VnbWVudHMgdGhhdCBhcmUgbGlua2VkIHRvIHNlZ21lbnRzIGZhcnRoZXIKLSAgICAgKiAgdGhhbiA1MCUgb2YgdGhlIHN0YW5kYXJkIHdpZHRoCisgICAgICogYWxzbywgdW5saW5rIHNlcmlmIHNlZ21lbnRzIHRoYXQgYXJlIGxpbmtlZCB0byBzZWdtZW50cyBmYXJ0aGVyCisgICAgICogdGhhbiA1MCUgb2YgdGhlIHN0YW5kYXJkIHdpZHRoCiAgICAgICovCiAgICAgaWYgKCBkaW0gPT0gQUZfRElNRU5TSU9OX0hPUlogKQogICAgIHsKQEAgLTExMjYsMjEgKzExMjcsMjEgQEAKICAgICBlbHNlCiAgICAgICBzZWdtZW50X2xlbmd0aF90aHJlc2hvbGQgPSAwOwogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHdpbGwgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlICAgICAgICovCi0gICAgLyogY3VycmVudCBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkgKi8KLSAgICAvKiB0byBmaW5kIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLiAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUgICAgICAgKi8KLSAgICAvKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncyAqLwotICAgIC8qIGxpc3Qgd2hpY2ggd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlICAgICovCi0gICAgLyogZWRnZSdzIHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE5vdGUgdGhhdCB0aGUgZWRnZXMgdGFibGUgaXMgc29ydGVkIGFsb25nIHRoZSBzZWdtZW50L2VkZ2UgICAgICAgICovCi0gICAgLyogcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIFdlIHdpbGwgYmVnaW4gYnkgZ2VuZXJhdGluZyBhIHNvcnRlZCB0YWJsZSBvZiBlZGdlcyBmb3IgdGhlCisgICAgICogY3VycmVudCBkaXJlY3Rpb24uICBUbyBkbyBzbywgd2Ugc2ltcGx5IHNjYW4gZWFjaCBzZWdtZW50IGFuZCB0cnkKKyAgICAgKiB0byBmaW5kIGFuIGVkZ2UgaW4gb3VyIHRhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXRzIHBvc2l0aW9uLgorICAgICAqCisgICAgICogSWYgbm8gZWRnZSBpcyBmb3VuZCwgd2UgY3JlYXRlIGFuZCBpbnNlcnQgYSBuZXcgZWRnZSBpbiB0aGUKKyAgICAgKiBzb3J0ZWQgdGFibGUuICBPdGhlcndpc2UsIHdlIHNpbXBseSBhZGQgdGhlIHNlZ21lbnQgdG8gdGhlIGVkZ2UncworICAgICAqIGxpc3Qgd2hpY2ggd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIHNlY29uZCBzdGVwIHRvIGNvbXB1dGUgdGhlCisgICAgICogZWRnZSdzIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBOb3RlIHRoYXQgdGhlIGVkZ2VzIHRhYmxlIGlzIHNvcnRlZCBhbG9uZyB0aGUgc2VnbWVudC9lZGdlCisgICAgICogcG9zaXRpb24uCisgICAgICoKKyAgICAgKi8KIAogICAgIGVkZ2VfZGlzdGFuY2VfdGhyZXNob2xkID0gRlRfTXVsRml4KCBsYXhpcy0+ZWRnZV9kaXN0YW5jZV90aHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlICk7CkBAIC0xMjMwLDE3ICsxMjMxLDE3IEBACiAgICAgfQogCiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogR29vZCwgd2Ugd2lsbCBub3cgY29tcHV0ZSBlYWNoIGVkZ2UncyBwcm9wZXJ0aWVzIGFjY29yZGluZyB0byAgICAgKi8KLSAgICAvKiBzZWdtZW50cyBmb3VuZCBvbiBpdHMgcG9zaXRpb24uICBCYXNpY2FsbHksIHRoZXNlIGFyZTogICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogIC0gZWRnZSdzIG1haW4gZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgLSBzdGVtIGVkZ2UsIHNlcmlmIGVkZ2Ugb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RlbSB0aGVuKSAgICAqLwotICAgIC8qICAtIHJvdW5kZWQgZWRnZSwgc3RyYWlnaHQgb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RyYWlnaHQpICAgICovCi0gICAgLyogIC0gbGluayBmb3IgZWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIEdvb2QsIHdlIHdpbGwgbm93IGNvbXB1dGUgZWFjaCBlZGdlJ3MgcHJvcGVydGllcyBhY2NvcmRpbmcgdG8KKyAgICAgKiBzZWdtZW50cyBmb3VuZCBvbiBpdHMgcG9zaXRpb24uICBCYXNpY2FsbHksIHRoZXNlIGFyZToKKyAgICAgKgorICAgICAqIC0gZWRnZSdzIG1haW4gZGlyZWN0aW9uCisgICAgICogLSBzdGVtIGVkZ2UsIHNlcmlmIGVkZ2Ugb3IgYm90aCAod2hpY2ggZGVmYXVsdHMgdG8gc3RlbSB0aGVuKQorICAgICAqIC0gcm91bmRlZCBlZGdlLCBzdHJhaWdodCBvciBib3RoICh3aGljaCBkZWZhdWx0cyB0byBzdHJhaWdodCkKKyAgICAgKiAtIGxpbmsgZm9yIGVkZ2UKKyAgICAgKgorICAgICAqLwogCiAgICAgLyogZmlyc3Qgb2YgYWxsLCBzZXQgdGhlIGBlZGdlJyBmaWVsZCBpbiBlYWNoIHNlZ21lbnQgLS0gdGhpcyBpcyAqLwogICAgIC8qIHJlcXVpcmVkIGluIG9yZGVyIHRvIGNvbXB1dGUgZWRnZSBsaW5rcyAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzMDIsOSArMTMwMyw5IEBACiAKICAgICAgICAgICAvKiBjaGVjayBmb3IgbGlua3MgLS0gaWYgc2VnLT5zZXJpZiBpcyBzZXQsIHRoZW4gc2VnLT5saW5rIG11c3QgKi8KICAgICAgICAgICAvKiBiZSBpZ25vcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpc19zZXJpZiA9IChGVF9Cb29sKSggc2VnLT5zZXJpZiAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+c2VyaWYtPmVkZ2UgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmLT5lZGdlICE9IGVkZ2UgKTsKKyAgICAgICAgICBpc19zZXJpZiA9IEZUX0JPT0woIHNlZy0+c2VyaWYgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5zZXJpZi0+ZWRnZSAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPnNlcmlmLT5lZGdlICE9IGVkZ2UgKTsKIAogICAgICAgICAgIGlmICggKCBzZWctPmxpbmsgJiYgc2VnLT5saW5rLT5lZGdlICkgfHwgaXNfc2VyaWYgKQogICAgICAgICAgIHsKQEAgLTE1MjQsOCArMTUyNSw4IEBACiAgICAgYWZfZ2x5cGhfaGludHNfcmVzY2FsZSggaGludHMsIChBRl9TdHlsZU1ldHJpY3MpbWV0cmljcyApOwogCiAgICAgLyoKLSAgICAgKiAgY29ycmVjdCB4X3NjYWxlIGFuZCB5X3NjYWxlIGlmIG5lZWRlZCwgc2luY2UgdGhleSBtYXkgaGF2ZQotICAgICAqICBiZWVuIG1vZGlmaWVkIGBhZl9sYXRpbjJfbWV0cmljc19zY2FsZV9kaW0nIGFib3ZlCisgICAgICogY29ycmVjdCB4X3NjYWxlIGFuZCB5X3NjYWxlIGlmIG5lZWRlZCwgc2luY2UgdGhleSBtYXkgaGF2ZQorICAgICAqIGJlZW4gbW9kaWZpZWQgYGFmX2xhdGluMl9tZXRyaWNzX3NjYWxlX2RpbScgYWJvdmUKICAgICAgKi8KICAgICBoaW50cy0+eF9zY2FsZSA9IG1ldHJpY3MtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdLnNjYWxlOwogICAgIGhpbnRzLT54X2RlbHRhID0gbWV0cmljcy0+YXhpc1tBRl9ESU1FTlNJT05fSE9SWl0uZGVsdGE7CkBAIC0xNTQ0LDIxICsxNTQ1LDIxIEBACiAgICAgb3RoZXJfZmxhZ3MgID0gMDsKIAogICAgIC8qCi0gICAgICogIFdlIHNuYXAgdGhlIHdpZHRoIG9mIHZlcnRpY2FsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KKyAgICAgKiBXZSBzbmFwIHRoZSB3aWR0aCBvZiB2ZXJ0aWNhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCisgICAgICogaG9yaXpvbnRhbCBMQ0QgcmVuZGVyaW5nIHRhcmdldHMgb25seS4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyB8fCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19IT1JaX1NOQVA7CiAKICAgICAvKgotICAgICAqICBXZSBzbmFwIHRoZSB3aWR0aCBvZiBob3Jpem9udGFsIHN0ZW1zIGZvciB0aGUgbW9ub2Nocm9tZSBhbmQKLSAgICAgKiAgdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCisgICAgICogV2Ugc25hcCB0aGUgd2lkdGggb2YgaG9yaXpvbnRhbCBzdGVtcyBmb3IgdGhlIG1vbm9jaHJvbWUgYW5kCisgICAgICogdmVydGljYWwgTENEIHJlbmRlcmluZyB0YXJnZXRzIG9ubHkuCiAgICAgICovCiAgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApCiAgICAgICBvdGhlcl9mbGFncyB8PSBBRl9MQVRJTl9ISU5UU19WRVJUX1NOQVA7CiAKICAgICAvKgotICAgICAqICBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KKyAgICAgKiBXZSBhZGp1c3Qgc3RlbXMgdG8gZnVsbCBwaXhlbHMgdW5sZXNzIGluIGBsaWdodCcgb3IgYGxjZCcgbW9kZS4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgJiYgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQogICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfU1RFTV9BREpVU1Q7CkBAIC0xNTY3LDggKzE1NjgsOCBAQAogICAgICAgb3RoZXJfZmxhZ3MgfD0gQUZfTEFUSU5fSElOVFNfTU9OTzsKIAogICAgIC8qCi0gICAgICogIEluIGBsaWdodCcgb3IgYGxjZCcgbW9kZSB3ZSBkaXNhYmxlIGhvcml6b250YWwgaGludGluZyBjb21wbGV0ZWx5LgotICAgICAqICBXZSBhbHNvIGRvIGl0IGlmIHRoZSBmYWNlIGlzIGl0YWxpYy4KKyAgICAgKiBJbiBgbGlnaHQnIG9yIGBsY2QnIG1vZGUgd2UgZGlzYWJsZSBob3Jpem9udGFsIGhpbnRpbmcgY29tcGxldGVseS4KKyAgICAgKiBXZSBhbHNvIGRvIGl0IGlmIHRoZSBmYWNlIGlzIGl0YWxpYy4KICAgICAgKi8KICAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTElHSFQgfHwgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgfHwKICAgICAgICAgICggZmFjZS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQyApICE9IDAgICAgICAgICAgKQpAQCAtMjIzMyw4ICsyMjM0LDggQEAKICAgICBpZiAoIGhhc19zZXJpZnMgfHwgIWFuY2hvciApCiAgICAgewogICAgICAgLyoKLSAgICAgICAqICBub3cgaGludCB0aGUgcmVtYWluaW5nIGVkZ2VzIChzZXJpZnMgYW5kIHNpbmdsZSkgaW4gb3JkZXIKLSAgICAgICAqICB0byBjb21wbGV0ZSBvdXIgcHJvY2Vzc2luZworICAgICAgICogbm93IGhpbnQgdGhlIHJlbWFpbmluZyBlZGdlcyAoc2VyaWZzIGFuZCBzaW5nbGUpIGluIG9yZGVyCisgICAgICAgKiB0byBjb21wbGV0ZSBvdXIgcHJvY2Vzc2luZwogICAgICAgICovCiAgICAgICBmb3IgKCBlZGdlID0gZWRnZXM7IGVkZ2UgPCBlZGdlX2xpbWl0OyBlZGdlKysgKQogICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuaCBiL3NyYy9hdXRvZml0L2FmbGF0aW4yLmgKaW5kZXggMDEyOWRjNy4uYzJhZWJjNCAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZsYXRpbjIuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmxhdGluMi5oCkBAIC0zLDIzICszLDIzIEBACiAvKiAgICAgICAgICAgIG1hcmtlZCBhcyBleHBlcmltZW50YWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxhdGluMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0gICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZsYXRpbjIuaAorICoKKyAqICAgQXV0by1maXR0ZXIgaGludGluZyByb3V0aW5lcyBmb3IgbGF0aW4gd3JpdGluZyBzeXN0ZW0KKyAqICAgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBBRkxBVElOMl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuYyBiL3NyYy9hdXRvZml0L2FmbG9hZGVyLmMKaW5kZXggYTU1NTUwYi4uYzM1ZDg1YyAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuYworKysgYi9zcmMvYXV0b2ZpdC9hZmxvYWRlci5jCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxvYWRlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZ2x5cGggbG9hZGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmxvYWRlci5jCisgKgorICogICBBdXRvLWZpdHRlciBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJhZmdsb2JhbC5oIgpAQCAtMjEsOSArMjEsOCBAQAogI2luY2x1ZGUgImFmaGludHMuaCIKICNpbmNsdWRlICJhZmVycm9ycy5oIgogI2luY2x1ZGUgImFmbW9kdWxlLmgiCi0jaW5jbHVkZSAiYWZwaWMuaCIKIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CiAKIAogICAvKiBJbml0aWFsaXplIGdseXBoIGxvYWRlci4gKi8KQEAgLTExOSwxMiArMTE4LDEyIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiAgV2UgZGVwZW5kIG9uIHRoZSB3cml0aW5nIHN5c3RlbSAoc2NyaXB0IGFuYWx5emVycykgdG8gc3VwcGx5Ci0gICAgICogIHN0YW5kYXJkIHdpZHRocyBmb3IgdGhlIHNjcmlwdCBvZiB0aGUgZ2x5cGggd2UgYXJlIGxvb2tpbmcgYXQuICBJZgotICAgICAqICBpdCBjYW4ndCBkZWxpdmVyLCBzdGVtIGRhcmtlbmluZyBpcyBkaXNhYmxlZC4KKyAgICAgKiBXZSBkZXBlbmQgb24gdGhlIHdyaXRpbmcgc3lzdGVtIChzY3JpcHQgYW5hbHl6ZXJzKSB0byBzdXBwbHkKKyAgICAgKiBzdGFuZGFyZCB3aWR0aHMgZm9yIHRoZSBzY3JpcHQgb2YgdGhlIGdseXBoIHdlIGFyZSBsb29raW5nIGF0LiAgSWYKKyAgICAgKiBpdCBjYW4ndCBkZWxpdmVyLCBzdGVtIGRhcmtlbmluZyBpcyBkaXNhYmxlZC4KICAgICAgKi8KICAgICB3cml0aW5nX3N5c3RlbV9jbGFzcyA9Ci0gICAgICBBRl9XUklUSU5HX1NZU1RFTV9DTEFTU0VTX0dFVFtzdHlsZV9tZXRyaWNzLT5zdHlsZV9jbGFzcy0+d3JpdGluZ19zeXN0ZW1dOworICAgICAgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc1tzdHlsZV9tZXRyaWNzLT5zdHlsZV9jbGFzcy0+d3JpdGluZ19zeXN0ZW1dOwogCiAgICAgaWYgKCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfbWV0cmljc19nZXRzdGR3ICkKICAgICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9tZXRyaWNzX2dldHN0ZHcoIHN0eWxlX21ldHJpY3MsCkBAIC0xNzQsMjIgKzE3MywyMiBAQAogICAgICAgZ2xvYmFscy0+ZGFya2VuX3kgICAgICAgICAgICAgICAgICA9IGFmX2ZpeGVkVG9JbnQoIGRhcmtlbl95ICk7CiAKICAgICAgIC8qCi0gICAgICAgKiAgU2NhbGUgb3V0bGluZXMgZG93biBvbiB0aGUgWS1heGlzIHRvIGtlZXAgdGhlbSBpbnNpZGUgdGhlaXIgYmx1ZQotICAgICAgICogIHpvbmVzLiAgVGhlIHN0cm9uZ2VyIHRoZSBlbWJvbGRlbmluZywgdGhlIHN0cm9uZ2VyIHRoZSBkb3duc2NhbGluZwotICAgICAgICogIChwbHVzIGhldXJpc3RpY2FsIHBhZGRpbmcgdG8gcHJldmVudCBvdXRsaW5lcyBzdGlsbCBmYWxsaW5nIG91dAotICAgICAgICogIHRoZWlyIHpvbmVzIGR1ZSB0byByb3VuZGluZykuCisgICAgICAgKiBTY2FsZSBvdXRsaW5lcyBkb3duIG9uIHRoZSBZLWF4aXMgdG8ga2VlcCB0aGVtIGluc2lkZSB0aGVpciBibHVlCisgICAgICAgKiB6b25lcy4gIFRoZSBzdHJvbmdlciB0aGUgZW1ib2xkZW5pbmcsIHRoZSBzdHJvbmdlciB0aGUgZG93bnNjYWxpbmcKKyAgICAgICAqIChwbHVzIGhldXJpc3RpY2FsIHBhZGRpbmcgdG8gcHJldmVudCBvdXRsaW5lcyBzdGlsbCBmYWxsaW5nIG91dAorICAgICAgICogdGhlaXIgem9uZXMgZHVlIHRvIHJvdW5kaW5nKS4KICAgICAgICAqCi0gICAgICAgKiAgUmVhc29uOiBgRlRfT3V0bGluZV9FbWJvbGRlbicgd29ya3MgYnkgc2hpZnRpbmcgdGhlIHJpZ2h0bW9zdAotICAgICAgICogIHBvaW50cyBvZiBzdGVtcyBmYXJ0aGVyIHRvIHRoZSByaWdodCwgYW5kIHRvcG1vc3QgcG9pbnRzIGZhcnRoZXIKLSAgICAgICAqICB1cC4gIFRoaXMgcG9zaXRpb25zIHBvaW50cyBvbiB0aGUgWS1heGlzIG91dHNpZGUgdGhlaXIKLSAgICAgICAqICBwcmUtY29tcHV0ZWQgYmx1ZSB6b25lcyBhbmQgbGVhZHMgdG8gZGlzdG9ydGlvbiB3aGVuIGFwcGx5aW5nIHRoZQotICAgICAgICogIGhpbnRzIGluIHRoZSBjb2RlIGZ1cnRoZXIgYmVsb3cuICBDb2RlIG91dHNpZGUgdGhpcyBlbWJvbGRlbmluZwotICAgICAgICogIGJsb2NrIGRvZXNuJ3Qga25vdyB3ZSBhcmUgcHJlc2VudGluZyBpdCB3aXRoIG1vZGlmaWVkIG91dGxpbmVzIHRoZQotICAgICAgICogIGFuYWx5emVyIGRpZG4ndCBzZWUhCisgICAgICAgKiBSZWFzb246IGBGVF9PdXRsaW5lX0VtYm9sZGVuJyB3b3JrcyBieSBzaGlmdGluZyB0aGUgcmlnaHRtb3N0CisgICAgICAgKiBwb2ludHMgb2Ygc3RlbXMgZmFydGhlciB0byB0aGUgcmlnaHQsIGFuZCB0b3Btb3N0IHBvaW50cyBmYXJ0aGVyCisgICAgICAgKiB1cC4gIFRoaXMgcG9zaXRpb25zIHBvaW50cyBvbiB0aGUgWS1heGlzIG91dHNpZGUgdGhlaXIKKyAgICAgICAqIHByZS1jb21wdXRlZCBibHVlIHpvbmVzIGFuZCBsZWFkcyB0byBkaXN0b3J0aW9uIHdoZW4gYXBwbHlpbmcgdGhlCisgICAgICAgKiBoaW50cyBpbiB0aGUgY29kZSBmdXJ0aGVyIGJlbG93LiAgQ29kZSBvdXRzaWRlIHRoaXMgZW1ib2xkZW5pbmcKKyAgICAgICAqIGJsb2NrIGRvZXNuJ3Qga25vdyB3ZSBhcmUgcHJlc2VudGluZyBpdCB3aXRoIG1vZGlmaWVkIG91dGxpbmVzIHRoZQorICAgICAgICogYW5hbHl6ZXIgZGlkbid0IHNlZSEKICAgICAgICAqCi0gICAgICAgKiAgQW4gdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgZG93bnNjYWxpbmcgaXMgdGhhdCB0aGUgZW1ib2xkZW5pbmcKLSAgICAgICAqICBlZmZlY3QgaXMgc2xpZ2h0bHkgZGVjcmVhc2VkLiAgVGhlIGxvc3MgYmVjb21lcyBtb3JlIHByb25vdW5jZWQKLSAgICAgICAqICB2ZXJzdXMgdGhlIENGRiBkcml2ZXIgYXQgc21hbGxlciBzaXplcywgZS5nLiwgYXQgOXBwZW0gYW5kIGJlbG93LgorICAgICAgICogQW4gdW5mb3J0dW5hdGUgc2lkZSBlZmZlY3Qgb2YgZG93bnNjYWxpbmcgaXMgdGhhdCB0aGUgZW1ib2xkZW5pbmcKKyAgICAgICAqIGVmZmVjdCBpcyBzbGlnaHRseSBkZWNyZWFzZWQuICBUaGUgbG9zcyBiZWNvbWVzIG1vcmUgcHJvbm91bmNlZAorICAgICAgICogdmVyc3VzIHRoZSBDRkYgZHJpdmVyIGF0IHNtYWxsZXIgc2l6ZXMsIGUuZy4sIGF0IDlwcGVtIGFuZCBiZWxvdy4KICAgICAgICAqLwogICAgICAgZ2xvYmFscy0+c2NhbGVfZG93bl9mYWN0b3IgPQogICAgICAgICBGVF9EaXZGaXgoIGVtX3NpemUgLSAoIGRhcmtlbl9ieV9mb250X3VuaXRzX3kgKyBhZl9pbnRUb0ZpeGVkKCA4ICkgKSwKQEAgLTIzMiwxMCArMjMxLDYgQEAKICAgICBBRl9TdHlsZUNsYXNzICAgICAgICAgIHN0eWxlX2NsYXNzOwogICAgIEFGX1dyaXRpbmdTeXN0ZW1DbGFzcyAgd3JpdGluZ19zeXN0ZW1fY2xhc3M7CiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEFGX0ZhY2VHbG9iYWxzICBnbG9iYWxzID0gbG9hZGVyLT5nbG9iYWxzOwotI2VuZGlmCi0KIAogICAgIGlmICggIXNpemUgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1NpemVfSGFuZGxlICk7CkBAIC0yODIsMTMgKzI3NywxMyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogIFRPRE86IFRoaXMgY29kZSBjdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IGZyYWN0aW9uYWwgYWR2YW5jZSB3aWR0aHMsCi0gICAgICogIGkuZS4sIHBsYWNpbmcgaGludGVkIGdseXBocyBhdCBhbnl0aGluZyBvdGhlciB0aGFuIGludGVnZXIKLSAgICAgKiAgeC1wb3NpdGlvbnMuICBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSB3YXJwZXIgY29kZSwgd2hpY2gKLSAgICAgKiAgc2NhbGVzIGFuZCBzaGlmdHMgZ2x5cGhzIHRvIG9wdGltaXplIGJsYWNrbmVzcyBvZiBzdGVtcyAoaGludGluZyBvbgotICAgICAqICB0aGUgeC1heGlzIGJ5IG5hdHVyZSBwbGFjZXMgdGhpbmdzIG9uIHBpeGVsIGludGVnZXJzLCBoaW50aW5nIG9uIHRoZQotICAgICAqICB5LWF4aXMgb25seSwgaS5lLiwgTElHSFQgbW9kZSwgZG9lc24ndCB0b3VjaCB0aGUgeC1heGlzKS4gIFRoZSBkZWx0YQotICAgICAqICB2YWx1ZXMgb2YgdGhlIHNjYWxlciB3b3VsZCBuZWVkIHRvIGJlIGFkanVzdGVkLgorICAgICAqIFRPRE86IFRoaXMgY29kZSBjdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IGZyYWN0aW9uYWwgYWR2YW5jZSB3aWR0aHMsCisgICAgICogaS5lLiwgcGxhY2luZyBoaW50ZWQgZ2x5cGhzIGF0IGFueXRoaW5nIG90aGVyIHRoYW4gaW50ZWdlcgorICAgICAqIHgtcG9zaXRpb25zLiAgVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciB0aGUgd2FycGVyIGNvZGUsIHdoaWNoCisgICAgICogc2NhbGVzIGFuZCBzaGlmdHMgZ2x5cGhzIHRvIG9wdGltaXplIGJsYWNrbmVzcyBvZiBzdGVtcyAoaGludGluZyBvbgorICAgICAqIHRoZSB4LWF4aXMgYnkgbmF0dXJlIHBsYWNlcyB0aGluZ3Mgb24gcGl4ZWwgaW50ZWdlcnMsIGhpbnRpbmcgb24gdGhlCisgICAgICogeS1heGlzIG9ubHksIGkuZS4sIExJR0hUIG1vZGUsIGRvZXNuJ3QgdG91Y2ggdGhlIHgtYXhpcykuICBUaGUgZGVsdGEKKyAgICAgKiB2YWx1ZXMgb2YgdGhlIHNjYWxlciB3b3VsZCBuZWVkIHRvIGJlIGFkanVzdGVkLgogICAgICAqLwogICAgIHNjYWxlci5mYWNlICAgID0gZmFjZTsKICAgICBzY2FsZXIueF9zY2FsZSA9IHNpemVfaW50ZXJuYWwtPmF1dG9oaW50X21ldHJpY3MueF9zY2FsZTsKQEAgLTMxMiwxMCArMzA3LDEwIEBACiAjZW5kaWYKIAogICAgIC8qCi0gICAgICogIEdseXBocyAocmVhbGx5IGNvZGUgcG9pbnRzKSBhcmUgYXNzaWduZWQgdG8gc2NyaXB0cy4gIFNjcmlwdAotICAgICAqICBhbmFseXNpcyBpcyBkb25lIGxhemlseTogRm9yIGVhY2ggZ2x5cGggdGhhdCBwYXNzZXMgdGhyb3VnaCBoZXJlLAotICAgICAqICB0aGUgY29ycmVzcG9uZGluZyBzY3JpcHQgYW5hbHl6ZXIgaXMgY2FsbGVkLCBidXQgcmV0dXJucyBpbW1lZGlhdGVseQotICAgICAqICBpZiBpdCBoYXMgYmVlbiBydW4gYWxyZWFkeS4KKyAgICAgKiBHbHlwaHMgKHJlYWxseSBjb2RlIHBvaW50cykgYXJlIGFzc2lnbmVkIHRvIHNjcmlwdHMuICBTY3JpcHQKKyAgICAgKiBhbmFseXNpcyBpcyBkb25lIGxhemlseTogRm9yIGVhY2ggZ2x5cGggdGhhdCBwYXNzZXMgdGhyb3VnaCBoZXJlLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIHNjcmlwdCBhbmFseXplciBpcyBjYWxsZWQsIGJ1dCByZXR1cm5zIGltbWVkaWF0ZWx5CisgICAgICogaWYgaXQgaGFzIGJlZW4gcnVuIGFscmVhZHkuCiAgICAgICovCiAgICAgZXJyb3IgPSBhZl9mYWNlX2dsb2JhbHNfZ2V0X21ldHJpY3MoIGxvYWRlci0+Z2xvYmFscywgZ2x5cGhfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlX29wdGlvbnMsICZzdHlsZV9tZXRyaWNzICk7CkBAIC0zMjQsNyArMzE5LDcgQEAKIAogICAgIHN0eWxlX2NsYXNzICAgICAgICAgID0gc3R5bGVfbWV0cmljcy0+c3R5bGVfY2xhc3M7CiAgICAgd3JpdGluZ19zeXN0ZW1fY2xhc3MgPQotICAgICAgQUZfV1JJVElOR19TWVNURU1fQ0xBU1NFU19HRVRbc3R5bGVfY2xhc3MtPndyaXRpbmdfc3lzdGVtXTsKKyAgICAgIGFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXNbc3R5bGVfY2xhc3MtPndyaXRpbmdfc3lzdGVtXTsKIAogICAgIGxvYWRlci0+bWV0cmljcyA9IHN0eWxlX21ldHJpY3M7CiAKQEAgLTM0MiwxMSArMzM3LDExIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiAgRG8gdGhlIG1haW4gd29yayBvZiBgYWZfbG9hZGVyX2xvYWRfZ2x5cGgnLiAgTm90ZSB0aGF0IHdlIG5ldmVyIGhhdmUKLSAgICAgKiAgdG8gZGVhbCB3aXRoIGNvbXBvc2l0ZSBnbHlwaHMgYXMgdGhvc2UgZ2V0IGxvYWRlZCBpbnRvCi0gICAgICogIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIGJ5IHRoZSByZWN1cnNlZCBgRlRfTG9hZF9HbHlwaCcgZnVuY3Rpb24uCi0gICAgICogIEluIHRoZSByYXJlIGNhc2VzIHdoZXJlIEZUX0xPQURfTk9fUkVDVVJTRSBpcyBzZXQsIGl0IGltcGxpZXMKLSAgICAgKiAgRlRfTE9BRF9OT19TQ0FMRSBhbmQgYXMgc3VjaCB0aGUgYXV0by1oaW50ZXIgaXMgbmV2ZXIgY2FsbGVkLgorICAgICAqIERvIHRoZSBtYWluIHdvcmsgb2YgYGFmX2xvYWRlcl9sb2FkX2dseXBoJy4gIE5vdGUgdGhhdCB3ZSBuZXZlciBoYXZlCisgICAgICogdG8gZGVhbCB3aXRoIGNvbXBvc2l0ZSBnbHlwaHMgYXMgdGhvc2UgZ2V0IGxvYWRlZCBpbnRvCisgICAgICogRlRfR0xZUEhfRk9STUFUX09VVExJTkUgYnkgdGhlIHJlY3Vyc2VkIGBGVF9Mb2FkX0dseXBoJyBmdW5jdGlvbi4KKyAgICAgKiBJbiB0aGUgcmFyZSBjYXNlcyB3aGVyZSBGVF9MT0FEX05PX1JFQ1VSU0UgaXMgc2V0LCBpdCBpbXBsaWVzCisgICAgICogRlRfTE9BRF9OT19TQ0FMRSBhbmQgYXMgc3VjaCB0aGUgYXV0by1oaW50ZXIgaXMgbmV2ZXIgY2FsbGVkLgogICAgICAqLwogICAgIGxvYWRfZmxhZ3MgfD0gIEZUX0xPQURfTk9fU0NBTEUgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNIHwKQEAgLTM1OCwyNiArMzUzLDI2IEBACiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICAvKgotICAgICAqICBBcHBseSBzdGVtIGRhcmtlbmluZyAoZW1ib2xkZW5pbmcpIGhlcmUgYmVmb3JlIGhpbnRzIGFyZSBhcHBsaWVkIHRvCi0gICAgICogIHRoZSBvdXRsaW5lLiAgR2x5cGhzIGFyZSBzY2FsZWQgZG93biBwcm9wb3J0aW9uYWxseSB0byB0aGUKLSAgICAgKiAgZW1ib2xkZW5pbmcgc28gdGhhdCBjdXJ2ZSBwb2ludHMgZG9uJ3QgZmFsbCBvdXRzaWRlIHRoZWlyCi0gICAgICogIHByZWNvbXB1dGVkIGJsdWUgem9uZXMuCisgICAgICogQXBwbHkgc3RlbSBkYXJrZW5pbmcgKGVtYm9sZGVuaW5nKSBoZXJlIGJlZm9yZSBoaW50cyBhcmUgYXBwbGllZCB0bworICAgICAqIHRoZSBvdXRsaW5lLiAgR2x5cGhzIGFyZSBzY2FsZWQgZG93biBwcm9wb3J0aW9uYWxseSB0byB0aGUKKyAgICAgKiBlbWJvbGRlbmluZyBzbyB0aGF0IGN1cnZlIHBvaW50cyBkb24ndCBmYWxsIG91dHNpZGUgdGhlaXIKKyAgICAgKiBwcmVjb21wdXRlZCBibHVlIHpvbmVzLgogICAgICAqCi0gICAgICogIEFueSBlbWJvbGRlbmluZyBkb25lIGJ5IHRoZSBmb250IGRyaXZlciAoZS5nLiwgdGhlIENGRiBkcml2ZXIpCi0gICAgICogIGRvZXNuJ3QgcmVhY2ggaGVyZSBiZWNhdXNlIHRoZSBhdXRvaGludGVyIGxvYWRzIHRoZSB1bnByb2Nlc3NlZAotICAgICAqICBnbHlwaHMgaW4gZm9udCB1bml0cyBmb3IgYW5hbHlzaXMgKGZ1bmN0aW9ucyBgYWZfKl9tZXRyaWNzX2luaXRfKicpCi0gICAgICogIGFuZCB0aGVuIGFib3ZlIHRvIHByZXBhcmUgaXQgZm9yIHRoZSByYXN0ZXJpemVycyBieSBpdHNlbGYsCi0gICAgICogIGluZGVwZW5kZW50bHkgb2YgdGhlIGZvbnQgZHJpdmVyLiAgU28gZW1ib2xkZW5pbmcgbXVzdCBiZSBkb25lIGhlcmUsCi0gICAgICogIHdpdGhpbiB0aGUgYXV0b2hpbnRlci4KKyAgICAgKiBBbnkgZW1ib2xkZW5pbmcgZG9uZSBieSB0aGUgZm9udCBkcml2ZXIgKGUuZy4sIHRoZSBDRkYgZHJpdmVyKQorICAgICAqIGRvZXNuJ3QgcmVhY2ggaGVyZSBiZWNhdXNlIHRoZSBhdXRvaGludGVyIGxvYWRzIHRoZSB1bnByb2Nlc3NlZAorICAgICAqIGdseXBocyBpbiBmb250IHVuaXRzIGZvciBhbmFseXNpcyAoZnVuY3Rpb25zIGBhZl8qX21ldHJpY3NfaW5pdF8qJykKKyAgICAgKiBhbmQgdGhlbiBhYm92ZSB0byBwcmVwYXJlIGl0IGZvciB0aGUgcmFzdGVyaXplcnMgYnkgaXRzZWxmLAorICAgICAqIGluZGVwZW5kZW50bHkgb2YgdGhlIGZvbnQgZHJpdmVyLiAgU28gZW1ib2xkZW5pbmcgbXVzdCBiZSBkb25lIGhlcmUsCisgICAgICogd2l0aGluIHRoZSBhdXRvaGludGVyLgogICAgICAqCi0gICAgICogIEFsbCBnbHlwaHMgdG8gYmUgYXV0b2hpbnRlZCBwYXNzIHRocm91Z2ggaGVyZSBvbmUgYnkgb25lLiAgVGhlCi0gICAgICogIHN0YW5kYXJkIHdpZHRocyBjYW4gdGhlcmVmb3JlIGNoYW5nZSBmcm9tIG9uZSBnbHlwaCB0byB0aGUgbmV4dCwKLSAgICAgKiAgZGVwZW5kaW5nIG9uIHdoYXQgc2NyaXB0IGEgZ2x5cGggaXMgYXNzaWduZWQgdG8gKGVhY2ggc2NyaXB0IGhhcyBpdHMKLSAgICAgKiAgb3duIHNldCBvZiBzdGFuZGFyZCB3aWR0aHMgYW5kIG90aGVyIG1ldHJpY3MpLiAgVGhlIGRhcmtlbmluZyBhbW91bnQKLSAgICAgKiAgbXVzdCB0aGVyZWZvcmUgYmUgcmVjb21wdXRlZCBmb3IgZWFjaCBzaXplIGFuZAotICAgICAqICBgc3RhbmRhcmRfe3ZlcnRpY2FsLGhvcml6b250YWx9X3dpZHRoJyBjaGFuZ2UuCisgICAgICogQWxsIGdseXBocyB0byBiZSBhdXRvaGludGVkIHBhc3MgdGhyb3VnaCBoZXJlIG9uZSBieSBvbmUuICBUaGUKKyAgICAgKiBzdGFuZGFyZCB3aWR0aHMgY2FuIHRoZXJlZm9yZSBjaGFuZ2UgZnJvbSBvbmUgZ2x5cGggdG8gdGhlIG5leHQsCisgICAgICogZGVwZW5kaW5nIG9uIHdoYXQgc2NyaXB0IGEgZ2x5cGggaXMgYXNzaWduZWQgdG8gKGVhY2ggc2NyaXB0IGhhcyBpdHMKKyAgICAgKiBvd24gc2V0IG9mIHN0YW5kYXJkIHdpZHRocyBhbmQgb3RoZXIgbWV0cmljcykuICBUaGUgZGFya2VuaW5nIGFtb3VudAorICAgICAqIG11c3QgdGhlcmVmb3JlIGJlIHJlY29tcHV0ZWQgZm9yIGVhY2ggc2l6ZSBhbmQKKyAgICAgKiBgc3RhbmRhcmRfe3ZlcnRpY2FsLGhvcml6b250YWx9X3dpZHRoJyBjaGFuZ2UuCiAgICAgICoKLSAgICAgKiAgSWdub3JlIGVycm9ycyBhbmQgY2Fycnkgb24gd2l0aG91dCBlbWJvbGRlbmluZy4KKyAgICAgKiBJZ25vcmUgZXJyb3JzIGFuZCBjYXJyeSBvbiB3aXRob3V0IGVtYm9sZGVuaW5nLgogICAgICAqCiAgICAgICovCiAKQEAgLTQyNiwzNSArNDIxLDM5IEBACiAgICAgICAvKiBub3cgbG9hZCB0aGUgc2xvdCBpbWFnZSBpbnRvIHRoZSBhdXRvLW91dGxpbmUgKi8KICAgICAgIC8qIGFuZCBydW4gdGhlIGF1dG9tYXRpYyBoaW50aW5nIHByb2Nlc3MgICAgICAgICAqLwogICAgICAgaWYgKCB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfaGludHNfYXBwbHkgKQotICAgICAgICB3cml0aW5nX3N5c3RlbV9jbGFzcy0+c3R5bGVfaGludHNfYXBwbHkoIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbG9hZGVyLT5iYXNlLm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVfbWV0cmljcyApOworICAgICAgeworICAgICAgICBlcnJvciA9IHdyaXRpbmdfc3lzdGVtX2NsYXNzLT5zdHlsZV9oaW50c19hcHBseSgKKyAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgaGludHMsCisgICAgICAgICAgICAgICAgICAmZ2xvYWRlci0+YmFzZS5vdXRsaW5lLAorICAgICAgICAgICAgICAgICAgc3R5bGVfbWV0cmljcyApOworICAgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CiAKICAgICAgIC8qIHdlIG5vdyBuZWVkIHRvIGFkanVzdCB0aGUgbWV0cmljcyBhY2NvcmRpbmcgdG8gdGhlIGNoYW5nZSBpbiAqLwogICAgICAgLyogd2lkdGgvcG9zaXRpb25pbmcgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIGhpbnRpbmcgcHJvY2VzcyAgICovCiAgICAgICBpZiAoIHNjYWxlci5yZW5kZXJfbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MSUdIVCApCiAgICAgICB7Ci0gICAgICAgIEZUX1BvcyAgb2xkX3JzYiwgb2xkX2xzYiwgbmV3X2xzYjsKLSAgICAgICAgRlRfUG9zICBwcDF4X3VoLCBwcDJ4X3VoOwotCiAgICAgICAgIEFGX0F4aXNIaW50cyAgYXhpcyAgPSAmaGludHMtPmF4aXNbQUZfRElNRU5TSU9OX0hPUlpdOwotICAgICAgICBBRl9FZGdlICAgICAgIGVkZ2UxID0gYXhpcy0+ZWRnZXM7ICAgICAgICAgLyogbGVmdG1vc3QgZWRnZSAgKi8KLSAgICAgICAgQUZfRWRnZSAgICAgICBlZGdlMiA9IGVkZ2UxICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPm51bV9lZGdlcyAtIDE7IC8qIHJpZ2h0bW9zdCBlZGdlICovCiAKIAogICAgICAgICBpZiAoIGF4aXMtPm51bV9lZGdlcyA+IDEgJiYgQUZfSElOVFNfRE9fQURWQU5DRSggaGludHMgKSApCiAgICAgICAgIHsKLSAgICAgICAgICBvbGRfcnNiID0gbG9hZGVyLT5wcDIueCAtIGVkZ2UyLT5vcG9zOworICAgICAgICAgIEFGX0VkZ2UgIGVkZ2UxID0gYXhpcy0+ZWRnZXM7ICAgICAgICAgLyogbGVmdG1vc3QgZWRnZSAgKi8KKyAgICAgICAgICBBRl9FZGdlICBlZGdlMiA9IGVkZ2UxICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPm51bV9lZGdlcyAtIDE7IC8qIHJpZ2h0bW9zdCBlZGdlICovCisKKyAgICAgICAgICBGVF9Qb3MgIG9sZF9yc2IgPSBsb2FkZXItPnBwMi54IC0gZWRnZTItPm9wb3M7CiAgICAgICAgICAgLyogbG9hZGVyLT5wcDEueCBpcyBhbHdheXMgemVybyBhdCB0aGlzIHBvaW50IG9mIHRpbWUgKi8KLSAgICAgICAgICBvbGRfbHNiID0gZWRnZTEtPm9wb3MgLyogLSBsb2FkZXItPnBwMS54ICovOwotICAgICAgICAgIG5ld19sc2IgPSBlZGdlMS0+cG9zOworICAgICAgICAgIEZUX1BvcyAgb2xkX2xzYiA9IGVkZ2UxLT5vcG9zOyAgICAgLyogLSBsb2FkZXItPnBwMS54ICovCisgICAgICAgICAgRlRfUG9zICBuZXdfbHNiID0gZWRnZTEtPnBvczsKIAogICAgICAgICAgIC8qIHJlbWVtYmVyIHVuaGludGVkIHZhbHVlcyB0byBsYXRlciBhY2NvdW50ICovCiAgICAgICAgICAgLyogZm9yIHJvdW5kaW5nIGVycm9ycyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwcDF4X3VoID0gbmV3X2xzYiAgICAtIG9sZF9sc2I7Ci0gICAgICAgICAgcHAyeF91aCA9IGVkZ2UyLT5wb3MgKyBvbGRfcnNiOworICAgICAgICAgIEZUX1BvcyAgcHAxeF91aCA9IG5ld19sc2IgICAgLSBvbGRfbHNiOworICAgICAgICAgIEZUX1BvcyAgcHAyeF91aCA9IGVkZ2UyLT5wb3MgKyBvbGRfcnNiOworCiAKICAgICAgICAgICAvKiBwcmVmZXIgdG9vIG11Y2ggc3BhY2Ugb3ZlciB0b28gbGl0dGxlIHNwYWNlICovCiAgICAgICAgICAgLyogZm9yIHZlcnkgc21hbGwgc2l6ZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaCBiL3NyYy9hdXRvZml0L2FmbG9hZGVyLmgKaW5kZXggZDRkNzJkMS4uOTcyODIzNyAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZsb2FkZXIuaAorKysgYi9zcmMvYXV0b2ZpdC9hZmxvYWRlci5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZmxvYWRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgZ2x5cGggbG9hZGluZyByb3V0aW5lcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZmxvYWRlci5oCisgKgorICogICBBdXRvLWZpdHRlciBnbHlwaCBsb2FkaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZMT0FERVJfSF8KQEAgLTI3LDExICsyNywxMSBAQAogRlRfQkVHSU5fSEVBREVSCiAKICAgLyoKLSAgICogIFRoZSBhdXRvZml0dGVyIG1vZHVsZSdzIChnbG9iYWwpIGRhdGEgc3RydWN0dXJlIHRvIGNvbW11bmljYXRlIHdpdGgKLSAgICogIGFjdHVhbCBmb250cy4gIElmIG5lY2Vzc2FyeSwgYGxvY2FsJyBkYXRhIGxpa2UgdGhlIGN1cnJlbnQgZmFjZSwgdGhlCi0gICAqICBjdXJyZW50IGZhY2UncyBhdXRvLWhpbnQgZGF0YSwgb3IgdGhlIGN1cnJlbnQgZ2x5cGgncyBwYXJhbWV0ZXJzCi0gICAqICByZWxldmFudCB0byBhdXRvLWhpbnRpbmcgYXJlIGBzd2FwcGVkIGluJy4gIENmLiBmdW5jdGlvbnMgbGlrZQotICAgKiAgYGFmX2xvYWRlcl9yZXNldCcgYW5kIGBhZl9sb2FkZXJfbG9hZF9nJy4KKyAgICogVGhlIGF1dG9maXR0ZXIgbW9kdWxlJ3MgKGdsb2JhbCkgZGF0YSBzdHJ1Y3R1cmUgdG8gY29tbXVuaWNhdGUgd2l0aAorICAgKiBhY3R1YWwgZm9udHMuICBJZiBuZWNlc3NhcnksIGBsb2NhbCcgZGF0YSBsaWtlIHRoZSBjdXJyZW50IGZhY2UsIHRoZQorICAgKiBjdXJyZW50IGZhY2UncyBhdXRvLWhpbnQgZGF0YSwgb3IgdGhlIGN1cnJlbnQgZ2x5cGgncyBwYXJhbWV0ZXJzCisgICAqIHJlbGV2YW50IHRvIGF1dG8taGludGluZyBhcmUgYHN3YXBwZWQgaW4nLiAgQ2YuIGZ1bmN0aW9ucyBsaWtlCisgICAqIGBhZl9sb2FkZXJfcmVzZXQnIGFuZCBgYWZfbG9hZGVyX2xvYWRfZycuCiAgICAqLwogCiAgIHR5cGVkZWYgc3RydWN0ICBBRl9Mb2FkZXJSZWNfCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5jIGIvc3JjL2F1dG9maXQvYWZtb2R1bGUuYwppbmRleCBkY2FhMTdhLi5lMTY0OTQ0IDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5jCisrKyBiL3NyYy9hdXRvZml0L2FmbW9kdWxlLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbW9kdWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmbW9kdWxlLmMKKyAqCisgKiAgIEF1dG8tZml0dGVyIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZnbG9iYWwuaCIKICNpbmNsdWRlICJhZm1vZHVsZS5oIgogI2luY2x1ZGUgImFmbG9hZGVyLmgiCiAjaW5jbHVkZSAiYWZlcnJvcnMuaCIKLSNpbmNsdWRlICJhZnBpYy5oIgogCiAjaWZkZWYgRlRfREVCVUdfQVVUT0ZJVAogCkBAIC01NCwyMCArNTMsMjAgQEAKICAgdm9pZCogIF9hZl9kZWJ1Z19oaW50cyA9IF9hZl9kZWJ1Z19oaW50c19yZWM7CiAjZW5kaWYKIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9hZm1vZHVsZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGFmbW9kdWxlCiAKIAogICBzdGF0aWMgRlRfRXJyb3IKQEAgLTEwNCwxOSArMTAzLDYgQEAKICAgfQogCiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jdW5kZWYgIEFGX1NDUklQVF9DTEFTU0VTX0dFVAotI2RlZmluZSBBRl9TQ1JJUFRfQ0xBU1NFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGZ0X21vZHVsZS0+bGlicmFyeSApLT5hZl9zY3JpcHRfY2xhc3NlcyApCi0KLSN1bmRlZiAgQUZfU1RZTEVfQ0xBU1NFU19HRVQKLSNkZWZpbmUgQUZfU1RZTEVfQ0xBU1NFU19HRVQgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGZ0X21vZHVsZS0+bGlicmFyeSApLT5hZl9zdHlsZV9jbGFzc2VzICkKLQotI2VuZGlmCi0KLQogICBzdGF0aWMgRlRfRXJyb3IKICAgYWZfcHJvcGVydHlfc2V0KCBGVF9Nb2R1bGUgICAgZnRfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLApAQCAtMTQ3LDkgKzEzMyw5IEBACiAgICAgICAvKiBXZSB0cmFuc2xhdGUgdGhlIGZhbGxiYWNrIHNjcmlwdCB0byBhIGZhbGxiYWNrIHN0eWxlIHRoYXQgdXNlcyAqLwogICAgICAgLyogYGZhbGxiYWNrLXNjcmlwdCcgYXMgaXRzIHNjcmlwdCBhbmQgYEFGX0NPVkVSQUdFX05PTkUnIGFzIGl0cyAgKi8KICAgICAgIC8qIGNvdmVyYWdlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBmb3IgKCBzcyA9IDA7IEFGX1NUWUxFX0NMQVNTRVNfR0VUW3NzXTsgc3MrKyApCisgICAgICBmb3IgKCBzcyA9IDA7IGFmX3N0eWxlX2NsYXNzZXNbc3NdOyBzcysrICkKICAgICAgIHsKLSAgICAgICAgQUZfU3R5bGVDbGFzcyAgc3R5bGVfY2xhc3MgPSBBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc107CisgICAgICAgIEFGX1N0eWxlQ2xhc3MgIHN0eWxlX2NsYXNzID0gYWZfc3R5bGVfY2xhc3Nlc1tzc107CiAKIAogICAgICAgICBpZiAoIChGVF9VSW50KXN0eWxlX2NsYXNzLT5zY3JpcHQgPT0gKmZhbGxiYWNrX3NjcmlwdCAmJgpAQCAtMTYwLDEwICsxNDYsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBpZiAoICFBRl9TVFlMRV9DTEFTU0VTX0dFVFtzc10gKQorICAgICAgaWYgKCAhYWZfc3R5bGVfY2xhc3Nlc1tzc10gKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTAoKCAiYWZfcHJvcGVydHlfc2V0OiBJbnZhbGlkIHZhbHVlICVkIGZvciBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICBmYWxsYmFja19zY3JpcHQsIHByb3BlcnR5X25hbWUgKSk7CisgICAgICAgICAgICAgICAgICAgICpmYWxsYmFja19zY3JpcHQsIHByb3BlcnR5X25hbWUgKSk7CiAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogICAgICAgfQogCkBAIC0zNTcsNyArMzQzLDcgQEAKICAgICB7CiAgICAgICBGVF9VSW50KiAgdmFsID0gKEZUX1VJbnQqKXZhbHVlOwogCi0gICAgICBBRl9TdHlsZUNsYXNzICBzdHlsZV9jbGFzcyA9IEFGX1NUWUxFX0NMQVNTRVNfR0VUW2ZhbGxiYWNrX3N0eWxlXTsKKyAgICAgIEFGX1N0eWxlQ2xhc3MgIHN0eWxlX2NsYXNzID0gYWZfc3R5bGVfY2xhc3Nlc1tmYWxsYmFja19zdHlsZV07CiAKIAogICAgICAgKnZhbCA9IHN0eWxlX2NsYXNzLT5zY3JpcHQ7CkBAIC00NDAsMjggKzQyNiwxNiBAQAogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKAogICAgIGFmX3NlcnZpY2VzLAogCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAmQUZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCisgICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAmYWZfc2VydmljZV9wcm9wZXJ0aWVzICkKIAogCiAgIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCiAgIGFmX2dldF9pbnRlcmZhY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfaW50ZXJmYWNlICkKICAgewotICAgIC8qIEFGX1NFUlZJQ0VTX0dFVCBkZXJlZmVyZW5jZXMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotCi0KLSAgICBpZiAoICFtb2R1bGUgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbGlicmFyeSA9IG1vZHVsZS0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBOVUxMOwotI2Vsc2UKICAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotI2VuZGlmCiAKLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggQUZfU0VSVklDRVNfR0VULCBtb2R1bGVfaW50ZXJmYWNlICk7CisgICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIGFmX3NlcnZpY2VzLCBtb2R1bGVfaW50ZXJmYWNlICk7CiAgIH0KIAogCkBAIC01MzMsNyArNTA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9DT01QT05FTlRdICkKKyAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9UUkFDRV9DT01QKCBGVF9DT01QT05FTlQgKV0gKQogICAgIHsKICNlbmRpZgogICAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMoIGhpbnRzLCAwICk7CkBAIC01NzYsOCArNTUwLDggQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNldF9mYWNlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ2V0X2dsb2JhbF9oaW50cyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uZV9nbG9iYWxfaGludHMgKi8KLSAgICAoRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jKWFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCApICAvKiBsb2FkX2dseXBoICovCi0KKyAgICAoRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jKWFmX2F1dG9maXR0ZXJfbG9hZF9nbHlwaCAgICAvKiBsb2FkX2dseXBoICovCisgICkKIAogICBGVF9ERUZJTkVfTU9EVUxFKAogICAgIGF1dG9maXRfbW9kdWxlX2NsYXNzLApAQCAtNTg5LDcgKzU2Myw3IEBACiAgICAgMHgxMDAwMEwsICAgLyogdmVyc2lvbiAxLjAgb2YgdGhlIGF1dG9maXR0ZXIgICovCiAgICAgMHgyMDAwMEwsICAgLyogcmVxdWlyZXMgRnJlZVR5cGUgMi4wIG9yIGFib3ZlICovCiAKLSAgICAoY29uc3Qgdm9pZCopJkFGX0lOVEVSRkFDRV9HRVQsCisgICAgKGNvbnN0IHZvaWQqKSZhZl9hdXRvZml0dGVyX2ludGVyZmFjZSwKIAogICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpYWZfYXV0b2ZpdHRlcl9pbml0LCAgLyogbW9kdWxlX2luaXQgICAqLwogICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgYWZfYXV0b2ZpdHRlcl9kb25lLCAgLyogbW9kdWxlX2RvbmUgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZtb2R1bGUuaCBiL3NyYy9hdXRvZml0L2FmbW9kdWxlLmgKaW5kZXggNTZmNjRlYS4uZThmZTRhOSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZtb2R1bGUuaAorKysgYi9zcmMvYXV0b2ZpdC9hZm1vZHVsZS5oCkBAIC0xLDM1ICsxLDM0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1vZHVsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZm1vZHVsZS5oCisgKgorICogICBBdXRvLWZpdHRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBBRk1PRFVMRV9IXwogI2RlZmluZSBBRk1PRFVMRV9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfTU9EVUxFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGFwaS5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKICAgLyoKLSAgICogIFRoaXMgaXMgdGhlIGBleHRlbmRlZCcgRlRfTW9kdWxlIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZQotICAgKiAgYXV0b2ZpdHRlcidzIGdsb2JhbCBkYXRhLgorICAgKiBUaGlzIGlzIHRoZSBgZXh0ZW5kZWQnIEZUX01vZHVsZSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyB0aGUKKyAgICogYXV0b2ZpdHRlcidzIGdsb2JhbCBkYXRhLgogICAgKi8KIAogICB0eXBlZGVmIHN0cnVjdCAgQUZfTW9kdWxlUmVjXwpAQCAtNDcsNiArNDYsNyBAQAogICB9IEFGX01vZHVsZVJlYywgKkFGX01vZHVsZTsKIAogCitGVF9ERUNMQVJFX0FVVE9ISU5URVJfSU5URVJGQUNFKCBhZl9hdXRvZml0dGVyX2ludGVyZmFjZSApCiBGVF9ERUNMQVJFX01PRFVMRSggYXV0b2ZpdF9tb2R1bGVfY2xhc3MgKQogCiAKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2FmcGljLmMgYi9zcmMvYXV0b2ZpdC9hZnBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDhkMDE2Li4wMDAwMDAwCi0tLSBhL3NyYy9hdXRvZml0L2FmcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBhdXRvZml0IG1vZHVsZS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgImFmcGljLmgiCi0jaW5jbHVkZSAiYWZnbG9iYWwuaCIKLSNpbmNsdWRlICJhZmVycm9ycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gYWZtb2R1bGUuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfYWZfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICk7Ci0KLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX2FmX3NlcnZpY2VzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLQotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfYWZfc2VydmljZV9wcm9wZXJ0aWVzKCBGVF9TZXJ2aWNlX1Byb3BlcnRpZXNSZWMqICBjbGF6eiApOwotCi0gIHZvaWQgRlRfSW5pdF9DbGFzc19hZl9hdXRvZml0dGVyX2ludGVyZmFjZSgKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMqICBjbGF6eiApOwotCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSB3cml0aW5nIHN5c3RlbSBjbGFzc2VzICovCi0jdW5kZWYgIFdSSVRJTkdfU1lTVEVNCi0jZGVmaW5lIFdSSVRJTkdfU1lTVEVNKCB3cywgV1MgKSAgLyogZW1wdHkgKi8KLQotI2luY2x1ZGUgImFmd3J0c3lzLmgiCi0KLQotICB2b2lkCi0gIGF1dG9maXRfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+YXV0b2ZpdCApCi0gICAgewotICAgICAgQUZNb2R1bGVQSUMqICBjb250YWluZXIgPSAoQUZNb2R1bGVQSUMqKXBpY19jb250YWluZXItPmF1dG9maXQ7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPmFmX3NlcnZpY2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc19hZl9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5hZl9zZXJ2aWNlcyApOwotICAgICAgY29udGFpbmVyLT5hZl9zZXJ2aWNlcyA9IE5VTEw7Ci0KLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+YXV0b2ZpdCA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX1VJbnQgICAgICAgICAgICBzczsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBBRk1vZHVsZVBJQyogICAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyAoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+YXV0b2ZpdCA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0YWJsZSAtICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHRoaXMgaXMgaG93IHRoZSBtb2R1bGUgdXN1YWxseSBleHBlY3RzIHRoaXMgZGF0YSAqLwotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX2FmX3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT5hZl9zZXJ2aWNlcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfSW5pdF9DbGFzc19hZl9zZXJ2aWNlX3Byb3BlcnRpZXMoICZjb250YWluZXItPmFmX3NlcnZpY2VfcHJvcGVydGllcyApOwotCi0gICAgZm9yICggc3MgPSAwOyBzcyA8IEFGX1dSSVRJTkdfU1lTVEVNX01BWDsgc3MrKyApCi0gICAgICBjb250YWluZXItPmFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXNbc3NdID0KLSAgICAgICAgJmNvbnRhaW5lci0+YWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc19yZWNbc3NdOwotICAgIGNvbnRhaW5lci0+YWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc1tBRl9XUklUSU5HX1NZU1RFTV9NQVhdID0gTlVMTDsKLQotICAgIGZvciAoIHNzID0gMDsgc3MgPCBBRl9TQ1JJUFRfTUFYOyBzcysrICkKLSAgICAgIGNvbnRhaW5lci0+YWZfc2NyaXB0X2NsYXNzZXNbc3NdID0KLSAgICAgICAgJmNvbnRhaW5lci0+YWZfc2NyaXB0X2NsYXNzZXNfcmVjW3NzXTsKLSAgICBjb250YWluZXItPmFmX3NjcmlwdF9jbGFzc2VzW0FGX1NDUklQVF9NQVhdID0gTlVMTDsKLQotICAgIGZvciAoIHNzID0gMDsgc3MgPCBBRl9TVFlMRV9NQVg7IHNzKysgKQotICAgICAgY29udGFpbmVyLT5hZl9zdHlsZV9jbGFzc2VzW3NzXSA9Ci0gICAgICAgICZjb250YWluZXItPmFmX3N0eWxlX2NsYXNzZXNfcmVjW3NzXTsKLSAgICBjb250YWluZXItPmFmX3N0eWxlX2NsYXNzZXNbQUZfU1RZTEVfTUFYXSA9IE5VTEw7Ci0KLSN1bmRlZiAgV1JJVElOR19TWVNURU0KLSNkZWZpbmUgV1JJVElOR19TWVNURU0oIHdzLCBXUyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEZUX0luaXRfQ2xhc3NfYWZfICMjIHdzICMjIF93cml0aW5nX3N5c3RlbV9jbGFzcyggICAgXAotICAgICAgICAgICZjb250YWluZXItPmFmX3dyaXRpbmdfc3lzdGVtX2NsYXNzZXNfcmVjW3NzKytdICk7Ci0KLSAgICBzcyA9IDA7Ci0jaW5jbHVkZSAiYWZ3cnRzeXMuaCIKLQotI3VuZGVmICBTQ1JJUFQKLSNkZWZpbmUgU0NSSVBUKCBzLCBTLCBkLCBoLCBILCBzc3MgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICBGVF9Jbml0X0NsYXNzX2FmXyAjIyBzICMjIF9zY3JpcHRfY2xhc3MoICAgICBcCi0gICAgICAgICAgJmNvbnRhaW5lci0+YWZfc2NyaXB0X2NsYXNzZXNfcmVjW3NzKytdICk7Ci0KLSAgICBzcyA9IDA7Ci0jaW5jbHVkZSAiYWZzY3JpcHQuaCIKLQotI3VuZGVmICBTVFlMRQotI2RlZmluZSBTVFlMRSggcywgUywgZCwgd3MsIHNjLCBic3MsIGMgKSAgICAgICAgICAgIFwKLSAgICAgICAgRlRfSW5pdF9DbGFzc19hZl8gIyMgcyAjIyBfc3R5bGVfY2xhc3MoICAgICBcCi0gICAgICAgICAgJmNvbnRhaW5lci0+YWZfc3R5bGVfY2xhc3Nlc19yZWNbc3MrK10gKTsKLQotICAgIHNzID0gMDsKLSNpbmNsdWRlICJhZnN0eWxlcy5oIgotCi0gICAgRlRfSW5pdF9DbGFzc19hZl9hdXRvZml0dGVyX2ludGVyZmFjZSgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmFmX2F1dG9maXR0ZXJfaW50ZXJmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGF1dG9maXRfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZwaWMuaCBiL3NyYy9hdXRvZml0L2FmcGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNzM0NTYuLjAwMDAwMDAKLS0tIGEvc3JjL2F1dG9maXQvYWZwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGF1dG9maXQgbW9kdWxlLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQUZQSUNfSF8KLSNkZWZpbmUgQUZQSUNfSF8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBBRl9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgYWZfc2VydmljZXMKLSNkZWZpbmUgQUZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgIGFmX3NlcnZpY2VfcHJvcGVydGllcwotCi0jZGVmaW5lIEFGX1dSSVRJTkdfU1lTVEVNX0NMQVNTRVNfR0VUICBhZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzCi0jZGVmaW5lIEFGX1NDUklQVF9DTEFTU0VTX0dFVCAgICAgICAgICBhZl9zY3JpcHRfY2xhc3NlcwotI2RlZmluZSBBRl9TVFlMRV9DTEFTU0VTX0dFVCAgICAgICAgICAgYWZfc3R5bGVfY2xhc3NlcwotI2RlZmluZSBBRl9JTlRFUkZBQ0VfR0VUICAgICAgICAgICAgICAgYWZfYXV0b2ZpdHRlcl9pbnRlcmZhY2UKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiBzb21lIGluY2x1ZGUgZmlsZXMgcmVxdWlyZWQgZm9yIG1lbWJlcnMgb2YgQUZNb2R1bGVQSUMgKi8KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0KLSNpbmNsdWRlICJhZnR5cGVzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICAgICAgIGFmX3NlcnZpY2VzOwotICAgIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgICBhZl9zZXJ2aWNlX3Byb3BlcnRpZXM7Ci0KLSAgICBBRl9Xcml0aW5nU3lzdGVtQ2xhc3MgICAgICAgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9XUklUSU5HX1NZU1RFTV9NQVggKyAxXTsKLSAgICBBRl9Xcml0aW5nU3lzdGVtQ2xhc3NSZWMgICAgYWZfd3JpdGluZ19zeXN0ZW1fY2xhc3Nlc19yZWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUZfV1JJVElOR19TWVNURU1fTUFYXTsKLQotICAgIEFGX1NjcmlwdENsYXNzICAgICAgICAgICAgICBhZl9zY3JpcHRfY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9TQ1JJUFRfTUFYICsgMV07Ci0gICAgQUZfU2NyaXB0Q2xhc3NSZWMgICAgICAgICAgIGFmX3NjcmlwdF9jbGFzc2VzX3JlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9TQ1JJUFRfTUFYXTsKLQotICAgIEFGX1N0eWxlQ2xhc3MgICAgICAgICAgICAgICBhZl9zdHlsZV9jbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FGX1NUWUxFX01BWCArIDFdOwotICAgIEFGX1N0eWxlQ2xhc3NSZWMgICAgICAgICAgICBhZl9zdHlsZV9jbGFzc2VzX3JlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBRl9TVFlMRV9NQVhdOwotCi0gICAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMgIGFmX2F1dG9maXR0ZXJfaW50ZXJmYWNlOwotCi0gIH0gQUZNb2R1bGVQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSAgXAotICAgICAgICAgICggKEFGTW9kdWxlUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLmF1dG9maXQgKSApCi0KLSNkZWZpbmUgQUZfU0VSVklDRVNfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmFmX3NlcnZpY2VzICkKLSNkZWZpbmUgQUZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5hZl9zZXJ2aWNlX3Byb3BlcnRpZXMgKQotCi0jZGVmaW5lIEFGX1dSSVRJTkdfU1lTVEVNX0NMQVNTRVNfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBGVF9GQUNFX0xJQlJBUlkoIGdsb2JhbHMtPmZhY2UgKSApLT5hZl93cml0aW5nX3N5c3RlbV9jbGFzc2VzICkKLSNkZWZpbmUgQUZfU0NSSVBUX0NMQVNTRVNfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBGVF9GQUNFX0xJQlJBUlkoIGdsb2JhbHMtPmZhY2UgKSApLT5hZl9zY3JpcHRfY2xhc3NlcyApCi0jZGVmaW5lIEFGX1NUWUxFX0NMQVNTRVNfR0VUICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBGVF9GQUNFX0xJQlJBUlkoIGdsb2JhbHMtPmZhY2UgKSApLT5hZl9zdHlsZV9jbGFzc2VzICkKLSNkZWZpbmUgQUZfSU5URVJGQUNFX0dFVCAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5hZl9hdXRvZml0dGVyX2ludGVyZmFjZSApCi0KLQotICAvKiBzZWUgYWZwaWMuYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uICovCi0gIHZvaWQKLSAgYXV0b2ZpdF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBhdXRvZml0X21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIEFGUElDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hZnJhbmdlcy5jIGIvc3JjL2F1dG9maXQvYWZyYW5nZXMuYwppbmRleCBjZjY3ZmFmLi5jOGViZjVlIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9hZnJhbmdlcy5jCisrKyBiL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmMKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmcmFuZ2VzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciBVbmljb2RlIHNjcmlwdCByYW5nZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmcmFuZ2VzLmMKKyAqCisgKiAgIEF1dG8tZml0dGVyIFVuaWNvZGUgc2NyaXB0IHJhbmdlcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiYWZyYW5nZXMuaCIKQEAgLTY2NCw2ICs2NjQsMzMgQEAKICAgfTsKIAogCisgIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfbWVkZl91bmlyYW5nZXNbXSA9CisgIHsKKyAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTZFNDAsIDB4MTZFOUYgKSwgIC8qIE1lZGVmYWlkcmluICovCisgICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKKyAgfTsKKworICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX21lZGZfbm9uYmFzZV91bmlyYW5nZXNbXSA9CisgIHsKKyAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQorICB9OworCisKKyAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9tb25nX3VuaXJhbmdlc1tdID0KKyAgeworICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTgwMCwgIDB4MThBRiApLCAgLyogTW9uZ29saWFuICAgICAgICAgICAgKi8KKyAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTE2NjAsIDB4MTE2N0YgKSwgIC8qIE1vbmdvbGlhbiBTdXBwbGVtZW50ICovCisgICAgQUZfVU5JUkFOR0VfUkVDKCAgICAgICAwLCAgICAgICAwICkKKyAgfTsKKworICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX21vbmdfbm9uYmFzZV91bmlyYW5nZXNbXSA9CisgIHsKKyAgICBBRl9VTklSQU5HRV9SRUMoICAweDE4ODUsICAweDE4ODYgKSwKKyAgICBBRl9VTklSQU5HRV9SRUMoICAweDE4QTksICAweDE4QTkgKSwKKyAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQorICB9OworCisKICAgY29uc3QgQUZfU2NyaXB0X1VuaVJhbmdlUmVjICBhZl9teW1yX3VuaXJhbmdlc1tdID0KICAgewogICAgIEFGX1VOSVJBTkdFX1JFQyggIDB4MTAwMCwgIDB4MTA5RiApLCAgICAvKiBNeWFubWFyICAgICAgICAgICAgKi8KQEAgLTc2Myw2ICs3OTAsMTggQEAKICAgfTsKIAogCisgIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfcm9oZ191bmlyYW5nZXNbXSA9CisgIHsKKyAgICBBRl9VTklSQU5HRV9SRUMoIDB4MTBEMDAsIDB4MTBEM0YgKSwgICAvKiBIYW5pZmkgUm9oaW5neWEgKi8KKyAgICBBRl9VTklSQU5HRV9SRUMoICAgICAgIDAsICAgICAgIDAgKQorICB9OworCisgIGNvbnN0IEFGX1NjcmlwdF9VbmlSYW5nZVJlYyAgYWZfcm9oZ19ub25iYXNlX3VuaXJhbmdlc1tdID0KKyAgeworICAgIEFGX1VOSVJBTkdFX1JFQyggMCwgMCApCisgIH07CisKKwogICBjb25zdCBBRl9TY3JpcHRfVW5pUmFuZ2VSZWMgIGFmX3NhdXJfdW5pcmFuZ2VzW10gPQogICB7CiAgICAgQUZfVU5JUkFOR0VfUkVDKCAgMHhBODgwLCAgMHhBOERGICksICAgLyogU2F1cmFzaHRyYSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZyYW5nZXMuaCBiL3NyYy9hdXRvZml0L2FmcmFuZ2VzLmgKaW5kZXggYmEzYjVlNy4uYzJmZmRhNCAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZyYW5nZXMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZnJhbmdlcy5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnJhbmdlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgVW5pY29kZSBzY3JpcHQgcmFuZ2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZnJhbmdlcy5oCisgKgorICogICBBdXRvLWZpdHRlciBVbmljb2RlIHNjcmlwdCByYW5nZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBBRlJBTkdFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzY3JpcHQuaCBiL3NyYy9hdXRvZml0L2Fmc2NyaXB0LmgKaW5kZXggNjIzYTE3My4uNGNmOWNjMSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZzY3JpcHQuaAorKysgYi9zcmMvYXV0b2ZpdC9hZnNjcmlwdC5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNjcmlwdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgc2NyaXB0cyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZnNjcmlwdC5oCisgKgorICogICBBdXRvLWZpdHRlciBzY3JpcHRzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogICAvKiBUaGUgZm9sbG93aW5nIHBhcnQgY2FuIGJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLiAqLwpAQCAtMjQzLDYgKzI0MywxOCBAQAogICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKICAgICAgICAgICAiXHhFMFx4QjRceEEwIFx4RTBceEI0XHhCMSIgKSAvKiDgtKAg4LSxICovCiAKKyAgU0NSSVBUKCBtZWRmLCBNRURGLAorICAgICAgICAgICJNZWRlZmFpZHJpbiIsCisgICAgICAgICAgSEJfU0NSSVBUX01FREVGQUlEUklOLAorICAgICAgICAgIEhJTlRJTkdfQk9UVE9NX1RPX1RPUCwKKyAgICAgICAgICAiXHhGMFx4OTZceEI5XHhBMSBceEYwXHg5Nlx4QjlceDlCIFx4RjBceDk2XHhCOVx4QUYiICkgLyog8Ja5oSDwlrmbIPCWua8gKi8KKworICBTQ1JJUFQoIG1vbmcsIE1PTkcsCisgICAgICAgICAgIk1vbmdvbGlhbiIsCisgICAgICAgICAgSEJfU0NSSVBUX01PTkdPTElBTiwKKyAgICAgICAgICBISU5USU5HX1RPUF9UT19CT1RUT00sCisgICAgICAgICAgIlx4RTFceEExXHg4MiBceEUxXHhBMFx4QUEiICkgLyog4aGCIOGgqiAqLworCiAgIFNDUklQVCggbXltciwgTVlNUiwKICAgICAgICAgICAiTXlhbm1hciIsCiAgICAgICAgICAgSEJfU0NSSVBUX01ZQU5NQVIsCkBAIC0yODUsNiArMjk3LDEyIEBACiAgICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAogICAgICAgICAgICJceEYwXHg5MFx4OTJceDg2IFx4RjBceDkwXHg5Mlx4QTAiICkgLyog8JCShiDwkJKgICovCiAKKyAgU0NSSVBUKCByb2hnLCBST0hHLAorICAgICAgICAgICJIYW5pZmkgUm9oaW5neWEiLAorICAgICAgICAgIEhCX1NDUklQVF9IQU5JRklfUk9ISU5HWUEsCisgICAgICAgICAgSElOVElOR19CT1RUT01fVE9fVE9QLAorICAgICAgICAgICJceEYwXHg5MFx4QjRceEIwIiApIC8qIPCQtLAgKi8KKwogICBTQ1JJUFQoIHNhdXIsIFNBVVIsCiAgICAgICAgICAgIlNhdXJhc2h0cmEiLAogICAgICAgICAgIEhCX1NDUklQVF9TQVVSQVNIVFJBLApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuYyBiL3NyYy9hdXRvZml0L2Fmc2hhcGVyLmMKaW5kZXggZjMwODI4MS4uYmJmN2I2YiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuYworKysgYi9zcmMvYXV0b2ZpdC9hZnNoYXBlci5jCkBAIC0xLDI0ICsxLDIzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNoYXBlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGFyZkJ1enogaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgT3BlblR5cGUgZmVhdHVyZXMgKGJvZHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZnNoYXBlci5jCisgKgorICogICBIYXJmQnV6eiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBPcGVuVHlwZSBmZWF0dXJlcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0FEVkFOQ0VTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0YWR2YW5jLmg+CiAjaW5jbHVkZSAiYWZnbG9iYWwuaCIKICNpbmNsdWRlICJhZnR5cGVzLmgiCiAjaW5jbHVkZSAiYWZzaGFwZXIuaCIKQEAgLTI2LDE0ICsyNSwxNCBAQAogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYWZzaGFwZXIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBhZnNoYXBlcgogCiAKICAgLyoKQEAgLTU5MSwxNCArNTkwLDkgQEAKICAgdm9pZCoKICAgYWZfc2hhcGVyX2J1Zl9jcmVhdGUoIEZUX0ZhY2UgIGZhY2UgKQogICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLSAgICBGVF9VTG9uZyogIGJ1ZjsKKyAgICBGVF9VTlVTRUQoIGZhY2UgKTsKIAotCi0gICAgRlRfTUVNX0FMTE9DKCBidWYsIHNpemVvZiAoIEZUX1VMb25nICkgKTsKLQotICAgIHJldHVybiAodm9pZCopYnVmOworICAgIHJldHVybiBOVUxMOwogICB9CiAKIApAQCAtNjA2LDEwICs2MDAsOCBAQAogICBhZl9zaGFwZXJfYnVmX2Rlc3Ryb3koIEZUX0ZhY2UgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgYnVmICkKICAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBidWYgKTsKKyAgICBGVF9VTlVTRUQoIGZhY2UgKTsKKyAgICBGVF9VTlVTRUQoIGJ1ZiApOwogICB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuaCBiL3NyYy9hdXRvZml0L2Fmc2hhcGVyLmgKaW5kZXggN2VmZDlmNi4uMTM4YzI3YiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZzaGFwZXIuaAorKysgYi9zcmMvYXV0b2ZpdC9hZnNoYXBlci5oCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZnNoYXBlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGFyZkJ1enogaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgT3BlblR5cGUgZmVhdHVyZXMgKHNwZWNpZmljYXRpb24pLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZnNoYXBlci5oCisgKgorICogICBIYXJmQnV6eiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyBPcGVuVHlwZSBmZWF0dXJlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEFGU0hBUEVSX0hfCiAjZGVmaW5lIEFGU0hBUEVSX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAogCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWloKZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmc3R5bGVzLmggYi9zcmMvYXV0b2ZpdC9hZnN0eWxlcy5oCmluZGV4IGUyNjg4YjMuLjkxMTNlYzQgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2Fmc3R5bGVzLmgKKysrIGIvc3JjL2F1dG9maXQvYWZzdHlsZXMuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZzdHlsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIHN0eWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYWZzdHlsZXMuaAorICoKKyAqICAgQXV0by1maXR0ZXIgc3R5bGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogICAvKiBUaGUgZm9sbG93aW5nIHBhcnQgY2FuIGJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLiAqLwpAQCAtMzIyLDYgKzMyMiwyMCBAQAogICAgICAgICAgQUZfQkxVRV9TVFJJTkdTRVRfTUxZTSwKICAgICAgICAgIEFGX0NPVkVSQUdFX0RFRkFVTFQgKQogCisgIFNUWUxFKCBtZWRmX2RmbHQsIE1FREZfREZMVCwKKyAgICAgICAgICJNZWRlZmFpZHJpbiBkZWZhdWx0IHN0eWxlIiwKKyAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAorICAgICAgICAgQUZfU0NSSVBUX01FREYsCisgICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9NRURGLAorICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCisKKyAgU1RZTEUoIG1vbmdfZGZsdCwgTU9OR19ERkxULAorICAgICAgICAgIk1vbmdvbGlhbiBkZWZhdWx0IHN0eWxlIiwKKyAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLAorICAgICAgICAgQUZfU0NSSVBUX01PTkcsCisgICAgICAgICBBRl9CTFVFX1NUUklOR1NFVF9NT05HLAorICAgICAgICAgQUZfQ09WRVJBR0VfREVGQVVMVCApCisKICAgU1RZTEUoIG15bXJfZGZsdCwgTVlNUl9ERkxULAogICAgICAgICAgIk15YW5tYXIgZGVmYXVsdCBzdHlsZSIsCiAgICAgICAgICBBRl9XUklUSU5HX1NZU1RFTV9MQVRJTiwKQEAgLTM3MSw2ICszODUsMTMgQEAKICAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX09TTUEsCiAgICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKIAorICBTVFlMRSggcm9oZ19kZmx0LCBST0hHX0RGTFQsCisgICAgICAgICAiSGFuaWZpIFJvaGluZ3lhIGRlZmF1bHQgc3R5bGUiLAorICAgICAgICAgQUZfV1JJVElOR19TWVNURU1fTEFUSU4sCisgICAgICAgICBBRl9TQ1JJUFRfUk9IRywKKyAgICAgICAgIEFGX0JMVUVfU1RSSU5HU0VUX1JPSEcsCisgICAgICAgICBBRl9DT1ZFUkFHRV9ERUZBVUxUICkKKwogICBTVFlMRSggc2F1cl9kZmx0LCBTQVVSX0RGTFQsCiAgICAgICAgICAiU2F1cmFzaHRyYSBkZWZhdWx0IHN0eWxlIiwKICAgICAgICAgIEFGX1dSSVRJTkdfU1lTVEVNX0xBVElOLApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZ0eXBlcy5oIGIvc3JjL2F1dG9maXQvYWZ0eXBlcy5oCmluZGV4IDZiZDhjODkuLjVmMDQwYzYgMTAwNjQ0Ci0tLSBhL3NyYy9hdXRvZml0L2FmdHlwZXMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZnR5cGVzLmgKQEAgLTEsMzAgKzEsMzAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmdHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmdHlwZXMuaAorICoKKyAqICAgQXV0by1maXR0ZXIgdHlwZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAqCi0gICAqICBUaGUgYXV0by1maXR0ZXIgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBvbGQgYXV0by1oaW50ZXIuCi0gICAqICBJdHMgbWFpbiBmZWF0dXJlIGlzIHRoZSBhYmlsaXR5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQKLSAgICogIHdyaXRpbmcgc3lzdGVtcyBhbmQgc2NyaXB0cyBpbiBvcmRlciB0byBhcHBseSBzcGVjaWZpYyBydWxlcy4KKyAgICogVGhlIGF1dG8tZml0dGVyIGlzIGEgY29tcGxldGUgcmV3cml0ZSBvZiB0aGUgb2xkIGF1dG8taGludGVyLgorICAgKiBJdHMgbWFpbiBmZWF0dXJlIGlzIHRoZSBhYmlsaXR5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBkaWZmZXJlbnQKKyAgICogd3JpdGluZyBzeXN0ZW1zIGFuZCBzY3JpcHRzIGluIG9yZGVyIHRvIGFwcGx5IHNwZWNpZmljIHJ1bGVzLgogICAgKgotICAgKiAgVGhlIGNvZGUgaGFzIGFsc28gYmVlbiBjb21wYXJ0bWVudGFsaXplZCBpbnRvIHNldmVyYWwgZW50aXRpZXMgdGhhdAotICAgKiAgc2hvdWxkIG1ha2UgYWxnb3JpdGhtaWMgZXhwZXJpbWVudGF0aW9uIGVhc2llciB0aGFuIHdpdGggdGhlIG9sZAotICAgKiAgY29kZS4KKyAgICogVGhlIGNvZGUgaGFzIGFsc28gYmVlbiBjb21wYXJ0bWVudGFsaXplZCBpbnRvIHNldmVyYWwgZW50aXRpZXMgdGhhdAorICAgKiBzaG91bGQgbWFrZSBhbGdvcml0aG1pYyBleHBlcmltZW50YXRpb24gZWFzaWVyIHRoYW4gd2l0aCB0aGUgb2xkCisgICAqIGNvZGUuCiAgICAqCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0zMiwxMiArMzIsMTEgQEAKICNpZm5kZWYgQUZUWVBFU19IXwogI2RlZmluZSBBRlRZUEVTX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdXRsbi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgImFmYmx1ZS5oIgogCkBAIC0xMDIsOSArMTAxLDkgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgLyoKLSAgICogIFRoZSBhdXRvLWZpdHRlciBkb2Vzbid0IG5lZWQgYSB2ZXJ5IGhpZ2ggYW5ndWxhciBhY2N1cmFjeTsKLSAgICogIHRoaXMgYWxsb3dzIHVzIHRvIHNwZWVkIHVwIHNvbWUgY29tcHV0YXRpb25zIGNvbnNpZGVyYWJseSB3aXRoIGEKLSAgICogIGxpZ2h0IENvcmRpYyBhbGdvcml0aG0gKHNlZSBhZmFuZ2xlcy5jKS4KKyAgICogVGhlIGF1dG8tZml0dGVyIGRvZXNuJ3QgbmVlZCBhIHZlcnkgaGlnaCBhbmd1bGFyIGFjY3VyYWN5OworICAgKiB0aGlzIGFsbG93cyB1cyB0byBzcGVlZCB1cCBzb21lIGNvbXB1dGF0aW9ucyBjb25zaWRlcmFibHkgd2l0aCBhCisgICAqIGxpZ2h0IENvcmRpYyBhbGdvcml0aG0gKHNlZSBhZmFuZ2xlcy5jKS4KICAgICovCiAKICAgdHlwZWRlZiBGVF9JbnQgIEFGX0FuZ2xlOwpAQCAtMTE4LDcgKzExNyw3IEBACiAKICNpZiAwCiAgIC8qCi0gICAqICBjb21wdXRlIHRoZSBhbmdsZSBvZiBhIGdpdmVuIDItRCB2ZWN0b3IKKyAgICogY29tcHV0ZSB0aGUgYW5nbGUgb2YgYSBnaXZlbiAyLUQgdmVjdG9yCiAgICAqLwogICBGVF9MT0NBTCggQUZfQW5nbGUgKQogICBhZl9hbmdsZV9hdGFuKCBGVF9Qb3MgIGR4LApAQCAtMTI2LDggKzEyNSw4IEBACiAKIAogICAvKgotICAgKiAgY29tcHV0ZSBgYW5nbGUyIC0gYW5nbGUxJzsgdGhlIHJlc3VsdCBpcyBhbHdheXMgd2l0aGluCi0gICAqICB0aGUgcmFuZ2UgWy1BRl9BTkdMRV9QSSAuLiBBRl9BTkdMRV9QSSAtIDFdCisgICAqIGNvbXB1dGUgYGFuZ2xlMiAtIGFuZ2xlMSc7IHRoZSByZXN1bHQgaXMgYWx3YXlzIHdpdGhpbgorICAgKiB0aGUgcmFuZ2UgWy1BRl9BTkdMRV9QSSAuLiBBRl9BTkdMRV9QSSAtIDFdCiAgICAqLwogICBGVF9MT0NBTCggQUZfQW5nbGUgKQogICBhZl9hbmdsZV9kaWZmKCBBRl9BbmdsZSAgYW5nbGUxLApAQCAtMTUwLDggKzE0OSw5IEBACiAgIEZUX0VORF9TVE1OVAogCiAKLSAgLyogIG9wYXF1ZSBoYW5kbGUgdG8gZ2x5cGgtc3BlY2lmaWMgaGludHMgLS0gc2VlIGBhZmhpbnRzLmgnIGZvciBtb3JlCi0gICAqICBkZXRhaWxzCisgIC8qCisgICAqIG9wYXF1ZSBoYW5kbGUgdG8gZ2x5cGgtc3BlY2lmaWMgaGludHMgLS0gc2VlIGBhZmhpbnRzLmgnIGZvciBtb3JlCisgICAqIGRldGFpbHMKICAgICovCiAgIHR5cGVkZWYgc3RydWN0IEFGX0dseXBoSGludHNSZWNfKiAgQUZfR2x5cGhIaW50czsKIApAQCAtMTY1LDggKzE2NSw4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qCi0gICAqICBBIHNjYWxlciBtb2RlbHMgdGhlIHRhcmdldCBwaXhlbCBkZXZpY2UgdGhhdCB3aWxsIHJlY2VpdmUgdGhlCi0gICAqICBhdXRvLWhpbnRlZCBnbHlwaCBpbWFnZS4KKyAgICogQSBzY2FsZXIgbW9kZWxzIHRoZSB0YXJnZXQgcGl4ZWwgZGV2aWNlIHRoYXQgd2lsbCByZWNlaXZlIHRoZQorICAgKiBhdXRvLWhpbnRlZCBnbHlwaCBpbWFnZS4KICAgICovCiAKICNkZWZpbmUgQUZfU0NBTEVSX0ZMQUdfTk9fSE9SSVpPTlRBTCAgMVUgLyogZGlzYWJsZSBob3Jpem9udGFsIGhpbnRpbmcgKi8KQEAgLTE5Nyw4ICsxOTcsOSBAQAogCiAgIHR5cGVkZWYgc3RydWN0IEFGX1N0eWxlTWV0cmljc1JlY18qICBBRl9TdHlsZU1ldHJpY3M7CiAKLSAgLyogIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGFuIEZUX0ZhY2UgdG8gY29tcHV0ZSBnbG9iYWwgbWV0cmljcyBmb3IKLSAgICogIGEgc3BlY2lmaWMgc3R5bGUuCisgIC8qCisgICAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIGFuIEZUX0ZhY2UgdG8gY29tcHV0ZSBnbG9iYWwgbWV0cmljcyBmb3IKKyAgICogYSBzcGVjaWZpYyBzdHlsZS4KICAgICovCiAgIHR5cGVkZWYgRlRfRXJyb3IKICAgKCpBRl9Xcml0aW5nU3lzdGVtX0luaXRNZXRyaWNzRnVuYykoIEFGX1N0eWxlTWV0cmljcyAgbWV0cmljcywKQEAgLTIzNywyMiArMjM4LDIyIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qCi0gICAqICBGb3IgdGhlIGF1dG8taGludGVyLCBhIHdyaXRpbmcgc3lzdGVtIGNvbnNpc3RzIG9mIG11bHRpcGxlIHNjcmlwdHMgdGhhdAotICAgKiAgY2FuIGJlIGhhbmRsZWQgc2ltaWxhcmx5ICppbiBhIHR5cG9ncmFwaGljYWwgd2F5KjsgdGhlIHJlbGF0aW9uc2hpcCBpcwotICAgKiAgbm90IGJhc2VkIG9uIGhpc3RvcnkuICBGb3IgZXhhbXBsZSwgYm90aCB0aGUgR3JlZWsgYW5kIHRoZSB1bnJlbGF0ZWQKLSAgICogIEFybWVuaWFuIHNjcmlwdHMgc2hhcmUgdGhlIHNhbWUgZmVhdHVyZXMgbGlrZSBhc2NlbmRlciwgZGVzY2VuZGVyLAotICAgKiAgeC1oZWlnaHQsIGV0Yy4gIEVzc2VudGlhbGx5LCBhIHdyaXRpbmcgc3lzdGVtIGlzIGNvdmVyZWQgYnkgYQotICAgKiAgc3VibW9kdWxlIG9mIHRoZSBhdXRvLWZpdHRlcjsgaXQgY29udGFpbnMKKyAgICogRm9yIHRoZSBhdXRvLWhpbnRlciwgYSB3cml0aW5nIHN5c3RlbSBjb25zaXN0cyBvZiBtdWx0aXBsZSBzY3JpcHRzIHRoYXQKKyAgICogY2FuIGJlIGhhbmRsZWQgc2ltaWxhcmx5ICppbiBhIHR5cG9ncmFwaGljYWwgd2F5KjsgdGhlIHJlbGF0aW9uc2hpcCBpcworICAgKiBub3QgYmFzZWQgb24gaGlzdG9yeS4gIEZvciBleGFtcGxlLCBib3RoIHRoZSBHcmVlayBhbmQgdGhlIHVucmVsYXRlZAorICAgKiBBcm1lbmlhbiBzY3JpcHRzIHNoYXJlIHRoZSBzYW1lIGZlYXR1cmVzIGxpa2UgYXNjZW5kZXIsIGRlc2NlbmRlciwKKyAgICogeC1oZWlnaHQsIGV0Yy4gIEVzc2VudGlhbGx5LCBhIHdyaXRpbmcgc3lzdGVtIGlzIGNvdmVyZWQgYnkgYQorICAgKiBzdWJtb2R1bGUgb2YgdGhlIGF1dG8tZml0dGVyOyBpdCBjb250YWlucwogICAgKgotICAgKiAgLSBhIHNwZWNpZmljIGdsb2JhbCBhbmFseXplciB0aGF0IGNvbXB1dGVzIGdsb2JhbCBtZXRyaWNzIHNwZWNpZmljIHRvCi0gICAqICAgIHRoZSBzY3JpcHQgKGJhc2VkIG9uIHNjcmlwdC1zcGVjaWZpYyBjaGFyYWN0ZXJzIHRvIGlkZW50aWZ5IGFzY2VuZGVyCi0gICAqICAgIGhlaWdodCwgeC1oZWlnaHQsIGV0Yy4pLAorICAgKiAtIGEgc3BlY2lmaWMgZ2xvYmFsIGFuYWx5emVyIHRoYXQgY29tcHV0ZXMgZ2xvYmFsIG1ldHJpY3Mgc3BlY2lmaWMgdG8KKyAgICogICB0aGUgc2NyaXB0IChiYXNlZCBvbiBzY3JpcHQtc3BlY2lmaWMgY2hhcmFjdGVycyB0byBpZGVudGlmeSBhc2NlbmRlcgorICAgKiAgIGhlaWdodCwgeC1oZWlnaHQsIGV0Yy4pLAogICAgKgotICAgKiAgLSBhIHNwZWNpZmljIGdseXBoIGFuYWx5emVyIHRoYXQgY29tcHV0ZXMgc2VnbWVudHMgYW5kIGVkZ2VzIGZvciBlYWNoCi0gICAqICAgIGdseXBoIGNvdmVyZWQgYnkgdGhlIHNjcmlwdCwKKyAgICogLSBhIHNwZWNpZmljIGdseXBoIGFuYWx5emVyIHRoYXQgY29tcHV0ZXMgc2VnbWVudHMgYW5kIGVkZ2VzIGZvciBlYWNoCisgICAqICAgZ2x5cGggY292ZXJlZCBieSB0aGUgc2NyaXB0LAogICAgKgotICAgKiAgLSBhIHNwZWNpZmljIGdyaWQtZml0dGluZyBhbGdvcml0aG0gdGhhdCBkaXN0b3J0cyB0aGUgc2NhbGVkIGdseXBoCi0gICAqICAgIG91dGxpbmUgYWNjb3JkaW5nIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBnbHlwaCBhbmFseXplci4KKyAgICogLSBhIHNwZWNpZmljIGdyaWQtZml0dGluZyBhbGdvcml0aG0gdGhhdCBkaXN0b3J0cyB0aGUgc2NhbGVkIGdseXBoCisgICAqICAgb3V0bGluZSBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIGdseXBoIGFuYWx5emVyLgogICAgKi8KIAogI2RlZmluZSBBRldSVFNZU19IXyAgLyogZG9uJ3QgbG9hZCBoZWFkZXIgZmlsZXMgKi8KQEAgLTMwMCwxMiArMzAxLDEyIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qCi0gICAqICBFYWNoIHNjcmlwdCBpcyBhc3NvY2lhdGVkIHdpdGggdHdvIHNldHMgb2YgVW5pY29kZSByYW5nZXMgdG8gdGVzdAotICAgKiAgd2hldGhlciB0aGUgZm9udCBmYWNlIHN1cHBvcnRzIHRoZSBzY3JpcHQsIGFuZCB3aGljaCBub24tYmFzZQotICAgKiAgY2hhcmFjdGVycyB0aGUgc2NyaXB0IGNvbnRhaW5zLgorICAgKiBFYWNoIHNjcmlwdCBpcyBhc3NvY2lhdGVkIHdpdGggdHdvIHNldHMgb2YgVW5pY29kZSByYW5nZXMgdG8gdGVzdAorICAgKiB3aGV0aGVyIHRoZSBmb250IGZhY2Ugc3VwcG9ydHMgdGhlIHNjcmlwdCwgYW5kIHdoaWNoIG5vbi1iYXNlCisgICAqIGNoYXJhY3RlcnMgdGhlIHNjcmlwdCBjb250YWlucy4KICAgICoKLSAgICogIFdlIHVzZSBmb3VyLWxldHRlciBzY3JpcHQgdGFncyBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLAotICAgKiAgZXh0ZW5kZWQgYnkgYE5PTkUnLCB3aGljaCBpbmRpY2F0ZXMgYG5vIHNjcmlwdCcuCisgICAqIFdlIHVzZSBmb3VyLWxldHRlciBzY3JpcHQgdGFncyBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLAorICAgKiBleHRlbmRlZCBieSBgTk9ORScsIHdoaWNoIGluZGljYXRlcyBgbm8gc2NyaXB0Jy4KICAgICovCiAKICN1bmRlZiAgU0NSSVBUCkBAIC0zNjEsNDEgKzM2Miw0MSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogICAvKgotICAgKiAgVXN1YWxseSwgYSBmb250IGNvbnRhaW5zIG1vcmUgZ2x5cGhzIHRoYW4gY2FuIGJlIGFkZHJlc3NlZCBieSBpdHMKLSAgICogIGNoYXJhY3RlciBtYXAuCisgICAqIFVzdWFsbHksIGEgZm9udCBjb250YWlucyBtb3JlIGdseXBocyB0aGFuIGNhbiBiZSBhZGRyZXNzZWQgYnkgaXRzCisgICAqIGNoYXJhY3RlciBtYXAuCiAgICAqCi0gICAqICBJbiB0aGUgUG9zdFNjcmlwdCBmb250IHdvcmxkLCBlbmNvZGluZyB2ZWN0b3JzIHNwZWNpZmljIHRvIGEgZ2l2ZW4KLSAgICogIHRhc2sgYXJlIHVzZWQgdG8gc2VsZWN0IHN1Y2ggZ2x5cGhzLCBhbmQgdGhlc2UgZ2x5cGhzIGNhbiBiZSBvZnRlbgotICAgKiAgcmVjb2duaXplZCBieSBoYXZpbmcgYSBzdWZmaXggaW4gaXRzIGdseXBoIG5hbWVzLiAgRm9yIGV4YW1wbGUsIGEKLSAgICogIHN1cGVyc2NyaXB0IGdseXBoIGBBJyBtaWdodCBiZSBjYWxsZWQgYEEuc3VwJy4gIFVuZm9ydHVuYXRlbHksIHRoaXMKLSAgICogIG5hbWluZyBzY2hlbWUgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgdGh1cyB1bnVzYWJsZSBmb3IgdXMuCisgICAqIEluIHRoZSBQb3N0U2NyaXB0IGZvbnQgd29ybGQsIGVuY29kaW5nIHZlY3RvcnMgc3BlY2lmaWMgdG8gYSBnaXZlbgorICAgKiB0YXNrIGFyZSB1c2VkIHRvIHNlbGVjdCBzdWNoIGdseXBocywgYW5kIHRoZXNlIGdseXBocyBjYW4gYmUgb2Z0ZW4KKyAgICogcmVjb2duaXplZCBieSBoYXZpbmcgYSBzdWZmaXggaW4gaXRzIGdseXBoIG5hbWVzLiAgRm9yIGV4YW1wbGUsIGEKKyAgICogc3VwZXJzY3JpcHQgZ2x5cGggYEEnIG1pZ2h0IGJlIGNhbGxlZCBgQS5zdXAnLiAgVW5mb3J0dW5hdGVseSwgdGhpcworICAgKiBuYW1pbmcgc2NoZW1lIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kIHRodXMgdW51c2FibGUgZm9yIHVzLgogICAgKgotICAgKiAgSW4gdGhlIE9wZW5UeXBlIHdvcmxkLCBhIGJldHRlciBzb2x1dGlvbiB3YXMgaW52ZW50ZWQsIG5hbWVseQotICAgKiAgYGZlYXR1cmVzJywgd2hpY2ggY2xlYW5seSBzZXBhcmF0ZSBhIGNoYXJhY3RlcidzIGlucHV0IGVuY29kaW5nIGZyb20KLSAgICogIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoJ3MgYXBwZWFyYW5jZSwgYW5kIHdoaWNoIGRvbid0IHVzZSBnbHlwaCBuYW1lcwotICAgKiAgYXQgYWxsLiAgRm9yIG91ciBwdXJwb3NlcywgYW5kIHNsaWdodGx5IGdlbmVyYWxpemVkLCBhbiBPcGVuVHlwZQotICAgKiAgZmVhdHVyZSBpcyBhIG5hbWUgb2YgYSBtYXBwaW5nIHRoYXQgbWFwcyBjaGFyYWN0ZXIgY29kZXMgdG8KLSAgICogIG5vbi1zdGFuZGFyZCBnbHlwaCBpbmRpY2VzIChmZWF0dXJlcyBnZXQgdXNlZCBmb3Igb3RoZXIgdGhpbmdzIGFsc28pLgotICAgKiAgRm9yIGV4YW1wbGUsIHRoZSBgc3VwcycgZmVhdHVyZSBwcm92aWRlcyBzdXBlcnNjcmlwdCBnbHlwaHMsIHRodXMKLSAgICogIG1hcHBpbmcgY2hhcmFjdGVyIGNvZGVzIGxpa2UgYEEnIG9yIGBCJyB0byBzdXBlcnNjcmlwdCBnbHlwaAotICAgKiAgcmVwcmVzZW50YXRpb24gZm9ybXMuICBIb3cgdGhpcyBtYXBwaW5nIGhhcHBlbnMgaXMgY29tcGxldGVseQotICAgKiAgdW5pbnRlcmVzdGluZyB0byB1cy4KKyAgICogSW4gdGhlIE9wZW5UeXBlIHdvcmxkLCBhIGJldHRlciBzb2x1dGlvbiB3YXMgaW52ZW50ZWQsIG5hbWVseQorICAgKiBgZmVhdHVyZXMnLCB3aGljaCBjbGVhbmx5IHNlcGFyYXRlIGEgY2hhcmFjdGVyJ3MgaW5wdXQgZW5jb2RpbmcgZnJvbQorICAgKiB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCdzIGFwcGVhcmFuY2UsIGFuZCB3aGljaCBkb24ndCB1c2UgZ2x5cGggbmFtZXMKKyAgICogYXQgYWxsLiAgRm9yIG91ciBwdXJwb3NlcywgYW5kIHNsaWdodGx5IGdlbmVyYWxpemVkLCBhbiBPcGVuVHlwZQorICAgKiBmZWF0dXJlIGlzIGEgbmFtZSBvZiBhIG1hcHBpbmcgdGhhdCBtYXBzIGNoYXJhY3RlciBjb2RlcyB0bworICAgKiBub24tc3RhbmRhcmQgZ2x5cGggaW5kaWNlcyAoZmVhdHVyZXMgZ2V0IHVzZWQgZm9yIG90aGVyIHRoaW5ncyBhbHNvKS4KKyAgICogRm9yIGV4YW1wbGUsIHRoZSBgc3VwcycgZmVhdHVyZSBwcm92aWRlcyBzdXBlcnNjcmlwdCBnbHlwaHMsIHRodXMKKyAgICogbWFwcGluZyBjaGFyYWN0ZXIgY29kZXMgbGlrZSBgQScgb3IgYEInIHRvIHN1cGVyc2NyaXB0IGdseXBoCisgICAqIHJlcHJlc2VudGF0aW9uIGZvcm1zLiAgSG93IHRoaXMgbWFwcGluZyBoYXBwZW5zIGlzIGNvbXBsZXRlbHkKKyAgICogdW5pbnRlcmVzdGluZyB0byB1cy4KICAgICoKLSAgICogIEZvciB0aGUgYXV0by1oaW50ZXIsIGEgYGNvdmVyYWdlJyByZXByZXNlbnRzIGFsbCBnbHlwaHMgb2YgYW4gT3BlblR5cGUKLSAgICogIGZlYXR1cmUgY29sbGVjdGVkIGluIGEgc2V0IChhcyBsaXN0ZWQgYmVsb3cpIHRoYXQgY2FuIGJlIGhpbnRlZAotICAgKiAgdG9nZXRoZXIuICBUbyBjb250aW51ZSB0aGUgYWJvdmUgZXhhbXBsZSwgc3VwZXJzY3JpcHQgZ2x5cGhzIG11c3Qgbm90Ci0gICAqICBiZSBoaW50ZWQgdG9nZXRoZXIgd2l0aCBub3JtYWwgZ2x5cGhzIGJlY2F1c2UgdGhlIGJsdWUgem9uZXMKLSAgICogIGNvbXBsZXRlbHkgZGlmZmVyLgorICAgKiBGb3IgdGhlIGF1dG8taGludGVyLCBhIGBjb3ZlcmFnZScgcmVwcmVzZW50cyBhbGwgZ2x5cGhzIG9mIGFuIE9wZW5UeXBlCisgICAqIGZlYXR1cmUgY29sbGVjdGVkIGluIGEgc2V0IChhcyBsaXN0ZWQgYmVsb3cpIHRoYXQgY2FuIGJlIGhpbnRlZAorICAgKiB0b2dldGhlci4gIFRvIGNvbnRpbnVlIHRoZSBhYm92ZSBleGFtcGxlLCBzdXBlcnNjcmlwdCBnbHlwaHMgbXVzdCBub3QKKyAgICogYmUgaGludGVkIHRvZ2V0aGVyIHdpdGggbm9ybWFsIGdseXBocyBiZWNhdXNlIHRoZSBibHVlIHpvbmVzCisgICAqIGNvbXBsZXRlbHkgZGlmZmVyLgogICAgKgotICAgKiAgTm90ZSB0aGF0IEZyZWVUeXBlIGl0c2VsZiBkb2Vzbid0IGNvbXB1dGUgY292ZXJhZ2VzOyBpdCBvbmx5IHByb3ZpZGVzCi0gICAqICB0aGUgZ2x5cGhzIGFkZHJlc3NhYmxlIGJ5IHRoZSBkZWZhdWx0IFVuaWNvZGUgY2hhcmFjdGVyIG1hcC4gIEluc3RlYWQsCi0gICAqICB3ZSB1c2UgdGhlIEhhcmZCdXp6IGxpYnJhcnkgKGlmIGF2YWlsYWJsZSksIHdoaWNoIGhhcyBtYW55IGZ1bmN0aW9ucwotICAgKiAgZXhhY3RseSBmb3IgdGhpcyBwdXJwb3NlLgorICAgKiBOb3RlIHRoYXQgRnJlZVR5cGUgaXRzZWxmIGRvZXNuJ3QgY29tcHV0ZSBjb3ZlcmFnZXM7IGl0IG9ubHkgcHJvdmlkZXMKKyAgICogdGhlIGdseXBocyBhZGRyZXNzYWJsZSBieSB0aGUgZGVmYXVsdCBVbmljb2RlIGNoYXJhY3RlciBtYXAuICBJbnN0ZWFkLAorICAgKiB3ZSB1c2UgdGhlIEhhcmZCdXp6IGxpYnJhcnkgKGlmIGF2YWlsYWJsZSksIHdoaWNoIGhhcyBtYW55IGZ1bmN0aW9ucworICAgKiBleGFjdGx5IGZvciB0aGlzIHB1cnBvc2UuCiAgICAqCi0gICAqICBBRl9DT1ZFUkFHRV9ERUZBVUxUIGlzIHNwZWNpYWw6IEl0IHNob3VsZCBjb3ZlciBldmVyeXRoaW5nIHRoYXQgaXNuJ3QKLSAgICogIGxpc3RlZCBzZXBhcmF0ZWx5IChpbmNsdWRpbmcgdGhlIGdseXBocyBhZGRyZXNzYWJsZSBieSB0aGUgY2hhcmFjdGVyCi0gICAqICBtYXApLiAgSW4gY2FzZSBIYXJmQnV6eiBpc24ndCBhdmFpbGFibGUsIGl0IGV4YWN0bHkgY292ZXJzIHRoZSBnbHlwaHMKLSAgICogIGFkZHJlc3NhYmxlIGJ5IHRoZSBjaGFyYWN0ZXIgbWFwLgorICAgKiBBRl9DT1ZFUkFHRV9ERUZBVUxUIGlzIHNwZWNpYWw6IEl0IHNob3VsZCBjb3ZlciBldmVyeXRoaW5nIHRoYXQgaXNuJ3QKKyAgICogbGlzdGVkIHNlcGFyYXRlbHkgKGluY2x1ZGluZyB0aGUgZ2x5cGhzIGFkZHJlc3NhYmxlIGJ5IHRoZSBjaGFyYWN0ZXIKKyAgICogbWFwKS4gIEluIGNhc2UgSGFyZkJ1enogaXNuJ3QgYXZhaWxhYmxlLCBpdCBleGFjdGx5IGNvdmVycyB0aGUgZ2x5cGhzCisgICAqIGFkZHJlc3NhYmxlIGJ5IHRoZSBjaGFyYWN0ZXIgbWFwLgogICAgKgogICAgKi8KIApAQCAtNDIzLDggKzQyNCw4IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAgIC8qCi0gICAqICBUaGUgdG9wbW9zdCBzdHJ1Y3R1cmUgZm9yIG1vZGVsbGluZyB0aGUgYXV0by1oaW50ZXIgZ2x5cGggaW5wdXQgZGF0YQotICAgKiAgaXMgYSBgc3R5bGUgY2xhc3MnLCBncm91cGluZyBldmVyeXRoaW5nIHRvZ2V0aGVyLgorICAgKiBUaGUgdG9wbW9zdCBzdHJ1Y3R1cmUgZm9yIG1vZGVsbGluZyB0aGUgYXV0by1oaW50ZXIgZ2x5cGggaW5wdXQgZGF0YQorICAgKiBpcyBhIGBzdHlsZSBjbGFzcycsIGdyb3VwaW5nIGV2ZXJ5dGhpbmcgdG9nZXRoZXIuCiAgICAqLwogCiAjdW5kZWYgIFNUWUxFCkBAIC00ODYsOCArNDg3LDYgQEAKIAogCiAgIC8qIERlY2xhcmUgYW5kIGRlZmluZSB2dGFibGVzIGZvciBjbGFzc2VzICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KICNkZWZpbmUgQUZfREVDTEFSRV9XUklUSU5HX1NZU1RFTV9DTEFTUyggd3JpdGluZ19zeXN0ZW1fY2xhc3MgKSBcCiAgIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyAgICAgICAgICAgICAgXAogICB3cml0aW5nX3N5c3RlbV9jbGFzczsKQEAgLTU2Miw4NyArNTYxLDkgQEAKICAgICBjb3ZlcmFnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH07CiAKLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgQUZfREVDTEFSRV9XUklUSU5HX1NZU1RFTV9DTEFTUyggd3JpdGluZ19zeXN0ZW1fY2xhc3MgKSAgICAgICAgICAgIFwKLSAgRlRfTE9DQUwoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgd3JpdGluZ19zeXN0ZW1fY2xhc3MoIEFGX1dyaXRpbmdTeXN0ZW1DbGFzc1JlYyogIGFjICk7Ci0KLSNkZWZpbmUgQUZfREVGSU5FX1dSSVRJTkdfU1lTVEVNX0NMQVNTKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHdyaXRpbmdfc3lzdGVtX2NsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc3lzdGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1faW5pdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbV9zY2FsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtX2RvbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1fc3RkdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaF9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBoX2FwcGx5ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9MT0NBTF9ERUYoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIHdyaXRpbmdfc3lzdGVtX2NsYXNzKCBBRl9Xcml0aW5nU3lzdGVtQ2xhc3NSZWMqICBhYyApIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT53cml0aW5nX3N5c3RlbSAgICAgICAgPSBzeXN0ZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGVfbWV0cmljc19zaXplICAgID0gbV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnN0eWxlX21ldHJpY3NfaW5pdCAgICA9IG1faW5pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGVfbWV0cmljc19zY2FsZSAgID0gbV9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zdHlsZV9tZXRyaWNzX2RvbmUgICAgPSBtX2RvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnN0eWxlX21ldHJpY3NfZ2V0c3RkdyA9IG1fc3RkdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zdHlsZV9oaW50c19pbml0ICAgICAgPSBoX2luaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWMtPnN0eWxlX2hpbnRzX2FwcGx5ICAgICA9IGhfYXBwbHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNkZWZpbmUgQUZfREVDTEFSRV9TQ1JJUFRfQ0xBU1MoIHNjcmlwdF9jbGFzcyApICAgICAgICAgICAgIFwKLSAgRlRfTE9DQUwoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgc2NyaXB0X2NsYXNzKCBBRl9TY3JpcHRDbGFzc1JlYyogIGFjICk7Ci0KLSNkZWZpbmUgQUZfREVGSU5FX1NDUklQVF9DTEFTUyggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNjcmlwdF9jbGFzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2NyaXB0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYW5nZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5vbmJhc2VfcmFuZ2VzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdG9wX3RvX2JvdHRvbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdGRfY2hhcnN0cmluZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9MT0NBTF9ERUYoIHZvaWQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIHNjcmlwdF9jbGFzcyggQUZfU2NyaXB0Q2xhc3NSZWMqICBhYyApIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFjLT5zY3JpcHQgICAgICAgICAgICAgICAgICAgID0gc2NyaXB0XzsgICAgICAgICAgICAgICBcCi0gICAgYWMtPnNjcmlwdF91bmlfcmFuZ2VzICAgICAgICAgPSByYW5nZXM7ICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c2NyaXB0X3VuaV9ub25iYXNlX3JhbmdlcyA9IG5vbmJhc2VfcmFuZ2VzOyAgICAgICAgXAotICAgIGFjLT50b3BfdG9fYm90dG9tX2hpbnRpbmcgICAgID0gdG9wX3RvX2JvdHRvbTsgICAgICAgICBcCi0gICAgYWMtPnN0YW5kYXJkX2NoYXJzdHJpbmcgICAgICAgPSBzdGRfY2hhcnN0cmluZzsgICAgICAgIFwKLSAgfQotCi0KLSNkZWZpbmUgQUZfREVDTEFSRV9TVFlMRV9DTEFTUyggc3R5bGVfY2xhc3MgKSAgICAgICAgICAgICBcCi0gIEZUX0xPQ0FMKCB2b2lkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBzdHlsZV9jbGFzcyggQUZfU3R5bGVDbGFzc1JlYyogIGFjICk7Ci0KLSNkZWZpbmUgQUZfREVGSU5FX1NUWUxFX0NMQVNTKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdHlsZV9jbGFzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdHlsZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB3cml0aW5nX3N5c3RlbV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzY3JpcHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBibHVlX3N0cmluZ3NldF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb3ZlcmFnZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfTE9DQUxfREVGKCB2b2lkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgc3R5bGVfY2xhc3MoIEFGX1N0eWxlQ2xhc3NSZWMqICBhYyApIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c3R5bGUgICAgICAgICAgPSBzdHlsZV87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+d3JpdGluZ19zeXN0ZW0gPSB3cml0aW5nX3N5c3RlbV87ICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+c2NyaXB0ICAgICAgICAgPSBzY3JpcHRfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+Ymx1ZV9zdHJpbmdzZXQgPSBibHVlX3N0cmluZ3NldF87ICAgICAgICAgICAgICAgIFwKLSAgICBhYy0+Y292ZXJhZ2UgICAgICAgPSBjb3ZlcmFnZV87ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCiAvKiAqLwogCisKIEZUX0VORF9IRUFERVIKIAogI2VuZGlmIC8qIEFGVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmd2FycC5jIGIvc3JjL2F1dG9maXQvYWZ3YXJwLmMKaW5kZXggMmE3NWVhNy4uODA4MjgwZCAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZ3YXJwLmMKKysrIGIvc3JjL2F1dG9maXQvYWZ3YXJwLmMKQEAgLTEsNDAgKzEsNDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmd2FycC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciB3YXJwaW5nIGFsZ29yaXRobSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmd2FycC5jCisgKgorICogICBBdXRvLWZpdHRlciB3YXJwaW5nIGFsZ29yaXRobSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgIC8qCi0gICAqICBUaGUgaWRlYSBvZiB0aGUgd2FycGluZyBjb2RlIGlzIHRvIHNsaWdodGx5IHNjYWxlIGFuZCBzaGlmdCBhIGdseXBoCi0gICAqICB3aXRoaW4gYSBzaW5nbGUgZGltZW5zaW9uIHNvIHRoYXQgYXMgbXVjaCBvZiBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQKLSAgICogIChtb3JlIG9yIGxlc3MpIG9uIHRoZSBncmlkLiAgVG8gZmluZCBvdXQgdGhlIG9wdGltYWwgc2NhbGluZyBhbmQKLSAgICogIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuCisgICAqIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGgKKyAgICogd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiBzbyB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkCisgICAqIChtb3JlIG9yIGxlc3MpIG9uIHRoZSBncmlkLiAgVG8gZmluZCBvdXQgdGhlIG9wdGltYWwgc2NhbGluZyBhbmQKKyAgICogc2hpZnRpbmcgdmFsdWUsIHZhcmlvdXMgcGFyYW1ldGVyIGNvbWJpbmF0aW9ucyBhcmUgdHJpZWQgYW5kIHNjb3JlZC4KICAgICovCiAKICNpbmNsdWRlICJhZndhcnAuaCIKIAogI2lmZGVmIEFGX0NPTkZJR19PUFRJT05fVVNFX1dBUlBFUgogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9hZndhcnAKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBhZndhcnAKIAogCiAgIC8qIFRoZSB3ZWlnaHRzIGNvdmVyIHRoZSByYW5nZSAwLzY0IC0gNjMvNjQgb2YgYSBwaXhlbC4gIE9idmlvdXNseSwgKi8KZGlmZiAtLWdpdCBhL3NyYy9hdXRvZml0L2Fmd2FycC5oIGIvc3JjL2F1dG9maXQvYWZ3YXJwLmgKaW5kZXggNTIwYjFiZS4uY2RlYTIzZSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZ3YXJwLmgKKysrIGIvc3JjL2F1dG9maXQvYWZ3YXJwLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmd2FycC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXRvLWZpdHRlciB3YXJwaW5nIGFsZ29yaXRobSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGFmd2FycC5oCisgKgorICogICBBdXRvLWZpdHRlciB3YXJwaW5nIGFsZ29yaXRobSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEFGV0FSUF9IXwpAQCAtNDcsMTIgKzQ3LDE0IEBACiAgIH0gQUZfV2FycGVyUmVjLCAqQUZfV2FycGVyOwogCiAKKyNpZmRlZiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKICAgRlRfTE9DQUwoIHZvaWQgKQogICBhZl93YXJwZXJfY29tcHV0ZSggQUZfV2FycGVyICAgICAgd2FycGVyLAogICAgICAgICAgICAgICAgICAgICAgQUZfR2x5cGhIaW50cyAgaGludHMsCiAgICAgICAgICAgICAgICAgICAgICBBRl9EaW1lbnNpb24gICBkaW0sCiAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICphX3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAqYV9kZWx0YSApOworICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAqYV9kZWx0YSApOworI2VuZGlmCiAKIAogRlRfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvYWZ3cnRzeXMuaCBiL3NyYy9hdXRvZml0L2Fmd3J0c3lzLmgKaW5kZXggNDY3NWYzMi4uMzk5MDYzMyAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYWZ3cnRzeXMuaAorKysgYi9zcmMvYXV0b2ZpdC9hZndydHN5cy5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZndydHN5cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV0by1maXR0ZXIgd3JpdGluZyBzeXN0ZW1zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZndydHN5cy5oCisgKgorICogICBBdXRvLWZpdHRlciB3cml0aW5nIHN5c3RlbXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEFGV1JUU1lTX0hfCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9hdXRvZml0LmMgYi9zcmMvYXV0b2ZpdC9hdXRvZml0LmMKaW5kZXggYzE2MDUxNi4uZWY1ZTdmMSAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvYXV0b2ZpdC5jCisrKyBiL3NyYy9hdXRvZml0L2F1dG9maXQuYwpAQCAtMSwyMyArMSwyMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYXV0b2ZpdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1dG8tZml0dGVyIG1vZHVsZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogYXV0b2ZpdC5jCisgKgorICogICBBdXRvLWZpdHRlciBtb2R1bGUgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgImFmYW5nbGVzLmMiCiAjaW5jbHVkZSAiYWZibHVlLmMiCkBAIC0zMCw3ICsyOSw2IEBACiAjaW5jbHVkZSAiYWZsYXRpbjIuYyIKICNpbmNsdWRlICJhZmxvYWRlci5jIgogI2luY2x1ZGUgImFmbW9kdWxlLmMiCi0jaW5jbHVkZSAiYWZwaWMuYyIKICNpbmNsdWRlICJhZnJhbmdlcy5jIgogI2luY2x1ZGUgImFmc2hhcGVyLmMiCiAjaW5jbHVkZSAiYWZ3YXJwLmMiCmRpZmYgLS1naXQgYS9zcmMvYXV0b2ZpdC9tb2R1bGUubWsgYi9zcmMvYXV0b2ZpdC9tb2R1bGUubWsKaW5kZXggZmYwNWY4My4uYzMyNzgxZiAxMDA2NDQKLS0tIGEvc3JjL2F1dG9maXQvbW9kdWxlLm1rCisrKyBiL3NyYy9hdXRvZml0L21vZHVsZS5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAzLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL2F1dG9maXQvcnVsZXMubWsgYi9zcmMvYXV0b2ZpdC9ydWxlcy5tawppbmRleCA3NTE3MWI0Li41NTNkZGNlIDEwMDY0NAotLS0gYS9zcmMvYXV0b2ZpdC9ydWxlcy5taworKysgYi9zcmMvYXV0b2ZpdC9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAzLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMzgsNyArMzgsNiBAQAogICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZsYXRpbi5jICBcCiAgICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZmxvYWRlci5jIFwKICAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2FmbW9kdWxlLmMgXAotICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZwaWMuYyAgICBcCiAgICAgICAgICAgICAgICAgICQoQVVUT0ZfRElSKS9hZnJhbmdlcy5jIFwKICAgICAgICAgICAgICAgICAgJChBVVRPRl9ESVIpL2Fmc2hhcGVyLmMgXAogICAgICAgICAgICAgICAgICAkKEFVVE9GX0RJUikvYWZ3YXJwLmMKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL0phbWZpbGUgYi9zcmMvYmFzZS9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTk0YzFiLi4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2Jhc2UgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGJhc2UgOwotCi0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gYmFzZXBpYwotICAgICAgICAgICAgICAgZnRhZHZhbmMKLSAgICAgICAgICAgICAgIGZ0Y2FsYwotICAgICAgICAgICAgICAgZnRkYmdtZW0KLSAgICAgICAgICAgICAgIGZ0Zm50Zm10Ci0gICAgICAgICAgICAgICBmdGdsb2FkcgotICAgICAgICAgICAgICAgZnRoYXNoCi0gICAgICAgICAgICAgICBmdGxjZGZpbAotICAgICAgICAgICAgICAgZnRvYmpzCi0gICAgICAgICAgICAgICBmdG91dGxuCi0gICAgICAgICAgICAgICBmdHBpYwotICAgICAgICAgICAgICAgZnRwc3Byb3AKLSAgICAgICAgICAgICAgIGZ0cmZvcmsKLSAgICAgICAgICAgICAgIGZ0c25hbWVzCi0gICAgICAgICAgICAgICBmdHN0cmVhbQotICAgICAgICAgICAgICAgZnR0cmlnb24KLSAgICAgICAgICAgICAgIGZ0dXRpbAotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gZnRiYXNlIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBBZGQgdGhlIG9wdGlvbmFsL3JlcGxhY2VhYmxlIGZpbGVzLgotIwotewotICBsb2NhbCAgX3NvdXJjZXMgPSBmdGFwaQotICAgICAgICAgICAgICAgICAgICBmdGJib3gKLSAgICAgICAgICAgICAgICAgICAgZnRiZGYKLSAgICAgICAgICAgICAgICAgICAgZnRiaXRtYXAKLSAgICAgICAgICAgICAgICAgICAgZnRjaWQKLSAgICAgICAgICAgICAgICAgICAgZnRkZWJ1ZwotICAgICAgICAgICAgICAgICAgICBmdGZzdHlwZQotICAgICAgICAgICAgICAgICAgICBmdGdhc3AKLSAgICAgICAgICAgICAgICAgICAgZnRnbHlwaAotICAgICAgICAgICAgICAgICAgICBmdGd4dmFsCi0gICAgICAgICAgICAgICAgICAgIGZ0aW5pdAotICAgICAgICAgICAgICAgICAgICBmdG1tCi0gICAgICAgICAgICAgICAgICAgIGZ0b3R2YWwKLSAgICAgICAgICAgICAgICAgICAgZnRwYXRlbnQKLSAgICAgICAgICAgICAgICAgICAgZnRwZnIKLSAgICAgICAgICAgICAgICAgICAgZnRzdHJva2UKLSAgICAgICAgICAgICAgICAgICAgZnRzeW50aAotICAgICAgICAgICAgICAgICAgICBmdHN5c3RlbQotICAgICAgICAgICAgICAgICAgICBmdHR5cGUxCi0gICAgICAgICAgICAgICAgICAgIGZ0d2luZm50Ci0gICAgICAgICAgICAgICAgICAgIDsKLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgQWRkIE1hY2ludG9zaC1zcGVjaWZpYyBmaWxlIHRvIHRoZSBsaWJyYXJ5IHdoZW4gbmVjZXNzYXJ5LgotIwotaWYgJChNQUMpCi17Ci0gIExpYnJhcnkgICQoRlQyX0xJQikgOiBmdG1hYy5jIDsKLX0KLWVsc2UgaWYgJChPUykgPSBNQUNPU1gKLXsKLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRtYWMuYyA7Ci0gIH0KLX0KLQotIyBlbmQgb2Ygc3JjL2Jhc2UgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvYmFzZXBpYy5jIGIvc3JjL2Jhc2UvYmFzZXBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzgwNDA2Li4wMDAwMDAwCi0tLSBhL3NyYy9iYXNlL2Jhc2VwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBiYXNlcGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGJhc2UuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiYmFzZXBpYy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRnbHlwaC5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9vdXRsaW5lX2dseXBoX2NsYXNzKCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6ICk7Ci0KLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2Z0X2JpdG1hcF9nbHlwaF9jbGFzcyggRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbiBmcm9tIGZ0cmZvcmsuYyAqLwotICAvKiAobm90IG1vZHVsYXJpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHZvaWQKLSAgRlRfSW5pdF9UYWJsZV9mdF9yYWNjZXNzX2d1ZXNzX3RhYmxlKCBmdF9yYWNjZXNzX2d1ZXNzX3JlYyogIHJlY29yZCApOwotI2VuZGlmCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBmdGluaXQuYyAqLwotICBGVF9FcnJvcgotICBmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfZGVzdHJveV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotICB2b2lkCi0gIGZ0X2Jhc2VfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5iYXNlICkKLSAgICB7Ci0gICAgICAvKiBkZXN0cm95IGRlZmF1bHQgbW9kdWxlIGNsYXNzZXMgICAgICAgICAgICAqLwotICAgICAgLyogKGluIGNhc2UgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyB3YXMgdXNlZCkgKi8KLSAgICAgIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggbGlicmFyeSApOwotCi0gICAgICBGVF9GUkVFKCBwaWNfY29udGFpbmVyLT5iYXNlICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5iYXNlID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X2Jhc2VfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBCYXNlUElDKiAgICAgICAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5iYXNlID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBkZWZhdWx0IG1vZHVsZXMgbGlzdCBhbmQgcG9pbnRlcnMgKi8KLSAgICBlcnJvciA9IGZ0X2NyZWF0ZV9kZWZhdWx0X21vZHVsZV9jbGFzc2VzKCBsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgZXhwZWN0cyB0aGlzIGRhdGEgKi8KLSAgICBGVF9Jbml0X0NsYXNzX2Z0X291dGxpbmVfZ2x5cGhfY2xhc3MoCi0gICAgICAmY29udGFpbmVyLT5mdF9vdXRsaW5lX2dseXBoX2NsYXNzICk7Ci0gICAgRlRfSW5pdF9DbGFzc19mdF9iaXRtYXBfZ2x5cGhfY2xhc3MoCi0gICAgICAmY29udGFpbmVyLT5mdF9iaXRtYXBfZ2x5cGhfY2xhc3MgKTsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotICAgIEZUX0luaXRfVGFibGVfZnRfcmFjY2Vzc19ndWVzc190YWJsZSgKLSAgICAgIChmdF9yYWNjZXNzX2d1ZXNzX3JlYyopJmNvbnRhaW5lci0+ZnRfcmFjY2Vzc19ndWVzc190YWJsZSApOwotI2VuZGlmCi0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGZ0X2Jhc2VfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9iYXNlcGljLmggYi9zcmMvYmFzZS9iYXNlcGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmQxZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvYmFzZXBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZXBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBiYXNlLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIEJBU0VQSUNfSF8KLSNkZWZpbmUgQkFTRVBJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUICAmZnRfb3V0bGluZV9nbHlwaF9jbGFzcwotI2RlZmluZSBGVF9CSVRNQVBfR0xZUEhfQ0xBU1NfR0VUICAgJmZ0X2JpdG1hcF9nbHlwaF9jbGFzcwotI2RlZmluZSBGVF9ERUZBVUxUX01PRFVMRVNfR0VUICAgICAgZnRfZGVmYXVsdF9tb2R1bGVzCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLCi0jZGVmaW5lIEZUX1JBQ0NFU1NfR1VFU1NfVEFCTEVfR0VUICBmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlCi0jZW5kaWYKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2luY2x1ZGUgRlRfR0xZUEhfSAotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2luY2x1ZGUgRlRfSU5URVJOQUxfUkZPUktfSAotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEJhc2VQSUNfCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgZGVmYXVsdF9tb2R1bGVfY2xhc3NlczsKLSAgICBGVF9HbHlwaF9DbGFzcyAgICAgZnRfb3V0bGluZV9nbHlwaF9jbGFzczsKLSAgICBGVF9HbHlwaF9DbGFzcyAgICAgZnRfYml0bWFwX2dseXBoX2NsYXNzOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotICAgIGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjICBmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlW0ZUX1JBQ0NFU1NfTl9SVUxFU107Ci0jZW5kaWYKLQotICB9IEJhc2VQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSAgKCAoQmFzZVBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5iYXNlICkgKQotCi0jZGVmaW5lIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICZHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X291dGxpbmVfZ2x5cGhfY2xhc3MgKQotI2RlZmluZSBGVF9CSVRNQVBfR0xZUEhfQ0xBU1NfR0VUICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggJkdFVF9QSUMoIGxpYnJhcnkgKS0+ZnRfYml0bWFwX2dseXBoX2NsYXNzICkKLSNkZWZpbmUgRlRfREVGQVVMVF9NT0RVTEVTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyApCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLCi0jZGVmaW5lIEZUX1JBQ0NFU1NfR1VFU1NfVEFCTEVfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUgKQotI2VuZGlmCi0KLQotICAvKiBzZWUgYmFzZXBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBmdF9iYXNlX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfYmFzZV9waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLSNlbmRpZiAvKiBCQVNFUElDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGFkdmFuYy5jIGIvc3JjL2Jhc2UvZnRhZHZhbmMuYwppbmRleCAyMzBjODRkLi5jNjg5ZTZhIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGFkdmFuYy5jCisrKyBiL3NyYy9iYXNlL2Z0YWR2YW5jLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YWR2YW5jLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBRdWljayBjb21wdXRhdGlvbiBvZiBhZHZhbmNlIHdpZHRocyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0YWR2YW5jLmMKKyAqCisgKiAgIFF1aWNrIGNvbXB1dGF0aW9uIG9mIGFkdmFuY2Ugd2lkdGhzIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgRlRfQURWQU5DRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRhZHZhbmMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogCiAgIHN0YXRpYyBGVF9FcnJvcgpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRhcGkuYyBiL3NyYy9iYXNlL2Z0YXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDZlOTUuLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRhcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGFwaS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTElTVF9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgIEMgTyBNIFAgQSBUIEkgQiBJIEwgSSBUIFkgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IEFQSSAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfTmV3X01lbW9yeV9TdHJlYW0oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIGJhc2UsIHNpemUgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2Vla19TdHJlYW0oIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHBvcyApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9Ta2lwX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGRpc3RhbmNlICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCBkaXN0YW5jZSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWFkX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIGJ1ZmZlciwgY291bnQgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVhZF9TdHJlYW1fQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkQXQoIHN0cmVhbSwgcG9zLCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0V4dHJhY3RfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCBjb3VudCwgcGJ5dGVzICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmVsZWFzZV9GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUoIHN0cmVhbSwgcGJ5dGVzICk7Ci0gIH0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9BY2Nlc3NfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfRm9yZ2V0X0ZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9TdHJlYW1fRXhpdEZyYW1lKCBzdHJlYW0gKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiYXNlLmMgYi9zcmMvYmFzZS9mdGJhc2UuYwppbmRleCBmOTE0YjliLi5iZmJhZmZkIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGJhc2UuYworKysgYi9zcmMvYmFzZS9mdGJhc2UuYwpAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYXNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRiYXNlLmMKKyAqCisgKiAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQgKGJvZHkgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNkZWZpbmUgIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKIAotI2luY2x1ZGUgImJhc2VwaWMuYyIKICNpbmNsdWRlICJmdGFkdmFuYy5jIgogI2luY2x1ZGUgImZ0Y2FsYy5jIgorI2luY2x1ZGUgImZ0Y29sb3IuYyIKICNpbmNsdWRlICJmdGRiZ21lbS5jIgorI2luY2x1ZGUgImZ0ZXJyb3JzLmMiCiAjaW5jbHVkZSAiZnRmbnRmbXQuYyIKICNpbmNsdWRlICJmdGdsb2Fkci5jIgogI2luY2x1ZGUgImZ0aGFzaC5jIgpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImZ0bWFjLmMiCiAjaW5jbHVkZSAiZnRvYmpzLmMiCiAjaW5jbHVkZSAiZnRvdXRsbi5jIgotI2luY2x1ZGUgImZ0cGljLmMiCiAjaW5jbHVkZSAiZnRwc3Byb3AuYyIKICNpbmNsdWRlICJmdHJmb3JrLmMiCiAjaW5jbHVkZSAiZnRzbmFtZXMuYyIKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0YmFzZS5oIGIvc3JjL2Jhc2UvZnRiYXNlLmgKaW5kZXggN2U4Y2ZhZC4uMjVhZmE5YiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRiYXNlLmgKKysrIGIvc3JjL2Jhc2UvZnRiYXNlLmgKQEAgLTEsMzIgKzEsMzUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQcml2YXRlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBgYmFzZScgbW9kdWxlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBzdXp1a2kgdG9zaGl5YS4gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0YmFzZS5oCisgKgorICogICBQcml2YXRlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBgYmFzZScgbW9kdWxlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBzdXp1a2kgdG9zaGl5YS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEZUQkFTRV9IXwogI2RlZmluZSBGVEJBU0VfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKKyAgRlRfREVDTEFSRV9HTFlQSCggZnRfYml0bWFwX2dseXBoX2NsYXNzICkKKyAgRlRfREVDTEFSRV9HTFlQSCggZnRfb3V0bGluZV9nbHlwaF9jbGFzcyApCisKKwogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCiAKICAgLyogTWFjT1MgcmVzb3VyY2UgZm9yayBjYW5ub3QgZXhjZWVkIDE2TUIgYXQgbGVhc3QgZm9yIENhcmJvbiBjb2RlOyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiYm94LmMgYi9zcmMvYmFzZS9mdGJib3guYwppbmRleCAxNTFlODVjLi4zMGE0ZWJhIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGJib3guYworKysgYi9zcmMvYmFzZS9mdGJib3guYwpAQCAtMSwzNyArMSwzNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiYm94LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGJib3ggY29tcHV0YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRiYm94LmMKKyAqCisgKiAgIEZyZWVUeXBlIGJib3ggY29tcHV0YXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGNvbXBvbmVudCBoYXMgYSBfc2luZ2xlXyByb2xlOiB0byBjb21wdXRlIGV4YWN0IG91dGxpbmUgYm91bmRpbmcgKi8KLSAgLyogYm94ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZworICAgKiBib3hlcy4KKyAgICoKKyAgICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCi0jaW5jbHVkZSBGVF9CQk9YX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGJib3guaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGltYWdlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdXRsbi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIFRCQm94X1JlY18KQEAgLTYxLDI2ICs2MCwyOCBAQAogICAgICAgICAgICggcC0+eSA8IGJib3gueU1pbiB8fCBwLT55ID4gYmJveC55TWF4ICkKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfTW92ZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBtb3ZlX3RvJyBlbWl0dGVyIGR1cmluZyAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgc2ltcGx5IHJlY29yZHMgdGhlIGRlc3RpbmF0aW9uIHBvaW50ICAgKi8KLSAgLyogICAgaW4gYHVzZXItPmxhc3QnLiBXZSBhbHNvIHVwZGF0ZSBiYm94IGluIGNhc2UgY29udG91ciBzdGFydHMgd2l0aCAgICovCi0gIC8qICAgIGFuIGltcGxpY2l0IGBvbicgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBCQm94X01vdmVfVG8KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBtb3ZlX3RvJyBlbWl0dGVyIGR1cmluZworICAgKiAgIEZUX091dGxpbmVfRGVjb21wb3NlKCkuICBJdCBzaW1wbHkgcmVjb3JkcyB0aGUgZGVzdGluYXRpb24gcG9pbnQKKyAgICogICBpbiBgdXNlci0+bGFzdCcuIFdlIGFsc28gdXBkYXRlIGJib3ggaW4gY2FzZSBjb250b3VyIHN0YXJ0cyB3aXRoCisgICAqICAgYW4gaW1wbGljaXQgYG9uJyBwb2ludC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHRvIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIHVzZXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgY3VycmVudCB3YWxrIGNvbnRleHQuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4KKyAgICovCiAgIHN0YXRpYyBpbnQKICAgQkJveF9Nb3ZlX1RvKCBGVF9WZWN0b3IqICB0bywKICAgICAgICAgICAgICAgICBUQkJveF9SZWMqICB1c2VyICkKQEAgLTkzLDI2ICs5NCwyOCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0xpbmVfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgbGluZV90bycgZW1pdHRlciBkdXJpbmcgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoKS4gIEl0IHNpbXBseSByZWNvcmRzIHRoZSBkZXN0aW5hdGlvbiBwb2ludCAgICovCi0gIC8qICAgIGluIGB1c2VyLT5sYXN0Jzsgbm8gZnVydGhlciBjb21wdXRhdGlvbnMgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlICAgICAqLwotICAvKiAgICBiYm94IGFscmVhZHkgY29udGFpbnMgYm90aCBleHBsaWNpdCBlbmRzIG9mIHRoZSBsaW5lIHNlZ21lbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyIDo6IEEgcG9pbnRlciB0byB0aGUgY3VycmVudCB3YWxrIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbHdheXMgMC4gIE5lZWRlZCBmb3IgdGhlIGludGVyZmFjZSBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQkJveF9MaW5lX1RvCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgbGluZV90bycgZW1pdHRlciBkdXJpbmcKKyAgICogICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgc2ltcGx5IHJlY29yZHMgdGhlIGRlc3RpbmF0aW9uIHBvaW50CisgICAqICAgaW4gYHVzZXItPmxhc3QnOyBubyBmdXJ0aGVyIGNvbXB1dGF0aW9ucyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UKKyAgICogICBiYm94IGFscmVhZHkgY29udGFpbnMgYm90aCBleHBsaWNpdCBlbmRzIG9mIHRoZSBsaW5lIHNlZ21lbnQuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICB0byA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuCisgICAqLwogICBzdGF0aWMgaW50CiAgIEJCb3hfTGluZV9UbyggRlRfVmVjdG9yKiAgdG8sCiAgICAgICAgICAgICAgICAgVEJCb3hfUmVjKiAgdXNlciApCkBAIC0xMjMsMjggKzEyNiwzMyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0NvbmljX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIHRoZSBleHRyZW1hIG9mIGEgMS1kaW1lbnNpb25hbCBjb25pYyBCZXppZXIgY3VydmUgYW5kIHVwZGF0ZSAgKi8KLSAgLyogICAgYSBib3VuZGluZyByYW5nZS4gIFRoaXMgdmVyc2lvbiB1c2VzIGRpcmVjdCBjb21wdXRhdGlvbiwgYXMgaXQgICAgICovCi0gIC8qICAgIGRvZXNuJ3QgbmVlZCBzcXVhcmUgcm9vdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkxICA6OiBUaGUgc3RhcnQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTIgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MyAgOjogVGhlIGVuZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYXhpbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBCQm94X0NvbmljX0NoZWNrCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBGaW5kIHRoZSBleHRyZW1hIG9mIGEgMS1kaW1lbnNpb25hbCBjb25pYyBCZXppZXIgY3VydmUgYW5kIHVwZGF0ZQorICAgKiAgIGEgYm91bmRpbmcgcmFuZ2UuICBUaGlzIHZlcnNpb24gdXNlcyBkaXJlY3QgY29tcHV0YXRpb24sIGFzIGl0CisgICAqICAgZG9lc24ndCBuZWVkIHNxdWFyZSByb290cy4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHkxIDo6CisgICAqICAgICBUaGUgc3RhcnQgY29vcmRpbmF0ZS4KKyAgICoKKyAgICogICB5MiA6OgorICAgKiAgICAgVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgeTMgOjoKKyAgICogICAgIFRoZSBlbmQgY29vcmRpbmF0ZS4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIG1pbiA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bS4KKyAgICoKKyAgICogICBtYXggOjoKKyAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1heGltdW0uCisgICAqLwogICBzdGF0aWMgdm9pZAogICBCQm94X0NvbmljX0NoZWNrKCBGVF9Qb3MgICB5MSwKICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgeTIsCkBAIC0xNjgsMzIgKzE3NiwzNSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0NvbmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY29uaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoKS4gIEl0IGNoZWNrcyBhIGNvbmljIEJlemllciBjdXJ2ZSB3aXRoIHRoZSAgICovCi0gIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLwotICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sIDo6IEEgcG9pbnRlciB0byBhIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIHRoZSBjYXNlIG9mIGEgbm9uLW1vbm90b25vdXMgYXJjLCB3ZSBjb21wdXRlIGRpcmVjdGx5IHRoZSAgICAgICAqLwotICAvKiAgICBleHRyZW11bSBjb29yZGluYXRlcywgYXMgaXQgaXMgc3VmZmljaWVudGx5IGZhc3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQkJveF9Db25pY19UbworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIGEgYGNvbmljX3RvJyBlbWl0dGVyIGR1cmluZworICAgKiAgIEZUX091dGxpbmVfRGVjb21wb3NlKCkuICBJdCBjaGVja3MgYSBjb25pYyBCZXppZXIgY3VydmUgd2l0aCB0aGUKKyAgICogICBjdXJyZW50IGJvdW5kaW5nIGJveCwgYW5kIGNvbXB1dGVzIGl0cyBleHRyZW1hIGlmIG5lY2Vzc2FyeSB0bworICAgKiAgIHVwZGF0ZSBpdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGNvbnRyb2wgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byBhIGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgdG8gOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gdmVjdG9yLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgdXNlciA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuCisgICAqCisgICAqIEBOb3RlOgorICAgKiAgIEluIHRoZSBjYXNlIG9mIGEgbm9uLW1vbm90b25vdXMgYXJjLCB3ZSBjb21wdXRlIGRpcmVjdGx5IHRoZQorICAgKiAgIGV4dHJlbXVtIGNvb3JkaW5hdGVzLCBhcyBpdCBpcyBzdWZmaWNpZW50bHkgZmFzdC4KKyAgICovCiAgIHN0YXRpYyBpbnQKICAgQkJveF9Db25pY19UbyggRlRfVmVjdG9yKiAgY29udHJvbCwKICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCkBAIC0yMjIsMzAgKzIzMywzNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0N1YmljX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIHRoZSBleHRyZW1hIG9mIGEgMS1kaW1lbnNpb25hbCBjdWJpYyBCZXppZXIgY3VydmUgYW5kICAgICAgICAgKi8KLSAgLyogICAgdXBkYXRlIGEgYm91bmRpbmcgcmFuZ2UuICBUaGlzIHZlcnNpb24gdXNlcyBpdGVyYXRpdmUgc3BsaXR0aW5nICAgICovCi0gIC8qICAgIGJlY2F1c2UgaXQgaXMgZmFzdGVyIHRoYW4gdGhlIGV4YWN0IHNvbHV0aW9uIHdpdGggc3F1YXJlIHJvb3RzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHAxICA6OiBUaGUgc3RhcnQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcDIgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwMyAgOjogVGhlIGNvb3JkaW5hdGUgb2YgdGhlIHNlY29uZCBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHA0ICA6OiBUaGUgZW5kIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbiA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4IDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1heGltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEJCb3hfQ3ViaWNfQ2hlY2sKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZpbmQgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGN1YmljIEJlemllciBjdXJ2ZSBhbmQKKyAgICogICB1cGRhdGUgYSBib3VuZGluZyByYW5nZS4gIFRoaXMgdmVyc2lvbiB1c2VzIGl0ZXJhdGl2ZSBzcGxpdHRpbmcKKyAgICogICBiZWNhdXNlIGl0IGlzIGZhc3RlciB0aGFuIHRoZSBleGFjdCBzb2x1dGlvbiB3aXRoIHNxdWFyZSByb290cy4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHAxIDo6CisgICAqICAgICBUaGUgc3RhcnQgY29vcmRpbmF0ZS4KKyAgICoKKyAgICogICBwMiA6OgorICAgKiAgICAgVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICAgcDMgOjoKKyAgICogICAgIFRoZSBjb29yZGluYXRlIG9mIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogICBwNCA6OgorICAgKiAgICAgVGhlIGVuZCBjb29yZGluYXRlLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgbWluIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtaW5pbXVtLgorICAgKgorICAgKiAgIG1heCA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bS4KKyAgICovCiAgIHN0YXRpYyBGVF9Qb3MKICAgY3ViaWNfcGVhayggRlRfUG9zICBxMSwKICAgICAgICAgICAgICAgRlRfUG9zICBxMiwKQEAgLTI3NiwxMCArMjkzLDEwIEBACiAgICAgICBpZiAoIHNoaWZ0ID4gMiApCiAgICAgICAgIHNoaWZ0ID0gMjsKIAotICAgICAgcTEgPDw9ICBzaGlmdDsKLSAgICAgIHEyIDw8PSAgc2hpZnQ7Ci0gICAgICBxMyA8PD0gIHNoaWZ0OwotICAgICAgcTQgPDw9ICBzaGlmdDsKKyAgICAgIHExICo9IDEgPDwgc2hpZnQ7CisgICAgICBxMiAqPSAxIDw8IHNoaWZ0OworICAgICAgcTMgKj0gMSA8PCBzaGlmdDsKKyAgICAgIHE0ICo9IDEgPDwgc2hpZnQ7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0zMDEsOSArMzE4LDkgQEAKICAgICAgICAgcTIgPSBxMiArIHExOwogICAgICAgICBxNCA9IHE0ICsgcTM7CiAgICAgICAgIHEzID0gcTMgKyBxMjsKLSAgICAgICAgcTQgPSAoIHE0ICsgcTMgKSAvIDg7Ci0gICAgICAgIHEzID0gcTMgLyA0OwotICAgICAgICBxMiA9IHEyIC8gMjsKKyAgICAgICAgcTQgPSAoIHE0ICsgcTMgKSA+PiAzOworICAgICAgICBxMyA9IHEzID4+IDI7CisgICAgICAgIHEyID0gcTIgPj4gMTsKICAgICAgIH0KICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgaGFsZiAqLwogICAgICAgewpAQCAtMzEyLDkgKzMyOSw5IEBACiAgICAgICAgIHEzID0gcTMgKyBxNDsKICAgICAgICAgcTEgPSBxMSArIHEyOwogICAgICAgICBxMiA9IHEyICsgcTM7Ci0gICAgICAgIHExID0gKCBxMSArIHEyICkgLyA4OwotICAgICAgICBxMiA9IHEyIC8gNDsKLSAgICAgICAgcTMgPSBxMyAvIDI7CisgICAgICAgIHExID0gKCBxMSArIHEyICkgPj4gMzsKKyAgICAgICAgcTIgPSBxMiA+PiAyOworICAgICAgICBxMyA9IHEzID4+IDE7CiAgICAgICB9CiAKICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgZWl0aGVyIGVuZCByZWFjaGVkIHRoZSBtYXhpbXVtICovCkBAIC0zNjEsMzQgKzM3OCwzOCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0N1YmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY3ViaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoKS4gIEl0IGNoZWNrcyBhIGN1YmljIEJlemllciBjdXJ2ZSB3aXRoIHRoZSAgICovCi0gIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLwotICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wyIDo6IEEgcG9pbnRlciB0byB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tbW9ub3Rvbm91cyBhcmMsIHdlIGRvbid0IGNvbXB1dGUgZGlyZWN0bHkgICAgICovCi0gIC8qICAgIGV4dHJlbXVtIGNvb3JkaW5hdGVzLCB3ZSBzdWJkaXZpZGUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBCQm94X0N1YmljX1RvCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY3ViaWNfdG8nIGVtaXR0ZXIgZHVyaW5nCisgICAqICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoKS4gIEl0IGNoZWNrcyBhIGN1YmljIEJlemllciBjdXJ2ZSB3aXRoIHRoZQorICAgKiAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvCisgICAqICAgdXBkYXRlIGl0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgY29udHJvbDEgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogICBjb250cm9sMiA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogICB0byA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCB3YWxrIGNvbnRleHQuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tbW9ub3Rvbm91cyBhcmMsIHdlIGRvbid0IGNvbXB1dGUgZGlyZWN0bHkKKyAgICogICBleHRyZW11bSBjb29yZGluYXRlcywgd2Ugc3ViZGl2aWRlIGluc3RlYWQuCisgICAqLwogICBzdGF0aWMgaW50CiAgIEJCb3hfQ3ViaWNfVG8oIEZUX1ZlY3RvciogIGNvbnRyb2wxLAogICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMiwKQEAgLTQ5MCwxMiArNTExLDYgQEAKICAgICAgIEZUX0Vycm9yICAgZXJyb3I7CiAgICAgICBUQkJveF9SZWMgIHVzZXI7CiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgICAgRlRfT3V0bGluZV9GdW5jcyAgYmJveF9pbnRlcmZhY2U7Ci0KLQotICAgICAgSW5pdF9DbGFzc19iYm94X2ludGVyZmFjZSggJmJib3hfaW50ZXJmYWNlICk7Ci0jZW5kaWYKIAogICAgICAgdXNlci5iYm94ID0gYmJveDsKIApkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRiZGYuYyBiL3NyYy9iYXNlL2Z0YmRmLmMKaW5kZXggYzRlYTUwMi4uZmMzNzRjNiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRiZGYuYworKysgYi9zcmMvYmFzZS9mdGJkZi5jCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKGJvZHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGJkZi5jCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBCREYtc3BlY2lmaWMgc3RyaW5ncyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+CiAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YmRmLmggKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Yml0bWFwLmMgYi9zcmMvYmFzZS9mdGJpdG1hcC5jCmluZGV4IGE5NzQ2NjYuLjU4NDIxM2QgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0Yml0bWFwLmMKKysrIGIvc3JjL2Jhc2UvZnRiaXRtYXAuYwpAQCAtMSwzMSArMSw0MCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiaXRtYXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBiaXRtYXBzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRiaXRtYXAuYworICoKKyAqICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotI2luY2x1ZGUgRlRfSU1BR0VfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRiaXRtYXAuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGltYWdlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgYml0bWFwCiAKIAogICBzdGF0aWMKLSAgY29uc3QgRlRfQml0bWFwICBudWxsX2JpdG1hcCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICBjb25zdCBGVF9CaXRtYXAgIG51bGxfYml0bWFwID0geyAwLCAwLCAwLCBOVUxMLCAwLCAwLCAwLCBOVUxMIH07CiAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KQEAgLTc4Niw2ICs3OTUsMzM4IEBACiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiaXRtYXAuaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfQml0bWFwX0JsZW5kKCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCogIHNvdXJjZV8sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yICAgc291cmNlX29mZnNldF8sCisgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgICAgICAgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgICAgICAgKmF0YXJnZXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIEZUX0NvbG9yICAgICAgICAgIGNvbG9yICkKKyAgeworICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgRlRfTWVtb3J5ICBtZW1vcnk7CisKKyAgICBGVF9CaXRtYXAgICAgICAgICBzb3VyY2VfYml0bWFwOworICAgIGNvbnN0IEZUX0JpdG1hcCogIHNvdXJjZTsKKworICAgIEZUX1ZlY3RvciAgc291cmNlX29mZnNldDsKKyAgICBGVF9WZWN0b3IgIHRhcmdldF9vZmZzZXQ7CisKKyAgICBGVF9Cb29sICBmcmVlX3NvdXJjZV9iaXRtYXAgICAgICAgICAgPSAwOworICAgIEZUX0Jvb2wgIGZyZWVfdGFyZ2V0X2JpdG1hcF9vbl9lcnJvciA9IDA7CisKKyAgICBGVF9Qb3MgIHNvdXJjZV9sbHgsIHNvdXJjZV9sbHksIHNvdXJjZV91cngsIHNvdXJjZV91cnk7CisgICAgRlRfUG9zICB0YXJnZXRfbGx4LCB0YXJnZXRfbGx5LCB0YXJnZXRfdXJ4LCB0YXJnZXRfdXJ5OworICAgIEZUX1BvcyAgZmluYWxfbGx4LCBmaW5hbF9sbHksIGZpbmFsX3VyeCwgZmluYWxfdXJ5OworCisgICAgdW5zaWduZWQgaW50ICBmaW5hbF9yb3dzLCBmaW5hbF93aWR0aDsKKyAgICBsb25nICAgICAgICAgIHgsIHk7CisKKworICAgIGlmICggIWxpYnJhcnkgfHwgIXRhcmdldCB8fCAhc291cmNlXyB8fCAhYXRhcmdldF9vZmZzZXQgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisKKyAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisKKyAgICBpZiAoICEoIHRhcmdldC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX05PTkUgICAgIHx8CisgICAgICAgICAgICAoIHRhcmdldC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0JHUkEgJiYKKyAgICAgICAgICAgICAgdGFyZ2V0LT5idWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisKKyAgICBpZiAoIHNvdXJjZV8tPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9OT05FICkKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworCisgICAgLyogcGl0Y2hlcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2lnbiAqLworICAgIGlmICggdGFyZ2V0LT5waXhlbF9tb2RlID09IEZUX1BJWEVMX01PREVfQkdSQSAmJgorICAgICAgICAgKCBzb3VyY2VfLT5waXRjaCBeIHRhcmdldC0+cGl0Y2ggKSA8IDAgICApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworICAgIGlmICggISggc291cmNlXy0+d2lkdGggJiYgc291cmNlXy0+cm93cyApICkKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworCisgICAgLyogYXNzdXJlIGludGVnZXIgcGl4ZWwgb2Zmc2V0cyAqLworICAgIHNvdXJjZV9vZmZzZXQueCA9IEZUX1BJWF9GTE9PUiggc291cmNlX29mZnNldF8ueCApOworICAgIHNvdXJjZV9vZmZzZXQueSA9IEZUX1BJWF9GTE9PUiggc291cmNlX29mZnNldF8ueSApOworICAgIHRhcmdldF9vZmZzZXQueCA9IEZUX1BJWF9GTE9PUiggYXRhcmdldF9vZmZzZXQtPnggKTsKKyAgICB0YXJnZXRfb2Zmc2V0LnkgPSBGVF9QSVhfRkxPT1IoIGF0YXJnZXRfb2Zmc2V0LT55ICk7CisKKyAgICAvKiBnZXQgc291cmNlIGJpdG1hcCBkaW1lbnNpb25zICovCisgICAgc291cmNlX2xseCA9IHNvdXJjZV9vZmZzZXQueDsKKyAgICBpZiAoIEZUX0xPTkdfTUlOICsgKEZUX1BvcykoIHNvdXJjZV8tPnJvd3MgPDwgNiApICsgNjQgPiBzb3VyY2Vfb2Zmc2V0LnkgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNSgoCisgICAgICAgICJGVF9CaXRtYXBfQmxlbmQ6IHkgY29vcmRpbmF0ZSBvdmVyZmxvdyBpbiBzb3VyY2UgYml0bWFwXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgfQorICAgIHNvdXJjZV9sbHkgPSBzb3VyY2Vfb2Zmc2V0LnkgLSAoIHNvdXJjZV8tPnJvd3MgPDwgNiApOworCisgICAgaWYgKCBGVF9MT05HX01BWCAtIChGVF9Qb3MpKCBzb3VyY2VfLT53aWR0aCA8PCA2ICkgLSA2NCA8IHNvdXJjZV9sbHggKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNSgoCisgICAgICAgICJGVF9CaXRtYXBfQmxlbmQ6IHggY29vcmRpbmF0ZSBvdmVyZmxvdyBpbiBzb3VyY2UgYml0bWFwXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgfQorICAgIHNvdXJjZV91cnggPSBzb3VyY2VfbGx4ICsgKCBzb3VyY2VfLT53aWR0aCA8PCA2ICk7CisgICAgc291cmNlX3VyeSA9IHNvdXJjZV9vZmZzZXQueTsKKworICAgIC8qIGdldCB0YXJnZXQgYml0bWFwIGRpbWVuc2lvbnMgKi8KKyAgICBpZiAoIHRhcmdldC0+d2lkdGggJiYgdGFyZ2V0LT5yb3dzICkKKyAgICB7CisgICAgICB0YXJnZXRfbGx4ID0gdGFyZ2V0X29mZnNldC54OworICAgICAgaWYgKCBGVF9MT05HX01JTiArIChGVF9Qb3MpKCB0YXJnZXQtPnJvd3MgPDwgNiApID4gdGFyZ2V0X29mZnNldC55ICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0U1KCgKKyAgICAgICAgICAiRlRfQml0bWFwX0JsZW5kOiB5IGNvb3JkaW5hdGUgb3ZlcmZsb3cgaW4gdGFyZ2V0IGJpdG1hcFxuIiApKTsKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgICB9CisgICAgICB0YXJnZXRfbGx5ID0gdGFyZ2V0X29mZnNldC55IC0gKCB0YXJnZXQtPnJvd3MgPDwgNiApOworCisgICAgICBpZiAoIEZUX0xPTkdfTUFYIC0gKEZUX1BvcykoIHRhcmdldC0+d2lkdGggPDwgNiApIDwgdGFyZ2V0X2xseCApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNSgoCisgICAgICAgICAgIkZUX0JpdG1hcF9CbGVuZDogeCBjb29yZGluYXRlIG92ZXJmbG93IGluIHRhcmdldCBiaXRtYXBcbiIgKSk7CisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOworICAgICAgfQorICAgICAgdGFyZ2V0X3VyeCA9IHRhcmdldF9sbHggKyAoIHRhcmdldC0+d2lkdGggPDwgNiApOworICAgICAgdGFyZ2V0X3VyeSA9IHRhcmdldF9vZmZzZXQueTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRhcmdldF9sbHggPSBGVF9MT05HX01BWDsKKyAgICAgIHRhcmdldF9sbHkgPSBGVF9MT05HX01BWDsKKyAgICAgIHRhcmdldF91cnggPSBGVF9MT05HX01JTjsKKyAgICAgIHRhcmdldF91cnkgPSBGVF9MT05HX01JTjsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIGZpbmFsIGJpdG1hcCBkaW1lbnNpb25zICovCisgICAgZmluYWxfbGx4ID0gRlRfTUlOKCBzb3VyY2VfbGx4LCB0YXJnZXRfbGx4ICk7CisgICAgZmluYWxfbGx5ID0gRlRfTUlOKCBzb3VyY2VfbGx5LCB0YXJnZXRfbGx5ICk7CisgICAgZmluYWxfdXJ4ID0gRlRfTUFYKCBzb3VyY2VfdXJ4LCB0YXJnZXRfdXJ4ICk7CisgICAgZmluYWxfdXJ5ID0gRlRfTUFYKCBzb3VyY2VfdXJ5LCB0YXJnZXRfdXJ5ICk7CisKKyAgICBmaW5hbF93aWR0aCA9ICggZmluYWxfdXJ4IC0gZmluYWxfbGx4ICkgPj4gNjsKKyAgICBmaW5hbF9yb3dzICA9ICggZmluYWxfdXJ5IC0gZmluYWxfbGx5ICkgPj4gNjsKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgRlRfVFJBQ0U1KCggIkZUX0JpdG1hcF9CbGVuZDpcbiIKKyAgICAgICAgICAgICAgICAiICBzb3VyY2UgYml0bWFwOiAoJWxkLCAlbGQpIC0tICglbGQsICVsZCk7ICVkIHggJWRcbiIsCisgICAgICBzb3VyY2VfbGx4IC8gNjQsIHNvdXJjZV9sbHkgLyA2NCwKKyAgICAgIHNvdXJjZV91cnggLyA2NCwgc291cmNlX3VyeSAvIDY0LAorICAgICAgc291cmNlXy0+d2lkdGgsIHNvdXJjZV8tPnJvd3MgKSk7CisKKyAgICBpZiAoIHRhcmdldC0+d2lkdGggJiYgdGFyZ2V0LT5yb3dzICkKKyAgICAgIEZUX1RSQUNFNSgoICIgIHRhcmdldCBiaXRtYXA6ICglbGQsICVsZCkgLS0gKCVsZCwgJWxkKTsgJWQgeCAlZFxuIiwKKyAgICAgICAgdGFyZ2V0X2xseCAvIDY0LCB0YXJnZXRfbGx5IC8gNjQsCisgICAgICAgIHRhcmdldF91cnggLyA2NCwgdGFyZ2V0X3VyeSAvIDY0LAorICAgICAgICB0YXJnZXQtPndpZHRoLCB0YXJnZXQtPnJvd3MgKSk7CisgICAgZWxzZQorICAgICAgRlRfVFJBQ0U1KCggIiAgdGFyZ2V0IGJpdG1hcDogZW1wdHlcbiIgKSk7CisKKyAgICBpZiAoIGZpbmFsX3dpZHRoICYmIGZpbmFsX3Jvd3MgKQorICAgICAgRlRfVFJBQ0U1KCggIiAgZmluYWwgYml0bWFwOiAoJWxkLCAlbGQpIC0tICglbGQsICVsZCk7ICVkIHggJWRcbiIsCisgICAgICAgIGZpbmFsX2xseCAvIDY0LCBmaW5hbF9sbHkgLyA2NCwKKyAgICAgICAgZmluYWxfdXJ4IC8gNjQsIGZpbmFsX3VyeSAvIDY0LAorICAgICAgICBmaW5hbF93aWR0aCwgZmluYWxfcm93cyApKTsKKyAgICBlbHNlCisgICAgICBGVF9UUkFDRTUoKCAiICBmaW5hbCBiaXRtYXA6IGVtcHR5XG4iICkpOworI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCisKKyAgICBpZiAoICEoIGZpbmFsX3dpZHRoICYmIGZpbmFsX3Jvd3MgKSApCisgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKworICAgIC8qIGZvciBibGVuZGluZywgc2V0IG9mZnNldCB2ZWN0b3Igb2YgZmluYWwgYml0bWFwICovCisgICAgLyogdGVtcG9yYXJpbHkgdG8gKDAsMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzb3VyY2VfbGx4IC09IGZpbmFsX2xseDsKKyAgICBzb3VyY2VfbGx5IC09IGZpbmFsX2xseTsKKworICAgIGlmICggdGFyZ2V0LT53aWR0aCAmJiB0YXJnZXQtPnJvd3MgKQorICAgIHsKKyAgICAgIHRhcmdldF9sbHggLT0gZmluYWxfbGx4OworICAgICAgdGFyZ2V0X2xseSAtPSBmaW5hbF9sbHk7CisgICAgfQorCisgICAgLyogc2V0IHVwIHRhcmdldCBiaXRtYXAgKi8KKyAgICBpZiAoIHRhcmdldC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX05PTkUgKQorICAgIHsKKyAgICAgIC8qIGNyZWF0ZSBuZXcgZW1wdHkgYml0bWFwICovCisgICAgICB0YXJnZXQtPndpZHRoICAgICAgPSBmaW5hbF93aWR0aDsKKyAgICAgIHRhcmdldC0+cm93cyAgICAgICA9IGZpbmFsX3Jvd3M7CisgICAgICB0YXJnZXQtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7CisgICAgICB0YXJnZXQtPnBpdGNoICAgICAgPSAoaW50KWZpbmFsX3dpZHRoICogNDsKKyAgICAgIHRhcmdldC0+bnVtX2dyYXlzICA9IDI1NjsKKworICAgICAgaWYgKCBGVF9MT05HX01BWCAvIHRhcmdldC0+cGl0Y2ggPCAoaW50KXRhcmdldC0+cm93cyApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFNSgoICJGVF9CbGVuZF9CaXRtYXA6IHRhcmdldCBiaXRtYXAgdG9vIGxhcmdlICglZCB4ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3dpZHRoLCBmaW5hbF9yb3dzICkpOworICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgIH0KKworICAgICAgaWYgKCBGVF9BTExPQyggdGFyZ2V0LT5idWZmZXIsIHRhcmdldC0+cGl0Y2ggKiAoaW50KXRhcmdldC0+cm93cyApICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICBmcmVlX3RhcmdldF9iaXRtYXBfb25fZXJyb3IgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICggdGFyZ2V0LT53aWR0aCAhPSBmaW5hbF93aWR0aCB8fAorICAgICAgICAgICAgICB0YXJnZXQtPnJvd3MgICE9IGZpbmFsX3Jvd3MgICkKKyAgICB7CisgICAgICAvKiBhZGp1c3Qgb2xkIGJpdG1hcCB0byBlbmxhcmdlZCBzaXplICovCisgICAgICBpbnQgIHBpdGNoLCBuZXdfcGl0Y2g7CisKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBidWZmZXIgPSBOVUxMOworCisKKyAgICAgIHBpdGNoID0gdGFyZ2V0LT5waXRjaDsKKworICAgICAgaWYgKCBwaXRjaCA8IDAgKQorICAgICAgICBwaXRjaCA9IC1waXRjaDsKKworICAgICAgbmV3X3BpdGNoID0gKGludClmaW5hbF93aWR0aCAqIDQ7CisKKyAgICAgIGlmICggRlRfTE9OR19NQVggLyBuZXdfcGl0Y2ggPCAoaW50KWZpbmFsX3Jvd3MgKQorICAgICAgeworICAgICAgICBGVF9UUkFDRTUoKCAiRlRfQmxlbmRfQml0bWFwOiB0YXJnZXQgYml0bWFwIHRvbyBsYXJnZSAoJWQgeCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbF93aWR0aCwgZmluYWxfcm93cyApKTsKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgICB9CisKKyAgICAgIC8qIFRPRE86IHByb3ZpZGUgYW4gaW4tYnVmZmVyIHNvbHV0aW9uIGZvciBsYXJnZSBiaXRtYXBzICovCisgICAgICAvKiAgICAgICB0byBhdm9pZCBhbGxvY2F0aW9uIG9mIGEgbmV3IGJ1ZmZlciAgICAgICAgICAgICAqLworICAgICAgaWYgKCBGVF9BTExPQyggYnVmZmVyLCBuZXdfcGl0Y2ggKiAoaW50KWZpbmFsX3Jvd3MgKSApCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgIC8qIGNvcHkgZGF0YSB0byBuZXcgYnVmZmVyICovCisgICAgICB4ID0gdGFyZ2V0X2xseCA+PiA2OworICAgICAgeSA9IHRhcmdldF9sbHkgPj4gNjsKKworICAgICAgLyogdGhlIGJpdG1hcCBmbG93IGlzIGZyb20gdG9wIHRvIGJvdHRvbSwgKi8KKyAgICAgIC8qIGJ1dCB5IGlzIG1lYXN1cmVkIGZyb20gYm90dG9tIHRvIHRvcCAgICovCisgICAgICBpZiAoIHRhcmdldC0+cGl0Y2ggPCAwICkKKyAgICAgIHsKKyAgICAgICAgLyogWFhYICovCisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqICBwID0KKyAgICAgICAgICB0YXJnZXQtPmJ1ZmZlcjsKKyAgICAgICAgdW5zaWduZWQgY2hhciogIHEgPQorICAgICAgICAgIGJ1ZmZlciArCisgICAgICAgICAgKCBmaW5hbF9yb3dzIC0geSAtIHRhcmdldC0+cm93cyApICogbmV3X3BpdGNoICsKKyAgICAgICAgICB4ICogNDsKKyAgICAgICAgdW5zaWduZWQgY2hhciogIGxpbWl0X3AgPQorICAgICAgICAgIHAgKyBwaXRjaCAqIChpbnQpdGFyZ2V0LT5yb3dzOworCisKKyAgICAgICAgd2hpbGUgKCBwIDwgbGltaXRfcCApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9NRU1fQ09QWSggcSwgcCwgcGl0Y2ggKTsKKworICAgICAgICAgIHAgKz0gcGl0Y2g7CisgICAgICAgICAgcSArPSBuZXdfcGl0Y2g7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgRlRfRlJFRSggdGFyZ2V0LT5idWZmZXIgKTsKKworICAgICAgdGFyZ2V0LT53aWR0aCA9IGZpbmFsX3dpZHRoOworICAgICAgdGFyZ2V0LT5yb3dzICA9IGZpbmFsX3Jvd3M7CisKKyAgICAgIGlmICggdGFyZ2V0LT5waXRjaCA8IDAgKQorICAgICAgICB0YXJnZXQtPnBpdGNoID0gLW5ld19waXRjaDsKKyAgICAgIGVsc2UKKyAgICAgICAgdGFyZ2V0LT5waXRjaCA9IG5ld19waXRjaDsKKworICAgICAgdGFyZ2V0LT5idWZmZXIgPSBidWZmZXI7CisgICAgfQorCisgICAgLyogYWRqdXN0IHNvdXJjZSBiaXRtYXAgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKCBzb3VyY2VfLT5waXhlbF9tb2RlICE9IEZUX1BJWEVMX01PREVfR1JBWSApCisgICAgeworICAgICAgRlRfQml0bWFwX0luaXQoICZzb3VyY2VfYml0bWFwICk7CisgICAgICBlcnJvciA9IEZUX0JpdG1hcF9Db252ZXJ0KCBsaWJyYXJ5LCBzb3VyY2VfLCAmc291cmNlX2JpdG1hcCwgMSApOworICAgICAgaWYgKCBlcnJvciApCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgIHNvdXJjZSAgICAgICAgICAgICA9ICZzb3VyY2VfYml0bWFwOworICAgICAgZnJlZV9zb3VyY2VfYml0bWFwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgc291cmNlID0gc291cmNlXzsKKworICAgIC8qIGRvIGJsZW5kaW5nOyB0aGUgY29kZSBiZWxvdyByZXR1cm5zIHByZS1tdWx0aXBsaWVkIGNoYW5uZWxzLCAqLworICAgIC8qIHNpbWlsYXIgdG8gd2hhdCBGcmVlVHlwZSBnZXRzIGZyb20gYENCRFQnIHRhYmxlcyAgICAgICAgICAgICAqLworICAgIHggPSBzb3VyY2VfbGx4ID4+IDY7CisgICAgeSA9IHNvdXJjZV9sbHkgPj4gNjsKKworICAgIC8qIHRoZSBiaXRtYXAgZmxvdyBpcyBmcm9tIHRvcCB0byBib3R0b20sICovCisgICAgLyogYnV0IHkgaXMgbWVhc3VyZWQgZnJvbSBib3R0b20gdG8gdG9wICAgKi8KKyAgICBpZiAoIHRhcmdldC0+cGl0Y2ggPCAwICkKKyAgICB7CisgICAgICAvKiBYWFggKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHVuc2lnbmVkIGNoYXIqICBwID0KKyAgICAgICAgc291cmNlLT5idWZmZXI7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgcSA9CisgICAgICAgIHRhcmdldC0+YnVmZmVyICsKKyAgICAgICAgKCB0YXJnZXQtPnJvd3MgLSB5IC0gc291cmNlLT5yb3dzICkgKiB0YXJnZXQtPnBpdGNoICsKKyAgICAgICAgeCAqIDQ7CisgICAgICB1bnNpZ25lZCBjaGFyKiAgbGltaXRfcCA9CisgICAgICAgIHAgKyBzb3VyY2UtPnBpdGNoICogKGludClzb3VyY2UtPnJvd3M7CisKKworICAgICAgd2hpbGUgKCBwIDwgbGltaXRfcCApCisgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqICByICAgICAgID0gcDsKKyAgICAgICAgdW5zaWduZWQgY2hhciogIHMgICAgICAgPSBxOworICAgICAgICB1bnNpZ25lZCBjaGFyKiAgbGltaXRfciA9IHIgKyBzb3VyY2UtPndpZHRoOworCisKKyAgICAgICAgd2hpbGUgKCByIDwgbGltaXRfciApCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgIGFhID0gKnIrKzsKKyAgICAgICAgICBpbnQgIGZhID0gY29sb3IuYWxwaGEgKiBhYSAvIDI1NTsKKworICAgICAgICAgIGludCAgZmIgPSBjb2xvci5ibHVlICogZmEgLyAyNTU7CisgICAgICAgICAgaW50ICBmZyA9IGNvbG9yLmdyZWVuICogZmEgLyAyNTU7CisgICAgICAgICAgaW50ICBmciA9IGNvbG9yLnJlZCAqIGZhIC8gMjU1OworCisgICAgICAgICAgaW50ICBiYTIgPSAyNTUgLSBmYTsKKworICAgICAgICAgIGludCAgYmIgPSBzWzBdOworICAgICAgICAgIGludCAgYmcgPSBzWzFdOworICAgICAgICAgIGludCAgYnIgPSBzWzJdOworICAgICAgICAgIGludCAgYmEgPSBzWzNdOworCisKKyAgICAgICAgICAqcysrID0gKHVuc2lnbmVkIGNoYXIpKCBiYiAqIGJhMiAvIDI1NSArIGZiICk7CisgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKSggYmcgKiBiYTIgLyAyNTUgKyBmZyApOworICAgICAgICAgICpzKysgPSAodW5zaWduZWQgY2hhcikoIGJyICogYmEyIC8gMjU1ICsgZnIgKTsKKyAgICAgICAgICAqcysrID0gKHVuc2lnbmVkIGNoYXIpKCBiYSAqIGJhMiAvIDI1NSArIGZhICk7CisgICAgICAgIH0KKworICAgICAgICBwICs9IHNvdXJjZS0+cGl0Y2g7CisgICAgICAgIHEgKz0gdGFyZ2V0LT5waXRjaDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdGFyZ2V0X29mZnNldC0+eCA9IGZpbmFsX2xseDsKKyAgICBhdGFyZ2V0X29mZnNldC0+eSA9IGZpbmFsX2xseSArICggZmluYWxfcm93cyA8PCA2ICk7CisKKyAgRXJyb3I6CisgICAgaWYgKCBlcnJvciAmJiBmcmVlX3RhcmdldF9iaXRtYXBfb25fZXJyb3IgKQorICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksIHRhcmdldCApOworCisgICAgaWYgKCBmcmVlX3NvdXJjZV9iaXRtYXAgKQorICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksICZzb3VyY2VfYml0bWFwICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiaXRtYXAuaCAqLworCisgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKICAgRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApCiAgIHsKICAgICBpZiAoIHNsb3QgJiYgc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgICAmJgpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRjYWxjLmMgYi9zcmMvYmFzZS9mdGNhbGMuYwppbmRleCBmNGZmNDVmLi5iNTI1OGM4IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGNhbGMuYworKysgYi9zcmMvYmFzZS9mdGNhbGMuYwpAQCAtMSw0MyArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjYWxjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFyaXRobWV0aWMgY29tcHV0YXRpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjYWxjLmMKKyAqCisgKiAgIEFyaXRobWV0aWMgY29tcHV0YXRpb25zIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3VwcG9ydCBmb3IgMS1jb21wbGVtZW50IGFyaXRobWV0aWMgaGFzIGJlZW4gdG90YWxseSBkcm9wcGVkIGluIHRoaXMgICovCi0gIC8qIHJlbGVhc2UuICBZb3UgY2FuIHN0aWxsIHdyaXRlIHlvdXIgb3duIGNvZGUgaWYgeW91IG5lZWQgaXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTdXBwb3J0IGZvciAxLWNvbXBsZW1lbnQgYXJpdGhtZXRpYyBoYXMgYmVlbiB0b3RhbGx5IGRyb3BwZWQgaW4gdGhpcworICAgKiByZWxlYXNlLiAgWW91IGNhbiBzdGlsbCB3cml0ZSB5b3VyIG93biBjb2RlIGlmIHlvdSBuZWVkIGl0LgorICAgKgorICAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEltcGxlbWVudGluZyBiYXNpYyBjb21wdXRhdGlvbiByb3V0aW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTXVsRGl2KCksIEZUX011bEZpeCgpLCBGVF9EaXZGaXgoKSwgRlRfUm91bmRGaXgoKSwgRlRfQ2VpbEZpeCgpLCAgICovCi0gIC8qIGFuZCBGVF9GbG9vckZpeCgpIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJbXBsZW1lbnRpbmcgYmFzaWMgY29tcHV0YXRpb24gcm91dGluZXMuCisgICAqCisgICAqIEZUX011bERpdigpLCBGVF9NdWxGaXgoKSwgRlRfRGl2Rml4KCksIEZUX1JvdW5kRml4KCksIEZUX0NlaWxGaXgoKSwKKyAgICogYW5kIEZUX0Zsb29yRml4KCkgYXJlIGRlY2xhcmVkIGluIGZyZWV0eXBlLmguCisgICAqCisgICAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnbHlwaC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKICNpZmRlZiBGVF9NVUxGSVhfQVNTRU1CTEVSCkBAIC01OCwxNCArNTcsMTQgQEAKICNlbmRpZiAvKiAhRlRfTE9ORzY0ICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2FsYworI2RlZmluZSBGVF9DT01QT05FTlQgIGNhbGMKIAogCiAgIC8qIHRyYW5zZmVyIHNpZ24sIGxlYXZpbmcgYSBwb3NpdGl2ZSBudW1iZXI7ICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTUxNiwxMCArNTE1LDEwIEBACiAjZWxpZiAwCiAKICAgICAvKgotICAgICAqICBUaGlzIGNvZGUgaXMgbm9ucG9ydGFibGUuICBTZWUgY29tbWVudCBiZWxvdy4KKyAgICAgKiBUaGlzIGNvZGUgaXMgbm9ucG9ydGFibGUuICBTZWUgY29tbWVudCBiZWxvdy4KICAgICAgKgotICAgICAqICBIb3dldmVyLCBvbiBhIHBsYXRmb3JtIHdoZXJlIHJpZ2h0LXNoaWZ0IG9mIGEgc2lnbmVkIHF1YW50aXR5IGZpbGxzCi0gICAgICogIHRoZSBsZWZ0bW9zdCBiaXRzIGJ5IGNvcHlpbmcgdGhlIHNpZ24gYml0LCBpdCBtaWdodCBiZSBmYXN0ZXIuCisgICAgICogSG93ZXZlciwgb24gYSBwbGF0Zm9ybSB3aGVyZSByaWdodC1zaGlmdCBvZiBhIHNpZ25lZCBxdWFudGl0eSBmaWxscworICAgICAqIHRoZSBsZWZ0bW9zdCBiaXRzIGJ5IGNvcHlpbmcgdGhlIHNpZ24gYml0LCBpdCBtaWdodCBiZSBmYXN0ZXIuCiAgICAgICovCiAKICAgICBGVF9Mb25nICAgIHNhLCBzYjsKQEAgLTUyNywyMiArNTI2LDIyIEBACiAKIAogICAgIC8qCi0gICAgICogIFRoaXMgaXMgYSBjbGV2ZXIgd2F5IG9mIGNvbnZlcnRpbmcgYSBzaWduZWQgbnVtYmVyIGBhJyBpbnRvIGl0cwotICAgICAqICBhYnNvbHV0ZSB2YWx1ZSAoc3RvcmVkIGJhY2sgaW50byBgYScpIGFuZCBpdHMgc2lnbi4gIFRoZSBzaWduIGlzCi0gICAgICogIHN0b3JlZCBpbiBgc2EnOyAwIG1lYW5zIGBhJyB3YXMgcG9zaXRpdmUgb3IgemVybywgYW5kIC0xIG1lYW5zIGBhJwotICAgICAqICB3YXMgbmVnYXRpdmUuICAoU2ltaWxhcmx5IGZvciBgYicgYW5kIGBzYicpLgorICAgICAqIFRoaXMgaXMgYSBjbGV2ZXIgd2F5IG9mIGNvbnZlcnRpbmcgYSBzaWduZWQgbnVtYmVyIGBhJyBpbnRvIGl0cworICAgICAqIGFic29sdXRlIHZhbHVlIChzdG9yZWQgYmFjayBpbnRvIGBhJykgYW5kIGl0cyBzaWduLiAgVGhlIHNpZ24gaXMKKyAgICAgKiBzdG9yZWQgaW4gYHNhJzsgMCBtZWFucyBgYScgd2FzIHBvc2l0aXZlIG9yIHplcm8sIGFuZCAtMSBtZWFucyBgYScKKyAgICAgKiB3YXMgbmVnYXRpdmUuICAoU2ltaWxhcmx5IGZvciBgYicgYW5kIGBzYicpLgogICAgICAqCi0gICAgICogIFVuZm9ydHVuYXRlbHksIGl0IGRvZXNuJ3Qgd29yayAoYXQgbGVhc3Qgbm90IHBvcnRhYmx5KS4KKyAgICAgKiBVbmZvcnR1bmF0ZWx5LCBpdCBkb2Vzbid0IHdvcmsgKGF0IGxlYXN0IG5vdCBwb3J0YWJseSkuCiAgICAgICoKLSAgICAgKiAgSXQgbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdCByaWdodC1zaGlmdCBvbiBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZQotICAgICAqICBmaWxscyB0aGUgbGVmdG1vc3QgYml0cyBieSBjb3B5aW5nIHRoZSBzaWduIGJpdC4gIFRoaXMgaXMgd3JvbmcuCi0gICAgICogIEFjY29yZGluZyB0byBLJlIgMm5kIGVkLCBzZWN0aW9uIGBBNy44IFNoaWZ0IE9wZXJhdG9ycycgb24gcGFnZSAyMDYsCi0gICAgICogIHRoZSByZXN1bHQgb2YgcmlnaHQtc2hpZnQgb2YgYSBuZWdhdGl2ZSBzaWduZWQgdmFsdWUgaXMKLSAgICAgKiAgaW1wbGVtZW50YXRpb24tZGVmaW5lZC4gIEF0IGxlYXN0IG9uZSBpbXBsZW1lbnRhdGlvbiBmaWxscyB0aGUKLSAgICAgKiAgbGVmdG1vc3QgYml0cyB3aXRoIDBzIChpLmUuLCBpdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGFuIHVuc2lnbmVkCi0gICAgICogIHJpZ2h0IHNoaWZ0KS4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIGBhJyBpcyBuZWdhdGl2ZSwgYHNhJyBlbmRzIHVwCi0gICAgICogIHdpdGggdGhlIHZhbHVlIDEgcmF0aGVyIHRoYW4gLTEuICBBZnRlciB0aGF0LCBldmVyeXRoaW5nIGVsc2UgZ29lcwotICAgICAqICB3cm9uZy4KKyAgICAgKiBJdCBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IHJpZ2h0LXNoaWZ0IG9uIGEgbmVnYXRpdmUgc2lnbmVkIHZhbHVlCisgICAgICogZmlsbHMgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQuICBUaGlzIGlzIHdyb25nLgorICAgICAqIEFjY29yZGluZyB0byBLJlIgMm5kIGVkLCBzZWN0aW9uIGBBNy44IFNoaWZ0IE9wZXJhdG9ycycgb24gcGFnZSAyMDYsCisgICAgICogdGhlIHJlc3VsdCBvZiByaWdodC1zaGlmdCBvZiBhIG5lZ2F0aXZlIHNpZ25lZCB2YWx1ZSBpcworICAgICAqIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBBdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCisgICAgICogbGVmdG1vc3QgYml0cyB3aXRoIDBzIChpLmUuLCBpdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGFuIHVuc2lnbmVkCisgICAgICogcmlnaHQgc2hpZnQpLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4gYGEnIGlzIG5lZ2F0aXZlLCBgc2EnIGVuZHMgdXAKKyAgICAgKiB3aXRoIHRoZSB2YWx1ZSAxIHJhdGhlciB0aGFuIC0xLiAgQWZ0ZXIgdGhhdCwgZXZlcnl0aGluZyBlbHNlIGdvZXMKKyAgICAgKiB3cm9uZy4KICAgICAgKi8KICAgICBzYSA9ICggYV8gPj4gKCBzaXplb2YgKCBhXyApICogOCAtIDEgKSApOwogICAgIGEgID0gKCBhXyBeIHNhICkgLSBzYTsKQEAgLTcwMSw4ICs3MDAsOCBAQAogICAgIGlmICggIWRlbHRhICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOyAgLyogbWF0cml4IGNhbid0IGJlIGludmVydGVkICovCiAKLSAgICBtYXRyaXgtPnh5ID0gLSBGVF9EaXZGaXgoIG1hdHJpeC0+eHksIGRlbHRhICk7Ci0gICAgbWF0cml4LT55eCA9IC0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCBkZWx0YSApOworICAgIG1hdHJpeC0+eHkgPSAtRlRfRGl2Rml4KCBtYXRyaXgtPnh5LCBkZWx0YSApOworICAgIG1hdHJpeC0+eXggPSAtRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCBkZWx0YSApOwogCiAgICAgeHggPSBtYXRyaXgtPnh4OwogICAgIHl5ID0gbWF0cml4LT55eTsKQEAgLTc0Nyw2ICs3NDYsNzYgQEAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCiAKKyAgRlRfQkFTRV9ERUYoIEZUX0Jvb2wgKQorICBGVF9NYXRyaXhfQ2hlY2soIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCApCisgIHsKKyAgICBGVF9NYXRyaXggIG07CisgICAgRlRfRml4ZWQgICB2YWxbNF07CisgICAgRlRfRml4ZWQgICBub256ZXJvX21pbnZhbCwgbWF4dmFsOworICAgIEZUX0ZpeGVkICAgdGVtcDEsIHRlbXAyOworICAgIEZUX1VJbnQgICAgaTsKKworCisgICAgaWYgKCAhbWF0cml4ICkKKyAgICAgIHJldHVybiAwOworCisgICAgdmFsWzBdID0gRlRfQUJTKCBtYXRyaXgtPnh4ICk7CisgICAgdmFsWzFdID0gRlRfQUJTKCBtYXRyaXgtPnh5ICk7CisgICAgdmFsWzJdID0gRlRfQUJTKCBtYXRyaXgtPnl4ICk7CisgICAgdmFsWzNdID0gRlRfQUJTKCBtYXRyaXgtPnl5ICk7CisKKyAgICAvKgorICAgICAqIFRvIGF2b2lkIG92ZXJmbG93LCB3ZSBlbnN1cmUgdGhhdCBlYWNoIHZhbHVlIGlzIG5vdCBsYXJnZXIgdGhhbgorICAgICAqCisgICAgICogICBpbnQoc3FydCgyXjMxIC8gNCkpID0gMjMxNzAgIDsKKyAgICAgKgorICAgICAqIHdlIGFsc28gY2hlY2sgdGhhdCBubyB2YWx1ZSBiZWNvbWVzIHplcm8gaWYgd2UgaGF2ZSB0byBzY2FsZS4KKyAgICAgKi8KKworICAgIG1heHZhbCAgICAgICAgID0gMDsKKyAgICBub256ZXJvX21pbnZhbCA9IEZUX0xPTkdfTUFYOworCisgICAgZm9yICggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgIHsKKyAgICAgIGlmICggdmFsW2ldID4gbWF4dmFsICkKKyAgICAgICAgbWF4dmFsID0gdmFsW2ldOworICAgICAgaWYgKCB2YWxbaV0gJiYgdmFsW2ldIDwgbm9uemVyb19taW52YWwgKQorICAgICAgICBub256ZXJvX21pbnZhbCA9IHZhbFtpXTsKKyAgICB9CisKKyAgICAvKiB3ZSBvbmx5IGhhbmRsZSAzMmJpdCB2YWx1ZXMgKi8KKyAgICBpZiAoIG1heHZhbCA+IDB4N0ZGRkZGRkZMICkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKCBtYXh2YWwgPiAyMzE3MCApCisgICAgeworICAgICAgRlRfRml4ZWQgIHNjYWxlID0gRlRfRGl2Rml4KCBtYXh2YWwsIDIzMTcwICk7CisKKworICAgICAgaWYgKCAhRlRfRGl2Rml4KCBub256ZXJvX21pbnZhbCwgc2NhbGUgKSApCisgICAgICAgIHJldHVybiAwOyAgICAvKiB2YWx1ZSByYW5nZSB0b28gbGFyZ2UgKi8KKworICAgICAgbS54eCA9IEZUX0RpdkZpeCggbWF0cml4LT54eCwgc2NhbGUgKTsKKyAgICAgIG0ueHkgPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHksIHNjYWxlICk7CisgICAgICBtLnl4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCBzY2FsZSApOworICAgICAgbS55eSA9IEZUX0RpdkZpeCggbWF0cml4LT55eSwgc2NhbGUgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgbSA9ICptYXRyaXg7CisKKyAgICB0ZW1wMSA9IEZUX0FCUyggbS54eCAqIG0ueXkgLSBtLnh5ICogbS55eCApOworICAgIHRlbXAyID0gbS54eCAqIG0ueHggKyBtLnh5ICogbS54eSArIG0ueXggKiBtLnl4ICsgbS55eSAqIG0ueXk7CisKKyAgICBpZiAoIHRlbXAxID09IDAgICAgICAgICB8fAorICAgICAgICAgdGVtcDIgLyB0ZW1wMSA+IDUwICkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KKwogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm1fU2NhbGVkKCBGVF9WZWN0b3IqICAgICAgICB2ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXgsCkBAIC05MTMsOSArOTgyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF95ICkKICAgeworICAgIC8qIHdlIHNpbGVudGx5IGlnbm9yZSBvdmVyZmxvdyBlcnJvcnMgc2luY2Ugc3VjaCBsYXJnZSB2YWx1ZXMgKi8KKyAgICAvKiBsZWFkIHRvIGV2ZW4gbW9yZSAoaGFybWxlc3MpIHJlbmRlcmluZyBlcnJvcnMgbGF0ZXIgb24gICAgICovCisKICNpZmRlZiBGVF9MT05HNjQKIAotICAgIEZUX0ludDY0ICBkZWx0YSA9IChGVF9JbnQ2NClpbl94ICogb3V0X3kgLSAoRlRfSW50NjQpaW5feSAqIG91dF94OworICAgIEZUX0ludDY0ICBkZWx0YSA9IFNVQl9JTlQ2NCggTVVMX0lOVDY0KCBpbl94LCBvdXRfeSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMX0lOVDY0KCBpbl95LCBvdXRfeCApICk7CiAKIAogICAgIHJldHVybiAoIGRlbHRhID4gMCApIC0gKCBkZWx0YSA8IDAgKTsKQEAgLTkyNSw4ICs5OTgsNiBAQAogICAgIEZUX0ludCAgcmVzdWx0OwogCiAKLSAgICAvKiB3ZSBzaWxlbnRseSBpZ25vcmUgb3ZlcmZsb3cgZXJyb3JzLCBzaW5jZSBzdWNoIGxhcmdlIHZhbHVlcyAqLwotICAgIC8qIGxlYWQgdG8gZXZlbiBtb3JlIChoYXJtbGVzcykgcmVuZGVyaW5nIGVycm9ycyBsYXRlciBvbiAgICAgICovCiAgICAgaWYgKCBBRERfTE9ORyggRlRfQUJTKCBpbl94ICksIEZUX0FCUyggb3V0X3kgKSApIDw9IDEzMTA3MUwgJiYKICAgICAgICAgIEFERF9MT05HKCBGVF9BQlMoIGluX3kgKSwgRlRfQUJTKCBvdXRfeCApICkgPD0gMTMxMDcxTCApCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRjaWQuYyBiL3NyYy9iYXNlL2Z0Y2lkLmMKaW5kZXggZjUxODQ2NC4uY2U4YTg3NiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRjaWQuYworKysgYi9zcmMvYmFzZS9mdGNpZC5jCkBAIC0xLDI1ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNpZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQ0lEIGZvbnQgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERlcmVrIENsZWdnIGFuZCBNaWNoYWVsIFRvZnRkYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNpZC5jCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBDSUQgZm9udCBpbmZvcm1hdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAyMCBieQorICogRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NJRF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQ0lEX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNpZC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmg+CiAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2lkLmggKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Y29sb3IuYyBiL3NyYy9iYXNlL2Z0Y29sb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTBkNjgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jhc2UvZnRjb2xvci5jCkBAIC0wLDAgKzEsMTU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y29sb3IuYworICoKKyAqICAgRnJlZVR5cGUncyBnbHlwaCBjb2xvciBtYW5hZ2VtZW50IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLworCisKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNvbG9yLmg+CisKKworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTCisKKyAgc3RhdGljCisgIGNvbnN0IEZUX1BhbGV0dGVfRGF0YSAgbnVsbF9wYWxldHRlX2RhdGEgPSB7IDAsIE5VTEwsIE5VTEwsIDAsIE5VTEwgfTsKKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjb2xvci5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9QYWxldHRlX0RhdGFfR2V0KCBGVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9QYWxldHRlX0RhdGEgICphcGFsZXR0ZV9kYXRhICkKKyAgeworICAgIGlmICggIWZhY2UgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7CisgICAgaWYgKCAhYXBhbGV0dGVfZGF0YSkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOworCisgICAgaWYgKCBGVF9JU19TRk5UKCBmYWNlICkgKQorICAgICAgKmFwYWxldHRlX2RhdGEgPSAoIChUVF9GYWNlKWZhY2UgKS0+cGFsZXR0ZV9kYXRhOworICAgIGVsc2UKKyAgICAgICphcGFsZXR0ZV9kYXRhID0gbnVsbF9wYWxldHRlX2RhdGE7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y29sb3IuaCAqLworCisgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9TZWxlY3QoIEZUX0ZhY2UgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICBwYWxldHRlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgRlRfQ29sb3IqICAqYXBhbGV0dGUgKQorICB7CisgICAgRlRfRXJyb3IgIGVycm9yOworCisgICAgVFRfRmFjZSAgICAgICB0dGZhY2U7CisgICAgU0ZOVF9TZXJ2aWNlICBzZm50OworCisKKyAgICBpZiAoICFmYWNlICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOworCisgICAgaWYgKCAhRlRfSVNfU0ZOVCggZmFjZSApICkKKyAgICB7CisgICAgICBpZiAoIGFwYWxldHRlICkKKyAgICAgICAgKmFwYWxldHRlID0gTlVMTDsKKworICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICB9CisKKyAgICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOworICAgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50OworCisgICAgZXJyb3IgPSBzZm50LT5zZXRfcGFsZXR0ZSggdHRmYWNlLCBwYWxldHRlX2luZGV4ICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICB0dGZhY2UtPnBhbGV0dGVfaW5kZXggPSBwYWxldHRlX2luZGV4OworCisgICAgaWYgKCBhcGFsZXR0ZSApCisgICAgICAqYXBhbGV0dGUgPSB0dGZhY2UtPnBhbGV0dGU7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y29sb3IuaCAqLworCisgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9TZXRfRm9yZWdyb3VuZF9Db2xvciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NvbG9yICBmb3JlZ3JvdW5kX2NvbG9yICkKKyAgeworICAgIFRUX0ZhY2UgIHR0ZmFjZTsKKworCisgICAgaWYgKCAhZmFjZSApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKKworICAgIGlmICggIUZUX0lTX1NGTlQoIGZhY2UgKSApCisgICAgICByZXR1cm4gRlRfRXJyX09rOworCisgICAgdHRmYWNlID0gKFRUX0ZhY2UpZmFjZTsKKworICAgIHR0ZmFjZS0+Zm9yZWdyb3VuZF9jb2xvciAgICAgID0gZm9yZWdyb3VuZF9jb2xvcjsKKyAgICB0dGZhY2UtPmhhdmVfZm9yZWdyb3VuZF9jb2xvciA9IDE7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKyNlbHNlIC8qICFUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSUyAqLworCisgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9EYXRhX0dldCggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFsZXR0ZV9EYXRhICAqYXBhbGV0dGVfZGF0YSApCisgIHsKKyAgICBGVF9VTlVTRUQoIGZhY2UgKTsKKyAgICBGVF9VTlVTRUQoIGFwYWxldHRlX2RhdGEgKTsKKworCisgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKyAgfQorCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9QYWxldHRlX1NlbGVjdCggRlRfRmFjZSAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgIHBhbGV0dGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBGVF9Db2xvciogICphcGFsZXR0ZSApCisgIHsKKyAgICBGVF9VTlVTRUQoIGZhY2UgKTsKKyAgICBGVF9VTlVTRUQoIHBhbGV0dGVfaW5kZXggKTsKKyAgICBGVF9VTlVTRUQoIGFwYWxldHRlICk7CisKKworICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7CisgIH0KKworCisgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfUGFsZXR0ZV9TZXRfRm9yZWdyb3VuZF9Db2xvciggRlRfRmFjZSAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0NvbG9yICBmb3JlZ3JvdW5kX2NvbG9yICkKKyAgeworICAgIEZUX1VOVVNFRCggZmFjZSApOworICAgIEZUX1VOVVNFRCggZm9yZWdyb3VuZF9jb2xvciApOworCisKKyAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOworICB9CisKKyNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9DT0xPUl9MQVlFUlMgKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMgYi9zcmMvYmFzZS9mdGRiZ21lbS5jCmluZGV4IGMzM2Q4YWMuLmViMGQ2NTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0ZGJnbWVtLmMKKysrIGIvc3JjL2Jhc2UvZnRkYmdtZW0uYwpAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRkYmdtZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1lbW9yeSBkZWJ1Z2dlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRkYmdtZW0uYworICoKKyAqICAgTWVtb3J5IGRlYnVnZ2VyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KIAogCiAjaWZkZWYgRlRfREVCVUdfTUVNT1JZCkBAIC01MCw5ICs1MCw5IEBACiAjZGVmaW5lIEZUX01FTV9WQUwoIGFkZHIgKSAgKCAoRlRfUHRyRGlzdCkoRlRfUG9pbnRlcikoIGFkZHIgKSApCiAKICAgLyoKLSAgICogIFRoaXMgc3RydWN0dXJlIGhvbGRzIHN0YXRpc3RpY3MgZm9yIGEgc2luZ2xlIGFsbG9jYXRpb24vcmVsZWFzZQotICAgKiAgc2l0ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGtub3cgd2hlcmUgbWVtb3J5IG9wZXJhdGlvbnMgaGFwcGVuIHRoZQotICAgKiAgbW9zdC4KKyAgICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgYWxsb2NhdGlvbi9yZWxlYXNlCisgICAqIHNpdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBrbm93IHdoZXJlIG1lbW9yeSBvcGVyYXRpb25zIGhhcHBlbiB0aGUKKyAgICogbW9zdC4KICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1Tb3VyY2VSZWNfCiAgIHsKQEAgLTc2LDE3ICs3NiwxNyBAQAogCiAKICAgLyoKLSAgICogIFdlIGRvbid0IG5lZWQgYSByZXNpemFibGUgYXJyYXkgZm9yIHRoZSBtZW1vcnkgc291cmNlcyBiZWNhdXNlCi0gICAqICB0aGVpciBudW1iZXIgaXMgcHJldHR5IGxpbWl0ZWQgd2l0aGluIEZyZWVUeXBlLgorICAgKiBXZSBkb24ndCBuZWVkIGEgcmVzaXphYmxlIGFycmF5IGZvciB0aGUgbWVtb3J5IHNvdXJjZXMgYmVjYXVzZQorICAgKiB0aGVpciBudW1iZXIgaXMgcHJldHR5IGxpbWl0ZWQgd2l0aGluIEZyZWVUeXBlLgogICAgKi8KICNkZWZpbmUgRlRfTUVNX1NPVVJDRV9CVUNLRVRTICAxMjgKIAogICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIHNpbmdsZSBhbGxvY2F0ZWQKLSAgICogIG1lbW9yeSBibG9jay4gIElmIEtFRVBBTElWRSBpcyBkZWZpbmVkLCBibG9ja3MgdGhhdCBhcmUgZnJlZWQgYnkKLSAgICogIEZyZWVUeXBlIGFyZSBuZXZlciByZWxlYXNlZCB0byB0aGUgc3lzdGVtLiAgSW5zdGVhZCwgdGhlaXIgYHNpemUnCi0gICAqICBmaWVsZCBpcyBzZXQgdG8gYC1zaXplJy4gIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCB0byBkZXRlY3QgZG91YmxlCi0gICAqICBmcmVlcywgYXQgdGhlIHByaWNlIG9mIGEgbGFyZ2UgbWVtb3J5IGZvb3RwcmludCBkdXJpbmcgZXhlY3V0aW9uLgorICAgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGEgc2luZ2xlIGFsbG9jYXRlZAorICAgKiBtZW1vcnkgYmxvY2suICBJZiBLRUVQQUxJVkUgaXMgZGVmaW5lZCwgYmxvY2tzIHRoYXQgYXJlIGZyZWVkIGJ5CisgICAqIEZyZWVUeXBlIGFyZSBuZXZlciByZWxlYXNlZCB0byB0aGUgc3lzdGVtLiAgSW5zdGVhZCwgdGhlaXIgYHNpemUnCisgICAqIGZpZWxkIGlzIHNldCB0byBgLXNpemUnLiAgVGhpcyBpcyBtYWlubHkgdXNlZnVsIHRvIGRldGVjdCBkb3VibGUKKyAgICogZnJlZXMsIGF0IHRoZSBwcmljZSBvZiBhIGxhcmdlIG1lbW9yeSBmb290cHJpbnQgZHVyaW5nIGV4ZWN1dGlvbi4KICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVF9NZW1Ob2RlUmVjXwogICB7CkBAIC0xMDYsOCArMTA2LDggQEAKIAogCiAgIC8qCi0gICAqICBUaGUgZ2xvYmFsIHN0cnVjdHVyZSwgY29udGFpbmluZyBjb21wb3VuZCBzdGF0aXN0aWNzIGFuZCBhbGwgaGFzaAotICAgKiAgdGFibGVzLgorICAgKiBUaGUgZ2xvYmFsIHN0cnVjdHVyZSwgY29udGFpbmluZyBjb21wb3VuZCBzdGF0aXN0aWNzIGFuZCBhbGwgaGFzaAorICAgKiB0YWJsZXMuCiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgRlRfTWVtVGFibGVSZWNfCiAgIHsKQEAgLTE0Niw4ICsxNDYsOCBAQAogCiAKICAgLyoKLSAgICogIFByaW1lIG51bWJlcnMgYXJlIHVnbHkgdG8gaGFuZGxlLiAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGltcGxlbWVudAotICAgKiAgTC1IYXNoaW5nLCB3aGljaCBpcyAxMCUgZmFzdGVyIGFuZCBkb2Vzbid0IHJlcXVpcmUgZGl2aXNpb25zLgorICAgKiBQcmltZSBudW1iZXJzIGFyZSB1Z2x5IHRvIGhhbmRsZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBpbXBsZW1lbnQKKyAgICogTC1IYXNoaW5nLCB3aGljaCBpcyAxMCUgZmFzdGVyIGFuZCBkb2Vzbid0IHJlcXVpcmUgZGl2aXNpb25zLgogICAgKi8KICAgc3RhdGljIGNvbnN0IEZUX0ludCAgZnRfbWVtX3ByaW1lc1tdID0KICAgewpAQCAtNjIxLDggKzYyMSwxMCBAQAogCiAgICAgICAgIGlmICggbm9kZS0+c2l6ZSA8IDAgKQogICAgICAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgICAgICJmcmVlaW5nIG1lbW9yeSBibG9jayBhdCAlcCBtb3JlIHRoYW4gb25jZSBhdCAoJXM6JWxkKVxuIgotICAgICAgICAgICAgImJsb2NrIGFsbG9jYXRlZCBhdCAoJXM6JWxkKSBhbmQgcmVsZWFzZWQgYXQgKCVzOiVsZCkiLAorICAgICAgICAgICAgImZyZWVpbmcgbWVtb3J5IGJsb2NrIGF0ICVwIG1vcmUgdGhhbiBvbmNlXG4iCisgICAgICAgICAgICAiICBhdCAoJXM6JWxkKSFcbiIKKyAgICAgICAgICAgICIgIEJsb2NrIHdhcyBhbGxvY2F0ZWQgYXQgKCVzOiVsZClcbiIKKyAgICAgICAgICAgICIgIGFuZCByZWxlYXNlZCBhdCAoJXM6JWxkKS4iLAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBfZnRfZGVidWdfZmlsZSApLCBfZnRfZGVidWdfbGluZW5vLAogICAgICAgICAgICAgRlRfRklMRU5BTUUoIG5vZGUtPnNvdXJjZS0+ZmlsZV9uYW1lICksIG5vZGUtPnNvdXJjZS0+bGluZV9ubywKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZGVidWcuYyBiL3NyYy9iYXNlL2Z0ZGVidWcuYwppbmRleCBmZTI2MzA5Li42MmNmNjgwIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGRlYnVnLmMKKysrIGIvc3JjL2Jhc2UvZnRkZWJ1Zy5jCkBAIC0xLDQ5ICsxLDQ4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGRlYnVnLmMKKyAqCisgKiAgIERlYnVnZ2luZyBhbmQgbG9nZ2luZyBjb21wb25lbnQgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGNvbXBvbmVudCBjb250YWlucyB2YXJpb3VzIG1hY3JvcyBhbmQgZnVuY3Rpb25zIHVzZWQgdG8gZWFzZSB0aGUKKyAgICogZGVidWdnaW5nIG9mIHRoZSBGcmVlVHlwZSBlbmdpbmUuICBJdHMgbWFpbiBwdXJwb3NlIGlzIGluIGFzc2VydGlvbgorICAgKiBjaGVja2luZywgdHJhY2luZywgYW5kIGVycm9yIGRldGVjdGlvbi4KKyAgICoKKyAgICogVGhlcmUgYXJlIG5vdyB0aHJlZSBkZWJ1Z2dpbmcgbW9kZXM6CisgICAqCisgICAqIC0gdHJhY2UgbW9kZQorICAgKgorICAgKiAgIEVycm9yIGFuZCB0cmFjZSBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgbG9nIGZpbGUgKHdoaWNoIGNhbiBiZSB0aGUKKyAgICogICBzdGFuZGFyZCBlcnJvciBvdXRwdXQpLgorICAgKgorICAgKiAtIGVycm9yIG1vZGUKKyAgICoKKyAgICogICBPbmx5IGVycm9yIG1lc3NhZ2VzIGFyZSBnZW5lcmF0ZWQuCisgICAqCisgICAqIC0gcmVsZWFzZSBtb2RlOgorICAgKgorICAgKiAgIE5vIGVycm9yIG1lc3NhZ2UgaXMgc2VudCBvciBnZW5lcmF0ZWQuICBUaGUgY29kZSBpcyBmcmVlIGZyb20gYW55CisgICAqICAgZGVidWdnaW5nIHBhcnRzLgorICAgKgorICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKQEAgLTg3LDkgKzg2LDE5IEBACiAgICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICkKICAgeworI2lmIDAKKyAgICAvKiBhY3RpdmF0aW5nIHRoZSBjb2RlIGluIHRoaXMgYmxvY2sgbWFrZXMgRnJlZVR5cGUgdmVyeSBjaGF0dHkgKi8KKyAgICBmcHJpbnRmKCBzdGRlcnIsCisgICAgICAgICAgICAgIiVzOiVkOiBlcnJvciAweCUwMng6ICVzXG4iLAorICAgICAgICAgICAgIGZpbGUsCisgICAgICAgICAgICAgbGluZSwKKyAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICBGVF9FcnJvcl9TdHJpbmcoIGVycm9yICkgKTsKKyNlbHNlCiAgICAgRlRfVU5VU0VEKCBlcnJvciApOwogICAgIEZUX1VOVVNFRCggbGluZSApOwogICAgIEZUX1VOVVNFRCggZmlsZSApOworI2VuZGlmCiAKICAgICByZXR1cm4gMDsKICAgfQpAQCAtMTAwLDE2ICsxMDksMjMgQEAKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAKLSAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwICovCi0gIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKKyAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwOyAqLworICAvKiB0aGlzIGdldHMgYWRqdXN0ZWQgYXQgcnVuLXRpbWUgICAgICAgICAgICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19lbmFibGVkW3RyYWNlX2NvdW50XTsKIAorICAvKiBhcnJheSBvZiB0cmFjZSBsZXZlbHMsIGFsd2F5cyBpbml0aWFsaXplZCB0byAwICovCisgIHN0YXRpYyBpbnQgIGZ0X3RyYWNlX2xldmVsc19kaXNhYmxlZFt0cmFjZV9jb3VudF07CisKKyAgLyogYSBwb2ludGVyIHRvIGVpdGhlciBgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWQnICovCisgIC8qIG9yIGBmdF90cmFjZV9sZXZlbHNfZGlzYWJsZWQnICAgICAgICAgICAgICAgICAqLworICBpbnQqICBmdF90cmFjZV9sZXZlbHM7CiAKICAgLyogZGVmaW5lIGFycmF5IG9mIHRyYWNlIHRvZ2dsZSBuYW1lcyAqLwogI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgI3ggLAogCiAgIHN0YXRpYyBjb25zdCBjaGFyKiAgZnRfdHJhY2VfdG9nZ2xlc1t0cmFjZV9jb3VudCArIDFdID0KICAgewotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJBQ0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KICAgICBOVUxMCiAgIH07CiAKQEAgLTE0MCwyNCArMTU2LDQyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5pdGlhbGl6ZSB0aGUgdHJhY2luZyBzdWItc3lzdGVtLiAgVGhpcyBpcyBkb25lIGJ5IHJldHJpZXZpbmcgdGhlICAgICovCi0gIC8qIHZhbHVlIG9mIHRoZSBgRlQyX0RFQlVHJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mICAqLwotICAvKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycsIG9yIGAsJy4gIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4cG9ydCBGVDJfREVCVUc9ImFueTozIG1lbW9yeTo3IHN0cmVhbTo1IiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyByZXF1ZXN0cyB0aGF0IGFsbCBsZXZlbHMgYmUgc2V0IHRvIDMsIGV4Y2VwdCB0aGUgdHJhY2UgbGV2ZWwgZm9yICovCi0gIC8qIHRoZSBtZW1vcnkgYW5kIHN0cmVhbSBjb21wb25lbnRzIHdoaWNoIGFyZSBzZXQgdG8gNyBhbmQgNSwgICAgICAgICAgICAqLwotICAvKiByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgZmlsZSBgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgnIGZvciBkZXRhaWxzIG9mICAgICAqLwotICAvKiB0aGUgYXZhaWxhYmxlIHRvZ2dsZSBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwotICAvKiBydW50aW1lIGVycm9ycyksIGFuZCA3IG1lYW5zIF92ZXJ5XyB2ZXJib3NlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCisKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9EaXNhYmxlKCB2b2lkICkKKyAgeworICAgIGZ0X3RyYWNlX2xldmVscyA9IGZ0X3RyYWNlX2xldmVsc19kaXNhYmxlZDsKKyAgfQorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKworICBGVF9CQVNFX0RFRiggdm9pZCApCisgIEZUX1RyYWNlX0VuYWJsZSggdm9pZCApCisgIHsKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZDsKKyAgfQorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEluaXRpYWxpemUgdGhlIHRyYWNpbmcgc3ViLXN5c3RlbS4gIFRoaXMgaXMgZG9uZSBieSByZXRyaWV2aW5nIHRoZQorICAgKiB2YWx1ZSBvZiB0aGUgYEZUMl9ERUJVRycgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJdCBtdXN0IGJlIGEgbGlzdCBvZgorICAgKiB0b2dnbGVzLCBzZXBhcmF0ZWQgYnkgc3BhY2VzLCBgOycsIG9yIGAsJy4gIEV4YW1wbGU6CisgICAqCisgICAqICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiCisgICAqCisgICAqIFRoaXMgcmVxdWVzdHMgdGhhdCBhbGwgbGV2ZWxzIGJlIHNldCB0byAzLCBleGNlcHQgdGhlIHRyYWNlIGxldmVsIGZvcgorICAgKiB0aGUgbWVtb3J5IGFuZCBzdHJlYW0gY29tcG9uZW50cyB3aGljaCBhcmUgc2V0IHRvIDcgYW5kIDUsCisgICAqIHJlc3BlY3RpdmVseS4KKyAgICoKKyAgICogU2VlIHRoZSBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCcgZm9yIGRldGFpbHMgb2YKKyAgICogdGhlIGF2YWlsYWJsZSB0b2dnbGUgbmFtZXMuCisgICAqCisgICAqIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzCisgICAqIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuCisgICAqLwogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIGZ0X2RlYnVnX2luaXQoIHZvaWQgKQogICB7CkBAIC0yMjMsMTQgKzI1NywxNiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGBhbnknICovCiAgICAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW25dID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzX2VuYWJsZWRbbl0gPSBsZXZlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW2ZvdW5kXSA9IGxldmVsOworICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZFtmb3VuZF0gPSBsZXZlbDsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisKKyAgICBmdF90cmFjZV9sZXZlbHMgPSBmdF90cmFjZV9sZXZlbHNfZW5hYmxlZDsKICAgfQogCiAKQEAgLTI2MCw2ICsyOTYsMjIgQEAKICAgfQogCiAKKyAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICBGVF9UcmFjZV9EaXNhYmxlKCB2b2lkICkKKyAgeworICAgIC8qIG5vdGhpbmcgKi8KKyAgfQorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KKworICBGVF9CQVNFX0RFRiggdm9pZCApCisgIEZUX1RyYWNlX0VuYWJsZSggdm9pZCApCisgIHsKKyAgICAvKiBub3RoaW5nICovCisgIH0KKworCiAjZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKIApkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRlcnJvcnMuYyBiL3NyYy9iYXNlL2Z0ZXJyb3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhOWU3NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYXNlL2Z0ZXJyb3JzLmMKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGVycm9ycy5jCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGVycm9yIGNvZGUgaGFuZGxpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjAgYnkKKyAqIEFybWluIEhhc2l0emthLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgorCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGVycm9ycy5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQorICBGVF9FcnJvcl9TdHJpbmcoIEZUX0Vycm9yICBlcnJvcl9jb2RlICkKKyAgeworICAgIGlmICggZXJyb3JfY29kZSA8ICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgZXJyb3JfY29kZSA+PSBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBNYXggKSApCisgICAgICByZXR1cm4gTlVMTDsKKworI2lmIGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fRVJST1JfU1RSSU5HUyApIHx8IFwKKyAgICBkZWZpbmVkKCBGVF9ERUJVR19MRVZFTF9FUlJPUiApCisKKyN1bmRlZiBGVEVSUk9SU19IXworI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBzd2l0Y2ggKCBGVF9FUlJPUl9CQVNFKCBlcnJvcl9jb2RlICkgKSB7CisjZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgICAgY2FzZSB2OiByZXR1cm4gczsKKyNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgfQorCisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KKworI2VuZGlmIC8qIGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fRVJST1JfU1RSSU5HUyApIHx8IC4uLiAqLworCisgICAgcmV0dXJuIE5VTEw7CisgIH0KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Zm50Zm10LmMgYi9zcmMvYmFzZS9mdGZudGZtdC5jCmluZGV4IGEyOTAwY2UuLmE0NTMxN2UgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0Zm50Zm10LmMKKysrIGIvc3JjL2Jhc2UvZnRmbnRmbXQuYwpAQCAtMSwyNSArMSwyNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRmbnRmbXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZmlsZSBmb3IgZm9udCBmb3JtYXRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRmbnRmbXQuYworICoKKyAqICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBmb250IGZvcm1hdHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GT05UX0ZPUk1BVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGZudGZtdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10Lmg+CiAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Zm50Zm10LmggKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0ZnN0eXBlLmMgYi9zcmMvYmFzZS9mdGZzdHlwZS5jCmluZGV4IGU2Y2RmNmUuLmJjYTU0OGYgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0ZnN0eXBlLmMKKysrIGIvc3JjL2Jhc2UvZnRmc3R5cGUuYwpAQCAtMSwyNSArMSwyNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRmc3R5cGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZmlsZSB0byBhY2Nlc3MgRlNUeXBlIGRhdGEgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRmc3R5cGUuYworICoKKyAqICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIHRvIGFjY2VzcyBGU1R5cGUgZGF0YSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAorI2luY2x1ZGUgPGZyZWV0eXBlL3QxdGFibGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWJsZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgogCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGdhc3AuYyBiL3NyYy9iYXNlL2Z0Z2FzcC5jCmluZGV4IDRmODBiYmEuLmVlZDA1YTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0Z2FzcC5jCisrKyBiL3NyYy9iYXNlL2Z0Z2FzcC5jCkBAIC0xLDI0ICsxLDIzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGdhc3AuYworICoKKyAqICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0FTUF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnYXNwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgogCiAKICAgRlRfRVhQT1JUX0RFRiggRlRfSW50ICkKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0Z2xvYWRyLmMgYi9zcmMvYmFzZS9mdGdsb2Fkci5jCmluZGV4IDQ3MjAyNDkuLjA1ZmM3NjkgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0Z2xvYWRyLmMKKysrIGIvc3JjL2Jhc2UvZnRnbG9hZHIuYwpAQCAtMSwyOSArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbG9hZHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRnbG9hZHIuYworICoKKyAqICAgVGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2dsb2FkZXIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBnbG9hZGVyCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM4LDMxICszNywzMSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZ2x5cGggbG9hZGVyIGlzIGEgc2ltcGxlIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGxvYWQgYSBzZXQgb2YgICAgKi8KLSAgLyogZ2x5cGhzIGVhc2lseS4gIEl0IGlzIGNyaXRpY2FsIGZvciB0aGUgY29ycmVjdCBsb2FkaW5nIG9mIGNvbXBvc2l0ZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZGVhbGx5LCBvbmUgY2FuIHNlZSBpdCBhcyBhIHN0YWNrIG9mIGFic3RyYWN0IGBnbHlwaCcgb2JqZWN0cy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbG9hZGVyLmJhc2UgICAgIElzIHJlYWxseSB0aGUgYm90dG9tIG9mIHRoZSBzdGFjay4gIEl0IGRlc2NyaWJlcyBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaW5nbGUgZ2x5cGggaW1hZ2UgbWFkZSBvZiB0aGUganV4dGFwb3NpdGlvbiBvZiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2V2ZXJhbCBnbHlwaHMgKHRob3NlIGBpbiB0aGUgc3RhY2snKS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxvYWRlci5jdXJyZW50ICBEZXNjcmliZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9uIHdoaWNoIGEgbmV3ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggY2FuIGJlIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFJld2luZCAgICAgICAgICBDbGVhcnMgdGhlIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBQcmVwYXJlICAgICAgICAgU2V0IHVwIGBsb2FkZXIuY3VycmVudCcgZm9yIGFkZGl0aW9uIG9mIGEgbmV3IGdseXBoICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFkZCAgICAgICAgICAgICBBZGQgdGhlIGBjdXJyZW50JyBnbHlwaCBpbWFnZSB0byB0aGUgYGJhc2UnIG9uZSwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYW5kIHByZXBhcmUgZm9yIGFub3RoZXIgb25lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZ2x5cGggbG9hZGVyIGlzIG5vdyBhIGJhc2Ugb2JqZWN0LiAgRWFjaCBkcml2ZXIgdXNlZCB0byAgICAgICAgICAgKi8KLSAgLyogcmUtaW1wbGVtZW50IGl0IGluIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB3aGljaCB3YXN0ZWQgY29kZSBhbmQgICAgICAgICovCi0gIC8qIGVuZXJneS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgZ2x5cGggbG9hZGVyIGlzIGEgc2ltcGxlIG9iamVjdCB3aGljaCBpcyB1c2VkIHRvIGxvYWQgYSBzZXQgb2YKKyAgICogZ2x5cGhzIGVhc2lseS4gIEl0IGlzIGNyaXRpY2FsIGZvciB0aGUgY29ycmVjdCBsb2FkaW5nIG9mIGNvbXBvc2l0ZXMuCisgICAqCisgICAqIElkZWFsbHksIG9uZSBjYW4gc2VlIGl0IGFzIGEgc3RhY2sgb2YgYWJzdHJhY3QgYGdseXBoJyBvYmplY3RzLgorICAgKgorICAgKiAgIGxvYWRlci5iYXNlICAgICBJcyByZWFsbHkgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2suICBJdCBkZXNjcmliZXMgYQorICAgKiAgICAgICAgICAgICAgICAgICBzaW5nbGUgZ2x5cGggaW1hZ2UgbWFkZSBvZiB0aGUganV4dGFwb3NpdGlvbiBvZgorICAgKiAgICAgICAgICAgICAgICAgICBzZXZlcmFsIGdseXBocyAodGhvc2UgYGluIHRoZSBzdGFjaycpLgorICAgKgorICAgKiAgIGxvYWRlci5jdXJyZW50ICBEZXNjcmliZXMgdGhlIHRvcCBvZiB0aGUgc3RhY2ssIG9uIHdoaWNoIGEgbmV3CisgICAqICAgICAgICAgICAgICAgICAgIGdseXBoIGNhbiBiZSBsb2FkZWQuCisgICAqCisgICAqICAgUmV3aW5kICAgICAgICAgIENsZWFycyB0aGUgc3RhY2suCisgICAqICAgUHJlcGFyZSAgICAgICAgIFNldCB1cCBgbG9hZGVyLmN1cnJlbnQnIGZvciBhZGRpdGlvbiBvZiBhIG5ldyBnbHlwaAorICAgKiAgICAgICAgICAgICAgICAgICBpbWFnZS4KKyAgICogICBBZGQgICAgICAgICAgICAgQWRkIHRoZSBgY3VycmVudCcgZ2x5cGggaW1hZ2UgdG8gdGhlIGBiYXNlJyBvbmUsCisgICAqICAgICAgICAgICAgICAgICAgIGFuZCBwcmVwYXJlIGZvciBhbm90aGVyIG9uZS4KKyAgICoKKyAgICogVGhlIGdseXBoIGxvYWRlciBpcyBub3cgYSBiYXNlIG9iamVjdC4gIEVhY2ggZHJpdmVyIHVzZWQgdG8KKyAgICogcmUtaW1wbGVtZW50IGl0IGluIG9uZSB3YXkgb3IgdGhlIG90aGVyLCB3aGljaCB3YXN0ZWQgY29kZSBhbmQKKyAgICogZW5lcmd5LgorICAgKgorICAgKi8KIAogCiAgIC8qIGNyZWF0ZSBhIG5ldyBnbHlwaCBsb2FkZXIgKi8KQEAgLTkzLDE4ICs5MiwxOSBAQAogCiAgICAgYmFzZS0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKICAgICBiYXNlLT5vdXRsaW5lLm5fY29udG91cnMgPSAwOworICAgIGJhc2UtPm91dGxpbmUuZmxhZ3MgICAgICA9IDA7CiAgICAgYmFzZS0+bnVtX3N1YmdseXBocyAgICAgID0gMDsKIAogICAgICpjdXJyZW50ID0gKmJhc2U7CiAgIH0KIAogCi0gIC8qIHJlc2V0IHRoZSBnbHlwaCBsb2FkZXIsIGZyZWVzIGFsbCBhbGxvY2F0ZWQgdGFibGVzICovCi0gIC8qIGFuZCBzdGFydHMgZnJvbSB6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIHJlc2V0IGdseXBoIGxvYWRlciwgZnJlZSBhbGwgYWxsb2NhdGVkIHRhYmxlcywgKi8KKyAgLyogYW5kIHN0YXJ0IGZyb20gemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKICAgewotICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxvYWRlci0+bWVtb3J5OwogCiAKICAgICBGVF9GUkVFKCBsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKTsKQEAgLTEyOSw3ICsxMjksNyBAQAogICB7CiAgICAgaWYgKCBsb2FkZXIgKQogICAgIHsKLSAgICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKKyAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7CiAKIAogICAgICAgRlRfR2x5cGhMb2FkZXJfUmVzZXQoIGxvYWRlciApOwpAQCAtMTQ2LDkgKzE0Niw5IEBACiAgICAgRlRfT3V0bGluZSogIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7CiAKIAotICAgIGN1cnJlbnQtPnBvaW50cyAgID0gYmFzZS0+cG9pbnRzICAgKyBiYXNlLT5uX3BvaW50czsKLSAgICBjdXJyZW50LT50YWdzICAgICA9IGJhc2UtPnRhZ3MgICAgICsgYmFzZS0+bl9wb2ludHM7Ci0gICAgY3VycmVudC0+Y29udG91cnMgPSBiYXNlLT5jb250b3VycyArIGJhc2UtPm5fY29udG91cnM7CisgICAgY3VycmVudC0+cG9pbnRzICAgPSBGVF9PRkZTRVQoIGJhc2UtPnBvaW50cywgICBiYXNlLT5uX3BvaW50cyApOworICAgIGN1cnJlbnQtPnRhZ3MgICAgID0gRlRfT0ZGU0VUKCBiYXNlLT50YWdzLCAgICAgYmFzZS0+bl9wb2ludHMgKTsKKyAgICBjdXJyZW50LT5jb250b3VycyA9IEZUX09GRlNFVCggYmFzZS0+Y29udG91cnMsIGJhc2UtPm5fY29udG91cnMgKTsKIAogICAgIC8qIGhhbmRsZSBleHRyYSBwb2ludHMgdGFibGUgLSBpZiBhbnkgKi8KICAgICBpZiAoIGxvYWRlci0+dXNlX2V4dHJhICkKQEAgLTE2OSw2ICsxNjksMTAgQEAKICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxvYWRlci0+bWVtb3J5OwogCiAKKyAgICBpZiAoIGxvYWRlci0+bWF4X3BvaW50cyA9PSAwICAgICAgICAgICB8fAorICAgICAgICAgbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyAhPSBOVUxMICkKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisKICAgICBpZiAoICFGVF9ORVdfQVJSQVkoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMsIDIgKiBsb2FkZXItPm1heF9wb2ludHMgKSApCiAgICAgewogICAgICAgbG9hZGVyLT51c2VfZXh0cmEgICAgICAgICAgPSAxOwpAQCAtMTg5LDcgKzE5Myw3IEBACiAgICAgRlRfR2x5cGhMb2FkICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKIAogCi0gICAgY3VycmVudC0+c3ViZ2x5cGhzID0gYmFzZS0+c3ViZ2x5cGhzICsgYmFzZS0+bnVtX3N1YmdseXBoczsKKyAgICBjdXJyZW50LT5zdWJnbHlwaHMgPSBGVF9PRkZTRVQoIGJhc2UtPnN1YmdseXBocywgYmFzZS0+bnVtX3N1YmdseXBocyApOwogICB9CiAKIApAQCAtMjExLDYgKzIxNSwxMCBAQAogICAgIEZUX1VJbnQgICAgICBuZXdfbWF4LCBvbGRfbWF4OwogCiAKKyAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBsb2FkZXIgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIHJldHVybiBlcnJvcjsKKwogICAgIC8qIGNoZWNrIHBvaW50cyAmIHRhZ3MgKi8KICAgICBuZXdfbWF4ID0gKEZUX1VJbnQpYmFzZS0+bl9wb2ludHMgKyAoRlRfVUludCljdXJyZW50LT5uX3BvaW50cyArCiAgICAgICAgICAgICAgIG5fcG9pbnRzOwpAQCAtMjQ0LDYgKzI1MiwxMCBAQAogICAgICAgbG9hZGVyLT5tYXhfcG9pbnRzID0gbmV3X21heDsKICAgICB9CiAKKyAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBsb2FkZXIgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIHJldHVybiBlcnJvcjsKKwogICAgIC8qIGNoZWNrIGNvbnRvdXJzICovCiAgICAgb2xkX21heCA9IGxvYWRlci0+bWF4X2NvbnRvdXJzOwogICAgIG5ld19tYXggPSAoRlRfVUludCliYXNlLT5uX2NvbnRvdXJzICsgKEZUX1VJbnQpY3VycmVudC0+bl9jb250b3VycyArCkBAIC0zNjEsNDYgKzM3Myw0IEBACiAgIH0KIAogCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NvcHlQb2ludHMoIEZUX0dseXBoTG9hZGVyICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZGVyICBzb3VyY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VJbnQgICBudW1fcG9pbnRzICAgPSAoRlRfVUludClzb3VyY2UtPmJhc2Uub3V0bGluZS5uX3BvaW50czsKLSAgICBGVF9VSW50ICAgbnVtX2NvbnRvdXJzID0gKEZUX1VJbnQpc291cmNlLT5iYXNlLm91dGxpbmUubl9jb250b3VyczsKLQotCi0gICAgZXJyb3IgPSBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggdGFyZ2V0LCBudW1fcG9pbnRzLCBudW1fY29udG91cnMgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgRlRfT3V0bGluZSogIG91dCA9ICZ0YXJnZXQtPmJhc2Uub3V0bGluZTsKLSAgICAgIEZUX091dGxpbmUqICBpbiAgPSAmc291cmNlLT5iYXNlLm91dGxpbmU7Ci0KLQotICAgICAgRlRfQVJSQVlfQ09QWSggb3V0LT5wb2ludHMsIGluLT5wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzICk7Ci0gICAgICBGVF9BUlJBWV9DT1BZKCBvdXQtPnRhZ3MsIGluLT50YWdzLAotICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgRlRfQVJSQVlfQ09QWSggb3V0LT5jb250b3VycywgaW4tPmNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgbnVtX2NvbnRvdXJzICk7Ci0KLSAgICAgIC8qIGRvIHdlIG5lZWQgdG8gY29weSB0aGUgZXh0cmEgcG9pbnRzPyAqLwotICAgICAgaWYgKCB0YXJnZXQtPnVzZV9leHRyYSAmJiBzb3VyY2UtPnVzZV9leHRyYSApCi0gICAgICB7Ci0gICAgICAgIEZUX0FSUkFZX0NPUFkoIHRhcmdldC0+YmFzZS5leHRyYV9wb2ludHMsIHNvdXJjZS0+YmFzZS5leHRyYV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMgKTsKLSAgICAgICAgRlRfQVJSQVlfQ09QWSggdGFyZ2V0LT5iYXNlLmV4dHJhX3BvaW50czIsIHNvdXJjZS0+YmFzZS5leHRyYV9wb2ludHMyLAotICAgICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzICk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC0+bl9wb2ludHMgICA9IChzaG9ydCludW1fcG9pbnRzOwotICAgICAgb3V0LT5uX2NvbnRvdXJzID0gKHNob3J0KW51bV9jb250b3VyczsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1BvaW50cyggdGFyZ2V0ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQogLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGdseXBoLmMgYi9zcmMvYmFzZS9mdGdseXBoLmMKaW5kZXggNjc1OWFhMi4uODI1ZWJhMiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRnbHlwaC5jCisrKyBiL3NyYy9iYXNlL2Z0Z2x5cGguYwpAQCAtMSw1MSArMSw1MSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbHlwaC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZ2x5cGhzIChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRnbHlwaC5jCisgKgorICogICBGcmVlVHlwZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGFuZGxlIGdseXBocyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2Ygc2V2ZXJhbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgICAqLwotICAvKiAgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGVhc2lseSByZXRyaWV2ZSBnbHlwaCAgICAgKi8KLSAgLyogIGJpdG1hcHMgYW5kIG91dGxpbmVzIGZyb20gYSBnaXZlbiBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBvcHRpb25hbCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBmb250IHNlcnZlciAgKi8KLSAgLyogIG9yIHRleHQgbGF5b3V0IGVuZ2luZSBvbiB0b3Agb2YgRnJlZVR5cGUuICBIb3dldmVyLCB0aGV5IGFyZSBwcmV0dHkgICovCi0gIC8qICBoYW5keSBmb3IgbWFueSBvdGhlciBzaW1wbGUgdXNlcyBvZiB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2Ygc2V2ZXJhbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAgICogdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgYXBwbGljYXRpb25zIHRvIGVhc2lseSByZXRyaWV2ZSBnbHlwaAorICAgKiBiaXRtYXBzIGFuZCBvdXRsaW5lcyBmcm9tIGEgZ2l2ZW4gZmFjZS4KKyAgICoKKyAgICogVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBvcHRpb25hbCBpZiB5b3UgYXJlIHdyaXRpbmcgYSBmb250IHNlcnZlcgorICAgKiBvciB0ZXh0IGxheW91dCBlbmdpbmUgb24gdG9wIG9mIEZyZWVUeXBlLiAgSG93ZXZlciwgdGhleSBhcmUgcHJldHR5CisgICAqIGhhbmR5IGZvciBtYW55IG90aGVyIHNpbXBsZSB1c2VzIG9mIHRoZSBsaWJyYXJ5LgorICAgKgorICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKLSNpbmNsdWRlIEZUX0dMWVBIX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfQklUTUFQX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Z2x5cGguaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRiaXRtYXAuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAotI2luY2x1ZGUgImJhc2VwaWMuaCIKKyNpbmNsdWRlICJmdGJhc2UuaCIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9nbHlwaAorI2RlZmluZSBGVF9DT01QT05FTlQgIGdseXBoCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc3LDcgKzc3LDcgQEAKICAgICAvKiBkbyBsYXp5IGNvcHlpbmcgd2hlbmV2ZXIgcG9zc2libGUgKi8KICAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQogICAgIHsKLSAgICAgIGdseXBoLT5iaXRtYXAgPSBzbG90LT5iaXRtYXA7CisgICAgICBnbHlwaC0+Yml0bWFwICAgICAgICAgID0gc2xvdC0+Yml0bWFwOwogICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzICY9IH5GVF9HTFlQSF9PV05fQklUTUFQOwogICAgIH0KICAgICBlbHNlCkBAIC0zNTksMzcgKzM1OSwyOCBAQAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCiAKLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfR2x5cGgoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgKmFnbHlwaCApCisgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQorICBGVF9OZXdfR2x5cGgoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKKyAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgICAgKmFnbHlwaCApCiAgIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX0dseXBoICAgIGdseXBoOwotCiAgICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiA9IE5VTEw7CiAKLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1Nsb3RfSGFuZGxlICk7Ci0KLSAgICBsaWJyYXJ5ID0gc2xvdC0+bGlicmFyeTsKLQotICAgIGlmICggIWFnbHlwaCApCisgICAgaWYgKCAhbGlicmFyeSB8fCAhYWdseXBoICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCiAgICAgLyogaWYgaXQgaXMgYSBiaXRtYXAsIHRoYXQncyBlYXN5IDotKSAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQotICAgICAgY2xhenogPSBGVF9CSVRNQVBfR0xZUEhfQ0xBU1NfR0VUOworICAgIGlmICggZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQorICAgICAgY2xhenogPSAmZnRfYml0bWFwX2dseXBoX2NsYXNzOwogCiAgICAgLyogaWYgaXQgaXMgYW4gb3V0bGluZSAqLwotICAgIGVsc2UgaWYgKCBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgKQotICAgICAgY2xhenogPSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVDsKKyAgICBlbHNlIGlmICggZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKKyAgICAgIGNsYXp6ID0gJmZ0X291dGxpbmVfZ2x5cGhfY2xhc3M7CiAKICAgICBlbHNlCiAgICAgewogICAgICAgLyogdHJ5IHRvIGZpbmQgYSByZW5kZXJlciB0aGF0IHN1cHBvcnRzIHRoZSBnbHlwaCBpbWFnZSBmb3JtYXQgKi8KLSAgICAgIEZUX1JlbmRlcmVyICByZW5kZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIHNsb3QtPmZvcm1hdCwgMCApOworICAgICAgRlRfUmVuZGVyZXIgIHJlbmRlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgZm9ybWF0LCAwICk7CiAKIAogICAgICAgaWYgKCByZW5kZXIgKQpAQCAtMzk3LDEzICszODgsMzEgQEAKICAgICB9CiAKICAgICBpZiAoICFjbGF6eiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9CisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7CiAKICAgICAvKiBjcmVhdGUgRlRfR2x5cGggb2JqZWN0ICovCi0gICAgZXJyb3IgPSBmdF9uZXdfZ2x5cGgoIGxpYnJhcnksIGNsYXp6LCAmZ2x5cGggKTsKKyAgICByZXR1cm4gZnRfbmV3X2dseXBoKCBsaWJyYXJ5LCBjbGF6eiwgYWdseXBoICk7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9HZXRfR2x5cGgoIEZUX0dseXBoU2xvdCAgc2xvdCwKKyAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgKmFnbHlwaCApCisgIHsKKyAgICBGVF9FcnJvciAgZXJyb3I7CisgICAgRlRfR2x5cGggIGdseXBoOworCisKKyAgICBpZiAoICFzbG90ICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TbG90X0hhbmRsZSApOworCisgICAgaWYgKCAhYWdseXBoICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOworCisgICAgLyogY3JlYXRlIEZUX0dseXBoIG9iamVjdCAqLworICAgIGVycm9yID0gRlRfTmV3X0dseXBoKCBzbG90LT5saWJyYXJ5LCBzbG90LT5mb3JtYXQsICZnbHlwaCApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwogCkBAIC00MjcsNyArNDM2LDcgQEAKICAgICBnbHlwaC0+YWR2YW5jZS55ID0gc2xvdC0+YWR2YW5jZS55ICogMTAyNDsKIAogICAgIC8qIG5vdyBpbXBvcnQgdGhlIGltYWdlIGZyb20gdGhlIGdseXBoIHNsb3QgKi8KLSAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9pbml0KCBnbHlwaCwgc2xvdCApOworICAgIGVycm9yID0gZ2x5cGgtPmNsYXp6LT5nbHlwaF9pbml0KCBnbHlwaCwgc2xvdCApOwogCiAgIEV4aXQyOgogICAgIC8qIGlmIGFuIGVycm9yIG9jY3VycmVkLCBkZXN0cm95IHRoZSBnbHlwaCAqLwpAQCAtNTA1LDggKzUxNCw4IEBACiAgICAgewogICAgICAgYWNib3gtPnhNaW4gPSBGVF9QSVhfRkxPT1IoIGFjYm94LT54TWluICk7CiAgICAgICBhY2JveC0+eU1pbiA9IEZUX1BJWF9GTE9PUiggYWNib3gtPnlNaW4gKTsKLSAgICAgIGFjYm94LT54TWF4ID0gRlRfUElYX0NFSUwoIGFjYm94LT54TWF4ICk7Ci0gICAgICBhY2JveC0+eU1heCA9IEZUX1BJWF9DRUlMKCBhY2JveC0+eU1heCApOworICAgICAgYWNib3gtPnhNYXggPSBGVF9QSVhfQ0VJTF9MT05HKCBhY2JveC0+eE1heCApOworICAgICAgYWNib3gtPnlNYXggPSBGVF9QSVhfQ0VJTF9MT05HKCBhY2JveC0+eU1heCApOwogICAgIH0KIAogICAgIC8qIGNvbnZlcnQgdG8gaW50ZWdlciBwaXhlbHMgaWYgbmVlZGVkICovCkBAIC01MzYsNyArNTQ1LDYgQEAKICAgICBGVF9CaXRtYXBHbHlwaCAgICAgICAgICAgIGJpdG1hcCA9IE5VTEw7CiAgICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICAgICBjbGF6ejsKIAotICAgIC8qIEZUX0JJVE1BUF9HTFlQSF9DTEFTU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwogICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeTsKIAogCkBAIC01NTMsNyArNTYxLDcgQEAKICAgICAgIGdvdG8gQmFkOwogCiAgICAgLyogd2hlbiBjYWxsZWQgd2l0aCBhIGJpdG1hcCBnbHlwaCwgZG8gbm90aGluZyBhbmQgcmV0dXJuIHN1Y2Nlc3NmdWxseSAqLwotICAgIGlmICggY2xhenogPT0gRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCApCisgICAgaWYgKCBjbGF6eiA9PSAmZnRfYml0bWFwX2dseXBoX2NsYXNzICkKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIGlmICggIWNsYXp6LT5nbHlwaF9wcmVwYXJlICkKQEAgLTU2OSw3ICs1NzcsNyBAQAogICAgIGR1bW15LmZvcm1hdCAgID0gY2xhenotPmdseXBoX2Zvcm1hdDsKIAogICAgIC8qIGNyZWF0ZSByZXN1bHQgYml0bWFwIGdseXBoICovCi0gICAgZXJyb3IgPSBmdF9uZXdfZ2x5cGgoIGxpYnJhcnksIEZUX0JJVE1BUF9HTFlQSF9DTEFTU19HRVQsICZiICk7CisgICAgZXJyb3IgPSBmdF9uZXdfZ2x5cGgoIGxpYnJhcnksICZmdF9iaXRtYXBfZ2x5cGhfY2xhc3MsICZiICk7CiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEV4aXQ7CiAgICAgYml0bWFwID0gKEZUX0JpdG1hcEdseXBoKWI7CmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGd4dmFsLmMgYi9zcmMvYmFzZS9mdGd4dmFsLmMKaW5kZXggMTllMmQ2YS4uZjA0ZGYxNCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRneHZhbC5jCisrKyBiL3NyYy9iYXNlL2Z0Z3h2YWwuYwpAQCAtMSwzNSArMSwzNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRneHZhbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z3h2YWwuYworICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIFRydWVUeXBlR1gvQUFUIHRhYmxlcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIE1hc2F0YWtlIFlBTUFUTywgUmVkaGF0IEsuSywKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dYX1ZBTElEQVRFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmg+CiAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z3h2YWwuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRoYXNoLmMgYi9zcmMvYmFzZS9mdGhhc2guYwppbmRleCAyMWJjOGRkLi40NDliMDNhIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGhhc2guYworKysgYi9zcmMvYmFzZS9mdGhhc2guYwpAQCAtMSwxMCArMSwxMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRoYXNoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhhc2hpbmcgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRoYXNoLmMKKyAqCisgKiAgIEhhc2hpbmcgZnVuY3Rpb25zIChib2R5KS4KKyAqCisgKi8KIAogLyoKICAqIENvcHlyaWdodCAyMDAwIENvbXB1dGluZyBSZXNlYXJjaCBMYWJzLCBOZXcgTWV4aWNvIFN0YXRlIFVuaXZlcnNpdHkKQEAgLTMwLDE4ICszMCwxNyBAQAogICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gY29kZSBmcm9tIGJkZi5jLHYgMS4yMiAyMDAwLzAzLzE2IDIwOjA4OjUwICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIHRha2VuIGZyb20gTWFyayBMZWlzaGVyJ3MgeG1iZGZlZCBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBjb2RlIGZyb20gYmRmLmMsdiAxLjIyIDIwMDAvMDMvMTYgMjA6MDg6NTAKKyAgICoKKyAgICogdGFrZW4gZnJvbSBNYXJrIExlaXNoZXIncyB4bWJkZmVkIHBhY2thZ2UKKyAgICoKKyAgICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KIAogCiAjZGVmaW5lIElOSVRJQUxfSFRfU0laRSAgMjQxCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGluaXQuYyBiL3NyYy9iYXNlL2Z0aW5pdC5jCmluZGV4IDFmYTQ3MjEuLjBhY2M3NWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0aW5pdC5jCisrKyBiL3NyYy9iYXNlL2Z0aW5pdC5jCkBAIC0xLDYxICsxLDU3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGluaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgaW5pdGlhbGl6YXRpb24gbGF5ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGluaXQuYworICoKKyAqICAgRnJlZVR5cGUgaW5pdGlhbGl6YXRpb24gbGF5ZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3byAgICAgICAgICAgKi8KLSAgLyogIGZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcygpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgdGhlIHNldCBvZiBkZWZhdWx0IG1vZHVsZXMgdG8gYSAgICAgICovCi0gIC8qICAgICBmcmVzaCBuZXcgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IGlzIHRha2VuIGZyb20gdGhlIGhlYWRlciBmaWxlICAqLwotICAvKiAgICAgYGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oJy4gIFNlZSB0aGUgZG9jdW1lbnQgYEZyZWVUeXBlIDIuMCAgICAgKi8KLSAgLyogICAgIEJ1aWxkIFN5c3RlbScgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfSW5pdF9GcmVlVHlwZSgpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN5c3RlbSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLCAgICovCi0gIC8qICAgICBidWlsZHMgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBjYWxscyBGVF9EZWZhdWx0X0RyaXZlcnMoKS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBldmVuIGlmIEZUX0luaXRfRnJlZVR5cGUoKSB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgICovCi0gIC8qICBzeXN0ZW0gb2JqZWN0IGRlZmluZWQgYXQgYnVpbGQgdGltZSwgY2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgc3RpbGwgICAqLwotICAvKiAgYWJsZSB0byBwcm92aWRlIHRoZWlyIG93biBgZnRzeXN0ZW0uYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3bworICAgKiBmdW5jdGlvbnM6CisgICAqCisgICAqIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMoKToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYWRkIHRoZSBzZXQgb2YgZGVmYXVsdCBtb2R1bGVzIHRvIGEKKyAgICogICBmcmVzaCBuZXcgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IGlzIHRha2VuIGZyb20gdGhlIGhlYWRlciBmaWxlCisgICAqICAgYGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oJy4gIFNlZSB0aGUgZG9jdW1lbnQgYEZyZWVUeXBlIDIuMAorICAgKiAgIEJ1aWxkIFN5c3RlbScgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAqCisgICAqIEZUX0luaXRfRnJlZVR5cGUoKToKKyAgICogICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzeXN0ZW0gb2JqZWN0IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwKKyAgICogICBidWlsZHMgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBjYWxscyBGVF9EZWZhdWx0X0RyaXZlcnMoKS4KKyAgICoKKyAgICogTm90ZSB0aGF0IGV2ZW4gaWYgRlRfSW5pdF9GcmVlVHlwZSgpIHVzZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorICAgKiBzeXN0ZW0gb2JqZWN0IGRlZmluZWQgYXQgYnVpbGQgdGltZSwgY2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgc3RpbGwKKyAgICogYWJsZSB0byBwcm92aWRlIHRoZWlyIG93biBgZnRzeXN0ZW0uYycuCisgICAqCisgICAqLwogCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0jaW5jbHVkZSAiYmFzZXBpYy5oIgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGFwaS5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2luaXQKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgaW5pdAogCiAKICN1bmRlZiAgRlRfVVNFX01PRFVMRQpAQCAtNzgsMTIwICs3NCw2IEBACiAgIH07CiAKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRVhURVJOQyAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfRVhURVJOQyAgZXh0ZXJuCi0jZW5kaWYKLQotICAvKiBkZWNsYXJlIHRoZSBtb2R1bGUncyBjbGFzcyBjcmVhdGlvbi9kZXN0cnVjdGlvbiBmdW5jdGlvbnMgKi8KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FWFRFUk5DIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIHgoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogICpvdXRwdXRfY2xhc3MgKTsgXAotICBGVF9FWFRFUk5DIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyB4KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgLyogY291bnQgYWxsIG1vZHVsZSBjbGFzc2VzICovCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICBNT0RVTEVfQ0xBU1NfICMjIHgsCi0KLSAgZW51bQotICB7Ci0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0gICAgRlRfTlVNX01PRFVMRV9DTEFTU0VTCi0gIH07Ci0KLSAgLyogZGVzdHJveSBhbGwgbW9kdWxlIGNsYXNzZXMgKi8KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIGNsYXNzZXNbaV0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIHgoIGxpYnJhcnksIGNsYXNzZXNbaV0gKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpKys7Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICAqY2xhc3NlczsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIEZUX1VJbnQgICAgICAgICAgICBpOwotICAgIEJhc2VQSUMqICAgICAgICAgICBwaWNfY29udGFpbmVyID0gKEJhc2VQSUMqKWxpYnJhcnktPnBpY19jb250YWluZXIuYmFzZTsKLQotCi0gICAgaWYgKCAhcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OwotICAgIGNsYXNzZXMgPSBwaWNfY29udGFpbmVyLT5kZWZhdWx0X21vZHVsZV9jbGFzc2VzOwotICAgIGkgICAgICAgPSAwOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgICBGVF9GUkVFKCBjbGFzc2VzICk7Ci0gICAgcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYWxsIG1vZHVsZSBjbGFzc2VzIGFuZCB0aGUgcG9pbnRlciB0YWJsZSAqLwotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHR5cGUsIHggKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfICMjIHgoIGxpYnJhcnksICZjbGF6eiApOyAgXAotICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ290byBFeGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3Nlc1tpKytdID0gY2xheno7Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICAqY2xhc3NlcyA9IE5VTEw7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgIGNsYXp6OwotICAgIEZUX1VJbnQgICAgICAgICAgICBpOwotICAgIEJhc2VQSUMqICAgICAgICAgICBwaWNfY29udGFpbmVyID0gKEJhc2VQSUMqKWxpYnJhcnktPnBpY19jb250YWluZXIuYmFzZTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyA9IE5VTEw7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGFzc2VzLCBzaXplb2YgKCBGVF9Nb2R1bGVfQ2xhc3MqICkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBGVF9OVU1fTU9EVUxFX0NMQVNTRVMgKyAxICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBpbml0aWFsaXplIGFsbCBwb2ludGVycyB0byAwLCBlc3BlY2lhbGx5IHRoZSBsYXN0IG9uZSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfTlVNX01PRFVMRV9DTEFTU0VTOyBpKysgKQotICAgICAgY2xhc3Nlc1tpXSA9IE5VTEw7Ci0gICAgY2xhc3Nlc1tGVF9OVU1fTU9EVUxFX0NMQVNTRVNdID0gTlVMTDsKLQotICAgIGkgPSAwOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggbGlicmFyeSApOwotICAgIGVsc2UKLSAgICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSBjbGFzc2VzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KIAogICBGVF9FWFBPUlRfREVGKCB2b2lkICkKQEAgLTIwMSwxNiArODMsMTAgQEAKICAgICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqIGNvbnN0KiAgY3VyOwogCiAKLSAgICAvKiBGVF9ERUZBVUxUX01PRFVMRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuOwotI2VuZGlmCi0KICAgICAvKiBHQ0MgNC42IHdhcm5zIHRoZSB0eXBlIGRpZmZlcmVuY2U6CiAgICAgICogICBGVF9Nb2R1bGVfQ2xhc3MqKiAhPSBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqIGNvbnN0KgogICAgICAqLwotICAgIGN1ciA9IChjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqIGNvbnN0KilGVF9ERUZBVUxUX01PRFVMRVNfR0VUOworICAgIGN1ciA9IChjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqIGNvbnN0KilmdF9kZWZhdWx0X21vZHVsZXM7CiAKICAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgZGVsYXllZCB0byBGVF9BZGRfTW9kdWxlKCkgKi8KICAgICB3aGlsZSAoICpjdXIgKQpAQCAtMzAwLDYgKzE3Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV92YWx1ZSApOworCisgICAgICBpZiAoICEqcCApCisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdGxjZGZpbC5jIGIvc3JjL2Jhc2UvZnRsY2RmaWwuYwppbmRleCA4ZDMxNGRmLi4xZTg0ZGJjIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdGxjZGZpbC5jCisrKyBiL3NyYy9iYXNlL2Z0bGNkZmlsLmMKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bGNkZmlsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbG9yIGZpbHRlcmluZyBvZiBzdWJwaXhlbCBiaXRtYXAgZ2x5cGhzIChib2R5KS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bGNkZmlsLmMKKyAqCisgKiAgIEZyZWVUeXBlIEFQSSBmb3IgY29sb3IgZmlsdGVyaW5nIG9mIHN1YnBpeGVsIGJpdG1hcCBnbHlwaHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCi0jaW5jbHVkZSBGVF9MQ0RfRklMVEVSX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bGNkZmlsLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRpbWFnZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwpAQCAtMzQsOSArMzMsOSBAQAogCiAgIC8qIGFkZCBwYWRkaW5nIGFjY29yZGluZyB0byBmaWx0ZXIgd2VpZ2h0cyAqLwogICBGVF9CQVNFX0RFRiAodm9pZCkKLSAgZnRfbGNkX3BhZGRpbmcoIEZUX1BvcyogICAgICAgTWluLAotICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICBNYXgsCi0gICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKQorICBmdF9sY2RfcGFkZGluZyggRlRfQkJveCogICAgICAgIGNib3gsCisgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgc2xvdCwKKyAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlICkKICAgewogICAgIEZUX0J5dGUqICAgICAgICAgICAgICAgICBsY2Rfd2VpZ2h0czsKICAgICBGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYyAgbGNkX2ZpbHRlcl9mdW5jOwpAQCAtNTYsMTAgKzU1LDIwIEBACiAKICAgICBpZiAoIGxjZF9maWx0ZXJfZnVuYyA9PSBmdF9sY2RfZmlsdGVyX2ZpciApCiAgICAgewotICAgICAgKk1pbiAtPSBsY2Rfd2VpZ2h0c1swXSA/IDQzIDoKLSAgICAgICAgICAgICAgbGNkX3dlaWdodHNbMV0gPyAyMiA6IDA7Ci0gICAgICAqTWF4ICs9IGxjZF93ZWlnaHRzWzRdID8gNDMgOgotICAgICAgICAgICAgICBsY2Rfd2VpZ2h0c1szXSA/IDIyIDogMDsKKyAgICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQorICAgICAgeworICAgICAgICBjYm94LT54TWluIC09IGxjZF93ZWlnaHRzWzBdID8gNDMgOgorICAgICAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzFdID8gMjIgOiAwOworICAgICAgICBjYm94LT54TWF4ICs9IGxjZF93ZWlnaHRzWzRdID8gNDMgOgorICAgICAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzNdID8gMjIgOiAwOworICAgICAgfQorICAgICAgZWxzZSBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgKQorICAgICAgeworICAgICAgICBjYm94LT55TWluIC09IGxjZF93ZWlnaHRzWzBdID8gNDMgOgorICAgICAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzFdID8gMjIgOiAwOworICAgICAgICBjYm94LT55TWF4ICs9IGxjZF93ZWlnaHRzWzRdID8gNDMgOgorICAgICAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzNdID8gMjIgOiAwOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC02NywxMyArNzYsMTMgQEAKICAgLyogRklSIGZpbHRlciB1c2VkIGJ5IHRoZSBkZWZhdWx0IGFuZCBsaWdodCBmaWx0ZXJzICovCiAgIEZUX0JBU0VfREVGKCB2b2lkICkKICAgZnRfbGNkX2ZpbHRlcl9maXIoIEZUX0JpdG1hcCogICAgICAgICAgIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaXZlVGFwRmlsdGVyICB3ZWlnaHRzICkKICAgewogICAgIEZUX1VJbnQgICB3aWR0aCAgPSAoRlRfVUludCliaXRtYXAtPndpZHRoOwogICAgIEZUX1VJbnQgICBoZWlnaHQgPSAoRlRfVUludCliaXRtYXAtPnJvd3M7CiAgICAgRlRfSW50ICAgIHBpdGNoICA9IGJpdG1hcC0+cGl0Y2g7CiAgICAgRlRfQnl0ZSogIG9yaWdpbiA9IGJpdG1hcC0+YnVmZmVyOworICAgIEZUX0J5dGUgICBtb2RlICAgPSBiaXRtYXAtPnBpeGVsX21vZGU7CiAKIAogICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwpAQCAtODEsNyArOTAsNyBAQAogICAgICAgb3JpZ2luICs9IHBpdGNoICogKEZUX0ludCkoIGhlaWdodCAtIDEgKTsKIAogICAgIC8qIGhvcml6b250YWwgaW4tcGxhY2UgRklSIGZpbHRlciAqLwotICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgd2lkdGggPj0gMiApCisgICAgaWYgKCBtb2RlID09IEZUX1BJWEVMX01PREVfTENEICYmIHdpZHRoID49IDIgKQogICAgIHsKICAgICAgIEZUX0J5dGUqICBsaW5lID0gb3JpZ2luOwogCkBAIC0xMjQsNyArMTMzLDcgQEAKICAgICB9CiAKICAgICAvKiB2ZXJ0aWNhbCBpbi1wbGFjZSBGSVIgZmlsdGVyICovCi0gICAgZWxzZSBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgJiYgaGVpZ2h0ID49IDIgKQorICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1BJWEVMX01PREVfTENEX1YgJiYgaGVpZ2h0ID49IDIgKQogICAgIHsKICAgICAgIEZUX0J5dGUqICBjb2x1bW4gPSBvcmlnaW47CiAKQEAgLTE3MywxMyArMTgyLDEzIEBACiAgIC8qIGludHJhLXBpeGVsIGZpbHRlciB1c2VkIGJ5IHRoZSBsZWdhY3kgZmlsdGVyICovCiAgIHN0YXRpYyB2b2lkCiAgIF9mdF9sY2RfZmlsdGVyX2xlZ2FjeSggRlRfQml0bWFwKiAgICAgIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgd2VpZ2h0cyApCiAgIHsKICAgICBGVF9VSW50ICAgd2lkdGggID0gKEZUX1VJbnQpYml0bWFwLT53aWR0aDsKICAgICBGVF9VSW50ICAgaGVpZ2h0ID0gKEZUX1VJbnQpYml0bWFwLT5yb3dzOwogICAgIEZUX0ludCAgICBwaXRjaCAgPSBiaXRtYXAtPnBpdGNoOwogICAgIEZUX0J5dGUqICBvcmlnaW4gPSBiaXRtYXAtPmJ1ZmZlcjsKKyAgICBGVF9CeXRlICAgbW9kZSAgID0gYml0bWFwLT5waXhlbF9tb2RlOwogCiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCAgZmlsdGVyc1szXVszXSA9CiAgICAgewpAQCAtMTk2LDcgKzIwNSw3IEBACiAgICAgICBvcmlnaW4gKz0gcGl0Y2ggKiAoRlRfSW50KSggaGVpZ2h0IC0gMSApOwogCiAgICAgLyogaG9yaXpvbnRhbCBpbi1wbGFjZSBpbnRyYS1waXhlbCBmaWx0ZXIgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICYmIHdpZHRoID49IDMgKQorICAgIGlmICggbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0xDRCAmJiB3aWR0aCA+PSAzICkKICAgICB7CiAgICAgICBGVF9CeXRlKiAgbGluZSA9IG9yaWdpbjsKIApAQCAtMjMzLDcgKzI0Miw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgZWxzZSBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEX1YgJiYgaGVpZ2h0ID49IDMgKQorICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1BJWEVMX01PREVfTENEX1YgJiYgaGVpZ2h0ID49IDMgKQogICAgIHsKICAgICAgIEZUX0J5dGUqICBjb2x1bW4gPSBvcmlnaW47CiAKQEAgLTI3NSw2ICsyODQsOCBAQAogI2VuZGlmIC8qIFVTRV9MRUdBQ1kgKi8KIAogCisgIC8qIGRvY3VtZW50YXRpb24gaW4gZnRsY2RmaWwuaCAqLworCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKICAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqd2VpZ2h0cyApCkBAIC0yOTIsNiArMzAzLDggQEAKICAgfQogCiAKKyAgLyogZG9jdW1lbnRhdGlvbiBpbiBmdGxjZGZpbC5oICovCisKICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRmlsdGVyICBmaWx0ZXIgKQpAQCAtMzQxLDE4ICszNTQsNDEgQEAKICAgICByZXR1cm4gRlRfRXJyX09rOwogICB9CiAKKworICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCisgIEZUX0xpYnJhcnlfU2V0TGNkR2VvbWV0cnkoIEZUX0xpYnJhcnkgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHN1YiApCisgIHsKKyAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKKyAgICBGVF9VTlVTRUQoIHN1YiApOworCisgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKyAgfQorCiAjZWxzZSAvKiAhRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KIAotICAvKiBhZGQgcGFkZGluZyBhY2NvcmRpbmcgdG8gYWNjb21tb2RhdGUgb3V0bGluZSBzaGlmdHMgKi8KKyAgLyogYWRkIHBhZGRpbmcgdG8gYWNjb21tb2RhdGUgb3V0bGluZSBzaGlmdHMgKi8KICAgRlRfQkFTRV9ERUYgKHZvaWQpCi0gIGZ0X2xjZF9wYWRkaW5nKCBGVF9Qb3MqICAgICAgIE1pbiwKLSAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAgTWF4LAotICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICkKKyAgZnRfbGNkX3BhZGRpbmcoIEZUX0JCb3gqICAgICAgICBjYm94LAorICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgIHNsb3QsCisgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgbW9kZSApCiAgIHsKLSAgICBGVF9VTlVTRUQoIHNsb3QgKTsKKyAgICBGVF9WZWN0b3IqICBzdWIgPSBzbG90LT5saWJyYXJ5LT5sY2RfZ2VvbWV0cnk7CiAKLSAgICAqTWluIC09IDIxOwotICAgICpNYXggKz0gMjE7CisgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCApCisgICAgeworICAgICAgY2JveC0+eE1pbiAtPSBGVF9NQVgoIEZUX01BWCggc3ViWzBdLngsIHN1YlsxXS54ICksIHN1YlsyXS54ICk7CisgICAgICBjYm94LT54TWF4IC09IEZUX01JTiggRlRfTUlOKCBzdWJbMF0ueCwgc3ViWzFdLnggKSwgc3ViWzJdLnggKTsKKyAgICAgIGNib3gtPnlNaW4gLT0gRlRfTUFYKCBGVF9NQVgoIHN1YlswXS55LCBzdWJbMV0ueSApLCBzdWJbMl0ueSApOworICAgICAgY2JveC0+eU1heCAtPSBGVF9NSU4oIEZUX01JTiggc3ViWzBdLnksIHN1YlsxXS55ICksIHN1YlsyXS55ICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICkKKyAgICB7CisgICAgICBjYm94LT54TWluIC09IEZUX01BWCggRlRfTUFYKCBzdWJbMF0ueSwgc3ViWzFdLnkgKSwgc3ViWzJdLnkgKTsKKyAgICAgIGNib3gtPnhNYXggLT0gRlRfTUlOKCBGVF9NSU4oIHN1YlswXS55LCBzdWJbMV0ueSApLCBzdWJbMl0ueSApOworICAgICAgY2JveC0+eU1pbiArPSBGVF9NSU4oIEZUX01JTiggc3ViWzBdLngsIHN1YlsxXS54ICksIHN1YlsyXS54ICk7CisgICAgICBjYm94LT55TWF4ICs9IEZUX01BWCggRlRfTUFYKCBzdWJbMF0ueCwgc3ViWzFdLnggKSwgc3ViWzJdLnggKTsKKyAgICB9CiAgIH0KIAogCkBAIC0zNzcsNiArNDEzLDI0IEBACiAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKICAgfQogCisKKyAgLyogZG9jdW1lbnRhdGlvbiBpbiBmdGxjZGZpbC5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9MaWJyYXJ5X1NldExjZEdlb21ldHJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICBzdWJbM10gKQorICB7CisgICAgaWYgKCAhbGlicmFyeSApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKKworICAgIGlmICggIXN1YiApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworICAgIGZ0X21lbWNweSggbGlicmFyeS0+bGNkX2dlb21ldHJ5LCBzdWIsIDMgKiBzaXplb2YoIEZUX1ZlY3RvciApICk7CisKKyAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOworICB9CisKICNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KIAogCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdG1hYy5jIGIvc3JjL2Jhc2UvZnRtYWMuYwppbmRleCBmZDRjMGNjLi41NWE2MzFmIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdG1hYy5jCisrKyBiL3NyYy9iYXNlL2Z0bWFjLmMKQEAgLTEsMjMgKzEsMjMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWFjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBNYWMgRk9ORCBzdXBwb3J0LiAgV3JpdHRlbiBieSBqdXN0QGxldHRlcnJvci5jb20uICAgICAgICAgICAgICAgICAgICAqLwotLyogIEhlYXZpbHkgbW9kaWZpZWQgYnkgbXBzdXp1a2ksIEdlb3JnZSBXaWxsaWFtcywgYW5kIFNlYW4gTWNCcmlkZS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIGZvciBNYWMgT1MgWCBvbmx5OyBzZWUgYnVpbGRzL21hYy9mdG9sZG1hYy5jIGZvciAgICAgICAgICAqLwotLyogIGNsYXNzaWMgcGxhdGZvcm1zIGJ1aWx0IGJ5IE1QVy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEp1c3QgdmFuIFJvc3N1bSwgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG1hYy5jCisgKgorICogICBNYWMgRk9ORCBzdXBwb3J0LiAgV3JpdHRlbiBieSBqdXN0QGxldHRlcnJvci5jb20uCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IG1wc3V6dWtpLCBHZW9yZ2UgV2lsbGlhbXMsIGFuZCBTZWFuIE1jQnJpZGUuCisgKgorICogVGhpcyBmaWxlIGlzIGZvciBNYWMgT1MgWCBvbmx5OyBzZWUgYnVpbGRzL21hYy9mdG9sZG1hYy5jIGZvcgorICogY2xhc3NpYyBwbGF0Zm9ybXMgYnVpbHQgYnkgTVBXLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBKdXN0IHZhbiBSb3NzdW0sIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgIC8qCkBAIC02NSwxMCArNjUsOSBAQAogICAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KICNpbmNsdWRlICJmdGJhc2UuaCIKIAogCkBAIC05NTQsMTcgKzk1MywxNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHRoZSBNYWMtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRlRfTmV3X0ZhY2UuICBJbiAgICAgICAgKi8KLSAgLyogICAgYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIEZUX05ld19GYWNlKCkgZnVuY3Rpb25hbGl0eSwgaXQgYWxzbyAgICAgICovCi0gIC8qICAgIGFjY2VwdHMgcGF0aG5hbWVzIHRvIE1hYyBzdWl0Y2FzZSBmaWxlcy4gIEZvciBmdXJ0aGVyICAgICAgICAgICAgICAqLwotICAvKiAgICBkb2N1bWVudGF0aW9uIHNlZSB0aGUgb3JpZ2luYWwgRlRfTmV3X0ZhY2UoKSBpbiBmcmVldHlwZS5oLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgRlRfTmV3X0ZhY2UKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgaXMgdGhlIE1hYy1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBGVF9OZXdfRmFjZS4gIEluCisgICAqICAgYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIEZUX05ld19GYWNlKCkgZnVuY3Rpb25hbGl0eSwgaXQgYWxzbworICAgKiAgIGFjY2VwdHMgcGF0aG5hbWVzIHRvIE1hYyBzdWl0Y2FzZSBmaWxlcy4gIEZvciBmdXJ0aGVyCisgICAqICAgZG9jdW1lbnRhdGlvbiBzZWUgdGhlIG9yaWdpbmFsIEZUX05ld19GYWNlKCkgaW4gZnJlZXR5cGUuaC4KKyAgICovCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKICAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAogICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLApAQCAtOTk1LDE3ICs5OTQsMTggQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgICovCi0gIC8qICAgIGFjY2VwdHMgYW4gRlNSZWYgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGJlY2F1c2UgQ2FyYm9uIGRhdGEgdHlwZXMgKEZTUmVmKSAgICAgICAgICovCi0gIC8qIGFyZSBub3QgY3Jvc3MtcGxhdGZvcm0sIGFuZCB0aHVzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIEZyZWVUeXBlIEFQSS4gICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZUX05ld19GYWNlX0Zyb21fRlNSZWYgaXMgaWRlbnRpY2FsIHRvIEZUX05ld19GYWNlIGV4Y2VwdCBpdAorICAgKiAgIGFjY2VwdHMgYW4gRlNSZWYgaW5zdGVhZCBvZiBhIHBhdGguCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBiZWNhdXNlIENhcmJvbiBkYXRhIHR5cGVzIChGU1JlZikKKyAgICogYXJlIG5vdCBjcm9zcy1wbGF0Zm9ybSwgYW5kIHRodXMgbm90IHN1aXRhYmxlIGZvciB0aGUgRnJlZVR5cGUgQVBJLgorICAgKi8KICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTUmVmKiAgcmVmLApAQCAtMTA0MCwxNiArMTA0MCwxNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1NwZWMgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMgaXMgaWRlbnRpY2FsIHRvIEZUX05ld19GYWNlIGV4Y2VwdCBpdAorICAgKiAgIGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLgorICAgKgorICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWAorICAgKi8KICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTU3BlYyogIHNwZWMsCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdG1tLmMgYi9zcmMvYmFzZS9mdG1tLmMKaW5kZXggODAwNDQxYi4uOWE3MDJiOSAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRtbS5jCisrKyBiL3NyYy9iYXNlL2Z0bW0uYwpAQCAtMSwzOCArMSwzNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE11bHRpcGxlIE1hc3RlciBmb250IHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRtbS5jCisgKgorICogICBNdWx0aXBsZSBNYXN0ZXIgZm9udCBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1ldHJpYy5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21tCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgbW0KIAogCiAgIHN0YXRpYyBGVF9FcnJvcgpAQCAtMjAyLDYgKzIwMSw2NyBAQAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKKyAgRlRfU2V0X01NX1dlaWdodFZlY3RvciggRlRfRmFjZSAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB3ZWlnaHR2ZWN0b3IgKQorICB7CisgICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yOworICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBzZXJ2aWNlOworCisKKyAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgZnRfZmFjZV9nZXRfbW1fc2VydmljZScgKi8KKworICAgIGlmICggbGVuICYmICF3ZWlnaHR2ZWN0b3IgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisKKyAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7CisgICAgaWYgKCAhZXJyb3IgKQorICAgIHsKKyAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgICBpZiAoIHNlcnZpY2UtPnNldF9tbV93ZWlnaHR2ZWN0b3IgKQorICAgICAgICBlcnJvciA9IHNlcnZpY2UtPnNldF9tbV93ZWlnaHR2ZWN0b3IoIGZhY2UsIGxlbiwgd2VpZ2h0dmVjdG9yICk7CisgICAgfQorCisgICAgLyogZW5mb3JjZSByZWNvbXB1dGF0aW9uIG9mIGF1dG8taGludGluZyBkYXRhICovCisgICAgaWYgKCAhZXJyb3IgJiYgZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKKyAgICB7CisgICAgICBmYWNlLT5hdXRvaGludC5maW5hbGl6ZXIoIGZhY2UtPmF1dG9oaW50LmRhdGEgKTsKKyAgICAgIGZhY2UtPmF1dG9oaW50LmRhdGEgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9HZXRfTU1fV2VpZ2h0VmVjdG9yKCBGVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHdlaWdodHZlY3RvciApCisgIHsKKyAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7CisKKworICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLworCisgICAgaWYgKCBsZW4gJiYgIXdlaWdodHZlY3RvciApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworICAgIGVycm9yID0gZnRfZmFjZV9nZXRfbW1fc2VydmljZSggZmFjZSwgJnNlcnZpY2UgKTsKKyAgICBpZiAoICFlcnJvciApCisgICAgeworICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgIGlmICggc2VydmljZS0+Z2V0X21tX3dlaWdodHZlY3RvciApCisgICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X21tX3dlaWdodHZlY3RvciggZmFjZSwgbGVuLCB3ZWlnaHR2ZWN0b3IgKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtbS5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRvYmpzLmMgYi9zcmMvYmFzZS9mdG9ianMuYwppbmRleCA4ZDA3ZTM1Li5jMDYwYmJiIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdG9ianMuYworKysgYi9zcmMvYmFzZS9mdG9ianMuYwpAQCAtMSw0NyArMSw0NiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRvYmpzLmMKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBwcml2YXRlIGJhc2UgY2xhc3NlcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0xJU1RfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9GT05UX0ZPUk1BVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bGlzdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGZudGZtdC5oPgogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgICAgICAgICAvKiBmb3IgU0ZOVF9Mb2FkX1RhYmxlX0Z1bmMgKi8KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0ggIC8qIGZvciBQU19Ecml2ZXIgICAgICAgICAgICAqLworI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPiAgICAgICAgICAvKiBmb3IgU0ZOVF9Mb2FkX1RhYmxlX0Z1bmMgKi8KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPiAgICAgICAgIC8qIGZvciBQU19Ecml2ZXIgICAgICAgICAgICAqLwogCi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFibGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KIAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfS0VSTklOR19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0VOR0lORV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oPgogCi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwogI2luY2x1ZGUgImZ0YmFzZS5oIgpAQCAtNTAsNyArNDksNyBAQAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKIAotI2luY2x1ZGUgRlRfQklUTUFQX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGJpdG1hcC5oPgogCiAjaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICAgKi8KICAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29udmVyc2lvbiBmcm9tIFhYWCB0byBZWVksICAgICAqLwpAQCAtNzksNiArNzgsMTggQEAKICNwcmFnbWEgd2FybmluZyggcG9wICkKICNlbmRpZgogCisgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCAgcGl4ZWxfbW9kZXNbXSA9CisgIHsKKyAgICAibm9uZSIsCisgICAgIm1vbm9jaHJvbWUgYml0bWFwIiwKKyAgICAiZ3JheSA4LWJpdCBiaXRtYXAiLAorICAgICJncmF5IDItYml0IGJpdG1hcCIsCisgICAgImdyYXkgNC1iaXQgYml0bWFwIiwKKyAgICAiTENEIDgtYml0IGJpdG1hcCIsCisgICAgInZlcnRpY2FsIExDRCA4LWJpdCBiaXRtYXAiLAorICAgICJCR1JBIDMyLWJpdCBjb2xvciBpbWFnZSBiaXRtYXAiCisgIH07CisKICNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwogCiAKQEAgLTI1OSwxNCArMjcwLDE0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vYmpzCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgb2JqcwogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzAsNyArMzQxLDkgQEAKICAgfQogCiAKLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQorICAvKiBvdmVyZmxvdy1yZXNpc3RhbnQgcHJlc2V0dGluZyBvZiBiaXRtYXAgcG9zaXRpb24gYW5kIGRpbWVuc2lvbnM7ICovCisgIC8qIGFsc28gY2hlY2sgd2hldGhlciB0aGUgc2l6ZSBpcyB0b28gbGFyZ2UgZm9yIHJlbmRlcmluZyAgICAgICAgICAgKi8KKyAgRlRfQkFTRV9ERUYoIEZUX0Jvb2wgKQogICBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCggRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQpAQCAtMzQwLDE1ICszNTMsMTUgQEAKIAogICAgIEZUX1BpeGVsX01vZGUgIHBpeGVsX21vZGU7CiAKLSAgICBGVF9CQm94ICBjYm94OworICAgIEZUX0JCb3ggIGNib3gsIHBib3g7CiAgICAgRlRfUG9zICAgeF9zaGlmdCA9IDA7CiAgICAgRlRfUG9zICAgeV9zaGlmdCA9IDA7CiAgICAgRlRfUG9zICAgeF9sZWZ0LCB5X3RvcDsKICAgICBGVF9Qb3MgICB3aWR0aCwgaGVpZ2h0LCBwaXRjaDsKIAogCi0gICAgaWYgKCBzbG90LT5pbnRlcm5hbCAmJiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKSApCi0gICAgICByZXR1cm47CisgICAgaWYgKCBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgKQorICAgICAgcmV0dXJuIDE7CiAKICAgICBpZiAoIG9yaWdpbiApCiAgICAgewpAQCAtMzYwLDc2ICszNzMsODkgQEAKICAgICAvKiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBvcmlnaW4gc2hpZnQgICAgICAqLwogICAgIEZUX091dGxpbmVfR2V0X0NCb3goIG91dGxpbmUsICZjYm94ICk7CiAKLSAgICBjYm94LnhNaW4gKz0geF9zaGlmdDsKLSAgICBjYm94LnlNaW4gKz0geV9zaGlmdDsKLSAgICBjYm94LnhNYXggKz0geF9zaGlmdDsKLSAgICBjYm94LnlNYXggKz0geV9zaGlmdDsKKyAgICAvKiByb3VnaCBlc3RpbWF0ZSBvZiBwaXhlbCBib3ggKi8KKyAgICBwYm94LnhNaW4gPSAoIGNib3gueE1pbiA+PiA2ICkgKyAoIHhfc2hpZnQgPj4gNiApOworICAgIHBib3gueU1pbiA9ICggY2JveC55TWluID4+IDYgKSArICggeV9zaGlmdCA+PiA2ICk7CisgICAgcGJveC54TWF4ID0gKCBjYm94LnhNYXggPj4gNiApICsgKCB4X3NoaWZ0ID4+IDYgKTsKKyAgICBwYm94LnlNYXggPSAoIGNib3gueU1heCA+PiA2ICkgKyAoIHlfc2hpZnQgPj4gNiApOworCisgICAgLyogdGlueSByZW1haW5kZXIgYm94ICovCisgICAgY2JveC54TWluID0gKCBjYm94LnhNaW4gJiA2MyApICsgKCB4X3NoaWZ0ICYgNjMgKTsKKyAgICBjYm94LnlNaW4gPSAoIGNib3gueU1pbiAmIDYzICkgKyAoIHlfc2hpZnQgJiA2MyApOworICAgIGNib3gueE1heCA9ICggY2JveC54TWF4ICYgNjMgKSArICggeF9zaGlmdCAmIDYzICk7CisgICAgY2JveC55TWF4ID0gKCBjYm94LnlNYXggJiA2MyApICsgKCB5X3NoaWZ0ICYgNjMgKTsKIAogICAgIHN3aXRjaCAoIG1vZGUgKQogICAgIHsKICAgICBjYXNlIEZUX1JFTkRFUl9NT0RFX01PTk86CiAgICAgICBwaXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9NT05POwogI2lmIDEKLSAgICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBiYm94IHZhbHVlcyBnZXQgcm91bmRlZCAgICAqLwotICAgICAgLyogdW5sZXNzIHRoZSByb3VuZGVkIGJveCBjYW4gY29sbGFwc2UgZm9yIGEgbmFycm93IGdseXBoICovCi0gICAgICBpZiAoIGNib3gueE1heCAtIGNib3gueE1pbiA8IDY0ICkKKyAgICAgIC8qIHggKi8KKworICAgICAgLyogdW5kb2N1bWVudGVkIGJ1dCBjb25maXJtZWQ6IGJib3ggdmFsdWVzIGdldCByb3VuZGVkOyAgICAqLworICAgICAgLyogd2UgZG8gYXN5bW1ldHJpYyByb3VuZGluZyBzbyB0aGF0IHRoZSBjZW50ZXIgb2YgYSBwaXhlbCAqLworICAgICAgLyogZ2V0cyBhbHdheXMgaW5jbHVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICBwYm94LnhNaW4gKz0gKCBjYm94LnhNaW4gKyAzMSApID4+IDY7CisgICAgICBwYm94LnhNYXggKz0gKCBjYm94LnhNYXggKyAzMiApID4+IDY7CisKKyAgICAgIC8qIGlmIHRoZSBiYm94IGNvbGxhcHNlZCwgd2UgYWRkIGEgcGl4ZWwgYmFzZWQgb24gdGhlIHRvdGFsICovCisgICAgICAvKiByb3VuZGluZyByZW1haW5kZXIgdG8gY292ZXIgbW9zdCBvZiB0aGUgb3JpZ2luYWwgY2JveCAgICAqLworCisgICAgICBpZiAoIHBib3gueE1pbiA9PSBwYm94LnhNYXggKQogICAgICAgewotICAgICAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueE1pbiApOwotICAgICAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTF9MT05HKCBjYm94LnhNYXggKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2JveC54TWluID0gRlRfUElYX1JPVU5EX0xPTkcoIGNib3gueE1pbiApOwotICAgICAgICBjYm94LnhNYXggPSBGVF9QSVhfUk9VTkRfTE9ORyggY2JveC54TWF4ICk7CisgICAgICAgIGlmICggKCAoIGNib3gueE1pbiArIDMxICkgJiA2MyApIC0gMzEgKworICAgICAgICAgICAgICggKCBjYm94LnhNYXggKyAzMiApICYgNjMgKSAtIDMyIDwgMCApCisgICAgICAgICAgcGJveC54TWluIC09IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYm94LnhNYXggKz0gMTsKICAgICAgIH0KIAotICAgICAgaWYgKCBjYm94LnlNYXggLSBjYm94LnlNaW4gPCA2NCApCisgICAgICAvKiB5ICovCisKKyAgICAgIHBib3gueU1pbiArPSAoIGNib3gueU1pbiArIDMxICkgPj4gNjsKKyAgICAgIHBib3gueU1heCArPSAoIGNib3gueU1heCArIDMyICkgPj4gNjsKKworICAgICAgaWYgKCBwYm94LnlNaW4gPT0gcGJveC55TWF4ICkKICAgICAgIHsKLSAgICAgICAgY2JveC55TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnlNaW4gKTsKLSAgICAgICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUxfTE9ORyggY2JveC55TWF4ICk7CisgICAgICAgIGlmICggKCAoIGNib3gueU1pbiArIDMxICkgJiA2MyApIC0gMzEgKworICAgICAgICAgICAgICggKCBjYm94LnlNYXggKyAzMiApICYgNjMgKSAtIDMyIDwgMCApCisgICAgICAgICAgcGJveC55TWluIC09IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwYm94LnlNYXggKz0gMTsKICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2JveC55TWluID0gRlRfUElYX1JPVU5EX0xPTkcoIGNib3gueU1pbiApOwotICAgICAgICBjYm94LnlNYXggPSBGVF9QSVhfUk9VTkRfTE9ORyggY2JveC55TWF4ICk7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgY2JveC54TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnhNaW4gKTsKLSAgICAgIGNib3gueU1pbiA9IEZUX1BJWF9GTE9PUiggY2JveC55TWluICk7Ci0gICAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTF9MT05HKCBjYm94LnhNYXggKTsKLSAgICAgIGNib3gueU1heCA9IEZUX1BJWF9DRUlMX0xPTkcoIGNib3gueU1heCApOwotI2VuZGlmCisKICAgICAgIGJyZWFrOworI2Vsc2UKKyAgICAgIGdvdG8gQWRqdXN0OworI2VuZGlmCiAKICAgICBjYXNlIEZUX1JFTkRFUl9NT0RFX0xDRDoKICAgICAgIHBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0xDRDsKLSAgICAgIGZ0X2xjZF9wYWRkaW5nKCAmY2JveC54TWluLCAmY2JveC54TWF4LCBzbG90ICk7Ci0gICAgICBnb3RvIFJvdW5kOworICAgICAgZnRfbGNkX3BhZGRpbmcoICZjYm94LCBzbG90LCBtb2RlICk7CisgICAgICBnb3RvIEFkanVzdDsKIAogICAgIGNhc2UgRlRfUkVOREVSX01PREVfTENEX1Y6CiAgICAgICBwaXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9MQ0RfVjsKLSAgICAgIGZ0X2xjZF9wYWRkaW5nKCAmY2JveC55TWluLCAmY2JveC55TWF4LCBzbG90ICk7Ci0gICAgICBnb3RvIFJvdW5kOworICAgICAgZnRfbGNkX3BhZGRpbmcoICZjYm94LCBzbG90LCBtb2RlICk7CisgICAgICBnb3RvIEFkanVzdDsKIAogICAgIGNhc2UgRlRfUkVOREVSX01PREVfTk9STUFMOgogICAgIGNhc2UgRlRfUkVOREVSX01PREVfTElHSFQ6CiAgICAgZGVmYXVsdDoKICAgICAgIHBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0dSQVk7Ci0gICAgUm91bmQ6Ci0gICAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueE1pbiApOwotICAgICAgY2JveC55TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnlNaW4gKTsKLSAgICAgIGNib3gueE1heCA9IEZUX1BJWF9DRUlMX0xPTkcoIGNib3gueE1heCApOwotICAgICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUxfTE9ORyggY2JveC55TWF4ICk7CisgICAgQWRqdXN0OgorICAgICAgcGJveC54TWluICs9IGNib3gueE1pbiA+PiA2OworICAgICAgcGJveC55TWluICs9IGNib3gueU1pbiA+PiA2OworICAgICAgcGJveC54TWF4ICs9ICggY2JveC54TWF4ICsgNjMgKSA+PiA2OworICAgICAgcGJveC55TWF4ICs9ICggY2JveC55TWF4ICsgNjMgKSA+PiA2OwogICAgIH0KIAotICAgIHhfc2hpZnQgPSBTVUJfTE9ORyggeF9zaGlmdCwgY2JveC54TWluICk7Ci0gICAgeV9zaGlmdCA9IFNVQl9MT05HKCB5X3NoaWZ0LCBjYm94LnlNaW4gKTsKKyAgICB4X2xlZnQgPSBwYm94LnhNaW47CisgICAgeV90b3AgID0gcGJveC55TWF4OwogCi0gICAgeF9sZWZ0ID0gY2JveC54TWluID4+IDY7Ci0gICAgeV90b3AgID0gY2JveC55TWF4ID4+IDY7Ci0KLSAgICB3aWR0aCAgPSAoIChGVF9VTG9uZyljYm94LnhNYXggLSAoRlRfVUxvbmcpY2JveC54TWluICkgPj4gNjsKLSAgICBoZWlnaHQgPSAoIChGVF9VTG9uZyljYm94LnlNYXggLSAoRlRfVUxvbmcpY2JveC55TWluICkgPj4gNjsKKyAgICB3aWR0aCAgPSBwYm94LnhNYXggLSBwYm94LnhNaW47CisgICAgaGVpZ2h0ID0gcGJveC55TWF4IC0gcGJveC55TWluOwogCiAgICAgc3dpdGNoICggcGl4ZWxfbW9kZSApCiAgICAgewpAQCAtNDU5LDYgKzQ4NSwxNiBAQAogICAgIGJpdG1hcC0+d2lkdGggICAgICA9ICh1bnNpZ25lZCBpbnQpd2lkdGg7CiAgICAgYml0bWFwLT5yb3dzICAgICAgID0gKHVuc2lnbmVkIGludCloZWlnaHQ7CiAgICAgYml0bWFwLT5waXRjaCAgICAgID0gcGl0Y2g7CisKKyAgICBpZiAoIHBib3gueE1pbiA8IC0weDgwMDAgfHwgcGJveC54TWF4ID4gMHg3RkZGIHx8CisgICAgICAgICBwYm94LnlNaW4gPCAtMHg4MDAwIHx8IHBib3gueU1heCA+IDB4N0ZGRiApCisgICAgeworICAgICAgRlRfVFJBQ0UzKCggImZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwOiBbJWxkICVsZCAlbGQgJWxkXVxuIiwKKyAgICAgICAgICAgICAgICAgIHBib3gueE1pbiwgcGJveC55TWluLCBwYm94LnhNYXgsIHBib3gueU1heCApKTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOwogICB9CiAKIApAQCAtODA3LDcgKzg0Myw3IEBACiAgICAgICogLSBEbyBvbmx5IGF1dG8taGludGluZyBpZiB3ZSBoYXZlCiAgICAgICoKICAgICAgKiAgIC0gYSBoaW50ZXIgbW9kdWxlLAotICAgICAqICAgLSBhIHNjYWxhYmxlIGZvbnQgZm9ybWF0IGRlYWxpbmcgd2l0aCBvdXRsaW5lcywKKyAgICAgKiAgIC0gYSBzY2FsYWJsZSBmb250LAogICAgICAqICAgLSBub3QgYSB0cmlja3kgZm9udCwgYW5kCiAgICAgICogICAtIG5vIHRyYW5zZm9ybXMgZXhjZXB0IHNpbXBsZSBzbGFudHMgYW5kL29yIHJvdGF0aW9ucyBieQogICAgICAqICAgICBpbnRlZ2VyIG11bHRpcGxlcyBvZiA5MCBkZWdyZWVzLgpAQCAtODI1LDggKzg2MSw3IEBACiAgICAgaWYgKCBoaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgKSAgICAgICAgICAgICAmJgogICAgICAgICAgISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fQVVUT0hJTlQgKSAgICAgICAgICAgICYmCi0gICAgICAgICBGVF9EUklWRVJfSVNfU0NBTEFCTEUoIGRyaXZlciApICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSAgICAgICAgICAgICAgICAmJgorICAgICAgICAgRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAhRlRfSVNfVFJJQ0tZKCBmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNICkgICAgfHwKICAgICAgICAgICAgKCBmYWNlLT5pbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eCA9PSAwICYmCkBAIC04NDYsNyArODgxLDcgQEAKICAgICAgICAgLyogb25seSB0aGUgbmV3IEFkb2JlIGVuZ2luZSAoZm9yIGJvdGggQ0ZGIGFuZCBUeXBlIDEpIGlzIGBsaWdodCc7ICovCiAgICAgICAgIC8qIHdlIHVzZSBgc3Ryc3RyJyB0byBjYXRjaCBib3RoIGBUeXBlIDEnIGFuZCBgQ0lEIFR5cGUgMScgICAgICAgICAqLwogICAgICAgICBpc19saWdodF90eXBlMSA9Ci0gICAgICAgICAgZnRfc3Ryc3RyKCBGVF9HZXRfRm9udF9Gb3JtYXQoIGZhY2UgKSwgIlR5cGUgMSIgKSAhPSBOVUxMICAgJiYKKyAgICAgICAgICBmdF9zdHJzdHIoIEZUX0dldF9Gb250X0Zvcm1hdCggZmFjZSApLCAiVHlwZSAxIiApICE9IE5VTEwgJiYKICAgICAgICAgICAoKFBTX0RyaXZlcilkcml2ZXIpLT5oaW50aW5nX2VuZ2luZSA9PSBGVF9ISU5USU5HX0FET0JFOwogCiAgICAgICAgIC8qIHRoZSBjaGVjayBmb3IgYG51bV9sb2NhdGlvbnMnIGFzc3VyZXMgdGhhdCB3ZSBhY3R1YWxseSAgICAqLwpAQCAtOTI2LDggKzk2MSw5IEBACiAKICNpZmRlZiBHUklEX0ZJVF9NRVRSSUNTCiAgICAgICAgIGlmICggISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApICkKLSAgICAgICAgICBmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcyggc2xvdCwKLSAgICAgICAgICAgICAgRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkgKTsKKyAgICAgICAgICBmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcygKKyAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKSApOwogI2VuZGlmCiAgICAgICB9CiAgICAgfQpAQCAtOTk1LDYgKzEwMzEsOSBAQAogICAgICAgfQogICAgIH0KIAorICAgIHNsb3QtPmdseXBoX2luZGV4ICAgICAgICAgID0gZ2x5cGhfaW5kZXg7CisgICAgc2xvdC0+aW50ZXJuYWwtPmxvYWRfZmxhZ3MgPSBsb2FkX2ZsYWdzOworCiAgICAgLyogZG8gd2UgbmVlZCB0byByZW5kZXIgdGhlIGltYWdlIG9yIHByZXNldCB0aGUgYml0bWFwIG5vdz8gKi8KICAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCAgICAmJgpAQCAtMTAxNCwxNyArMTA1Myw0MCBAQAogICAgICAgICBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCggc2xvdCwgbW9kZSwgTlVMTCApOwogICAgIH0KIAotICAgIEZUX1RSQUNFNSgoICJGVF9Mb2FkX0dseXBoOiBpbmRleCAlZCwgZmxhZ3MgJXhcbiIsCi0gICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgICAgICAgICAgICAgICApKTsKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgIEZUX1RSQUNFNSgoICJGVF9Mb2FkX0dseXBoOiBpbmRleCAlZCwgZmxhZ3MgMHgleFxuIiwKKyAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApKTsKICAgICBGVF9UUkFDRTUoKCAiICB4IGFkdmFuY2U6ICVmXG4iLCBzbG90LT5hZHZhbmNlLnggLyA2NC4wICkpOwogICAgIEZUX1RSQUNFNSgoICIgIHkgYWR2YW5jZTogJWZcbiIsIHNsb3QtPmFkdmFuY2UueSAvIDY0LjAgKSk7CiAgICAgRlRfVFJBQ0U1KCggIiAgbGluZWFyIHggYWR2YW5jZTogJWZcbiIsCiAgICAgICAgICAgICAgICAgc2xvdC0+bGluZWFySG9yaUFkdmFuY2UgLyA2NTUzNi4wICkpOwogICAgIEZUX1RSQUNFNSgoICIgIGxpbmVhciB5IGFkdmFuY2U6ICVmXG4iLAogICAgICAgICAgICAgICAgIHNsb3QtPmxpbmVhclZlcnRBZHZhbmNlIC8gNjU1MzYuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBiaXRtYXAgJWR4JWQsIG1vZGUgJWRcbiIsCi0gICAgICAgICAgICAgICAgc2xvdC0+Yml0bWFwLndpZHRoLCBzbG90LT5iaXRtYXAucm93cywKLSAgICAgICAgICAgICAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSAgICAgICAgICAgICAgICkpOworICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7CisgICAgRlRfVFJBQ0U1KCggIiAgYml0bWFwICVkeCVkLCAlcyAobW9kZSAlZClcbiIsCisgICAgICAgICAgICAgICAgc2xvdC0+Yml0bWFwLndpZHRoLAorICAgICAgICAgICAgICAgIHNsb3QtPmJpdG1hcC5yb3dzLAorICAgICAgICAgICAgICAgIHBpeGVsX21vZGVzW3Nsb3QtPmJpdG1hcC5waXhlbF9tb2RlXSwKKyAgICAgICAgICAgICAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSApKTsKKyAgICBGVF9UUkFDRTUoKCAiXG4iICkpOworCisgICAgeworICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmc2xvdC0+bWV0cmljczsKKworCisgICAgICBGVF9UUkFDRTUoKCAiICBtZXRyaWNzOlxuIiApKTsKKyAgICAgIEZUX1RSQUNFNSgoICIgICAgd2lkdGg6ICAlZlxuIiwgbWV0cmljcy0+d2lkdGggIC8gNjQuMCApKTsKKyAgICAgIEZUX1RSQUNFNSgoICIgICAgaGVpZ2h0OiAlZlxuIiwgbWV0cmljcy0+aGVpZ2h0IC8gNjQuMCApKTsKKyAgICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7CisgICAgICBGVF9UUkFDRTUoKCAiICAgIGhvcmlCZWFyaW5nWDogJWZcbiIsIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCAvIDY0LjAgKSk7CisgICAgICBGVF9UUkFDRTUoKCAiICAgIGhvcmlCZWFyaW5nWTogJWZcbiIsIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSAvIDY0LjAgKSk7CisgICAgICBGVF9UUkFDRTUoKCAiICAgIGhvcmlBZHZhbmNlOiAgJWZcbiIsIG1ldHJpY3MtPmhvcmlBZHZhbmNlICAvIDY0LjAgKSk7CisgICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOworICAgICAgRlRfVFJBQ0U1KCggIiAgICB2ZXJ0QmVhcmluZ1g6ICVmXG4iLCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggLyA2NC4wICkpOworICAgICAgRlRfVFJBQ0U1KCggIiAgICB2ZXJ0QmVhcmluZ1k6ICVmXG4iLCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgLyA2NC4wICkpOworICAgICAgRlRfVFJBQ0U1KCggIiAgICB2ZXJ0QWR2YW5jZTogICVmXG4iLCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgLyA2NC4wICkpOworICAgIH0KKyNlbmRpZgogCiAgIEV4aXQ6CiAgICAgcmV0dXJuIGVycm9yOwpAQCAtMTE2MiwyMCArMTIyNCwyMCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaW5kX3VuaWNvZGVfY2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGZpbmRzIGEgVW5pY29kZSBjaGFybWFwLCBpZiB0aGVyZSBpcyBvbmUuICAgICAgICAgICAgKi8KLSAgLyogICAgQW5kIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUsIGl0IHRyaWVzIHRvIGZhdm91ciB0aGUgbW9yZSAgICAgICAgICovCi0gIC8qICAgIGV4dGVuc2l2ZSBvbmUsIGkuZS4sIG9uZSB0aGF0IHN1cHBvcnRzIFVDUy00IGFnYWluc3QgdGhvc2Ugd2hpY2ggICAqLwotICAvKiAgICBhcmUgbGltaXRlZCB0byB0aGUgQk1QIChzYWlkIFVDUy0yIGVuY29kaW5nLikgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3Blbl9mYWNlKCkgKGp1c3QgYmVsb3cpLCBhbmQgYWxzbyAgICAqLwotICAvKiAgICBmcm9tIEZUX1NlbGVjdF9DaGFybWFwKCAuLi4sIEZUX0VOQ09ESU5HX1VOSUNPREUgKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgZmluZF91bmljb2RlX2NoYXJtYXAKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBVbmljb2RlIGNoYXJtYXAsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICogICBBbmQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgaXQgdHJpZXMgdG8gZmF2b3VyIHRoZSBtb3JlCisgICAqICAgZXh0ZW5zaXZlIG9uZSwgaS5lLiwgb25lIHRoYXQgc3VwcG9ydHMgVUNTLTQgYWdhaW5zdCB0aG9zZSB3aGljaAorICAgKiAgIGFyZSBsaW1pdGVkIHRvIHRoZSBCTVAgKHNhaWQgVUNTLTIgZW5jb2RpbmcuKQorICAgKgorICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gb3Blbl9mYWNlKCkgKGp1c3QgYmVsb3cpLCBhbmQgYWxzbworICAgKiAgIGZyb20gRlRfU2VsZWN0X0NoYXJtYXAoIC4uLiwgRlRfRU5DT0RJTkdfVU5JQ09ERSApLgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIGZpbmRfdW5pY29kZV9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKICAgewpAQCAtMTE5MiwyNiArMTI1NCwyNiBAQAogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7CiAKICAgICAvKgotICAgICAqICBUaGUgb3JpZ2luYWwgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbihzKSBvbmx5IHNwZWNpZmllZCBjaGFybWFwCi0gICAgICogIGZvcm1hdHMgdGhhdCBhcmUgY2FwYWJsZSBvZiBtYXBwaW5nIDggb3IgMTYgYml0IGNoYXJhY3RlciBjb2RlcyB0bwotICAgICAqICBnbHlwaCBpbmRpY2VzLgorICAgICAqIFRoZSBvcmlnaW5hbCBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uKHMpIG9ubHkgc3BlY2lmaWVkIGNoYXJtYXAKKyAgICAgKiBmb3JtYXRzIHRoYXQgYXJlIGNhcGFibGUgb2YgbWFwcGluZyA4IG9yIDE2IGJpdCBjaGFyYWN0ZXIgY29kZXMgdG8KKyAgICAgKiBnbHlwaCBpbmRpY2VzLgogICAgICAqCi0gICAgICogIEhvd2V2ZXIsIHJlY2VudCB1cGRhdGVzIHRvIHRoZSBBcHBsZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMKLSAgICAgKiAgaW50cm9kdWNlZCBuZXcgZm9ybWF0cyB0aGF0IGFyZSBjYXBhYmxlIG9mIG1hcHBpbmcgMzItYml0IGNoYXJhY3RlcgotICAgICAqICBjb2RlcyBhcyB3ZWxsLiAgQW5kIHRoZXNlIGFyZSBhbHJlYWR5IHVzZWQgb24gc29tZSBmb250cywgbWFpbmx5IHRvCi0gICAgICogIG1hcCBub24tQk1QIEFzaWFuIGlkZW9ncmFwaHMgYXMgZGVmaW5lZCBpbiBVbmljb2RlLgorICAgICAqIEhvd2V2ZXIsIHJlY2VudCB1cGRhdGVzIHRvIHRoZSBBcHBsZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMKKyAgICAgKiBpbnRyb2R1Y2VkIG5ldyBmb3JtYXRzIHRoYXQgYXJlIGNhcGFibGUgb2YgbWFwcGluZyAzMi1iaXQgY2hhcmFjdGVyCisgICAgICogY29kZXMgYXMgd2VsbC4gIEFuZCB0aGVzZSBhcmUgYWxyZWFkeSB1c2VkIG9uIHNvbWUgZm9udHMsIG1haW5seSB0bworICAgICAqIG1hcCBub24tQk1QIEFzaWFuIGlkZW9ncmFwaHMgYXMgZGVmaW5lZCBpbiBVbmljb2RlLgogICAgICAqCi0gICAgICogIEZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLCB0aGVzZSBmb250cyBnZW5lcmFsbHkgY29tZSB3aXRoCi0gICAgICogICpzZXZlcmFsKiBVbmljb2RlIGNoYXJtYXBzOgorICAgICAqIEZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLCB0aGVzZSBmb250cyBnZW5lcmFsbHkgY29tZSB3aXRoCisgICAgICogKnNldmVyYWwqIFVuaWNvZGUgY2hhcm1hcHM6CiAgICAgICoKLSAgICAgKiAgIC0gT25lIG9mIHRoZW0gaW4gdGhlICJvbGQiIDE2LWJpdCBmb3JtYXQsIHRoYXQgY2Fubm90IGFjY2VzcwotICAgICAqICAgICBhbGwgZ2x5cGhzIGluIHRoZSBmb250LgorICAgICAqIC0gT25lIG9mIHRoZW0gaW4gdGhlICJvbGQiIDE2LWJpdCBmb3JtYXQsIHRoYXQgY2Fubm90IGFjY2VzcworICAgICAqICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4KICAgICAgKgotICAgICAqICAgLSBBbm90aGVyIG9uZSBpbiB0aGUgIm5ldyIgMzItYml0IGZvcm1hdCwgdGhhdCBjYW4gYWNjZXNzIGFsbAotICAgICAqICAgICB0aGUgZ2x5cGhzLgorICAgICAqIC0gQW5vdGhlciBvbmUgaW4gdGhlICJuZXciIDMyLWJpdCBmb3JtYXQsIHRoYXQgY2FuIGFjY2VzcyBhbGwKKyAgICAgKiAgIHRoZSBnbHlwaHMuCiAgICAgICoKLSAgICAgKiAgVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIHRvIGFsd2F5cyBmYXZvciBhIDMyLWJpdCBjaGFybWFwCi0gICAgICogIHdoZW4gZm91bmQuICBPdGhlcndpc2UsIGEgMTYtYml0IG9uZSBpcyByZXR1cm5lZCB3aGVuIGZvdW5kLgorICAgICAqIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiB0byBhbHdheXMgZmF2b3IgYSAzMi1iaXQgY2hhcm1hcAorICAgICAqIHdoZW4gZm91bmQuICBPdGhlcndpc2UsIGEgMTYtYml0IG9uZSBpcyByZXR1cm5lZCB3aGVuIGZvdW5kLgogICAgICAqLwogCiAgICAgLyogU2luY2UgdGhlIGBpbnRlcmVzdGluZycgdGFibGUsIHdpdGggSURzICgzLDEwKSwgaXMgbm9ybWFsbHkgdGhlICovCkBAIC0xMjU1LDE1ICsxMzE3LDE1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHZhcmlhbnQgc2VsZWN0b3IgY2hhcm1hcCwgaWYgdGhlcmUgaXMgb25lLiAqLwotICAvKiAgICBUaGVyZSBjYW4gb25seSBiZSBvbmUgKHBsYXRmb3JtPTAsIHNwZWNpZmljPTUsIGZvcm1hdD0xNCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHZhcmlhbnQgc2VsZWN0b3IgY2hhcm1hcCwgaWYgdGhlcmUgaXMgb25lLgorICAgKiAgIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSAocGxhdGZvcm09MCwgc3BlY2lmaWM9NSwgZm9ybWF0PTE0KS4KKyAgICovCiAgIHN0YXRpYyBGVF9DaGFyTWFwCiAgIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKICAgewpAQCAtMTI5NCwxNCArMTM1NiwxNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvcGVuX2ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgc29tZSB3b3JrIGZvciBGVF9PcGVuX0ZhY2UoKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgb3Blbl9mYWNlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGRvZXMgc29tZSB3b3JrIGZvciBGVF9PcGVuX0ZhY2UoKS4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICBvcGVuX2ZhY2UoIEZUX0RyaXZlciAgICAgIGRyaXZlciwKICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAqYXN0cmVhbSwKQEAgLTE3OTgsMTUgKzE4NjAsMTUgQEAKICAgICAgIC8qIEZUMiBhbGxvY2F0b3IgdGFrZXMgc2lnbmVkIGxvbmcgYnVmZmVyIGxlbmd0aCwKICAgICAgICAqIHRvbyBsYXJnZSB2YWx1ZSBjYXVzaW5nIG92ZXJmbG93IHNob3VsZCBiZSBjaGVja2VkCiAgICAgICAgKi8KLSAgICAgIEZUX1RSQUNFNCgoICIgICAgICAgICAgICAgICAgIFBPU1QgZnJhZ21lbnQgIyVkOiBsZW5ndGg9MHglMDh4IgotICAgICAgICAgICAgICAgICAgIiB0b3RhbCBwZmJfbGVuPTB4JTA4eFxuIiwKKyAgICAgIEZUX1RSQUNFNCgoICIgICAgICAgICAgICAgICAgIFBPU1QgZnJhZ21lbnQgIyVkOiBsZW5ndGg9MHglMDhseCIKKyAgICAgICAgICAgICAgICAgICIgdG90YWwgcGZiX2xlbj0weCUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaSwgdGVtcCwgcGZiX2xlbiArIHRlbXAgKyA2ICkpOwogCiAgICAgICBpZiAoIEZUX01BQ19SRk9SS19NQVhfTEVOIDwgdGVtcCAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgIEZUX01BQ19SRk9SS19NQVhfTEVOIC0gdGVtcCA8IHBmYl9sZW4gKyA2ICkKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UyKCggIiAgICAgICAgICAgICBNYWNPUyByZXNvdXJjZSBsZW5ndGggY2Fubm90IGV4Y2VlZCIKLSAgICAgICAgICAgICAgICAgICAgIiAweCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICIgMHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgRlRfTUFDX1JGT1JLX01BWF9MRU4gKSk7CiAKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PZmZzZXQgKTsKQEAgLTE4MTcsMTMgKzE4NzksMTMgQEAKICAgICB9CiAKICAgICBGVF9UUkFDRTIoKCAiICAgICAgICAgICAgIHRvdGFsIGJ1ZmZlciBzaXplIHRvIGNvbmNhdGVuYXRlIgotICAgICAgICAgICAgICAgICIgJWQgUE9TVCBmcmFnbWVudHM6IDB4JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAiICVsZCBQT1NUIGZyYWdtZW50czogMHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfY250LCBwZmJfbGVuICsgMiApKTsKIAogICAgIGlmICggcGZiX2xlbiArIDIgPCA2ICkKICAgICB7CiAgICAgICBGVF9UUkFDRTIoKCAiICAgICAgICAgICAgIHRvbyBsb25nIGZyYWdtZW50IGxlbmd0aCBtYWtlcyIKLSAgICAgICAgICAgICAgICAgICIgcGZiX2xlbiBjb25mdXNlZDogcGZiX2xlbj0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAiIHBmYl9sZW4gY29uZnVzZWQ6IHBmYl9sZW49MHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIHBmYl9sZW4gKSk7CiAKICAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwpAQCAtMTg2Niw3ICsxOTI4LDcgQEAKICAgICAgICAgZ290byBFeGl0MjsKIAogICAgICAgRlRfVFJBQ0UzKCggIlBPU1QgZnJhZ21lbnRbJWRdOiIKLSAgICAgICAgICAgICAgICAgICIgb2Zmc2V0cz0weCUwOHgsIHJsZW49MHglMDh4LCBmbGFncz0weCUwNHhcbiIsCisgICAgICAgICAgICAgICAgICAiIG9mZnNldHM9MHglMDhseCwgcmxlbj0weCUwOGx4LCBmbGFncz0weCUwNHhcbiIsCiAgICAgICAgICAgICAgICAgICBpLCBvZmZzZXRzW2ldLCBybGVuLCBmbGFncyApKTsKIAogICAgICAgZXJyb3IgPSBGVF9FUlIoIEFycmF5X1Rvb19MYXJnZSApOwpAQCAtMTg5Myw3ICsxOTU1LDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UzKCggIiAgICBXcml0ZSBQT1NUIGZyYWdtZW50ICMlZCBoZWFkZXIgKDQtYnl0ZSkgdG8gYnVmZmVyIgotICAgICAgICAgICAgICAgICAgICAiICVwICsgMHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAiICVwICsgMHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgaSwgcGZiX2RhdGEsIHBmYl9sZW5wb3MgKSk7CiAKICAgICAgICAgaWYgKCBwZmJfbGVucG9zICsgMyA+IHBmYl9sZW4gKyAyICkKQEAgLTE5MDgsNyArMTk3MCw3IEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgRlRfVFJBQ0UzKCggIiAgICBXcml0ZSBQT1NUIGZyYWdtZW50ICMlZCBoZWFkZXIgKDYtYnl0ZSkgdG8gYnVmZmVyIgotICAgICAgICAgICAgICAgICAgICAiICVwICsgMHglMDh4XG4iLAorICAgICAgICAgICAgICAgICAgICAiICVwICsgMHglMDhseFxuIiwKICAgICAgICAgICAgICAgICAgICAgaSwgcGZiX2RhdGEsIHBmYl9wb3MgKSk7CiAKICAgICAgICAgaWYgKCBwZmJfcG9zICsgNiA+IHBmYl9sZW4gKyAyICkKQEAgLTE5MzAsOCArMTk5Miw4IEBACiAgICAgICBpZiAoIHBmYl9wb3MgPiBwZmJfbGVuIHx8IHBmYl9wb3MgKyBybGVuID4gcGZiX2xlbiApCiAgICAgICAgIGdvdG8gRXhpdDI7CiAKLSAgICAgIEZUX1RSQUNFMygoICIgICAgTG9hZCBQT1NUIGZyYWdtZW50ICMlZCAoJWQgYnl0ZSkgdG8gYnVmZmVyIgotICAgICAgICAgICAgICAgICAgIiAlcCArIDB4JTA4eFxuIiwKKyAgICAgIEZUX1RSQUNFMygoICIgICAgTG9hZCBQT1NUIGZyYWdtZW50ICMlZCAoJWxkIGJ5dGUpIHRvIGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgICIgJXAgKyAweCUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaSwgcmxlbiwgcGZiX2RhdGEsIHBmYl9wb3MgKSk7CiAKICAgICAgIGVycm9yID0gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgKEZUX0J5dGUgKilwZmJfZGF0YSArIHBmYl9wb3MsIHJsZW4gKTsKQEAgLTIxNzYsMTMgKzIyMzgsMTMgQEAKICAgewogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3JhY2Nlc3MKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICByYWNjZXNzCiAKICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKICAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwogICAgIEZUX1VJbnQgICAgaTsKIAotICAgIGNoYXIgKiAgICAgZmlsZV9uYW1lc1tGVF9SQUNDRVNTX05fUlVMRVNdOworICAgIGNoYXIqICAgICAgZmlsZV9uYW1lc1tGVF9SQUNDRVNTX05fUlVMRVNdOwogICAgIEZUX0xvbmcgICAgb2Zmc2V0c1tGVF9SQUNDRVNTX05fUlVMRVNdOwogICAgIEZUX0Vycm9yICAgZXJyb3JzW0ZUX1JBQ0NFU1NfTl9SVUxFU107CiAgICAgRlRfQm9vbCAgICBpc19kYXJ3aW5fdmZzLCB2ZnNfcmZvcmtfaGFzX25vX2ZvbnQgPSBGQUxTRTsgLyogbm90IHRlc3RlZCAqLwpAQCAtMjIxNiw3ICsyMjc4LDcgQEAKICAgICAgIGFyZ3MyLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKICAgICAgIGFyZ3MyLnBhdGhuYW1lID0gZmlsZV9uYW1lc1tpXSA/IGZpbGVfbmFtZXNbaV0gOiBhcmdzLT5wYXRobmFtZTsKIAotICAgICAgRlRfVFJBQ0UzKCggIlRyeSBydWxlICVkOiAlcyAob2Zmc2V0PSVkKSAuLi4iLAorICAgICAgRlRfVFJBQ0UzKCggIlRyeSBydWxlICVkOiAlcyAob2Zmc2V0PSVsZCkgLi4uIiwKICAgICAgICAgICAgICAgICAgIGksIGFyZ3MyLnBhdGhuYW1lLCBvZmZzZXRzW2ldICkpOwogCiAgICAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGxpYnJhcnksICZhcmdzMiwgJnN0cmVhbTIgKTsKQEAgLTIyNTQsNyArMjMxNiw3IEBACiAgICAgcmV0dXJuIGVycm9yOwogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX29ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvYmpzCiAKICAgfQogCkBAIC0yMjgyLDcgKzIzNDQsNyBAQAogICAgIHsKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcmFjY2VzcwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKICAgICAgIEZUX1RSQUNFMygoICJUcnkgYXMgZGZvbnQ6ICIgKSk7CkBAIC0yMjk1LDcgKzIzNTcsNyBAQAogICAgICAgRlRfVFJBQ0UzKCggIiVzXG4iLCBlcnJvciA/ICJmYWlsZWQiIDogInN1Y2Nlc3NmdWwiICkpOwogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX29ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvYmpzCiAKICAgICB9CiAKQEAgLTI2OTMsOCArMjc1NSw4IEBACiAKICAgICAvKiBjbG9zZSB0aGUgYXR0YWNoZWQgc3RyZWFtICovCiAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX0Jvb2wpKCBwYXJhbWV0ZXJzLT5zdHJlYW0gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHBhcmFtZXRlcnMtPmZsYWdzICYgRlRfT1BFTl9TVFJFQU0gKSApICk7CisgICAgICAgICAgICAgICAgICAgIEZUX0JPT0woIHBhcmFtZXRlcnMtPnN0cmVhbSAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggcGFyYW1ldGVycy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICkgKTsKIAogICBFeGl0OgogICAgIHJldHVybiBlcnJvcjsKQEAgLTI4MTQsNiArMjg3Niw4IEBACiAgICAgaWYgKCBlcnJvciApCiAgICAgewogICAgICAgRlRfRlJFRSggbm9kZSApOworICAgICAgaWYgKCBzaXplICkKKyAgICAgICAgRlRfRlJFRSggc2l6ZS0+aW50ZXJuYWwgKTsKICAgICAgIEZUX0ZSRUUoIHNpemUgKTsKICAgICB9CiAKQEAgLTMxNjksOSArMzIzMyw5IEBACiAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7CiAKIAotICAgICAgRlRfVFJBQ0U1KCggIiAgeCBzY2FsZTogJWQgKCVmKVxuIiwKKyAgICAgIEZUX1RSQUNFNSgoICIgIHggc2NhbGU6ICVsZCAoJWYpXG4iLAogICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSwgbWV0cmljcy0+eF9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgICBGVF9UUkFDRTUoKCAiICB5IHNjYWxlOiAlZCAoJWYpXG4iLAorICAgICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWxkICglZilcbiIsCiAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlLCBtZXRyaWNzLT55X3NjYWxlIC8gNjU1MzYuMCApKTsKICAgICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwogICAgICAgRlRfVFJBQ0U1KCggIiAgZGVzY2VuZGVyOiAlZlxuIiwgICBtZXRyaWNzLT5kZXNjZW5kZXIgLyA2NC4wICkpOwpAQCAtMzI0NCw5ICszMzA4LDkgQEAKICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmZmFjZS0+c2l6ZS0+bWV0cmljczsKIAogCi0gICAgICBGVF9UUkFDRTUoKCAiICB4IHNjYWxlOiAlZCAoJWYpXG4iLAorICAgICAgRlRfVFJBQ0U1KCggIiAgeCBzY2FsZTogJWxkICglZilcbiIsCiAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICAgIEZUX1RSQUNFNSgoICIgIHkgc2NhbGU6ICVkICglZilcbiIsCisgICAgICBGVF9UUkFDRTUoKCAiICB5IHNjYWxlOiAlbGQgKCVmKVxuIiwKICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUsIG1ldHJpY3MtPnlfc2NhbGUgLyA2NTUzNi4wICkpOwogICAgICAgRlRfVFJBQ0U1KCggIiAgYXNjZW5kZXI6ICVmXG4iLCAgICBtZXRyaWNzLT5hc2NlbmRlciAvIDY0LjAgKSk7CiAgICAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7CkBAIC0zNDA2LDcgKzM0NzAsNyBAQAogICAgICAgICAgICAgICBpZiAoIGFrZXJuaW5nLT54ICE9IG9yaWdfeF9yb3VuZGVkIHx8CiAgICAgICAgICAgICAgICAgICAgYWtlcm5pbmctPnkgIT0gb3JpZ195X3JvdW5kZWQgKQogICAgICAgICAgICAgICAgIEZUX1RSQUNFNSgoICJGVF9HZXRfS2VybmluZzogaG9yaXpvbnRhbCBrZXJuaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCVkLCAlZCkgc2NhbGVkIGRvd24gdG8gKCVkLCAlZCkgcGl4ZWxzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCVsZCwgJWxkKSBzY2FsZWQgZG93biB0byAoJWxkLCAlbGQpIHBpeGVsc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX3hfcm91bmRlZCAvIDY0LCBvcmlnX3lfcm91bmRlZCAvIDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFrZXJuaW5nLT54IC8gNjQsIGFrZXJuaW5nLT55IC8gNjQgKSk7CiAgICAgICAgICAgICB9CkBAIC0zNDY0LDcgKzM1MjgsOCBAQAogICAgIGlmICggIWZhY2UgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7CiAKLSAgICBpZiAoIGVuY29kaW5nID09IEZUX0VOQ09ESU5HX05PTkUgKQorICAgIC8qIEZUX0VOQ09ESU5HX05PTkUgaXMgYSB2YWxpZCBlbmNvZGluZyBmb3IgQkRGLCBQQ0YsIGFuZCBXaW5kb3dzIEZOVCAqLworICAgIGlmICggZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfTk9ORSAmJiAhZmFjZS0+bnVtX2NoYXJtYXBzICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogCiAgICAgLyogRlRfRU5DT0RJTkdfVU5JQ09ERSBpcyBzcGVjaWFsLiAgV2UgdHJ5IHRvIGZpbmQgdGhlIGBiZXN0JyBVbmljb2RlICovCkBAIC0zNDg1LDcgKzM1NTAsNyBAQAogICAgICAgaWYgKCBjdXJbMF0tPmVuY29kaW5nID09IGVuY29kaW5nICkKICAgICAgIHsKICAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IGN1clswXTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CiAgICAgICB9CiAgICAgfQogCkBAIC0zNTEwLDE0ICszNTc1LDEyIEBACiAgICAgaWYgKCAhY3VyIHx8ICFjaGFybWFwICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9DaGFyTWFwX0hhbmRsZSApOwogCi0gICAgaWYgKCBGVF9HZXRfQ01hcF9Gb3JtYXQoIGNoYXJtYXAgKSA9PSAxNCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQogICAgIGxpbWl0ID0gY3VyICsgZmFjZS0+bnVtX2NoYXJtYXBzOwogCiAgICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQogICAgIHsKLSAgICAgIGlmICggY3VyWzBdID09IGNoYXJtYXAgKQorICAgICAgaWYgKCBjdXJbMF0gPT0gY2hhcm1hcCAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgRlRfR2V0X0NNYXBfRm9ybWF0ICggY2hhcm1hcCApICE9IDE0ICkKICAgICAgIHsKICAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IGN1clswXTsKICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKQEAgLTM2NzksNyArMzc0Miw3IEBACiAgICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0dldF9DaGFyX0luZGV4OiB0b28gbGFyZ2UgY2hhcmNvZGUiICkpOwotICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKKyAgICAgICAgRlRfVFJBQ0UxKCggIiAweCVseCBpcyB0cnVuY2F0ZWRcbiIsIGNoYXJjb2RlICkpOwogICAgICAgfQogCiAgICAgICByZXN1bHQgPSBjbWFwLT5jbGF6ei0+Y2hhcl9pbmRleCggY21hcCwgKEZUX1VJbnQzMiljaGFyY29kZSApOwpAQCAtMzg1NSwxMyArMzkxOCwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleDoiCiAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2UgY2hhcmNvZGUiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIGNoYXJjb2RlICkpOworICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHglbHggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIHZhcmlhbnRTZWxlY3RvciA+IDB4RkZGRkZGRkZVTCApCiAgICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTEoKCAiRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4OiIKICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSB2YXJpYW50U2VsZWN0b3IiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIHZhcmlhbnRTZWxlY3RvciApKTsKKyAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JWx4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOwogICAgICAgICB9CiAKICAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT5jaGFyX3Zhcl9pbmRleCggdmNtYXAsIHVjbWFwLApAQCAtMzg5OCwxMyArMzk2MSwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQ6IgogICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKKyAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JWx4IGlzIHRydW5jYXRlZFxuIiwgY2hhcmNvZGUgKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCB2YXJpYW50U2VsZWN0b3IgPiAweEZGRkZGRkZGVUwgKQogICAgICAgICB7CiAgICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJc0RlZmF1bHQ6IgogICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIHZhcmlhbnRTZWxlY3RvciIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOworICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHglbHggaXMgdHJ1bmNhdGVkXG4iLCB2YXJpYW50U2VsZWN0b3IgKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPmNoYXJfdmFyX2RlZmF1bHQoIHZjbWFwLApAQCAtMzk2Nyw3ICs0MDMwLDcgQEAKICAgICAgICAgaWYgKCBjaGFyY29kZSA+IDB4RkZGRkZGRkZVTCApCiAgICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTEoKCAiRlRfRmFjZV9HZXRWYXJpYW50c09mQ2hhcjogdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKKyAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JWx4IGlzIHRydW5jYXRlZFxuIiwgY2hhcmNvZGUgKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXN1bHQgPSB2Y21hcC0+Y2xhenotPmNoYXJ2YXJpYW50X2xpc3QoIHZjbWFwLCBtZW1vcnksCkBAIC00MDAxLDcgKzQwNjQsNyBAQAogICAgICAgICBpZiAoIHZhcmlhbnRTZWxlY3RvciA+IDB4RkZGRkZGRkZVTCApCiAgICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTEoKCAiRlRfR2V0X0NoYXJfSW5kZXg6IHRvbyBsYXJnZSB2YXJpYW50U2VsZWN0b3IiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIHZhcmlhbnRTZWxlY3RvciApKTsKKyAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JWx4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOwogICAgICAgICB9CiAKICAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT52YXJpYW50Y2hhcl9saXN0KCB2Y21hcCwgbWVtb3J5LApAQCAtNDAxNiw4ICs0MDc5LDggQEAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCiAKICAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCisgIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCiAgIHsKICAgICBGVF9VSW50ICByZXN1bHQgPSAwOwogCkBAIC00NDg3LDE2ICs0NTUwLDg5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlICkKICAgewogICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKKyAgICBGVF9GYWNlICAgICAgZmFjZSAgPSBzbG90LT5mYWNlOwogICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKIAogCi0gICAgLyogaWYgaXQgaXMgYWxyZWFkeSBhIGJpdG1hcCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLwogICAgIHN3aXRjaCAoIHNsb3QtPmZvcm1hdCApCiAgICAgewogICAgIGNhc2UgRlRfR0xZUEhfRk9STUFUX0JJVE1BUDogICAvKiBhbHJlYWR5IGEgYml0bWFwLCBkb24ndCBkbyBhbnl0aGluZyAqLwogICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgorICAgICAgaWYgKCBzbG90LT5pbnRlcm5hbC0+bG9hZF9mbGFncyAmIEZUX0xPQURfQ09MT1IgKQorICAgICAgeworICAgICAgICBGVF9MYXllckl0ZXJhdG9yICBpdGVyYXRvcjsKKworICAgICAgICBGVF9VSW50ICBiYXNlX2dseXBoID0gc2xvdC0+Z2x5cGhfaW5kZXg7CisKKyAgICAgICAgRlRfQm9vbCAgaGF2ZV9sYXllcnM7CisgICAgICAgIEZUX1VJbnQgIGdseXBoX2luZGV4OworICAgICAgICBGVF9VSW50ICBjb2xvcl9pbmRleDsKKworCisgICAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBjb2xvcmVkIGdseXBoIGxheWVycyAqLworICAgICAgICBpdGVyYXRvci5wICA9IE5VTEw7CisgICAgICAgIGhhdmVfbGF5ZXJzID0gRlRfR2V0X0NvbG9yX0dseXBoX0xheWVyKCBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYXRvciApOworICAgICAgICBpZiAoIGhhdmVfbGF5ZXJzICkKKyAgICAgICAgeworICAgICAgICAgIGVycm9yID0gRlRfTmV3X0dseXBoU2xvdCggZmFjZSwgTlVMTCApOworICAgICAgICAgIGlmICggIWVycm9yICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBUVF9GYWNlICAgICAgIHR0ZmFjZSA9IChUVF9GYWNlKWZhY2U7CisgICAgICAgICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50OworCisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0ludDMyICBsb2FkX2ZsYWdzID0gc2xvdC0+aW50ZXJuYWwtPmxvYWRfZmxhZ3M7CisKKworICAgICAgICAgICAgICAvKiBkaXNhYmxlIHRoZSBgRlRfTE9BRF9DT0xPUicgZmxhZyB0byBhdm9pZCByZWN1cnNpb24gKi8KKyAgICAgICAgICAgICAgLyogcmlnaHQgaGVyZSBpbiB0aGlzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgJj0gfkZUX0xPQURfQ09MT1I7CisKKyAgICAgICAgICAgICAgLyogcmVuZGVyIGludG8gdGhlIG5ldyBgZmFjZS0+Z2x5cGgnIGdseXBoIHNsb3QgKi8KKyAgICAgICAgICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX1JFTkRFUjsKKworICAgICAgICAgICAgICBlcnJvciA9IEZUX0xvYWRfR2x5cGgoIGZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7CisgICAgICAgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIC8qIGJsZW5kIG5ldyBgZmFjZS0+Z2x5cGgnIGludG8gb2xkIGBzbG90JzsgKi8KKyAgICAgICAgICAgICAgLyogYXQgdGhlIGZpcnN0IGNhbGwsIGBzbG90JyBpcyBzdGlsbCBlbXB0eSAqLworICAgICAgICAgICAgICBlcnJvciA9IHNmbnQtPmNvbHJfYmxlbmQoIHR0ZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmdseXBoICk7CisgICAgICAgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9IHdoaWxlICggRlRfR2V0X0NvbG9yX0dseXBoX0xheWVyKCBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYXRvciApICk7CisKKyAgICAgICAgICAgIGlmICggIWVycm9yICkKKyAgICAgICAgICAgICAgc2xvdC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKKworICAgICAgICAgICAgLyogdGhpcyBjYWxsIGFsc28gcmVzdG9yZXMgYHNsb3QnIGFzIHRoZSBnbHlwaCBzbG90ICovCisgICAgICAgICAgICBGVF9Eb25lX0dseXBoU2xvdCggZmFjZS0+Z2x5cGggKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoICFlcnJvciApCisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgICAvKiBGYWlsZWQgdG8gZG8gdGhlIGNvbG9yZWQgbGF5ZXIuICBEcmF3IG91dGxpbmUgaW5zdGVhZC4gKi8KKyAgICAgICAgICBzbG90LT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKKyAgICAgICAgfQorICAgICAgfQorCiAgICAgICB7CiAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlID0gTlVMTDsKIApAQCAtNDUzMiw3ICs0NjY4LDcgQEAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2JpdG1hcAorI2RlZmluZSBGVF9DT01QT05FTlQgIGNoZWNrc3VtCiAKICAgICAvKgogICAgICAqIENvbXB1dGluZyB0aGUgTUQ1IGNoZWNrc3VtIGlzIGV4cGVuc2l2ZSwgdW5uZWNlc3NhcmlseSBkaXN0b3J0aW5nIGEKQEAgLTQ1NDIsOSArNDY3OCw5IEBACiAgICAgICovCiAKICAgICAvKiB3ZSB1c2UgRlRfVFJBQ0UzIGluIHRoaXMgYmxvY2sgKi8KLSAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9iaXRtYXBdID49IDMgJiYKLSAgICAgICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgICAgICAgICAgICAgICAgKQorICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBmdF90cmFjZV9sZXZlbHNbdHJhY2VfY2hlY2tzdW1dID49IDMgJiYKKyAgICAgICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgICAgICAgICAgICAgICAgICApCiAgICAgewogICAgICAgRlRfQml0bWFwICBiaXRtYXA7CiAgICAgICBGVF9FcnJvciAgIGVycjsKQEAgLTQ1NjUsOCArNDcwMSwxMSBAQAogICAgICAgICBpbnQgICAgICAgICAgICBwaXRjaCA9IGJpdG1hcC5waXRjaDsKIAogCi0gICAgICAgIEZUX1RSQUNFMygoICJGVF9SZW5kZXJfR2x5cGg6IGJpdG1hcCAlZHglZCwgbW9kZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcm93cywgcGl0Y2gsIHNsb3QtPmJpdG1hcC5waXhlbF9tb2RlICkpOworICAgICAgICBGVF9UUkFDRTMoKCAiRlRfUmVuZGVyX0dseXBoOiBiaXRtYXAgJWR4JWQsICVzIChtb2RlICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIHJvd3MsCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX21vZGVzW3Nsb3QtPmJpdG1hcC5waXhlbF9tb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgKSk7CiAKICAgICAgICAgZm9yICggaSA9IDA7IGkgPCByb3dzOyBpKysgKQogICAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgcGl0Y2g7IGorKyApCkBAIC00NTk0LDQ5ICs0NzMzLDU2IEBACiAgICAgICovCiAKICAgICAvKiB3ZSB1c2UgRlRfVFJBQ0U3IGluIHRoaXMgYmxvY2sgKi8KLSAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9iaXRtYXBdID49IDcgJiYKLSAgICAgICAgIHNsb3QtPmJpdG1hcC5yb3dzICA8IDEyOFUgICAgICAgICAgJiYKLSAgICAgICAgIHNsb3QtPmJpdG1hcC53aWR0aCA8IDEyOFUgICAgICAgICAgJiYKLSAgICAgICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgICAgICAgICAgICAgICAgKQorICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICBmdF90cmFjZV9sZXZlbHNbdHJhY2VfY2hlY2tzdW1dID49IDcgKQogICAgIHsKLSAgICAgIGludCAgcm93cyAgPSAoaW50KXNsb3QtPmJpdG1hcC5yb3dzOwotICAgICAgaW50ICB3aWR0aCA9IChpbnQpc2xvdC0+Yml0bWFwLndpZHRoOwotICAgICAgaW50ICBwaXRjaCA9ICAgICAgc2xvdC0+Yml0bWFwLnBpdGNoOwotICAgICAgaW50ICBpLCBqLCBtOwotICAgICAgdW5zaWduZWQgY2hhciogIHRvcGxlZnQgPSBzbG90LT5iaXRtYXAuYnVmZmVyOwotCi0gICAgICBpZiAoIHBpdGNoIDwgMCApCi0gICAgICAgIHRvcGxlZnQgLT0gcGl0Y2ggKiAoIHJvd3MgLSAxICk7Ci0KLSAgICAgIEZUX1RSQUNFNygoICJOZXRwYm0gaW1hZ2U6IHN0YXJ0XG4iICkpOwotICAgICAgc3dpdGNoICggc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgKQorICAgICAgaWYgKCBzbG90LT5iaXRtYXAucm93cyAgPCAxMjhVICYmCisgICAgICAgICAgIHNsb3QtPmJpdG1hcC53aWR0aCA8IDEyOFUgJiYKKyAgICAgICAgICAgc2xvdC0+Yml0bWFwLmJ1ZmZlciAgICAgICApCiAgICAgICB7Ci0gICAgICBjYXNlIEZUX1BJWEVMX01PREVfTU9OTzoKLSAgICAgICAgRlRfVFJBQ0U3KCggIlAxICVkICVkXG4iLCB3aWR0aCwgcm93cyApKTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCByb3dzOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCB3aWR0aDsgKQotICAgICAgICAgICAgZm9yICggbSA9IDEyODsgbSA+IDAgJiYgaiA8IHdpZHRoOyBtID4+PSAxLCBqKysgKQotICAgICAgICAgICAgICBGVF9UUkFDRTcoKCAiICVkIiwgKCB0b3BsZWZ0W2kgKiBwaXRjaCArIGogLyA4XSAmIG0gKSAhPSAwICkpOwotICAgICAgICAgIEZUX1RSQUNFNygoICJcbiIgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIGludCAgcm93cyAgPSAoaW50KXNsb3QtPmJpdG1hcC5yb3dzOworICAgICAgICBpbnQgIHdpZHRoID0gKGludClzbG90LT5iaXRtYXAud2lkdGg7CisgICAgICAgIGludCAgcGl0Y2ggPSAgICAgIHNsb3QtPmJpdG1hcC5waXRjaDsKKyAgICAgICAgaW50ICBpLCBqLCBtOwogCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9UUkFDRTcoKCAiUDIgJWQgJWQgMjU1XG4iLCB3aWR0aCwgcm93cyApKTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCByb3dzOyBpKysgKQorICAgICAgICB1bnNpZ25lZCBjaGFyKiAgdG9wbGVmdCA9IHNsb3QtPmJpdG1hcC5idWZmZXI7CisKKworICAgICAgICBpZiAoIHBpdGNoIDwgMCApCisgICAgICAgICAgdG9wbGVmdCAtPSBwaXRjaCAqICggcm93cyAtIDEgKTsKKworICAgICAgICBGVF9UUkFDRTcoKCAiTmV0cGJtIGltYWdlOiBzdGFydFxuIiApKTsKKyAgICAgICAgc3dpdGNoICggc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgKQogICAgICAgICB7Ci0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCB3aWR0aDsgaiArPSAxICkKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgJTN1IiwgdG9wbGVmdFtpICogcGl0Y2ggKyBqXSApKTsKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOworICAgICAgICBjYXNlIEZUX1BJWEVMX01PREVfTU9OTzoKKyAgICAgICAgICBGVF9UUkFDRTcoKCAiUDEgJWQgJWRcbiIsIHdpZHRoLCByb3dzICkpOworICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcm93czsgaSsrICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHdpZHRoOyApCisgICAgICAgICAgICAgIGZvciAoIG0gPSAxMjg7IG0gPiAwICYmIGogPCB3aWR0aDsgbSA+Pj0gMSwgaisrICkKKyAgICAgICAgICAgICAgICBGVF9UUkFDRTcoKCAiICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHRvcGxlZnRbaSAqIHBpdGNoICsgaiAvIDhdICYgbSApICE9IDAgKSk7CisgICAgICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEZUX1RSQUNFNygoICJQMiAlZCAlZCAyNTVcbiIsIHdpZHRoLCByb3dzICkpOworICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgcm93czsgaSsrICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHdpZHRoOyBqICs9IDEgKQorICAgICAgICAgICAgICBGVF9UUkFDRTcoKCAiICUzdSIsIHRvcGxlZnRbaSAqIHBpdGNoICsgal0gKSk7CisgICAgICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBGVF9UUkFDRTcoKCAiTmV0cGJtIGltYWdlOiBlbmRcbiIgKSk7CiAgICAgICB9Ci0gICAgICBGVF9UUkFDRTcoKCAiTmV0cGJtIGltYWdlOiBlbmRcbiIgKSk7CisgICAgICBlbHNlCisgICAgICAgIEZUX1RSQUNFNygoICJOZXRwYm0gaW1hZ2U6IHRvbyBsYXJnZSwgb21pdHRlZFxuIiApKTsKICAgICB9CiAKICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb2JqcworI2RlZmluZSBGVF9DT01QT05FTlQgIG9ianMKIAogI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKQEAgLTQ2NzUsMjEgKzQ4MjEsMjIgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95X01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95cyBhIGdpdmVuIG1vZHVsZSBvYmplY3QuICBGb3IgZHJpdmVycywgdGhpcyBhbHNvIGRlc3Ryb3lzICAgKi8KLSAgLyogICAgYWxsIGNoaWxkIGZhY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRyaXZlciBfbXVzdF8gYmUgTE9DS0VEISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIERlc3Ryb3lfTW9kdWxlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBEZXN0cm95cyBhIGdpdmVuIG1vZHVsZSBvYmplY3QuICBGb3IgZHJpdmVycywgdGhpcyBhbHNvIGRlc3Ryb3lzCisgICAqICAgYWxsIGNoaWxkIGZhY2VzLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgbW9kdWxlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuCisgICAqCisgICAqIEBOb3RlOgorICAgKiAgIFRoZSBkcml2ZXIgX211c3RfIGJlIExPQ0tFRCEKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIERlc3Ryb3lfTW9kdWxlKCBGVF9Nb2R1bGUgIG1vZHVsZSApCiAgIHsKQEAgLTUwMjgsOSArNTE3NSw5IEBACiAgICAgc2VydmljZSA9IChGVF9TZXJ2aWNlX1Byb3BlcnRpZXMpaW50ZXJmYWNlOwogCiAgICAgaWYgKCBzZXQgKQotICAgICAgbWlzc2luZ19mdW5jID0gKEZUX0Jvb2wpKCAhc2VydmljZS0+c2V0X3Byb3BlcnR5ICk7CisgICAgICBtaXNzaW5nX2Z1bmMgPSBGVF9CT09MKCAhc2VydmljZS0+c2V0X3Byb3BlcnR5ICk7CiAgICAgZWxzZQotICAgICAgbWlzc2luZ19mdW5jID0gKEZUX0Jvb2wpKCAhc2VydmljZS0+Z2V0X3Byb3BlcnR5ICk7CisgICAgICBtaXNzaW5nX2Z1bmMgPSBGVF9CT09MKCAhc2VydmljZS0+Z2V0X3Byb3BlcnR5ICk7CiAKICAgICBpZiAoIG1pc3NpbmdfZnVuYyApCiAgICAgewpAQCAtNTE1NiwxMyArNTMwMyw2IEBACiAKICAgICBsaWJyYXJ5LT5tZW1vcnkgPSBtZW1vcnk7CiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIC8qIGluaXRpYWxpemUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBjb250YWluZXJzICovCi0gICAgZXJyb3IgPSBmdF9waWNfY29udGFpbmVyX2luaXQoIGxpYnJhcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLSNlbmRpZgotCiAgICAgbGlicmFyeS0+dmVyc2lvbl9tYWpvciA9IEZSRUVUWVBFX01BSk9SOwogICAgIGxpYnJhcnktPnZlcnNpb25fbWlub3IgPSBGUkVFVFlQRV9NSU5PUjsKICAgICBsaWJyYXJ5LT52ZXJzaW9uX3BhdGNoID0gRlJFRVRZUEVfUEFUQ0g7CkBAIC01MTczLDEzICs1MzEzLDYgQEAKICAgICAqYWxpYnJhcnkgPSBsaWJyYXJ5OwogCiAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gIEZhaWw6Ci0gICAgZnRfcGljX2NvbnRhaW5lcl9kZXN0cm95KCBsaWJyYXJ5ICk7Ci0gICAgRlRfRlJFRSggbGlicmFyeSApOwotICAgIHJldHVybiBlcnJvcjsKLSNlbmRpZgogICB9CiAKIApAQCAtNTIzNywxMCArNTM3MCwxMCBAQAogICAgICAqCiAgICAgICogRXhhbXBsZToKICAgICAgKgotICAgICAqICAtIHRoZSBjZmYgZm9udCBkcml2ZXIgdXNlcyB0aGUgcHNoaW50ZXIgbW9kdWxlIGluIGNmZl9zaXplX2RvbmUKLSAgICAgKiAgLSBpZiB0aGUgcHNoaW50ZXIgbW9kdWxlIGlzIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNmZiBmb250IGRyaXZlciwKLSAgICAgKiAgICBvcGVuZWQgRlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIGRyaXZlciBhcmUgbm90IHByb3Blcmx5Ci0gICAgICogICAgZGVzdHJveWVkLCByZXN1bHRpbmcgaW4gYSBtZW1vcnkgbGVhaworICAgICAqIC0gdGhlIGNmZiBmb250IGRyaXZlciB1c2VzIHRoZSBwc2hpbnRlciBtb2R1bGUgaW4gY2ZmX3NpemVfZG9uZQorICAgICAqIC0gaWYgdGhlIHBzaGludGVyIG1vZHVsZSBpcyBkZXN0cm95ZWQgYmVmb3JlIHRoZSBjZmYgZm9udCBkcml2ZXIsCisgICAgICogICBvcGVuZWQgRlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIGRyaXZlciBhcmUgbm90IHByb3Blcmx5CisgICAgICogICBkZXN0cm95ZWQsIHJlc3VsdGluZyBpbiBhIG1lbW9yeSBsZWFrCiAgICAgICoKICAgICAgKiBTb21lIGZhY2VzIGFyZSBkZXBlbmRlbnQgb24gb3RoZXIgZmFjZXMsIGxpa2UgVHlwZTQyIGZhY2VzIHRoYXQKICAgICAgKiBkZXBlbmQgb24gVHJ1ZVR5cGUgZmFjZXMgc3ludGhlc2l6ZWQgaW50ZXJuYWxseS4KQEAgLTUzMTAsMTEgKzU0NDMsNiBAQAogICAgIH0KICNlbmRpZgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICAvKiBEZXN0cm95IHBpYyBjb250YWluZXIgY29udGVudHMgKi8KLSAgICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIGxpYnJhcnkgKTsKLSNlbmRpZgotCiAgICAgRlRfRlJFRSggbGlicmFyeSApOwogCiAgIEV4aXQ6CkBAIC01NDAyLDQgKzU1MzAsNDEgQEAKICAgfQogCiAKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfQm9vbCApCisgIEZUX0dldF9Db2xvcl9HbHlwaF9MYXllciggRlRfRmFjZSAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGJhc2VfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgKmFnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAqYWNvbG9yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xheWVySXRlcmF0b3IqICBpdGVyYXRvciApCisgIHsKKyAgICBUVF9GYWNlICAgICAgIHR0ZmFjZTsKKyAgICBTRk5UX1NlcnZpY2UgIHNmbnQ7CisKKworICAgIGlmICggIWZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAhYWdseXBoX2luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICFhY29sb3JfaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgIWl0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICBiYXNlX2dseXBoID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFGVF9JU19TRk5UKCBmYWNlICkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOworICAgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpdHRmYWNlLT5zZm50OworCisgICAgaWYgKCBzZm50LT5nZXRfY29scl9sYXllciApCisgICAgICByZXR1cm4gc2ZudC0+Z2V0X2NvbHJfbGF5ZXIoIHR0ZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY29sb3JfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yICk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0b3R2YWwuYyBiL3NyYy9iYXNlL2Z0b3R2YWwuYwppbmRleCBhMjk0NGE3Li45MGE1ZGQ2IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdG90dmFsLmMKKysrIGIvc3JjL2Jhc2UvZnRvdHZhbC5jCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG90dmFsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciB2YWxpZGF0aW5nIE9wZW5UeXBlIHRhYmxlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG90dmFsLmMKKyAqCisgKiAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX09QRU5UWVBFX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdHZhbC5oPgogCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG90dmFsLmggKi8KZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0b3V0bG4uYyBiL3NyYy9iYXNlL2Z0b3V0bG4uYwppbmRleCBjYjkxMzIxLi4zMTFmMDk4IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdG91dGxuLmMKKysrIGIvc3JjL2Jhc2UvZnRvdXRsbi5jCkBAIC0xLDQ0ICsxLDM2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgb3V0bGluZSBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdG91dGxuLmMKKyAqCisgKiAgIEZyZWVUeXBlIG91dGxpbmUgbWFuYWdlbWVudCAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxsIGZ1bmN0aW9ucyBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+CiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9UUklHT05PTUVUUllfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX291dGxpbmUKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdXRsaW5lCiAKIAogICBzdGF0aWMKQEAgLTUzLDggKzQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICkKICAgewogI3VuZGVmICBTQ0FMRUQKLSNkZWZpbmUgU0NBTEVEKCB4ICkgICggKCAoeCkgPCAwID8gLSggLSh4KSA8PCBzaGlmdCApICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICggICh4KSA8PCBzaGlmdCApICkgLSBkZWx0YSApCisjZGVmaW5lIFNDQUxFRCggeCApICAoICh4KSAqICggMUwgPDwgc2hpZnQgKSAtIGRlbHRhICkKIAogICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKICAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7CkBAIC0yODMsNyArMjc0LDcgQEAKICAgICAgIGZpcnN0ID0gKEZUX1VJbnQpbGFzdCArIDE7CiAgICAgfQogCi0gICAgRlRfVFJBQ0U1KCggIkZUX091dGxpbmVfRGVjb21wb3NlOiBEb25lXG4iLCBuICkpOworICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRG9uZVxuIiApKTsKICAgICByZXR1cm4gRlRfRXJyX09rOwogCiAgIEludmFsaWRfT3V0bGluZToKQEAgLTI5NiwxNCArMjg3LDIyIEBACiAgIH0KIAogCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7CisgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCiAKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9PdXRsaW5lX05ldyggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5OworCisKKyAgICBpZiAoICFsaWJyYXJ5ICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOworCisgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwogCiAgICAgaWYgKCAhYW5vdXRsaW5lIHx8ICFtZW1vcnkgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CkBAIC0zMzAsNyArMzI5LDcgQEAKIAogICBGYWlsOgogICAgIGFub3V0bGluZS0+ZmxhZ3MgfD0gRlRfT1VUTElORV9PV05FUjsKLSAgICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIG1lbW9yeSwgYW5vdXRsaW5lICk7CisgICAgRlRfT3V0bGluZV9Eb25lKCBsaWJyYXJ5LCBhbm91dGxpbmUgKTsKIAogICAgIHJldHVybiBlcnJvcjsKICAgfQpAQCAtMzM5LDIyICszMzgsNiBAQAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXcoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bVBvaW50cywKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBudW1Db250b3VycywKLSAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICphbm91dGxpbmUgKQotICB7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIHJldHVybiBGVF9PdXRsaW5lX05ld19JbnRlcm5hbCggbGlicmFyeS0+bWVtb3J5LCBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1Db250b3VycywgYW5vdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9PdXRsaW5lX0NoZWNrKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCiAgIHsKICAgICBpZiAoIG91dGxpbmUgKQpAQCAtNDM2LDEzICs0MTksMjMgQEAKICAgfQogCiAKKyAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KKwogICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCisgIEZUX091dGxpbmVfRG9uZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKQogICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnk7CisKKworICAgIGlmICggIWxpYnJhcnkgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7CisKICAgICBpZiAoICFvdXRsaW5lICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7CiAKKyAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7CisKICAgICBpZiAoICFtZW1vcnkgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAKQEAgLTQ2MCwyMSArNDUzLDYgQEAKIAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwogCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Eb25lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICAvKiBjaGVjayBmb3IgdmFsaWQgYG91dGxpbmUnIGluIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCgpICovCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgcmV0dXJuIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggbGlicmFyeS0+bWVtb3J5LCBvdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KICAgRlRfRVhQT1JUX0RFRiggdm9pZCApCiAgIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKQpAQCAtNjE5LDYgKzU5Nyw3IEBACiAgICAgRlRfRXJyb3IgICAgIGVycm9yOwogICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKICAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKKyAgICBGVF9CQm94ICAgICAgY2JveDsKIAogCiAgICAgaWYgKCAhbGlicmFyeSApCkBAIC02MzAsMTEgKzYwOSwyNiBAQAogICAgIGlmICggIXBhcmFtcyApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKIAorICAgIEZUX091dGxpbmVfR2V0X0NCb3goIG91dGxpbmUsICZjYm94ICk7CisgICAgaWYgKCBjYm94LnhNaW4gPCAtMHgxMDAwMDAwTCB8fCBjYm94LnlNaW4gPCAtMHgxMDAwMDAwTCB8fAorICAgICAgICAgY2JveC54TWF4ID4gIDB4MTAwMDAwMEwgfHwgY2JveC55TWF4ID4gIDB4MTAwMDAwMEwgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKKwogICAgIHJlbmRlcmVyID0gbGlicmFyeS0+Y3VyX3JlbmRlcmVyOwogICAgIG5vZGUgICAgID0gbGlicmFyeS0+cmVuZGVyZXJzLmhlYWQ7CiAKICAgICBwYXJhbXMtPnNvdXJjZSA9ICh2b2lkKilvdXRsaW5lOwogCisgICAgLyogcHJlc2V0IGNsaXBfYm94IGZvciBkaXJlY3QgbW9kZSAqLworICAgIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCAgICAmJgorICAgICAgICAgISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0NMSVAgKSApCisgICAgeworICAgICAgcGFyYW1zLT5jbGlwX2JveC54TWluID0gY2JveC54TWluID4+IDY7CisgICAgICBwYXJhbXMtPmNsaXBfYm94LnlNaW4gPSBjYm94LnlNaW4gPj4gNjsKKyAgICAgIHBhcmFtcy0+Y2xpcF9ib3gueE1heCA9ICggY2JveC54TWF4ICsgNjMgKSA+PiA2OworICAgICAgcGFyYW1zLT5jbGlwX2JveC55TWF4ID0gKCBjYm94LnlNYXggKyA2MyApID4+IDY7CisgICAgfQorCiAgICAgZXJyb3IgPSBGVF9FUlIoIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKICAgICB3aGlsZSAoIHJlbmRlcmVyICkKICAgICB7CkBAIC03MTYsNyArNzEwLDcgQEAKICAgICBGVF9WZWN0b3IqICBsaW1pdDsKIAogCi0gICAgaWYgKCAhb3V0bGluZSB8fCAhbWF0cml4ICkKKyAgICBpZiAoICFvdXRsaW5lIHx8ICFtYXRyaXggfHwgIW91dGxpbmUtPnBvaW50cyApCiAgICAgICByZXR1cm47CiAKICAgICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKQEAgLTkxMSw5ICs5MDUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB4c3RyZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHlzdHJlbmd0aCApCiAgIHsKLSAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0gICAgRlRfSW50ICAgICAgYywgZmlyc3QsIGxhc3Q7Ci0gICAgRlRfSW50ICAgICAgb3JpZW50YXRpb247CisgICAgRlRfVmVjdG9yKiAgICAgIHBvaW50czsKKyAgICBGVF9JbnQgICAgICAgICAgYywgZmlyc3QsIGxhc3Q7CisgICAgRlRfT3JpZW50YXRpb24gIG9yaWVudGF0aW9uOwogCiAKICAgICBpZiAoICFvdXRsaW5lICkKQEAgLTEwNDQsNyArMTAzOCw3IEBACiAgIEZUX0VYUE9SVF9ERUYoIEZUX09yaWVudGF0aW9uICkKICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIEZUX091dGxpbmUqICBvdXRsaW5lICkKICAgewotICAgIEZUX0JCb3ggICAgIGNib3g7CisgICAgRlRfQkJveCAgICAgY2JveCA9IHsgMCwgMCwgMCwgMCB9OwogICAgIEZUX0ludCAgICAgIHhzaGlmdCwgeXNoaWZ0OwogICAgIEZUX1ZlY3RvciogIHBvaW50czsKICAgICBGVF9WZWN0b3IgICB2X3ByZXYsIHZfY3VyOwpAQCAtMTA2Niw2ICsxMDYwLDExIEBACiAgICAgaWYgKCBjYm94LnhNaW4gPT0gY2JveC54TWF4IHx8IGNib3gueU1pbiA9PSBjYm94LnlNYXggKQogICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX05PTkU7CiAKKyAgICAvKiBSZWplY3QgdmFsdWVzIGxhcmdlIG91dGxpbmVzLiAqLworICAgIGlmICggY2JveC54TWluIDwgLTB4MTAwMDAwMEwgfHwgY2JveC55TWluIDwgLTB4MTAwMDAwMEwgfHwKKyAgICAgICAgIGNib3gueE1heCA+ICAweDEwMDAwMDBMIHx8IGNib3gueU1heCA+ICAweDEwMDAwMDBMICkKKyAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9OT05FOworCiAgICAgeHNoaWZ0ID0gRlRfTVNCKCAoRlRfVUludDMyKSggRlRfQUJTKCBjYm94LnhNYXggKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQUJTKCBjYm94LnhNaW4gKSApICkgLSAxNDsKICAgICB4c2hpZnQgPSBGVF9NQVgoIHhzaGlmdCwgMCApOwpAQCAtMTA5MCw3ICsxMDg5LDggQEAKICAgICAgICAgdl9jdXIueSA9IHBvaW50c1tuXS55ID4+IHlzaGlmdDsKIAogICAgICAgICBhcmVhID0gQUREX0xPTkcoIGFyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCB2X2N1ci55IC0gdl9wcmV2LnkgKSAqICggdl9jdXIueCArIHZfcHJldi54ICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBNVUxfTE9ORyggdl9jdXIueSAtIHZfcHJldi55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2N1ci54ICsgdl9wcmV2LnggKSApOwogCiAgICAgICAgIHZfcHJldiA9IHZfY3VyOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRwYXRlbnQuYyBiL3NyYy9iYXNlL2Z0cGF0ZW50LmMKaW5kZXggZTIzZWUyZS4uYTAyYzYzNiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRwYXRlbnQuYworKysgYi9zcmMvYmFzZS9mdHBhdGVudC5jCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBhdGVudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjaGVja2luZyBwYXRlbnRlZCBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgICAgKi8KLS8qICAgIChib2R5KS4gIE9ic29sZXRlLCByZXRhaW5lZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRwYXRlbnQuYworICoKKyAqICAgRnJlZVR5cGUgQVBJIGZvciBjaGVja2luZyBwYXRlbnRlZCBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMKKyAqICAgKGJvZHkpLiAgT2Jzb2xldGUsIHJldGFpbmVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaD4KIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRwZnIuYyBiL3NyYy9iYXNlL2Z0cGZyLmMKaW5kZXggYmZlMTM1Mi4uYzY1NmZjZCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRwZnIuYworKysgYi9zcmMvYmFzZS9mdHBmci5jCkBAIC0xLDI1ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBmci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKGJvZHkpLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHBmci5jCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBQRlItc3BlY2lmaWMgZGF0YSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUEZSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBmci5oPgogCiAKICAgLyogY2hlY2sgdGhlIGZvcm1hdCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRwaWMuYyBiL3NyYy9iYXNlL2Z0cGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTJlMTguLjAwMDAwMDAKLS0tIGEvc3JjL2Jhc2UvZnRwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyAoYm9keSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJiYXNlcGljLmgiCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRwaWMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIGZ0X3BpY19jb250YWluZXJfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgRlRfTUVNX1NFVCggcGljX2NvbnRhaW5lciwgMCwgc2l6ZW9mICggKnBpY19jb250YWluZXIgKSApOwotCi0gICAgZXJyb3IgPSBmdF9iYXNlX3BpY19pbml0KCBsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBEZXN0cm95IHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyLiAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9iYXNlX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHBzcHJvcC5jIGIvc3JjL2Jhc2UvZnRwc3Byb3AuYwppbmRleCA0NTliNWU2Li44YzI5ZjUwIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdHBzcHJvcC5jCisrKyBiL3NyYy9iYXNlL2Z0cHNwcm9wLmMKQEAgLTEsMzggKzEsMzcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cHNwcm9wLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHZXQgYW5kIHNldCBwcm9wZXJ0aWVzIG9mIFBvc3RTY3JpcHQgZHJpdmVycyAoYm9keSkuICAgICAgICAgICAgICAgICAqLwotLyogICAgU2VlIGBmdGRyaXZlci5oJyBmb3IgYXZhaWxhYmxlIHByb3BlcnRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTctMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHBzcHJvcC5jCisgKgorICogICBHZXQgYW5kIHNldCBwcm9wZXJ0aWVzIG9mIFBvc3RTY3JpcHQgZHJpdmVycyAoYm9keSkuCisgKiAgIFNlZSBgZnRkcml2ZXIuaCcgZm9yIGF2YWlsYWJsZSBwcm9wZXJ0aWVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX1BST1BTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0cHNwcm9wLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNwcm9wcworI2RlZmluZSBGVF9DT01QT05FTlQgIHBzcHJvcHMKIAogCiAgIEZUX0JBU0VfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCkBAIC0xNjUsOSArMTY0LDkgQEAKICAgICAgICAgICBkcml2ZXItPmhpbnRpbmdfZW5naW5lID0gKmhpbnRpbmdfZW5naW5lOwogICAgICAgICBlbHNlCiAgICAgICAgICAgZXJyb3IgPSBGVF9FUlIoIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgIH0KKworICAgICAgcmV0dXJuIGVycm9yOwogICAgIH0KIAogICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAibm8tc3RlbS1kYXJrZW5pbmciICkgKQpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnRyZm9yay5jIGIvc3JjL2Jhc2UvZnRyZm9yay5jCmluZGV4IGMzYTJiOTEuLmY5ODliZTQgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0cmZvcmsuYworKysgYi9zcmMvYmFzZS9mdHJmb3JrLmMKQEAgLTEsMzggKzEsMzcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmZvcmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCkgYW5kIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMoKSBhcmUgICAgICovCi0vKiAgZGVyaXZlZCBmcm9tIGZ0b2Jqcy5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0cmZvcmsuYworICoKKyAqICAgRW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgYWNjZXNzb3IgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuCisgKgorICogRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbygpIGFuZCByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKCkgYXJlCisgKiBkZXJpdmVkIGZyb20gZnRvYmpzLmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGV2ZWxvcG1lbnQgb2YgdGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIHN1cHBvcnQgb2YKKyAqIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeSwgSmFwYW4uCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9SRk9SS19ICi0jaW5jbHVkZSAiYmFzZXBpYy5oIgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaD4KKwogI2luY2x1ZGUgImZ0YmFzZS5oIgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3JhY2Nlc3MKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICByYWNjZXNzCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTI0MCw3ICsyMzksNyBAQAogICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gMTYgKSApLAogICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDggKSApLAogICAgICAgICAgICAgICAgICAgKGNoYXIpKCAweEZGICYgKCB0YWdfaW50ZXJuYWwgPj4gIDAgKSApICkpOwotICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICA6IHN1YmNvdW50PSVkLCBzdWJvZmZzZXQ9MHglMDR4XG4iLAorICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICA6IHN1YmNvdW50PSVkLCBzdWJvZmZzZXQ9MHglMDRseFxuIiwKICAgICAgICAgICAgICAgICAgIHN1YmNudCwgcnBvcyApKTsKIAogICAgICAgaWYgKCB0YWdfaW50ZXJuYWwgPT0gdGFnICkKQEAgLTI4Niw3ICsyODUsNyBAQAogICAgICAgICAgIHJlZltqXS5vZmZzZXQgPSB0ZW1wICYgMHhGRkZGRkZMOwogCiAgICAgICAgICAgRlRfVFJBQ0UzKCggIiAgICAgICAgICAgICBbJWRdOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHJlc291cmNlX2lkPTB4JTA0eCwgb2Zmc2V0PTB4JTA4eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAiIHJlc291cmNlX2lkPTB4JTA0eCwgb2Zmc2V0PTB4JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgaiwgKEZUX1VTaG9ydClyZWZbal0ucmVzX2lkLCByZWZbal0ub2Zmc2V0ICkpOwogICAgICAgICB9CiAKQEAgLTMwMiw3ICszMDEsNyBAQAogCiAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCAqY291bnQ7IGorKyApCiAgICAgICAgICAgICBGVF9UUkFDRTMoKCAiICAgICAgICAgICAgIFslZF06IgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXNvdXJjZV9pZD0weCUwNHgsIG9mZnNldD0weCUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc291cmNlX2lkPTB4JTA0eCwgb2Zmc2V0PTB4JTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBqLCByZWZbal0ucmVzX2lkLCByZWZbal0ub2Zmc2V0ICkpOwogICAgICAgICB9CiAKQEAgLTQzOCw3ICs0MzcsNyBAQAogCiAgIHN0YXRpYyBGVF9FcnJvcgogICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiAgICAgIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgIGZpbGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKIAogICBzdGF0aWMgY2hhciAqCkBAIC00NjgsMTAgKzQ2NywxMCBAQAogICAgICAgaWYgKCBlcnJvcnNbaV0gKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgZXJyb3JzW2ldID0gKEZUX1JBQ0NFU1NfR1VFU1NfVEFCTEVfR0VUW2ldLmZ1bmMpKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobmV3X25hbWVzW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG9mZnNldHNbaV0pICk7CisgICAgICBlcnJvcnNbaV0gPSBmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlW2ldLmZ1bmMoIGxpYnJhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmFzZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG5ld19uYW1lc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYob2Zmc2V0c1tpXSkgKTsKICAgICB9CiAKICAgICByZXR1cm47CkBAIC00ODgsNyArNDg3LDcgQEAKICAgICBpZiAoIHJ1bGVfaW5kZXggPj0gRlRfUkFDQ0VTU19OX1JVTEVTICkKICAgICAgIHJldHVybiBGVF9SRm9ya19SdWxlX2ludmFsaWQ7CiAKLSAgICByZXR1cm4gRlRfUkFDQ0VTU19HVUVTU19UQUJMRV9HRVRbcnVsZV9pbmRleF0udHlwZTsKKyAgICByZXR1cm4gZnRfcmFjY2Vzc19ndWVzc190YWJsZVtydWxlX2luZGV4XS50eXBlOwogICB9CiAKIApAQCAtODQ3LDcgKzg0Niw3IEBACiAgIHsKICAgICBGVF9PcGVuX0FyZ3MgIGFyZ3MyOwogICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtMjsKLSAgICBjaGFyICogICAgICAgIG5vdXNlID0gTlVMTDsKKyAgICBjaGFyKiAgICAgICAgIG5vdXNlID0gTlVMTDsKICAgICBGVF9FcnJvciAgICAgIGVycm9yOwogCiAKQEAgLTkwOSw5ICs5MDgsOSBAQAogI2Vsc2UgICAvKiAhRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgRHVtbXkgZnVuY3Rpb247IGp1c3Qgc2V0cyBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqICAgICAgICAgICAgICAgICBEdW1teSBmdW5jdGlvbjsganVzdCBzZXRzIGVycm9ycworICAgKi8KIAogICBGVF9CQVNFX0RFRiggdm9pZCApCiAgIEZUX1JhY2Nlc3NfR3Vlc3MoIEZUX0xpYnJhcnkgIGxpYnJhcnksCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHNuYW1lcy5jIGIvc3JjL2Jhc2UvZnRzbmFtZXMuYwppbmRleCA5MGVhMWUyLi44NTA3ZjI4IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdHNuYW1lcy5jCisrKyBiL3NyYy9iYXNlL2Z0c25hbWVzLmMKQEAgLTEsMzAgKzEsMjkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c25hbWVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW1wbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyBTRk5UIG5hbWUgdGFibGVzICh3aGljaCBhcmUgdXNlZCAgICAgICAgICAqLwotLyogICAgdG8gaG9sZCBmb250IG5hbWVzLCBjb3B5cmlnaHQgaW5mbywgbm90aWNlcywgZXRjLikgKGJvZHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGlzIF9ub3RfIHVzZWQgdG8gcmV0cmlldmUgZ2x5cGggbmFtZXMhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c25hbWVzLmMKKyAqCisgKiAgIFNpbXBsZSBpbnRlcmZhY2UgdG8gYWNjZXNzIFNGTlQgbmFtZSB0YWJsZXMgKHdoaWNoIGFyZSB1c2VkCisgKiAgIHRvIGhvbGQgZm9udCBuYW1lcywgY29weXJpZ2h0IGluZm8sIG5vdGljZXMsIGV0Yy4pIChib2R5KS4KKyAqCisgKiAgIFRoaXMgaXMgX25vdF8gdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcyEKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c25hbWVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUwpAQCAtMTQyLDcgKzE0MSw0NSBAQAogICB9CiAKIAotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyAqLworI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU0ZOVF9OQU1FUyAqLworCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCisgIEZUX0dldF9TZm50X05hbWVfQ291bnQoIEZUX0ZhY2UgIGZhY2UgKQorICB7CisgICAgRlRfVU5VU0VEKCBmYWNlICk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9HZXRfU2ZudF9OYW1lKCBGVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAorICAgICAgICAgICAgICAgICAgICBGVF9TZm50TmFtZSAgKmFuYW1lICkKKyAgeworICAgIEZUX1VOVVNFRCggZmFjZSApOworICAgIEZUX1VOVVNFRCggaWR4ICk7CisgICAgRlRfVU5VU0VEKCBhbmFtZSApOworCisgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKyAgfQorCisKKyAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQorICBGVF9HZXRfU2ZudF9MYW5nVGFnKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgbGFuZ0lELAorICAgICAgICAgICAgICAgICAgICAgICBGVF9TZm50TGFuZ1RhZyAgKmFsYW5nVGFnICkKKyAgeworICAgIEZUX1VOVVNFRCggZmFjZSApOworICAgIEZUX1VOVVNFRCggbGFuZ0lEICk7CisgICAgRlRfVU5VU0VEKCBhbGFuZ1RhZyApOworCisgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKyAgfQorCisKKyNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTICovCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHN0cmVhbS5jIGIvc3JjL2Jhc2UvZnRzdHJlYW0uYwppbmRleCAxOGRmN2RjLi5kOTQwMjU0IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdHN0cmVhbS5jCisrKyBiL3NyYy9iYXNlL2Z0c3RyZWFtLmMKQEAgLTEsMzQgKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3RyZWFtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJL08gc3RyZWFtIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c3RyZWFtLmMKKyAqCisgKiAgIEkvTyBzdHJlYW0gc3VwcG9ydCAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3RyZWFtCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgc3RyZWFtCiAKIAogICBGVF9CQVNFX0RFRiggdm9pZCApCkBAIC0yMTksMTMgKzIxOCwxNCBAQAogICAgIHsKICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CiAKKwogI2lmZGVmIEZUX0RFQlVHX01FTU9SWQogICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgKnBieXRlcyApOwotICAgICAgKnBieXRlcyA9IE5VTEw7CiAjZWxzZQogICAgICAgRlRfRlJFRSggKnBieXRlcyApOwogI2VuZGlmCiAgICAgfQorCiAgICAgKnBieXRlcyA9IE5VTEw7CiAgIH0KIApAQCAtMjM4LDYgKzIzOCw4IEBACiAgICAgRlRfVUxvbmcgIHJlYWRfYnl0ZXM7CiAKIAorICAgIEZUX1RSQUNFNygoICJGVF9TdHJlYW1fRW50ZXJGcmFtZTogJWxkIGJ5dGVzXG4iLCBjb3VudCApKTsKKwogICAgIC8qIGNoZWNrIGZvciBuZXN0ZWQgZnJhbWUgYWNjZXNzICovCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgPT0gMCApOwogCkBAIC0yODEsOCArMjgzLDkgQEAKICAgICAgICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwogICAgICAgfQorCiAgICAgICBzdHJlYW0tPmN1cnNvciA9IHN0cmVhbS0+YmFzZTsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gc3RyZWFtLT5jdXJzb3IgKyBjb3VudDsKKyAgICAgIHN0cmVhbS0+bGltaXQgID0gRlRfT0ZGU0VUKCBzdHJlYW0tPmN1cnNvciwgY291bnQgKTsKICAgICAgIHN0cmVhbS0+cG9zICAgKz0gcmVhZF9ieXRlczsKICAgICB9CiAgICAgZWxzZQpAQCAtMzIxLDEzICszMjQsMTYgQEAKICAgICAvKiAgSW4gdGhpcyBjYXNlLCB0aGUgbG9hZGVyIGNvZGUgaGFuZGxlcyB0aGUgMC1sZW5ndGggdGFibGUgICAgICAgICAgKi8KICAgICAvKiAgZ3JhY2VmdWxseTsgaG93ZXZlciwgc3RyZWFtLmN1cnNvciBpcyByZWFsbHkgc2V0IHRvIDAgYnkgdGhlICAgICAgKi8KICAgICAvKiAgRlRfU3RyZWFtX0VudGVyRnJhbWUoKSBjYWxsLCBhbmQgdGhpcyBpcyBub3QgYW4gZXJyb3IuICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEZUX1RSQUNFNygoICJGVF9TdHJlYW1fRXhpdEZyYW1lXG4iICkpOworCiAgICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKIAogICAgIGlmICggc3RyZWFtLT5yZWFkICkKICAgICB7CiAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwogCisKICNpZmRlZiBGVF9ERUJVR19NRU1PUlkKICAgICAgIGZ0X21lbV9mcmVlKCBtZW1vcnksIHN0cmVhbS0+YmFzZSApOwogICAgICAgc3RyZWFtLT5iYXNlID0gTlVMTDsKQEAgLTMzNSw2ICszNDEsNyBAQAogICAgICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7CiAjZW5kaWYKICAgICB9CisKICAgICBzdHJlYW0tPmN1cnNvciA9IE5VTEw7CiAgICAgc3RyZWFtLT5saW1pdCAgPSBOVUxMOwogICB9CmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHN0cm9rZS5jIGIvc3JjL2Jhc2UvZnRzdHJva2UuYwppbmRleCA2YWUxODE5Li41NmY5OGUxIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdHN0cm9rZS5jCisrKyBiL3NyYy9iYXNlL2Z0c3Ryb2tlLmMKQEAgLTEsMzggKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3Ryb2tlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBwYXRoIHN0cm9rZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c3Ryb2tlLmMKKyAqCisgKiAgIEZyZWVUeXBlIHBhdGggc3Ryb2tlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1NUUk9LRVJfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jaW5jbHVkZSAiYmFzZXBpYy5oIgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c3Ryb2tlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnR0cmlnb24uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CiAKIAotICAvKiBkZWNsYXJlIGFuIGV4dGVybiB0byBhY2Nlc3MgYGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MnIGdsb2JhbGx5ICAgICAqLwotICAvKiBhbGxvY2F0ZWQgIGluIGBmdGdseXBoLmMnLCBhbmQgdXNlIHRoZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAqLwotICAvKiBtYWNybyB0byBhY2Nlc3MgaXQgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQworICAvKiBkZWNsYXJlIGFuIGV4dGVybiB0byBhY2Nlc3MgYGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MnIGdsb2JhbGx5ICovCisgIC8qIGFsbG9jYXRlZCAgaW4gYGZ0Z2x5cGguYycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfR2x5cGhfQ2xhc3MgIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3M7Ci0jZW5kaWYKIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwpAQCAtOTEsMTYgKzg1LDE4IEBACiAKIAogICAgIGJhc2VbNF0ueCA9IGJhc2VbMl0ueDsKLSAgICBiID0gYmFzZVsxXS54OwotICAgIGEgPSBiYXNlWzNdLnggPSAoIGJhc2VbMl0ueCArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueCA9ICggYmFzZVswXS54ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnggPSAoIGEgKyBiICkgLyAyOworICAgIGEgPSBiYXNlWzBdLnggKyBiYXNlWzFdLng7CisgICAgYiA9IGJhc2VbMV0ueCArIGJhc2VbMl0ueDsKKyAgICBiYXNlWzNdLnggPSBiID4+IDE7CisgICAgYmFzZVsyXS54ID0gKCBhICsgYiApID4+IDI7CisgICAgYmFzZVsxXS54ID0gYSA+PiAxOwogCiAgICAgYmFzZVs0XS55ID0gYmFzZVsyXS55OwotICAgIGIgPSBiYXNlWzFdLnk7Ci0gICAgYSA9IGJhc2VbM10ueSA9ICggYmFzZVsyXS55ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS55ID0gKCBiYXNlWzBdLnkgKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueSA9ICggYSArIGIgKSAvIDI7CisgICAgYSA9IGJhc2VbMF0ueSArIGJhc2VbMV0ueTsKKyAgICBiID0gYmFzZVsxXS55ICsgYmFzZVsyXS55OworICAgIGJhc2VbM10ueSA9IGIgPj4gMTsKKyAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgPj4gMjsKKyAgICBiYXNlWzFdLnkgPSBhID4+IDE7CiAgIH0KIAogCkBAIC0xNTgsMjggKzE1NCwzMiBAQAogICBzdGF0aWMgdm9pZAogICBmdF9jdWJpY19zcGxpdCggRlRfVmVjdG9yKiAgYmFzZSApCiAgIHsKLSAgICBGVF9Qb3MgIGEsIGIsIGMsIGQ7CisgICAgRlRfUG9zICBhLCBiLCBjOwogCiAKICAgICBiYXNlWzZdLnggPSBiYXNlWzNdLng7Ci0gICAgYyA9IGJhc2VbMV0ueDsKLSAgICBkID0gYmFzZVsyXS54OwotICAgIGJhc2VbMV0ueCA9IGEgPSAoIGJhc2VbMF0ueCArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnggPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICkgLyAyOworICAgIGEgPSBiYXNlWzBdLnggKyBiYXNlWzFdLng7CisgICAgYiA9IGJhc2VbMV0ueCArIGJhc2VbMl0ueDsKKyAgICBjID0gYmFzZVsyXS54ICsgYmFzZVszXS54OworICAgIGJhc2VbNV0ueCA9IGMgPj4gMTsKKyAgICBjICs9IGI7CisgICAgYmFzZVs0XS54ID0gYyA+PiAyOworICAgIGJhc2VbMV0ueCA9IGEgPj4gMTsKKyAgICBhICs9IGI7CisgICAgYmFzZVsyXS54ID0gYSA+PiAyOworICAgIGJhc2VbM10ueCA9ICggYSArIGMgKSA+PiAzOwogCiAgICAgYmFzZVs2XS55ID0gYmFzZVszXS55OwotICAgIGMgPSBiYXNlWzFdLnk7Ci0gICAgZCA9IGJhc2VbMl0ueTsKLSAgICBiYXNlWzFdLnkgPSBhID0gKCBiYXNlWzBdLnkgKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiApIC8gMjsKKyAgICBhID0gYmFzZVswXS55ICsgYmFzZVsxXS55OworICAgIGIgPSBiYXNlWzFdLnkgKyBiYXNlWzJdLnk7CisgICAgYyA9IGJhc2VbMl0ueSArIGJhc2VbM10ueTsKKyAgICBiYXNlWzVdLnkgPSBjID4+IDE7CisgICAgYyArPSBiOworICAgIGJhc2VbNF0ueSA9IGMgPj4gMjsKKyAgICBiYXNlWzFdLnkgPSBhID4+IDE7CisgICAgYSArPSBiOworICAgIGJhc2VbMl0ueSA9IGEgPj4gMjsKKyAgICBiYXNlWzNdLnkgPSAoIGEgKyBjICkgPj4gMzsKICAgfQogCiAKQEAgLTM3Miw2ICszNzIsNyBAQAogICAgICAgLyogaXQgY29udGFpbnMgdGhlIGBhZGp1c3RlZCcgc3RhcnRpbmcgY29vcmRpbmF0ZXMgICAgICAgICAgKi8KICAgICAgIGJvcmRlci0+bnVtX3BvaW50cyAgICA9IC0tY291bnQ7CiAgICAgICBib3JkZXItPnBvaW50c1tzdGFydF0gPSBib3JkZXItPnBvaW50c1tjb3VudF07CisgICAgICBib3JkZXItPnRhZ3Nbc3RhcnRdICAgPSBib3JkZXItPnRhZ3NbY291bnRdOwogCiAgICAgICBpZiAoIHJldmVyc2UgKQogICAgICAgewpAQCAtNDM2LDggKzQzNyw4IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAvKiBkb24ndCBhZGQgemVyby1sZW5ndGggbGluZXRvICovCi0gICAgICBpZiAoIGJvcmRlci0+bnVtX3BvaW50cyA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgLyogZG9uJ3QgYWRkIHplcm8tbGVuZ3RoIGxpbmV0bywgYnV0IGFsd2F5cyBhZGQgbW92ZXRvICovCisgICAgICBpZiAoIGJvcmRlci0+bnVtX3BvaW50cyA+IChGVF9VSW50KWJvcmRlci0+c3RhcnQgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICBGVF9JU19TTUFMTCggYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV0ueCAtIHRvLT54ICkgJiYKICAgICAgICAgICAgRlRfSVNfU01BTEwoIGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdLnkgLSB0by0+eSApICkKICAgICAgICAgcmV0dXJuIGVycm9yOwpAQCAtNTM4LDYzICs1MzksNTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgICAgICBhbmdsZV9zdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgICAgICBhbmdsZV9kaWZmICkKICAgewotICAgIEZUX0FuZ2xlICAgdG90YWwsIGFuZ2xlLCBzdGVwLCByb3RhdGUsIG5leHQsIHRoZXRhOwotICAgIEZUX1ZlY3RvciAgYSwgYiwgYTIsIGIyOwotICAgIEZUX0ZpeGVkICAgbGVuZ3RoOworICAgIEZUX0ZpeGVkICAgY29lZjsKKyAgICBGVF9WZWN0b3IgIGEwLCBhMSwgYTIsIGEzOworICAgIEZUX0ludCAgICAgaSwgYXJjcyA9IDE7CiAgICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKIAogCi0gICAgLyogY29tcHV0ZSBzdGFydCBwb2ludCAqLwotICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYSwgcmFkaXVzLCBhbmdsZV9zdGFydCApOwotICAgIGEueCArPSBjZW50ZXItPng7Ci0gICAgYS55ICs9IGNlbnRlci0+eTsKKyAgICAvKiBudW1iZXIgb2YgY3ViaWMgYXJjcyB0byBkcmF3ICovCisgICAgd2hpbGUgKCAgYW5nbGVfZGlmZiA+IEZUX0FSQ19DVUJJQ19BTkdMRSAqIGFyY3MgfHwKKyAgICAgICAgICAgIC1hbmdsZV9kaWZmID4gRlRfQVJDX0NVQklDX0FOR0xFICogYXJjcyApCisgICAgICBhcmNzKys7CiAKLSAgICB0b3RhbCAgPSBhbmdsZV9kaWZmOwotICAgIGFuZ2xlICA9IGFuZ2xlX3N0YXJ0OwotICAgIHJvdGF0ZSA9ICggYW5nbGVfZGlmZiA+PSAwICkgPyBGVF9BTkdMRV9QSTIgOiAtRlRfQU5HTEVfUEkyOworICAgIC8qIGNvbnRyb2wgdGFuZ2VudHMgKi8KKyAgICBjb2VmICA9IEZUX1RhbiggYW5nbGVfZGlmZiAvICggNCAqIGFyY3MgKSApOworICAgIGNvZWYgKz0gY29lZiAvIDM7CiAKLSAgICB3aGlsZSAoIHRvdGFsICE9IDAgKQorICAgIC8qIGNvbXB1dGUgc3RhcnQgYW5kIGZpcnN0IGNvbnRyb2wgcG9pbnQgKi8KKyAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmEwLCByYWRpdXMsIGFuZ2xlX3N0YXJ0ICk7CisgICAgYTEueCA9IEZUX011bEZpeCggLWEwLnksIGNvZWYgKTsKKyAgICBhMS55ID0gRlRfTXVsRml4KCAgYTAueCwgY29lZiApOworCisgICAgYTAueCArPSBjZW50ZXItPng7CisgICAgYTAueSArPSBjZW50ZXItPnk7CisgICAgYTEueCArPSBhMC54OworICAgIGExLnkgKz0gYTAueTsKKworICAgIGZvciAoIGkgPSAxOyBpIDw9IGFyY3M7IGkrKyApCiAgICAgewotICAgICAgc3RlcCA9IHRvdGFsOwotICAgICAgaWYgKCBzdGVwID4gRlRfQVJDX0NVQklDX0FOR0xFICkKLSAgICAgICAgc3RlcCA9IEZUX0FSQ19DVUJJQ19BTkdMRTsKKyAgICAgIC8qIGNvbXB1dGUgZW5kIGFuZCBzZWNvbmQgY29udHJvbCBwb2ludCAqLworICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZhMywgcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZ2xlX3N0YXJ0ICsgaSAqIGFuZ2xlX2RpZmYgLyBhcmNzICk7CisgICAgICBhMi54ID0gRlRfTXVsRml4KCAgYTMueSwgY29lZiApOworICAgICAgYTIueSA9IEZUX011bEZpeCggLWEzLngsIGNvZWYgKTsKIAotICAgICAgZWxzZSBpZiAoIHN0ZXAgPCAtRlRfQVJDX0NVQklDX0FOR0xFICkKLSAgICAgICAgc3RlcCA9IC1GVF9BUkNfQ1VCSUNfQU5HTEU7Ci0KLSAgICAgIG5leHQgID0gYW5nbGUgKyBzdGVwOwotICAgICAgdGhldGEgPSBzdGVwOwotICAgICAgaWYgKCB0aGV0YSA8IDAgKQotICAgICAgICB0aGV0YSA9IC10aGV0YTsKLQotICAgICAgdGhldGEgPj49IDE7Ci0KLSAgICAgIC8qIGNvbXB1dGUgZW5kIHBvaW50ICovCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmIsIHJhZGl1cywgbmV4dCApOwotICAgICAgYi54ICs9IGNlbnRlci0+eDsKLSAgICAgIGIueSArPSBjZW50ZXItPnk7Ci0KLSAgICAgIC8qIGNvbXB1dGUgZmlyc3QgYW5kIHNlY29uZCBjb250cm9sIHBvaW50cyAqLwotICAgICAgbGVuZ3RoID0gRlRfTXVsRGl2KCByYWRpdXMsIEZUX1NpbiggdGhldGEgKSAqIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICggMHgxMDAwMEwgKyBGVF9Db3MoIHRoZXRhICkgKSAqIDMgKTsKLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZhMiwgbGVuZ3RoLCBhbmdsZSArIHJvdGF0ZSApOwotICAgICAgYTIueCArPSBhLng7Ci0gICAgICBhMi55ICs9IGEueTsKLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZiMiwgbGVuZ3RoLCBuZXh0IC0gcm90YXRlICk7Ci0gICAgICBiMi54ICs9IGIueDsKLSAgICAgIGIyLnkgKz0gYi55OworICAgICAgYTMueCArPSBjZW50ZXItPng7CisgICAgICBhMy55ICs9IGNlbnRlci0+eTsKKyAgICAgIGEyLnggKz0gYTMueDsKKyAgICAgIGEyLnkgKz0gYTMueTsKIAogICAgICAgLyogYWRkIGN1YmljIGFyYyAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2N1YmljdG8oIGJvcmRlciwgJmEyLCAmYjIsICZiICk7CisgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggYm9yZGVyLCAmYTEsICZhMiwgJmEzICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIC8qIHByb2Nlc3MgdGhlIHJlc3Qgb2YgdGhlIGFyYyA/PyAqLwotICAgICAgYSAgICAgID0gYjsKLSAgICAgIHRvdGFsIC09IHN0ZXA7Ci0gICAgICBhbmdsZSAgPSBuZXh0OworICAgICAgLyogYTAgPSBhMzsgKi8KKyAgICAgIGExLnggPSBhMy54IC0gYTIueCArIGEzLng7CisgICAgICBhMS55ID0gYTMueSAtIGEyLnkgKyBhMy55OwogICAgIH0KIAogICAgIHJldHVybiBlcnJvcjsKQEAgLTkzMiw1NSArOTIyLDQwIEBACiAKICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9hcmN0byggc3Ryb2tlciwgc2lkZSApOwogICAgIH0KLSAgICBlbHNlIGlmICggc3Ryb2tlci0+bGluZV9jYXAgPT0gRlRfU1RST0tFUl9MSU5FQ0FQX1NRVUFSRSApCisgICAgZWxzZQogICAgIHsKLSAgICAgIC8qIGFkZCBhIHNxdWFyZSBjYXAgKi8KLSAgICAgIEZUX1ZlY3RvciAgICAgICAgZGVsdGEsIGRlbHRhMjsKLSAgICAgIEZUX0FuZ2xlICAgICAgICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKKyAgICAgIC8qIGFkZCBhIHNxdWFyZSBvciBidXR0IGNhcCAqLworICAgICAgRlRfVmVjdG9yICAgICAgICBtaWRkbGUsIGRlbHRhOwogICAgICAgRlRfRml4ZWQgICAgICAgICByYWRpdXMgPSBzdHJva2VyLT5yYWRpdXM7CiAgICAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnMgKyBzaWRlOwogCiAKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEyLCByYWRpdXMsIGFuZ2xlICsgcm90YXRlICk7Ci0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCAgcmFkaXVzLCBhbmdsZSApOworICAgICAgLyogY29tcHV0ZSBtaWRkbGUgcG9pbnQgYW5kIGZpcnN0IGFuZ2xlIHBvaW50ICovCisgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJm1pZGRsZSwgcmFkaXVzLCBhbmdsZSApOworICAgICAgZGVsdGEueCA9IHNpZGUgPyAgbWlkZGxlLnkgOiAtbWlkZGxlLnk7CisgICAgICBkZWx0YS55ID0gc2lkZSA/IC1taWRkbGUueCA6ICBtaWRkbGUueDsKIAotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueCArIGRlbHRhMi54OwotICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueSArIGRlbHRhMi55OworICAgICAgaWYgKCBzdHJva2VyLT5saW5lX2NhcCA9PSBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFICkKKyAgICAgIHsKKyAgICAgICAgbWlkZGxlLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7CisgICAgICAgIG1pZGRsZS55ICs9IHN0cm9rZXItPmNlbnRlci55OworICAgICAgfQorICAgICAgZWxzZSAgLyogRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgKi8KKyAgICAgIHsKKyAgICAgICAgbWlkZGxlLnggID0gc3Ryb2tlci0+Y2VudGVyLng7CisgICAgICAgIG1pZGRsZS55ICA9IHN0cm9rZXItPmNlbnRlci55OworICAgICAgfQorCisgICAgICBkZWx0YS54ICArPSBtaWRkbGUueDsKKyAgICAgIGRlbHRhLnkgICs9IG1pZGRsZS55OwogCiAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEyLCByYWRpdXMsIGFuZ2xlIC0gcm90YXRlICk7Ci0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCAgcmFkaXVzLCBhbmdsZSApOwotCi0gICAgICBkZWx0YS54ICs9IGRlbHRhMi54ICsgc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICBkZWx0YS55ICs9IGRlbHRhMi55ICsgc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgIH0KLSAgICBlbHNlIGlmICggc3Ryb2tlci0+bGluZV9jYXAgPT0gRlRfU1RST0tFUl9MSU5FQ0FQX0JVVFQgKQotICAgIHsKLSAgICAgIC8qIGFkZCBhIGJ1dHQgZW5kaW5nICovCi0gICAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgICAgRlRfQW5nbGUgICAgICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotICAgICAgRlRfRml4ZWQgICAgICAgICByYWRpdXMgPSBzdHJva2VyLT5yYWRpdXM7Ci0gICAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnMgKyBzaWRlOwotCi0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIHJhZGl1cywgYW5nbGUgKyByb3RhdGUgKTsKLQotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgcmFkaXVzLCBhbmdsZSAtIHJvdGF0ZSApOwotCi0gICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKKyAgICAgIC8qIGNvbXB1dGUgc2Vjb25kIGFuZ2xlIHBvaW50ICovCisgICAgICBkZWx0YS54ID0gbWlkZGxlLnggLSBkZWx0YS54ICsgbWlkZGxlLng7CisgICAgICBkZWx0YS55ID0gbWlkZGxlLnkgLSBkZWx0YS55ICsgbWlkZGxlLnk7CiAKICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwogICAgIH0KQEAgLTk5OCw4ICs5NzMsOCBAQAogICB7CiAgICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKICAgICBGVF9BbmdsZSAgICAgICAgIHBoaSwgdGhldGEsIHJvdGF0ZTsKLSAgICBGVF9GaXhlZCAgICAgICAgIGxlbmd0aCwgdGhjb3M7Ci0gICAgRlRfVmVjdG9yICAgICAgICBkZWx0YTsKKyAgICBGVF9GaXhlZCAgICAgICAgIGxlbmd0aDsKKyAgICBGVF9WZWN0b3IgICAgICAgIHNpZ21hLCBkZWx0YTsKICAgICBGVF9FcnJvciAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogICAgIEZUX0Jvb2wgICAgICAgICAgaW50ZXJzZWN0OyAgICAgICAgICAvKiB1c2UgaW50ZXJzZWN0aW9uIG9mIGxpbmVzPyAqLwogCkBAIC0xMDE3LDEwICs5OTIsMTMgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgLyogY29tcHV0ZSBtaW5pbXVtIHJlcXVpcmVkIGxlbmd0aCBvZiBsaW5lcyAqLwotICAgICAgRlRfRml4ZWQgIG1pbl9sZW5ndGggPSBmdF9wb3NfYWJzKCBGVF9NdWxGaXgoIHN0cm9rZXItPnJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9UYW4oIHRoZXRhICkgKSApOworICAgICAgRlRfRml4ZWQgIG1pbl9sZW5ndGg7CiAKIAorICAgICAgRlRfVmVjdG9yX1VuaXQoICZzaWdtYSwgdGhldGEgKTsKKyAgICAgIG1pbl9sZW5ndGggPQorICAgICAgICBmdF9wb3NfYWJzKCBGVF9NdWxEaXYoIHN0cm9rZXItPnJhZGl1cywgc2lnbWEueSwgc2lnbWEueCApICk7CisKICAgICAgIGludGVyc2VjdCA9IEZUX0JPT0woIG1pbl9sZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmxpbmVfbGVuZ3RoID49IG1pbl9sZW5ndGggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbGVuZ3RoICAgICAgICAgID49IG1pbl9sZW5ndGggKTsKQEAgLTEwMzgsMTMgKzEwMTYsMTEgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgLyogY29tcHV0ZSBtZWRpYW4gYW5nbGUgKi8KLSAgICAgIHBoaSA9IHN0cm9rZXItPmFuZ2xlX2luICsgdGhldGE7CisgICAgICBwaGkgPSBzdHJva2VyLT5hbmdsZV9pbiArIHRoZXRhICsgcm90YXRlOwogCi0gICAgICB0aGNvcyA9IEZUX0NvcyggdGhldGEgKTsKKyAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCBzaWdtYS54ICk7CiAKLSAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOworICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgbGVuZ3RoLCBwaGkgKTsKICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7CiAgICAgICBkZWx0YS55ICs9IHN0cm9rZXItPmNlbnRlci55OwogICAgIH0KQEAgLTEwNzEsMTAgKzEwNDcsMTAgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgLyogdGhpcyBpcyBhIG1pdGVyZWQgKHBvaW50ZWQpIG9yIGJldmVsZWQgKHRydW5jYXRlZCkgY29ybmVyICovCi0gICAgICBGVF9GaXhlZCAgc2lnbWEgPSAwLCByYWRpdXMgPSBzdHJva2VyLT5yYWRpdXM7Ci0gICAgICBGVF9BbmdsZSAgdGhldGEgPSAwLCBwaGkgPSAwOwotICAgICAgRlRfRml4ZWQgIHRoY29zID0gMDsKLSAgICAgIEZUX0Jvb2wgICBiZXZlbCwgZml4ZWRfYmV2ZWw7CisgICAgICBGVF9GaXhlZCAgIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKKyAgICAgIEZUX1ZlY3RvciAgc2lnbWE7CisgICAgICBGVF9BbmdsZSAgIHRoZXRhID0gMCwgcGhpID0gMDsKKyAgICAgIEZUX0Jvb2wgICAgYmV2ZWwsIGZpeGVkX2JldmVsOwogCiAKICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7CkBAIC0xMDg1LDI2ICsxMDYxLDIwIEBACiAgICAgICBmaXhlZF9iZXZlbCA9CiAgICAgICAgIEZUX0JPT0woIHN0cm9rZXItPmxpbmVfam9pbiAhPSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFICk7CiAKKyAgICAgIC8qIGNoZWNrIG1pdGVyIGxpbWl0IGZpcnN0ICovCiAgICAgICBpZiAoICFiZXZlbCApCiAgICAgICB7Ci0gICAgICAgIHRoZXRhID0gRlRfQW5nbGVfRGlmZiggc3Ryb2tlci0+YW5nbGVfaW4sIHN0cm9rZXItPmFuZ2xlX291dCApOworICAgICAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKSAvIDI7CiAKLSAgICAgICAgaWYgKCB0aGV0YSA9PSBGVF9BTkdMRV9QSSApCi0gICAgICAgIHsKLSAgICAgICAgICB0aGV0YSA9IHJvdGF0ZTsKLSAgICAgICAgICBwaGkgICA9IHN0cm9rZXItPmFuZ2xlX2luOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRoZXRhIC89IDI7Ci0gICAgICAgICAgcGhpICAgID0gc3Ryb2tlci0+YW5nbGVfaW4gKyB0aGV0YSArIHJvdGF0ZTsKLSAgICAgICAgfQorICAgICAgICBpZiAoIHRoZXRhID09IEZUX0FOR0xFX1BJMiApCisgICAgICAgICAgdGhldGEgPSAtcm90YXRlOwogCi0gICAgICAgIHRoY29zID0gRlRfQ29zKCB0aGV0YSApOwotICAgICAgICBzaWdtYSA9IEZUX011bEZpeCggc3Ryb2tlci0+bWl0ZXJfbGltaXQsIHRoY29zICk7CisgICAgICAgIHBoaSAgICA9IHN0cm9rZXItPmFuZ2xlX2luICsgdGhldGEgKyByb3RhdGU7CisKKyAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZzaWdtYSwgc3Ryb2tlci0+bWl0ZXJfbGltaXQsIHRoZXRhICk7CiAKICAgICAgICAgLyogaXMgbWl0ZXIgbGltaXQgZXhjZWVkZWQ/ICovCi0gICAgICAgIGlmICggc2lnbWEgPCAweDEwMDAwTCApCisgICAgICAgIGlmICggc2lnbWEueCA8IDB4MTAwMDBMICkKICAgICAgICAgewogICAgICAgICAgIC8qIGRvbid0IGNyZWF0ZSB2YXJpYWJsZSBiZXZlbHMgZm9yIHZlcnkgc21hbGwgZGV2aWF0aW9uczsgKi8KICAgICAgICAgICAvKiBGVF9TaW4oeCkgPSAwIGZvciB4IDw9IDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMTMxLDM2ICsxMTAxLDM0IEBACiAgICAgICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7CiAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiB2YXJpYWJsZSBiZXZlbCAqLworICAgICAgICBlbHNlIC8qIHZhcmlhYmxlIGJldmVsIG9yIGNsaXBwZWQgbWl0ZXIgKi8KICAgICAgICAgewogICAgICAgICAgIC8qIHRoZSBtaXRlciBpcyB0cnVuY2F0ZWQgKi8KICAgICAgICAgICBGVF9WZWN0b3IgIG1pZGRsZSwgZGVsdGE7Ci0gICAgICAgICAgRlRfRml4ZWQgICBsZW5ndGg7CisgICAgICAgICAgRlRfRml4ZWQgICBjb2VmOwogCiAKLSAgICAgICAgICAvKiBjb21wdXRlIG1pZGRsZSBwb2ludCAqLworICAgICAgICAgIC8qIGNvbXB1dGUgbWlkZGxlIHBvaW50IGFuZCBmaXJzdCBhbmdsZSBwb2ludCAqLwogICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmbWlkZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHJhZGl1cywgc3Ryb2tlci0+bWl0ZXJfbGltaXQgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGhpICk7CisKKyAgICAgICAgICBjb2VmICAgID0gRlRfRGl2Rml4KCAgMHgxMDAwMEwgLSBzaWdtYS54LCBzaWdtYS55ICk7CisgICAgICAgICAgZGVsdGEueCA9IEZUX011bEZpeCggIG1pZGRsZS55LCBjb2VmICk7CisgICAgICAgICAgZGVsdGEueSA9IEZUX011bEZpeCggLW1pZGRsZS54LCBjb2VmICk7CisKICAgICAgICAgICBtaWRkbGUueCArPSBzdHJva2VyLT5jZW50ZXIueDsKICAgICAgICAgICBtaWRkbGUueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgZmlyc3QgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBsZW5ndGggPSBGVF9NdWxEaXYoIHJhZGl1cywgMHgxMDAwMEwgLSBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3Bvc19hYnMoIEZUX1NpbiggdGhldGEgKSApICk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKKyAgICAgICAgICBkZWx0YS54ICArPSBtaWRkbGUueDsKKyAgICAgICAgICBkZWx0YS55ICArPSBtaWRkbGUueTsKIAogICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwogICAgICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICAgICAgLyogY29tcHV0ZSBzZWNvbmQgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSAtIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKKyAgICAgICAgICBkZWx0YS54ID0gbWlkZGxlLnggLSBkZWx0YS54ICsgbWlkZGxlLng7CisgICAgICAgICAgZGVsdGEueSA9IG1pZGRsZS55IC0gZGVsdGEueSArIG1pZGRsZS55OwogCiAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7CiAgICAgICAgICAgaWYgKCBlcnJvciApCkBAIC0xMTg3LDcgKzExNTUsNyBAQAogICAgICAgICBGVF9WZWN0b3IgIGRlbHRhOwogCiAKLSAgICAgICAgbGVuZ3RoID0gRlRfRGl2Rml4KCBzdHJva2VyLT5yYWRpdXMsIHRoY29zICk7CisgICAgICAgIGxlbmd0aCA9IEZUX011bERpdiggc3Ryb2tlci0+cmFkaXVzLCBzdHJva2VyLT5taXRlcl9saW1pdCwgc2lnbWEueCApOwogCiAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIGxlbmd0aCwgcGhpICk7CiAgICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7CkBAIC0yMDg3LDggKzIwNTUsOCBAQAogICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KIAogICAvKgotICAgKiAgVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHNpbWlsYXIgdG8gRlRfT3V0bGluZV9EZWNvbXBvc2UsIGV4Y2VwdAotICAgKiAgdGhhdCB3ZSBkbyBzdXBwb3J0IG9wZW5lZCBwYXRocywgYW5kIGRvIG5vdCBzY2FsZSB0aGUgb3V0bGluZS4KKyAgICogVGhlIGZvbGxvd2luZyBpcyB2ZXJ5IHNpbWlsYXIgdG8gRlRfT3V0bGluZV9EZWNvbXBvc2UsIGV4Y2VwdAorICAgKiB0aGF0IHdlIGRvIHN1cHBvcnQgb3BlbmVkIHBhdGhzLCBhbmQgZG8gbm90IHNjYWxlIHRoZSBvdXRsaW5lLgogICAgKi8KICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQogICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCkBAIC0yMzA2LDE3ICsyMjc0LDEyIEBACiAgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAgICAgRlRfR2x5cGggIGdseXBoID0gTlVMTDsKIAotICAgIC8qIGZvciBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAoaW4gUElDIG1vZGUpICovCi0gICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IHN0cm9rZXItPmxpYnJhcnk7Ci0KLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQogCiAgICAgaWYgKCAhcGdseXBoICkKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIGdseXBoID0gKnBnbHlwaDsKLSAgICBpZiAoICFnbHlwaCB8fCBnbHlwaC0+Y2xhenogIT0gRlRfT1VUTElORV9HTFlQSF9DTEFTU19HRVQgKQorICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSAmZnRfb3V0bGluZV9nbHlwaF9jbGFzcyApCiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICB7CkBAIC0yMzg2LDE3ICsyMzQ5LDEyIEBACiAgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAgICAgRlRfR2x5cGggIGdseXBoID0gTlVMTDsKIAotICAgIC8qIGZvciBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAoaW4gUElDIG1vZGUpICovCi0gICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IHN0cm9rZXItPmxpYnJhcnk7Ci0KLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQogCiAgICAgaWYgKCAhcGdseXBoICkKICAgICAgIGdvdG8gRXhpdDsKIAogICAgIGdseXBoID0gKnBnbHlwaDsKLSAgICBpZiAoICFnbHlwaCB8fCBnbHlwaC0+Y2xhenogIT0gRlRfT1VUTElORV9HTFlQSF9DTEFTU19HRVQgKQorICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSAmZnRfb3V0bGluZV9nbHlwaF9jbGFzcyApCiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHN5bnRoLmMgYi9zcmMvYmFzZS9mdHN5bnRoLmMKaW5kZXggYzI4MzQ2Ny4uYTkxMTllMiAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnRzeW50aC5jCisrKyBiL3NyYy9iYXNlL2Z0c3ludGguYwpAQCAtMSwzNyArMSwzNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeW50aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN5bnRoZXNpemluZyBjb2RlIGZvciBlbWJvbGRlbmluZyBhbmQgc2xhbnRpbmcgKGJvZHkpLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzeW50aC5jCisgKgorICogICBGcmVlVHlwZSBzeW50aGVzaXppbmcgY29kZSBmb3IgZW1ib2xkZW5pbmcgYW5kIHNsYW50aW5nIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lOVEhFU0lTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c3ludGguaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdXRsbi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Yml0bWFwLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3ludGgKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBzeW50aAogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzAsNyArMTI5LDcgQEAKICAgICAgIGlmICggKCB5c3RyID4+IDYgKSA+IEZUX0lOVF9NQVggfHwgKCB5c3RyID4+IDYgKSA8IEZUX0lOVF9NSU4gKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTEoKCAiRlRfR2x5cGhTbG90X0VtYm9sZGVuOiIgKSk7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJ0b28gc3Ryb25nIGVtYm9sZGVuaW5nIHBhcmFtZXRlciB5c3RyPSVkXG4iLCB5c3RyICkpOworICAgICAgICBGVF9UUkFDRTEoKCAidG9vIHN0cm9uZyBlbWJvbGRlbmluZyBwYXJhbWV0ZXIgeXN0cj0lbGRcbiIsIHlzdHIgKSk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIGVycm9yID0gRlRfR2x5cGhTbG90X093bl9CaXRtYXAoIHNsb3QgKTsKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0c3lzdGVtLmMgYi9zcmMvYmFzZS9mdHN5c3RlbS5jCmluZGV4IDZhZGViZGIuLjMwMTNjYmQgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0c3lzdGVtLmMKKysrIGIvc3JjL2Jhc2UvZnRzeXN0ZW0uYwpAQCAtMSw3MCArMSw3MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzeXN0ZW0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRzeXN0ZW0uYworICoKKyAqICAgQU5TSS1zcGVjaWZpYyBGcmVlVHlwZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgdXNlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgICAqLwotICAvKiBsb3ctbGV2ZWwsIGkuZS4gbWVtb3J5IG1hbmFnZW1lbnQsIGkvbyBhY2Nlc3MgYXMgd2VsbCBhcyB0aHJlYWQgICAgICAgKi8KLSAgLyogc3luY2hyb25pc2F0aW9uLiAgSXQgY2FuIGJlIHJlcGxhY2VkIGJ5IHVzZXItc3BlY2lmaWMgcm91dGluZXMgaWYgICAgICovCi0gIC8qIG5lY2Vzc2FyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmF1bHQgaW50ZXJmYWNlIHVzZWQgYnkgRnJlZVR5cGUgdG8gYWNjZXNzCisgICAqIGxvdy1sZXZlbCwgaS5lLiBtZW1vcnkgbWFuYWdlbWVudCwgaS9vIGFjY2VzcyBhcyB3ZWxsIGFzIHRocmVhZAorICAgKiBzeW5jaHJvbmlzYXRpb24uICBJdCBjYW4gYmUgcmVwbGFjZWQgYnkgdXNlci1zcGVjaWZpYyByb3V0aW5lcyBpZgorICAgKiBuZWNlc3NhcnkuCisgICAqCisgICAqLwogCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgIE1FTU9SWSBNQU5BR0VNRU5UIElOVEVSRkFDRQorICAgKgorICAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYW55IGVycm9yIGNoZWNraW5nIGZvciB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiBhbGxvY2F0aW9uLXJlbGF0ZWQgZnVuY3Rpb25zLiAgVGhpcyB3aWxsIGJlIGRvbmUgYnkgdGhlIGhpZ2hlciBsZXZlbCAgKi8KLSAgLyogcm91dGluZXMgbGlrZSBmdF9tZW1fYWxsb2MoKSBvciBmdF9tZW1fcmVhbGxvYygpLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZG8gYW55IGVycm9yIGNoZWNraW5nIGZvciB0aGUKKyAgICogYWxsb2NhdGlvbi1yZWxhdGVkIGZ1bmN0aW9ucy4gIFRoaXMgd2lsbCBiZSBkb25lIGJ5IHRoZSBoaWdoZXIgbGV2ZWwKKyAgICogcm91dGluZXMgbGlrZSBmdF9tZW1fYWxsb2MoKSBvciBmdF9tZW1fcmVhbGxvYygpLgorICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgIDo6IFRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGZ0X2FsbG9jCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGUgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgcmVxdWVzdGVkIHNpemUgaW4gYnl0ZXMuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgVGhlIGFkZHJlc3Mgb2YgbmV3bHkgYWxsb2NhdGVkIGJsb2NrLgorICAgKi8KICAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkKiApCiAgIGZ0X2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgIGxvbmcgICAgICAgc2l6ZSApCkBAIC03NSwyNiArNzcsMzAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19zaXplIDo6IFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGZ0X3JlYWxsb2MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBtZW1vcnkgcmVhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBvYmplY3QuCisgICAqCisgICAqICAgY3VyX3NpemUgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAqCisgICAqICAgbmV3X3NpemUgOjoKKyAgICogICAgIFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4KKyAgICoKKyAgICogICBibG9jayA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFRoZSBhZGRyZXNzIG9mIHRoZSByZWFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAqLwogICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKICAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCiAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCkBAIC0xMDgsMTkgKzExNCwyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9mcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgIDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsb2NrICAgOjogVGhlIGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5IHRvIGJlIGZyZWVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF9mcmVlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGUgbWVtb3J5IHJlbGVhc2UgZnVuY3Rpb24uCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogICBibG9jayA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgYmxvY2sgaW4gbWVtb3J5IHRvIGJlIGZyZWVkLgorICAgKi8KICAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKICAgZnRfZnJlZSggRlRfTWVtb3J5ICBtZW1vcnksCiAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQpAQCAtMTMxLDM5ICsxMzksNDAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgIFJFU09VUkNFIE1BTkFHRU1FTlQgSU5URVJGQUNFCisgICAqCisgICAqLwogCiAjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fRElTQUJMRV9TVFJFQU1fU1VQUE9SVAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbworI2RlZmluZSBGVF9DT01QT05FTlQgIGlvCiAKICAgLyogV2UgdXNlIHRoZSBtYWNybyBTVFJFQU1fRklMRSBmb3IgY29udmVuaWVuY2UgdG8gZXh0cmFjdCB0aGUgICAgICAgKi8KICAgLyogc3lzdGVtLXNwZWNpZmljIHN0cmVhbSBoYW5kbGUgZnJvbSBhIGdpdmVuIEZyZWVUeXBlIHN0cmVhbSBvYmplY3QgKi8KICNkZWZpbmUgU1RSRUFNX0ZJTEUoIHN0cmVhbSApICAoIChGVF9GSUxFKilzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9hbnNpX3N0cmVhbV9jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgZnRfYW5zaV9zdHJlYW1fY2xvc2UKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBmdW5jdGlvbiB0byBjbG9zZSBhIHN0cmVhbS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LgorICAgKi8KICAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKICAgZnRfYW5zaV9zdHJlYW1fY2xvc2UoIEZUX1N0cmVhbSAgc3RyZWFtICkKICAgewpAQCAtMTc1LDI4ICsxODQsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfYW5zaV9zdHJlYW1faW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZ1bmN0aW9uIHRvIG9wZW4gYSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgOjogVGhlIHBvc2l0aW9uIGluIHRoZSBkYXRhIHN0cmVhbSB0byBzdGFydCByZWFkaW5nLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIHRoZSBzdHJlYW0uICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkLiAgSWYgYGNvdW50JyBpcyB6ZXJvICh0aGlzIGlzLCAgICovCi0gIC8qICAgIHRoZSBmdW5jdGlvbiBpcyB1c2VkIGZvciBzZWVraW5nKSwgYSBub24temVybyByZXR1cm4gdmFsdWUgICAgICAgICAqLwotICAvKiAgICBpbmRpY2F0ZXMgYW4gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgZnRfYW5zaV9zdHJlYW1faW8KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBmdW5jdGlvbiB0byBvcGVuIGEgc3RyZWFtLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHN0cmVhbSBvYmplY3QuCisgICAqCisgICAqICAgb2Zmc2V0IDo6CisgICAqICAgICBUaGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgc3RyZWFtIHRvIHN0YXJ0IHJlYWRpbmcuCisgICAqCisgICAqICAgYnVmZmVyIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiBidWZmZXIgdG8gc3RvcmUgdGhlIHJlYWQgZGF0YS4KKyAgICoKKyAgICogICBjb3VudCA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuICBJZiBgY291bnQnIGlzIHplcm8gKHRoaXMgaXMsCisgICAqICAgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlZWtpbmcpLCBhIG5vbi16ZXJvIHJldHVybiB2YWx1ZQorICAgKiAgIGluZGljYXRlcyBhbiBlcnJvci4KKyAgICovCiAgIEZUX0NBTExCQUNLX0RFRiggdW5zaWduZWQgbG9uZyApCiAgIGZ0X2Fuc2lfc3RyZWFtX2lvKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIG9mZnNldCwKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Z0dHJpZ29uLmMgYi9zcmMvYmFzZS9mdHRyaWdvbi5jCmluZGV4IGQ2ZGQwOTguLmM2ZjAyN2MgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0dHJpZ29uLmMKKysrIGIvc3JjL2Jhc2UvZnR0cmlnb24uYwpAQCAtMSwzOCArMSwzNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmlnb24uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnR0cmlnb24uYworICoKKyAqICAgRnJlZVR5cGUgdHJpZ29ub21ldHJpYyBmdW5jdGlvbnMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgZml4ZWQtcG9pbnQgQ09SRElDIGltcGxlbWVudGF0aW9uIG9mIHRyaWdvbm9tZXRyaWMgICAgICAgICAgKi8KLSAgLyogZnVuY3Rpb25zIGFzIHdlbGwgYXMgdHJhbnNmb3JtYXRpb25zIGJldHdlZW4gQ2FydGVzaWFuIGFuZCBwb2xhciAgICAgICovCi0gIC8qIGNvb3JkaW5hdGVzLiAgVGhlIGFuZ2xlcyBhcmUgcmVwcmVzZW50ZWQgYXMgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzICAqLwotICAvKiBpbiBkZWdyZWVzLCBpLmUuLCB0aGUgYW5ndWxhciByZXNvbHV0aW9uIGlzIDJeLTE2IGRlZ3JlZXMuICBOb3RlIHRoYXQgKi8KLSAgLyogb25seSB2ZWN0b3JzIGxvbmdlciB0aGFuIDJeMTYqMTgwL3BpIChvciBhdCBsZWFzdCAyMiBiaXRzKSBvbiBhICAgICAgICovCi0gIC8qIGRpc2NyZXRlIENhcnRlc2lhbiBncmlkIGNhbiBoYXZlIHRoZSBzYW1lIG9yIGJldHRlciBhbmd1bGFyICAgICAgICAgICAqLwotICAvKiByZXNvbHV0aW9uLiAgVGhlcmVmb3JlLCB0byBtYWludGFpbiB0aGlzIHByZWNpc2lvbiwgc29tZSBmdW5jdGlvbnMgICAgKi8KLSAgLyogcmVxdWlyZSBhbiBpbnRlcmltIHVwc2NhbGluZyBvZiB0aGUgdmVjdG9ycywgd2hlcmVhcyBvdGhlcnMgb3BlcmF0ZSAgICovCi0gIC8qIHdpdGggMjQtYml0IGxvbmcgdmVjdG9ycyBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGlzIGEgZml4ZWQtcG9pbnQgQ09SRElDIGltcGxlbWVudGF0aW9uIG9mIHRyaWdvbm9tZXRyaWMKKyAgICogZnVuY3Rpb25zIGFzIHdlbGwgYXMgdHJhbnNmb3JtYXRpb25zIGJldHdlZW4gQ2FydGVzaWFuIGFuZCBwb2xhcgorICAgKiBjb29yZGluYXRlcy4gIFRoZSBhbmdsZXMgYXJlIHJlcHJlc2VudGVkIGFzIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlcworICAgKiBpbiBkZWdyZWVzLCBpLmUuLCB0aGUgYW5ndWxhciByZXNvbHV0aW9uIGlzIDJeLTE2IGRlZ3JlZXMuICBOb3RlIHRoYXQKKyAgICogb25seSB2ZWN0b3JzIGxvbmdlciB0aGFuIDJeMTYqMTgwL3BpIChvciBhdCBsZWFzdCAyMiBiaXRzKSBvbiBhCisgICAqIGRpc2NyZXRlIENhcnRlc2lhbiBncmlkIGNhbiBoYXZlIHRoZSBzYW1lIG9yIGJldHRlciBhbmd1bGFyCisgICAqIHJlc29sdXRpb24uICBUaGVyZWZvcmUsIHRvIG1haW50YWluIHRoaXMgcHJlY2lzaW9uLCBzb21lIGZ1bmN0aW9ucworICAgKiByZXF1aXJlIGFuIGludGVyaW0gdXBzY2FsaW5nIG9mIHRoZSB2ZWN0b3JzLCB3aGVyZWFzIG90aGVycyBvcGVyYXRlCisgICAqIHdpdGggMjQtYml0IGxvbmcgdmVjdG9ycyBkaXJlY3RseS4KKyAgICoKKyAgICovCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnR0cmlnb24uaD4KIAogCiAgIC8qIHRoZSBDb3JkaWMgc2hyaW5rIGZhY3RvciAwLjg1ODc4NTMzNjQ4MDQzNiAqIDJeMzIgKi8KQEAgLTMyNSwxMCArMzI0LDEwIEBACiAgIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKICAgRlRfVGFuKCBGVF9BbmdsZSAgYW5nbGUgKQogICB7Ci0gICAgRlRfVmVjdG9yICB2OworICAgIEZUX1ZlY3RvciAgdiA9IHsgMSA8PCAyNCwgMCB9OwogCiAKLSAgICBGVF9WZWN0b3JfVW5pdCggJnYsIGFuZ2xlICk7CisgICAgZnRfdHJpZ19wc2V1ZG9fcm90YXRlKCAmdiwgYW5nbGUgKTsKIAogICAgIHJldHVybiBGVF9EaXZGaXgoIHYueSwgdi54ICk7CiAgIH0KQEAgLTM3MiwxNCArMzcxLDYgQEAKICAgfQogCiAKLSAgLyogdGhlc2UgbWFjcm9zIHJldHVybiAwIGZvciBwb3NpdGl2ZSBudW1iZXJzLAotICAgICBhbmQgLTEgZm9yIG5lZ2F0aXZlIG9uZXMgKi8KLSNkZWZpbmUgRlRfU0lHTl9MT05HKCB4ICkgICAoICh4KSA+PiAoIEZUX1NJWkVPRl9MT05HICogOCAtIDEgKSApCi0jZGVmaW5lIEZUX1NJR05fSU5UKCB4ICkgICAgKCAoeCkgPj4gKCBGVF9TSVpFT0ZfSU5UICogOCAtIDEgKSApCi0jZGVmaW5lIEZUX1NJR05fSU5UMzIoIHggKSAgKCAoeCkgPj4gMzEgKQotI2RlZmluZSBGVF9TSUdOX0lOVDE2KCB4ICkgICggKHgpID4+IDE1ICkKLQotCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwogCiAgIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQpAQCAtNDA4LDggKzM5OSw4IEBACiAgICAgICBGVF9JbnQzMiAgaGFsZiA9IChGVF9JbnQzMikxTCA8PCAoIHNoaWZ0IC0gMSApOwogCiAKLSAgICAgIHZlYy0+eCA9ICggdi54ICsgaGFsZiArIEZUX1NJR05fTE9ORyggdi54ICkgKSA+PiBzaGlmdDsKLSAgICAgIHZlYy0+eSA9ICggdi55ICsgaGFsZiArIEZUX1NJR05fTE9ORyggdi55ICkgKSA+PiBzaGlmdDsKKyAgICAgIHZlYy0+eCA9ICggdi54ICsgaGFsZiAtICggdi54IDwgMCApICkgPj4gc2hpZnQ7CisgICAgICB2ZWMtPnkgPSAoIHYueSArIGhhbGYgLSAoIHYueSA8IDAgKSApID4+IHNoaWZ0OwogICAgIH0KICAgICBlbHNlCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR0eXBlMS5jIGIvc3JjL2Jhc2UvZnR0eXBlMS5jCmluZGV4IGFhOGY4Y2MuLmJlNjBlZDYgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0dHlwZTEuYworKysgYi9zcmMvYmFzZS9mdHR5cGUxLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZTEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIFBTIG5hbWVzIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0dHlwZTEuYworICoKKyAqICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIGZvciBQUyBuYW1lcyBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaD4KIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdDF0YWJsZXMuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR1dGlsLmMgYi9zcmMvYmFzZS9mdHV0aWwuYwppbmRleCA0ZGU1ZjJjLi5kOTBjZmJjIDEwMDY0NAotLS0gYS9zcmMvYmFzZS9mdHV0aWwuYworKysgYi9zcmMvYmFzZS9mdHV0aWwuYwpAQCAtMSwzNiArMSwzNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR1dGlsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZmlsZSBmb3IgbWVtb3J5IGFuZCBsaXN0IG1hbmFnZW1lbnQgKGJvZHkpLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnR1dGlsLmMKKyAqCisgKiAgIEZyZWVUeXBlIHV0aWxpdHkgZmlsZSBmb3IgbWVtb3J5IGFuZCBsaXN0IG1hbmFnZW1lbnQgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9MSVNUX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGxpc3QuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9tZW1vcnkKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBtZW1vcnkKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTQsNyArNTMsNyBAQAogICAgIEZUX0Vycm9yICAgIGVycm9yOwogICAgIEZUX1BvaW50ZXIgIGJsb2NrID0gZnRfbWVtX3FhbGxvYyggbWVtb3J5LCBzaXplLCAmZXJyb3IgKTsKIAotICAgIGlmICggIWVycm9yICYmIHNpemUgPiAwICkKKyAgICBpZiAoICFlcnJvciAmJiBibG9jayAmJiBzaXplID4gMCApCiAgICAgICBGVF9NRU1fWkVSTyggYmxvY2ssIHNpemUgKTsKIAogICAgICpwX2Vycm9yID0gZXJyb3I7CkBAIC0xMDEsNyArMTAwLDcgQEAKIAogICAgIGJsb2NrID0gZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIGl0ZW1fc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvdW50LCBuZXdfY291bnQsIGJsb2NrLCAmZXJyb3IgKTsKLSAgICBpZiAoICFlcnJvciAmJiBuZXdfY291bnQgPiBjdXJfY291bnQgKQorICAgIGlmICggIWVycm9yICYmIGJsb2NrICYmIG5ld19jb3VudCA+IGN1cl9jb3VudCApCiAgICAgICBGVF9NRU1fWkVSTyggKGNoYXIqKWJsb2NrICsgY3VyX2NvdW50ICogaXRlbV9zaXplLAogICAgICAgICAgICAgICAgICAgICggbmV3X2NvdW50IC0gY3VyX2NvdW50ICkgKiBpdGVtX3NpemUgKTsKIApAQCAtMTg1LDcgKzE4NCw3IEBACiAgICAgRlRfUG9pbnRlciAgcCA9IGZ0X21lbV9xYWxsb2MoIG1lbW9yeSwgKEZUX0xvbmcpc2l6ZSwgJmVycm9yICk7CiAKIAotICAgIGlmICggIWVycm9yICYmIGFkZHJlc3MgKQorICAgIGlmICggIWVycm9yICYmIGFkZHJlc3MgJiYgc2l6ZSA+IDAgKQogICAgICAgZnRfbWVtY3B5KCBwLCBhZGRyZXNzLCBzaXplICk7CiAKICAgICAqcF9lcnJvciA9IGVycm9yOwpAQCAtMjM2LDcgKzIzNSw3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2xpc3QKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBsaXN0CiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwogCmRpZmYgLS1naXQgYS9zcmMvYmFzZS9mdHZlci5yYyBiL3NyYy9iYXNlL2Z0dmVyLnJjCmluZGV4IGEyOTAzZDUuLjBiOTJlOWIgMTAwNjQ0Ci0tLSBhL3NyYy9iYXNlL2Z0dmVyLnJjCisrKyBiL3NyYy9iYXNlL2Z0dmVyLnJjCkBAIC00LDcgKzQsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZyZWVUeXBlIFZFUlNJT05JTkZPIHJlc291cmNlIGZvciBXaW5kb3dzIERMTHMuICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCkBAIC0xOCw4ICsxOCw4IEBACiAKICNpbmNsdWRlPHdpbmRvd3MuaD4KIAotI2RlZmluZSBGVF9WRVJTSU9OICAgICAgMiw5LDEsMAotI2RlZmluZSBGVF9WRVJTSU9OX1NUUiAgIjIuOS4xIgorI2RlZmluZSBGVF9WRVJTSU9OICAgICAgMiwxMCw0LDAKKyNkZWZpbmUgRlRfVkVSU0lPTl9TVFIgICIyLjEwLjQiCiAKIFZTX1ZFUlNJT05fSU5GTyAgICAgIFZFUlNJT05JTkZPCiBGSUxFVkVSU0lPTiAgICAgICAgICBGVF9WRVJTSU9OCkBAIC0yOCw3ICsyOCw3IEBACiAjaWZkZWYgX0RFQlVHCiBGSUxFRkxBR1MgICAgICAgICAgICBWU19GRl9ERUJVRwogI2VuZGlmCi0jaWZkZWYgX0RMTAorI2lmZGVmIERMTF9FWFBPUlQKIEZJTEVUWVBFICAgICAgICAgICAgIFZGVF9ETEwKICNkZWZpbmUgRlRfRklMRU5BTUUgICJmcmVldHlwZS5kbGwiCiAjZWxzZQpAQCAtNDUsNyArNDUsNyBAQAogICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICBGVF9WRVJTSU9OX1NUUgogICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgICAgICAiRnJlZVR5cGUiCiAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAgIEZUX1ZFUlNJT05fU1RSCi0gICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAgICJcMjUxIDIwMTggVGhlIEZyZWVUeXBlIFByb2plY3Qgd3d3LmZyZWV0eXBlLm9yZy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4iCisgICAgICBWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAgICJcMjUxIDIwMDAtMjAyMCBUaGUgRnJlZVR5cGUgUHJvamVjdCB3d3cuZnJlZXR5cGUub3JnLiBBbGwgcmlnaHRzIHJlc2VydmVkLiIKICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgImZyZWV0eXBlIgogICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCBGVF9GSUxFTkFNRQogICAgIEVORApkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvZnR3aW5mbnQuYyBiL3NyYy9iYXNlL2Z0d2luZm50LmMKaW5kZXggMTFiZDI4YS4uNjk5ZGMzZCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvZnR3aW5mbnQuYworKysgYi9zcmMvYmFzZS9mdHdpbmZudC5jCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHdpbmZudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgV2luZG93cyBGTlQgc3BlY2lmaWMgaW5mbyAoYm9keSkuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHdpbmZudC5jCisgKgorICogICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBXaW5kb3dzIEZOVCBzcGVjaWZpYyBpbmZvIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfV0lORk9OVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1dJTkZOVF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0d2luZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaD4KIAogCiAgIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR3aW5mbnQuaCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2Jhc2UvcnVsZXMubWsgYi9zcmMvYmFzZS9ydWxlcy5tawppbmRleCBlOTgwNWJkLi40MTFjNGM4IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9ydWxlcy5taworKysgYi9zcmMvYmFzZS9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMzYsMTcgKzM2LDE3IEBACiAjIEFsbCBmaWxlcyBsaXN0ZWQgaGVyZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYGZ0YmFzZS5jJyAoZm9yIGEgYHNpbmdsZScKICMgYnVpbGQpLgogIwotQkFTRV9TUkMgOj0gJChCQVNFX0RJUikvYmFzZXBpYy5jICBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdGFkdmFuYy5jIFwKK0JBU0VfU1JDIDo9ICQoQkFTRV9ESVIpL2Z0YWR2YW5jLmMgXAogICAgICAgICAgICAgJChCQVNFX0RJUikvZnRjYWxjLmMgICBcCisgICAgICAgICAgICAkKEJBU0VfRElSKS9mdGNvbG9yLmMgIFwKICAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0ZGJnbWVtLmMgXAorICAgICAgICAgICAgJChCQVNFX0RJUikvZnRlcnJvcnMuYyBcCiAgICAgICAgICAgICAkKEJBU0VfRElSKS9mdGZudGZtdC5jIFwKICAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0Z2xvYWRyLmMgXAogICAgICAgICAgICAgJChCQVNFX0RJUikvZnRoYXNoLmMgICBcCiAgICAgICAgICAgICAkKEJBU0VfRElSKS9mdGxjZGZpbC5jIFwKICAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0b2Jqcy5jICAgXAogICAgICAgICAgICAgJChCQVNFX0RJUikvZnRvdXRsbi5jICBcCi0gICAgICAgICAgICAkKEJBU0VfRElSKS9mdHBpYy5jICAgIFwKICAgICAgICAgICAgICQoQkFTRV9ESVIpL2Z0cHNwcm9wLmMgXAogICAgICAgICAgICAgJChCQVNFX0RJUikvZnRyZm9yay5jICBcCiAgICAgICAgICAgICAkKEJBU0VfRElSKS9mdHNuYW1lcy5jIFwKQEAgLTYwLDggKzYwLDcgQEAKIGVuZGlmCiAKICMgZm9yIHNpbXBsaWNpdHksIHdlIGFsc28gaGFuZGxlIGBtZDUuYycgKHdoaWNoIGdldHMgaW5jbHVkZWQgYnkgYGZ0b2Jqcy5oJykKLUJBU0VfSCA6PSAkKEJBU0VfRElSKS9iYXNlcGljLmggXAotICAgICAgICAgICQoQkFTRV9ESVIpL2Z0YmFzZS5oICBcCitCQVNFX0ggOj0gJChCQVNFX0RJUikvZnRiYXNlLmggIFwKICAgICAgICAgICAkKEJBU0VfRElSKS9tZDUuYyAgICAgXAogICAgICAgICAgICQoQkFTRV9ESVIpL21kNS5oCiAKZGlmZiAtLWdpdCBhL3NyYy9iZGYvSmFtZmlsZSBiL3NyYy9iZGYvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllNDQxYy4uMDAwMDAwMAotLS0gYS9zcmMvYmRmL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2JkZiBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgYmRmIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBiZGZkcml2cgotICAgICAgICAgICAgICAgYmRmbGliCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBiZGYgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvYmRmIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmLmMgYi9zcmMvYmRmL2JkZi5jCmluZGV4IGU1NGRmNjYuLjI0OTAxMmUgMTAwNjQ0Ci0tLSBhL3NyYy9iZGYvYmRmLmMKKysrIGIvc3JjL2JkZi9iZGYuYwpAQCAtMjYsNyArMjYsNiBAQAogCiAKICNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKICNpbmNsdWRlICJiZGZsaWIuYyIKICNpbmNsdWRlICJiZGZkcml2ci5jIgpkaWZmIC0tZ2l0IGEvc3JjL2JkZi9iZGYuaCBiL3NyYy9iZGYvYmRmLmgKaW5kZXggOTAxMjcyNy4uNWFjYmQ1ZiAxMDA2NDQKLS0tIGEvc3JjL2JkZi9iZGYuaAorKysgYi9zcmMvYmRmL2JkZi5oCkBAIC0zMCwxMCArMzAsOSBAQAogICogQmFzZWQgb24gYmRmLmgsdiAxLjE2IDIwMDAvMDMvMTYgMjA6MDg6NTEgbWxlaXNoZXIKICAqLwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0hBU0hfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC01MSwxMSArNTAsMTEgQEAKIC8qIGVuZCBvZiBiZGZQLmggKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQkRGIGZvbnQgb3B0aW9ucyBtYWNyb3MgYW5kIHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEJERiBmb250IG9wdGlvbnMgbWFjcm9zIGFuZCB0eXBlcy4KKyAgICoKKyAgICovCiAKIAogI2RlZmluZSBCREZfQ09SUkVDVF9NRVRSSUNTICAweDAxIC8qIENvcnJlY3QgaW52YWxpZCBtZXRyaWNzIHdoZW4gbG9hZGluZy4gKi8KQEAgLTkzLDExICs5MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgY2xpZW50X2RhdGEgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQkRGIGZvbnQgcHJvcGVydHkgbWFjcm9zIGFuZCB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEJERiBmb250IHByb3BlcnR5IG1hY3JvcyBhbmQgdHlwZXMuCisgICAqCisgICAqLwogCiAKICNkZWZpbmUgQkRGX0FUT00gICAgICAxCkBAIC0xMDksOSArMTA4LDkgQEAKICAgLyogVGhlcmUgYXJlIGEgc2V0IG9mIGRlZmF1bHRzIGFuZCBlYWNoIGZvbnQgaGFzIHRoZWlyIG93bi4gICAqLwogICB0eXBlZGVmIHN0cnVjdCAgYmRmX3Byb3BlcnR5X3RfCiAgIHsKLSAgICBjaGFyKiAgbmFtZTsgICAgICAgICAvKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4gICAqLwotICAgIGludCAgICBmb3JtYXQ7ICAgICAgIC8qIEZvcm1hdCBvZiB0aGUgcHJvcGVydHkuICovCi0gICAgaW50ICAgIGJ1aWx0aW47ICAgICAgLyogQSBidWlsdGluIHByb3BlcnR5LiAgICAgKi8KKyAgICBjb25zdCBjaGFyKiAgbmFtZTsgICAgICAgICAvKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4gICAqLworICAgIGludCAgICAgICAgICBmb3JtYXQ7ICAgICAgIC8qIEZvcm1hdCBvZiB0aGUgcHJvcGVydHkuICovCisgICAgaW50ICAgICAgICAgIGJ1aWx0aW47ICAgICAgLyogQSBidWlsdGluIHByb3BlcnR5LiAgICAgKi8KICAgICB1bmlvbgogICAgIHsKICAgICAgIGNoYXIqICAgICAgICAgIGF0b207CkBAIC0xMjMsMTEgKzEyMiwxMSBAQAogICB9IGJkZl9wcm9wZXJ0eV90OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBtZXRyaWMgYW5kIGdseXBoIHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQkRGIGZvbnQgbWV0cmljIGFuZCBnbHlwaCB0eXBlcy4KKyAgICoKKyAgICovCiAKIAogICB0eXBlZGVmIHN0cnVjdCAgYmRmX2JieF90XwpAQCAtMTQ3LDcgKzE0Niw3IEBACiAgIHR5cGVkZWYgc3RydWN0ICBiZGZfZ2x5cGhfdF8KICAgewogICAgIGNoYXIqICAgICAgICAgICBuYW1lOyAgICAgICAgLyogR2x5cGggbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgbG9uZyAgICAgICAgICAgIGVuY29kaW5nOyAgICAvKiBHbHlwaCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgZW5jb2Rpbmc7ICAgIC8qIEdseXBoIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIHVuc2lnbmVkIHNob3J0ICBzd2lkdGg7ICAgICAgLyogU2NhbGFibGUgd2lkdGguICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgdW5zaWduZWQgc2hvcnQgIGR3aWR0aDsgICAgICAvKiBEZXZpY2Ugd2lkdGguICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBiZGZfYmJ4X3QgICAgICAgYmJ4OyAgICAgICAgIC8qIEdseXBoIGJvdW5kaW5nIGJveC4gICAgICAgICAgICAgICAgICAqLwpAQCAtMTU4LDIwICsxNTcsNiBAQAogICB9IGJkZl9nbHlwaF90OwogCiAKLSAgdHlwZWRlZiBzdHJ1Y3QgIGJkZl9nbHlwaGxpc3RfdF8KLSAgewotICAgIHVuc2lnbmVkIHNob3J0ICBwYWQ7ICAgICAgICAgIC8qIFBhZCB0byA0LWJ5dGUgYm91bmRhcnkuICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIHNob3J0ICBicHA7ICAgICAgICAgIC8qIEJpdHMgcGVyIHBpeGVsLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgICAgICAgICAgICBzdGFydDsgICAgICAgIC8qIEJlZ2lubmluZyBlbmNvZGluZyB2YWx1ZSBvZiBnbHlwaHMuICAqLwotICAgIGxvbmcgICAgICAgICAgICBlbmQ7ICAgICAgICAgIC8qIEVuZGluZyBlbmNvZGluZyB2YWx1ZSBvZiBnbHlwaHMuICAgICAqLwotICAgIGJkZl9nbHlwaF90KiAgICBnbHlwaHM7ICAgICAgIC8qIEdseXBocyB0aGVtc2VsdmVzLiAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICBnbHlwaHNfc2l6ZTsgIC8qIEdseXBoIHN0cnVjdHVyZXMgYWxsb2NhdGVkLiAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgICBnbHlwaHNfdXNlZDsgIC8qIEdseXBoIHN0cnVjdHVyZXMgdXNlZC4gICAgICAgICAgICAgICAqLwotICAgIGJkZl9iYnhfdCAgICAgICBiYng7ICAgICAgICAgIC8qIE92ZXJhbGwgYm91bmRpbmcgYm94IG9mIGdseXBocy4gICAgICAqLwotCi0gIH0gYmRmX2dseXBobGlzdF90OwotCi0KICAgdHlwZWRlZiBzdHJ1Y3QgIGJkZl9mb250X3RfCiAgIHsKICAgICBjaGFyKiAgICAgICAgICAgIG5hbWU7ICAgICAgICAgICAvKiBOYW1lIG9mIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg1LDcgKzE3MCw3IEBACiAKICAgICB1bnNpZ25lZCBzaG9ydCAgIG1vbm93aWR0aDsgICAgICAvKiBMb2dpY2FsIHdpZHRoIGZvciBtb25vd2lkdGggZm9udC4gICAqLwogCi0gICAgbG9uZyAgICAgICAgICAgICBkZWZhdWx0X2NoYXI7ICAgLyogRW5jb2Rpbmcgb2YgdGhlIGRlZmF1bHQgZ2x5cGguICAgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nICAgIGRlZmF1bHRfY2hhcjsgICAvKiBFbmNvZGluZyBvZiB0aGUgZGVmYXVsdCBnbHlwaC4gICAgICAqLwogCiAgICAgbG9uZyAgICAgICAgICAgICBmb250X2FzY2VudDsgICAgLyogRm9udCBhc2NlbnQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBsb25nICAgICAgICAgICAgIGZvbnRfZGVzY2VudDsgICAvKiBGb250IGRlc2NlbnQuICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA1LDE2ICsxOTAsOCBAQAogICAgIGNoYXIqICAgICAgICAgICAgY29tbWVudHM7ICAgICAgIC8qIEZvbnQgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgdW5zaWduZWQgbG9uZyAgICBjb21tZW50c19sZW47ICAgLyogTGVuZ3RoIG9mIGNvbW1lbnQgc3RyaW5nLiAgICAgICAgICAgKi8KIAotICAgIGJkZl9nbHlwaGxpc3RfdCAgb3ZlcmZsb3c7ICAgICAgIC8qIFN0b3JhZ2UgdXNlZCBmb3IgZ2x5cGggaW5zZXJ0aW9uLiAgICovCi0KICAgICB2b2lkKiAgICAgICAgICAgIGludGVybmFsOyAgICAgICAvKiBJbnRlcm5hbCBkYXRhIGZvciB0aGUgZm9udC4gICAgICAgICAqLwogCi0gICAgLyogVGhlIHNpemUgb2YgdGhlIG5leHQgdHdvIGFycmF5cyBtdXN0IGJlIGluIHN5bmMgd2l0aCB0aGUgKi8KLSAgICAvKiBzaXplIG9mIHRoZSBgaGF2ZScgYXJyYXkgaW4gdGhlIGBiZGZfcGFyc2VfdCcgc3RydWN0dXJlLiAqLwotICAgIHVuc2lnbmVkIGxvbmcgICAgbm1vZFszNDgxNl07ICAgIC8qIEJpdG1hcCBpbmRpY2F0aW5nIG1vZGlmaWVkIGdseXBocy4gICovCi0gICAgdW5zaWduZWQgbG9uZyAgICB1bW9kWzM0ODE2XTsgICAgLyogQml0bWFwIGluZGljYXRpbmcgbW9kaWZpZWQgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmVuY29kZWQgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAqLwotICAgIHVuc2lnbmVkIHNob3J0ICAgbW9kaWZpZWQ7ICAgICAgIC8qIEJvb2xlYW4gaW5kaWNhdGluZyBmb250IG1vZGlmaWVkLiAgICovCiAgICAgdW5zaWduZWQgc2hvcnQgICBicHA7ICAgICAgICAgICAgLyogQml0cyBwZXIgcGl4ZWwuICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwpAQCAtMjI2LDExICsyMDMsMTEgQEAKICAgfSBiZGZfZm9udF90OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUeXBlcyBmb3IgbG9hZC9zYXZlIGNhbGxiYWNrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVHlwZXMgZm9yIGxvYWQvc2F2ZSBjYWxsYmFja3MuCisgICAqCisgICAqLwogCiAKICAgLyogRXJyb3IgY29kZXMuICovCkBAIC0yNDcsMTEgKzIyNCwxMSBAQAogI2RlZmluZSBCREZfSU5WQUxJRF9MSU5FICAgICAgLTEwMAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQkRGIGZvbnQgQVBJLgorICAgKgorICAgKi8KIAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICBiZGZfbG9hZF9mb250KCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLApkaWZmIC0tZ2l0IGEvc3JjL2JkZi9iZGZkcml2ci5jIGIvc3JjL2JkZi9iZGZkcml2ci5jCmluZGV4IGNhOTM3ZjguLmQyOTE4OGIgMTAwNjQ0Ci0tLSBhL3NyYy9iZGYvYmRmZHJpdnIuYworKysgYi9zcmMvYmRmL2JkZmRyaXZyLmMKQEAgLTI0LDE2ICsyNCwxNSBAQAogVEhFIFNPRlRXQVJFLgogKi8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0JERl9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0YmRmLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KIAotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oPgogCiAjaW5jbHVkZSAiYmRmLmgiCiAjaW5jbHVkZSAiYmRmZHJpdnIuaCIKQEAgLTQxLDE0ICs0MCwxNCBAQAogI2luY2x1ZGUgImJkZmVycm9yLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfYmRmZHJpdmVyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgYmRmZHJpdmVyCiAKIAogICB0eXBlZGVmIHN0cnVjdCAgQkRGX0NNYXBSZWNfCkBAIC05OSwxNCArOTgsMTcgQEAKIAogICAgIG1pbiA9IDA7CiAgICAgbWF4ID0gY21hcC0+bnVtX2VuY29kaW5nczsKKyAgICBtaWQgPSAoIG1pbiArIG1heCApID4+IDE7CiAKICAgICB3aGlsZSAoIG1pbiA8IG1heCApCiAgICAgewogICAgICAgRlRfVUxvbmcgIGNvZGU7CiAKIAotICAgICAgbWlkICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pZF0uZW5jOworICAgICAgaWYgKCBtaWQgPj0gbWF4IHx8IG1pZCA8IG1pbiApCisgICAgICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKKworICAgICAgY29kZSA9IGVuY29kaW5nc1ttaWRdLmVuYzsKIAogICAgICAgaWYgKCBjaGFyY29kZSA9PSBjb2RlICkKICAgICAgIHsKQEAgLTEyMCw2ICsxMjIsOSBAQAogICAgICAgICBtYXggPSBtaWQ7CiAgICAgICBlbHNlCiAgICAgICAgIG1pbiA9IG1pZCArIDE7CisKKyAgICAgIC8qIHByZWRpY3Rpb24gaW4gYSBjb250aW51b3VzIGJsb2NrICovCisgICAgICBtaWQgKz0gY2hhcmNvZGUgLSBjb2RlOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CkBAIC0xMzksMTQgKzE0NCwxNyBAQAogCiAgICAgbWluID0gMDsKICAgICBtYXggPSBjbWFwLT5udW1fZW5jb2RpbmdzOworICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKIAogICAgIHdoaWxlICggbWluIDwgbWF4ICkKICAgICB7CiAgICAgICBGVF9VTG9uZyAgY29kZTsgLyogc2FtZSBhcyBCREZfZW5jb2RpbmdfZWwuZW5jICovCiAKIAotICAgICAgbWlkICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pZF0uZW5jOworICAgICAgaWYgKCBtaWQgPj0gbWF4IHx8IG1pZCA8IG1pbiApCisgICAgICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKKworICAgICAgY29kZSA9IGVuY29kaW5nc1ttaWRdLmVuYzsKIAogICAgICAgaWYgKCBjaGFyY29kZSA9PSBjb2RlICkKICAgICAgIHsKQEAgLTE2MCwxOSArMTY4LDIzIEBACiAgICAgICAgIG1heCA9IG1pZDsKICAgICAgIGVsc2UKICAgICAgICAgbWluID0gbWlkICsgMTsKKworICAgICAgLyogcHJlZGljdGlvbiBpbiBhIGNvbnRpbnVvdXMgYmxvY2sgKi8KKyAgICAgIG1pZCArPSBjaGFyY29kZSAtIGNvZGU7CiAgICAgfQogCiAgICAgY2hhcmNvZGUgPSAwOwogICAgIGlmICggbWluIDwgY21hcC0+bnVtX2VuY29kaW5ncyApCiAgICAgewotICAgICAgY2hhcmNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pbl0uZW5jOworICAgICAgY2hhcmNvZGUgPSBlbmNvZGluZ3NbbWluXS5lbmM7CiAgICAgICByZXN1bHQgICA9IGVuY29kaW5nc1ttaW5dLmdseXBoICsgMTsKICAgICB9CiAKICAgRXhpdDoKICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKICAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiYmRmX2NtYXBfY2hhcl9uZXh0OiBjaGFyY29kZSAweCV4ID4gMzJiaXQgQVBJIiApKTsKKyAgICAgIEZUX1RSQUNFMSgoICJiZGZfY21hcF9jaGFyX25leHQ6IGNoYXJjb2RlIDB4JWx4ID4gMzJiaXQgQVBJIiwKKyAgICAgICAgICAgICAgICAgIGNoYXJjb2RlICkpOwogICAgICAgKmFjaGFyY29kZSA9IDA7CiAgICAgICAvKiBYWFg6IHJlc3VsdCBzaG91bGQgYmUgY2hhbmdlZCB0byBpbmRpY2F0ZSBhbiBvdmVyZmxvdyBlcnJvciAqLwogICAgIH0KQEAgLTIwNCwxMyArMjE2LDEzIEBACiAgICAgYmRmX2ZvbnRfdCogICAgICBmb250ICAgPSBiZGYtPmJkZmZvbnQ7CiAgICAgYmRmX3Byb3BlcnR5X3QqICBwcm9wOwogCi0gICAgY2hhciogICBzdHJpbmdzWzRdID0geyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH07Ci0gICAgc2l6ZV90ICBubiwgbGVuLCBsZW5ndGhzWzRdOworICAgIGNvbnN0IGNoYXIqICAgc3RyaW5nc1s0XSA9IHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICAgIHNpemVfdCAgICAgICAgbGVuZ3Roc1s0XSwgbm4sIGxlbjsKIAogCiAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgPSAwOwogCi0gICAgcHJvcCA9IGJkZl9nZXRfZm9udF9wcm9wZXJ0eSggZm9udCwgKGNoYXIgKikiU0xBTlQiICk7CisgICAgcHJvcCA9IGJkZl9nZXRfZm9udF9wcm9wZXJ0eSggZm9udCwgIlNMQU5UIiApOwogICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICBwcm9wLT52YWx1ZS5hdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTycgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbycgfHwKQEAgLTIxOCwzMCArMjMwLDMwIEBACiAgICAgewogICAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7CiAgICAgICBzdHJpbmdzWzJdID0gKCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdPJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdvJyApCi0gICAgICAgICAgICAgICAgICAgPyAoY2hhciAqKSJPYmxpcXVlIgotICAgICAgICAgICAgICAgICAgIDogKGNoYXIgKikiSXRhbGljIjsKKyAgICAgICAgICAgICAgICAgICA/ICJPYmxpcXVlIgorICAgICAgICAgICAgICAgICAgIDogIkl0YWxpYyI7CiAgICAgfQogCi0gICAgcHJvcCA9IGJkZl9nZXRfZm9udF9wcm9wZXJ0eSggZm9udCwgKGNoYXIgKikiV0VJR0hUX05BTUUiICk7CisgICAgcHJvcCA9IGJkZl9nZXRfZm9udF9wcm9wZXJ0eSggZm9udCwgIldFSUdIVF9OQU1FIiApOwogICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICBwcm9wLT52YWx1ZS5hdG9tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnQicgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnYicgKSApCiAgICAgewogICAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgc3RyaW5nc1sxXSA9IChjaGFyICopIkJvbGQiOworICAgICAgc3RyaW5nc1sxXSA9ICJCb2xkIjsKICAgICB9CiAKLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAoY2hhciAqKSJTRVRXSURUSF9OQU1FIiApOworICAgIHByb3AgPSBiZGZfZ2V0X2ZvbnRfcHJvcGVydHkoIGZvbnQsICJTRVRXSURUSF9OQU1FIiApOwogICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgcHJvcC0+dmFsdWUuYXRvbSAmJiAqKHByb3AtPnZhbHVlLmF0b20pICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgISggKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnTicgfHwgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbicgKSApCi0gICAgICBzdHJpbmdzWzNdID0gKGNoYXIgKikocHJvcC0+dmFsdWUuYXRvbSk7CisgICAgICBzdHJpbmdzWzNdID0gKGNvbnN0IGNoYXIgKikocHJvcC0+dmFsdWUuYXRvbSk7CiAKLSAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAoY2hhciAqKSJBRERfU1RZTEVfTkFNRSIgKTsKKyAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAiQUREX1NUWUxFX05BTUUiICk7CiAgICAgaWYgKCBwcm9wICYmIHByb3AtPmZvcm1hdCA9PSBCREZfQVRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICBwcm9wLT52YWx1ZS5hdG9tICYmICoocHJvcC0+dmFsdWUuYXRvbSkgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAhKCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdOJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICduJyApICkKLSAgICAgIHN0cmluZ3NbMF0gPSAoY2hhciAqKShwcm9wLT52YWx1ZS5hdG9tKTsKKyAgICAgIHN0cmluZ3NbMF0gPSAoY29uc3QgY2hhciAqKShwcm9wLT52YWx1ZS5hdG9tKTsKIAogICAgIGZvciAoIGxlbiA9IDAsIG5uID0gMDsgbm4gPCA0OyBubisrICkKICAgICB7CkBAIC0yNTUsNyArMjY3LDcgQEAKIAogICAgIGlmICggbGVuID09IDAgKQogICAgIHsKLSAgICAgIHN0cmluZ3NbMF0gPSAoY2hhciAqKSJSZWd1bGFyIjsKKyAgICAgIHN0cmluZ3NbMF0gPSAiUmVndWxhciI7CiAgICAgICBsZW5ndGhzWzBdID0gZnRfc3RybGVuKCBzdHJpbmdzWzBdICk7CiAgICAgICBsZW4gICAgICAgID0gbGVuZ3Roc1swXSArIDE7CiAgICAgfQpAQCAtMjcxLDcgKzI4Myw3IEBACiAKICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCA0OyBubisrICkKICAgICAgIHsKLSAgICAgICAgY2hhciogIHNyYyA9IHN0cmluZ3Nbbm5dOworICAgICAgICBjb25zdCBjaGFyKiAgc3JjID0gc3RyaW5nc1tubl07CiAKIAogICAgICAgICBsZW4gPSBsZW5ndGhzW25uXTsKQEAgLTM5MCwxMCArNDAyLDEwIEBACiAgICAgICBiZGZfcHJvcGVydHlfdCogIHByb3AgPSBOVUxMOwogCiAKLSAgICAgIEZUX1RSQUNFNCgoICIgIG51bWJlciBvZiBnbHlwaHM6IGFsbG9jYXRlZCAlZCAodXNlZCAlZClcbiIsCisgICAgICBGVF9UUkFDRTQoKCAiICBudW1iZXIgb2YgZ2x5cGhzOiBhbGxvY2F0ZWQgJWxkICh1c2VkICVsZClcbiIsCiAgICAgICAgICAgICAgICAgICBmb250LT5nbHlwaHNfc2l6ZSwKICAgICAgICAgICAgICAgICAgIGZvbnQtPmdseXBoc191c2VkICkpOwotICAgICAgRlRfVFJBQ0U0KCggIiAgbnVtYmVyIG9mIHVuZW5jb2RlZCBnbHlwaHM6IGFsbG9jYXRlZCAlZCAodXNlZCAlZClcbiIsCisgICAgICBGVF9UUkFDRTQoKCAiICBudW1iZXIgb2YgdW5lbmNvZGVkIGdseXBoczogYWxsb2NhdGVkICVsZCAodXNlZCAlbGQpXG4iLAogICAgICAgICAgICAgICAgICAgZm9udC0+dW5lbmNvZGVkX3NpemUsCiAgICAgICAgICAgICAgICAgICBmb250LT51bmVuY29kZWRfdXNlZCApKTsKIApAQCAtNDAxLDggKzQxMyw3IEBACiAgICAgICBiZGZmYWNlLT5mYWNlX2luZGV4ID0gMDsKIAogICAgICAgYmRmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfRkFTVF9HTFlQSFM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMOwogCiAgICAgICBwcm9wID0gYmRmX2dldF9mb250X3Byb3BlcnR5KCBmb250LCAiU1BBQ0lORyIgKTsKICAgICAgIGlmICggcHJvcCAmJiBwcm9wLT5mb3JtYXQgPT0gQkRGX0FUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCkBAIC00NDYsMTMgKzQ1NywxMyBAQAogICAgICAgICBpZiAoIGZvbnQtPmZvbnRfYXNjZW50ID4gMHg3RkZGIHx8IGZvbnQtPmZvbnRfYXNjZW50IDwgLTB4N0ZGRiApCiAgICAgICAgIHsKICAgICAgICAgICBmb250LT5mb250X2FzY2VudCA9IGZvbnQtPmZvbnRfYXNjZW50IDwgMCA/IC0weDdGRkYgOiAweDdGRkY7Ci0gICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIGZvbnQgYXNjZW50IHRvIHZhbHVlICVkXG4iLAorICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBjbGFtcGluZyBmb250IGFzY2VudCB0byB2YWx1ZSAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+Zm9udF9hc2NlbnQgKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCBmb250LT5mb250X2Rlc2NlbnQgPiAweDdGRkYgfHwgZm9udC0+Zm9udF9kZXNjZW50IDwgLTB4N0ZGRiApCiAgICAgICAgIHsKICAgICAgICAgICBmb250LT5mb250X2Rlc2NlbnQgPSBmb250LT5mb250X2Rlc2NlbnQgPCAwID8gLTB4N0ZGRiA6IDB4N0ZGRjsKLSAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgZm9udCBkZXNjZW50IHRvIHZhbHVlICVkXG4iLAorICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBjbGFtcGluZyBmb250IGRlc2NlbnQgdG8gdmFsdWUgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmZvbnRfZGVzY2VudCApKTsKICAgICAgICAgfQogCkBAIC00OTMsNyArNTA0LDcgQEAKICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmwgPCAtMHg1MDRDMkwgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGJzaXplLT5zaXplID0gMHg3RkZGOwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIHBvaW50IHNpemUgdG8gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgcG9pbnQgc2l6ZSB0byB2YWx1ZSAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+c2l6ZSApKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQpAQCAtNTA2LDcgKzUxNyw3IEBACiAgICAgICAgICAgaWYgKCBmb250LT5wb2ludF9zaXplID4gMHg3RkZGICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBic2l6ZS0+c2l6ZSA9IDB4N0ZGRjsKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJCREZfRmFjZV9Jbml0OiBjbGFtcGluZyBwb2ludCBzaXplIHRvIHZhbHVlICVkXG4iLAorICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIHBvaW50IHNpemUgdG8gdmFsdWUgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgYnNpemUtPnNpemUgKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKQEAgLTUyOCw3ICs1MzksNyBAQAogICAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA+IDB4N0ZGRiB8fCBwcm9wLT52YWx1ZS5sIDwgLTB4N0ZGRiApCiAgICAgICAgICAgewogICAgICAgICAgICAgYnNpemUtPnlfcHBlbSA9IDB4N0ZGRiA8PCA2OwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkJERl9GYWNlX0luaXQ6IGNsYW1waW5nIHBpeGVsIHNpemUgdG8gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICBGVF9UUkFDRTAoKCAiQkRGX0ZhY2VfSW5pdDogY2xhbXBpbmcgcGl4ZWwgc2l6ZSB0byB2YWx1ZSAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+eV9wcGVtICkpOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCkBAIC02MDQsNyArNjE1LDcgQEAKICAgICAgICAgZm9yICggbiA9IDA7IG4gPCBmb250LT5nbHlwaHNfc2l6ZTsgbisrICkKICAgICAgICAgewogICAgICAgICAgIChmYWNlLT5lbl90YWJsZVtuXSkuZW5jID0gY3VyW25dLmVuY29kaW5nOwotICAgICAgICAgIEZUX1RSQUNFNCgoICIgIGlkeCAlZCwgdmFsIDB4JWxYXG4iLCBuLCBjdXJbbl0uZW5jb2RpbmcgKSk7CisgICAgICAgICAgRlRfVFJBQ0U0KCggIiAgaWR4ICVsZCwgdmFsIDB4JWxYXG4iLCBuLCBjdXJbbl0uZW5jb2RpbmcgKSk7CiAgICAgICAgICAgKGZhY2UtPmVuX3RhYmxlW25dKS5nbHlwaCA9IChGVF9VU2hvcnQpbjsKIAogICAgICAgICAgIGlmICggY3VyW25dLmVuY29kaW5nID09IGZvbnQtPmRlZmF1bHRfY2hhciApCkBAIC02MTMsNyArNjI0LDcgQEAKICAgICAgICAgICAgICAgZmFjZS0+ZGVmYXVsdF9nbHlwaCA9IChGVF9VSW50KW47CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIEZUX1RSQUNFMSgoICJCREZfRmFjZV9Jbml0OiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZHggJWQgaXMgdG9vIGxhcmdlIGZvciB0aGlzIHN5c3RlbVxuIiwgbiApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZHggJWxkIGlzIHRvbyBsYXJnZSBmb3IgdGhpcyBzeXN0ZW1cbiIsIG4gKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC04MTQsNyArODI1LDcgQEAKICAgICBiaXRtYXAtPnJvd3MgID0gZ2x5cGguYmJ4LmhlaWdodDsKICAgICBiaXRtYXAtPndpZHRoID0gZ2x5cGguYmJ4LndpZHRoOwogICAgIGlmICggZ2x5cGguYnByID4gRlRfSU5UX01BWCApCi0gICAgICBGVF9UUkFDRTEoKCAiQkRGX0dseXBoX0xvYWQ6IHRvbyBsYXJnZSBwaXRjaCAlZCBpcyB0cnVuY2F0ZWRcbiIsCisgICAgICBGVF9UUkFDRTEoKCAiQkRGX0dseXBoX0xvYWQ6IHRvbyBsYXJnZSBwaXRjaCAlbGQgaXMgdHJ1bmNhdGVkXG4iLAogICAgICAgICAgICAgICAgICAgIGdseXBoLmJwciApKTsKICAgICBiaXRtYXAtPnBpdGNoID0gKGludClnbHlwaC5icHI7IC8qIHNhbWUgYXMgRlRfQml0bWFwLnBpdGNoICovCiAKQEAgLTg2Myw3ICs4NzQsNyBAQAogCiAgLyoKICAgKgotICAqICBCREYgU0VSVklDRQorICAqIEJERiBTRVJWSUNFCiAgICoKICAgKi8KIApAQCAtODkxLDcgKzkwMiw4IEBACiAgICAgICAgIGlmICggcHJvcC0+dmFsdWUubCA+IDB4N0ZGRkZGRkZMIHx8IHByb3AtPnZhbHVlLmwgPCAoIC0xIC0gMHg3RkZGRkZGRkwgKSApCiAgICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTEoKCAiYmRmX2dldF9iZGZfcHJvcGVydHk6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGludGVnZXIgMHgleCBpcyB0cnVuY2F0ZWRcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2UgaW50ZWdlciAweCVseCBpcyB0cnVuY2F0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+dmFsdWUubCApKTsKICAgICAgICAgfQogICAgICAgICBhcHJvcGVydHktPnR5cGUgICAgICA9IEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVI7CiAgICAgICAgIGFwcm9wZXJ0eS0+dS5pbnRlZ2VyID0gKEZUX0ludDMyKXByb3AtPnZhbHVlLmw7CkBAIC05MDEsNyArOTEzLDggQEAKICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS51bCA+IDB4RkZGRkZGRkZVTCApCiAgICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTEoKCAiYmRmX2dldF9iZGZfcHJvcGVydHk6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGNhcmRpbmFsIDB4JXggaXMgdHJ1bmNhdGVkXG4iICkpOworICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGNhcmRpbmFsIDB4JWx4IGlzIHRydW5jYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcm9wLT52YWx1ZS51bCApKTsKICAgICAgICAgfQogICAgICAgICBhcHJvcGVydHktPnR5cGUgICAgICAgPSBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTDsKICAgICAgICAgYXByb3BlcnR5LT51LmNhcmRpbmFsID0gKEZUX1VJbnQzMilwcm9wLT52YWx1ZS51bDsKQEAgLTkzOSw3ICs5NTIsNyBAQAogCiAgLyoKICAgKgotICAqICBTRVJWSUNFUyBMSVNUCisgICogU0VSVklDRVMgTElTVAogICAqCiAgICovCiAKZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmZHJpdnIuaCBiL3NyYy9iZGYvYmRmZHJpdnIuaAppbmRleCA5NDU1MDgxLi41NGFhYTMzIDEwMDY0NAotLS0gYS9zcmMvYmRmL2JkZmRyaXZyLmgKKysrIGIvc3JjL2JkZi9iZGZkcml2ci5oCkBAIC0yOCwyMiArMjgsMTcgQEAKICNpZm5kZWYgQkRGRFJJVlJfSF8KICNkZWZpbmUgQkRGRFJJVlJfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2Lmg+CiAKICNpbmNsdWRlICJiZGYuaCIKIAogCiBGVF9CRUdJTl9IRUFERVIKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIEJERl9lbmNvZGluZ19lbF8KICAgewotICAgIEZUX0xvbmcgICAgZW5jOworICAgIEZUX1VMb25nICAgZW5jOwogICAgIEZUX1VTaG9ydCAgZ2x5cGg7CiAKICAgfSBCREZfZW5jb2RpbmdfZWw7CkBAIC02MCw5ICs1NSw2IEBACiAKICAgICBCREZfZW5jb2RpbmdfZWwqICBlbl90YWJsZTsKIAotICAgIEZUX0NoYXJNYXAgICAgICAgIGNoYXJtYXBfaGFuZGxlOwotICAgIEZUX0NoYXJNYXBSZWMgICAgIGNoYXJtYXA7ICAvKiBhIHNpbmdsZSBjaGFybWFwIHBlciBmYWNlICovCi0KICAgICBGVF9VSW50ICAgICAgICAgICBkZWZhdWx0X2dseXBoOwogCiAgIH0gQkRGX0ZhY2VSZWMsICpCREZfRmFjZTsKZGlmZiAtLWdpdCBhL3NyYy9iZGYvYmRmZXJyb3IuaCBiL3NyYy9iZGYvYmRmZXJyb3IuaAppbmRleCBiNDYyYzdkLi5jMWI1NDQ0IDEwMDY0NAotLS0gYS9zcmMvYmRmL2JkZmVycm9yLmgKKysrIGIvc3JjL2JkZi9iZGZlcnJvci5oCkBAIC0yMCwxNiArMjAsMTYgQEAKICAqIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIEJERiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBCREYgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBCREZFUlJPUl9IXwogI2RlZmluZSBCREZFUlJPUl9IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBCREZfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0JERgogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBCREZFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvYmRmL2JkZmxpYi5jIGIvc3JjL2JkZi9iZGZsaWIuYwppbmRleCAyZjVjOTlkLi5hNGRkYjlhIDEwMDY0NAotLS0gYS9zcmMvYmRmL2JkZmxpYi5jCisrKyBiL3NyYy9iZGYvYmRmbGliLmMKQEAgLTIyLDQxICsyMiw0MCBAQAogICogVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYmRmLmMsdiAxLjIyIDIwMDAvMDMvMTYgMjA6MDg6NTAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIHRha2VuIGZyb20gTWFyayBMZWlzaGVyJ3MgeG1iZGZlZCBwYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBiZGYuYyx2IDEuMjIgMjAwMC8wMy8xNiAyMDowODo1MAorICAgKgorICAgKiB0YWtlbiBmcm9tIE1hcmsgTGVpc2hlcidzIHhtYmRmZWQgcGFja2FnZQorICAgKgorICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CiAKICNpbmNsdWRlICJiZGYuaCIKICNpbmNsdWRlICJiZGZlcnJvci5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2JkZmxpYgorI2RlZmluZSBGVF9DT01QT05FTlQgIGJkZmxpYgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZhdWx0IEJERiBmb250IG9wdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRGVmYXVsdCBCREYgZm9udCBvcHRpb25zLgorICAgKgorICAgKi8KIAogCiAgIHN0YXRpYyBjb25zdCBiZGZfb3B0aW9uc190ICBfYmRmX29wdHMgPQpAQCAtNjgsMTAwICs2NywxMDAgQEAKICAgfTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnVpbHRpbiBCREYgZm9udCBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEJ1aWx0aW4gQkRGIGZvbnQgcHJvcGVydGllcy4KKyAgICoKKyAgICovCiAKICAgLyogTGlzdCBvZiBtb3N0IHByb3BlcnRpZXMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmb250LiAgRG9lc24ndCBpbmNsdWRlICovCiAgIC8qIHRoZSBSQVdfKiBhbmQgQVhJU18qIHByb3BlcnRpZXMgaW4gWDExUjYgcG9seW1vcnBoaWMgZm9udHMuICAgICAgICAgICAqLwogCiAgIHN0YXRpYyBjb25zdCBiZGZfcHJvcGVydHlfdCAgX2JkZl9wcm9wZXJ0aWVzW10gPQogICB7Ci0gICAgeyAoY2hhciAqKSJBRERfU1RZTEVfTkFNRSIsICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkFWRVJBR0VfV0lEVEgiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQVZHX0NBUElUQUxfV0lEVEgiLCAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJBVkdfTE9XRVJDQVNFX1dJRFRIIiwgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkNBUF9IRUlHSFQiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQ0hBUlNFVF9DT0xMRUNUSU9OUyIsICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJDSEFSU0VUX0VOQ09ESU5HIiwgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkNIQVJTRVRfUkVHSVNUUlkiLCAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiQ09NTUVOVCIsICAgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJDT1BZUklHSFQiLCAgICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkRFRkFVTFRfQ0hBUiIsICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiREVTVElOQVRJT04iLCAgICAgICAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJERVZJQ0VfRk9OVF9OQU1FIiwgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkVORF9TUEFDRSIsICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRkFDRV9OQU1FIiwgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGQU1JTFlfTkFNRSIsICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZJR1VSRV9XSURUSCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRk9OVCIsICAgICAgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGT05UTkFNRV9SRUdJU1RSWSIsICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZPTlRfQVNDRU5UIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiRk9OVF9ERVNDRU5UIiwgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJGT1VORFJZIiwgICAgICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIkZVTExfTkFNRSIsICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiSVRBTElDX0FOR0xFIiwgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJNQVhfU1BBQ0UiLCAgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIk1JTl9TUEFDRSIsICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiTk9STV9TUEFDRSIsICAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJOT1RJQ0UiLCAgICAgICAgICAgICAgICAgIEJERl9BVE9NLCAgICAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlBJWEVMX1NJWkUiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUE9JTlRfU0laRSIsICAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJRVUFEX1dJRFRIIiwgICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19BU0NFTlQiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX0FWRVJBR0VfV0lEVEgiLCAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfQVZHX0NBUElUQUxfV0lEVEgiLCAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19BVkdfTE9XRVJDQVNFX1dJRFRIIiwgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX0NBUF9IRUlHSFQiLCAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfREVTQ0VOVCIsICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19FTkRfU1BBQ0UiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX0ZJR1VSRV9XSURUSCIsICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfTUFYX1NQQUNFIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19NSU5fU1BBQ0UiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX05PUk1fU1BBQ0UiLCAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfUElYRUxfU0laRSIsICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19QT0lOVF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1BJWEVMU0laRSIsICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfUE9JTlRTSVpFIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19RVUFEX1dJRFRIIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NNQUxMX0NBUF9TSVpFIiwgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1RSSUtFT1VUX0FTQ0VOVCIsICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TVFJJS0VPVVRfREVTQ0VOVCIsICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NVQlNDUklQVF9TSVpFIiwgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1VCU0NSSVBUX1giLCAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TVUJTQ1JJUFRfWSIsICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1NVUEVSU0NSSVBUX1NJWkUiLCAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfU1VQRVJTQ1JJUFRfWCIsICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19TVVBFUlNDUklQVF9ZIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkFXX1VOREVSTElORV9QT1NJVElPTiIsICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSQVdfVU5ERVJMSU5FX1RISUNLTkVTUyIsIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJBV19YX0hFSUdIVCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkVMQVRJVkVfU0VUV0lEVEgiLCAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSRUxBVElWRV9XRUlHSFQiLCAgICAgICAgIEJERl9DQVJESU5BTCwgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlJFU09MVVRJT04iLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiUkVTT0xVVElPTl9YIiwgICAgICAgICAgICBCREZfQ0FSRElOQUwsIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJSRVNPTFVUSU9OX1kiLCAgICAgICAgICAgIEJERl9DQVJESU5BTCwgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNFVFdJRFRIX05BTUUiLCAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU0xBTlQiLCAgICAgICAgICAgICAgICAgICBCREZfQVRPTSwgICAgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTTUFMTF9DQVBfU0laRSIsICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNQQUNJTkciLCAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1RSSUtFT1VUX0FTQ0VOVCIsICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTVFJJS0VPVVRfREVTQ0VOVCIsICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNVQlNDUklQVF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1VCU0NSSVBUX1giLCAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTVUJTQ1JJUFRfWSIsICAgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlNVUEVSU0NSSVBUX1NJWkUiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiU1VQRVJTQ1JJUFRfWCIsICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJTVVBFUlNDUklQVF9ZIiwgICAgICAgICAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIlVOREVSTElORV9QT1NJVElPTiIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiVU5ERVJMSU5FX1RISUNLTkVTUyIsICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJXRUlHSFQiLCAgICAgICAgICAgICAgICAgIEJERl9DQVJESU5BTCwgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIldFSUdIVF9OQU1FIiwgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAotICAgIHsgKGNoYXIgKikiWF9IRUlHSFQiLCAgICAgICAgICAgICAgICBCREZfSU5URUdFUiwgIDEsIHsgMCB9IH0sCi0gICAgeyAoY2hhciAqKSJfTVVMRV9CQVNFTElORV9PRkZTRVQiLCAgIEJERl9JTlRFR0VSLCAgMSwgeyAwIH0gfSwKLSAgICB7IChjaGFyICopIl9NVUxFX1JFTEFUSVZFX0NPTVBPU0UiLCAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkFERF9TVFlMRV9OQU1FIiwgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkFWRVJBR0VfV0lEVEgiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkFWR19DQVBJVEFMX1dJRFRIIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkFWR19MT1dFUkNBU0VfV0lEVEgiLCAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkNBUF9IRUlHSFQiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkNIQVJTRVRfQ09MTEVDVElPTlMiLCAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkNIQVJTRVRfRU5DT0RJTkciLCAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkNIQVJTRVRfUkVHSVNUUlkiLCAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkNPTU1FTlQiLCAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkNPUFlSSUdIVCIsICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkRFRkFVTFRfQ0hBUiIsICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIkRFU1RJTkFUSU9OIiwgICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIkRFVklDRV9GT05UX05BTUUiLCAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkVORF9TUEFDRSIsICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkZBQ0VfTkFNRSIsICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkZBTUlMWV9OQU1FIiwgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkZJR1VSRV9XSURUSCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkZPTlQiLCAgICAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkZPTlROQU1FX1JFR0lTVFJZIiwgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkZPTlRfQVNDRU5UIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkZPTlRfREVTQ0VOVCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIkZPVU5EUlkiLCAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIkZVTExfTkFNRSIsICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIklUQUxJQ19BTkdMRSIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIk1BWF9TUEFDRSIsICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIk1JTl9TUEFDRSIsICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIk5PUk1fU1BBQ0UiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIk5PVElDRSIsICAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIlBJWEVMX1NJWkUiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlBPSU5UX1NJWkUiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlFVQURfV0lEVEgiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19BU0NFTlQiLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19BVkVSQUdFX1dJRFRIIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19BVkdfQ0FQSVRBTF9XSURUSCIsICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19BVkdfTE9XRVJDQVNFX1dJRFRIIiwgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19DQVBfSEVJR0hUIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19ERVNDRU5UIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19FTkRfU1BBQ0UiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19GSUdVUkVfV0lEVEgiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19NQVhfU1BBQ0UiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19NSU5fU1BBQ0UiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19OT1JNX1NQQUNFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19QSVhFTF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19QT0lOVF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19QSVhFTFNJWkUiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19QT0lOVFNJWkUiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19RVUFEX1dJRFRIIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TTUFMTF9DQVBfU0laRSIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVFJJS0VPVVRfQVNDRU5UIiwgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVFJJS0VPVVRfREVTQ0VOVCIsICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVUJTQ1JJUFRfU0laRSIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVUJTQ1JJUFRfWCIsICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVUJTQ1JJUFRfWSIsICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVVBFUlNDUklQVF9TSVpFIiwgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVVBFUlNDUklQVF9YIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19TVVBFUlNDUklQVF9ZIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19VTkRFUkxJTkVfUE9TSVRJT04iLCAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19VTkRFUkxJTkVfVEhJQ0tORVNTIiwgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJBV19YX0hFSUdIVCIsICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJFTEFUSVZFX1NFVFdJRFRIIiwgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIlJFTEFUSVZFX1dFSUdIVCIsICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIlJFU09MVVRJT04iLCAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlJFU09MVVRJT05fWCIsICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIlJFU09MVVRJT05fWSIsICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIlNFVFdJRFRIX05BTUUiLCAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIlNMQU5UIiwgICAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIlNNQUxMX0NBUF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNQQUNJTkciLCAgICAgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIlNUUklLRU9VVF9BU0NFTlQiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNUUklLRU9VVF9ERVNDRU5UIiwgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVQlNDUklQVF9TSVpFIiwgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVQlNDUklQVF9YIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVQlNDUklQVF9ZIiwgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVUEVSU0NSSVBUX1NJWkUiLCAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVUEVSU0NSSVBUX1giLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlNVUEVSU0NSSVBUX1kiLCAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlVOREVSTElORV9QT1NJVElPTiIsICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIlVOREVSTElORV9USElDS05FU1MiLCAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIldFSUdIVCIsICAgICAgICAgICAgICAgICAgQkRGX0NBUkRJTkFMLCAxLCB7IDAgfSB9LAorICAgIHsgIldFSUdIVF9OQU1FIiwgICAgICAgICAgICAgQkRGX0FUT00sICAgICAxLCB7IDAgfSB9LAorICAgIHsgIlhfSEVJR0hUIiwgICAgICAgICAgICAgICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIl9NVUxFX0JBU0VMSU5FX09GRlNFVCIsICAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAorICAgIHsgIl9NVUxFX1JFTEFUSVZFX0NPTVBPU0UiLCAgQkRGX0lOVEVHRVIsICAxLCB7IDAgfSB9LAogICB9OwogCiAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nCkBAIC0xOTYsMTEgKzE5NSwxMCBAQAogI2RlZmluZSBBQ01TRzkgICAiU1dJRFRIIGZpZWxkIG1pc3NpbmcgYXQgbGluZSAlbGQuICBTZXQgYXV0b21hdGljYWxseS5cbiIKICNkZWZpbmUgQUNNU0cxMCAgIkRXSURUSCBmaWVsZCBtaXNzaW5nIGF0IGxpbmUgJWxkLiAgU2V0IHRvIGdseXBoIHdpZHRoLlxuIgogI2RlZmluZSBBQ01TRzExICAiU0laRSBiaXRzIHBlciBwaXhlbCBmaWVsZCBhZGp1c3RlZCB0byAlaGQuXG4iCi0jZGVmaW5lIEFDTVNHMTIgICJEdXBsaWNhdGUgZW5jb2RpbmcgJWxkICglcykgY2hhbmdlZCB0byB1bmVuY29kZWQuXG4iCi0jZGVmaW5lIEFDTVNHMTMgICJHbHlwaCAlbGQgZXh0cmEgcm93cyByZW1vdmVkLlxuIgotI2RlZmluZSBBQ01TRzE0ICAiR2x5cGggJWxkIGV4dHJhIGNvbHVtbnMgcmVtb3ZlZC5cbiIKKyNkZWZpbmUgQUNNU0cxMyAgIkdseXBoICVsdSBleHRyYSByb3dzIHJlbW92ZWQuXG4iCisjZGVmaW5lIEFDTVNHMTQgICJHbHlwaCAlbHUgZXh0cmEgY29sdW1ucyByZW1vdmVkLlxuIgogI2RlZmluZSBBQ01TRzE1ICAiSW5jb3JyZWN0IGdseXBoIGNvdW50OiAlbGQgaW5kaWNhdGVkIGJ1dCAlbGQgZm91bmQuXG4iCi0jZGVmaW5lIEFDTVNHMTYgICJHbHlwaCAlbGQgbWlzc2luZyBjb2x1bW5zIHBhZGRlZCB3aXRoIHplcm8gYml0cy5cbiIKKyNkZWZpbmUgQUNNU0cxNiAgIkdseXBoICVsdSBtaXNzaW5nIGNvbHVtbnMgcGFkZGVkIHdpdGggemVybyBiaXRzLlxuIgogI2RlZmluZSBBQ01TRzE3ICAiQWRqdXN0aW5nIG51bWJlciBvZiBnbHlwaHMgdG8gJWxkLlxuIgogCiAgIC8qIEVycm9yIG1lc3NhZ2VzLiAqLwpAQCAtMjE5LDExICsyMTcsMTEgQEAKICNkZWZpbmUgREJHTVNHMiAgIiAoMHglbFgpXG4iCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFV0aWxpdHkgdHlwZXMgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBVdGlsaXR5IHR5cGVzIGFuZCBmdW5jdGlvbnMuCisgICAqCisgICAqLwogCiAKICAgLyogRnVuY3Rpb24gdHlwZSBmb3IgcGFyc2luZyBsaW5lcyBvZiBhIEJERiBmb250LiAqLwpAQCAtMjcwLDggKzI2OCw2IEBACiAgICAgYmRmX2ZvbnRfdCogICAgIGZvbnQ7CiAgICAgYmRmX29wdGlvbnNfdCogIG9wdHM7CiAKLSAgICB1bnNpZ25lZCBsb25nICAgaGF2ZVszNDgxNl07IC8qIG11c3QgYmUgaW4gc3luYyB3aXRoIGBubW9kJyBhbmQgYHVtb2QnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcnJheXMgZnJvbSBgYmRmX2ZvbnRfdCcgc3RydWN0dXJlICAgICAqLwogICAgIF9iZGZfbGlzdF90ICAgICBsaXN0OwogCiAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsKQEAgLTM2Nyw3ICszNjMsNyBAQAogCiAgIC8qIEFuIGVtcHR5IHN0cmluZyBmb3IgZW1wdHkgZmllbGRzLiAqLwogCi0gIHN0YXRpYyBjb25zdCBjaGFyICBlbXB0eVsxXSA9IHsgMCB9OyAgICAgIC8qIFhYWCBlbGltaW5hdGUgdGhpcyAqLworICBzdGF0aWMgY29uc3QgY2hhciAgZW1wdHlbXSA9ICIiOyAgICAgIC8qIFhYWCBlbGltaW5hdGUgdGhpcyAqLwogCiAKICAgc3RhdGljIGNoYXIgKgpAQCAtNDEwLDEzICs0MDYsMTQgQEAKIAogICBzdGF0aWMgRlRfRXJyb3IKICAgX2JkZl9saXN0X3NwbGl0KCBfYmRmX2xpc3RfdCogICBsaXN0LAotICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIHNlcGFyYXRvcnMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgc2VwYXJhdG9ycywKICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICBsaW5lLAogICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVsZW4gKQogICB7CiAgICAgdW5zaWduZWQgbG9uZyAgZmluYWxfZW1wdHk7CiAgICAgaW50ICAgICAgICAgICAgbXVsdDsKLSAgICBjaGFyICAgICAgICAgICAqc3AsICplcCwgKmVuZDsKKyAgICBjb25zdCBjaGFyICAgICAqc3AsICplbmQ7CisgICAgY2hhciAgICAgICAgICAgKmVwOwogICAgIGNoYXIgICAgICAgICAgIHNlcHNbMzJdOwogICAgIEZUX0Vycm9yICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogCkBAIC00NzYsNyArNDczLDcgQEAKICAgICAgIH0KIAogICAgICAgLyogQXNzaWduIHRoZSBmaWVsZCBhcHByb3ByaWF0ZWx5LiAqLwotICAgICAgbGlzdC0+ZmllbGRbbGlzdC0+dXNlZCsrXSA9ICggZXAgPiBzcCApID8gc3AgOiAoY2hhciopZW1wdHk7CisgICAgICBsaXN0LT5maWVsZFtsaXN0LT51c2VkKytdID0gKCBlcCA+IHNwICkgPyAoY2hhciopc3AgOiAoY2hhciopZW1wdHk7CiAKICAgICAgIHNwID0gZXA7CiAKQEAgLTY5NSw3ICs2OTIsNyBAQAogCiAgIC8qIFJvdXRpbmUgdG8gY29udmVydCBhIGRlY2ltYWwgQVNDSUkgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgaW50ZWdlci4gKi8KICAgc3RhdGljIHVuc2lnbmVkIGxvbmcKLSAgX2JkZl9hdG91bCggY2hhciogIHMgKQorICBfYmRmX2F0b3VsKCBjb25zdCBjaGFyKiAgcyApCiAgIHsKICAgICB1bnNpZ25lZCBsb25nICB2OwogCkBAIC03MjAsNyArNzE3LDcgQEAKIAogICAvKiBSb3V0aW5lIHRvIGNvbnZlcnQgYSBkZWNpbWFsIEFTQ0lJIHN0cmluZyB0byBhIHNpZ25lZCBsb25nIGludGVnZXIuICovCiAgIHN0YXRpYyBsb25nCi0gIF9iZGZfYXRvbCggY2hhciogIHMgKQorICBfYmRmX2F0b2woIGNvbnN0IGNoYXIqICBzICkKICAgewogICAgIGxvbmcgIHYsIG5lZzsKIApAQCAtNzUzLDcgKzc1MCw3IEBACiAKICAgLyogUm91dGluZSB0byBjb252ZXJ0IGEgZGVjaW1hbCBBU0NJSSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgc2hvcnQgaW50ZWdlci4gKi8KICAgc3RhdGljIHVuc2lnbmVkIHNob3J0Ci0gIF9iZGZfYXRvdXMoIGNoYXIqICBzICkKKyAgX2JkZl9hdG91cyggY29uc3QgY2hhciogIHMgKQogICB7CiAgICAgdW5zaWduZWQgc2hvcnQgIHY7CiAKQEAgLTc3OCw3ICs3NzUsNyBAQAogCiAgIC8qIFJvdXRpbmUgdG8gY29udmVydCBhIGRlY2ltYWwgQVNDSUkgc3RyaW5nIHRvIGEgc2lnbmVkIHNob3J0IGludGVnZXIuICovCiAgIHN0YXRpYyBzaG9ydAotICBfYmRmX2F0b3MoIGNoYXIqICBzICkKKyAgX2JkZl9hdG9zKCBjb25zdCBjaGFyKiAgcyApCiAgIHsKICAgICBzaG9ydCAgdiwgbmVnOwogCkBAIC04MzEsNyArODI4LDcgQEAKIAogCiAgIHN0YXRpYyBGVF9FcnJvcgotICBiZGZfY3JlYXRlX3Byb3BlcnR5KCBjaGFyKiAgICAgICAgbmFtZSwKKyAgYmRmX2NyZWF0ZV9wcm9wZXJ0eSggY29uc3QgY2hhciogIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJkZl9mb250X3QqICBmb250ICkKICAgewpAQCAtOTAwLDExICs4OTcsMTEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCREYgZm9udCBmaWxlIHBhcnNpbmcgZmxhZ3MgYW5kIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQkRGIGZvbnQgZmlsZSBwYXJzaW5nIGZsYWdzIGFuZCBmdW5jdGlvbnMuCisgICAqCisgICAqLwogCiAKICAgLyogUGFyc2UgZmxhZ3MuICovCkBAIC0xMDAxLDcgKzk5OCw3IEBACiAKICAgICBGVF9NRU1fQ09QWSggbmFtZSwgZm9udC0+bmFtZSwgbGVuICk7CiAKLSAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJmxpc3QsIChjaGFyICopIi0iLCBuYW1lLCAodW5zaWduZWQgbG9uZylsZW4gKTsKKyAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJmxpc3QsICItIiwgbmFtZSwgKHVuc2lnbmVkIGxvbmcpbGVuICk7CiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEZhaWw7CiAKQEAgLTExMDAsNyArMTA5Nyw3IEBACiAKICAgc3RhdGljIEZUX0Vycm9yCiAgIF9iZGZfYWRkX3Byb3BlcnR5KCBiZGZfZm9udF90KiAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBjaGFyKiAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVubyApCiAgIHsKQEAgLTEyMzIsNyArMTIyOSw3IEBACiAgICAgLyogcHJlc2VudCwgYW5kIHRoZSBTUEFDSU5HIHByb3BlcnR5IHNob3VsZCBvdmVycmlkZSB0aGUgZGVmYXVsdCAgICAgICAqLwogICAgIC8qIHNwYWNpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBpZiAoIF9iZGZfc3RybmNtcCggbmFtZSwgIkRFRkFVTFRfQ0hBUiIsIDEyICkgPT0gMCApCi0gICAgICBmb250LT5kZWZhdWx0X2NoYXIgPSBmcC0+dmFsdWUubDsKKyAgICAgIGZvbnQtPmRlZmF1bHRfY2hhciA9IGZwLT52YWx1ZS51bDsKICAgICBlbHNlIGlmICggX2JkZl9zdHJuY21wKCBuYW1lLCAiRk9OVF9BU0NFTlQiLCAxMSApID09IDAgKQogICAgICAgZm9udC0+Zm9udF9hc2NlbnQgPSBmcC0+dmFsdWUubDsKICAgICBlbHNlIGlmICggX2JkZl9zdHJuY21wKCBuYW1lLCAiRk9OVF9ERVNDRU5UIiwgMTIgKSA9PSAwICkKQEAgLTEyNjUsNiArMTI2MiwyNSBAQAogICB9OwogCiAKKyAgc3RhdGljIEZUX0Vycm9yCisgIF9iZGZfcGFyc2VfZW5kKCBjaGFyKiAgICAgICAgICBsaW5lLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbGluZWxlbiwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGxpbmVubywKKyAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGNhbGxfZGF0YSwKKyAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGNsaWVudF9kYXRhICkKKyAgeworICAgIC8qIGEgbm8tb3A7IHdlIGlnbm9yZSBldmVyeXRoaW5nIGFmdGVyIGBFTkRGT05UJyAqLworCisgICAgRlRfVU5VU0VEKCBsaW5lICk7CisgICAgRlRfVU5VU0VEKCBsaW5lbGVuICk7CisgICAgRlRfVU5VU0VEKCBsaW5lbm8gKTsKKyAgICBGVF9VTlVTRUQoIGNhbGxfZGF0YSApOworICAgIEZUX1VOVVNFRCggY2xpZW50X2RhdGEgKTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCiAgIC8qIEFjdHVhbGx5IHBhcnNlIHRoZSBnbHlwaCBpbmZvIGFuZCBiaXRtYXBzLiAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgX2JkZl9wYXJzZV9nbHlwaHMoIGNoYXIqICAgICAgICAgIGxpbmUsCkBAIC0xMjc4LDYgKzEyOTQsNyBAQAogICAgIHVuc2lnbmVkIGNoYXIqICAgICBicDsKICAgICB1bnNpZ25lZCBsb25nICAgICAgaSwgc2xlbiwgbmliYmxlczsKIAorICAgIF9iZGZfbGluZV9mdW5jX3QqICBuZXh0OwogICAgIF9iZGZfcGFyc2VfdCogICAgICBwOwogICAgIGJkZl9nbHlwaF90KiAgICAgICBnbHlwaDsKICAgICBiZGZfZm9udF90KiAgICAgICAgZm9udDsKQEAgLTEyODUsMTEgKzEzMDIsMTEgQEAKICAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwogICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKIAotICAgIEZUX1VOVVNFRCggY2FsbF9kYXRhICk7CiAgICAgRlRfVU5VU0VEKCBsaW5lbm8gKTsgICAgICAgIC8qIG9ubHkgdXNlZCBpbiBkZWJ1ZyBtb2RlICovCiAKIAotICAgIHAgPSAoX2JkZl9wYXJzZV90ICopY2xpZW50X2RhdGE7CisgICAgbmV4dCA9IChfYmRmX2xpbmVfZnVuY190ICopY2FsbF9kYXRhOworICAgIHAgICAgPSAoX2JkZl9wYXJzZV90ICopICAgIGNsaWVudF9kYXRhOwogCiAgICAgZm9udCAgID0gcC0+Zm9udDsKICAgICBtZW1vcnkgPSBmb250LT5tZW1vcnk7CkBAIC0xMzE5LDcgKzEzMzYsNyBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7CisgICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsICIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICBwLT5jbnQgPSBmb250LT5nbHlwaHNfc2l6ZSA9IF9iZGZfYXRvdWwoIHAtPmxpc3QuZmllbGRbMV0gKTsKQEAgLTEzNzAsNiArMTM4Nyw3IEBACiAgICAgICAgICAgICAgICAgYnlfZW5jb2RpbmcgKTsKIAogICAgICAgcC0+ZmxhZ3MgJj0gfkJERl9TVEFSVF87CisgICAgICAqbmV4dCAgICAgPSBfYmRmX3BhcnNlX2VuZDsKIAogICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTE0MDUsNyArMTQyMyw3IEBACiAgICAgICAvKiBlbmNvZGluZyBjYW4gYmUgY2hlY2tlZCBmb3IgYW4gdW5lbmNvZGVkIGNoYXJhY3Rlci4gICAgICAqLwogICAgICAgRlRfRlJFRSggcC0+Z2x5cGhfbmFtZSApOwogCi0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsIChjaGFyICopIiArIiwgbGluZSwgbGluZWxlbiApOworICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAiICsiLCBsaW5lLCBsaW5lbGVuICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBFeGl0OwogCkBAIC0xNDQzLDcgKzE0NjEsNyBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7CisgICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsICIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKQEAgLTE0NTgsNDAgKzE0NzYsMTEgQEAKICAgICAgIGlmICggcC0+Z2x5cGhfZW5jID09IC0xICYmIHAtPmxpc3QudXNlZCA+IDIgKQogICAgICAgICBwLT5nbHlwaF9lbmMgPSBfYmRmX2F0b2woIHAtPmxpc3QuZmllbGRbMl0gKTsKIAotICAgICAgaWYgKCBwLT5nbHlwaF9lbmMgPCAtMSApCisgICAgICBpZiAoIHAtPmdseXBoX2VuYyA8IC0xIHx8IHAtPmdseXBoX2VuYyA+PSAweDExMDAwMEwgKQogICAgICAgICBwLT5nbHlwaF9lbmMgPSAtMTsKIAogICAgICAgRlRfVFJBQ0U0KCggREJHTVNHMiwgcC0+Z2x5cGhfZW5jICkpOwogCi0gICAgICAvKiBDaGVjayB0aGF0IHRoZSBlbmNvZGluZyBpcyBpbiB0aGUgVW5pY29kZSByYW5nZSBiZWNhdXNlICAqLwotICAgICAgLyogb3RoZXJ3aXNlIHAtPmhhdmUgKGEgYml0bWFwIHdpdGggc3RhdGljIHNpemUpIG92ZXJmbG93cy4gKi8KLSAgICAgIGlmICggcC0+Z2x5cGhfZW5jID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKHNpemVfdClwLT5nbHlwaF9lbmMgPj0gc2l6ZW9mICggcC0+aGF2ZSApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggdW5zaWduZWQgbG9uZyApICogMzIgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJfYmRmX3BhcnNlX2dseXBoczogIiBFUlJNU0c1LCBsaW5lbm8sICJFTkNPRElORyIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZW5jb2RpbmcgaGFzIGFscmVhZHkgYmVlbiBlbmNvdW50ZXJlZC4gKi8KLSAgICAgIC8qIElmIGl0IGhhcyB0aGVuIGNoYW5nZSBpdCB0byB1bmVuY29kZWQgc28gaXQgZ2V0cyBhZGRlZCBpZiAqLwotICAgICAgLyogaW5kaWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHAtPmdseXBoX2VuYyA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBfYmRmX2dseXBoX21vZGlmaWVkKCBwLT5oYXZlLCBwLT5nbHlwaF9lbmMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBFbWl0IGEgbWVzc2FnZSBzYXlpbmcgYSBnbHlwaCBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgKi8KLSAgICAgICAgICAvKiB1bmVuY29kZWQgYXJlYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9nbHlwaHM6ICIgQUNNU0cxMiwKLSAgICAgICAgICAgICAgICAgICAgICBwLT5nbHlwaF9lbmMsIHAtPmdseXBoX25hbWUgKSk7Ci0gICAgICAgICAgcC0+Z2x5cGhfZW5jID0gLTE7Ci0gICAgICAgICAgZm9udC0+bW9kaWZpZWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggcC0+aGF2ZSwgcC0+Z2x5cGhfZW5jICk7Ci0gICAgICB9Ci0KICAgICAgIGlmICggcC0+Z2x5cGhfZW5jID49IDAgKQogICAgICAgewogICAgICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgYXJlIGVub3VnaCBnbHlwaHMgYWxsb2NhdGVkIGluIGNhc2UgdGhlICovCkBAIC0xNTA4LDcgKzE0OTcsNyBAQAogCiAgICAgICAgIGdseXBoICAgICAgICAgICA9IGZvbnQtPmdseXBocyArIGZvbnQtPmdseXBoc191c2VkKys7CiAgICAgICAgIGdseXBoLT5uYW1lICAgICA9IHAtPmdseXBoX25hbWU7Ci0gICAgICAgIGdseXBoLT5lbmNvZGluZyA9IHAtPmdseXBoX2VuYzsKKyAgICAgICAgZ2x5cGgtPmVuY29kaW5nID0gKHVuc2lnbmVkIGxvbmcpcC0+Z2x5cGhfZW5jOwogCiAgICAgICAgIC8qIFJlc2V0IHRoZSBpbml0aWFsIGdseXBoIGluZm8uICovCiAgICAgICAgIHAtPmdseXBoX25hbWUgPSBOVUxMOwpAQCAtMTUzMiw3ICsxNTIxLDcgQEAKIAogICAgICAgICAgIGdseXBoICAgICAgICAgICA9IGZvbnQtPnVuZW5jb2RlZCArIGZvbnQtPnVuZW5jb2RlZF91c2VkOwogICAgICAgICAgIGdseXBoLT5uYW1lICAgICA9IHAtPmdseXBoX25hbWU7Ci0gICAgICAgICAgZ2x5cGgtPmVuY29kaW5nID0gKGxvbmcpZm9udC0+dW5lbmNvZGVkX3VzZWQrKzsKKyAgICAgICAgICBnbHlwaC0+ZW5jb2RpbmcgPSBmb250LT51bmVuY29kZWRfdXNlZCsrOwogCiAgICAgICAgICAgLyogUmVzZXQgdGhlIGluaXRpYWwgZ2x5cGggaW5mby4gKi8KICAgICAgICAgICBwLT5nbHlwaF9uYW1lID0gTlVMTDsKQEAgLTE1NTYsNiArMTU0NSw5IEBACiAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCisgICAgICBnb3RvIE1pc3NpbmdfRW5jb2Rpbmc7CisKICAgICAvKiBQb2ludCBhdCB0aGUgZ2x5cGggYmVpbmcgY29uc3RydWN0ZWQuICovCiAgICAgaWYgKCBwLT5nbHlwaF9lbmMgPT0gLTEgKQogICAgICAgZ2x5cGggPSBmb250LT51bmVuY29kZWQgKyAoIGZvbnQtPnVuZW5jb2RlZF91c2VkIC0gMSApOwpAQCAtMTU3Myw3ICsxNTY1LDYgQEAKICAgICAgICAgewogICAgICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX2dseXBoczogIiBBQ01TRzEzLCBnbHlwaC0+ZW5jb2RpbmcgKSk7CiAgICAgICAgICAgcC0+ZmxhZ3MgfD0gQkRGX0dMWVBIX0hFSUdIVF9DSEVDS187Ci0gICAgICAgICAgZm9udC0+bW9kaWZpZWQgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgZ290byBFeGl0OwpAQCAtMTYwMSw3ICsxNTkyLDYgQEAKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UyKCggIl9iZGZfcGFyc2VfZ2x5cGhzOiAiIEFDTVNHMTYsIGdseXBoLT5lbmNvZGluZyApKTsKICAgICAgICAgcC0+ZmxhZ3MgICAgICAgfD0gQkRGX0dMWVBIX1dJRFRIX0NIRUNLXzsKLSAgICAgICAgZm9udC0+bW9kaWZpZWQgID0gMTsKICAgICAgIH0KIAogICAgICAgLyogUmVtb3ZlIHBvc3NpYmxlIGdhcmJhZ2UgYXQgdGhlIHJpZ2h0LiAqLwpAQCAtMTYxNiw3ICsxNjA2LDYgQEAKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UyKCggIl9iZGZfcGFyc2VfZ2x5cGhzOiAiIEFDTVNHMTQsIGdseXBoLT5lbmNvZGluZyApKTsKICAgICAgICAgcC0+ZmxhZ3MgICAgICAgfD0gQkRGX0dMWVBIX1dJRFRIX0NIRUNLXzsKLSAgICAgICAgZm9udC0+bW9kaWZpZWQgID0gMTsKICAgICAgIH0KIAogICAgICAgcC0+cm93Kys7CkBAIC0xNjI2LDEwICsxNjE1LDcgQEAKICAgICAvKiBFeHBlY3QgdGhlIFNXSURUSCAoc2NhbGFibGUgd2lkdGgpIGZpZWxkIG5leHQuICovCiAgICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJTV0lEVEgiLCA2ICkgPT0gMCApCiAgICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCi0gICAgICAgIGdvdG8gTWlzc2luZ19FbmNvZGluZzsKLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKKyAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgIiArIiwgbGluZSwgbGluZWxlbiApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKIApAQCAtMTY0MiwxMCArMTYyOCw3IEBACiAgICAgLyogRXhwZWN0IHRoZSBEV0lEVEggKHNjYWxhYmxlIHdpZHRoKSBmaWVsZCBuZXh0LiAqLwogICAgIGlmICggX2JkZl9zdHJuY21wKCBsaW5lLCAiRFdJRFRIIiwgNiApID09IDAgKQogICAgIHsKLSAgICAgIGlmICggISggcC0+ZmxhZ3MgJiBCREZfRU5DT0RJTkdfICkgKQotICAgICAgICBnb3RvIE1pc3NpbmdfRW5jb2Rpbmc7Ci0KLSAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgKGNoYXIgKikiICsiLCBsaW5lLCBsaW5lbGVuICk7CisgICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsICIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKQEAgLTE2NzAsMTAgKzE2NTMsNyBAQAogICAgIC8qIEV4cGVjdCB0aGUgQkJYIGZpZWxkIG5leHQuICovCiAgICAgaWYgKCBfYmRmX3N0cm5jbXAoIGxpbmUsICJCQlgiLCAzICkgPT0gMCApCiAgICAgewotICAgICAgaWYgKCAhKCBwLT5mbGFncyAmIEJERl9FTkNPRElOR18gKSApCi0gICAgICAgIGdvdG8gTWlzc2luZ19FbmNvZGluZzsKLQotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKKyAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgIiArIiwgbGluZSwgbGluZWxlbiApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKIApAQCAtMTcyMCwxNCArMTcwMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICBnbHlwaC0+c3dpZHRoID0gc3c7CiAKLSAgICAgICAgICBpZiAoIHAtPmdseXBoX2VuYyA9PSAtMSApCi0gICAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggZm9udC0+dW1vZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT51bmVuY29kZWRfdXNlZCAtIDEgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBfYmRmX3NldF9nbHlwaF9tb2RpZmllZCggZm9udC0+bm1vZCwgZ2x5cGgtPmVuY29kaW5nICk7Ci0KICAgICAgICAgICBwLT5mbGFncyAgICAgICB8PSBCREZfU1dJRFRIX0FESl87Ci0gICAgICAgICAgZm9udC0+bW9kaWZpZWQgID0gMTsKICAgICAgICAgfQogICAgICAgfQogCkBAIC0xODIzLDI2ICsxNzk2LDI0IEBACiAgICAgICB7CiAgICAgICAgIHAtPmZvbnQtPmZvbnRfYXNjZW50ID0gcC0+Zm9udC0+YmJ4LmFzY2VudDsKICAgICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5hc2NlbnQgKTsKLSAgICAgICAgZXJyb3IgPSBfYmRmX2FkZF9wcm9wZXJ0eSggcC0+Zm9udCwgKGNoYXIgKikiRk9OVF9BU0NFTlQiLAorICAgICAgICBlcnJvciA9IF9iZGZfYWRkX3Byb3BlcnR5KCBwLT5mb250LCAiRk9OVF9BU0NFTlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmLCBsaW5lbm8gKTsKICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX3Byb3BlcnRpZXM6ICIgQUNNU0cxLCBwLT5mb250LT5iYnguYXNjZW50ICkpOwotICAgICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7CiAgICAgICB9CiAKICAgICAgIGlmICggYmRmX2dldF9mb250X3Byb3BlcnR5KCBwLT5mb250LCAiRk9OVF9ERVNDRU5UIiApID09IDAgKQogICAgICAgewogICAgICAgICBwLT5mb250LT5mb250X2Rlc2NlbnQgPSBwLT5mb250LT5iYnguZGVzY2VudDsKICAgICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICk7Ci0gICAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsIChjaGFyICopIkZPTlRfREVTQ0VOVCIsCisgICAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsICJGT05UX0RFU0NFTlQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmLCBsaW5lbm8gKTsKICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwogCiAgICAgICAgIEZUX1RSQUNFMigoICJfYmRmX3BhcnNlX3Byb3BlcnRpZXM6ICIgQUNNU0cyLCBwLT5mb250LT5iYnguZGVzY2VudCApKTsKLSAgICAgICAgcC0+Zm9udC0+bW9kaWZpZWQgPSAxOwogICAgICAgfQogCiAgICAgICBwLT5mbGFncyAmPSB+QkRGX1BST1BTXzsKQEAgLTE4NzUsNyArMTg0Niw3IEBACiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsIChjaGFyICopIiArIiwgbGluZSwgbGluZWxlbiApOworICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAiICsiLCBsaW5lLCBsaW5lbGVuICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBFeGl0OwogICAgICAgbmFtZSA9IHAtPmxpc3QuZmllbGRbMF07CkBAIC0xOTg5LDcgKzE5NjAsNyBAQAogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIHAtPmZvbnQtPnNwYWNpbmcgICAgICA9IHAtPm9wdHMtPmZvbnRfc3BhY2luZzsKLSAgICAgIHAtPmZvbnQtPmRlZmF1bHRfY2hhciA9IC0xOworICAgICAgcC0+Zm9udC0+ZGVmYXVsdF9jaGFyID0gfjBVTDsKIAogICAgICAgZ290byBFeGl0OwogICAgIH0KQEAgLTIwMDUsNyArMTk3Niw3IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KIAotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKKyAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgIiArIiwgbGluZSwgbGluZWxlbiApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKIApAQCAtMjA0NCw3ICsyMDE1LDcgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogCi0gICAgICBlcnJvciA9IF9iZGZfbGlzdF9zcGxpdCggJnAtPmxpc3QsIChjaGFyICopIiArIiwgbGluZSwgbGluZWxlbiApOworICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAiICsiLCBsaW5lLCBsaW5lbGVuICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBFeGl0OwogCkBAIC0yMDY3LDcgKzIwMzgsNyBAQAogICAgIC8qIFRoZSBuZXh0IHRoaW5nIHRvIGNoZWNrIGZvciBpcyB0aGUgRk9OVCBmaWVsZC4gKi8KICAgICBpZiAoIF9iZGZfc3RybmNtcCggbGluZSwgIkZPTlQiLCA0ICkgPT0gMCApCiAgICAgewotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKKyAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgIiArIiwgbGluZSwgbGluZWxlbiApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIF9iZGZfbGlzdF9zaGlmdCggJnAtPmxpc3QsIDEgKTsKQEAgLTIxMTAsNyArMjA4MSw3IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KIAotICAgICAgZXJyb3IgPSBfYmRmX2xpc3Rfc3BsaXQoICZwLT5saXN0LCAoY2hhciAqKSIgKyIsIGxpbmUsIGxpbmVsZW4gKTsKKyAgICAgIGVycm9yID0gX2JkZl9saXN0X3NwbGl0KCAmcC0+bGlzdCwgIiArIiwgbGluZSwgbGluZWxlbiApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKIApAQCAtMjE2NSw3ICsyMTM2LDcgQEAKICAgICAgIC8qIGZvciBjb21waWxpbmcgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgcC0+Zm9udC0+Zm9udF9hc2NlbnQgPSBwLT5mb250LT5iYnguYXNjZW50OwogICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5hc2NlbnQgKTsKLSAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsIChjaGFyICopIkZPTlRfQVNDRU5UIiwKKyAgICAgIGVycm9yID0gX2JkZl9hZGRfcHJvcGVydHkoIHAtPmZvbnQsICJGT05UX0FTQ0VOVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmLCBsaW5lbm8gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CkBAIC0yMTczLDE0ICsyMTQ0LDEyIEBACiAKICAgICAgIHAtPmZvbnQtPmZvbnRfZGVzY2VudCA9IHAtPmZvbnQtPmJieC5kZXNjZW50OwogICAgICAgZnRfc3ByaW50ZiggbmJ1ZiwgIiVoZCIsIHAtPmZvbnQtPmJieC5kZXNjZW50ICk7Ci0gICAgICBlcnJvciA9IF9iZGZfYWRkX3Byb3BlcnR5KCBwLT5mb250LCAoY2hhciAqKSJGT05UX0RFU0NFTlQiLAorICAgICAgZXJyb3IgPSBfYmRmX2FkZF9wcm9wZXJ0eSggcC0+Zm9udCwgIkZPTlRfREVTQ0VOVCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnVmLCBsaW5lbm8gKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICBGVF9UUkFDRTIoKCAiX2JkZl9wYXJzZV9wcm9wZXJ0aWVzOiAiIEFDTVNHMiwgcC0+Zm9udC0+YmJ4LmRlc2NlbnQgKSk7CiAKLSAgICAgIHAtPmZvbnQtPm1vZGlmaWVkID0gMTsKLQogICAgICAgKm5leHQgPSBfYmRmX3BhcnNlX2dseXBoczsKIAogICAgICAgLyogQSBzcGVjaWFsIHJldHVybiB2YWx1ZS4gKi8KQEAgLTIxOTYsMTEgKzIxNjUsMTEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQVBJLgorICAgKgorICAgKi8KIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQpAQCAtMjI0Niw3ICsyMjE1LDYgQEAKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UyKCggImJkZl9sb2FkX2ZvbnQ6ICIgQUNNU0cxNSwgcC0+Y250LAogICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5nbHlwaHNfdXNlZCArIHAtPmZvbnQtPnVuZW5jb2RlZF91c2VkICkpOwotICAgICAgICBwLT5mb250LT5tb2RpZmllZCA9IDE7CiAgICAgICB9CiAKICAgICAgIC8qIE9uY2UgdGhlIGZvbnQgaGFzIGJlZW4gbG9hZGVkLCBhZGp1c3QgdGhlIG92ZXJhbGwgZm9udCBtZXRyaWNzIGlmICovCkBAIC0yMjU5LDcgKzIyMjcsNiBAQAogICAgICAgICAgIEZUX1RSQUNFMigoICJiZGZfbG9hZF9mb250OiAiIEFDTVNHMywKICAgICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5iYngud2lkdGgsIHAtPm1heHJiIC0gcC0+bWlubGIgKSk7CiAgICAgICAgICAgcC0+Zm9udC0+YmJ4LndpZHRoID0gKHVuc2lnbmVkIHNob3J0KSggcC0+bWF4cmIgLSBwLT5taW5sYiApOwotICAgICAgICAgIHAtPmZvbnQtPm1vZGlmaWVkICA9IDE7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIHAtPmZvbnQtPmJieC54X29mZnNldCAhPSBwLT5taW5sYiApCkBAIC0yMjY3LDcgKzIyMzQsNiBAQAogICAgICAgICAgIEZUX1RSQUNFMigoICJiZGZfbG9hZF9mb250OiAiIEFDTVNHNCwKICAgICAgICAgICAgICAgICAgICAgICBwLT5mb250LT5iYngueF9vZmZzZXQsIHAtPm1pbmxiICkpOwogICAgICAgICAgIHAtPmZvbnQtPmJieC54X29mZnNldCA9IHAtPm1pbmxiOwotICAgICAgICAgIHAtPmZvbnQtPm1vZGlmaWVkICAgICA9IDE7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIHAtPmZvbnQtPmJieC5hc2NlbnQgIT0gcC0+bWF4YXMgKQpAQCAtMjI3NSw3ICsyMjQxLDYgQEAKICAgICAgICAgICBGVF9UUkFDRTIoKCAiYmRmX2xvYWRfZm9udDogIiBBQ01TRzUsCiAgICAgICAgICAgICAgICAgICAgICAgcC0+Zm9udC0+YmJ4LmFzY2VudCwgcC0+bWF4YXMgKSk7CiAgICAgICAgICAgcC0+Zm9udC0+YmJ4LmFzY2VudCA9IHAtPm1heGFzOwotICAgICAgICAgIHAtPmZvbnQtPm1vZGlmaWVkICAgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCBwLT5mb250LT5iYnguZGVzY2VudCAhPSBwLT5tYXhkcyApCkBAIC0yMjg0LDcgKzIyNDksNiBAQAogICAgICAgICAgICAgICAgICAgICAgIHAtPmZvbnQtPmJieC5kZXNjZW50LCBwLT5tYXhkcyApKTsKICAgICAgICAgICBwLT5mb250LT5iYnguZGVzY2VudCAgPSBwLT5tYXhkczsKICAgICAgICAgICBwLT5mb250LT5iYngueV9vZmZzZXQgPSAoc2hvcnQpKCAtcC0+bWF4ZHMgKTsKLSAgICAgICAgICBwLT5mb250LT5tb2RpZmllZCAgICAgPSAxOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCBwLT5tYXhhcyArIHAtPm1heGRzICE9IHAtPmZvbnQtPmJieC5oZWlnaHQgKQpAQCAtMjQxNSwxNiArMjM3OSw2IEBACiAgICAgRlRfRlJFRSggZm9udC0+Z2x5cGhzICk7CiAgICAgRlRfRlJFRSggZm9udC0+dW5lbmNvZGVkICk7CiAKLSAgICAvKiBGcmVlIHVwIHRoZSBvdmVyZmxvdyBzdG9yYWdlIGlmIGl0IHdhcyB1c2VkLiAqLwotICAgIGZvciAoIGkgPSAwLCBnbHlwaHMgPSBmb250LT5vdmVyZmxvdy5nbHlwaHM7Ci0gICAgICAgICAgaSA8IGZvbnQtPm92ZXJmbG93LmdseXBoc191c2VkOyBpKyssIGdseXBocysrICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBnbHlwaHMtPm5hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGdseXBocy0+Yml0bWFwICk7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggZm9udC0+b3ZlcmZsb3cuZ2x5cGhzICk7Ci0KICAgICAvKiBiZGZfY2xlYW51cCAqLwogICAgIGZ0X2hhc2hfc3RyX2ZyZWUoICYoZm9udC0+cHJvcHRibCksIG1lbW9yeSApOwogCmRpZmYgLS1naXQgYS9zcmMvYnppcDIvSmFtZmlsZSBiL3NyYy9iemlwMi9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ4ZWFiLi4wMDAwMDAwCi0tLSBhL3NyYy9iemlwMi9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9iemlwMiBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDEwLTIwMTggYnkKLSMgSm9lbCBLbGluZ2hlZAotIwotIyBiYXNlZCBvbiBgc3JjL2x6dy9KYW1maWxlJwotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgYnppcDIgOwotCi1MaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRiemlwMi5jIDsKLQotIyBlbmQgb2Ygc3JjL2J6aXAyIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9iemlwMi9mdGJ6aXAyLmMgYi9zcmMvYnppcDIvZnRiemlwMi5jCmluZGV4IDE2MDE5NDguLjQxMWM1ZDIgMTAwNjQ0Ci0tLSBhL3NyYy9iemlwMi9mdGJ6aXAyLmMKKysrIGIvc3JjL2J6aXAyL2Z0YnppcDIuYwpAQCAtMSwzNiArMSwzNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRiemlwMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5iejIgY29tcHJlc3NlZCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgb3B0aW9uYWwgY29tcG9uZW50IHJlbGllcyBvbiBsaWJiejIuICBJdCBzaG91bGQgbWFpbmx5IGJlIHVzZWQgdG8gKi8KLS8qICBwYXJzZSBjb21wcmVzc2VkIFBDRiBmb250cywgYXMgZm91bmQgd2l0aCBtYW55IFgxMSBzZXJ2ZXIgICAgICAgICAgICAgICovCi0vKiAgZGlzdHJpYnV0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSm9lbCBLbGluZ2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBiYXNlZCBvbiBgc3JjL2d6aXAvZnRnemlwLmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRiemlwMi5jCisgKgorICogICBGcmVlVHlwZSBzdXBwb3J0IGZvciAuYnoyIGNvbXByZXNzZWQgZmlsZXMuCisgKgorICogVGhpcyBvcHRpb25hbCBjb21wb25lbnQgcmVsaWVzIG9uIGxpYmJ6Mi4gIEl0IHNob3VsZCBtYWlubHkgYmUgdXNlZCB0bworICogcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyCisgKiBkaXN0cmlidXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDIwIGJ5CisgKiBKb2VsIEtsaW5naGVkLgorICoKKyAqIGJhc2VkIG9uIGBzcmMvZ3ppcC9mdGd6aXAuYycKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX01FTU9SWV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQlpJUDJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRiemlwMi5oPgogI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAogCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zOCwxNSArMzcsMTEgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQnppcDJfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0J6aXAyCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgImJ6aXAyIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KICNkZWZpbmUgQlpfTk9fU1RESU8gLyogRG8gbm90IG5lZWQgRklMRSAqLwogI2luY2x1ZGUgPGJ6bGliLmg+CiAKQEAgLTQ3NSw4ICs0NzAsOCBAQAogICAgIG1lbW9yeSA9IHNvdXJjZS0+bWVtb3J5OwogCiAgICAgLyoKLSAgICAgKiAgY2hlY2sgdGhlIGhlYWRlciByaWdodCBub3c7IHRoaXMgcHJldmVudHMgYWxsb2NhdGluZyB1bm5lY2Vzc2FyeQotICAgICAqICBvYmplY3RzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtCisgICAgICogY2hlY2sgdGhlIGhlYWRlciByaWdodCBub3c7IHRoaXMgcHJldmVudHMgYWxsb2NhdGluZyB1bm5lY2Vzc2FyeQorICAgICAqIG9iamVjdHMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0KICAgICAgKi8KICAgICBlcnJvciA9IGZ0X2J6aXAyX2NoZWNrX2hlYWRlciggc291cmNlICk7CiAgICAgaWYgKCBlcnJvciApCmRpZmYgLS1naXQgYS9zcmMvYnppcDIvcnVsZXMubWsgYi9zcmMvYnppcDIvcnVsZXMubWsKaW5kZXggOTU5NTRkNy4uZWVkMGY0YiAxMDA2NDQKLS0tIGEvc3JjL2J6aXAyL3J1bGVzLm1rCisrKyBiL3NyYy9iemlwMi9ydWxlcy5tawpAQCAtMiw3ICsyLDcgQEAKICMgRnJlZVR5cGUgMiBCWklQMiBzdXBwb3J0IGNvbmZpZ3VyYXRpb24gcnVsZXMKICMKIAotIyBDb3B5cmlnaHQgMjAxMC0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAxMC0yMDIwIGJ5CiAjIEpvZWwgS2xpbmdoZWQuCiAjCiAjIGJhc2VkIG9uIGBzcmMvbHp3L3J1bGVzLm1rJwpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL0phbWZpbGUgYi9zcmMvY2FjaGUvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmNGM3Yi4uMDAwMDAwMAotLS0gYS9zcmMvY2FjaGUvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvY2FjaGUgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGNhY2hlIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBmdGNiYXNpYwotICAgICAgICAgICAgICAgZnRjY2FjaGUKLSAgICAgICAgICAgICAgIGZ0Y2dseXBoCi0gICAgICAgICAgICAgICBmdGNpbWFnZQotICAgICAgICAgICAgICAgZnRjbWFuYWcKLSAgICAgICAgICAgICAgIGZ0Y2NtYXAKLSAgICAgICAgICAgICAgIGZ0Y21ydQotICAgICAgICAgICAgICAgZnRjc2JpdHMKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0Y2FjaGUgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvY2FjaGUgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2FjaGUuYyBiL3NyYy9jYWNoZS9mdGNhY2hlLmMKaW5kZXggMWI0MjVhZi4uZTkwZjQ2MyAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y2FjaGUuYworKysgYi9zcmMvY2FjaGUvZnRjYWNoZS5jCkBAIC0xLDIzICsxLDIyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhY2hlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIENhY2hpbmcgc3ViLXN5c3RlbSAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNhY2hlLmMKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBDYWNoaW5nIHN1Yi1zeXN0ZW0gKGJvZHkgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAjaW5jbHVkZSAiZnRjYmFzaWMuYyIKICNpbmNsdWRlICJmdGNjYWNoZS5jIgpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMgYi9zcmMvY2FjaGUvZnRjYmFzaWMuYwppbmRleCA5OTRhYTEyLi40M2VhMzE0IDEwMDY0NAotLS0gYS9zcmMvY2FjaGUvZnRjYmFzaWMuYworKysgYi9zcmMvY2FjaGUvZnRjYmFzaWMuYwpAQCAtMSwyNSArMSwyNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjYmFzaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBiYXNpYyBjYWNoZSBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjYmFzaWMuYworICoKKyAqICAgVGhlIEZyZWVUeXBlIGJhc2ljIGNhY2hlIGludGVyZmFjZSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ0FDSEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+CiAjaW5jbHVkZSAiZnRjZ2x5cGguaCIKICNpbmNsdWRlICJmdGNpbWFnZS5oIgogI2luY2x1ZGUgImZ0Y3NiaXRzLmgiCkBAIC0yNywxMSArMjYsMTEgQEAKICNpbmNsdWRlICJmdGNjYmFjay5oIgogI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCiAKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGNhY2hlCiAKIAogICAvKgotICAgKiAgQmFzaWMgRmFtaWxpZXMKKyAgICogQmFzaWMgRmFtaWxpZXMKICAgICoKICAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBGVENfQmFzaWNBdHRyUmVjXwpAQCAtMTExLDcgKzExMCw5IEBACiAKICAgICBpZiAoIChGVF9VTG9uZylmYWNlLT5udW1fZ2x5cGhzID4gRlRfVUlOVF9NQVggfHwgMCA+IGZhY2UtPm51bV9nbHlwaHMgKQogICAgICAgRlRfVFJBQ0UxKCggImZ0Y19iYXNpY19mYW1pbHlfZ2V0X2NvdW50OiIKLSAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIG51bWJlciBvZiBnbHlwaHMgaW4gdGhpcyBmYWNlLCB0cnVuY2F0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAiIHRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgZmFjZSBpcyAlbGQsXG4iCisgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAgICAgICAgICAgIiB3aGljaCBpcyB0b28gbXVjaCBhbmQgdGh1cyB0cnVuY2F0ZWRcbiIsCiAgICAgICAgICAgICAgICAgICBmYWNlLT5udW1fZ2x5cGhzICkpOwogCiAgICAgaWYgKCAhZXJyb3IgKQpAQCAtMzk0LDcgKzM5NSw3IEBACiAjaWYgRlRfVUxPTkdfTUFYID4gRlRfVUlOVF9NQVgKICAgICBpZiAoIGxvYWRfZmxhZ3MgPiBGVF9VSU5UX01BWCApCiAgICAgICBGVF9UUkFDRTEoKCAiRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyOiIKLSAgICAgICAgICAgICAgICAgICIgaGlnaGVyIGJpdHMgaW4gbG9hZF9mbGFncyAweCV4IGFyZSBkcm9wcGVkXG4iLAorICAgICAgICAgICAgICAgICAgIiBoaWdoZXIgYml0cyBpbiBsb2FkX2ZsYWdzIDB4JWx4IGFyZSBkcm9wcGVkXG4iLAogICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncyAmIH4oKEZUX1VMb25nKUZUX1VJTlRfTUFYKSApKTsKICNlbmRpZgogCkBAIC01OTQsNyArNTk1LDcgQEAKICNpZiBGVF9VTE9OR19NQVggPiBGVF9VSU5UX01BWAogICAgIGlmICggbG9hZF9mbGFncyA+IEZUX1VJTlRfTUFYICkKICAgICAgIEZUX1RSQUNFMSgoICJGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXI6IgotICAgICAgICAgICAgICAgICAgIiBoaWdoZXIgYml0cyBpbiBsb2FkX2ZsYWdzIDB4JXggYXJlIGRyb3BwZWRcbiIsCisgICAgICAgICAgICAgICAgICAiIGhpZ2hlciBiaXRzIGluIGxvYWRfZmxhZ3MgMHglbHggYXJlIGRyb3BwZWRcbiIsCiAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzICYgfigoRlRfVUxvbmcpRlRfVUlOVF9NQVgpICkpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNjYWNoZS5jIGIvc3JjL2NhY2hlL2Z0Y2NhY2hlLmMKaW5kZXggMTJlYzU4NS4uMWM4ZTBmMyAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y2NhY2hlLmMKKysrIGIvc3JjL2NhY2hlL2Z0Y2NhY2hlLmMKQEAgLTEsMzEgKzEsMzAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2NhY2hlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgaW50ZXJuYWwgY2FjaGUgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y2NhY2hlLmMKKyAqCisgKiAgIFRoZSBGcmVlVHlwZSBpbnRlcm5hbCBjYWNoZSBpbnRlcmZhY2UgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAiZnRjbWFuYWcuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgImZ0Y2NiYWNrLmgiCiAjaW5jbHVkZSAiZnRjZXJyb3IuaCIKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGNhY2hlCiAKIAogI2RlZmluZSBGVENfSEFTSF9NQVhfTE9BRCAgMgpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2NhY2hlLmggYi9zcmMvY2FjaGUvZnRjY2FjaGUuaAppbmRleCA4NTljNTQ3Li4xMTY5OGJiIDEwMDY0NAotLS0gYS9zcmMvY2FjaGUvZnRjY2FjaGUuaAorKysgYi9zcmMvY2FjaGUvZnRjY2FjaGUuaApAQCAtMSwyNSArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjY2FjaGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGludGVybmFsIGNhY2hlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjY2FjaGUuaAorICoKKyAqICAgRnJlZVR5cGUgaW50ZXJuYWwgY2FjaGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRDQ0FDSEVfSF8KICNkZWZpbmUgRlRDQ0FDSEVfSF8KIAotCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvY29tcGlsZXItbWFjcm9zLmg+CiAjaW5jbHVkZSAiZnRjbXJ1LmgiCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtNDIsMTcgKzQyLDE3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY2FjaGUgY29udHJvbHMgb25lIG9yIG1vcmUgY2FjaGUgbm9kZXMuICBFYWNoIG5vZGUgaXMgcGFydCBvZiAgICAqLwotICAvKiB0aGUgZ2xvYmFsX2xydSBsaXN0IG9mIHRoZSBtYW5hZ2VyLiAgSXRzIGBkYXRhJyBmaWVsZCBob3dldmVyIGlzIHVzZWQgKi8KLSAgLyogYXMgYSByZWZlcmVuY2UgY291bnQgZm9yIG5vdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIG5vZGUgY2FuIGJlIGFueXRoaW5nLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgaW5mb3JtYXRpb24gaGVsZCBieSAgKi8KLSAgLyogdGhlIGNhY2hlLiAgSXQgY2FuIGJlIGFuIGluZGl2aWR1YWwgZ2x5cGggaW1hZ2UsIGEgc2V0IG9mIGJpdG1hcHMgICAgICovCi0gIC8qIGdseXBocyBmb3IgYSBnaXZlbiBzaXplLCBzb21lIG1ldHJpY3MsIGV0Yy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBFYWNoIGNhY2hlIGNvbnRyb2xzIG9uZSBvciBtb3JlIGNhY2hlIG5vZGVzLiAgRWFjaCBub2RlIGlzIHBhcnQgb2YKKyAgICogdGhlIGdsb2JhbF9scnUgbGlzdCBvZiB0aGUgbWFuYWdlci4gIEl0cyBgZGF0YScgZmllbGQgaG93ZXZlciBpcyB1c2VkCisgICAqIGFzIGEgcmVmZXJlbmNlIGNvdW50IGZvciBub3cuCisgICAqCisgICAqIEEgbm9kZSBjYW4gYmUgYW55dGhpbmcsIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBpbmZvcm1hdGlvbiBoZWxkIGJ5CisgICAqIHRoZSBjYWNoZS4gIEl0IGNhbiBiZSBhbiBpbmRpdmlkdWFsIGdseXBoIGltYWdlLCBhIHNldCBvZiBiaXRtYXBzCisgICAqIGdseXBocyBmb3IgYSBnaXZlbiBzaXplLCBzb21lIG1ldHJpY3MsIGV0Yy4KKyAgICoKKyAgICovCiAKICAgLyogc3RydWN0dXJlIHNpemUgc2hvdWxkIGJlIDIwIGJ5dGVzIG9uIDMyLWJpdHMgbWFjaGluZXMgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19Ob2RlUmVjXwpAQCAtMzAyLDExICszMDIsMTEgQEAKICAgICoKICAgICogRXhhbXBsZToKICAgICoKLSAgICogICB7Ci0gICAqICAgICBGVENfQ0FDSEVfVFJZTE9PUCggY2FjaGUgKQotICAgKiAgICAgICBlcnJvciA9IGxvYWRfZGF0YSggLi4uICk7Ci0gICAqICAgICBGVENfQ0FDSEVfVFJZTE9PUF9FTkQoKQotICAgKiAgIH0KKyAgICogeworICAgKiAgIEZUQ19DQUNIRV9UUllMT09QKCBjYWNoZSApCisgICAqICAgICBlcnJvciA9IGxvYWRfZGF0YSggLi4uICk7CisgICAqICAgRlRDX0NBQ0hFX1RSWUxPT1BfRU5EKCkKKyAgICogfQogICAgKgogICAgKi8KICNkZWZpbmUgRlRDX0NBQ0hFX1RSWUxPT1AoIGNhY2hlICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjY2JhY2suaCBiL3NyYy9jYWNoZS9mdGNjYmFjay5oCmluZGV4IGU1MWQ4ZDYuLjU0MmFjYjEgMTAwNjQ0Ci0tLSBhL3NyYy9jYWNoZS9mdGNjYmFjay5oCisrKyBiL3NyYy9jYWNoZS9mdGNjYmFjay5oCkBAIC0xLDMxICsxLDMxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNjYmFjay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ2FsbGJhY2sgZnVuY3Rpb25zIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNjYmFjay5oCisgKgorICogICBDYWxsYmFjayBmdW5jdGlvbnMgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAjaWZuZGVmIEZUQ0NCQUNLX0hfCiAjZGVmaW5lIEZUQ0NCQUNLX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICNpbmNsdWRlICJmdGNtcnUuaCIKICNpbmNsdWRlICJmdGNpbWFnZS5oIgogI2luY2x1ZGUgImZ0Y21hbmFnLmgiCiAjaW5jbHVkZSAiZnRjZ2x5cGguaCIKICNpbmNsdWRlICJmdGNzYml0cy5oIgogCitGVF9CRUdJTl9IRUFERVIKIAogICBGVF9MT0NBTCggdm9pZCApCiAgIGZ0Y19pbm9kZV9mcmVlKCBGVENfTm9kZSAgIGlub2RlLApAQCAtODUsNiArODUsNyBAQAogICBmdGNfbm9kZV9kZXN0cm95KCBGVENfTm9kZSAgICAgbm9kZSwKICAgICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKIAorRlRfRU5EX0hFQURFUgogCiAjZW5kaWYgLyogRlRDQ0JBQ0tfSF8gKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2NtYXAuYyBiL3NyYy9jYWNoZS9mdGNjbWFwLmMKaW5kZXggZDIwYjBmNC4uNDY4YzAwOCAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y2NtYXAuYworKysgYi9zcmMvY2FjaGUvZnRjY21hcC5jCkBAIC0xLDQ4ICsxLDQ3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQ2hhck1hcCBjYWNoZSAoYm9keSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNjbWFwLmMKKyAqCisgKiAgIEZyZWVUeXBlIENoYXJNYXAgY2FjaGUgKGJvZHkpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0NBQ0hFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICNpbmNsdWRlICJmdGNtYW5hZy5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAjaW5jbHVkZSAiZnRjY2JhY2suaCIKICNpbmNsdWRlICJmdGNlcnJvci5oIgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NhY2hlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2FjaGUKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBGVENfQ01hcE5vZGUgY29udGFpbnMgYSBzaW1wbGUgYXJyYXkgdG8gbWFwIGEgcmFuZ2Ugb2YgY2hhcmFjdGVyICovCi0gIC8qIGNvZGVzIHRvIGVxdWl2YWxlbnQgZ2x5cGggaW5kaWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIG5vdywgdGhlIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWM6IEVhY2ggbm9kZSBtYXBzIGEgcmFuZ2Ugb2YgICovCi0gIC8qIDEyOCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXIgY29kZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRpY2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgY291bGQgZG8gbW9yZSBjb21wbGV4IHRoaW5ncywgYnV0IEkgZG9uJ3QgdGhpbmsgaXQgaXMgcmVhbGx5IHZlcnkgICovCi0gIC8qIHVzZWZ1bC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBFYWNoIEZUQ19DTWFwTm9kZSBjb250YWlucyBhIHNpbXBsZSBhcnJheSB0byBtYXAgYSByYW5nZSBvZiBjaGFyYWN0ZXIKKyAgICogY29kZXMgdG8gZXF1aXZhbGVudCBnbHlwaCBpbmRpY2VzLgorICAgKgorICAgKiBGb3Igbm93LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBiYXNpYzogRWFjaCBub2RlIG1hcHMgYSByYW5nZSBvZgorICAgKiAxMjggY29uc2VjdXRpdmUgY2hhcmFjdGVyIGNvZGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZ2x5cGggaW5kaWNlcy4KKyAgICoKKyAgICogV2UgY291bGQgZG8gbW9yZSBjb21wbGV4IHRoaW5ncywgYnV0IEkgZG9uJ3QgdGhpbmsgaXQgaXMgcmVhbGx5IHZlcnkKKyAgICogdXNlZnVsLgorICAgKgorICAgKi8KIAogCiAgIC8qIG51bWJlciBvZiBnbHlwaCBpbmRpY2VzIC8gY2hhcmFjdGVyIGNvZGUgcGVyIG5vZGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNlcnJvci5oIGIvc3JjL2NhY2hlL2Z0Y2Vycm9yLmgKaW5kZXggYTI2Y2Q1OS4uYmVkZmQyOCAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y2Vycm9yLmgKKysrIGIvc3JjL2NhY2hlL2Z0Y2Vycm9yLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2Vycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDYWNoaW5nIHN1Yi1zeXN0ZW0gZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y2Vycm9yLmgKKyAqCisgKiAgIENhY2hpbmcgc3ViLXN5c3RlbSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBlcnJvciBlbnVtZXJhdGlvbiAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgY2FjaGluZyBzdWItc3lzdGVtIGVycm9yIGVudW1lcmF0aW9uCisgICAqIGNvbnN0YW50cy4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgRlRDRVJST1JfSF8KICNkZWZpbmUgRlRDRVJST1JfSF8KIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRDX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9DYWNoZQogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBGVENFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjZ2x5cGguYyBiL3NyYy9jYWNoZS9mdGNnbHlwaC5jCmluZGV4IDc4MmNjMGUuLjdmNTQzOGEgMTAwNjQ0Ci0tLSBhL3NyYy9jYWNoZS9mdGNnbHlwaC5jCisrKyBiL3NyYy9jYWNoZS9mdGNnbHlwaC5jCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNnbHlwaC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgR2x5cGggSW1hZ2UgKEZUX0dseXBoKSBjYWNoZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNnbHlwaC5jCisgKgorICogICBGcmVlVHlwZSBHbHlwaCBJbWFnZSAoRlRfR2x5cGgpIGNhY2hlIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9DQUNIRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPgogI2luY2x1ZGUgImZ0Y2dseXBoLmgiCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNpbmNsdWRlICJmdGNjYmFjay5oIgogI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjZ2x5cGguaCBiL3NyYy9jYWNoZS9mdGNnbHlwaC5oCmluZGV4IDIzYzI0ZDIuLjU2Mjk1NDUgMTAwNjQ0Ci0tLSBhL3NyYy9jYWNoZS9mdGNnbHlwaC5oCisrKyBiL3NyYy9jYWNoZS9mdGNnbHlwaC5oCkBAIC0xLDEwMSArMSwxMDEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2dseXBoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhYnN0cmFjdCBnbHlwaCBjYWNoZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y2dseXBoLmgKKyAqCisgKiAgIEZyZWVUeXBlIGFic3RyYWN0IGdseXBoIGNhY2hlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICAgLyoKICAgICoKLSAgICogIEZUQ19HQ2FjaGUgaXMgYW4gX2Fic3RyYWN0XyBjYWNoZSBvYmplY3Qgb3B0aW1pemVkIHRvIHN0b3JlIGdseXBoCi0gICAqICBkYXRhLiAgSXQgd29ya3MgYXMgZm9sbG93czoKKyAgICogRlRDX0dDYWNoZSBpcyBhbiBfYWJzdHJhY3RfIGNhY2hlIG9iamVjdCBvcHRpbWl6ZWQgdG8gc3RvcmUgZ2x5cGgKKyAgICogZGF0YS4gIEl0IHdvcmtzIGFzIGZvbGxvd3M6CiAgICAqCi0gICAqICAgLSBJdCBtYW5hZ2VzIEZUQ19HTm9kZSBvYmplY3RzLiBFYWNoIG9uZSBvZiB0aGVtIGNhbiBob2xkIG9uZSBvciBtb3JlCi0gICAqICAgICBnbHlwaCBgaXRlbXMnLiAgSXRlbSB0eXBlcyBhcmUgbm90IHNwZWNpZmllZCBpbiB0aGUgRlRDX0dDYWNoZSBidXQKLSAgICogICAgIGluIGNsYXNzZXMgdGhhdCBleHRlbmQgaXQuCisgICAqIC0gSXQgbWFuYWdlcyBGVENfR05vZGUgb2JqZWN0cy4gRWFjaCBvbmUgb2YgdGhlbSBjYW4gaG9sZCBvbmUgb3IgbW9yZQorICAgKiAgIGdseXBoIGBpdGVtcycuICBJdGVtIHR5cGVzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBGVENfR0NhY2hlIGJ1dAorICAgKiAgIGluIGNsYXNzZXMgdGhhdCBleHRlbmQgaXQuCiAgICAqCi0gICAqICAgLSBHbHlwaCBhdHRyaWJ1dGVzLCBsaWtlIGZhY2UgSUQsIGNoYXJhY3RlciBzaXplLCByZW5kZXIgbW9kZSwgZXRjLiwKLSAgICogICAgIGNhbiBiZSBncm91cGVkIGludG8gYWJzdHJhY3QgYGdseXBoIGZhbWlsaWVzJy4gIFRoaXMgYXZvaWRzIHN0b3JpbmcKLSAgICogICAgIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiB0aGUgRlRDX0dDYWNoZSwgc2luY2UgaXQgaXMgbGlrZWx5IHRoYXQgbWFueQotICAgKiAgICAgRlRDX0dOb2RlcyB3aWxsIGJlbG9uZyB0byB0aGUgc2FtZSBmYW1pbHkgaW4gdHlwaWNhbCB1c2VzLgorICAgKiAtIEdseXBoIGF0dHJpYnV0ZXMsIGxpa2UgZmFjZSBJRCwgY2hhcmFjdGVyIHNpemUsIHJlbmRlciBtb2RlLCBldGMuLAorICAgKiAgIGNhbiBiZSBncm91cGVkIGludG8gYWJzdHJhY3QgYGdseXBoIGZhbWlsaWVzJy4gIFRoaXMgYXZvaWRzIHN0b3JpbmcKKyAgICogICB0aGUgYXR0cmlidXRlcyB3aXRoaW4gdGhlIEZUQ19HQ2FjaGUsIHNpbmNlIGl0IGlzIGxpa2VseSB0aGF0IG1hbnkKKyAgICogICBGVENfR05vZGVzIHdpbGwgYmVsb25nIHRvIHRoZSBzYW1lIGZhbWlseSBpbiB0eXBpY2FsIHVzZXMuCiAgICAqCi0gICAqICAgLSBFYWNoIEZUQ19HTm9kZSBpcyB0aHVzIGFuIEZUQ19Ob2RlIHdpdGggdHdvIGFkZGl0aW9uYWwgZmllbGRzOgorICAgKiAtIEVhY2ggRlRDX0dOb2RlIGlzIHRodXMgYW4gRlRDX05vZGUgd2l0aCB0d28gYWRkaXRpb25hbCBmaWVsZHM6CiAgICAqCi0gICAqICAgICAgICogZ2luZGV4OiBBIGdseXBoIGluZGV4LCBvciB0aGUgZmlyc3QgaW5kZXggaW4gYSBnbHlwaCByYW5nZS4KLSAgICogICAgICAgKiBmYW1pbHk6IEEgcG9pbnRlciB0byBhIGdseXBoIGBmYW1pbHknLgorICAgKiAgICogZ2luZGV4OiBBIGdseXBoIGluZGV4LCBvciB0aGUgZmlyc3QgaW5kZXggaW4gYSBnbHlwaCByYW5nZS4KKyAgICogICAqIGZhbWlseTogQSBwb2ludGVyIHRvIGEgZ2x5cGggYGZhbWlseScuCiAgICAqCi0gICAqICAgLSBGYW1pbHkgdHlwZXMgYXJlIG5vdCBmdWxseSBzcGVjaWZpYyBpbiB0aGUgRlRDX0ZhbWlseSB0eXBlLCBidXQKLSAgICogICAgIGJ5IGNsYXNzZXMgdGhhdCBleHRlbmQgaXQuCisgICAqIC0gRmFtaWx5IHR5cGVzIGFyZSBub3QgZnVsbHkgc3BlY2lmaWMgaW4gdGhlIEZUQ19GYW1pbHkgdHlwZSwgYnV0CisgICAqICAgYnkgY2xhc3NlcyB0aGF0IGV4dGVuZCBpdC4KICAgICoKLSAgICogIE5vdGUgdGhhdCBib3RoIEZUQ19JbWFnZUNhY2hlIGFuZCBGVENfU0JpdENhY2hlIGV4dGVuZCBGVENfR0NhY2hlLgotICAgKiAgVGhleSBzaGFyZSBhbiBGVENfRmFtaWx5IHN1Yi1jbGFzcyBjYWxsZWQgRlRDX0Jhc2ljRmFtaWx5IHdoaWNoIGlzCi0gICAqICB1c2VkIHRvIHN0b3JlIHRoZSBmb2xsb3dpbmcgZGF0YTogZmFjZSBJRCwgcGl4ZWwvcG9pbnQgc2l6ZXMsIGxvYWQKLSAgICogIGZsYWdzLiAgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlIGZpbGUgYHNyYy9jYWNoZS9mdGNiYXNpYy5jJy4KKyAgICogTm90ZSB0aGF0IGJvdGggRlRDX0ltYWdlQ2FjaGUgYW5kIEZUQ19TQml0Q2FjaGUgZXh0ZW5kIEZUQ19HQ2FjaGUuCisgICAqIFRoZXkgc2hhcmUgYW4gRlRDX0ZhbWlseSBzdWItY2xhc3MgY2FsbGVkIEZUQ19CYXNpY0ZhbWlseSB3aGljaCBpcworICAgKiB1c2VkIHRvIHN0b3JlIHRoZSBmb2xsb3dpbmcgZGF0YTogZmFjZSBJRCwgcGl4ZWwvcG9pbnQgc2l6ZXMsIGxvYWQKKyAgICogZmxhZ3MuICBGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgZmlsZSBgc3JjL2NhY2hlL2Z0Y2Jhc2ljLmMnLgogICAgKgotICAgKiAgQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gZXh0ZW5kIEZUQ19HTm9kZSB3aXRoIHRoZWlyIG93biBGVENfR05vZGUKLSAgICogIGFuZCBGVENfRmFtaWx5IHN1Yi1jbGFzc2VzIHRvIGltcGxlbWVudCBtb3JlIGNvbXBsZXggY2FjaGVzIChlLmcuLAotICAgKiAgaGFuZGxpbmcgYXV0b21hdGljIHN5bnRoZXNpcywgbGlrZSBvYmxpcXVpbmcgJiBlbWJvbGRlbmluZywgY29sb3JlZAotICAgKiAgZ2x5cGhzLCBldGMuKS4KKyAgICogQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gZXh0ZW5kIEZUQ19HTm9kZSB3aXRoIHRoZWlyIG93biBGVENfR05vZGUKKyAgICogYW5kIEZUQ19GYW1pbHkgc3ViLWNsYXNzZXMgdG8gaW1wbGVtZW50IG1vcmUgY29tcGxleCBjYWNoZXMgKGUuZy4sCisgICAqIGhhbmRsaW5nIGF1dG9tYXRpYyBzeW50aGVzaXMsIGxpa2Ugb2JsaXF1aW5nICYgZW1ib2xkZW5pbmcsIGNvbG9yZWQKKyAgICogZ2x5cGhzLCBldGMuKS4KICAgICoKLSAgICogIFNlZSBhbHNvIHRoZSBGVENfSUNhY2hlICYgRlRDX1NDYWNoZSBjbGFzc2VzIGluIGBmdGNpbWFnZS5oJyBhbmQKLSAgICogIGBmdGNzYml0cy5oJywgd2hpY2ggYm90aCBleHRlbmQgRlRDX0dDYWNoZSB3aXRoIGFkZGl0aW9uYWwKLSAgICogIG9wdGltaXphdGlvbnMuCisgICAqIFNlZSBhbHNvIHRoZSBGVENfSUNhY2hlICYgRlRDX1NDYWNoZSBjbGFzc2VzIGluIGBmdGNpbWFnZS5oJyBhbmQKKyAgICogYGZ0Y3NiaXRzLmgnLCB3aGljaCBib3RoIGV4dGVuZCBGVENfR0NhY2hlIHdpdGggYWRkaXRpb25hbAorICAgKiBvcHRpbWl6YXRpb25zLgogICAgKgotICAgKiAgQSB0eXBpY2FsIEZUQ19HQ2FjaGUgaW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGF0IGxlYXN0IHRoZQotICAgKiAgZm9sbG93aW5nOgorICAgKiBBIHR5cGljYWwgRlRDX0dDYWNoZSBpbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgYXQgbGVhc3QgdGhlCisgICAqIGZvbGxvd2luZzoKICAgICoKLSAgICogIC0gRlRDX0dOb2RlIHN1Yi1jbGFzcywgZS5nLiBNeU5vZGUsIHdpdGggcmVsZXZhbnQgbWV0aG9kczoKLSAgICogICAgICAgIG15X25vZGVfbmV3ICAgICAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfSW5pdCkKLSAgICogICAgICAgIG15X25vZGVfZnJlZSAgICAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfRG9uZSkKLSAgICogICAgICAgIG15X25vZGVfY29tcGFyZSAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfQ29tcGFyZSkKLSAgICogICAgICAgIG15X25vZGVfcmVtb3ZlX2ZhY2VpZCAgKG11c3QgY2FsbCBmdGNfZ25vZGVfdW5zZWxlY3QgaW4gY2FzZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWF0Y2gpCisgICAqIC0gRlRDX0dOb2RlIHN1Yi1jbGFzcywgZS5nLiBNeU5vZGUsIHdpdGggcmVsZXZhbnQgbWV0aG9kczoKKyAgICogICAgIG15X25vZGVfbmV3ICAgICAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfSW5pdCkKKyAgICogICAgIG15X25vZGVfZnJlZSAgICAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfRG9uZSkKKyAgICogICAgIG15X25vZGVfY29tcGFyZSAgICAgICAgKG11c3QgY2FsbCBGVENfR05vZGVfQ29tcGFyZSkKKyAgICogICAgIG15X25vZGVfcmVtb3ZlX2ZhY2VpZCAgKG11c3QgY2FsbCBmdGNfZ25vZGVfdW5zZWxlY3QgaW4gY2FzZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWF0Y2gpCiAgICAqCi0gICAqICAtIEZUQ19GYW1pbHkgc3ViLWNsYXNzLCBlLmcuIE15RmFtaWx5LCB3aXRoIHJlbGV2YW50IG1ldGhvZHM6Ci0gICAqICAgICAgICBteV9mYW1pbHlfY29tcGFyZQotICAgKiAgICAgICAgbXlfZmFtaWx5X2luaXQKLSAgICogICAgICAgIG15X2ZhbWlseV9yZXNldCAob3B0aW9uYWwpCi0gICAqICAgICAgICBteV9mYW1pbHlfZG9uZQorICAgKiAtIEZUQ19GYW1pbHkgc3ViLWNsYXNzLCBlLmcuIE15RmFtaWx5LCB3aXRoIHJlbGV2YW50IG1ldGhvZHM6CisgICAqICAgICBteV9mYW1pbHlfY29tcGFyZQorICAgKiAgICAgbXlfZmFtaWx5X2luaXQKKyAgICogICAgIG15X2ZhbWlseV9yZXNldCAob3B0aW9uYWwpCisgICAqICAgICBteV9mYW1pbHlfZG9uZQogICAgKgotICAgKiAgLSBGVENfR1F1ZXJ5IHN1Yi1jbGFzcywgZS5nLiBNeVF1ZXJ5LCB0byBob2xkIGNhY2hlLXNwZWNpZmljIHF1ZXJ5Ci0gICAqICAgIGRhdGEuCisgICAqIC0gRlRDX0dRdWVyeSBzdWItY2xhc3MsIGUuZy4gTXlRdWVyeSwgdG8gaG9sZCBjYWNoZS1zcGVjaWZpYyBxdWVyeQorICAgKiAgIGRhdGEuCiAgICAqCi0gICAqICAtIENvbnN0YW50IHN0cnVjdHVyZXMgZm9yIGEgRlRDX0dOb2RlQ2xhc3MuCisgICAqIC0gQ29uc3RhbnQgc3RydWN0dXJlcyBmb3IgYSBGVENfR05vZGVDbGFzcy4KICAgICoKLSAgICogIC0gTXlDYWNoZU5ldygpIGNhbiBiZSBpbXBsZW1lbnRlZCBlYXNpbHkgYXMgYSBjYWxsIHRvIHRoZSBjb252ZW5pZW5jZQotICAgKiAgICBmdW5jdGlvbiBGVENfR0NhY2hlX05ldy4KKyAgICogLSBNeUNhY2hlTmV3KCkgY2FuIGJlIGltcGxlbWVudGVkIGVhc2lseSBhcyBhIGNhbGwgdG8gdGhlIGNvbnZlbmllbmNlCisgICAqICAgZnVuY3Rpb24gRlRDX0dDYWNoZV9OZXcuCiAgICAqCi0gICAqICAtIE15Q2FjaGVMb29rdXAgd2l0aCBhIGNhbGwgdG8gRlRDX0dDYWNoZV9Mb29rdXAuICBUaGlzIGZ1bmN0aW9uIHdpbGwKLSAgICogICAgYXV0b21hdGljYWxseToKKyAgICogLSBNeUNhY2hlTG9va3VwIHdpdGggYSBjYWxsIHRvIEZUQ19HQ2FjaGVfTG9va3VwLiAgVGhpcyBmdW5jdGlvbiB3aWxsCisgICAqICAgYXV0b21hdGljYWxseToKICAgICoKLSAgICogICAgLSBTZWFyY2ggZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZhbWlseSBpbiB0aGUgY2FjaGUsIG9yIGNyZWF0ZQotICAgKiAgICAgIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuICBQdXQgaXQgaW4gRlRDX0dRVUVSWShteXF1ZXJ5KS5mYW1pbHkKKyAgICogICAtIFNlYXJjaCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmFtaWx5IGluIHRoZSBjYWNoZSwgb3IgY3JlYXRlCisgICAqICAgICBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LiAgUHV0IGl0IGluIEZUQ19HUVVFUlkobXlxdWVyeSkuZmFtaWx5CiAgICAqCi0gICAqICAgIC0gQ2FsbCBGVENfQ2FjaGVfTG9va3VwLgorICAgKiAgIC0gQ2FsbCBGVENfQ2FjaGVfTG9va3VwLgogICAgKgotICAgKiAgICBJZiBpdCByZXR1cm5zIE5VTEwsIHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IG5vZGUsIHRoZW4gY2FsbAotICAgKiAgICBmdGNfY2FjaGVfYWRkIGFzIHVzdWFsLgorICAgKiAgIElmIGl0IHJldHVybnMgTlVMTCwgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgbm9kZSwgdGhlbiBjYWxsCisgICAqICAgZnRjX2NhY2hlX2FkZCBhcyB1c3VhbC4KICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEltcG9ydGFudDogVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgb25seSB1c2VkIHRvICAgICAgICAqLwotICAvKiAgICAgICAgICAgIGltcGxlbWVudCBhbiBhYnN0cmFjdCBnbHlwaCBjYWNoZSBjbGFzcy4gIFlvdSBuZWVkIHRvICAgICAgKi8KLSAgLyogICAgICAgICAgICBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgdG8gaW1wbGVtZW50IGEgY29tcGxldGUgY2FjaGUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEltcG9ydGFudDogVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZSBhcmUgb25seSB1c2VkIHRvCisgICAqICAgICAgICAgICAgaW1wbGVtZW50IGFuIGFic3RyYWN0IGdseXBoIGNhY2hlIGNsYXNzLiAgWW91IG5lZWQgdG8KKyAgICogICAgICAgICAgICBwcm92aWRlIGFkZGl0aW9uYWwgbG9naWMgdG8gaW1wbGVtZW50IGEgY29tcGxldGUgY2FjaGUuCisgICAqCisgICAqLwogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTcsNyArMTE3LDYgQEAKICNkZWZpbmUgRlRDR0xZUEhfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJmdGNtYW5hZy5oIgogCiAKQEAgLTEyNSwxMSArMTI0LDExIEBACiAKIAogIC8qCi0gICogIFdlIGNhbiBncm91cCBnbHlwaHMgaW50byBgZmFtaWxpZXMnLiAgRWFjaCBmYW1pbHkgY29ycmVzcG9uZCB0byBhCi0gICogIGdpdmVuIGZhY2UgSUQsIGNoYXJhY3RlciBzaXplLCB0cmFuc2Zvcm0sIGV0Yy4KKyAgKiBXZSBjYW4gZ3JvdXAgZ2x5cGhzIGludG8gYGZhbWlsaWVzJy4gIEVhY2ggZmFtaWx5IGNvcnJlc3BvbmQgdG8gYQorICAqIGdpdmVuIGZhY2UgSUQsIGNoYXJhY3RlciBzaXplLCB0cmFuc2Zvcm0sIGV0Yy4KICAgKgotICAqICBGYW1pbGllcyBhcmUgaW1wbGVtZW50ZWQgYXMgTVJVIGxpc3Qgbm9kZXMuICBUaGV5IGFyZQotICAqICByZWZlcmVuY2UtY291bnRlZC4KKyAgKiBGYW1pbGllcyBhcmUgaW1wbGVtZW50ZWQgYXMgTVJVIGxpc3Qgbm9kZXMuICBUaGV5IGFyZQorICAqIHJlZmVyZW5jZS1jb3VudGVkLgogICAqLwogCiAgIHR5cGVkZWYgc3RydWN0ICBGVENfRmFtaWx5UmVjXwpAQCAtMTY3LDEyICsxNjYsMTIgQEAKICNkZWZpbmUgRlRDX0dRVUVSWSggeCApICAoIChGVENfR1F1ZXJ5KSh4KSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgc28gdGhhdCB0aGV5IGNhbiBiZSBjYWxsZWQgZnJvbSAgICAgICAgICAqLwotICAvKiB1c2VyLXByb3ZpZGVkIGNhY2hlIGNsYXNzZXM7IG90aGVyd2lzZSwgdGhleSBhcmUgcmVhbGx5IHBhcnQgb2YgdGhlICAgKi8KLSAgLyogY2FjaGUgc3ViLXN5c3RlbSBpbnRlcm5hbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAqIHVzZXItcHJvdmlkZWQgY2FjaGUgY2xhc3Nlczsgb3RoZXJ3aXNlLCB0aGV5IGFyZSByZWFsbHkgcGFydCBvZiB0aGUKKyAgICogY2FjaGUgc3ViLXN5c3RlbSBpbnRlcm5hbHMuCisgICAqLwogCiAgIC8qIG11c3QgYmUgY2FsbGVkIGJ5IGRlcml2ZWQgRlRDX05vZGVfSW5pdEZ1bmMgcm91dGluZXMgKi8KICAgRlRfTE9DQUwoIHZvaWQgKQpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y2ltYWdlLmMgYi9zcmMvY2FjaGUvZnRjaW1hZ2UuYwppbmRleCA3N2ExMDAxLi41OGViYWQ4IDEwMDY0NAotLS0gYS9zcmMvY2FjaGUvZnRjaW1hZ2UuYworKysgYi9zcmMvY2FjaGUvZnRjaW1hZ2UuYwpAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjaW1hZ2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEltYWdlIGNhY2hlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjaW1hZ2UuYworICoKKyAqICAgRnJlZVR5cGUgSW1hZ2UgY2FjaGUgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DQUNIRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPgogI2luY2x1ZGUgImZ0Y2ltYWdlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogI2luY2x1ZGUgImZ0Y2NiYWNrLmgiCiAjaW5jbHVkZSAiZnRjZXJyb3IuaCIKZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNpbWFnZS5oIGIvc3JjL2NhY2hlL2Z0Y2ltYWdlLmgKaW5kZXggMjRhMjIxMC4uYTQwMDc4OCAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y2ltYWdlLmgKKysrIGIvc3JjL2NhY2hlL2Z0Y2ltYWdlLmgKQEAgLTEsNDMgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2ltYWdlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBHZW5lcmljIEltYWdlIGNhY2hlIChzcGVjaWZpY2F0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y2ltYWdlLmgKKyAqCisgKiAgIEZyZWVUeXBlIEdlbmVyaWMgSW1hZ2UgY2FjaGUgKHNwZWNpZmljYXRpb24pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAgLyoKLSAgKiAgRlRDX0lDYWNoZSBpcyBhbiBfYWJzdHJhY3RfIGNhY2hlIHVzZWQgdG8gc3RvcmUgYSBzaW5nbGUgRlRfR2x5cGgKLSAgKiAgaW1hZ2UgcGVyIGNhY2hlIG5vZGUuCisgICogRlRDX0lDYWNoZSBpcyBhbiBfYWJzdHJhY3RfIGNhY2hlIHVzZWQgdG8gc3RvcmUgYSBzaW5nbGUgRlRfR2x5cGgKKyAgKiBpbWFnZSBwZXIgY2FjaGUgbm9kZS4KICAgKgotICAqICBGVENfSUNhY2hlIGV4dGVuZHMgRlRDX0dDYWNoZS4gIEZvciBhbiBpbXBsZW1lbnRhdGlvbiBleGFtcGxlLAotICAqICBzZWUgRlRDX0ltYWdlQ2FjaGUgaW4gYHNyYy9jYWNoZS9mdGJhc2ljLmMnLgorICAqIEZUQ19JQ2FjaGUgZXh0ZW5kcyBGVENfR0NhY2hlLiAgRm9yIGFuIGltcGxlbWVudGF0aW9uIGV4YW1wbGUsCisgICogc2VlIEZUQ19JbWFnZUNhY2hlIGluIGBzcmMvY2FjaGUvZnRiYXNpYy5jJy4KICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBpbWFnZSBjYWNoZSByZWFsbHkgbWFuYWdlcyBGVF9HbHlwaCBvYmplY3RzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEVhY2ggaW1hZ2UgY2FjaGUgcmVhbGx5IG1hbmFnZXMgRlRfR2x5cGggb2JqZWN0cy4KKyAgICoKKyAgICovCiAKIAogI2lmbmRlZiBGVENJTUFHRV9IXwogI2RlZmluZSBGVENJTUFHRV9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICNpbmNsdWRlICJmdGNnbHlwaC5oIgogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNtYW5hZy5jIGIvc3JjL2NhY2hlL2Z0Y21hbmFnLmMKaW5kZXggMmJjZDlkZi4uNDM2ZDQxZiAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y21hbmFnLmMKKysrIGIvc3JjL2NhY2hlL2Z0Y21hbmFnLmMKQEAgLTEsMzggKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y21hbmFnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBDYWNoZSBNYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y21hbmFnLmMKKyAqCisgKiAgIEZyZWVUeXBlIENhY2hlIE1hbmFnZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DQUNIRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRjYWNoZS5oPgogI2luY2x1ZGUgImZ0Y21hbmFnLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1NJWkVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzaXplcy5oPgogCiAjaW5jbHVkZSAiZnRjY2JhY2suaCIKICNpbmNsdWRlICJmdGNlcnJvci5oIgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAiY2FjaGUgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAKICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2FjaGUKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjYWNoZQogCiAKICAgc3RhdGljIEZUX0Vycm9yCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjbWFuYWcuaCBiL3NyYy9jYWNoZS9mdGNtYW5hZy5oCmluZGV4IGI0YjQ3NTUuLjZjNmVjNjggMTAwNjQ0Ci0tLSBhL3NyYy9jYWNoZS9mdGNtYW5hZy5oCisrKyBiL3NyYy9jYWNoZS9mdGNtYW5hZy5oCkBAIC0xLDQ3ICsxLDQ3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNtYW5hZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQ2FjaGUgTWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNtYW5hZy5oCisgKgorICogICBGcmVlVHlwZSBDYWNoZSBNYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIGNhY2hlIG1hbmFnZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIE1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIGdlbmVyaWMgRlRDX0ZhY2VJRHMgYW5kIGxpdmUgRlRfRmFjZSAgICAqLwotICAvKiAgICBvYmplY3RzLiAgVGhlIG1hcHBpbmcgaXRzZWxmIGlzIHBlcmZvcm1lZCB0aHJvdWdoIGEgdXNlci1wcm92aWRlZCAgKi8KLSAgLyogICAgY2FsbGJhY2suICBIb3dldmVyLCB0aGUgbWFuYWdlciBtYWludGFpbnMgYSBzbWFsbCBjYWNoZSBvZiBGVF9GYWNlICovCi0gIC8qICAgIGFuZCBGVF9TaXplIG9iamVjdHMgaW4gb3JkZXIgdG8gc3BlZWQgdXAgdGhpbmdzIGNvbnNpZGVyYWJseS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gTWFuYWdlIG9uZSBvciBtb3JlIGNhY2hlIG9iamVjdHMuICBFYWNoIGNhY2hlIGlzIGluIGNoYXJnZSBvZiAgICAgICovCi0gIC8qICAgIGhvbGRpbmcgYSB2YXJ5aW5nIG51bWJlciBvZiBgY2FjaGUgbm9kZXMnLiAgRWFjaCBjYWNoZSBub2RlICAgICAgICAqLwotICAvKiAgICByZXByZXNlbnRzIGEgbWluaW1hbCBhbW91bnQgb2YgaW5kaXZpZHVhbGx5IGFjY2Vzc2libGUgY2FjaGVkICAgICAgKi8KLSAgLyogICAgZGF0YS4gIEZvciBleGFtcGxlLCBhIGNhY2hlIG5vZGUgY2FuIGJlIGFuIEZUX0dseXBoIGltYWdlICAgICAgICAgICovCi0gIC8qICAgIGNvbnRhaW5pbmcgYSB2ZWN0b3Igb3V0bGluZSwgb3Igc29tZSBnbHlwaCBtZXRyaWNzLCBvciBhbnl0aGluZyAgICAqLwotICAvKiAgICBlbHNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggY2FjaGUgbm9kZSBoYXMgYSBjZXJ0YWluIHNpemUgaW4gYnl0ZXMgdGhhdCBpcyBhZGRlZCB0byB0aGUgICAqLwotICAvKiAgICB0b3RhbCBhbW91bnQgb2YgYGNhY2hlIG1lbW9yeScgd2l0aGluIHRoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbCBjYWNoZSBub2RlcyBhcmUgbG9jYXRlZCBpbiBhIGdsb2JhbCBMUlUgbGlzdCwgd2hlcmUgdGhlIG9sZGVzdCAqLwotICAvKiAgICBub2RlIGlzIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVhY2ggbm9kZSBiZWxvbmdzIHRvIGEgc2luZ2xlIGNhY2hlLCBhbmQgaW5jbHVkZXMgYSByZWZlcmVuY2UgICAgICAqLwotICAvKiAgICBjb3VudCB0byBhdm9pZCBkZXN0cm95aW5nIGl0IChkdWUgdG8gY2FjaGluZykuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQSBjYWNoZSBtYW5hZ2VyIGlzIGluIGNoYXJnZSBvZiB0aGUgZm9sbG93aW5nOgorICAgKgorICAgKiAtIE1haW50YWluIGEgbWFwcGluZyBiZXR3ZWVuIGdlbmVyaWMgRlRDX0ZhY2VJRHMgYW5kIGxpdmUgRlRfRmFjZQorICAgKiAgIG9iamVjdHMuICBUaGUgbWFwcGluZyBpdHNlbGYgaXMgcGVyZm9ybWVkIHRocm91Z2ggYSB1c2VyLXByb3ZpZGVkCisgICAqICAgY2FsbGJhY2suICBIb3dldmVyLCB0aGUgbWFuYWdlciBtYWludGFpbnMgYSBzbWFsbCBjYWNoZSBvZiBGVF9GYWNlCisgICAqICAgYW5kIEZUX1NpemUgb2JqZWN0cyBpbiBvcmRlciB0byBzcGVlZCB1cCB0aGluZ3MgY29uc2lkZXJhYmx5LgorICAgKgorICAgKiAtIE1hbmFnZSBvbmUgb3IgbW9yZSBjYWNoZSBvYmplY3RzLiAgRWFjaCBjYWNoZSBpcyBpbiBjaGFyZ2Ugb2YKKyAgICogICBob2xkaW5nIGEgdmFyeWluZyBudW1iZXIgb2YgYGNhY2hlIG5vZGVzJy4gIEVhY2ggY2FjaGUgbm9kZQorICAgKiAgIHJlcHJlc2VudHMgYSBtaW5pbWFsIGFtb3VudCBvZiBpbmRpdmlkdWFsbHkgYWNjZXNzaWJsZSBjYWNoZWQKKyAgICogICBkYXRhLiAgRm9yIGV4YW1wbGUsIGEgY2FjaGUgbm9kZSBjYW4gYmUgYW4gRlRfR2x5cGggaW1hZ2UKKyAgICogICBjb250YWluaW5nIGEgdmVjdG9yIG91dGxpbmUsIG9yIHNvbWUgZ2x5cGggbWV0cmljcywgb3IgYW55dGhpbmcKKyAgICogICBlbHNlLgorICAgKgorICAgKiAgIEVhY2ggY2FjaGUgbm9kZSBoYXMgYSBjZXJ0YWluIHNpemUgaW4gYnl0ZXMgdGhhdCBpcyBhZGRlZCB0byB0aGUKKyAgICogICB0b3RhbCBhbW91bnQgb2YgYGNhY2hlIG1lbW9yeScgd2l0aGluIHRoZSBtYW5hZ2VyLgorICAgKgorICAgKiAgIEFsbCBjYWNoZSBub2RlcyBhcmUgbG9jYXRlZCBpbiBhIGdsb2JhbCBMUlUgbGlzdCwgd2hlcmUgdGhlIG9sZGVzdAorICAgKiAgIG5vZGUgaXMgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QuCisgICAqCisgICAqICAgRWFjaCBub2RlIGJlbG9uZ3MgdG8gYSBzaW5nbGUgY2FjaGUsIGFuZCBpbmNsdWRlcyBhIHJlZmVyZW5jZQorICAgKiAgIGNvdW50IHRvIGF2b2lkIGRlc3Ryb3lpbmcgaXQgKGR1ZSB0byBjYWNoaW5nKS4KKyAgICoKKyAgICovCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYzLDggKzYzLDcgQEAKICNkZWZpbmUgRlRDTUFOQUdfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NBQ0hFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+CiAjaW5jbHVkZSAiZnRjbXJ1LmgiCiAjaW5jbHVkZSAiZnRjY2FjaGUuaCIKIApAQCAtNzIsMTIgKzcxLDEyIEBACiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAU2VjdGlvbjoKKyAgICogICBjYWNoZV9zdWJzeXN0ZW0KKyAgICoKKyAgICovCiAKIAogI2RlZmluZSBGVENfTUFYX0ZBQ0VTX0RFRkFVTFQgIDIKQEAgLTExMCwyNyArMTA5LDI4IEBACiAgIH0gRlRDX01hbmFnZXJSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Db21wcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBjYWNoZSBtYW5hZ2VyIGlmICAgKi8KLSAgLyogICAgaXRzIGBudW1fYnl0ZXMnIGZpZWxkIGlzIGdyZWF0ZXIgdGhhbiBpdHMgYG1heF9ieXRlcycgZmllbGQuICBJdCAgICovCi0gIC8qICAgIHdpbGwgZmx1c2ggYXMgbWFueSBvbGQgY2FjaGUgbm9kZXMgYXMgcG9zc2libGUgKGlnbm9yaW5nIGNhY2hlICAgICAqLwotICAvKiAgICBub2RlcyB3aXRoIGEgbm9uLXplcm8gcmVmZXJlbmNlIGNvdW50KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LiAgSXQgaXMgKi8KLSAgLyogICAgbm9ybWFsbHkgaW52b2tlZCBieSBzcGVjaWZpYyBjYWNoZSBpbXBsZW1lbnRhdGlvbnMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVhc29uIHRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgaXMgdG8gYWxsb3cgY2xpZW50LXNwZWNpZmljICAgKi8KLSAgLyogICAgY2FjaGUgY2xhc3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEZUQ19NYW5hZ2VyX0NvbXByZXNzCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXRlIG9mIHRoZSBjYWNoZSBtYW5hZ2VyIGlmCisgICAqICAgaXRzIGBudW1fYnl0ZXMnIGZpZWxkIGlzIGdyZWF0ZXIgdGhhbiBpdHMgYG1heF9ieXRlcycgZmllbGQuICBJdAorICAgKiAgIHdpbGwgZmx1c2ggYXMgbWFueSBvbGQgY2FjaGUgbm9kZXMgYXMgcG9zc2libGUgKGlnbm9yaW5nIGNhY2hlCisgICAqICAgbm9kZXMgd2l0aCBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCkuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBtYW5hZ2VyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIEl0IGlzCisgICAqICAgbm9ybWFsbHkgaW52b2tlZCBieSBzcGVjaWZpYyBjYWNoZSBpbXBsZW1lbnRhdGlvbnMuCisgICAqCisgICAqICAgVGhlIHJlYXNvbiB0aGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGlzIHRvIGFsbG93IGNsaWVudC1zcGVjaWZpYworICAgKiAgIGNhY2hlIGNsYXNzZXMuCisgICAqLwogICBGVF9MT0NBTCggdm9pZCApCiAgIEZUQ19NYW5hZ2VyX0NvbXByZXNzKCBGVENfTWFuYWdlciAgbWFuYWdlciApOwogCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvZnRjbXJ1LmMgYi9zcmMvY2FjaGUvZnRjbXJ1LmMKaW5kZXggMTA4N2JlNC4uOGZlZWQ0NSAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y21ydS5jCisrKyBiL3NyYy9jYWNoZS9mdGNtcnUuYwpAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjbXJ1LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIE1SVSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjbXJ1LmMKKyAqCisgKiAgIEZyZWVUeXBlIE1SVSBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ0FDSEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KICNpbmNsdWRlICJmdGNtcnUuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgImZ0Y2Vycm9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNtcnUuaCBiL3NyYy9jYWNoZS9mdGNtcnUuaAppbmRleCA4MjM5NmI5Li5hYzRmOWIxIDEwMDY0NAotLS0gYS9zcmMvY2FjaGUvZnRjbXJ1LmgKKysrIGIvc3JjL2NhY2hlL2Z0Y21ydS5oCkBAIC0xLDUxICsxLDUxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNtcnUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU2ltcGxlIE1SVSBsaXN0LWNhY2hlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGNtcnUuaAorICoKKyAqICAgU2ltcGxlIE1SVSBsaXN0LWNhY2hlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbiBNUlUgaXMgYSBsaXN0IHRoYXQgY2Fubm90IGhvbGQgbW9yZSB0aGFuIGEgY2VydGFpbiBudW1iZXIgb2YgICAgICAgKi8KLSAgLyogZWxlbWVudHMgKGBtYXhfZWxlbWVudHMnKS4gIEFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUgc29ydGVkIGluICAgICovCi0gIC8qIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIsIGkuZS4sIHRoZSBgb2xkZXN0JyBlbGVtZW50IGlzIGF0IHRoZSB0YWlsICAqLwotICAvKiBvZiB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdoZW4gZG9pbmcgYSBsb29rdXAgKGVpdGhlciB0aHJvdWdoIGBMb29rdXAoKScgb3IgYExvb2t1cF9Ob2RlKCknKSwgICAqLwotICAvKiB0aGUgbGlzdCBpcyBzZWFyY2hlZCBmb3IgYW4gZWxlbWVudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGtleS4gIElmICAgKi8KLSAgLyogaXQgaXMgZm91bmQsIHRoZSBlbGVtZW50IGlzIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGFuZCBpcyAgICAgICovCi0gIC8qIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgbm8gY29ycmVzcG9uZGluZyBlbGVtZW50IGlzIGZvdW5kLCB0aGUgbG9va3VwIHJvdXRpbmUgd2lsbCB0cnkgdG8gICovCi0gIC8qIG9idGFpbiBhIG5ldyBlbGVtZW50IHdpdGggdGhlIHJlbGV2YW50IGtleS4gIElmIHRoZSBsaXN0IGlzIGFscmVhZHkgICAqLwotICAvKiBmdWxsLCB0aGUgb2xkZXN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBpcyBkaXNjYXJkZWQgYW5kIHJlcGxhY2VkIGJ5IGEgKi8KLSAgLyogbmV3IG9uZTsgYSBuZXcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvdGhlcndpc2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gcHJlLWFsbG9jYXRlIHRoZSBlbGVtZW50IGxpc3Qgbm9kZXMuICAgICAgKi8KLSAgLyogVGhpcyBpcyBoYW5keSBpZiBgbWF4X2VsZW1lbnRzJyBpcyBzdWZmaWNpZW50bHkgc21hbGwsIGFzIGl0IHNhdmVzICAgICovCi0gIC8qIGFsbG9jYXRpb25zL3JlbGVhc2VzIGR1cmluZyB0aGUgbG9va3VwIHByb2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBbiBNUlUgaXMgYSBsaXN0IHRoYXQgY2Fubm90IGhvbGQgbW9yZSB0aGFuIGEgY2VydGFpbiBudW1iZXIgb2YKKyAgICogZWxlbWVudHMgKGBtYXhfZWxlbWVudHMnKS4gIEFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcmUgc29ydGVkIGluCisgICAqIGxlYXN0LXJlY2VudGx5LXVzZWQgb3JkZXIsIGkuZS4sIHRoZSBgb2xkZXN0JyBlbGVtZW50IGlzIGF0IHRoZSB0YWlsCisgICAqIG9mIHRoZSBsaXN0LgorICAgKgorICAgKiBXaGVuIGRvaW5nIGEgbG9va3VwIChlaXRoZXIgdGhyb3VnaCBgTG9va3VwKCknIG9yIGBMb29rdXBfTm9kZSgpJyksCisgICAqIHRoZSBsaXN0IGlzIHNlYXJjaGVkIGZvciBhbiBlbGVtZW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcga2V5LiAgSWYKKyAgICogaXQgaXMgZm91bmQsIHRoZSBlbGVtZW50IGlzIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGFuZCBpcworICAgKiByZXR1cm5lZC4KKyAgICoKKyAgICogSWYgbm8gY29ycmVzcG9uZGluZyBlbGVtZW50IGlzIGZvdW5kLCB0aGUgbG9va3VwIHJvdXRpbmUgd2lsbCB0cnkgdG8KKyAgICogb2J0YWluIGEgbmV3IGVsZW1lbnQgd2l0aCB0aGUgcmVsZXZhbnQga2V5LiAgSWYgdGhlIGxpc3QgaXMgYWxyZWFkeQorICAgKiBmdWxsLCB0aGUgb2xkZXN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBpcyBkaXNjYXJkZWQgYW5kIHJlcGxhY2VkIGJ5IGEKKyAgICogbmV3IG9uZTsgYSBuZXcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgbGlzdCBvdGhlcndpc2UuCisgICAqCisgICAqIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBwcmUtYWxsb2NhdGUgdGhlIGVsZW1lbnQgbGlzdCBub2Rlcy4KKyAgICogVGhpcyBpcyBoYW5keSBpZiBgbWF4X2VsZW1lbnRzJyBpcyBzdWZmaWNpZW50bHkgc21hbGwsIGFzIGl0IHNhdmVzCisgICAqIGFsbG9jYXRpb25zL3JlbGVhc2VzIGR1cmluZyB0aGUgbG9va3VwIHByb2Nlc3MuCisgICAqCisgICAqLwogCiAKICNpZm5kZWYgRlRDTVJVX0hfCiAjZGVmaW5lIEZUQ01SVV9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvY29tcGlsZXItbWFjcm9zLmg+CiAKICNpZmRlZiBGUkVFVFlQRV9ICiAjZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgpkaWZmIC0tZ2l0IGEvc3JjL2NhY2hlL2Z0Y3NiaXRzLmMgYi9zcmMvY2FjaGUvZnRjc2JpdHMuYwppbmRleCAwMThmMWVjLi5lMGRiOTMwIDEwMDY0NAotLS0gYS9zcmMvY2FjaGUvZnRjc2JpdHMuYworKysgYi9zcmMvY2FjaGUvZnRjc2JpdHMuYwpAQCAtMSwzMyArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjc2JpdHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHNiaXRzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRjc2JpdHMuYworICoKKyAqICAgRnJlZVR5cGUgc2JpdHMgbWFuYWdlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NBQ0hFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+CiAjaW5jbHVkZSAiZnRjc2JpdHMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogI2luY2x1ZGUgImZ0Y2NiYWNrLmgiCiAjaW5jbHVkZSAiZnRjZXJyb3IuaCIKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWNoZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGNhY2hlCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTkxLDE0ICs5MCwxNCBAQAogCiAKICAgLyoKLSAgICogIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gbG9hZCBhIHNtYWxsIGJpdG1hcCB3aXRoaW4gYSBnaXZlbiBGVENfU05vZGUuCi0gICAqICBOb3RlIHRoYXQgaXQgcmV0dXJucyBhIG5vbi16ZXJvIGVycm9yIGNvZGUgX29ubHlfIGluIHRoZSBjYXNlIG9mCi0gICAqICBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbi4gIEZvciBhbGwgb3RoZXIgZXJyb3JzIChlLmcuLCBjb3JyZXNwb25kaW5nCi0gICAqICB0byBhIGJhZCBmb250IGZpbGUpLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbWFyayB0aGUgc2JpdCBhcyBgdW5hdmFpbGFibGUnCi0gICAqICBhbmQgcmV0dXJuIGEgdmFsdWUgb2YgMC4KKyAgICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byBsb2FkIGEgc21hbGwgYml0bWFwIHdpdGhpbiBhIGdpdmVuIEZUQ19TTm9kZS4KKyAgICogTm90ZSB0aGF0IGl0IHJldHVybnMgYSBub24temVybyBlcnJvciBjb2RlIF9vbmx5XyBpbiB0aGUgY2FzZSBvZgorICAgKiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbi4gIEZvciBhbGwgb3RoZXIgZXJyb3JzIChlLmcuLCBjb3JyZXNwb25kaW5nCisgICAqIHRvIGEgYmFkIGZvbnQgZmlsZSksIHRoaXMgZnVuY3Rpb24gd2lsbCBtYXJrIHRoZSBzYml0IGFzIGB1bmF2YWlsYWJsZScKKyAgICogYW5kIHJldHVybiBhIHZhbHVlIG9mIDAuCiAgICAqCi0gICAqICBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUgY29tbWVudCB3aXRoaW4gdGhlIEBmdGNfc25vZGVfY29tcGFyZQotICAgKiAgZnVuY3Rpb24gYmVsb3cgdG8gc2VlIGhvdyBvdXQtb2YtbWVtb3J5IGlzIGhhbmRsZWQgZHVyaW5nIGEgbG9va3VwLgorICAgKiBZb3Ugc2hvdWxkIGFsc28gcmVhZCB0aGUgY29tbWVudCB3aXRoaW4gdGhlIEBmdGNfc25vZGVfY29tcGFyZQorICAgKiBmdW5jdGlvbiBiZWxvdyB0byBzZWUgaG93IG91dC1vZi1tZW1vcnkgaXMgaGFuZGxlZCBkdXJpbmcgYSBsb29rdXAuCiAgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgZnRjX3Nub2RlX2xvYWQoIEZUQ19TTm9kZSAgICBzbm9kZSwKQEAgLTM0NywzNCArMzQ2LDM0IEBACiAKIAogICAgICAgLyoKLSAgICAgICAqICBUaGUgZm9sbG93aW5nIGNvZGUgaWxsdXN0cmF0ZXMgd2hhdCB0byBkbyB3aGVuIHlvdSB3YW50IHRvCi0gICAgICAgKiAgcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgbWF5IGZhaWwgd2l0aGluIGEgbG9va3VwIGZ1bmN0aW9uLgorICAgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGlsbHVzdHJhdGVzIHdoYXQgdG8gZG8gd2hlbiB5b3Ugd2FudCB0bworICAgICAgICogcGVyZm9ybSBvcGVyYXRpb25zIHRoYXQgbWF5IGZhaWwgd2l0aGluIGEgbG9va3VwIGZ1bmN0aW9uLgogICAgICAgICoKLSAgICAgICAqICBIZXJlLCB3ZSB3YW50IHRvIGxvYWQgYSBzbWFsbCBiaXRtYXAgb24tZGVtYW5kOyB3ZSB0aHVzCi0gICAgICAgKiAgbmVlZCB0byBjYWxsIHRoZSBgZnRjX3Nub2RlX2xvYWQnIGZ1bmN0aW9uIHdoaWNoIG1heSByZXR1cm4KLSAgICAgICAqICBhIG5vbi16ZXJvIGVycm9yIGNvZGUgb25seSB3aGVuIHdlIGFyZSBvdXQgb2YgbWVtb3J5IChPT00pLgorICAgICAgICogSGVyZSwgd2Ugd2FudCB0byBsb2FkIGEgc21hbGwgYml0bWFwIG9uLWRlbWFuZDsgd2UgdGh1cworICAgICAgICogbmVlZCB0byBjYWxsIHRoZSBgZnRjX3Nub2RlX2xvYWQnIGZ1bmN0aW9uIHdoaWNoIG1heSByZXR1cm4KKyAgICAgICAqIGEgbm9uLXplcm8gZXJyb3IgY29kZSBvbmx5IHdoZW4gd2UgYXJlIG91dCBvZiBtZW1vcnkgKE9PTSkuCiAgICAgICAgKgotICAgICAgICogIFRoZSBjb3JyZWN0IHRoaW5nIHRvIGRvIGlzIHRvIHVzZSBARlRDX0NBQ0hFX1RSWUxPT1AgYW5kCi0gICAgICAgKiAgQEZUQ19DQUNIRV9UUllMT09QX0VORCBpbiBvcmRlciB0byBpbXBsZW1lbnQgYSByZXRyeSBsb29wCi0gICAgICAgKiAgdGhhdCBpcyBjYXBhYmxlIG9mIGZsdXNoaW5nIHRoZSBjYWNoZSBpbmNyZW1lbnRhbGx5IHdoZW4KLSAgICAgICAqICBhbiBPT00gZXJyb3JzIG9jY3VyLgorICAgICAgICogVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaXMgdG8gdXNlIEBGVENfQ0FDSEVfVFJZTE9PUCBhbmQKKyAgICAgICAqIEBGVENfQ0FDSEVfVFJZTE9PUF9FTkQgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgcmV0cnkgbG9vcAorICAgICAgICogdGhhdCBpcyBjYXBhYmxlIG9mIGZsdXNoaW5nIHRoZSBjYWNoZSBpbmNyZW1lbnRhbGx5IHdoZW4KKyAgICAgICAqIGFuIE9PTSBlcnJvcnMgb2NjdXIuCiAgICAgICAgKgotICAgICAgICogIEhvd2V2ZXIsIHdlIG5lZWQgdG8gYGxvY2snIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9wZXJhdGlvbiB0bwotICAgICAgICogIHByZXZlbnQgaXQgZnJvbSBiZWluZyBmbHVzaGVkIHdpdGhpbiB0aGUgbG9vcC4KKyAgICAgICAqIEhvd2V2ZXIsIHdlIG5lZWQgdG8gYGxvY2snIHRoZSBub2RlIGJlZm9yZSB0aGlzIG9wZXJhdGlvbiB0bworICAgICAgICogcHJldmVudCBpdCBmcm9tIGJlaW5nIGZsdXNoZWQgd2l0aGluIHRoZSBsb29wLgogICAgICAgICoKLSAgICAgICAqICBXaGVuIHdlIGV4aXQgdGhlIGxvb3AsIHdlIHVubG9jayB0aGUgbm9kZSwgdGhlbiBjaGVjayB0aGUgYGVycm9yJwotICAgICAgICogIHZhcmlhYmxlLiAgSWYgaXQgaXMgbm9uLXplcm8sIHRoaXMgbWVhbnMgdGhhdCB0aGUgY2FjaGUgd2FzCi0gICAgICAgKiAgY29tcGxldGVseSBmbHVzaGVkIGFuZCB0aGF0IG5vIHVzYWJsZSBtZW1vcnkgd2FzIGZvdW5kIHRvIGxvYWQKLSAgICAgICAqICB0aGUgYml0bWFwLgorICAgICAgICogV2hlbiB3ZSBleGl0IHRoZSBsb29wLCB3ZSB1bmxvY2sgdGhlIG5vZGUsIHRoZW4gY2hlY2sgdGhlIGBlcnJvcicKKyAgICAgICAqIHZhcmlhYmxlLiAgSWYgaXQgaXMgbm9uLXplcm8sIHRoaXMgbWVhbnMgdGhhdCB0aGUgY2FjaGUgd2FzCisgICAgICAgKiBjb21wbGV0ZWx5IGZsdXNoZWQgYW5kIHRoYXQgbm8gdXNhYmxlIG1lbW9yeSB3YXMgZm91bmQgdG8gbG9hZAorICAgICAgICogdGhlIGJpdG1hcC4KICAgICAgICAqCi0gICAgICAgKiAgV2UgdGhlbiBwcmVmZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgMCAoaS5lLiwgTk8gTUFUQ0gpLiAgVGhpcwotICAgICAgICogIGVuc3VyZXMgdGhhdCB0aGUgY2FsbGVyIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IG5vZGUuCi0gICAgICAgKiAgVGhpcyBvcGVyYXRpb24gY29uc2VxdWVudGx5IF9mYWlsXyBhbmQgdGhlIGxvb2t1cCBmdW5jdGlvbgotICAgICAgICogIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIE9PTSBlcnJvciBjb2RlLgorICAgICAgICogV2UgdGhlbiBwcmVmZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgMCAoaS5lLiwgTk8gTUFUQ0gpLiAgVGhpcworICAgICAgICogZW5zdXJlcyB0aGF0IHRoZSBjYWxsZXIgd2lsbCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgbm9kZS4KKyAgICAgICAqIFRoaXMgb3BlcmF0aW9uIGNvbnNlcXVlbnRseSBfZmFpbF8gYW5kIHRoZSBsb29rdXAgZnVuY3Rpb24KKyAgICAgICAqIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIE9PTSBlcnJvciBjb2RlLgogICAgICAgICoKLSAgICAgICAqICBOb3RlIHRoYXQgYGJ1ZmZlciA9PSBOVUxMICYmIHdpZHRoID09IDI1NScgaXMgYSBoYWNrIHVzZWQgdG8KLSAgICAgICAqICB0YWcgYHVuYXZhaWxhYmxlJyBiaXRtYXBzIGluIHRoZSBhcnJheS4gIFdlIHNob3VsZCBuZXZlciB0cnkKLSAgICAgICAqICB0byBsb2FkIHRoZXNlLgorICAgICAgICogTm90ZSB0aGF0IGBidWZmZXIgPT0gTlVMTCAmJiB3aWR0aCA9PSAyNTUnIGlzIGEgaGFjayB1c2VkIHRvCisgICAgICAgKiB0YWcgYHVuYXZhaWxhYmxlJyBiaXRtYXBzIGluIHRoZSBhcnJheS4gIFdlIHNob3VsZCBuZXZlciB0cnkKKyAgICAgICAqIHRvIGxvYWQgdGhlc2UuCiAgICAgICAgKgogICAgICAgICovCiAKZGlmZiAtLWdpdCBhL3NyYy9jYWNoZS9mdGNzYml0cy5oIGIvc3JjL2NhY2hlL2Z0Y3NiaXRzLmgKaW5kZXggMjA2YTFiYi4uNDZmNzk3ZSAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL2Z0Y3NiaXRzLmgKKysrIGIvc3JjL2NhY2hlL2Z0Y3NiaXRzLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y3NiaXRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBIHNtYWxsLWJpdG1hcCBjYWNoZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Y3NiaXRzLmgKKyAqCisgKiAgIEEgc21hbGwtYml0bWFwIGNhY2hlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRDU0JJVFNfSF8KICNkZWZpbmUgRlRDU0JJVFNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NBQ0hFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNhY2hlLmg+CiAjaW5jbHVkZSAiZnRjZ2x5cGguaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvY2FjaGUvcnVsZXMubWsgYi9zcmMvY2FjaGUvcnVsZXMubWsKaW5kZXggNTU4OTM1OS4uNDczOGI1MSAxMDA2NDQKLS0tIGEvc3JjL2NhY2hlL3J1bGVzLm1rCisrKyBiL3NyYy9jYWNoZS9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAwLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTUsNyArMTUsNyBAQAogCiAjIENhY2hlIGRyaXZlciBkaXJlY3RvcnkKICMKLUNBQ0hFX0RJUiAgIDo9ICQoU1JDX0RJUikvY2FjaGUKK0NBQ0hFX0RJUiA6PSAkKFNSQ19ESVIpL2NhY2hlCiAKIAogIyBjb21waWxhdGlvbiBmbGFncyBmb3IgdGhlIGRyaXZlcgpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9KYW1maWxlIGIvc3JjL2NmZi9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2M5MDRmLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvY2ZmIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBjZmYgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGNmZmNtYXAKLSAgICAgICAgICAgICAgIGNmZmRyaXZyCi0gICAgICAgICAgICAgICBjZmZnbG9hZAotICAgICAgICAgICAgICAgY2ZmbG9hZAotICAgICAgICAgICAgICAgY2Zmb2JqcwotICAgICAgICAgICAgICAgY2ZmcGFyc2UKLSAgICAgICAgICAgICAgIGNmZnBpYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gY2ZmIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL2NmZiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZi5jIGIvc3JjL2NmZi9jZmYuYwppbmRleCAxYTc1NWQ1Li4wZmE2Yzg3IDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZi5jCisrKyBiL3NyYy9jZmYvY2ZmLmMKQEAgLTEsMjkgKzEsMjcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZi5jCisgKgorICogICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgImNmZmNtYXAuYyIKICNpbmNsdWRlICJjZmZkcml2ci5jIgogI2luY2x1ZGUgImNmZmdsb2FkLmMiCiAjaW5jbHVkZSAiY2ZmcGFyc2UuYyIKLSNpbmNsdWRlICJjZmZwaWMuYyIKICNpbmNsdWRlICJjZmZsb2FkLmMiCiAjaW5jbHVkZSAiY2Zmb2Jqcy5jIgogCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmNtYXAuYyBiL3NyYy9jZmYvY2ZmY21hcC5jCmluZGV4IGU0NWFlMTEuLjZkMTZlZDQgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvY2ZmY21hcC5jCisrKyBiL3NyYy9jZmYvY2ZmY21hcC5jCkBAIC0xLDIzICsxLDIyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjZmZjbWFwLmMKKyAqCisgKiAgIENGRiBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSAoY21hcCkgc3VwcG9ydCAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAjaW5jbHVkZSAiY2ZmY21hcC5oIgogI2luY2x1ZGUgImNmZmxvYWQuaCIKIApAQCAtMTYxLDYgKzE2MCw5IEBACiAgICAgaWYgKCAhY2hhcnNldC0+c2lkcyApCiAgICAgICByZXR1cm4gRlRfVEhST1coIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApOwogCisgICAgaWYgKCAhcHNuYW1lcy0+dW5pY29kZXNfaW5pdCApCisgICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOworCiAgICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2luaXQoIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZi0+bnVtX2dseXBocywKZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmY21hcC5oIGIvc3JjL2NmZi9jZmZjbWFwLmgKaW5kZXggODU2YTQzZC4uNjlmYWI4ZCAxMDA2NDQKLS0tIGEvc3JjL2NmZi9jZmZjbWFwLmgKKysrIGIvc3JjL2NmZi9jZmZjbWFwLmgKQEAgLTEsMjUgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmNtYXAuaAorICoKKyAqICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQ0ZGQ01BUF9IXwogI2RlZmluZSBDRkZDTUFQX0hfCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9PQkpFQ1RTX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKQEAgLTQzLDcgKzQzLDcgQEAKICAgfSBDRkZfQ01hcFN0ZFJlYzsKIAogCi0gIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyhjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMpCisgIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjICkKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTYsNyArNTYsNyBAQAogCiAgIC8qIHVuaWNvZGUgKHN5bnRoZXRpYykgY21hcHMgKi8KIAotICBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMpCisgIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMgKQogCiAKIEZUX0VORF9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmZHJpdnIuYyBiL3NyYy9jZmYvY2ZmZHJpdnIuYwppbmRleCBkZjg5Njg0Li40ODZhYjI0IDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZmRyaXZyLmMKKysrIGIvc3JjL2NmZi9jZmZkcml2ci5jCkBAIC0xLDMzICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZkcml2ci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgZm9udCBkcml2ZXIgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjZmZkcml2ci5jCisgKgorICogICBPcGVuVHlwZSBmb250IGRyaXZlciBpbXBsZW1lbnRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfUFJPUFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DSURfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQ0ZGX1RBQkxFX0xPQURfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRwc3Byb3AuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNpbmZvLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaD4KIAogI2luY2x1ZGUgImNmZmRyaXZyLmgiCiAjaW5jbHVkZSAiY2ZmZ2xvYWQuaCIKQEAgLTM3LDI3ICszNiwyNiBAQAogI2luY2x1ZGUgImNmZm9ianMuaCIKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgImNmZmVycnMuaCIKLSNpbmNsdWRlICJjZmZwaWMuaCIKIAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmZHJpdmVyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2ZmZHJpdmVyCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTczLDM4ICs3MSw0MiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9nZXRfa2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBjZmZfZ2V0X2tlcm5pbmcKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28KKyAgICogICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgbGVmdF9nbHlwaCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuCisgICAqCisgICAqICAgcmlnaHRfZ2x5cGggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4KKyAgICoKKyAgICogQE91dHB1dDoKKyAgICogICBrZXJuaW5nIDo6CisgICAqICAgICBUaGUga2VybmluZyB2ZWN0b3IuICBUaGlzIGlzIGluIGZvbnQgdW5pdHMgZm9yCisgICAqICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcworICAgKiAgICAgZm9ybWF0cy4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZQorICAgKiAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkCisgICAqICAga2VybmluZ3MsIGFyZSBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBtZXRob2QgKHRoZSBiYXNpYyBkcml2ZXIKKyAgICogICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4KKyAgICoKKyAgICogICBUaGV5IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4KKyAgICovCiAgIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQogICBjZmZfZ2V0X2tlcm5pbmcoIEZUX0ZhY2UgICAgIHR0ZmFjZSwgICAgICAgICAgLyogVFRfRmFjZSAqLwogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCkBAIC0xMjUsMzIgKzEyNywzNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfZ2x5cGhfbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEXz8/PyBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2ZmX2dseXBoX2xvYWQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIGxvYWQgYSBnbHlwaCB3aXRoaW4gYSBnaXZlbiBnbHlwaCBzbG90LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgc2xvdCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzbG90IG9iamVjdCB3aGVyZSB0aGUgZ2x5cGgKKyAgICogICAgIHdpbGwgYmUgbG9hZGVkLgorICAgKgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBzaXplIGF0IHdoaWNoIHRoZSBnbHlwaAorICAgKiAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLgorICAgKgorICAgKiAgIGdseXBoX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuCisgICAqCisgICAqICAgbG9hZF9mbGFncyA6OgorICAgKiAgICAgQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlCisgICAqICAgICBGVF9MT0FEXz8/PyBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKKyAgICogICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZQorICAgKiAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LAorICAgKiAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKICAgY2ZmX2dseXBoX2xvYWQoIEZUX0dseXBoU2xvdCAgY2Zmc2xvdCwgICAgICAvKiBDRkZfR2x5cGhTbG90ICovCiAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIGNmZnNpemUsICAgICAgLyogQ0ZGX1NpemUgICAgICAqLwpAQCAtMzAyLDcgKzMwOCw3IEBACiAKIAogICAvKgotICAgKiAgR0xZUEggRElDVCBTRVJWSUNFCisgICAqIEdMWVBIIERJQ1QgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMzQxLDcgKzM0Nyw3IEBACiAgICAgICAgIEZUX0VSUk9SKCggImNmZl9nZXRfZ2x5cGhfbmFtZToiCiAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIG5hbWUgZnJvbSBhIENGRjIgZm9udFxuIgogICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKKyAgICAgICAgICAgICAgICAgICAiIHdpdGhvdXQgdGhlIGBwc25hbWVzJyBtb2R1bGVcbiIgKSk7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KQEAgLTM1Miw3ICszNTgsNyBAQAogICAgICAgRlRfRVJST1IoKCAiY2ZmX2dldF9nbHlwaF9uYW1lOiIKICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIG5hbWUgZnJvbSBDRkYgJiBDRUYgZm9udHNcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKKyAgICAgICAgICAgICAgICAgIiB3aXRob3V0IHRoZSBgcHNuYW1lcycgbW9kdWxlXG4iICkpOwogICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC0zNzQsOCArMzgwLDggQEAKIAogCiAgIHN0YXRpYyBGVF9VSW50Ci0gIGNmZl9nZXRfbmFtZV9pbmRleCggQ0ZGX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKKyAgY2ZmX2dldF9uYW1lX2luZGV4KCBDRkZfRmFjZSAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGdseXBoX25hbWUgKQogICB7CiAgICAgQ0ZGX0ZvbnQgICAgICAgICAgICBjZmY7CiAgICAgQ0ZGX0NoYXJzZXQgICAgICAgICBjaGFyc2V0OwpAQCAtNDA4LDcgKzQxNCw3IEBACiAgICAgICAgIEZUX0VSUk9SKCggImNmZl9nZXRfbmFtZV9pbmRleDoiCiAgICAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIGluZGV4IGZyb20gYSBDRkYyIGZvbnRcbiIKICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIHdpdGhvdXQgdGhlIGBQU05hbWVzJyBtb2R1bGVcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgIiB3aXRob3V0IHRoZSBgcHNuYW1lcycgbW9kdWxlXG4iICkpOwogICAgICAgICByZXR1cm4gMDsKICAgICAgIH0KICAgICB9CkBAIC00NDYsNyArNDUyLDcgQEAKIAogCiAgIC8qCi0gICAqICBQT1NUU0NSSVBUIElORk8gU0VSVklDRQorICAgKiBQT1NUU0NSSVBUIElORk8gU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtNTkzLDcgKzU5OSw3IEBACiAKIAogICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKKyAgICogUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTY1NCw4ICs2NjAsOCBAQAogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKTsKIAogCi0gICAgaWYgKCBjbWFwLT5jbGF6eiAhPSAmQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVCAmJgotICAgICAgICAgY21hcC0+Y2xhenogIT0gJkNGRl9DTUFQX1VOSUNPREVfQ0xBU1NfUkVDX0dFVCAgKQorICAgIGlmICggY21hcC0+Y2xhenogIT0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYyAmJgorICAgICAgICAgY21hcC0+Y2xhenogIT0gJmNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjICApCiAgICAgewogICAgICAgRlRfTW9kdWxlICAgICAgICAgICBzZm50ICAgID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7CiAgICAgICBGVF9TZXJ2aWNlX1RUQ01hcHMgIHNlcnZpY2UgPQpAQCAtNjgyLDcgKzY4OCw3IEBACiAKIAogICAvKgotICAgKiAgQ0lEIElORk8gU0VSVklDRQorICAgKiBDSUQgSU5GTyBTRVJWSUNFCiAgICAqCiAgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKQEAgLTczMSw3ICs3MzcsNyBAQAogICAgICAgewogICAgICAgICBpZiAoIGRpY3QtPmNpZF9zdXBwbGVtZW50IDwgRlRfSU5UX01JTiB8fAogICAgICAgICAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ID4gRlRfSU5UX01BWCApCi0gICAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9nZXRfcm9zOiB0b28gbGFyZ2Ugc3VwcGxlbWVudCAlZCBpcyB0cnVuY2F0ZWRcbiIsCisgICAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9nZXRfcm9zOiB0b28gbGFyZ2Ugc3VwcGxlbWVudCAlbGQgaXMgdHJ1bmNhdGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ICkpOwogICAgICAgICAqc3VwcGxlbWVudCA9IChGVF9JbnQpZGljdC0+Y2lkX3N1cHBsZW1lbnQ7CiAgICAgICB9CkBAIC03ODgsNyArNzk0LDcgQEAKICAgICAgICAgZ290byBGYWlsOwogICAgICAgfQogCi0gICAgICBpZiAoIGdseXBoX2luZGV4ID4gY2ZmLT5udW1fZ2x5cGhzICkKKyAgICAgIGlmICggZ2x5cGhfaW5kZXggPj0gY2ZmLT5udW1fZ2x5cGhzICkKICAgICAgIHsKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogICAgICAgICBnb3RvIEZhaWw7CkBAIC04MTgsNyArODI0LDcgQEAKIAogCiAgIC8qCi0gICAqICBQUk9QRVJUWSBTRVJWSUNFCisgICAqIFBST1BFUlRZIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTgzMiw3ICs4MzgsNyBAQAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKIAogICAvKgotICAgKiAgTVVMVElQTEUgTUFTVEVSIFNFUlZJQ0UKKyAgICogTVVMVElQTEUgTUFTVEVSIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTg2MSw2ICs4NjcsMzAgQEAKIAogCiAgIHN0YXRpYyBGVF9FcnJvcgorICBjZmZfc2V0X21tX3dlaWdodHZlY3RvciggQ0ZGX0ZhY2UgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHdlaWdodHZlY3RvciApCisgIHsKKyAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgbW0gPSAoRlRfU2VydmljZV9NdWx0aU1hc3RlcnMpZmFjZS0+bW07CisKKworICAgIHJldHVybiBtbS0+c2V0X21tX3dlaWdodHZlY3RvciggRlRfRkFDRSggZmFjZSApLCBsZW4sIHdlaWdodHZlY3RvciApOworICB9CisKKworICBzdGF0aWMgRlRfRXJyb3IKKyAgY2ZmX2dldF9tbV93ZWlnaHR2ZWN0b3IoIENGRl9GYWNlICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB3ZWlnaHR2ZWN0b3IgKQorICB7CisgICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIG1tID0gKEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzKWZhY2UtPm1tOworCisKKyAgICByZXR1cm4gbW0tPmdldF9tbV93ZWlnaHR2ZWN0b3IoIEZUX0ZBQ0UoIGZhY2UgKSwgbGVuLCB3ZWlnaHR2ZWN0b3IgKTsKKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCiAgIGNmZl9nZXRfbW1fdmFyKCBDRkZfRmFjZSAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKQogICB7CkBAIC05MDksMjIgKzkzOSwyNCBAQAogICBGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMoCiAgICAgY2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVycywKIAotICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgIC8qIGdldF9tbSAgICAgICAgICovCi0gICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogc2V0X21tX2Rlc2lnbiAgKi8KLSAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICBjZmZfc2V0X21tX2JsZW5kLCAgICAgICAvKiBzZXRfbW1fYmxlbmQgICAqLwotICAgIChGVF9HZXRfTU1fQmxlbmRfRnVuYykgIGNmZl9nZXRfbW1fYmxlbmQsICAgICAgIC8qIGdldF9tbV9ibGVuZCAgICovCi0gICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgY2ZmX2dldF9tbV92YXIsICAgICAgICAgLyogZ2V0X21tX3ZhciAgICAgKi8KLSAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYyljZmZfc2V0X3Zhcl9kZXNpZ24sICAgICAvKiBzZXRfdmFyX2Rlc2lnbiAqLwotICAgIChGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKWNmZl9nZXRfdmFyX2Rlc2lnbiwgICAgIC8qIGdldF92YXJfZGVzaWduICovCi0gICAgKEZUX1NldF9JbnN0YW5jZV9GdW5jKSAgY2ZmX3NldF9pbnN0YW5jZSwgICAgICAgLyogc2V0X2luc3RhbmNlICAgKi8KKyAgICAoRlRfR2V0X01NX0Z1bmMpICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAvKiBnZXRfbW0gICAgICAgICAgICAgICovCisgICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgLyogc2V0X21tX2Rlc2lnbiAgICAgICAqLworICAgIChGVF9TZXRfTU1fQmxlbmRfRnVuYykgICAgICAgY2ZmX3NldF9tbV9ibGVuZCwgICAgICAgIC8qIHNldF9tbV9ibGVuZCAgICAgICAgKi8KKyAgICAoRlRfR2V0X01NX0JsZW5kX0Z1bmMpICAgICAgIGNmZl9nZXRfbW1fYmxlbmQsICAgICAgICAvKiBnZXRfbW1fYmxlbmQgICAgICAgICovCisgICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgICAgICBjZmZfZ2V0X21tX3ZhciwgICAgICAgICAgLyogZ2V0X21tX3ZhciAgICAgICAgICAqLworICAgIChGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKSAgICAgY2ZmX3NldF92YXJfZGVzaWduLCAgICAgIC8qIHNldF92YXJfZGVzaWduICAgICAgKi8KKyAgICAoRlRfR2V0X1Zhcl9EZXNpZ25fRnVuYykgICAgIGNmZl9nZXRfdmFyX2Rlc2lnbiwgICAgICAvKiBnZXRfdmFyX2Rlc2lnbiAgICAgICovCisgICAgKEZUX1NldF9JbnN0YW5jZV9GdW5jKSAgICAgICBjZmZfc2V0X2luc3RhbmNlLCAgICAgICAgLyogc2V0X2luc3RhbmNlICAgICAgICAqLworICAgIChGVF9TZXRfTU1fV2VpZ2h0VmVjdG9yX0Z1bmMpY2ZmX3NldF9tbV93ZWlnaHR2ZWN0b3IsIC8qIHNldF9tbV93ZWlnaHR2ZWN0b3IgKi8KKyAgICAoRlRfR2V0X01NX1dlaWdodFZlY3Rvcl9GdW5jKWNmZl9nZXRfbW1fd2VpZ2h0dmVjdG9yLCAvKiBnZXRfbW1fd2VpZ2h0dmVjdG9yICovCiAKLSAgICAoRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKSBjZmZfZ2V0X3Zhcl9ibGVuZCwgICAgICAvKiBnZXRfdmFyX2JsZW5kICAqLwotICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgIGNmZl9kb25lX2JsZW5kICAgICAgICAgIC8qIGRvbmVfYmxlbmQgICAgICovCisgICAgKEZUX0dldF9WYXJfQmxlbmRfRnVuYykgICAgICBjZmZfZ2V0X3Zhcl9ibGVuZCwgICAgICAgLyogZ2V0X3Zhcl9ibGVuZCAgICAgICAqLworICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgICAgICAgY2ZmX2RvbmVfYmxlbmQgICAgICAgICAgIC8qIGRvbmVfYmxlbmQgICAgICAgICAgKi8KICAgKQogCiAKICAgLyoKLSAgICogIE1FVFJJQ1MgVkFSSUFUSU9OUyBTRVJWSUNFCisgICAqIE1FVFJJQ1MgVkFSSUFUSU9OUyBTRVJWSUNFCiAgICAqCiAgICAqLwogCkBAIC05NjgsNyArMTAwMCw3IEBACiAKIAogICAvKgotICAgKiAgQ0ZGTE9BRCBTRVJWSUNFCisgICAqIENGRkxPQUQgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMTAwMSw1NCArMTAzMyw1NCBAQAogICAgIGNmZl9zZXJ2aWNlcywKIAogICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKLSAgICBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMsICAgICAgICAmQ0ZGX1NFUlZJQ0VfTVVMVElfTUFTVEVSU19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9NRVRSSUNTX1ZBUklBVElPTlMsICAgJkNGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZDRkZfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfR0VUX0NNQVBfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0NJRF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMsICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9DRkZfTE9BRCwgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0NGRl9MT0FEX0dFVAorICAgIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAgICAgICZjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzLAorICAgIEZUX1NFUlZJQ0VfSURfTUVUUklDU19WQVJJQVRJT05TLCAgICZjZmZfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnMsCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJmNmZl9zZXJ2aWNlX3BzX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJmNmZl9zZXJ2aWNlX3BzX25hbWUsCisgICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2dseXBoX2RpY3QsCisgICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2NpZF9pbmZvLAorICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZjZmZfc2VydmljZV9wcm9wZXJ0aWVzLAorICAgIEZUX1NFUlZJQ0VfSURfQ0ZGX0xPQUQsICAgICAgICAgICAgICZjZmZfc2VydmljZV9jZmZfbG9hZAogICApCiAjZWxpZiAhZGVmaW5lZCBGVF9DT05GSUdfT1BUSU9OX05PX0dMWVBIX05BTUVTCiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzgoCiAgICAgY2ZmX3NlcnZpY2VzLAogCiAgICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgICAgICAgRlRfRk9OVF9GT1JNQVRfQ0ZGLAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZDRkZfU0VSVklDRV9QU19JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmQ0ZGX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJkNGRl9TRVJWSUNFX0dMWVBIX0RJQ1RfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0NGRl9MT0FELCAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfQ0ZGX0xPQURfR0VUCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJmNmZl9zZXJ2aWNlX3BzX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJmNmZl9zZXJ2aWNlX3BzX25hbWUsCisgICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2dseXBoX2RpY3QsCisgICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2NpZF9pbmZvLAorICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZjZmZfc2VydmljZV9wcm9wZXJ0aWVzLAorICAgIEZUX1NFUlZJQ0VfSURfQ0ZGX0xPQUQsICAgICAgICAgICAgICZjZmZfc2VydmljZV9jZmZfbG9hZAogICApCiAjZWxpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDOSgKICAgICBjZmZfc2VydmljZXMsCiAKICAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9DRkYsCi0gICAgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTLCAgICAgICAgJkNGRl9TRVJWSUNFX01VTFRJX01BU1RFUlNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfTUVUUklDU19WQVJJQVRJT05TLCAgICZDRkZfU0VSVklDRV9NRVRSSUNTX1ZBUl9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJkNGRl9TRVJWSUNFX1BTX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZDRkZfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfR0VUX0NNQVBfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9DSUQsICAgICAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0NJRF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMsICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9DRkZfTE9BRCwgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0NGRl9MT0FEX0dFVAorICAgIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAgICAgICZjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzLAorICAgIEZUX1NFUlZJQ0VfSURfTUVUUklDU19WQVJJQVRJT05TLCAgICZjZmZfc2VydmljZV9tZXRyaWNzX3ZhciwKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmY2ZmX3NlcnZpY2VfcHNfaW5mbywKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmY2ZmX3NlcnZpY2VfcHNfbmFtZSwKKyAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbywKKyAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmY2ZmX3NlcnZpY2VfY2lkX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJmNmZl9zZXJ2aWNlX3Byb3BlcnRpZXMsCisgICAgRlRfU0VSVklDRV9JRF9DRkZfTE9BRCwgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2NmZl9sb2FkCiAgICkKICNlbHNlCiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzcoCiAgICAgY2ZmX3NlcnZpY2VzLAogCiAgICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgICAgICAgRlRfRk9OVF9GT1JNQVRfQ0ZGLAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9JTkZPLCAgICAgICZDRkZfU0VSVklDRV9QU19JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmQ0ZGX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQ0lELCAgICAgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9DSURfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJkNGRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQ0ZGX0xPQUQsICAgICAgICAgICAgICZDRkZfU0VSVklDRV9DRkZfTE9BRF9HRVQKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmY2ZmX3NlcnZpY2VfcHNfaW5mbywKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmY2ZmX3NlcnZpY2VfcHNfbmFtZSwKKyAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbywKKyAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmY2ZmX3NlcnZpY2VfY2lkX2luZm8sCisgICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJmNmZl9zZXJ2aWNlX3Byb3BlcnRpZXMsCisgICAgRlRfU0VSVklDRV9JRF9DRkZfTE9BRCwgICAgICAgICAgICAgJmNmZl9zZXJ2aWNlX2NmZl9sb2FkCiAgICkKICNlbmRpZgogCkBAIC0xMDYyLDI3ICsxMDk0LDE2IEBACiAgICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgcmVzdWx0OwogCiAKLSAgICAvKiBDRkZfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIGlmICggIWRyaXZlciApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotICAgIHJlc3VsdCA9IGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIENGRl9TRVJWSUNFU19HRVQsIG1vZHVsZV9pbnRlcmZhY2UgKTsKKyAgICByZXN1bHQgPSBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBjZmZfc2VydmljZXMsIG1vZHVsZV9pbnRlcmZhY2UgKTsKICAgICBpZiAoIHJlc3VsdCApCiAgICAgICByZXR1cm4gcmVzdWx0OwogCi0gICAgLyogYGRyaXZlcicgaXMgbm90IHlldCBldmFsdWF0ZWQgaW4gbm9uLVBJQyBtb2RlICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCisgICAgLyogYGRyaXZlcicgaXMgbm90IHlldCBldmFsdWF0ZWQgKi8KICAgICBpZiAoICFkcml2ZXIgKQogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKICAgICBpZiAoICFsaWJyYXJ5ICkKICAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCiAKICAgICAvKiB3ZSBwYXNzIG91ciByZXF1ZXN0IHRvIHRoZSBgc2ZudCcgbW9kdWxlICovCiAgICAgc2ZudCA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZkcml2ci5oIGIvc3JjL2NmZi9jZmZkcml2ci5oCmluZGV4IGFkN2MzYWQuLmQxOThkZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvY2ZmZHJpdnIuaAorKysgYi9zcmMvY2ZmL2NmZmRyaXZyLmgKQEAgLTEsMzUgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRyaXZyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIE9wZW5UeXBlIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmRyaXZyLmgKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgT3BlblR5cGUgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRkRSSVZFUl9IXwogI2RlZmluZSBDRkZEUklWRVJfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotCiAgIEZUX0RFQ0xBUkVfRFJJVkVSKCBjZmZfZHJpdmVyX2NsYXNzICkKIAotCiBGVF9FTkRfSEVBREVSCiAKICNlbmRpZiAvKiBDRkZEUklWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmZXJycy5oIGIvc3JjL2NmZi9jZmZlcnJzLmgKaW5kZXggYjJlMWJmYS4uNWIwMGEzZiAxMDA2NDQKLS0tIGEvc3JjL2NmZi9jZmZlcnJzLmgKKysrIGIvc3JjL2NmZi9jZmZlcnJzLmgKQEAgLTEsMzEgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmVycnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmVycnMuaAorICoKKyAqICAgQ0ZGIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgQ0ZGIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIENGRiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIENGRkVSUlNfSF8KICNkZWZpbmUgQ0ZGRVJSU19IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0NGRgogCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogI2VuZGlmIC8qIENGRkVSUlNfSF8gKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZnbG9hZC5jIGIvc3JjL2NmZi9jZmZnbG9hZC5jCmluZGV4IGM1ODQ3MWMuLmZlZWUzOGEgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvY2ZmZ2xvYWQuYworKysgYi9zcmMvY2ZmL2NmZmdsb2FkLmMKQEAgLTEsMjkgKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmdsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmdsb2FkLmMKKyAqCisgKiAgIE9wZW5UeXBlIEdseXBoIExvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgogCiAjaW5jbHVkZSAiY2ZmbG9hZC5oIgogI2luY2x1ZGUgImNmZmdsb2FkLmgiCkBAIC0zMSwxNCArMzAsMTQgQEAKICNpbmNsdWRlICJjZmZlcnJzLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmZ2xvYWQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjZmZnbG9hZAogCiAKICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCkBAIC0yMDcsOCArMjA2LDggQEAKICAgICBQU0F1eF9TZXJ2aWNlICAgICAgICAgICAgcHNhdXggICAgICAgICA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwogICAgIGNvbnN0IENGRl9EZWNvZGVyX0Z1bmNzICBkZWNvZGVyX2Z1bmNzID0gcHNhdXgtPmNmZl9kZWNvZGVyX2Z1bmNzOwogCi0gICAgRlRfTWF0cml4ICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICBmb250X29mZnNldDsKKyAgICBGVF9NYXRyaXggIGZvbnRfbWF0cml4OworICAgIEZUX1ZlY3RvciAgZm9udF9vZmZzZXQ7CiAKIAogICAgIGZvcmNlX3NjYWxpbmcgPSBGQUxTRTsKQEAgLTI4MCwxNiArMjc5LDE2IEBACiAgICAgICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5uX3BvaW50cyAgID0gMDsKICAgICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fY29udG91cnMgPSAwOwogCi0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy53aWR0aCAgPSAoRlRfUG9zKW1ldHJpY3Mud2lkdGggIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5oZWlnaHQgPSAoRlRfUG9zKW1ldHJpY3MuaGVpZ2h0IDw8IDY7CisgICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy53aWR0aCAgPSAoRlRfUG9zKW1ldHJpY3Mud2lkdGggICogNjQ7CisgICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5oZWlnaHQgPSAoRlRfUG9zKW1ldHJpY3MuaGVpZ2h0ICogNjQ7CiAKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1ggPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWSA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1kgPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQWR2YW5jZSAgPDwgNjsKKyAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1ggKiA2NDsKKyAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWSA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1kgKiA2NDsKKyAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQWR2YW5jZSAgKiA2NDsKIAotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWCA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWSA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLnZlcnRBZHZhbmNlICA8PCA2OworICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWCAqIDY0OworICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWSAqIDY0OworICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLnZlcnRBZHZhbmNlICAqIDY0OwogCiAgICAgICAgICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKIApAQCAtMzY0LDcgKzM2Myw2IEBACiAgICAgICB0b3BfdXBtID0gKEZUX0xvbmcpY2ZmLT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwogICAgICAgc3ViX3VwbSA9IChGVF9Mb25nKWNmZi0+c3ViZm9udHNbZmRfaW5kZXhdLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwogCi0KICAgICAgIGZvbnRfbWF0cml4ID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC5mb250X21hdHJpeDsKICAgICAgIGZvbnRfb2Zmc2V0ID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC5mb250X29mZnNldDsKIApAQCAtMzk5LDcgKzM5Nyw2IEBACiAgICAgICBQU19Ecml2ZXIgIGRyaXZlciA9IChQU19Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKICNlbmRpZgogCi0KICAgICAgIEZUX0J5dGUqICBjaGFyc3RyaW5nOwogICAgICAgRlRfVUxvbmcgIGNoYXJzdHJpbmdfbGVuOwogCkBAIC00MTQsNyArNDExLDcgQEAKICAgICAgICAgZGVjb2Rlci53aWR0aF9vbmx5ID0gVFJVRTsKIAogICAgICAgZGVjb2Rlci5idWlsZGVyLm5vX3JlY3Vyc2UgPQotICAgICAgICAoRlRfQm9vbCkoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKTsKKyAgICAgICAgRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApOwogCiAgICAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLwogICAgICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGZhY2UsIGdseXBoX2luZGV4LApAQCAtNjY1LDggKzY2MiwxMiBAQAogICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPSBjYm94LnlNYXg7CiAKICAgICAgICAgaWYgKCBoYXNfdmVydGljYWxfaW5mbyApCisgICAgICAgIHsKICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgLyAyOworICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEJlYXJpbmdZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPnlfc2NhbGUgKTsKKyAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZmdsb2FkLmggYi9zcmMvY2ZmL2NmZmdsb2FkLmgKaW5kZXggODAzZjM5Ny4uM2IzMTJmNCAxMDA2NDQKLS0tIGEvc3JjL2NmZi9jZmZnbG9hZC5oCisrKyBiL3NyYy9jZmYvY2ZmZ2xvYWQuaApAQCAtMSwyOCArMSwyNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmZ2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdseXBoIExvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2ZmZ2xvYWQuaAorICoKKyAqICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQ0ZGR0xPQURfSF8KICNkZWZpbmUgQ0ZGR0xPQURfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9PQkpFQ1RTX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZsb2FkLmMgYi9zcmMvY2ZmL2NmZmxvYWQuYwppbmRleCAxYzZmZTUxLi43M2QzZWVjIDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZmxvYWQuYworKysgYi9zcmMvY2ZmL2NmZmxvYWQuYwpAQCAtMSwzMiArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIGFuZCBDRkYgZGF0YS9wcm9ncmFtIHRhYmxlcyBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2ZmbG9hZC5jCisgKgorICogICBPcGVuVHlwZSBhbmQgQ0ZGIGRhdGEvcHJvZ3JhbSB0YWJsZXMgbG9hZGVyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3QxdGFibGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJjZmZsb2FkLmgiCkBAIC0xOTYsMTQgKzE5NSwxNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmbG9hZAorI2RlZmluZSBGVF9DT01QT05FTlQgIGNmZmxvYWQKIAogCiAgIC8qIHJlYWQgYW4gb2Zmc2V0IGZyb20gdGhlIGluZGV4J3Mgc3RyZWFtIGN1cnJlbnQgcG9zaXRpb24gKi8KQEAgLTQxMSw3ICs0MTAsNyBAQAogICAgIEZUX0Vycm9yICAgZXJyb3IgICAgID0gRlRfRXJyX09rOwogICAgIEZUX01lbW9yeSAgbWVtb3J5ICAgID0gaWR4LT5zdHJlYW0tPm1lbW9yeTsKIAotICAgIEZUX0J5dGUqKiAgdCAgICAgICAgID0gTlVMTDsKKyAgICBGVF9CeXRlKiogIHRibCAgICAgICA9IE5VTEw7CiAgICAgRlRfQnl0ZSogICBuZXdfYnl0ZXMgPSBOVUxMOwogICAgIEZUX1VMb25nICAgbmV3X3NpemU7CiAKQEAgLTQyOCwxMSArNDI3LDExIEBACiAgICAgbmV3X3NpemUgPSBpZHgtPmRhdGFfc2l6ZSArIGlkeC0+Y291bnQ7CiAKICAgICBpZiAoIGlkeC0+Y291bnQgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIUZUX05FV19BUlJBWSggdCwgaWR4LT5jb3VudCArIDEgKSAgICAgICAgICAgICYmCisgICAgICAgICAhRlRfTkVXX0FSUkFZKCB0YmwsIGlkeC0+Y291bnQgKyAxICkgICAgICAgICAgJiYKICAgICAgICAgICggIXBvb2wgfHwgIUZUX0FMTE9DKCBuZXdfYnl0ZXMsIG5ld19zaXplICkgKSApCiAgICAgewogICAgICAgRlRfVUxvbmcgIG4sIGN1cl9vZmZzZXQ7Ci0gICAgICBGVF9VTG9uZyAgZXh0cmEgPSAwOworICAgICAgRlRfVUxvbmcgIGV4dHJhICAgICA9IDA7CiAgICAgICBGVF9CeXRlKiAgb3JnX2J5dGVzID0gaWR4LT5ieXRlczsKIAogCkBAIC00NDMsMTUgKzQ0MiwxNSBAQAogICAgICAgaWYgKCBjdXJfb2Zmc2V0ICE9IDAgKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTAoKCAiY2ZmX2luZGV4X2dldF9wb2ludGVyczoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBmaXJzdCBvZmZzZXQgdmFsdWUgJWQgc2V0IHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBmaXJzdCBvZmZzZXQgdmFsdWUgJWxkIHNldCB0byB6ZXJvXG4iLAogICAgICAgICAgICAgICAgICAgICBjdXJfb2Zmc2V0ICkpOwogICAgICAgICBjdXJfb2Zmc2V0ID0gMDsKICAgICAgIH0KIAogICAgICAgaWYgKCAhcG9vbCApCi0gICAgICAgIHRbMF0gPSBvcmdfYnl0ZXMgKyBjdXJfb2Zmc2V0OworICAgICAgICB0YmxbMF0gPSBvcmdfYnl0ZXMgKyBjdXJfb2Zmc2V0OwogICAgICAgZWxzZQotICAgICAgICB0WzBdID0gbmV3X2J5dGVzICsgY3VyX29mZnNldDsKKyAgICAgICAgdGJsWzBdID0gbmV3X2J5dGVzICsgY3VyX29mZnNldDsKIAogICAgICAgZm9yICggbiA9IDE7IG4gPD0gaWR4LT5jb3VudDsgbisrICkKICAgICAgIHsKQEAgLTQ2NSwyMyArNDY0LDI1IEBACiAgICAgICAgICAgbmV4dF9vZmZzZXQgPSBpZHgtPmRhdGFfc2l6ZTsKIAogICAgICAgICBpZiAoICFwb29sICkKLSAgICAgICAgICB0W25dID0gb3JnX2J5dGVzICsgbmV4dF9vZmZzZXQ7CisgICAgICAgICAgdGJsW25dID0gb3JnX2J5dGVzICsgbmV4dF9vZmZzZXQ7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIHRbbl0gPSBuZXdfYnl0ZXMgKyBuZXh0X29mZnNldCArIGV4dHJhOworICAgICAgICAgIHRibFtuXSA9IG5ld19ieXRlcyArIG5leHRfb2Zmc2V0ICsgZXh0cmE7CiAKICAgICAgICAgICBpZiAoIG5leHRfb2Zmc2V0ICE9IGN1cl9vZmZzZXQgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX01FTV9DT1BZKCB0W24gLSAxXSwgb3JnX2J5dGVzICsgY3VyX29mZnNldCwgdFtuXSAtIHRbbiAtIDFdICk7Ci0gICAgICAgICAgICB0W25dWzBdID0gJ1wwJzsKLSAgICAgICAgICAgIHRbbl0gICArPSAxOworICAgICAgICAgICAgRlRfTUVNX0NPUFkoIHRibFtuIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3JnX2J5dGVzICsgY3VyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0Ymxbbl0gLSB0YmxbbiAtIDFdICk7CisgICAgICAgICAgICB0Ymxbbl1bMF0gPSAnXDAnOworICAgICAgICAgICAgdGJsW25dICAgKz0gMTsKICAgICAgICAgICAgIGV4dHJhKys7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgY3VyX29mZnNldCA9IG5leHRfb2Zmc2V0OwogICAgICAgfQotICAgICAgKnRhYmxlID0gdDsKKyAgICAgICp0YWJsZSA9IHRibDsKIAogICAgICAgaWYgKCBwb29sICkKICAgICAgICAgKnBvb2wgPSBuZXdfYnl0ZXM7CkBAIC00OTAsNiArNDkxLDExIEBACiAgICAgfQogCiAgIEV4aXQ6CisgICAgaWYgKCBlcnJvciAmJiBuZXdfYnl0ZXMgKQorICAgICAgRlRfRlJFRSggbmV3X2J5dGVzICk7CisgICAgaWYgKCBlcnJvciAmJiB0YmwgKQorICAgICAgRlRfRlJFRSggdGJsICk7CisKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KIApAQCAtNTUzLDggKzU1OSw4IEBACiAgICAgICAgICAgIGlkeC0+ZGF0YV9vZmZzZXQgPiBzdHJlYW0tPnNpemUgLSBvZmYyICsgMSApCiAgICAgICB7CiAgICAgICAgIEZUX0VSUk9SKCggImNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudDoiCi0gICAgICAgICAgICAgICAgICAgIiBvZmZzZXQgdG8gbmV4dCBlbnRyeSAoJWQpIgotICAgICAgICAgICAgICAgICAgICIgZXhjZWVkcyB0aGUgZW5kIG9mIHN0cmVhbSAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICIgb2Zmc2V0IHRvIG5leHQgZW50cnkgKCVsZCkiCisgICAgICAgICAgICAgICAgICAgIiBleGNlZWRzIHRoZSBlbmQgb2Ygc3RyZWFtICglbGQpXG4iLAogICAgICAgICAgICAgICAgICAgIG9mZjIsIHN0cmVhbS0+c2l6ZSAtIGlkeC0+ZGF0YV9vZmZzZXQgKyAxICkpOwogICAgICAgICBvZmYyID0gc3RyZWFtLT5zaXplIC0gaWR4LT5kYXRhX29mZnNldCArIDE7CiAgICAgICB9CkBAIC05NzgsNyArOTg0LDcgQEAKICAgICAgICAgICAgIGlmICggZ2x5cGhfc2lkID4gMHhGRkZGTCAtIG5sZWZ0ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW52YWxpZCBTSUQgcmFuZ2UgdHJpbW1lZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIG5sZWZ0PSVkIC0+ICVkXG4iLCBubGVmdCwgMHhGRkZGTCAtIGdseXBoX3NpZCApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIG5sZWZ0PSVkIC0+ICVsZFxuIiwgbmxlZnQsIDB4RkZGRkwgLSBnbHlwaF9zaWQgKSk7CiAgICAgICAgICAgICAgIG5sZWZ0ID0gKCBGVF9VSW50ICkoIDB4RkZGRkwgLSBnbHlwaF9zaWQgKTsKICAgICAgICAgICAgIH0KIApAQCAtMTM5OCw3ICsxNDA0LDE0IEBACiAgICAgRlRfVUludCAgICAgICBtYXN0ZXI7CiAKIAotICAgIEZUX0FTU0VSVCggbGVuTkRWID09IDAgfHwgTkRWICk7CisgICAgLyogcHJvdGVjdCBhZ2FpbnN0IG1hbGZvcm1lZCBmb250cyAqLworICAgIGlmICggISggbGVuTkRWID09IDAgfHwgTkRWICkgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNCgoICIgY2ZmX2JsZW5kX2J1aWxkX3ZlY3RvcjoiCisgICAgICAgICAgICAgICAgICAiIE1hbGZvcm1lZCBOb3JtYWxpemUgRGVzaWduIFZlY3RvciBkYXRhXG4iICkpOworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGJsZW5kLT5idWlsdEJWID0gRkFMU0U7CiAKQEAgLTE5MzgsNyArMTk1MSw3IEBACiAgICAgaWYgKCBwcml2LT5ibHVlX3NoaWZ0ID4gMTAwMCB8fCBwcml2LT5ibHVlX3NoaWZ0IDwgMCApCiAgICAgewogICAgICAgRlRfVFJBQ0UyKCggImNmZl9sb2FkX3ByaXZhdGVfZGljdDoiCi0gICAgICAgICAgICAgICAgICAiIHNldHRpbmcgdW5saWtlbHkgQmx1ZVNoaWZ0IHZhbHVlICVkIHRvIGRlZmF1bHQgKDcpXG4iLAorICAgICAgICAgICAgICAgICAgIiBzZXR0aW5nIHVubGlrZWx5IEJsdWVTaGlmdCB2YWx1ZSAlbGQgdG8gZGVmYXVsdCAoNylcbiIsCiAgICAgICAgICAgICAgICAgICBwcml2LT5ibHVlX3NoaWZ0ICkpOwogICAgICAgcHJpdi0+Ymx1ZV9zaGlmdCA9IDc7CiAgICAgfQpAQCAtMTk0Niw3ICsxOTU5LDcgQEAKICAgICBpZiAoIHByaXYtPmJsdWVfZnV6eiA+IDEwMDAgfHwgcHJpdi0+Ymx1ZV9mdXp6IDwgMCApCiAgICAgewogICAgICAgRlRfVFJBQ0UyKCggImNmZl9sb2FkX3ByaXZhdGVfZGljdDoiCi0gICAgICAgICAgICAgICAgICAiIHNldHRpbmcgdW5saWtlbHkgQmx1ZUZ1enogdmFsdWUgJWQgdG8gZGVmYXVsdCAoMSlcbiIsCisgICAgICAgICAgICAgICAgICAiIHNldHRpbmcgdW5saWtlbHkgQmx1ZUZ1enogdmFsdWUgJWxkIHRvIGRlZmF1bHQgKDEpXG4iLAogICAgICAgICAgICAgICAgICAgcHJpdi0+Ymx1ZV9mdXp6ICkpOwogICAgICAgcHJpdi0+Ymx1ZV9mdXp6ID0gMTsKICAgICB9CkBAIC0yMDUwLDcgKzIwNjMsNyBAQAogICAgIGlmICggIWVycm9yICkKICAgICB7CiAgICAgICBGVF9UUkFDRTQoKCAiIHRvcCBkaWN0aW9uYXJ5OlxuIiApKTsKLSAgICAgIGVycm9yID0gY2ZmX3BhcnNlcl9ydW4oICZwYXJzZXIsIGRpY3QsIGRpY3QgKyBkaWN0X2xlbiApOworICAgICAgZXJyb3IgPSBjZmZfcGFyc2VyX3J1biggJnBhcnNlciwgZGljdCwgRlRfT0ZGU0VUKCBkaWN0LCBkaWN0X2xlbiApICk7CiAgICAgfQogCiAgICAgLyogY2xlYW4gdXAgcmVnYXJkbGVzcyBvZiBlcnJvciAqLwpAQCAtMjA4MCwxMyArMjA5MywxMyBAQAogICAgICAgLyoKICAgICAgICAqIEluaXRpYWxpemUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgogICAgICAgICoKLSAgICAgICAqIC4gSWYgd2UgaGF2ZSBhIGZhY2Utc3BlY2lmaWMgc2VlZCwgdXNlIGl0LgorICAgICAgICogLSBJZiB3ZSBoYXZlIGEgZmFjZS1zcGVjaWZpYyBzZWVkLCB1c2UgaXQuCiAgICAgICAgKiAgIElmIG5vbi16ZXJvLCB1cGRhdGUgaXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KICAgICAgICAqCi0gICAgICAgKiAuIE90aGVyd2lzZSwgdXNlIHRoZSBzZWVkIGZyb20gdGhlIENGRiBkcml2ZXIuCisgICAgICAgKiAtIE90aGVyd2lzZSwgdXNlIHRoZSBzZWVkIGZyb20gdGhlIENGRiBkcml2ZXIuCiAgICAgICAgKiAgIElmIG5vbi16ZXJvLCB1cGRhdGUgaXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KICAgICAgICAqCi0gICAgICAgKiAuIElmIHRoZSByYW5kb20gdmFsdWUgaXMgemVybywgdXNlIHRoZSBzZWVkIGdpdmVuIGJ5IHRoZSBzdWJmb250J3MKKyAgICAgICAqIC0gSWYgdGhlIHJhbmRvbSB2YWx1ZSBpcyB6ZXJvLCB1c2UgdGhlIHNlZWQgZ2l2ZW4gYnkgdGhlIHN1YmZvbnQncwogICAgICAgICogICBgaW5pdGlhbFJhbmRvbVNlZWQnIHZhbHVlLgogICAgICAgICoKICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZsb2FkLmggYi9zcmMvY2ZmL2NmZmxvYWQuaAppbmRleCAxNGQxNGUyLi5mYzk5OGRiIDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZmxvYWQuaAorKysgYi9zcmMvY2ZmL2NmZmxvYWQuaApAQCAtMSwyOSArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlICYgQ0ZGIGRhdGEvcHJvZ3JhbSB0YWJsZXMgbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2ZmbG9hZC5oCisgKgorICogICBPcGVuVHlwZSAmIENGRiBkYXRhL3Byb2dyYW0gdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRkxPQURfSF8KICNkZWZpbmUgQ0ZGTE9BRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0ZGX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oPgogI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfT0JKRUNUU19UWVBFU19IICAvKiBmb3IgQ0ZGX0ZhY2UgKi8KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZvdHlwZXMuaD4gIC8qIGZvciBDRkZfRmFjZSAqLwogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZvYmpzLmMgYi9zcmMvY2ZmL2NmZm9ianMuYwppbmRleCBhMmQ3YWVjLi5kNTU1ZDUyIDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZm9ianMuYworKysgYi9zcmMvY2ZmL2NmZm9ianMuYwpAQCAtMSw2NSArMSw2MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2Zmb2Jqcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIG9iamVjdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2Zmb2Jqcy5jCisgKgorICogICBPcGVuVHlwZSBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dG5hbWVpZC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DRkZfT0JKRUNUU19UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvY2Zmb3R5cGVzLmg+CiAjaW5jbHVkZSAiY2Zmb2Jqcy5oIgogI2luY2x1ZGUgImNmZmxvYWQuaCIKICNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCiAKICNpbmNsdWRlICJjZmZlcnJzLmgiCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQ0ZGX1RBQkxFX0xPQURfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZm9ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjZmZvYmpzCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAKICAgc3RhdGljIFBTSF9HbG9iYWxzX0Z1bmNzCkBAIC0xNjgsNDYgKzE2Niw1NiBAQAogICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKICAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBjZmZfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwogCisgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgICA9IGNmZnNpemUtPmZhY2UtPm1lbW9yeTsKKyAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gTlVMTDsKKyAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKWNmZnNpemUtPmZhY2U7CisgICAgQ0ZGX0ZvbnQgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwogCi0gICAgaWYgKCBmdW5jcyApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBmYWNlICAgICA9IChDRkZfRmFjZSljZmZzaXplLT5mYWNlOwotICAgICAgQ0ZGX0ZvbnQgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IE5VTEw7CisgICAgUFNfUHJpdmF0ZVJlYyBwcml2OwogCi0gICAgICBQU19Qcml2YXRlUmVjICBwcml2OwotICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ID0gY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5OworICAgIEZUX1VJbnQgICAgICAgaTsKIAotICAgICAgRlRfVUludCAgaTsKKyAgICBpZiAoICFmdW5jcyApCisgICAgICBnb3RvIEV4aXQ7CiAKKyAgICBpZiAoIEZUX05FVyggaW50ZXJuYWwgKSApCisgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIGlmICggRlRfTkVXKCBpbnRlcm5hbCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoICZmb250LT50b3BfZm9udCwgJnByaXYgKTsKLSAgICAgIGVycm9yID0gZnVuY3MtPmNyZWF0ZSggY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5LCAmcHJpdiwKKyAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoICZmb250LT50b3BfZm9udCwgJnByaXYgKTsKKyAgICBlcnJvciA9IGZ1bmNzLT5jcmVhdGUoIGNmZnNpemUtPmZhY2UtPm1lbW9yeSwgJnByaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+dG9wZm9udCApOworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCisgICAgeworICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiA9IGZvbnQtPnN1YmZvbnRzW2kgLSAxXTsKKworCisgICAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoIHN1YiwgJnByaXYgKTsKKyAgICAgIGVycm9yID0gZnVuY3MtPmNyZWF0ZSggY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5LCAmcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJuYWwtPnN1YmZvbnRzW2kgLSAxXSApOwogICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCi0gICAgICB7Ci0gICAgICAgIENGRl9TdWJGb250ICBzdWIgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0KLQotICAgICAgICBjZmZfbWFrZV9wcml2YXRlX2RpY3QoIHN1YiwgJnByaXYgKTsKLSAgICAgICAgZXJyb3IgPSBmdW5jcy0+Y3JlYXRlKCBjZmZzaXplLT5mYWNlLT5tZW1vcnksICZwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+c3ViZm9udHNbaSAtIDFdICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgY2Zmc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhID0gaW50ZXJuYWw7CiAgICAgfQogCisgICAgY2Zmc2l6ZS0+aW50ZXJuYWwtPm1vZHVsZV9kYXRhID0gaW50ZXJuYWw7CisKICAgICBzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7CiAKICAgRXhpdDoKKyAgICBpZiAoIGVycm9yICkKKyAgICB7CisgICAgICBpZiAoIGludGVybmFsICkKKyAgICAgIHsKKyAgICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCisgICAgICAgICAgRlRfRlJFRSggaW50ZXJuYWwtPnN1YmZvbnRzW2kgLSAxXSApOworICAgICAgICBGVF9GUkVFKCBpbnRlcm5hbC0+dG9wZm9udCApOworICAgICAgfQorCisgICAgICBGVF9GUkVFKCBpbnRlcm5hbCApOworICAgIH0KKwogICAgIHJldHVybiBlcnJvcjsKICAgfQogCkBAIC0zNDEsMTYgKzM0OSwxNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QgIEZVTkNUSU9OUworICAgKgorICAgKi8KIAogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBjZmZfc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQogICB7Ci0gICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gTlVMTDsKKyAgICBpZiAoIHNsb3QtPmludGVybmFsICkKKyAgICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IE5VTEw7CiAgIH0KIAogCkBAIC0zODMsMTEgKzM5MiwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDRSAgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAgIHN0YXRpYyBGVF9TdHJpbmcqCiAgIGNmZl9zdHJjcHkoIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSwKQEAgLTY0NSwxNCArNjU0LDE0IEBACiAKICAgICAgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7CiAKLSAgICAgIC8qIHdlIG5lZWQgdGhlIGBQU05hbWVzJyBtb2R1bGUgZm9yIENGRiBhbmQgQ0VGIGZvcm1hdHMgKi8KKyAgICAgIC8qIHdlIG5lZWQgdGhlIGBwc25hbWVzJyBtb2R1bGUgZm9yIENGRiBhbmQgQ0VGIGZvcm1hdHMgKi8KICAgICAgIC8qIHdoaWNoIGFyZW4ndCBDSUQta2V5ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgJiYgIXBzbmFtZXMgKQogICAgICAgewogICAgICAgICBGVF9FUlJPUigoICJjZmZfZmFjZV9pbml0OiIKICAgICAgICAgICAgICAgICAgICAiIGNhbm5vdCBvcGVuIENGRiAmIENFRiBmb250c1xuIgogICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIHdpdGhvdXQgdGhlIGBQU05hbWVzJyBtb2R1bGVcbiIgKSk7CisgICAgICAgICAgICAgICAgICAgIiB3aXRob3V0IHRoZSBgcHNuYW1lcycgbW9kdWxlXG4iICkpOwogICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CkBAIC05NDEsNyArOTUwLDggQEAKICAgICAgICAgICAgICAgICBzdHlsZV9uYW1lID0gY2ZmX3N0cmNweSggbWVtb3J5LCBmdWxscCApOwogCiAgICAgICAgICAgICAgICAgLyogcmVtb3ZlIHRoZSBzdHlsZSBwYXJ0IGZyb20gdGhlIGZhbWlseSBuYW1lIChpZiBwcmVzZW50KSAqLwotICAgICAgICAgICAgICAgIHJlbW92ZV9zdHlsZSggY2ZmZmFjZS0+ZmFtaWx5X25hbWUsIHN0eWxlX25hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiAoIHN0eWxlX25hbWUgKQorICAgICAgICAgICAgICAgICAgcmVtb3ZlX3N0eWxlKCBjZmZmYWNlLT5mYW1pbHlfbmFtZSwgc3R5bGVfbmFtZSApOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtOTYzLDEyICs5NzMsMTIgQEAKICAgICAgICAgICBjZmZmYWNlLT5zdHlsZV9uYW1lID0gc3R5bGVfbmFtZTsKICAgICAgICAgZWxzZQogICAgICAgICAgIC8qIGFzc3VtZSAiUmVndWxhciIgc3R5bGUgaWYgd2UgZG9uJ3Qga25vdyBiZXR0ZXIgKi8KLSAgICAgICAgICBjZmZmYWNlLT5zdHlsZV9uYW1lID0gY2ZmX3N0cmNweSggbWVtb3J5LCAoY2hhciAqKSJSZWd1bGFyIiApOworICAgICAgICAgIGNmZmZhY2UtPnN0eWxlX25hbWUgPSBjZmZfc3RyY3B5KCBtZW1vcnksICJSZWd1bGFyIiApOwogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogQ29tcHV0ZSBmYWNlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICoKKyAgICAgICAgICogQ29tcHV0ZSBmYWNlIGZsYWdzLgorICAgICAgICAgKi8KICAgICAgICAgZmxhZ3MgPSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICB8IC8qIHNjYWxhYmxlIG91dGxpbmVzICovCiAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgfCAvKiBob3Jpem9udGFsIGRhdGEgICAqLwogICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19ISU5URVI7ICAgICAgLyogaGFzIG5hdGl2ZSBoaW50ZXIgKi8KQEAgLTk4OSwxMCArOTk5LDEwIEBACiAKICAgICAgICAgY2ZmZmFjZS0+ZmFjZV9mbGFncyB8PSBmbGFnczsKIAotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIENvbXB1dGUgc3R5bGUgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqCisgICAgICAgICAqIENvbXB1dGUgc3R5bGUgZmxhZ3MuCisgICAgICAgICAqLwogICAgICAgICBmbGFncyA9IDA7CiAKICAgICAgICAgaWYgKCBkaWN0LT5pdGFsaWNfYW5nbGUgKQpAQCAtMTAxOSwxOSArMTAyOSwxOSBAQAogICAgICAgfQogCiAjaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMKLSAgICAgIC8qIENJRC1rZXllZCBDRkYgZm9udHMgZG9uJ3QgaGF2ZSBnbHlwaCBuYW1lcyAtLSB0aGUgU0ZOVCBsb2FkZXIgKi8KLSAgICAgIC8qIGhhcyB1bnNldCB0aGlzIGZsYWcgYmVjYXVzZSBvZiB0aGUgMy4wIGBwb3N0JyB0YWJsZS4gICAgICAgICAgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQorICAgICAgLyogQ0lELWtleWVkIENGRiBvciBDRkYyIGZvbnRzIGRvbid0IGhhdmUgZ2x5cGggbmFtZXMgLS0gdGhlIFNGTlQgKi8KKyAgICAgIC8qIGxvYWRlciBoYXMgdW5zZXQgdGhpcyBmbGFnIGJlY2F1c2Ugb2YgdGhlIDMuMCBgcG9zdCcgdGFibGUuICAgICovCisgICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSA9PSAweEZGRkZVICYmICFjZmYyICkKICAgICAgICAgY2ZmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVM7CiAjZW5kaWYKIAogICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSAmJiBwdXJlX2NmZiApCiAgICAgICAgIGNmZmZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0NJRF9LRVlFRDsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIENvbXB1dGUgY2hhciBtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqCisgICAgICAgKiBDb21wdXRlIGNoYXIgbWFwcy4KKyAgICAgICAqLwogCiAgICAgICAvKiBUcnkgdG8gc3ludGhlc2l6ZSBhIFVuaWNvZGUgY2hhcm1hcCBpZiB0aGVyZSBpcyBub25lIGF2YWlsYWJsZSAqLwogICAgICAgLyogYWxyZWFkeS4gIElmIGFuIE9wZW5UeXBlIGZvbnQgY29udGFpbnMgYSBVbmljb2RlICJjbWFwIiwgd2UgICAgKi8KQEAgLTEwNzAsMTAgKzEwODAsMTEgQEAKIAogICAgICAgICBubiA9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsKIAotICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCAmQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VULCBOVUxMLAorICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCAmY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWFwcmVjLCBOVUxMICk7CiAgICAgICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICkKKyAgICAgICAgICAgICBGVF9FUlJfTkVRKCBlcnJvciwgTm9fVW5pY29kZV9HbHlwaF9OYW1lICkgJiYKKyAgICAgICAgICAgICBGVF9FUlJfTkVRKCBlcnJvciwgVW5pbXBsZW1lbnRlZF9GZWF0dXJlICkgKQogICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7CiAKQEAgLTEwOTQsMTkgKzExMDUsMTkgQEAKICAgICAgICAgICB7CiAgICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfU1RBTkRBUkQ7CiAgICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQ7Ci0gICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJkNGRl9DTUFQX0VOQ09ESU5HX0NMQVNTX1JFQ19HRVQ7CisgICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYzsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSBpZiAoIGVuY29kaW5nLT5vZmZzZXQgPT0gMSApCiAgICAgICAgICAgewogICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0VYUEVSVDsKICAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ7Ci0gICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJkNGRl9DTUFQX0VOQ09ESU5HX0NMQVNTX1JFQ19HRVQ7CisgICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYzsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKICAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9DVVNUT007CiAgICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NOwotICAgICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9ICZDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUOworICAgICAgICAgICAgY2xhenogICAgICAgICAgICAgICA9ICZjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWM7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY2xhenosIE5VTEwsICZjbWFwcmVjLCBOVUxMICk7CmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZm9ianMuaCBiL3NyYy9jZmYvY2Zmb2Jqcy5oCmluZGV4IDYxNmEyNWIuLjg0NWJkOTAgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvY2Zmb2Jqcy5oCisrKyBiL3NyYy9jZmYvY2Zmb2Jqcy5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZvYmpzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjZmZvYmpzLmgKKyAqCisgKiAgIE9wZW5UeXBlIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRk9CSlNfSF8KICNkZWZpbmUgQ0ZGT0JKU19IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtNTEsMTAgKzUwLDEwIEBACiAgIGNmZl9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGYWNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGYWNlIGZ1bmN0aW9ucworICAgKi8KICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKICAgY2ZmX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAogICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLCAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KQEAgLTY2LDEwICs2NSwxMCBAQAogICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBmYWNlICk7ICAgICAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRHJpdmVyIGZ1bmN0aW9ucworICAgKi8KICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKICAgY2ZmX2RyaXZlcl9pbml0KCBGVF9Nb2R1bGUgIG1vZHVsZSApOyAgICAgICAgIC8qIFBTX0RyaXZlciAqLwogCmRpZmYgLS1naXQgYS9zcmMvY2ZmL2NmZnBhcnNlLmMgYi9zcmMvY2ZmL2NmZnBhcnNlLmMKaW5kZXggYjk2MTFjZi4uNjliY2Q1ZCAxMDA2NDQKLS0tIGEvc3JjL2NmZi9jZmZwYXJzZS5jCisrKyBiL3NyYy9jZmYvY2ZmcGFyc2UuYwpAQCAtMSw0MSArMSw0MCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmcGFyc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENGRiB0b2tlbiBzdHJlYW0gcGFyc2VyIChib2R5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2ZmcGFyc2UuYworICoKKyAqICAgQ0ZGIHRva2VuIHN0cmVhbSBwYXJzZXIgKGJvZHkpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJjZmZwYXJzZS5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRsaXN0Lmg+CiAKICNpbmNsdWRlICJjZmZlcnJzLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCiAjaW5jbHVkZSAiY2ZmbG9hZC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZnBhcnNlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2ZmcGFyc2UKIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQpAQCAtNzcsNiArNzYsMjMgQEAKICAgfQogCiAKKyNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCisgIHN0YXRpYyB2b2lkCisgIGZpbmFsaXplX3QyX3N0cmluZ3MoIEZUX01lbW9yeSAgbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgdXNlciApCisgIHsKKyAgICBDRkZfVDJfU3RyaW5nICB0MiA9IChDRkZfVDJfU3RyaW5nKWRhdGE7CisKKworICAgIEZUX1VOVVNFRCggdXNlciApOworCisgICAgbWVtb3J5LT5mcmVlKCBtZW1vcnksIHQyLT5zdGFydCApOworICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCBkYXRhICk7CisgIH0KKyNlbmRpZiAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FICovCisKKwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBjZmZfcGFyc2VyX2RvbmUoIENGRl9QYXJzZXIgIHBhcnNlciApCiAgIHsKQEAgLTg0LDEzICsxMDAsNjUgQEAKIAogCiAgICAgRlRfRlJFRSggcGFyc2VyLT5zdGFjayApOworCisjaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQorICAgIEZUX0xpc3RfRmluYWxpemUoICZwYXJzZXItPnQyX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWxpemVfdDJfc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOworI2VuZGlmCisgIH0KKworCisgIC8qIEFzc3VtaW5nIGBmaXJzdCA+PSBsYXN0Jy4gKi8KKworICBzdGF0aWMgRlRfRXJyb3IKKyAgY2ZmX3BhcnNlcl93aXRoaW5fbGltaXRzKCBDRkZfUGFyc2VyICBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGFzdCApCisgIHsKKyNpZm5kZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQorCisgICAgLyogRmFzdCBwYXRoIGZvciByZWd1bGFyIEZyZWVUeXBlIGJ1aWxkcyB3aXRoIHRoZSAibmV3IiBlbmdpbmU7ICovCisgICAgLyogICBgZmlyc3QgPj0gcGFyc2VyLT5zdGFydCcgY2FuIGJlIGFzc3VtZWQuICAgICAgICAgICAgICAgICAgICovCisKKyAgICBGVF9VTlVTRUQoIGZpcnN0ICk7CisKKyAgICByZXR1cm4gbGFzdCA8IHBhcnNlci0+bGltaXQgPyBGVF9FcnJfT2sgOiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOworCisjZWxzZSAvKiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FICovCisKKyAgICBGVF9MaXN0Tm9kZSAgbm9kZTsKKworCisgICAgaWYgKCBmaXJzdCA+PSBwYXJzZXItPnN0YXJ0ICYmCisgICAgICAgICBsYXN0ICA8ICBwYXJzZXItPmxpbWl0ICkKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisKKyAgICBub2RlID0gcGFyc2VyLT50Ml9zdHJpbmdzLmhlYWQ7CisKKyAgICB3aGlsZSAoIG5vZGUgKQorICAgIHsKKyAgICAgIENGRl9UMl9TdHJpbmcgIHQyID0gKENGRl9UMl9TdHJpbmcpbm9kZS0+ZGF0YTsKKworCisgICAgICBpZiAoIGZpcnN0ID49IHQyLT5zdGFydCAmJgorICAgICAgICAgICBsYXN0ICA8ICB0Mi0+bGltaXQgKQorICAgICAgICByZXR1cm4gRlRfRXJyX09rOworCisgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KICAgfQogCiAKICAgLyogcmVhZCBhbiBpbnRlZ2VyICovCiAgIHN0YXRpYyBGVF9Mb25nCi0gIGNmZl9wYXJzZV9pbnRlZ2VyKCBGVF9CeXRlKiAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgbGltaXQgKQorICBjZmZfcGFyc2VfaW50ZWdlciggQ0ZGX1BhcnNlciAgcGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgc3RhcnQgKQogICB7CiAgICAgRlRfQnl0ZSogIHAgICA9IHN0YXJ0OwogICAgIEZUX0ludCAgICB2ICAgPSAqcCsrOwpAQCAtOTksMTQgKzE2NywxNCBAQAogCiAgICAgaWYgKCB2ID09IDI4ICkKICAgICB7Ci0gICAgICBpZiAoIHAgKyAyID4gbGltaXQgKQorICAgICAgaWYgKCBjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMoIHBhcnNlciwgcCwgcCArIDEgKSApCiAgICAgICAgIGdvdG8gQmFkOwogCiAgICAgICB2YWwgPSAoRlRfU2hvcnQpKCAoIChGVF9VU2hvcnQpcFswXSA8PCA4ICkgfCBwWzFdICk7CiAgICAgfQogICAgIGVsc2UgaWYgKCB2ID09IDI5ICkKICAgICB7Ci0gICAgICBpZiAoIHAgKyA0ID4gbGltaXQgKQorICAgICAgaWYgKCBjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMoIHBhcnNlciwgcCwgcCArIDMgKSApCiAgICAgICAgIGdvdG8gQmFkOwogCiAgICAgICB2YWwgPSAoRlRfTG9uZykoICggKEZUX1VMb25nKXBbMF0gPDwgMjQgKSB8CkBAIC0xMjAsMTQgKzE4OCwxNCBAQAogICAgIH0KICAgICBlbHNlIGlmICggdiA8IDI1MSApCiAgICAgewotICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKKyAgICAgIGlmICggY2ZmX3BhcnNlcl93aXRoaW5fbGltaXRzKCBwYXJzZXIsIHAsIHAgKSApCiAgICAgICAgIGdvdG8gQmFkOwogCiAgICAgICB2YWwgPSAoIHYgLSAyNDcgKSAqIDI1NiArIHBbMF0gKyAxMDg7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQorICAgICAgaWYgKCBjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMoIHBhcnNlciwgcCwgcCApICkKICAgICAgICAgZ290byBCYWQ7CiAKICAgICAgIHZhbCA9IC0oIHYgLSAyNTEgKSAqIDI1NiAtIHBbMF0gLSAxMDg7CkBAIC0xNzYsMTAgKzI0NCwxMCBAQAogCiAgIC8qIHJlYWQgYSByZWFsICovCiAgIHN0YXRpYyBGVF9GaXhlZAotICBjZmZfcGFyc2VfcmVhbCggRlRfQnl0ZSogIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgIHBvd2VyX3RlbiwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBzY2FsaW5nICkKKyAgY2ZmX3BhcnNlX3JlYWwoIENGRl9QYXJzZXIgIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcG93ZXJfdGVuLAorICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgc2NhbGluZyApCiAgIHsKICAgICBGVF9CeXRlKiAgcCA9IHN0YXJ0OwogICAgIEZUX0ludCAgICBuaWI7CkBAIC0yMTQsNyArMjgyLDcgQEAKICAgICAgICAgcCsrOwogCiAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIHBhc3QgdGhlIGVuZC4gKi8KLSAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKKyAgICAgICAgaWYgKCBjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMoIHBhcnNlciwgcCwgcCApICkKICAgICAgICAgICBnb3RvIEJhZDsKICAgICAgIH0KIApAQCAtMjUxLDcgKzMxOSw3IEBACiAgICAgICAgICAgcCsrOwogCiAgICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCisgICAgICAgICAgaWYgKCBjZmZfcGFyc2VyX3dpdGhpbl9saW1pdHMoIHBhcnNlciwgcCwgcCApICkKICAgICAgICAgICAgIGdvdG8gQmFkOwogICAgICAgICB9CiAKQEAgLTI5MCw3ICszNTgsNyBAQAogICAgICAgICAgIHArKzsKIAogICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIHBhc3QgdGhlIGVuZC4gKi8KLSAgICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQorICAgICAgICAgIGlmICggY2ZmX3BhcnNlcl93aXRoaW5fbGltaXRzKCBwYXJzZXIsIHAsIHAgKSApCiAgICAgICAgICAgICBnb3RvIEJhZDsKICAgICAgICAgfQogCkBAIC00NTcsNyArNTI1LDcgQEAKICAgICBpZiAoICoqZCA9PSAzMCApCiAgICAgewogICAgICAgLyogYmluYXJ5LWNvZGVkIGRlY2ltYWwgaXMgdHJ1bmNhdGVkIHRvIGludGVnZXIgKi8KLSAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggKmQsIHBhcnNlci0+bGltaXQsIDAsIE5VTEwgKSA+PiAxNjsKKyAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggcGFyc2VyLCAqZCwgMCwgTlVMTCApID4+IDE2OwogICAgIH0KIAogICAgIGVsc2UgaWYgKCAqKmQgPT0gMjU1ICkKQEAgLTQ4Myw3ICs1NTEsNyBAQAogICAgIH0KIAogICAgIGVsc2UKLSAgICAgIHJldHVybiBjZmZfcGFyc2VfaW50ZWdlciggKmQsIHBhcnNlci0+bGltaXQgKTsKKyAgICAgIHJldHVybiBjZmZfcGFyc2VfaW50ZWdlciggcGFyc2VyLCAqZCApOwogICB9CiAKIApAQCAtNDk0LDEwICs1NjIsMTAgQEAKICAgICAgICAgICAgIEZUX0xvbmcgICAgIHNjYWxpbmcgKQogICB7CiAgICAgaWYgKCAqKmQgPT0gMzAgKQotICAgICAgcmV0dXJuIGNmZl9wYXJzZV9yZWFsKCAqZCwgcGFyc2VyLT5saW1pdCwgc2NhbGluZywgTlVMTCApOworICAgICAgcmV0dXJuIGNmZl9wYXJzZV9yZWFsKCBwYXJzZXIsICpkLCBzY2FsaW5nLCBOVUxMICk7CiAgICAgZWxzZQogICAgIHsKLSAgICAgIEZUX0xvbmcgIHZhbCA9IGNmZl9wYXJzZV9pbnRlZ2VyKCAqZCwgcGFyc2VyLT5saW1pdCApOworICAgICAgRlRfTG9uZyAgdmFsID0gY2ZmX3BhcnNlX2ludGVnZXIoIHBhcnNlciwgKmQgKTsKIAogCiAgICAgICBpZiAoIHNjYWxpbmcgKQpAQCAtNTYyLDE0ICs2MzAsMTQgQEAKICAgICBGVF9BU1NFUlQoIHNjYWxpbmcgKTsKIAogICAgIGlmICggKipkID09IDMwICkKLSAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggKmQsIHBhcnNlci0+bGltaXQsIDAsIHNjYWxpbmcgKTsKKyAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggcGFyc2VyLCAqZCwgMCwgc2NhbGluZyApOwogICAgIGVsc2UKICAgICB7CiAgICAgICBGVF9Mb25nICBudW1iZXI7CiAgICAgICBGVF9JbnQgICBpbnRlZ2VyX2xlbmd0aDsKIAogCi0gICAgICBudW1iZXIgPSBjZmZfcGFyc2VfaW50ZWdlciggZFswXSwgZFsxXSApOworICAgICAgbnVtYmVyID0gY2ZmX3BhcnNlX2ludGVnZXIoIHBhcnNlciwgZFswXSApOwogCiAgICAgICBpZiAoIG51bWJlciA+IDB4N0ZGRkwgKQogICAgICAgewpAQCAtNjA1LDcgKzY3Myw2IEBACiAgICAgRlRfVmVjdG9yKiAgICAgICBvZmZzZXQgPSAmZGljdC0+Zm9udF9vZmZzZXQ7CiAgICAgRlRfVUxvbmcqICAgICAgICB1cG0gICAgPSAmZGljdC0+dW5pdHNfcGVyX2VtOwogICAgIEZUX0J5dGUqKiAgICAgICAgZGF0YSAgID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICA9IEZUX0VSUiggU3RhY2tfVW5kZXJmbG93ICk7CiAKIAogICAgIGlmICggcGFyc2VyLT50b3AgPj0gcGFyc2VyLT5zdGFjayArIDYgKQpAQCAtNjE3LDggKzY4NCw2IEBACiAgICAgICBpbnQgICAgICBpOwogCiAKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCiAgICAgICBkaWN0LT5oYXNfZm9udF9tYXRyaXggPSBUUlVFOwogCiAgICAgICAvKiBXZSBleHBlY3QgYSB3ZWxsLWZvcm1lZCBmb250IG1hdHJpeCwgdGhpcyBpcywgdGhlIG1hdHJpeCBlbGVtZW50cyAqLwpAQCAtNjQ3LDIyICs3MTIsMTEgQEAKICAgICAgICAgICAgKCBtYXhfc2NhbGluZyAtIG1pbl9zY2FsaW5nICkgPCAwIHx8CiAgICAgICAgICAgICggbWF4X3NjYWxpbmcgLSBtaW5fc2NhbGluZyApID4gOSApCiAgICAgICB7Ci0gICAgICAgIC8qIFJldHVybiBkZWZhdWx0IG1hdHJpeCBpbiBjYXNlIG9mIHVubGlrZWx5IHZhbHVlcy4gKi8KLQogICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX3BhcnNlX2ZvbnRfbWF0cml4OiIKLSAgICAgICAgICAgICAgICAgICAgIiBzdHJhbmdlIHNjYWxpbmcgdmFsdWVzIChtaW5pbXVtICVkLCBtYXhpbXVtICVkKSxcbiIKKyAgICAgICAgICAgICAgICAgICAgIiBzdHJhbmdlIHNjYWxpbmcgdmFsdWVzIChtaW5pbXVtICVsZCwgbWF4aW11bSAlbGQpLFxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICIKICAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBkZWZhdWx0IG1hdHJpeFxuIiwgbWluX3NjYWxpbmcsIG1heF9zY2FsaW5nICkpOwotCi0gICAgICAgIG1hdHJpeC0+eHggPSAweDEwMDAwTDsKLSAgICAgICAgbWF0cml4LT55eCA9IDA7Ci0gICAgICAgIG1hdHJpeC0+eHkgPSAwOwotICAgICAgICBtYXRyaXgtPnl5ID0gMHgxMDAwMEw7Ci0gICAgICAgIG9mZnNldC0+eCAgPSAwOwotICAgICAgICBvZmZzZXQtPnkgID0gMDsKLSAgICAgICAgKnVwbSAgICAgICA9IDE7Ci0KLSAgICAgICAgZ290byBFeGl0OworICAgICAgICBnb3RvIFVubGlrZWx5OwogICAgICAgfQogCiAgICAgICBmb3IgKCBpID0gMDsgaSA8IDY7IGkrKyApCkBAIC03MDksMTAgKzc2MywzMSBAQAogICAgICAgICAgICAgICAgICAgKGRvdWJsZSltYXRyaXgtPnl5IC8gKnVwbSAvIDY1NTM2LAogICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvZmZzZXQtPnggIC8gKnVwbSAvIDY1NTM2LAogICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvZmZzZXQtPnkgIC8gKnVwbSAvIDY1NTM2ICkpOwotICAgIH0KIAotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKKyAgICAgIGlmICggIUZUX01hdHJpeF9DaGVjayggbWF0cml4ICkgKQorICAgICAgeworICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX3BhcnNlX2ZvbnRfbWF0cml4OiIKKyAgICAgICAgICAgICAgICAgICAgIiBkZWdlbmVyYXRlIHZhbHVlcywgdXNpbmcgZGVmYXVsdCBtYXRyaXhcbiIgKSk7CisgICAgICAgIGdvdG8gVW5saWtlbHk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHJldHVybiBGVF9USFJPVyggU3RhY2tfVW5kZXJmbG93ICk7CisKKyAgVW5saWtlbHk6CisgICAgLyogUmV0dXJuIGRlZmF1bHQgbWF0cml4IGluIGNhc2Ugb2YgdW5saWtlbHkgdmFsdWVzLiAqLworCisgICAgbWF0cml4LT54eCA9IDB4MTAwMDBMOworICAgIG1hdHJpeC0+eXggPSAwOworICAgIG1hdHJpeC0+eHkgPSAwOworICAgIG1hdHJpeC0+eXkgPSAweDEwMDAwTDsKKyAgICBvZmZzZXQtPnggID0gMDsKKyAgICBvZmZzZXQtPnkgID0gMDsKKyAgICAqdXBtICAgICAgID0gMTsKKworICAgIHJldHVybiBGVF9FcnJfT2s7CiAgIH0KIAogCkBAIC03MzUsNyArODEwLDcgQEAKICAgICAgIGJib3gtPnlNYXggPSBGVF9Sb3VuZEZpeCggY2ZmX3BhcnNlX2ZpeGVkKCBwYXJzZXIsIGRhdGEgICApICk7CiAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKIAotICAgICAgRlRfVFJBQ0U0KCggIiBbJWQgJWQgJWQgJWRdXG4iLAorICAgICAgRlRfVFJBQ0U0KCggIiBbJWxkICVsZCAlbGQgJWxkXVxuIiwKICAgICAgICAgICAgICAgICAgIGJib3gtPnhNaW4gLyA2NTUzNiwKICAgICAgICAgICAgICAgICAgIGJib3gtPnlNaW4gLyA2NTUzNiwKICAgICAgICAgICAgICAgICAgIGJib3gtPnhNYXggLyA2NTUzNiwKQEAgLTgwMiw3ICs4NzcsNyBAQAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKICAgICAvKiBiZWF1dGlmeSB0cmFjaW5nIG1lc3NhZ2UgKi8KLSAgICBpZiAoIGZ0X3RyYWNlX2xldmVsc1tGVF9DT01QT05FTlRdIDwgNCApCisgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfVFJBQ0VfQ09NUCggRlRfQ09NUE9ORU5UICldIDwgNCApCiAgICAgICBGVF9UUkFDRTEoKCAiTXVsdGlwbGUgTWFzdGVyIENGRnMgbm90IHN1cHBvcnRlZCB5ZXQsIgogICAgICAgICAgICAgICAgICAgIiBoYW5kbGluZyBmaXJzdCBtYXN0ZXIgZGVzaWduIG9ubHlcbiIgKSk7CiAgICAgZWxzZQpAQCAtODU4LDExICs5MzMsMTEgQEAKICAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9wYXJzZV9jaWRfcm9zOiByZWFsIHN1cHBsZW1lbnQgaXMgcm91bmRlZFxuIiApKTsKICAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ID0gY2ZmX3BhcnNlX251bSggcGFyc2VyLCBkYXRhICk7CiAgICAgICBpZiAoIGRpY3QtPmNpZF9zdXBwbGVtZW50IDwgMCApCi0gICAgICAgIEZUX1RSQUNFMSgoICJjZmZfcGFyc2VfY2lkX3JvczogbmVnYXRpdmUgc3VwcGxlbWVudCAlZCBpcyBmb3VuZFxuIiwKKyAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9wYXJzZV9jaWRfcm9zOiBuZWdhdGl2ZSBzdXBwbGVtZW50ICVsZCBpcyBmb3VuZFxuIiwKICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfc3VwcGxlbWVudCApKTsKICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogCi0gICAgICBGVF9UUkFDRTQoKCAiICVkICVkICVkXG4iLAorICAgICAgRlRfVFJBQ0U0KCggIiAlZCAlZCAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfb3JkZXJpbmcsCiAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfc3VwcGxlbWVudCApKTsKQEAgLTEwMDMsOSArMTA3OCw2IEBACiAgICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfYm9vbCApCiAKIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0KICN1bmRlZiAgQ0ZGX0ZJRUxECiAjdW5kZWYgIENGRl9GSUVMRF9ERUxUQQogCkBAIC0xMTE4LDE5OSArMTE5MCwyMCBAQAogI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9GaWVsZF9IYW5kbGVyKiAgY2xhenogKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggY2xhenogKQotICAgICAgRlRfRlJFRSggY2xhenogKTsKLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX0ZpZWxkX0hhbmRsZXIqKiAgb3V0cHV0X2NsYXNzICkKLSAgewotICAgIENGRl9GaWVsZF9IYW5kbGVyKiAgY2xhenogID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgaW50ICBpID0gMDsKLQotCi0jdW5kZWYgQ0ZGX0ZJRUxECi0jZGVmaW5lIENGRl9GSUVMRCggY29kZSwgbmFtZSwgaWQsIGtpbmQgKSBpKys7Ci0jdW5kZWYgQ0ZGX0ZJRUxEX0RFTFRBCi0jZGVmaW5lIENGRl9GSUVMRF9ERUxUQSggY29kZSwgbmFtZSwgbWF4LCBpZCApIGkrKzsKLSN1bmRlZiBDRkZfRklFTERfQ0FMTEJBQ0sKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlLCBuYW1lLCBpZCApIGkrKzsKLSN1bmRlZiBDRkZfRklFTERfQkxFTkQKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0JMRU5EKCBjb2RlLCBpZCApIGkrKzsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICBpKys7IC8qIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9ICovCi0KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggQ0ZGX0ZpZWxkX0hhbmRsZXIgKSAqIGkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpID0gMDsKLQotCi0jaWZuZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLQotI3VuZGVmIENGRl9GSUVMRF9DQUxMQkFDSwotI2RlZmluZSBDRkZfRklFTERfQ0FMTEJBQ0soIGNvZGVfLCBuYW1lXywgaWRfICkgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBjZmZfa2luZF9jYWxsYmFjazsgICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gY2ZmX3BhcnNlXyAjIyBuYW1lXzsgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotCi0jdW5kZWYgIENGRl9GSUVMRAotI2RlZmluZSBDRkZfRklFTEQoIGNvZGVfLCBuYW1lXywgaWRfLCBraW5kXyApICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGtpbmRfOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkUoIG5hbWVfICk7ICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0jdW5kZWYgIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGVfLCBuYW1lXywgbWF4XywgaWRfICkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfZGVsdGE7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gRlRfRklFTERfU0laRV9ERUxUQSggbmFtZV8gKTsgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IG1heF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIG5hbWVfICk7IFwKLSAgICAgICAgICBpKys7Ci0KLSN1bmRlZiAgQ0ZGX0ZJRUxEX0JMRU5ECi0jZGVmaW5lIENGRl9GSUVMRF9CTEVORCggY29kZV8sIGlkXyApICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfYmxlbmQ7ICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyBcCi0gICAgICAgICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gY2ZmX3BhcnNlX2JsZW5kOyBcCi0gICAgICAgICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotCi0jaW5jbHVkZSAiY2ZmdG9rZW4uaCIKLQotICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOwotICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7Ci0KLQotI2Vsc2UgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0jdW5kZWYgQ0ZGX0ZJRUxEX0NBTExCQUNLCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZV8sIG5hbWVfLCBpZF8gKSAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2NhbGxiYWNrOyAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSBjZmZfcGFyc2VfICMjIG5hbWVfOyBcCi0gICAgICAgICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotCi0jdW5kZWYgIENGRl9GSUVMRAotI2RlZmluZSBDRkZfRklFTEQoIGNvZGVfLCBuYW1lXywgaWRfLCBraW5kXyApICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGtpbmRfOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkUoIG5hbWVfICk7ICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmlkICAgICAgICAgICA9IGlkXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0jdW5kZWYgIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGVfLCBuYW1lXywgbWF4XywgaWRfICkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfZGVsdGE7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gRlRfRklFTERfU0laRV9ERUxUQSggbmFtZV8gKTsgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IG1heF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIG5hbWVfICk7IFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI3VuZGVmICBDRkZfRklFTERfQkxFTkQKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0JMRU5EKCBjb2RlXywgaWRfICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBjZmZfa2luZF9ibGVuZDsgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7IFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSBjZmZfcGFyc2VfYmxlbmQ7IFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7Ci0KLSNpbmNsdWRlICJjZmZ0b2tlbi5oIgotCi0gICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7Ci0gICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gMDsKLSAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSAwOwotCi0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgY2ZmX3BhcnNlcl9ydW4oIENGRl9QYXJzZXIgIHBhcnNlciwKICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKQogICB7CisgICAgRlRfQnl0ZSogIHAgICAgID0gc3RhcnQ7CisgICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOworCiAjaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQogICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4OwotI2VuZGlmCiAKLSAgICBGVF9CeXRlKiAgICBwICAgICAgID0gc3RhcnQ7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gcGFyc2VyLT5saWJyYXJ5OwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KKyAgICBGVF9NZW1vcnkgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OworI2VuZGlmCiAKICAgICBwYXJzZXItPnRvcCAgICA9IHBhcnNlci0+c3RhY2s7CiAgICAgcGFyc2VyLT5zdGFydCAgPSBzdGFydDsKQEAgLTEzMjEsNiArMTIxNCw3IEBACiAgICAgewogICAgICAgRlRfVUludCAgdiA9ICpwOwogCisKICAgICAgIC8qIE9wY29kZSAzMSBpcyBsZWdhY3kgTU0gVDIgb3BlcmF0b3IsIG5vdCBhIG51bWJlci4gICAgICAqLwogICAgICAgLyogT3Bjb2RlIDI1NSBpcyByZXNlcnZlZCBhbmQgc2hvdWxkIG5vdCBhcHBlYXIgaW4gZm9udHM7ICovCiAgICAgICAvKiBpdCBpcyB1c2VkIGludGVybmFsbHkgZm9yIENGRjIgYmxlbmRzLiAgICAgICAgICAgICAgICAgKi8KQEAgLTEzNjksOCArMTI2MywxMSBAQAogICAgICAgICBGVF9CeXRlKiAgICAgY2hhcnN0cmluZ19iYXNlOwogICAgICAgICBGVF9VTG9uZyAgICAgY2hhcnN0cmluZ19sZW47CiAKLSAgICAgICAgRlRfRml4ZWQqICBzdGFjazsKLSAgICAgICAgRlRfQnl0ZSogICBxOworICAgICAgICBGVF9GaXhlZCogICAgICBzdGFjazsKKyAgICAgICAgRlRfTGlzdE5vZGUgICAgbm9kZTsKKyAgICAgICAgQ0ZGX1QyX1N0cmluZyAgdDI7CisgICAgICAgIEZUX0ZpeGVkICAgICAgIHQyX3NpemU7CisgICAgICAgIEZUX0J5dGUqICAgICAgIHE7CiAKIAogICAgICAgICBjaGFyc3RyaW5nX2Jhc2UgPSArK3A7CkBAIC0xNDA1LDE3ICsxMzAyLDM5IEBACiAKICAgICAgICAgZXJyb3IgPSBwc2F1eC0+Y2ZmX2RlY29kZXJfZnVuY3MtPnBhcnNlX2NoYXJzdHJpbmdzX29sZCgKICAgICAgICAgICAgICAgICAgICZkZWNvZGVyLCBjaGFyc3RyaW5nX2Jhc2UsIGNoYXJzdHJpbmdfbGVuLCAxICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRXhpdDsKIAogICAgICAgICAvKiBOb3cgY29weSB0aGUgc3RhY2sgZGF0YSBpbiB0aGUgdGVtcG9yYXJ5IGRlY29kZXIgb2JqZWN0LCAgICAqLwogICAgICAgICAvKiBjb252ZXJ0aW5nIGl0IGJhY2sgdG8gY2hhcnN0cmluZyBudW1iZXIgcmVwcmVzZW50YXRpb25zICAgICAqLwogICAgICAgICAvKiAodGhpcyBpcyB1Z2x5LCBJIGtub3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdGhlIG9yaWdpbmFsIHRvcCBESUNUIGNoYXJzdHJpbmcgdW5kZXIgdGhlICAgICAqLwotICAgICAgICAvKiBhc3N1bXB0aW9uIHRoYXQgdGhlIGNoYXJzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdCAqLwotICAgICAgICAvKiBvZiBgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MnIGlzIHNob3J0ZXIsIHdoaWNoIHNob3VsZCAqLwotICAgICAgICAvKiBiZSBhbHdheXMgdHJ1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgICAgIHEgICAgID0gY2hhcnN0cmluZ19iYXNlIC0gMTsKKyAgICAgICAgbm9kZSA9IChGVF9MaXN0Tm9kZSltZW1vcnktPmFsbG9jKCBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfTGlzdE5vZGVSZWMgKSApOworICAgICAgICBpZiAoICFub2RlICkKKyAgICAgICAgICBnb3RvIE91dF9PZl9NZW1vcnlfRXJyb3I7CisKKyAgICAgICAgRlRfTGlzdF9BZGQoICZwYXJzZXItPnQyX3N0cmluZ3MsIG5vZGUgKTsKKworICAgICAgICB0MiA9IChDRkZfVDJfU3RyaW5nKW1lbW9yeS0+YWxsb2MoIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBDRkZfVDJfU3RyaW5nUmVjICkgKTsKKyAgICAgICAgaWYgKCAhdDIgKQorICAgICAgICAgIGdvdG8gT3V0X09mX01lbW9yeV9FcnJvcjsKKworICAgICAgICBub2RlLT5kYXRhID0gdDI7CisKKyAgICAgICAgLyogYDUnIGlzIHRoZSBjb25zZXJ2YXRpdmUgdXBwZXIgYm91bmQgb2YgcmVxdWlyZWQgYnl0ZXMgcGVyIHN0YWNrICovCisgICAgICAgIC8qIGVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIHQyX3NpemUgPSA1ICogKCBkZWNvZGVyLnRvcCAtIGRlY29kZXIuc3RhY2sgKTsKKworICAgICAgICBxID0gKEZUX0J5dGUqKW1lbW9yeS0+YWxsb2MoIG1lbW9yeSwgdDJfc2l6ZSApOworICAgICAgICBpZiAoICFxICkKKyAgICAgICAgICBnb3RvIE91dF9PZl9NZW1vcnlfRXJyb3I7CisKKyAgICAgICAgdDItPnN0YXJ0ID0gcTsKKyAgICAgICAgdDItPmxpbWl0ID0gcSArIHQyX3NpemU7CisKICAgICAgICAgc3RhY2sgPSBkZWNvZGVyLnN0YWNrOwogCiAgICAgICAgIHdoaWxlICggc3RhY2sgPCBkZWNvZGVyLnRvcCApCkBAIC0xNDMxLDcgKzEzNTAsNyBAQAogCiAgICAgICAgICAgaWYgKCAqc3RhY2sgPCAwICkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBudW0gPSAoRlRfVUxvbmcpLSpzdGFjazsKKyAgICAgICAgICAgIG51bSA9IChGVF9VTG9uZylORUdfTE9ORyggKnN0YWNrICk7CiAgICAgICAgICAgICBuZWcgPSAxOwogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlCkBAIC0xNTIzLDcgKzE0NDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNvZGUgPSBjb2RlIHwgcGFyc2VyLT5vYmplY3RfY29kZTsKIAotICAgICAgICBmb3IgKCBmaWVsZCA9IENGRl9GSUVMRF9IQU5ETEVSU19HRVQ7IGZpZWxkLT5raW5kOyBmaWVsZCsrICkKKyAgICAgICAgZm9yICggZmllbGQgPSBjZmZfZmllbGRfaGFuZGxlcnM7IGZpZWxkLT5raW5kOyBmaWVsZCsrICkKICAgICAgICAgewogICAgICAgICAgIGlmICggZmllbGQtPmNvZGUgPT0gKEZUX0ludCljb2RlICkKICAgICAgICAgICB7CkBAIC0xNjcyLDExICsxNTkxLDE3IEBACiAgICAgICAgICAgcGFyc2VyLT50b3AgPSBwYXJzZXItPnN0YWNrOwogICAgICAgfQogICAgICAgcCsrOwotICAgIH0KKyAgICB9IC8qIHdoaWxlICggcCA8IGxpbWl0ICkgKi8KIAogICBFeGl0OgogICAgIHJldHVybiBlcnJvcjsKIAorI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKKyAgT3V0X09mX01lbW9yeV9FcnJvcjoKKyAgICBlcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7CisgICAgZ290byBFeGl0OworI2VuZGlmCisKICAgU3RhY2tfT3ZlcmZsb3c6CiAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwogICAgIGdvdG8gRXhpdDsKZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmcGFyc2UuaCBiL3NyYy9jZmYvY2ZmcGFyc2UuaAppbmRleCA4YThjYWVjLi42ZjNmYmIzIDEwMDY0NAotLS0gYS9zcmMvY2ZmL2NmZnBhcnNlLmgKKysrIGIvc3JjL2NmZi9jZmZwYXJzZS5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIHN0cmVhbSBwYXJzZXIgKHNwZWNpZmljYXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjZmZwYXJzZS5oCisgKgorICogICBDRkYgdG9rZW4gc3RyZWFtIHBhcnNlciAoc3BlY2lmaWNhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQ0ZGUEFSU0VfSF8KICNkZWZpbmUgQ0ZGUEFSU0VfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtMzMsMTEgKzMyLDExIEBACiAjZGVmaW5lIENGRl9NQVhfU1RBQ0tfREVQVEggIDk2CiAKICAgLyoKLSAgICogIFRoZXJlIGFyZSBwbGFucyB0byByZW1vdmUgdGhlIGBtYXhzdGFjaycgb3BlcmF0b3IgaW4gYSBmb3J0aGNvbWluZwotICAgKiAgcmV2aXNpb24gb2YgdGhlIENGRjIgc3BlY2lmaWNhdGlvbiwgaW5jcmVhc2luZyB0aGUgKHRoZW4gc3RhdGljKSBzdGFjawotICAgKiAgc2l6ZSB0byA1MTMuICBCeSBtYWtpbmcgdGhlIGRlZmF1bHQgc3RhY2sgc2l6ZSBlcXVhbCB0byB0aGUgbWF4aW11bQotICAgKiAgc3RhY2sgc2l6ZSwgdGhlIG9wZXJhdG9yIGlzIGVzc2VudGlhbGx5IGRpc2FibGVkLCB3aGljaCBoYXMgdGhlCi0gICAqICBkZXNpcmVkIGVmZmVjdCBpbiBGcmVlVHlwZS4KKyAgICogVGhlcmUgYXJlIHBsYW5zIHRvIHJlbW92ZSB0aGUgYG1heHN0YWNrJyBvcGVyYXRvciBpbiBhIGZvcnRoY29taW5nCisgICAqIHJldmlzaW9uIG9mIHRoZSBDRkYyIHNwZWNpZmljYXRpb24sIGluY3JlYXNpbmcgdGhlICh0aGVuIHN0YXRpYykgc3RhY2sKKyAgICogc2l6ZSB0byA1MTMuICBCeSBtYWtpbmcgdGhlIGRlZmF1bHQgc3RhY2sgc2l6ZSBlcXVhbCB0byB0aGUgbWF4aW11bQorICAgKiBzdGFjayBzaXplLCB0aGUgb3BlcmF0b3IgaXMgZXNzZW50aWFsbHkgZGlzYWJsZWQsIHdoaWNoIGhhcyB0aGUKKyAgICogZGVzaXJlZCBlZmZlY3QgaW4gRnJlZVR5cGUuCiAgICAqLwogI2RlZmluZSBDRkYyX01BWF9TVEFDSyAgICAgIDUxMwogI2RlZmluZSBDRkYyX0RFRkFVTFRfU1RBQ0sgIDUxMwpAQCAtNjAsNiArNTksMTAgQEAKICAgICBGVF9CeXRlKiogICB0b3A7CiAgICAgRlRfVUludCAgICAgc3RhY2tTaXplOyAgLyogYWxsb2NhdGVkIHNpemUgKi8KIAorI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKKyAgICBGVF9MaXN0UmVjICB0Ml9zdHJpbmdzOworI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KKwogICAgIEZUX1VJbnQgICAgIG9iamVjdF9jb2RlOwogICAgIHZvaWQqICAgICAgIG9iamVjdDsKIApAQCAtMTMwLDYgKzEzMywxNSBAQAogRlRfRU5EX0hFQURFUgogCiAKKyNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCisgIHR5cGVkZWYgc3RydWN0ICBDRkZfVDJfU3RyaW5nXworICB7CisgICAgRlRfQnl0ZSogIHN0YXJ0OworICAgIEZUX0J5dGUqICBsaW1pdDsKKworICB9IENGRl9UMl9TdHJpbmdSZWMsICpDRkZfVDJfU3RyaW5nOworI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KKwogI2VuZGlmIC8qIENGRlBBUlNFX0hfICovCiAKIApkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZwaWMuYyBiL3NyYy9jZmYvY2ZmcGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Yjc0YzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NmZi9jZmZwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGNmZiBtb2R1bGUuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiY2ZmY21hcC5oIgotI2luY2x1ZGUgImNmZnBpYy5oIgotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIGNmZmRyaXZyLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX2NmZl9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICk7Ci0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc19jZmZfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX3BzX2luZm8oIEZUX0xpYnJhcnkgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9nbHlwaF9kaWN0KCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfcHNfbmFtZSggRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfY2lkX2luZm8oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9DSURSZWMqICBjbGF6eiApOwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gY2ZmcGFyc2UuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkZfRmllbGRfSGFuZGxlcioqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX0ZpZWxkX0hhbmRsZXIqICBjbGF6eiApOwotCi0KLSAgdm9pZAotICBjZmZfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+Y2ZmICkKLSAgICB7Ci0gICAgICBDZmZNb2R1bGVQSUMqICBjb250YWluZXIgPSAoQ2ZmTW9kdWxlUElDKilwaWNfY29udGFpbmVyLT5jZmY7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPmNmZl9zZXJ2aWNlcyApCi0gICAgICAgIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5jZmZfc2VydmljZXMgKTsKLSAgICAgIGNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VzID0gTlVMTDsKLSAgICAgIGlmICggY29udGFpbmVyLT5jZmZfZmllbGRfaGFuZGxlcnMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycygKLSAgICAgICAgICBsaWJyYXJ5LCBjb250YWluZXItPmNmZl9maWVsZF9oYW5kbGVycyApOwotICAgICAgY29udGFpbmVyLT5jZmZfZmllbGRfaGFuZGxlcnMgPSBOVUxMOwotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5jZmYgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgY2ZmX2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIENmZk1vZHVsZVBJQyogICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DICggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5jZmYgPSBjb250YWluZXI7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgZXhwZWN0cyB0aGlzIGRhdGEgKi8KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc19jZmZfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT5jZmZfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX2NmZl9maWVsZF9oYW5kbGVycygKLSAgICAgICAgICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX2ZpZWxkX2hhbmRsZXJzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX3BzX2luZm8oCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfc2VydmljZV9wc19pbmZvICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9nbHlwaF9kaWN0KAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfcHNfbmFtZSgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9zZXJ2aWNlX3BzX25hbWUgKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8oCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfc2VydmljZV9nZXRfY21hcF9pbmZvICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9jaWRfaW5mbygKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9zZXJ2aWNlX2NpZF9pbmZvICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMgKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMgKTsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgY2ZmX2RyaXZlcl9jbGFzc19waWNfZnJlZSggbGlicmFyeSApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9jZmYvY2ZmcGljLmggYi9zcmMvY2ZmL2NmZnBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE0MjAzLi4wMDAwMDAwCi0tLSBhL3NyYy9jZmYvY2ZmcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmcGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBjZmYgbW9kdWxlLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIENGRlBJQ19IXwotI2RlZmluZSBDRkZQSUNfSF8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQgICAgICAgICAgY2ZmX3NlcnZpY2VfcHNfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgICAgICBjZmZfc2VydmljZV9nbHlwaF9kaWN0Ci0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX05BTUVfR0VUICAgICAgICAgIGNmZl9zZXJ2aWNlX3BzX25hbWUKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfR0VUX0NNQVBfSU5GT19HRVQgICAgY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9DSURfSU5GT19HRVQgICAgICAgICBjZmZfc2VydmljZV9jaWRfaW5mbwotI2RlZmluZSBDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICBjZmZfc2VydmljZV9wcm9wZXJ0aWVzCi0jZGVmaW5lIENGRl9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgIGNmZl9zZXJ2aWNlcwotI2RlZmluZSBDRkZfU0VSVklDRV9NVUxUSV9NQVNURVJTX0dFVCAgICBjZmZfc2VydmljZV9tdWx0aV9tYXN0ZXJzCi0jZGVmaW5lIENGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCAgICAgIGNmZl9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9ucwotI2RlZmluZSBDRkZfU0VSVklDRV9DRkZfTE9BRF9HRVQgICAgICAgICBjZmZfc2VydmljZV9jZmZfbG9hZAotI2RlZmluZSBDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUICBjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMKLSNkZWZpbmUgQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VUICAgY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0hBTkRMRVJTX0dFVCAgICAgICAgICAgY2ZmX2ZpZWxkX2hhbmRsZXJzCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSAiY2ZmcGFyc2UuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BST1BFUlRJRVNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgQ2ZmTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICAgICAgICAgICAgY2ZmX3NlcnZpY2VzOwotICAgIENGRl9GaWVsZF9IYW5kbGVyKiAgICAgICAgICAgICAgIGNmZl9maWVsZF9oYW5kbGVyczsKLSAgICBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgICAgICAgICAgICBjZmZfc2VydmljZV9wc19pbmZvOwotICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICAgICAgICAgIGNmZl9zZXJ2aWNlX2dseXBoX2RpY3Q7Ci0gICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICAgICAgICAgY2ZmX3NlcnZpY2VfcHNfbmFtZTsKLSAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMgICAgICAgICAgICBjZmZfc2VydmljZV9nZXRfY21hcF9pbmZvOwotICAgIEZUX1NlcnZpY2VfQ0lEUmVjICAgICAgICAgICAgICAgIGNmZl9zZXJ2aWNlX2NpZF9pbmZvOwotICAgIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgICAgICAgIGNmZl9zZXJ2aWNlX3Byb3BlcnRpZXM7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMgICAgICAgY2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVyczsKLSAgICBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjICBjZmZfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnM7Ci0gICAgRlRfU2VydmljZV9DRkZMb2FkUmVjICAgICAgICAgICAgY2ZmX3NlcnZpY2VfY2ZmX2xvYWQ7Ci0gICAgRlRfQ01hcF9DbGFzc1JlYyAgICAgICAgICAgICAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjOwotICAgIEZUX0NNYXBfQ2xhc3NSZWMgICAgICAgICAgICAgICAgIGNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjOwotCi0gIH0gQ2ZmTW9kdWxlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ2ZmTW9kdWxlUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLmNmZiApICkKLQotI2RlZmluZSBDRkZfU0VSVklDRV9QU19JTkZPX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9wc19pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfZ2x5cGhfZGljdCApCi0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX05BTUVfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX3BzX25hbWUgKQotI2RlZmluZSBDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9nZXRfY21hcF9pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX2NpZF9pbmZvICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfcHJvcGVydGllcyApCi0jZGVmaW5lIENGRl9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VzICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfTVVMVElfTUFTVEVSU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfbXVsdGlfbWFzdGVycyApCi0jZGVmaW5lIENGRl9TRVJWSUNFX01FVFJJQ1NfVkFSX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfQ0ZGX0xPQURfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX2NmZl9sb2FkICkKLSNkZWZpbmUgQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMgKQotI2RlZmluZSBDRkZfQ01BUF9VTklDT0RFX0NMQVNTX1JFQ19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMgKQotI2RlZmluZSBDRkZfRklFTERfSEFORExFUlNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9maWVsZF9oYW5kbGVycyApCi0KLSAgLyogc2VlIGNmZnBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBjZmZfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgY2ZmX2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIENGRlBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NmZi9jZmZ0b2tlbi5oIGIvc3JjL2NmZi9jZmZ0b2tlbi5oCmluZGV4IGZlYzFjYTIuLjRjNmE1M2UgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvY2ZmdG9rZW4uaAorKysgYi9zcmMvY2ZmL2NmZnRva2VuLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnRva2VuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgdG9rZW4gZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZnRva2VuLmgKKyAqCisgKiAgIENGRiB0b2tlbiBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICN1bmRlZiAgRlRfU1RSVUNUVVJFCmRpZmYgLS1naXQgYS9zcmMvY2ZmL21vZHVsZS5tayBiL3NyYy9jZmYvbW9kdWxlLm1rCmluZGV4IDgwMTNkNWQuLmJkNzI4YzYgMTAwNjQ0Ci0tLSBhL3NyYy9jZmYvbW9kdWxlLm1rCisrKyBiL3NyYy9jZmYvbW9kdWxlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvY2ZmL3J1bGVzLm1rIGIvc3JjL2NmZi9ydWxlcy5tawppbmRleCBiY2U2NzI5Li43MGJiOTJkIDEwMDY0NAotLS0gYS9zcmMvY2ZmL3J1bGVzLm1rCisrKyBiL3NyYy9jZmYvcnVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTMxLDggKzMxLDcgQEAKICAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmZ2xvYWQuYyBcCiAgICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmZmxvYWQuYyAgXAogICAgICAgICAgICAgICAgJChDRkZfRElSKS9jZmZvYmpzLmMgIFwKLSAgICAgICAgICAgICAgICQoQ0ZGX0RJUikvY2ZmcGFyc2UuYyBcCi0gICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmZnBpYy5jCisgICAgICAgICAgICAgICAkKENGRl9ESVIpL2NmZnBhcnNlLmMKIAogCiAjIENGRiBkcml2ZXIgaGVhZGVycwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9KYW1maWxlIGIvc3JjL2NpZC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzIzMmZkLi4wMDAwMDAwCi0tLSBhL3NyYy9jaWQvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvY2lkIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBjaWQgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGNpZGdsb2FkCi0gICAgICAgICAgICAgICBjaWRsb2FkCi0gICAgICAgICAgICAgICBjaWRvYmpzCi0gICAgICAgICAgICAgICBjaWRwYXJzZQotICAgICAgICAgICAgICAgY2lkcml2ZXIKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHR5cGUxY2lkIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL2NpZCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZGVycnMuaCBiL3NyYy9jaWQvY2lkZXJycy5oCmluZGV4IGE1YTg2ZTMuLmY2OThiYjIgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvY2lkZXJycy5oCisrKyBiL3NyYy9jaWQvY2lkZXJycy5oCkBAIC0xLDMxICsxLDMxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRlcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lEIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaWRlcnJzLmgKKyAqCisgKiAgIENJRCBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIENJRCBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBDSUQgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBDSURFUlJTX0hfCiAjZGVmaW5lIENJREVSUlNfSF8KIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQ0lEX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9DSUQKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAjZW5kaWYgLyogQ0lERVJSU19IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZGdsb2FkLmMgYi9zcmMvY2lkL2NpZGdsb2FkLmMKaW5kZXggZDE0ZjlhMi4uNTRhYTYyZiAxMDA2NDQKLS0tIGEvc3JjL2NpZC9jaWRnbG9hZC5jCisrKyBiL3NyYy9jaWQvY2lkZ2xvYWQuYwpAQCAtMSw0NCArMSw0MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRC1rZXllZCBUeXBlMSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2lkZ2xvYWQuYworICoKKyAqICAgQ0lELWtleWVkIFR5cGUxIEdseXBoIExvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJjaWRsb2FkLmgiCiAjaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0ZGX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jZmZ0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKICNpbmNsdWRlICJjaWRlcnJzLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkZ2xvYWQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjaWRnbG9hZAogCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCkBAIC0zOTMsOCArMzkyLDcgQEAKICAgICBtdXN0X2ZpbmlzaF9kZWNvZGVyID0gVFJVRTsKIAogICAgIC8qIHNldCB1cCB0aGUgZGVjb2RlciAqLwotICAgIGRlY29kZXIuYnVpbGRlci5ub19yZWN1cnNlID0gRlRfQk9PTCgKLSAgICAgICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkgIT0gMCApICk7CisgICAgZGVjb2Rlci5idWlsZGVyLm5vX3JlY3Vyc2UgPSBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICk7CiAKICAgICBlcnJvciA9IGNpZF9sb2FkX2dseXBoKCAmZGVjb2RlciwgZ2x5cGhfaW5kZXggKTsKICAgICBpZiAoIGVycm9yICkKZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkZ2xvYWQuaCBiL3NyYy9jaWQvY2lkZ2xvYWQuaAppbmRleCA0ODExODUyLi5kYTM2ZTM3IDEwMDY0NAotLS0gYS9zcmMvY2lkL2NpZGdsb2FkLmgKKysrIGIvc3JjL2NpZC9jaWRnbG9hZC5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRnbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaWRnbG9hZC5oCisgKgorICogICBPcGVuVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBDSURHTE9BRF9IXwogI2RlZmluZSBDSURHTE9BRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgImNpZG9ianMuaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvY2lkL2NpZGxvYWQuYyBiL3NyYy9jaWQvY2lkbG9hZC5jCmluZGV4IDI3Y2QwOWIuLmJiOTEzNmEgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvY2lkbG9hZC5jCisrKyBiL3NyYy9jaWQvY2lkbG9hZC5jCkBAIC0xLDQwICsxLDQxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIGZvbnQgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaWRsb2FkLmMKKyAqCisgKiAgIENJRC1rZXllZCBUeXBlMSBmb250IGxvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAjaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogI2luY2x1ZGUgImNpZGxvYWQuaCIKIAogI2luY2x1ZGUgImNpZGVycnMuaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jaWRsb2FkCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2lkbG9hZAogCiAKICAgLyogcmVhZCBhIHNpbmdsZSBvZmZzZXQgKi8KQEAgLTgxLDYgKzgyLDggQEAKICAgICAvKiBpZiB0aGUga2V5d29yZCBoYXMgYSBkZWRpY2F0ZWQgY2FsbGJhY2ssIGNhbGwgaXQgKi8KICAgICBpZiAoIGtleXdvcmQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9DQUxMQkFDSyApCiAgICAgeworICAgICAgRlRfVFJBQ0U0KCggIiAgJXMiLCBrZXl3b3JkLT5pZGVudCApKTsKKwogICAgICAga2V5d29yZC0+cmVhZGVyKCAoRlRfRmFjZSlmYWNlLCBwYXJzZXIgKTsKICAgICAgIGVycm9yID0gcGFyc2VyLT5yb290LmVycm9yOwogICAgICAgZ290byBFeGl0OwpAQCAtMTMxLDYgKzEzNCw4IEBACiAgICAgICB9CiAgICAgfQogCisgICAgRlRfVFJBQ0U0KCggIiAgJXMiLCBrZXl3b3JkLT5pZGVudCApKTsKKwogICAgIGR1bW15X29iamVjdCA9IG9iamVjdDsKIAogICAgIC8qIG5vdywgbG9hZCB0aGUga2V5d29yZCBkYXRhIGluIHRoZSBvYmplY3QncyBmaWVsZChzKSAqLwpAQCAtMTQxLDEyICsxNDYsMTUgQEAKICAgICBlbHNlCiAgICAgICBlcnJvciA9IGNpZF9wYXJzZXJfbG9hZF9maWVsZCggJmxvYWRlci0+cGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsICZkdW1teV9vYmplY3QgKTsKKworICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7CisKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KIAogCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQorICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQogICBjaWRfcGFyc2VfZm9udF9tYXRyaXgoIENJRF9GYWNlICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQogICB7CkBAIC0xNzEsMTQgKzE3OSwyNSBAQAogICAgICAgcmVzdWx0ID0gY2lkX3BhcnNlcl90b19maXhlZF9hcnJheSggcGFyc2VyLCA2LCB0ZW1wLCAzICk7CiAKICAgICAgIGlmICggcmVzdWx0IDwgNiApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJjaWRfcGFyc2VfZm9udF9tYXRyaXg6IG5vdCBlbm91Z2ggbWF0cml4IGVsZW1lbnRzXG4iICkpOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisKKyAgICAgIEZUX1RSQUNFNCgoICIgWyVmICVmICVmICVmICVmICVmXVxuIiwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFswXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFsxXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFsyXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFszXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFs0XSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFs1XSAvIDY1NTM2IC8gMTAwMCApKTsKIAogICAgICAgdGVtcF9zY2FsZSA9IEZUX0FCUyggdGVtcFszXSApOwogCiAgICAgICBpZiAoIHRlbXBfc2NhbGUgPT0gMCApCiAgICAgICB7CiAgICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9mb250X21hdHJpeDogaW52YWxpZCBmb250IG1hdHJpeFxuIiApKTsKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CisgICAgICAgIGdvdG8gRXhpdDsKICAgICAgIH0KIAogICAgICAgLyogYXR5cGljYWwgY2FzZSAqLwpAQCAtMjAwLDE2ICsyMTksMjQgQEAKICAgICAgIG1hdHJpeC0+eHkgPSB0ZW1wWzJdOwogICAgICAgbWF0cml4LT55eSA9IHRlbXBbM107CiAKKyAgICAgIGlmICggIUZUX01hdHJpeF9DaGVjayggbWF0cml4ICkgKQorICAgICAgeworICAgICAgICBGVF9FUlJPUigoICJ0MV9wYXJzZV9mb250X21hdHJpeDogaW52YWxpZCBmb250IG1hdHJpeFxuIiApKTsKKyAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCiAgICAgICAvKiBub3RlIHRoYXQgdGhlIGZvbnQgb2Zmc2V0cyBhcmUgZXhwcmVzc2VkIGluIGludGVnZXIgZm9udCB1bml0cyAqLwogICAgICAgb2Zmc2V0LT54ICA9IHRlbXBbNF0gPj4gMTY7CiAgICAgICBvZmZzZXQtPnkgID0gdGVtcFs1XSA+PiAxNjsKICAgICB9CiAKLSAgICByZXR1cm4gRlRfRXJyX09rOworICBFeGl0OgorICAgIHJldHVybjsKICAgfQogCiAKLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCisgIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCiAgIHBhcnNlX2ZkX2FycmF5KCBDSURfRmFjZSAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQogICB7CkBAIC0yMjQsMTAgKzI1MSwxMSBAQAogICAgIGlmICggbnVtX2RpY3RzIDwgMCApCiAgICAgewogICAgICAgRlRfRVJST1IoKCAicGFyc2VfZmRfYXJyYXk6IGludmFsaWQgbnVtYmVyIG9mIGRpY3Rpb25hcmllc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICBGVF9UUkFDRTQoKCAiICVsZFxuIiwgbnVtX2RpY3RzICkpOworCiAgICAgLyoKICAgICAgKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgRkRBcnJheSBtdXN0IChhdCBsZWFzdCkgY29udGFpbiB0aGUgZm9sbG93aW5nCiAgICAgICogc3RydWN0dXJlIGVsZW1lbnRzLgpAQCAtMjQ3LDcgKzI3NSw3IEBACiAgICAgaWYgKCAoRlRfVUxvbmcpbnVtX2RpY3RzID4gc3RyZWFtLT5zaXplIC8gMTAwICkKICAgICB7CiAgICAgICBGVF9UUkFDRTAoKCAicGFyc2VfZmRfYXJyYXk6IGFkanVzdGluZyBGREFycmF5IHNpemUiCi0gICAgICAgICAgICAgICAgICAiIChmcm9tICVkIHRvICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICIgKGZyb20gJWxkIHRvICVsZClcbiIsCiAgICAgICAgICAgICAgICAgICBudW1fZGljdHMsCiAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNpemUgLyAxMDAgKSk7CiAgICAgICBudW1fZGljdHMgPSAoRlRfTG9uZykoIHN0cmVhbS0+c2l6ZSAvIDEwMCApOwpAQCAtMjYzLDI3ICsyOTEsMzEgQEAKIAogICAgICAgY2lkLT5udW1fZGljdHMgPSBudW1fZGljdHM7CiAKLSAgICAgIC8qIGRvbid0IGZvcmdldCB0byBzZXQgYSBmZXcgZGVmYXVsdHMgKi8KKyAgICAgIC8qIHNldCBzb21lIGRlZmF1bHQgdmFsdWVzICh0aGUgc2FtZSBhcyBmb3IgVHlwZSAxIGZvbnRzKSAqLwogICAgICAgZm9yICggbiA9IDA7IG4gPCBjaWQtPm51bV9kaWN0czsgbisrICkKICAgICAgIHsKICAgICAgICAgQ0lEX0ZhY2VEaWN0ICBkaWN0ID0gY2lkLT5mb250X2RpY3RzICsgbjsKIAogCi0gICAgICAgIC8qIGRlZmF1bHQgdmFsdWUgZm9yIGxlbklWICovCi0gICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5sZW5JViA9IDQ7CisgICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5ibHVlX3NoaWZ0ICAgICAgID0gNzsKKyAgICAgICAgZGljdC0+cHJpdmF0ZV9kaWN0LmJsdWVfZnV6eiAgICAgICAgPSAxOworICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QubGVuSVYgICAgICAgICAgICA9IDQ7CisgICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5leHBhbnNpb25fZmFjdG9yID0gKEZUX0ZpeGVkKSggMC4wNiAqIDB4MTAwMDBMICk7CisgICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5ibHVlX3NjYWxlICAgICAgID0gKEZUX0ZpeGVkKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDM5NjI1ICogMHgxMDAwMEwgKiAxMDAwICk7CiAgICAgICB9CiAgICAgfQogCiAgIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOworICAgIHJldHVybjsKICAgfQogCiAKLSAgLyogYnkgbWlzdGFrZSwgYGV4cGFuc2lvbl9mYWN0b3InIGFwcGVhcnMgYm90aCBpbiBQU19Qcml2YXRlUmVjICovCisgIC8qIEJ5IG1pc3Rha2UsIGBleHBhbnNpb25fZmFjdG9yJyBhcHBlYXJzIGJvdGggaW4gUFNfUHJpdmF0ZVJlYyAqLwogICAvKiBhbmQgQ0lEX0ZhY2VEaWN0UmVjIChib3RoIGFyZSBwdWJsaWMgaGVhZGVyIGZpbGVzIGFuZCBjYW4ndCAgKi8KLSAgLyogY2hhbmdlZCk7IHdlIHNpbXBseSBjb3B5IHRoZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGNoYW5nZWQpLiAgV2Ugc2ltcGx5IGNvcHkgdGhlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQorICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQogICBwYXJzZV9leHBhbnNpb25fZmFjdG9yKCBDSURfRmFjZSAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEX1BhcnNlciogIHBhcnNlciApCiAgIHsKQEAgLTI5Niw5ICszMjgsNDMgQEAKIAogICAgICAgZGljdC0+ZXhwYW5zaW9uX2ZhY3RvciAgICAgICAgICAgICAgPSBjaWRfcGFyc2VyX3RvX2ZpeGVkKCBwYXJzZXIsIDAgKTsKICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5leHBhbnNpb25fZmFjdG9yID0gZGljdC0+ZXhwYW5zaW9uX2ZhY3RvcjsKKworICAgICAgRlRfVFJBQ0U0KCggIiVsZFxuIiwgZGljdC0+ZXhwYW5zaW9uX2ZhY3RvciApKTsKICAgICB9CiAKLSAgICByZXR1cm4gRlRfRXJyX09rOworICAgIHJldHVybjsKKyAgfQorCisKKyAgLyogQnkgbWlzdGFrZSwgYENJRF9GYWNlRGljdFJlYycgZG9lc24ndCBjb250YWluIGEgZmllbGQgZm9yIHRoZSAqLworICAvKiBgRm9udE5hbWUnIGtleXdvcmQuICBGcmVlVHlwZSBkb2Vzbid0IG5lZWQgaXQsIGJ1dCBpdCBpcyBuaWNlICovCisgIC8qIHRvIGNhdGNoIGl0IGZvciBwcm9kdWNpbmcgYmV0dGVyIHRyYWNlIG91dHB1dC4gICAgICAgICAgICAgICAgKi8KKworICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQorICBwYXJzZV9mb250X25hbWUoIENJRF9GYWNlICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQorICB7CisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICBpZiAoIHBhcnNlci0+bnVtX2RpY3QgPj0gMCAmJiBwYXJzZXItPm51bV9kaWN0IDwgZmFjZS0+Y2lkLm51bV9kaWN0cyApCisgICAgeworICAgICAgVDFfVG9rZW5SZWMgIHRva2VuOworICAgICAgRlRfVUludCAgICAgIGxlbjsKKworCisgICAgICBjaWRfcGFyc2VyX3RvX3Rva2VuKCBwYXJzZXIsICZ0b2tlbiApOworCisgICAgICBsZW4gPSAoRlRfVUludCkoIHRva2VuLmxpbWl0IC0gdG9rZW4uc3RhcnQgKTsKKyAgICAgIGlmICggbGVuICkKKyAgICAgICAgRlRfVFJBQ0U0KCggIiAlLipzXG4iLCBsZW4sIHRva2VuLnN0YXJ0ICkpOworICAgICAgZWxzZQorICAgICAgICBGVF9UUkFDRTQoKCAiIDxubyB2YWx1ZT5cbiIgKSk7CisgICAgfQorI2Vsc2UKKyAgICBGVF9VTlVTRUQoIGZhY2UgKTsKKyAgICBGVF9VTlVTRUQoIHBhcnNlciApOworI2VuZGlmCisKKyAgICByZXR1cm47CiAgIH0KIAogCkBAIC0zMTEsNiArMzc3LDcgQEAKICAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkZEQXJyYXkiLCAgICAgICAgIHBhcnNlX2ZkX2FycmF5LCAwICkKICAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkZvbnRNYXRyaXgiLCAgICAgIGNpZF9wYXJzZV9mb250X21hdHJpeCwgMCApCiAgICAgVDFfRklFTERfQ0FMTEJBQ0soICJFeHBhbnNpb25GYWN0b3IiLCBwYXJzZV9leHBhbnNpb25fZmFjdG9yLCAwICkKKyAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkZvbnROYW1lIiwgICAgICAgIHBhcnNlX2ZvbnRfbmFtZSwgMCApCiAKICAgICB7IDAsIFQxX0ZJRUxEX0xPQ0FUSU9OX0NJRF9JTkZPLCBUMV9GSUVMRF9UWVBFX05PTkUsIDAsIDAsIDAsIDAsIDAsIDAgfQogICB9OwpAQCAtMzU2LDcgKzQyMywxNiBAQAogICAgICAgICAgICAgLyogaWYgL0ZEQXJyYXkgd2FzIGZvdW5kLCB0aGVuIGNpZC0+bnVtX2RpY3RzIGlzID4gMCwgYW5kICovCiAgICAgICAgICAgICAvKiB3ZSBjYW4gc3RhcnQgaW5jcmVhc2luZyBwYXJzZXItPm51bV9kaWN0ICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICggZmFjZS0+Y2lkLm51bV9kaWN0cyA+IDAgKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICBwYXJzZXItPm51bV9kaWN0Kys7CisKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIEZvbnREaWN0ICVkIiwgcGFyc2VyLT5udW1fZGljdCApKTsKKyAgICAgICAgICAgICAgaWYgKCBwYXJzZXItPm51bV9kaWN0ID4gZmFjZS0+Y2lkLm51bV9kaWN0cyApCisgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAoaWdub3JlZCkiICkpOworICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOworI2VuZGlmCisgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTYzOSw3ICs3MTUsNyBAQAogICAgICAgaWYgKCBmdF9pc2RpZ2l0KCAqcCApICkKICAgICAgICAgdmFsID0gKEZUX0J5dGUpKCAqcCAtICcwJyApOwogICAgICAgZWxzZSBpZiAoICpwID49ICdhJyAmJiAqcCA8PSAnZicgKQotICAgICAgICB2YWwgPSAoRlRfQnl0ZSkoICpwIC0gJ2EnICk7CisgICAgICAgIHZhbCA9IChGVF9CeXRlKSggKnAgLSAnYScgKyAxMCApOwogICAgICAgZWxzZSBpZiAoICpwID49ICdBJyAmJiAqcCA8PSAnRicgKQogICAgICAgICB2YWwgPSAoRlRfQnl0ZSkoICpwIC0gJ0EnICsgMTAgKTsKICAgICAgIGVsc2UgaWYgKCAqcCA9PSAnICcgIHx8CkBAIC03MjgsNyArODA0LDcgQEAKICAgICAgICAgICAgICBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZSAtIHBhcnNlci0+ZGF0YV9vZmZzZXQgKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTAoKCAiY2lkX2ZhY2Vfb3BlbjogYWRqdXN0aW5nIGxlbmd0aCBvZiBiaW5hcnkgZGF0YVxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgKGZyb20gJWQgdG8gJWQgYnl0ZXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgKGZyb20gJWxkIHRvICVsZCBieXRlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+YmluYXJ5X2xlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5zdHJlYW0tPnNpemUgLSBwYXJzZXItPmRhdGFfb2Zmc2V0ICkpOwogICAgICAgICBwYXJzZXItPmJpbmFyeV9sZW5ndGggPSBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZSAtCkBAIC03NTcsNyArODMzLDcgQEAKIAogICAgIGlmICggY2lkLT5mZF9ieXRlcyA8IDAgfHwgY2lkLT5nZF9ieXRlcyA8IDEgKQogICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiIKKyAgICAgIEZUX0VSUk9SKCggImNpZF9mYWNlX29wZW46IgogICAgICAgICAgICAgICAgICAiIEludmFsaWQgYEZEQnl0ZXMnIG9yIGBHREJ5dGVzJyB2YWx1ZVxuIiApKTsKICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgIGdvdG8gRXhpdDsKQEAgLTc2Niw3ICs4NDIsNyBAQAogICAgIC8qIGFsbG93IGF0IG1vc3QgMzJiaXQgb2Zmc2V0cyAqLwogICAgIGlmICggY2lkLT5mZF9ieXRlcyA+IDQgfHwgY2lkLT5nZF9ieXRlcyA+IDQgKQogICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiIKKyAgICAgIEZUX0VSUk9SKCggImNpZF9mYWNlX29wZW46IgogICAgICAgICAgICAgICAgICAiIFZhbHVlcyBvZiBgRkRCeXRlcycgb3IgYEdEQnl0ZXMnIGxhcmdlciB0aGFuIDRcbiIKICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICIKICAgICAgICAgICAgICAgICAgIiBhcmUgbm90IHN1cHBvcnRlZFxuIiApKTsKQEAgLTc4MiwxNyArODU4LDM2IEBACiAgICAgICBDSURfRmFjZURpY3QgIGRpY3QgPSBjaWQtPmZvbnRfZGljdHMgKyBuOwogCiAKKyAgICAgIC8qIHRoZSB1cHBlciBsaW1pdHMgYXJlIGFkLWhvYyB2YWx1ZXMgKi8KKyAgICAgIGlmICggZGljdC0+cHJpdmF0ZV9kaWN0LmJsdWVfc2hpZnQgPiAxMDAwIHx8CisgICAgICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5ibHVlX3NoaWZ0IDwgMCAgICApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMigoICJjaWRfZmFjZV9vcGVuOiIKKyAgICAgICAgICAgICAgICAgICAgIiBzZXR0aW5nIHVubGlrZWx5IEJsdWVTaGlmdCB2YWx1ZSAlZCB0byBkZWZhdWx0ICg3KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGljdC0+cHJpdmF0ZV9kaWN0LmJsdWVfc2hpZnQgKSk7CisgICAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5ibHVlX3NoaWZ0ID0gNzsKKyAgICAgIH0KKworICAgICAgaWYgKCBkaWN0LT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6ID4gMTAwMCB8fAorICAgICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6IDwgMCAgICApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMigoICJjaWRfZmFjZV9vcGVuOiIKKyAgICAgICAgICAgICAgICAgICAgIiBzZXR0aW5nIHVubGlrZWx5IEJsdWVGdXp6IHZhbHVlICVkIHRvIGRlZmF1bHQgKDEpXG4iLAorICAgICAgICAgICAgICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6ICkpOworICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6ID0gMTsKKyAgICAgIH0KKwogICAgICAgaWYgKCBkaWN0LT5zZF9ieXRlcyA8IDAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAoIGRpY3QtPm51bV9zdWJycyAmJiBkaWN0LT5zZF9ieXRlcyA8IDEgKSApCiAgICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBTREJ5dGVzJyB2YWx1ZVxuIiApKTsKKyAgICAgICAgRlRfRVJST1IoKCAiY2lkX2ZhY2Vfb3BlbjogSW52YWxpZCBgU0RCeXRlcycgdmFsdWVcbiIgKSk7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogCiAgICAgICBpZiAoIGRpY3QtPnNkX2J5dGVzID4gNCApCiAgICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiIKKyAgICAgICAgRlRfRVJST1IoKCAiY2lkX2ZhY2Vfb3BlbjoiCiAgICAgICAgICAgICAgICAgICAgIiBWYWx1ZXMgb2YgYFNEQnl0ZXMnIGxhcmdlciB0aGFuIDQiCiAgICAgICAgICAgICAgICAgICAgIiBhcmUgbm90IHN1cHBvcnRlZFxuIiApKTsKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwpAQCAtODAxLDcgKzg5Niw3IEBACiAKICAgICAgIGlmICggZGljdC0+c3Vicm1hcF9vZmZzZXQgPiBiaW5hcnlfbGVuZ3RoICkKICAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlX2RpY3Q6IEludmFsaWQgYFN1YnJNYXBPZmZzZXQnIHZhbHVlXG4iICkpOworICAgICAgICBGVF9FUlJPUigoICJjaWRfZmFjZV9vcGVuOiBJbnZhbGlkIGBTdWJyTWFwT2Zmc2V0JyB2YWx1ZVxuIiApKTsKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CkBAIC04MTIsNyArOTA3LDcgQEAKICAgICAgICAgICAgICBkaWN0LT5udW1fc3VicnMgPiAoIGJpbmFyeV9sZW5ndGggLSBkaWN0LT5zdWJybWFwX29mZnNldCApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWRpY3QtPnNkX2J5dGVzICAgICAgICAgICAgICAgICApICkKICAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlX2RpY3Q6IEludmFsaWQgYFN1YnJDb3VudCcgdmFsdWVcbiIgKSk7CisgICAgICAgIEZUX0VSUk9SKCggImNpZF9mYWNlX29wZW46IEludmFsaWQgYFN1YnJDb3VudCcgdmFsdWVcbiIgKSk7CiAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQpAQCAtODIwLDcgKzkxNSw3IEBACiAKICAgICBpZiAoIGNpZC0+Y2lkbWFwX29mZnNldCA+IGJpbmFyeV9sZW5ndGggKQogICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBDSURNYXBPZmZzZXQnIHZhbHVlXG4iICkpOworICAgICAgRlRfRVJST1IoKCAiY2lkX2ZhY2Vfb3BlbjogSW52YWxpZCBgQ0lETWFwT2Zmc2V0JyB2YWx1ZVxuIiApKTsKICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKICAgICAgIGdvdG8gRXhpdDsKICAgICB9CkBAIC04MjksNyArOTI0LDcgQEAKICAgICAgICAgIGNpZC0+Y2lkX2NvdW50ID4KICAgICAgICAgICAgKCBiaW5hcnlfbGVuZ3RoIC0gY2lkLT5jaWRtYXBfb2Zmc2V0ICkgLyBlbnRyeV9sZW4gKQogICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9kaWN0OiBJbnZhbGlkIGBDSURDb3VudCcgdmFsdWVcbiIgKSk7CisgICAgICBGVF9FUlJPUigoICJjaWRfZmFjZV9vcGVuOiBJbnZhbGlkIGBDSURDb3VudCcgdmFsdWVcbiIgKSk7CiAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CiAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRsb2FkLmggYi9zcmMvY2lkL2NpZGxvYWQuaAppbmRleCAzZjhiZDA4Li4wNmZiOWVmIDEwMDY0NAotLS0gYS9zcmMvY2lkL2NpZGxvYWQuaAorKysgYi9zcmMvY2lkL2NpZGxvYWQuaApAQCAtMSwyNyArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRC1rZXllZCBUeXBlMSBmb250IGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogY2lkbG9hZC5oCisgKgorICogICBDSUQta2V5ZWQgVHlwZTEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBDSURMT0FEX0hfCiAjZGVmaW5lIENJRExPQURfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KICNpbmNsdWRlICJjaWRwYXJzZS5oIgogCiAKZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkb2Jqcy5jIGIvc3JjL2NpZC9jaWRvYmpzLmMKaW5kZXggNzdhZmUxYy4uMDRiMjk1ZSAxMDA2NDQKLS0tIGEvc3JjL2NpZC9jaWRvYmpzLmMKKysrIGIvc3JjL2NpZC9jaWRvYmpzLmMKQEAgLTEsNTYgKzEsNTYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNpZG9ianMuYworICoKKyAqICAgQ0lEIG9iamVjdHMgbWFuYWdlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKICNpbmNsdWRlICJjaWRnbG9hZC5oIgogI2luY2x1ZGUgImNpZGxvYWQuaCIKIAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotI2luY2x1ZGUgRlRfRFJJVkVSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKICNpbmNsdWRlICJjaWRlcnJzLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkb2JqcworI2RlZmluZSBGVF9DT01QT05FTlQgIGNpZG9ianMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIGNpZF9zbG90X2RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApCiAgIHsKLSAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSBOVUxMOworICAgIGlmICggc2xvdC0+aW50ZXJuYWwgKQorICAgICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gTlVMTDsKICAgfQogCiAKQEAgLTg1LDExICs4NSwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSAgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAKICAgc3RhdGljIFBTSF9HbG9iYWxzX0Z1bmNzCkBAIC0xNzQsMjMgKzE3NCwyNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDRSAgRlVOQ1RJT05TCisgICAqCisgICAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mYWNlX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBwb2ludGVyIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBjaWRfZmFjZV9kb25lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBGaW5hbGl6ZXMgYSBnaXZlbiBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIGNpZF9mYWNlX2RvbmUoIEZUX0ZhY2UgIGNpZGZhY2UgKSAgICAgICAgIC8qIENJRF9GYWNlICovCiAgIHsKQEAgLTI1MiwyOSArMjUzLDM0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mYWNlX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gQ0lEIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIHNvdXJjZSBmb250IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IE51bWJlciBvZiBhZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIG5ld2x5IGJ1aWx0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBjaWRfZmFjZV9pbml0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplcyBhIGdpdmVuIENJRCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmb250IHN0cmVhbS4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuCisgICAqCisgICAqICAgbnVtX3BhcmFtcyA6OgorICAgKiAgICAgTnVtYmVyIG9mIGFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4KKyAgICoKKyAgICogICBwYXJhbXMgOjoKKyAgICogICAgIEFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBuZXdseSBidWlsdCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIGNpZF9mYWNlX2luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgY2lkZmFjZSwgICAgICAgIC8qIENJRF9GYWNlICovCkBAIC00NDksMjAgKzQ1NSwyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWRfZHJpdmVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIENJRCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2lkX2RyaXZlcl9pbml0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplcyBhIGdpdmVuIENJRCBkcml2ZXIgb2JqZWN0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZHJpdmVyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBjaWRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICkKICAgewpAQCAtNTA1LDE3ICs1MTIsMTggQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2lkX2RyaXZlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gQ0lEIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgQ0lEIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGNpZF9kcml2ZXJfZG9uZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRmluYWxpemVzIGEgZ2l2ZW4gQ0lEIGRyaXZlci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRyaXZlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBDSUQgZHJpdmVyLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgY2lkX2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIGRyaXZlciApCiAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkb2Jqcy5oIGIvc3JjL2NpZC9jaWRvYmpzLmgKaW5kZXggMDIyMWYwMS4uNmFlMzA2MSAxMDA2NDQKLS0tIGEvc3JjL2NpZC9jaWRvYmpzLmgKKysrIGIvc3JjL2NpZC9jaWRvYmpzLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZG9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNpZG9ianMuaAorICoKKyAqICAgQ0lEIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENJRE9CSlNfSF8KQEAgLTIxLDkgKzIxLDkgQEAKIAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtMzQsNjAgKzM0LDYwIEBACiAgIHR5cGVkZWYgc3RydWN0IENJRF9HbHlwaF9IaW50c18gIENJRF9HbHlwaF9IaW50czsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBUeXBlOgorICAgKiAgIENJRF9Ecml2ZXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGRyaXZlciBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBDSURfRHJpdmVyUmVjXyogIENJRF9Ecml2ZXI7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFR5cGUgMSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAVHlwZToKKyAgICogICBDSURfU2l6ZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgc2l6ZSBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBDSURfU2l6ZVJlY18qICBDSURfU2l6ZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBUeXBlOgorICAgKiAgIENJRF9HbHlwaFNsb3QKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGdseXBoIHNsb3Qgb2JqZWN0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0dseXBoU2xvdFJlY18qICBDSURfR2x5cGhTbG90OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFR5cGUgMSBmb3JtYXQgZG9lc24ndCB1c2UgYSBjaGFybWFwIGJ1dCBhbiBlbmNvZGluZyB0YWJsZS4gICAgICovCi0gIC8qICAgIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB1cCBjaGFybWFwIG9iamVjdHMgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAVHlwZToKKyAgICogICBDSURfQ2hhck1hcAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGUgVHlwZSAxIGZvcm1hdCBkb2Vzbid0IHVzZSBhIGNoYXJtYXAgYnV0IGFuIGVuY29kaW5nIHRhYmxlLgorICAgKiAgIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB1cCBjaGFybWFwIG9iamVjdHMKKyAgICogICBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHRhYmxlcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IENJRF9DaGFyTWFwUmVjXyogIENJRF9DaGFyTWFwOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIRVJFIEJFR0lOUyBUSEUgVFlQRSAxIFNQRUNJRklDIFNUVUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSEVSRSBCRUdJTlMgVEhFIFRZUEUgMSBTUEVDSUZJQyBTVFVGRgorICAgKgorICAgKi8KIAogCiAgIHR5cGVkZWYgc3RydWN0ICBDSURfU2l6ZVJlY18KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkcGFyc2UuYyBiL3NyYy9jaWQvY2lkcGFyc2UuYwppbmRleCBiMWM3ZjNjLi4xZmMwOThiIDEwMDY0NAotLS0gYS9zcmMvY2lkL2NpZHBhcnNlLmMKKysrIGIvc3JjL2NpZC9jaWRwYXJzZS5jCkBAIC0xLDM5ICsxLDM4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIHBhcnNlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaWRwYXJzZS5jCisgKgorICogICBDSUQta2V5ZWQgVHlwZTEgcGFyc2VyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgogCiAjaW5jbHVkZSAiY2lkcGFyc2UuaCIKIAogI2luY2x1ZGUgImNpZGVycnMuaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jaWRwYXJzZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGNpZHBhcnNlCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3NyYy9jaWQvY2lkcGFyc2UuaCBiL3NyYy9jaWQvY2lkcGFyc2UuaAppbmRleCA2MTYwMmY3Li4wYjQ5YmViIDEwMDY0NAotLS0gYS9zcmMvY2lkL2NpZHBhcnNlLmgKKysrIGIvc3JjL2NpZC9jaWRwYXJzZS5oCkBAIC0xLDYzICsxLDcwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRwYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIHBhcnNlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBjaWRwYXJzZS5oCisgKgorICogICBDSUQta2V5ZWQgVHlwZTEgcGFyc2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQ0lEUEFSU0VfSF8KICNkZWZpbmUgQ0lEUEFSU0VfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9QYXJzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgQ0lEX1BhcnNlciBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250cyB2ZXJ5ICAgICAgICAqLwotICAvKiAgICBxdWlja2x5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgICA6OiBUaGUgcm9vdCBQU19QYXJzZXJSZWMgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgICAgIDo6IFRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdCAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhcnNlZC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X2xlbiA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHBhcnNlZC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGFfb2Zmc2V0ICAgIDo6IFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgYmluYXJ5IGRhdGEgKGkuZS4sIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbmQgb2YgdGhlIGRhdGEgdG8gYmUgcGFyc2VkLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpbmFyeV9sZW5ndGggIDo6IFRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYWZ0ZXIgdGhlIGBTdGFydERhdGEnICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlmIHRoZSBkYXRhIGZvcm1hdCBpcyBoZXhhZGVjaW1hbC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZCAgICAgICAgICAgIDo6IEEgc3RydWN0dXJlIHdoaWNoIGhvbGRzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9kaWN0ICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZm9udCBkaWN0aW9uYXJpZXMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBTdHJ1Y3Q6CisgICAqICAgQ0lEX1BhcnNlcgorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBDSURfUGFyc2VyIGlzIGFuIG9iamVjdCB1c2VkIHRvIHBhcnNlIGEgVHlwZSAxIGZvbnRzIHZlcnkKKyAgICogICBxdWlja2x5LgorICAgKgorICAgKiBARmllbGRzOgorICAgKiAgIHJvb3QgOjoKKyAgICogICAgIFRoZSByb290IFBTX1BhcnNlclJlYyBmaWVsZHMuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgY3VycmVudCBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqICAgcG9zdHNjcmlwdCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGJlIHBhcnNlZC4KKyAgICoKKyAgICogICBwb3N0c2NyaXB0X2xlbiA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXJzZWQuCisgICAqCisgICAqICAgZGF0YV9vZmZzZXQgOjoKKyAgICogICAgIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgYmluYXJ5IGRhdGEgKGkuZS4sIHRoZQorICAgKiAgICAgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHBhcnNlZC4KKyAgICoKKyAgICogICBiaW5hcnlfbGVuZ3RoIDo6CisgICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGFmdGVyIHRoZSBgU3RhcnREYXRhJworICAgKiAgICAgY29tbWFuZCBpZiB0aGUgZGF0YSBmb3JtYXQgaXMgaGV4YWRlY2ltYWwuCisgICAqCisgICAqICAgY2lkIDo6CisgICAqICAgICBBIHN0cnVjdHVyZSB3aGljaCBob2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICogICAgIHRoZSBjdXJyZW50IGZvbnQuCisgICAqCisgICAqICAgbnVtX2RpY3QgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZm9udCBkaWN0aW9uYXJpZXMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgQ0lEX1BhcnNlcl8KICAgewogICAgIFBTX1BhcnNlclJlYyAgcm9vdDsKQEAgLTg2LDExICs5MywxMSBAQAogICBjaWRfcGFyc2VyX2RvbmUoIENJRF9QYXJzZXIqICBwYXJzZXIgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSU0lORyBST1VUSU5FUworICAgKgorICAgKi8KIAogI2RlZmluZSBjaWRfcGFyc2VyX3NraXBfc3BhY2VzKCBwICkgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAocCktPnJvb3QuZnVuY3Muc2tpcF9zcGFjZXMoICYocCktPnJvb3QgKQpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRyaXZlci5jIGIvc3JjL2NpZC9jaWRyaXZlci5jCmluZGV4IGQ5ZmFmMzUuLmQwOGNlYTEgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvY2lkcml2ZXIuYworKysgYi9zcmMvY2lkL2NpZHJpdmVyLmMKQEAgLTEsNTEgKzEsNTAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHJpdmVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNpZHJpdmVyLmMKKyAqCisgKiAgIENJRCBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgImNpZHJpdmVyLmgiCiAjaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfUFJPUFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oPgogCiAjaW5jbHVkZSAiY2lkZXJycy5oIgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQ0lEX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkZHJpdmVyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2lkZHJpdmVyCiAKIAogICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKKyAgICogUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTY5LDcgKzY4LDcgQEAKIAogCiAgIC8qCi0gICAqICBQT1NUU0NSSVBUIElORk8gU0VSVklDRQorICAgKiBQT1NUU0NSSVBUIElORk8gU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMTA1LDcgKzEwNCw3IEBACiAKIAogICAvKgotICAgKiAgQ0lEIElORk8gU0VSVklDRQorICAgKiBDSUQgSU5GTyBTRVJWSUNFCiAgICAqCiAgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKQEAgLTE3Myw3ICsxNzIsNyBAQAogCiAKICAgLyoKLSAgICogIFBST1BFUlRZIFNFUlZJQ0UKKyAgICogUFJPUEVSVFkgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMTg1LDcgKzE4NCw3IEBACiAKIAogICAvKgotICAgKiAgU0VSVklDRSBMSVNUCisgICAqIFNFUlZJQ0UgTElTVAogICAgKgogICAgKi8KIApkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWRyaXZlci5oIGIvc3JjL2NpZC9jaWRyaXZlci5oCmluZGV4IDU5ZDlkZWQuLjBmYzhlZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvY2lkcml2ZXIuaAorKysgYi9zcmMvY2lkL2NpZHJpdmVyLmgKQEAgLTEsNDAgKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIENJRCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNpZHJpdmVyLmgKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgQ0lEIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBDSURSSVZFUl9IXwogI2RlZmluZSBDSURSSVZFUl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQogICBGVF9DQUxMQkFDS19UQUJMRQogICBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgIHQxY2lkX2RyaXZlcl9jbGFzczsKIAotCiBGVF9FTkRfSEVBREVSCiAKICNlbmRpZiAvKiBDSURSSVZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2NpZC9jaWR0b2tlbi5oIGIvc3JjL2NpZC9jaWR0b2tlbi5oCmluZGV4IGIwZTJkYWMuLmU5ZjA2OGIgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvY2lkdG9rZW4uaAorKysgYi9zcmMvY2lkL2NpZHRva2VuLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHRva2VuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgdG9rZW4gZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNpZHRva2VuLmgKKyAqCisgKiAgIENJRCB0b2tlbiBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICN1bmRlZiAgRlRfU1RSVUNUVVJFCkBAIC0yMSwxNyArMjEsMjAgQEAKICN1bmRlZiAgVDFDT0RFCiAjZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fQ0lEX0lORk8KIAotICBUMV9GSUVMRF9LRVkgICAoICJDSURGb250TmFtZSIsICAgIGNpZF9mb250X25hbWUsIDAgKQotICBUMV9GSUVMRF9GSVhFRCAoICJDSURGb250VmVyc2lvbiIsIGNpZF92ZXJzaW9uLCAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURGb250VHlwZSIsICAgIGNpZF9mb250X3R5cGUsIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJSZWdpc3RyeSIsICAgICAgIHJlZ2lzdHJ5LCAgICAgIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJPcmRlcmluZyIsICAgICAgIG9yZGVyaW5nLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJTdXBwbGVtZW50IiwgICAgIHN1cHBsZW1lbnQsICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJVSURCYXNlIiwgICAgICAgIHVpZF9iYXNlLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURNYXBPZmZzZXQiLCAgIGNpZG1hcF9vZmZzZXQsIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJGREJ5dGVzIiwgICAgICAgIGZkX2J5dGVzLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJHREJ5dGVzIiwgICAgICAgIGdkX2J5dGVzLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAoICJDSURDb3VudCIsICAgICAgIGNpZF9jb3VudCwgICAgIDAgKQorICBUMV9GSUVMRF9LRVkgICAgICAoICJDSURGb250TmFtZSIsICAgIGNpZF9mb250X25hbWUsIDAgKQorICBUMV9GSUVMRF9GSVhFRCAgICAoICJDSURGb250VmVyc2lvbiIsIGNpZF92ZXJzaW9uLCAgIDAgKQorICBUMV9GSUVMRF9OVU0gICAgICAoICJDSURGb250VHlwZSIsICAgIGNpZF9mb250X3R5cGUsIDAgKQorICBUMV9GSUVMRF9TVFJJTkcgICAoICJSZWdpc3RyeSIsICAgICAgIHJlZ2lzdHJ5LCAgICAgIDAgKQorICBUMV9GSUVMRF9TVFJJTkcgICAoICJPcmRlcmluZyIsICAgICAgIG9yZGVyaW5nLCAgICAgIDAgKQorICBUMV9GSUVMRF9OVU0gICAgICAoICJTdXBwbGVtZW50IiwgICAgIHN1cHBsZW1lbnQsICAgIDAgKQorICBUMV9GSUVMRF9OVU0gICAgICAoICJVSURCYXNlIiwgICAgICAgIHVpZF9iYXNlLCAgICAgIDAgKQorCisgIFQxX0ZJRUxEX05VTV9UQUJMRSggIlhVSUQiLCAgICAgICAgICAgeHVpZCwgICAgICAgICAgMTYsIDAgKQorCisgIFQxX0ZJRUxEX05VTSAgICAgICggIkNJRE1hcE9mZnNldCIsICAgY2lkbWFwX29mZnNldCwgMCApCisgIFQxX0ZJRUxEX05VTSAgICAgICggIkZEQnl0ZXMiLCAgICAgICAgZmRfYnl0ZXMsICAgICAgMCApCisgIFQxX0ZJRUxEX05VTSAgICAgICggIkdEQnl0ZXMiLCAgICAgICAgZ2RfYnl0ZXMsICAgICAgMCApCisgIFQxX0ZJRUxEX05VTSAgICAgICggIkNJRENvdW50IiwgICAgICAgY2lkX2NvdW50LCAgICAgMCApCiAKIAogI3VuZGVmICBGVF9TVFJVQ1RVUkUKZGlmZiAtLWdpdCBhL3NyYy9jaWQvbW9kdWxlLm1rIGIvc3JjL2NpZC9tb2R1bGUubWsKaW5kZXggOTAxMGUzMy4uOWZiMDIyMyAxMDA2NDQKLS0tIGEvc3JjL2NpZC9tb2R1bGUubWsKKysrIGIvc3JjL2NpZC9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy9jaWQvcnVsZXMubWsgYi9zcmMvY2lkL3J1bGVzLm1rCmluZGV4IDk0MzMzYmQuLjk0ZjY2M2MgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvcnVsZXMubWsKKysrIGIvc3JjL2NpZC9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL2NpZC90eXBlMWNpZC5jIGIvc3JjL2NpZC90eXBlMWNpZC5jCmluZGV4IDYxNzcwZTMuLjA4MmU4YmYgMTAwNjQ0Ci0tLSBhL3NyYy9jaWQvdHlwZTFjaWQuYworKysgYi9zcmMvY2lkL3R5cGUxY2lkLmMKQEAgLTEsMjMgKzEsMjIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR5cGUxY2lkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR5cGUxY2lkLmMKKyAqCisgKiAgIEZyZWVUeXBlIE9wZW5UeXBlIGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAjaW5jbHVkZSAiY2lkZ2xvYWQuYyIKICNpbmNsdWRlICJjaWRsb2FkLmMiCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9KYW1maWxlIGIvc3JjL2d4dmFsaWQvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmM2M1MS4uMDAwMDAwMAotLS0gYS9zcmMvZ3h2YWxpZC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9neHZhbGlkIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDUtMjAxOCBieQotIyBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWQgSGF0IEsuSy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGd4dmFsaWQgOwotCi0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gZ3h2YnNsbgotICAgICAgICAgICAgICAgZ3h2Y29tbW4KLSAgICAgICAgICAgICAgIGd4dmZlYXQKLSAgICAgICAgICAgICAgIGd4dmp1c3QKLSAgICAgICAgICAgICAgIGd4dmtlcm4KLSAgICAgICAgICAgICAgIGd4dmxjYXIKLSAgICAgICAgICAgICAgIGd4dm1vZAotICAgICAgICAgICAgICAgZ3h2bW9ydAotICAgICAgICAgICAgICAgZ3h2bW9ydDAKLSAgICAgICAgICAgICAgIGd4dm1vcnQxCi0gICAgICAgICAgICAgICBneHZtb3J0MgotICAgICAgICAgICAgICAgZ3h2bW9ydDQKLSAgICAgICAgICAgICAgIGd4dm1vcnQ1Ci0gICAgICAgICAgICAgICBneHZtb3J4Ci0gICAgICAgICAgICAgICBneHZtb3J4MAotICAgICAgICAgICAgICAgZ3h2bW9yeDEKLSAgICAgICAgICAgICAgIGd4dm1vcngyCi0gICAgICAgICAgICAgICBneHZtb3J4NAotICAgICAgICAgICAgICAgZ3h2bW9yeDUKLSAgICAgICAgICAgICAgIGd4dm9wYmQKLSAgICAgICAgICAgICAgIGd4dnByb3AKLSAgICAgICAgICAgICAgIGd4dnRyYWsKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IGd4dmFsaWQgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvZ3h2YWxpZCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9SRUFETUUgYi9zcmMvZ3h2YWxpZC9SRUFETUUKaW5kZXggYWY4MTI4ZS4uMmEzMmJhYiAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvUkVBRE1FCisrKyBiL3NyYy9neHZhbGlkL1JFQURNRQpAQCAtNTE4LDcgKzUxOCw3IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1Db3B5cmlnaHQgMjAwNC0yMDE4IGJ5CitDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIGhhdCBLLksuLAogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZhbGlkLmMgYi9zcmMvZ3h2YWxpZC9neHZhbGlkLmMKaW5kZXggZDA1NzdhMi4uNjgzYjhhNiAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2YWxpZC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dmFsaWQuYwpAQCAtMSwyNCArMSwyMyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2YWxpZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHZhbGlkYXRvciBmb3IgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChib2R5IG9ubHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQuYworICoKKyAqICAgRnJlZVR5cGUgdmFsaWRhdG9yIGZvciBUcnVlVHlwZUdYL0FBVCB0YWJsZXMgKGJvZHkgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAjaW5jbHVkZSAiZ3h2YnNsbi5jIgogI2luY2x1ZGUgImd4dmNvbW1uLmMiCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZhbGlkLmggYi9zcmMvZ3h2YWxpZC9neHZhbGlkLmgKaW5kZXggMTlmMDM3OS4uZmYyODEyZCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2YWxpZC5oCisrKyBiL3NyYy9neHZhbGlkL2d4dmFsaWQuaApAQCAtMSw0MCArMSwzOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2YWxpZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIHRhYmxlIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQuaAorICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgdGFibGUgdmFsaWRhdGlvbiAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2lmbmRlZiBHWFZBTElEX0hfCiAjZGVmaW5lIEdYVkFMSURfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KIAotI2luY2x1ZGUgImd4dmVycm9yLmgiICAgICAgICAgIC8qIG11c3QgY29tZSBiZWZvcmUgRlRfSU5URVJOQUxfVkFMSURBVEVfSCAqLworI2luY2x1ZGUgImd4dmVycm9yLmgiICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGJlZm9yZSBgZnR2YWxpZC5oJyAqLwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2YnNsbi5jIGIvc3JjL2d4dmFsaWQvZ3h2YnNsbi5jCmluZGV4IGMzNjdkMzguLmFjNThkNDYgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dmJzbG4uYworKysgYi9zcmMvZ3h2YWxpZC9neHZic2xuLmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmJzbG4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBic2xuIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZic2xuLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIGJzbG4gdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZhbGlkLmgiCiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZic2xuCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2YnNsbgogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZjb21tbi5jIGIvc3JjL2d4dmFsaWQvZ3h2Y29tbW4uYwppbmRleCBiOTY2MDExLi5lYWQwZjI0IDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZjb21tbi5jCisrKyBiL3NyYy9neHZhbGlkL2d4dmNvbW1uLmMKQEAgLTEsNDEgKzEsNDEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmNvbW1uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZjb21tbi5jCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZjb21tb24KKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZjb21tb24KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzg0LDggKzM4NCw4IEBACiAgICAgICAgICAgKCBQICs9IDIsIGd4dl9sb29rdXBfdmFsdWVfbG9hZCggUCAtIDIsIFNJR05TUEVDICkgKQogCiAgIHN0YXRpYyBHWFZfTG9va3VwVmFsdWVEZXNjCi0gIGd4dl9sb29rdXBfdmFsdWVfbG9hZCggRlRfQnl0ZXMgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIHNpZ25zcGVjICkKKyAgZ3h2X2xvb2t1cF92YWx1ZV9sb2FkKCBGVF9CeXRlcyAgICAgICAgICAgICAgICAgIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX0xvb2t1cFZhbHVlX1NpZ25TcGVjICBzaWduc3BlYyApCiAgIHsKICAgICBHWFZfTG9va3VwVmFsdWVEZXNjICB2OwogCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZjb21tbi5oIGIvc3JjL2d4dmFsaWQvZ3h2Y29tbW4uaAppbmRleCA4ZTRmZjljLi41OWQxNDkyIDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZjb21tbi5oCisrKyBiL3NyYy9neHZhbGlkL2d4dmNvbW1uLmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmNvbW1uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZjb21tbi5oCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAgIC8qCiAgICAqIGtleXdvcmRzIGluIHZhcmlhYmxlIG5hbWluZwogICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICogIHRhYmxlOiBPZiB0eXBlIEZUX0J5dGVzLCBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhpcyB0YWJsZS9zdWJ0YWJsZS4KLSAgICogIGxpbWl0OiBPZiB0eXBlIEZUX0J5dGVzLCBwb2ludGluZyB0byB0aGUgZW5kIG9mIHRoaXMgdGFibGUvc3VidGFibGUsCisgICAqIHRhYmxlOiAgT2YgdHlwZSBGVF9CeXRlcywgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgdGFibGUvc3VidGFibGUuCisgICAqIGxpbWl0OiAgT2YgdHlwZSBGVF9CeXRlcywgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGlzIHRhYmxlL3N1YnRhYmxlLAogICAgKiAgICAgICAgIGluY2x1ZGluZyBwYWRkaW5nIGZvciBhbGlnbm1lbnQuCi0gICAqICBvZmZzZXQ6IE9mIHR5cGUgRlRfVUludCwgdGhlIG51bWJlciBvZiBvY3RldHMgZnJvbSB0aGUgc3RhcnQgdG8gdGFyZ2V0LgotICAgKiAgbGVuZ3RoOiBPZiB0eXBlIEZUX1VJbnQsIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGZyb20gdGhlIHN0YXJ0IHRvIHRoZQotICAgKiAgICAgICAgICBlbmQgaW4gdGhpcyB0YWJsZS9zdWJ0YWJsZSwgaW5jbHVkaW5nIHBhZGRpbmcgZm9yIGFsaWdubWVudC4KKyAgICogb2Zmc2V0OiBPZiB0eXBlIEZUX1VJbnQsIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGZyb20gdGhlIHN0YXJ0IHRvIHRhcmdldC4KKyAgICogbGVuZ3RoOiBPZiB0eXBlIEZUX1VJbnQsIHRoZSBudW1iZXIgb2Ygb2N0ZXRzIGZyb20gdGhlIHN0YXJ0IHRvIHRoZQorICAgKiAgICAgICAgIGVuZCBpbiB0aGlzIHRhYmxlL3N1YnRhYmxlLCBpbmNsdWRpbmcgcGFkZGluZyBmb3IgYWxpZ25tZW50LgogICAgKgogICAgKiAgX01JTiwgX01BWDogU2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB0YWlsIG9mIG1hY3JvcywgYXMgSU5UX01JTiwgZXRjLgogICAgKi8KQEAgLTQzLDEwICs0Myw5IEBACiAjZGVmaW5lIEdYVkNPTU1OX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAiZ3h2YWxpZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c25hbWVzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZlcnJvci5oIGIvc3JjL2d4dmFsaWQvZ3h2ZXJyb3IuaAppbmRleCBkMTE1MTI1Li41ZDhmMGI2IDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZlcnJvci5oCisrKyBiL3NyYy9neHZhbGlkL2d4dmVycm9yLmgKQEAgLTEsNDEgKzEsNDEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZlcnJvci5oCisgKgorICogICBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUgZXJyb3IgICAgICAqLwotICAvKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvcgorICAgKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIEdYVkVSUk9SX0hfCiAjZGVmaW5lIEdYVkVSUk9SX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC00Myw3ICs0Myw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIEdYVl9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfR1h2YWxpZAogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBHWFZFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZmZWF0LmMgYi9zcmMvZ3h2YWxpZC9neHZmZWF0LmMKaW5kZXggMmM4MDVkMS4uNDAwZWM4YSAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2ZmVhdC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dmZlYXQuYwpAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2ZmVhdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGZlYXQgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmZlYXQuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgZmVhdCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dmFsaWQuaCIKQEAgLTMwLDE0ICszMCwxNCBAQAogI2luY2x1ZGUgImd4dmZlYXQuaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZmZWF0CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2ZmVhdAogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZmZWF0LmggYi9zcmMvZ3h2YWxpZC9neHZmZWF0LmgKaW5kZXggMmQ5NDM4MC4uNDM1ZGNlZiAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2ZmVhdC5oCisrKyBiL3NyYy9neHZhbGlkL2d4dmZlYXQuaApAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2ZmVhdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGZlYXQgdGFibGUgdmFsaWRhdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmZlYXQuaAorICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgZmVhdCB0YWJsZSB2YWxpZGF0aW9uIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2lmbmRlZiBHWFZGRUFUX0hfCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZmZ2VuLmMgYi9zcmMvZ3h2YWxpZC9neHZmZ2VuLmMKaW5kZXggODQwYzBmMy4uZmUwNWE2ZiAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2Zmdlbi5jCisrKyBiL3NyYy9neHZhbGlkL2d4dmZnZW4uYwpAQCAtMSw2MiArMSw2MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3hmZ2VuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEdlbmVyYXRlIGZlYXR1cmUgcmVnaXN0cnkgZGF0YSBmb3IgZ3h2IGBmZWF0JyB2YWxpZGF0b3IuICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIHByb2dyYW0gaXMgZGVyaXZlZCBmcm9tIGd4ZmVhdHJlZy5jIGluIGd4bGF5b3V0LiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4Zmdlbi5jCisgKgorICogICBHZW5lcmF0ZSBmZWF0dXJlIHJlZ2lzdHJ5IGRhdGEgZm9yIGd4diBgZmVhdCcgdmFsaWRhdG9yLgorICogICBUaGlzIHByb2dyYW0gaXMgZGVyaXZlZCBmcm9tIGd4ZmVhdHJlZy5jIGluIGd4bGF5b3V0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuCisgKgorICogVGhpcyBmaWxlIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3hmZWF0cmVnLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERhdGFiYXNlIG9mIGZvbnQgZmVhdHVyZXMgcHJlLWRlZmluZWQgYnkgQXBwbGUgQ29tcHV0ZXIsIEluYy4gICAgICAgICovCi0vKiAgICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA5L0FwcGVuZGl4Ri5odG1sICovCi0vKiAgICAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4ZmVhdHJlZy5jCisgKgorICogICBEYXRhYmFzZSBvZiBmb250IGZlYXR1cmVzIHByZS1kZWZpbmVkIGJ5IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDkvQXBwZW5kaXhGLmh0bWwKKyAqICAgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAyMDAzIGJ5CisgKiBNYXNhdGFrZSBZQU1BVE8gYW5kIFJlZGhhdCBLLksuCisgKgorICogVGhpcyBmaWxlIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGZlYXRyZWcuYyBpcyBzdXBwb3J0ZWQgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBEZXZlbG9wbWVudCBvZiBneGZlYXRyZWcuYyBpcyBzdXBwb3J0ZWQgYnkKKyAqIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgUHJvbW90aW9uIEFnZW5jeSwgSmFwYW4uCisgKgorICovCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgYXMgYSBzdGFuZC1hbG9uZSBleGVjdXRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBmaWxlIGlzIG5ldmVyIGNvbXBpbGVkIGludG8gYGxpYmZyZWV0eXBlMicuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBvdXRwdXQgb2YgdGhpcyBmaWxlIGlzIHVzZWQgaW4gYGd4dmZlYXQuYycuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyogQ29tcGlsZTogZ2NjIGBwa2ctY29uZmlnIC0tY2ZsYWdzIGZyZWV0eXBlMmAgZ3h2Zmdlbi5jIC1vIGd4dmZnZW4gICAgICAgKi8KLS8qIFJ1bjogLi9neHZmZ2VuID4gdG1wLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFzIGEgc3RhbmQtYWxvbmUgZXhlY3V0YWJsZS4KKyAqIFRoaXMgZmlsZSBpcyBuZXZlciBjb21waWxlZCBpbnRvIGBsaWJmcmVldHlwZTInLgorICogVGhlIG91dHB1dCBvZiB0aGlzIGZpbGUgaXMgdXNlZCBpbiBgZ3h2ZmVhdC5jJy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb21waWxlOiBnY2MgYHBrZy1jb25maWcgLS1jZmxhZ3MgZnJlZXR5cGUyYCBneHZmZ2VuLmMgLW8gZ3h2ZmdlbgorICogUnVuOiAuL2d4dmZnZW4gPiB0bXAuYworICoKKyAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAgICovCiAKICAgLyoKICAgICogSWYgeW91IGFkZCBhIG5ldyBzZXR0aW5nIHRvIGEgZmVhdHVyZSwgY2hlY2sgdGhlIG51bWJlciBvZiBzZXR0aW5ncwpAQCAtNjUsOSArNjUsOSBAQAogICAgKi8KICNkZWZpbmUgRkVBVFJFR19NQVhfU0VUVElORyAgMTIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgICAqLwogCiAKICNpbmNsdWRlIDxzdGRpby5oPgpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2anVzdC5jIGIvc3JjL2d4dmFsaWQvZ3h2anVzdC5jCmluZGV4IDAwYzQyOTMuLjNjN2YxZjkgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dmp1c3QuYworKysgYi9zcmMvZ3h2YWxpZC9neHZqdXN0LmMKQEAgLTEsNDQgKzEsNDQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmp1c3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBqdXN0IHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZqdXN0LmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIGp1c3QgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZhbGlkLmgiCiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKIAotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzbmFtZXMuaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZqdXN0CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2anVzdAogCiAgIC8qCiAgICAqIHJlZmVycmVkIGBqdXN0JyB0YWJsZSBmb3JtYXQgc3BlY2lmaWNhdGlvbjoKQEAgLTcyLDYgKzcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgbXNnX3RhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgR1hWX1ZhbGlkYXRvciAgICAgZ3h2YWxpZCApCiAgIHsKKyAgICBGVF9VTlVTRUQoIG1zZ190YWcgKTsKKwogICAgIGlmICggZ2lkIDwgZ3h2YWxpZC0+ZmFjZS0+bnVtX2dseXBocyApCiAgICAgICByZXR1cm47CiAKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dmtlcm4uYyBiL3NyYy9neHZhbGlkL2d4dmtlcm4uYwppbmRleCA5YzBlZmQ3Li5jYzBiM2RmIDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZrZXJuLmMKKysrIGIvc3JjL2d4dmFsaWQvZ3h2a2Vybi5jCkBAIC0xLDQ1ICsxLDQ1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZrZXJuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQga2VybiB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2a2Vybi5jCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBrZXJuIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2YWxpZC5oIgogI2luY2x1ZGUgImd4dmNvbW1uLmgiCiAKLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzbmFtZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmg+CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2a2VybgorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dmtlcm4KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bGNhci5jIGIvc3JjL2d4dmFsaWQvZ3h2bGNhci5jCmluZGV4IDBmMjYxYTkuLjgyYWMxOTAgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dmxjYXIuYworKysgYi9zcmMvZ3h2YWxpZC9neHZsY2FyLmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dmxjYXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBsY2FyIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZsY2FyLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIGxjYXIgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZhbGlkLmgiCiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZsY2FyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2bGNhcgogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb2QuYyBiL3NyYy9neHZhbGlkL2d4dm1vZC5jCmluZGV4IDFhM2M4NjIuLmE0NjdlODcgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dm1vZC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vZC5jCkBAIC0xLDUwICsxLDQ5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUncyBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2bW9kLmMKKyAqCisgKiAgIEZyZWVUeXBlJ3MgVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0dYX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWJsZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGd4dmFsLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZneHZhbC5oPgogCiAjaW5jbHVkZSAiZ3h2bW9kLmgiCiAjaW5jbHVkZSAiZ3h2YWxpZC5oIgogI2luY2x1ZGUgImd4dmNvbW1uLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9kdWxlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2bW9kdWxlCiAKIAogICBzdGF0aWMgRlRfRXJyb3IKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vZC5oIGIvc3JjL2d4dmFsaWQvZ3h2bW9kLmgKaW5kZXggNzQ1YzYyZS4uZjI5ODJjOSAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9kLmgKKysrIGIvc3JjL2d4dmFsaWQvZ3h2bW9kLmgKQEAgLTEsNDQgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSdzIFRydWVUeXBlR1gvQUFUIHZhbGlkYXRpb24gbW9kdWxlIGltcGxlbWVudGF0aW9uICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2bW9kLmgKKyAqCisgKiAgIEZyZWVUeXBlJ3MgVHJ1ZVR5cGVHWC9BQVQgdmFsaWRhdGlvbiBtb2R1bGUgaW1wbGVtZW50YXRpb24KKyAqICAgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEdYVk1PRF9IXwogI2RlZmluZSBHWFZNT0RfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQogCiAgIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX01vZHVsZV9DbGFzcyApICBneHZfbW9kdWxlX2NsYXNzOwogCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0LmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J0LmMKaW5kZXggYjM2MWNiMi4uYWFlN2YwMSAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcnQuYwpAQCAtMSw0MiArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9ydC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnQgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnQuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dm1vcnQuaCIKICNpbmNsdWRlICJneHZmZWF0LmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9ydAorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dm1vcnQKIAogCiAgIHN0YXRpYyB2b2lkCkBAIC0xMjMsNiArMTIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKQogICB7CiAgICAgRlRfVU5VU0VEKCBneHZhbGlkICk7CisgICAgRlRfVU5VU0VEKCBjb3ZlcmFnZSApOwogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKICAgICBpZiAoIGNvdmVyYWdlICYgMHg4MDAwVSApCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0LmggYi9zcmMvZ3h2YWxpZC9neHZtb3J0LmgKaW5kZXggZDgwMzA2NC4uNzIzN2M1OCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydC5oCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcnQuaApAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9ydC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGNvbW1vbiBkZWZpbml0aW9uIGZvciBtb3J0IHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnQuaAorICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgY29tbW9uIGRlZmluaXRpb24gZm9yIG1vcnQgdGFibGUgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEdYVk1PUlRfSF8KQEAgLTMxLDcgKzMxLDEwIEBACiAjaW5jbHVkZSAiZ3h2YWxpZC5oIgogI2luY2x1ZGUgImd4dmNvbW1uLmgiCiAKLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c25hbWVzLmg+CisKKworRlRfQkVHSU5fSEVBREVSCiAKIAogICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnRfZmVhdHVyZVJlY18KQEAgLTg4LDYgKzkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdYVl9WYWxpZGF0b3IgIGd4dmFsaWQgKTsKIAogCitGVF9FTkRfSEVBREVSCisKICNlbmRpZiAvKiBHWFZNT1JUX0hfICovCiAKIApkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDAuYyBiL3NyYy9neHZhbGlkL2d4dm1vcnQwLmMKaW5kZXggOTVjZjUzZC4uZDQ1MmMxYyAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDAuYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J0MC5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J0MC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUwIChJbmRpYyBTY3JpcHQgUmVhcnJhbmdlbWVudCkgc3VidGFibGUuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnQwLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnQgdGFibGUgdmFsaWRhdGlvbgorICogICBib2R5IGZvciB0eXBlMCAoSW5kaWMgU2NyaXB0IFJlYXJyYW5nZW1lbnQpIHN1YnRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2bW9ydC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZtb3J0CiAKIAogICBzdGF0aWMgY29uc3QgY2hhciogR1hWX01vcnRfSW5kaWNTY3JpcHRfTXNnW10gPQpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYyBiL3NyYy9neHZhbGlkL2d4dm1vcnQxLmMKaW5kZXggYTc2ODNhMS4uZDc0M2Y4OSAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDEuYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J0MS5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J0MS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUxIChDb250ZXh0dWFsIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnQxLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnQgdGFibGUgdmFsaWRhdGlvbgorICogICBib2R5IGZvciB0eXBlMSAoQ29udGV4dHVhbCBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2bW9ydC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZtb3J0CiAKIAogICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnRfc3VidGFibGVfdHlwZTFfU3RhdGVPcHRSZWNfCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0Mi5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9ydDIuYwppbmRleCBjMjNjMjc3Li45ZTY5ZTEyIDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J0Mi5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcnQyLmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J0IHRhYmxlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYm9keSBmb3IgdHlwZTIgKExpZ2F0dXJlIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2bW9ydDIuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uCisgKiAgIGJvZHkgZm9yIHR5cGUyIChMaWdhdHVyZSBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2bW9ydC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZtb3J0CiAKIAogICB0eXBlZGVmIHN0cnVjdCAgR1hWX21vcnRfc3VidGFibGVfdHlwZTJfU3RhdGVPcHRSZWNfCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J0NC5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9ydDQuYwppbmRleCA5ZDIxYTVmLi40NTg0ZDIwIDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J0NC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcnQ0LmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnQ0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J0IHRhYmxlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYm9keSBmb3IgdHlwZTQgKE5vbi1Db250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbikgc3VidGFibGUuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2bW9ydDQuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uCisgKiAgIGJvZHkgZm9yIHR5cGU0IChOb24tQ29udGV4dHVhbCBHbHlwaCBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2bW9ydC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZtb3J0CiAKIAogICBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYyBiL3NyYy9neHZhbGlkL2d4dm1vcnQ1LmMKaW5kZXggNDJjYjQyOC4uYTE1YTI0ZiAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9ydDUuYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J0NS5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J0NS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9ydCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGU1IChDb250ZXh0dWFsIEdseXBoIEluc2VydGlvbikgc3VidGFibGUuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnQ1LmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnQgdGFibGUgdmFsaWRhdGlvbgorICogICBib2R5IGZvciB0eXBlNSAoQ29udGV4dHVhbCBHbHlwaCBJbnNlcnRpb24pIHN1YnRhYmxlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2bW9ydC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm1vcnQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZtb3J0CiAKIAogICAvKgpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9yeC5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9yeC5jCmluZGV4IDlmZDZlNmIuLjc1NGQ5ZjggMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcnguYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J4LmMKQEAgLTEsNDEgKzEsNDEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcnguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J4IHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZtb3J4LmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZtb3J4LmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9yeAorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dm1vcngKIAogCiAgIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J4LmggYi9zcmMvZ3h2YWxpZC9neHZtb3J4LmgKaW5kZXggNmQ5OTI1ZS4uZjc0N2IxZCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9yeC5oCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcnguaApAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIGNvbW1vbiBkZWZpbml0aW9uIGZvciBtb3J4IHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcnguaAorICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgY29tbW9uIGRlZmluaXRpb24gZm9yIG1vcnggdGFibGUgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaWZuZGVmIEdYVk1PUlhfSF8KQEAgLTMzLDcgKzMzLDEwIEBACiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKICNpbmNsdWRlICJneHZtb3J0LmgiCiAKLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0c25hbWVzLmg+CisKKworRlRfQkVHSU5fSEVBREVSCiAKIAogICBGVF9MT0NBTCggdm9pZCApCkBAIC02Miw2ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHWFZfVmFsaWRhdG9yICBneHZhbGlkICk7CiAKIAorRlRfRU5EX0hFQURFUgorCiAjZW5kaWYgLyogR1hWTU9SWF9IXyAqLwogCiAKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcngwLmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J4MC5jCmluZGV4IDMwMjI2MWIuLjVhNDJlNTUgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcngwLmMKKysrIGIvc3JjL2d4dmFsaWQvZ3h2bW9yeDAuYwpAQCAtMSw0MiArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlMCAoSW5kaWMgU2NyaXB0IFJlYXJyYW5nZW1lbnQpIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZtb3J4MC5jCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBtb3J4IHRhYmxlIHZhbGlkYXRpb24KKyAqICAgYm9keSBmb3IgdHlwZTAgKEluZGljIFNjcmlwdCBSZWFycmFuZ2VtZW50KSBzdWJ0YWJsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dm1vcnguaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2bW9yeAogCiAKICAgc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dm1vcngxLmMgYi9zcmMvZ3h2YWxpZC9neHZtb3J4MS5jCmluZGV4IDg5MGNhNzQuLjlmOGI2OTAgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dm1vcngxLmMKKysrIGIvc3JjL2d4dmFsaWQvZ3h2bW9yeDEuYwpAQCAtMSw0MiArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2bW9yeDEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBib2R5IGZvciB0eXBlMSAoQ29udGV4dHVhbCBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZtb3J4MS5jCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBtb3J4IHRhYmxlIHZhbGlkYXRpb24KKyAqICAgYm9keSBmb3IgdHlwZTEgKENvbnRleHR1YWwgU3Vic3RpdHV0aW9uKSBzdWJ0YWJsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dm1vcnguaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2bW9yeAogCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUxX1N0YXRlT3B0UmVjXwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDIuYyBiL3NyYy9neHZhbGlkL2d4dm1vcngyLmMKaW5kZXggMzEzNTAzMS4uOThiNWM0OSAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDIuYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J4Mi5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J4Mi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9yeCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yIHR5cGUyIChMaWdhdHVyZSBTdWJzdGl0dXRpb24pIHN1YnRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcngyLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbgorICogICBib2R5IGZvciB0eXBlMiAoTGlnYXR1cmUgU3Vic3RpdHV0aW9uKSBzdWJ0YWJsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dm1vcnguaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZtb3J4CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2bW9yeAogCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIEdYVl9tb3J4X3N1YnRhYmxlX3R5cGUyX1N0YXRlT3B0UmVjXwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDQuYyBiL3NyYy9neHZhbGlkL2d4dm1vcng0LmMKaW5kZXggMWUyMzk3Yi4uODU3ZTRkNCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2bW9yeDQuYworKysgYi9zcmMvZ3h2YWxpZC9neHZtb3J4NC5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZtb3J4NC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgbW9yeCB0YWJsZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGJvZHkgZm9yICJtb3J4IiB0eXBlNCAoTm9uLUNvbnRleHR1YWwgR2x5cGggU3Vic3RpdHV0aW9uKSBzdWJ0YWJsZS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm1vcng0LmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIG1vcnggdGFibGUgdmFsaWRhdGlvbgorICogICBib2R5IGZvciAibW9yeCIgdHlwZTQgKE5vbi1Db250ZXh0dWFsIEdseXBoIFN1YnN0aXR1dGlvbikgc3VidGFibGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZtb3J4LmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9yeAorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dm1vcngKIAogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZtb3J4NS5jIGIvc3JjL2d4dmFsaWQvZ3h2bW9yeDUuYwppbmRleCBkYjRmOTI5Li43Y2ViYTA3IDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZtb3J4NS5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm1vcng1LmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dm1vcng1LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCBtb3J4IHRhYmxlIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgYm9keSBmb3IgdHlwZTUgKENvbnRleHR1YWwgR2x5cGggSW5zZXJ0aW9uKSBzdWJ0YWJsZS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2bW9yeDUuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgbW9yeCB0YWJsZSB2YWxpZGF0aW9uCisgKiAgIGJvZHkgZm9yIHR5cGU1IChDb250ZXh0dWFsIEdseXBoIEluc2VydGlvbikgc3VidGFibGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZtb3J4LmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2bW9yeAorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dm1vcngKIAogCiAgIC8qCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9neHZvcGJkLmMgYi9zcmMvZ3h2YWxpZC9neHZvcGJkLmMKaW5kZXggZTJjMTY3ZS4uYTM5OGZlMCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvZ3h2b3BiZC5jCisrKyBiL3NyYy9neHZhbGlkL2d4dm9wYmQuYwpAQCAtMSw0MiArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZ3h2b3BiZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlR1gvQUFUIG9wYmQgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dm9wYmQuYworICoKKyAqICAgVHJ1ZVR5cGVHWC9BQVQgb3BiZCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLAorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuCisgKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kKKyAqIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uCisgKgorICovCiAKIAogI2luY2x1ZGUgImd4dmFsaWQuaCIKICNpbmNsdWRlICJneHZjb21tbi5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2d4dm9wYmQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBneHZvcGJkCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL2d4dnByb3AuYyBiL3NyYy9neHZhbGlkL2d4dnByb3AuYwppbmRleCBhNjdiNmJkLi5iZWU4YmFiIDEwMDY0NAotLS0gYS9zcmMvZ3h2YWxpZC9neHZwcm9wLmMKKysrIGIvc3JjL2d4dmFsaWQvZ3h2cHJvcC5jCkBAIC0xLDQyICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBneHZwcm9wLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGVHWC9BQVQgcHJvcCB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2cHJvcC5jCisgKgorICogICBUcnVlVHlwZUdYL0FBVCBwcm9wIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4KKyAqIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neQorICogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAiZ3h2YWxpZC5oIgogI2luY2x1ZGUgImd4dmNvbW1uLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ3h2cHJvcAorI2RlZmluZSBGVF9DT01QT05FTlQgIGd4dnByb3AKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvc3JjL2d4dmFsaWQvZ3h2dHJhay5jIGIvc3JjL2d4dmFsaWQvZ3h2dHJhay5jCmluZGV4IGQ1MDFiNTAuLjU4YTYzMWMgMTAwNjQ0Ci0tLSBhL3NyYy9neHZhbGlkL2d4dnRyYWsuYworKysgYi9zcmMvZ3h2YWxpZC9neHZ0cmFrLmMKQEAgLTEsNDIgKzEsNDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGd4dnRyYWsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZUdYL0FBVCB0cmFrIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3V6dWtpIHRvc2hpeWEsIE1hc2F0YWtlIFlBTUFUTywgUmVkIEhhdCBLLksuLCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBneHZ0cmFrLmMKKyAqCisgKiAgIFRydWVUeXBlR1gvQUFUIHRyYWsgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBneHZhbGlkIGlzIGRlcml2ZWQgZnJvbSBib3RoIGd4bGF5b3V0IG1vZHVsZSBhbmQgb3R2YWxpZCBtb2R1bGUuICAgICAgICAqLwotLyogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5ICAgICAgKi8KLS8qIFByb21vdGlvbiBBZ2VuY3koSVBBKSwgSmFwYW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLgorICogRGV2ZWxvcG1lbnQgb2YgZ3hsYXlvdXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBJbmZvcm1hdGlvbi10ZWNobm9sb2d5CisgKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLgorICoKKyAqLwogCiAKICNpbmNsdWRlICJneHZhbGlkLmgiCiAjaW5jbHVkZSAiZ3h2Y29tbW4uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9neHZ0cmFrCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgZ3h2dHJhawogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9zcmMvZ3h2YWxpZC9tb2R1bGUubWsgYi9zcmMvZ3h2YWxpZC9tb2R1bGUubWsKaW5kZXggYjY0ODc5ZC4uZTdkNDA4ZCAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvbW9kdWxlLm1rCisrKyBiL3NyYy9neHZhbGlkL21vZHVsZS5tawpAQCAtMiw3ICsyLDcgQEAKICMgRnJlZVR5cGUgMiBneHZhbGlkIG1vZHVsZSBkZWZpbml0aW9uCiAjCiAKLSMgQ29weXJpZ2h0IDIwMDQtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQogIyBzdXp1a2kgdG9zaGl5YSwgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sCiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKZGlmZiAtLWdpdCBhL3NyYy9neHZhbGlkL3J1bGVzLm1rIGIvc3JjL2d4dmFsaWQvcnVsZXMubWsKaW5kZXggM2ExN2MwMy4uZDU1YTQ5MyAxMDA2NDQKLS0tIGEvc3JjL2d4dmFsaWQvcnVsZXMubWsKKysrIGIvc3JjL2d4dmFsaWQvcnVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CiAjIHN1enVraSB0b3NoaXlhLCBNYXNhdGFrZSBZQU1BVE8sIFJlZCBIYXQgSy5LLiwKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvSmFtZmlsZSBiL3NyYy9nemlwL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YjRjOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2d6aXAvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvZ3ppcCBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgZ3ppcCA7Ci0KLUxpYnJhcnkgICQoRlQyX0xJQikgOiBmdGd6aXAuYyA7Ci0KLSMgZW5kIG9mIHNyYy9wY2YgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvZnRnemlwLmMgYi9zcmMvZ3ppcC9mdGd6aXAuYwppbmRleCBmODAxMWMyLi5kZTdkMGZkIDEwMDY0NAotLS0gYS9zcmMvZ3ppcC9mdGd6aXAuYworKysgYi9zcmMvZ3ppcC9mdGd6aXAuYwpAQCAtMSwzNCArMSwzMyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnemlwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5neiBjb21wcmVzc2VkIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgb3B0aW9uYWwgY29tcG9uZW50IHJlbGllcyBvbiB6bGliLiAgSXQgc2hvdWxkIG1haW5seSBiZSB1c2VkIHRvICAgKi8KLS8qICBwYXJzZSBjb21wcmVzc2VkIFBDRiBmb250cywgYXMgZm91bmQgd2l0aCBtYW55IFgxMSBzZXJ2ZXIgICAgICAgICAgICAgICovCi0vKiAgZGlzdHJpYnV0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z3ppcC5jCisgKgorICogICBGcmVlVHlwZSBzdXBwb3J0IGZvciAuZ3ogY29tcHJlc3NlZCBmaWxlcy4KKyAqCisgKiBUaGlzIG9wdGlvbmFsIGNvbXBvbmVudCByZWxpZXMgb24gemxpYi4gIEl0IHNob3VsZCBtYWlubHkgYmUgdXNlZCB0bworICogcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyCisgKiBkaXN0cmlidXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0daSVBfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRnemlwLmg+CiAjaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICiAKIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTM2LDE1ICszNSwxMSBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBHemlwX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9HemlwCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAiZ3ppcCBjb2RlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQgogCiAjaW5jbHVkZSA8emxpYi5oPgpAQCAtNjM3LDggKzYzMiw4IEBACiAgICAgbWVtb3J5ID0gc291cmNlLT5tZW1vcnk7CiAKICAgICAvKgotICAgICAqICBjaGVjayB0aGUgaGVhZGVyIHJpZ2h0IG5vdzsgdGhpcyBwcmV2ZW50cyBhbGxvY2F0aW5nIHVuLW5lY2Vzc2FyeQotICAgICAqICBvYmplY3RzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtCisgICAgICogY2hlY2sgdGhlIGhlYWRlciByaWdodCBub3c7IHRoaXMgcHJldmVudHMgYWxsb2NhdGluZyB1bi1uZWNlc3NhcnkKKyAgICAgKiBvYmplY3RzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtCiAgICAgICovCiAgICAgZXJyb3IgPSBmdF9nemlwX2NoZWNrX2hlYWRlciggc291cmNlICk7CiAgICAgaWYgKCBlcnJvciApCkBAIC02NjAsMTIgKzY1NSwxMiBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogIFdlIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrIHRvIHRyeSB0byBkcmFtYXRpY2FsbHkgaW1wcm92ZSB0aGUKLSAgICAgKiAgcGVyZm9ybWFuY2Ugd2hpbGUgZGVhbGluZyB3aXRoIHNtYWxsIGZpbGVzLiAgSWYgdGhlIG9yaWdpbmFsIHN0cmVhbQotICAgICAqICBzaXplIGlzIGxlc3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkLCB3ZSB0cnkgdG8gbG9hZCB0aGUgd2hvbGUgZm9udAotICAgICAqICBmaWxlIGludG8gbWVtb3J5LiAgVGhpcyBzYXZlcyB1cyBmcm9tIHVzaW5nIHRoZSAzMktCIGJ1ZmZlciBuZWVkZWQKLSAgICAgKiAgdG8gaW5mbGF0ZSB0aGUgZmlsZSwgcGx1cyB0aGUgdHdvIDRLQiBpbnRlcm1lZGlhdGUgaW5wdXQvb3V0cHV0Ci0gICAgICogIGJ1ZmZlcnMgdXNlZCBpbiB0aGUgYEZUX0daaXBGaWxlJyBzdHJ1Y3R1cmUuCisgICAgICogV2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8gdHJ5IHRvIGRyYW1hdGljYWxseSBpbXByb3ZlIHRoZQorICAgICAqIHBlcmZvcm1hbmNlIHdoaWxlIGRlYWxpbmcgd2l0aCBzbWFsbCBmaWxlcy4gIElmIHRoZSBvcmlnaW5hbCBzdHJlYW0KKyAgICAgKiBzaXplIGlzIGxlc3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkLCB3ZSB0cnkgdG8gbG9hZCB0aGUgd2hvbGUgZm9udAorICAgICAqIGZpbGUgaW50byBtZW1vcnkuICBUaGlzIHNhdmVzIHVzIGZyb20gdXNpbmcgdGhlIDMyS0IgYnVmZmVyIG5lZWRlZAorICAgICAqIHRvIGluZmxhdGUgdGhlIGZpbGUsIHBsdXMgdGhlIHR3byA0S0IgaW50ZXJtZWRpYXRlIGlucHV0L291dHB1dAorICAgICAqIGJ1ZmZlcnMgdXNlZCBpbiB0aGUgYEZUX0daaXBGaWxlJyBzdHJ1Y3R1cmUuCiAgICAgICovCiAgICAgewogICAgICAgRlRfVUxvbmcgIHppcF9zaXplID0gZnRfZ3ppcF9nZXRfdW5jb21wcmVzc2VkX3NpemUoIHNvdXJjZSApOwpAQCAtNzM1LDcgKzczMCw3IEBACiAKICAgICAvKiBjaGVjayBmb3IgYGlucHV0JyBkZWxheWVkIHRvIGBpbmZsYXRlJyAqLwogCi0gICAgaWYgKCAhbWVtb3J5IHx8ICEgb3V0cHV0X2xlbiB8fCAhb3V0cHV0ICkKKyAgICBpZiAoICFtZW1vcnkgfHwgIW91dHB1dF9sZW4gfHwgIW91dHB1dCApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKIAogICAgIC8qIHRoaXMgZnVuY3Rpb24gaXMgbW9kZWxlZCBhZnRlciB6bGliJ3MgYHVuY29tcHJlc3MnIGZ1bmN0aW9uICovCkBAIC03NTAsNyArNzQ1LDE3IEBACiAgICAgc3RyZWFtLnpmcmVlICA9IChmcmVlX2Z1bmMpIGZ0X2d6aXBfZnJlZTsKICAgICBzdHJlYW0ub3BhcXVlID0gbWVtb3J5OwogCisgICAgLyogVGhpcyBpcyBhIHRlbXBvcmFyeSBmaXggYW5kIHdpbGwgYmUgcmVtb3ZlZCBvbmNlIHRoZSBpbnRlcm5hbAorICAgICAqIGNvcHkgb2YgemxpYiBpcyB1cGRhdGVkIHRvIHRoZSBuZXdlc3QgdmVyc2lvbi4gVGhlIGB8MzInIGZsYWcKKyAgICAgKiBpcyBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgbmV3IHZlcnNpb25zIG9mIHpsaWIgdG8gZW5hYmxlIGd6aXAKKyAgICAgKiBlbmNvZGVkIGhlYWRlci4KKyAgICAgKi8KKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCCisgICAgZXJyID0gaW5mbGF0ZUluaXQyKCAmc3RyZWFtLCBNQVhfV0JJVFN8MzIgKTsKKyNlbHNlCiAgICAgZXJyID0gaW5mbGF0ZUluaXQyKCAmc3RyZWFtLCBNQVhfV0JJVFMgKTsKKyNlbmRpZgorCiAgICAgaWYgKCBlcnIgIT0gWl9PSyApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mYmxvY2suYyBiL3NyYy9nemlwL2luZmJsb2NrLmMKaW5kZXggZDZlMmRjMi4uMmI0ZjBjMiAxMDA2NDQKLS0tIGEvc3JjL2d6aXAvaW5mYmxvY2suYworKysgYi9zcmMvZ3ppcC9pbmZibG9jay5jCkBAIC0yMzUsNiArMjM1LDcgQEAKICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IDA7CiAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHRhYmxlIHNpemVzIG9rXG4iKSk7CiAgICAgICBzLT5tb2RlID0gQlRSRUU7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIEJUUkVFOgogICAgICAgd2hpbGUgKHMtPnN1Yi50cmVlcy5pbmRleCA8IDQgKyAocy0+c3ViLnRyZWVzLnRhYmxlID4+IDEwKSkKICAgICAgIHsKQEAgLTI2MCw2ICsyNjEsNyBAQAogICAgICAgcy0+c3ViLnRyZWVzLmluZGV4ID0gMDsKICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgYml0cyB0cmVlIG9rXG4iKSk7CiAgICAgICBzLT5tb2RlID0gRFRSRUU7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIERUUkVFOgogICAgICAgd2hpbGUgKHQgPSBzLT5zdWIudHJlZXMudGFibGUsCiAgICAgICAgICAgICAgcy0+c3ViLnRyZWVzLmluZGV4IDwgMjU4ICsgKHQgJiAweDFmKSArICgodCA+PiA1KSAmIDB4MWYpKQpAQCAtMzM1LDYgKzMzNyw3IEBACiAgICAgICB9CiAgICAgICBaRlJFRSh6LCBzLT5zdWIudHJlZXMuYmxlbnMpOwogICAgICAgcy0+bW9kZSA9IENPREVTOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBDT0RFUzoKICAgICAgIFVQREFURQogICAgICAgaWYgKChyID0gaW5mbGF0ZV9jb2RlcyhzLCB6LCByKSkgIT0gWl9TVFJFQU1fRU5EKQpAQCAtMzUxLDExICszNTQsMTMgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBzLT5tb2RlID0gRFJZOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBEUlk6CiAgICAgICBGTFVTSAogICAgICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCiAgICAgICAgIExFQVZFCiAgICAgICBzLT5tb2RlID0gRE9ORTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgRE9ORToKICAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7CiAgICAgICBMRUFWRQpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvaW5mY29kZXMuYyBiL3NyYy9nemlwL2luZmNvZGVzLmMKaW5kZXggZjdiZmQ1OC4uYmEzMDY1NCAxMDA2NDQKLS0tIGEvc3JjL2d6aXAvaW5mY29kZXMuYworKysgYi9zcmMvZ3ppcC9pbmZjb2Rlcy5jCkBAIC0xMTcsNiArMTE3LDcgQEAKICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5sYml0czsKICAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5sdHJlZTsKICAgICAgIGMtPm1vZGUgPSBMRU47CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIExFTjogICAgICAgICAgIC8qIGk6IGdldCBsZW5ndGgvbGl0ZXJhbC9lb2IgbmV4dCAqLwogICAgICAgaiA9IGMtPnN1Yi5jb2RlLm5lZWQ7CiAgICAgICBORUVEQklUUyhqKQpAQCAtMTY0LDYgKzE2NSw3IEBACiAgICAgICBjLT5zdWIuY29kZS50cmVlID0gYy0+ZHRyZWU7CiAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgYy0+bGVuKSk7CiAgICAgICBjLT5tb2RlID0gRElTVDsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgRElTVDogICAgICAgICAgLyogaTogZ2V0IGRpc3RhbmNlIG5leHQgKi8KICAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwogICAgICAgTkVFREJJVFMoaikKQEAgLTE5NCw2ICsxOTYsNyBAQAogICAgICAgRFVNUEJJVFMoaikKICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZGlzdGFuY2UgJXVcbiIsIGMtPnN1Yi5jb3B5LmRpc3QpKTsKICAgICAgIGMtPm1vZGUgPSBDT1BZOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBDT1BZOiAgICAgICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KICAgICAgIGYgPSBxIC0gYy0+c3ViLmNvcHkuZGlzdDsKICAgICAgIHdoaWxlIChmIDwgcy0+d2luZG93KSAgICAgICAgICAgICAvKiBtb2R1bG8gd2luZG93IHNpemUtIndoaWxlIiBpbnN0ZWFkICovCkBAIC0yMjUsNiArMjI4LDcgQEAKICAgICAgIGlmIChzLT5yZWFkICE9IHMtPndyaXRlKQogICAgICAgICBMRUFWRQogICAgICAgYy0+bW9kZSA9IEVORDsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgRU5EOgogICAgICAgciA9IFpfU1RSRUFNX0VORDsKICAgICAgIExFQVZFCmRpZmYgLS1naXQgYS9zcmMvZ3ppcC9pbmZsYXRlLmMgYi9zcmMvZ3ppcC9pbmZsYXRlLmMKaW5kZXggODg3N2ZhMy4uOTVlMjY1MyAxMDA2NDQKLS0tIGEvc3JjL2d6aXAvaW5mbGF0ZS5jCisrKyBiL3NyYy9nemlwL2luZmxhdGUuYwpAQCAtMTc0LDYgKzE3NCw3IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgei0+c3RhdGUtPm1vZGUgPSBGTEFHOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBGTEFHOgogICAgICAgTkVFREJZVEUKICAgICAgIGIgPSBORVhUQllURTsKQEAgLTE5MSwxOCArMTkyLDIyIEBACiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUNDsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgRElDVDQ6CiAgICAgICBORUVEQllURQogICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkID0gKHVMb25nKU5FWFRCWVRFIDw8IDI0OwogICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMzsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgRElDVDM6CiAgICAgICBORUVEQllURQogICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCAxNjsKICAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDI7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIERJQ1QyOgogICAgICAgTkVFREJZVEUKICAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEUgPDwgODsKICAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDE7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIERJQ1QxOgogICAgICAgTkVFREJZVEUKICAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEU7CkBAIC0yMzQsMTggKzIzOSwyMiBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIHotPnN0YXRlLT5tb2RlID0gQ0hFQ0s0OworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBDSEVDSzQ6CiAgICAgICBORUVEQllURQogICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkID0gKHVMb25nKU5FWFRCWVRFIDw8IDI0OwogICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzM7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIENIRUNLMzoKICAgICAgIE5FRURCWVRFCiAgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwogICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzI7CisgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICBjYXNlIENIRUNLMjoKICAgICAgIE5FRURCWVRFCiAgICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDg7CiAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMTsKKyAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgIGNhc2UgQ0hFQ0sxOgogICAgICAgTkVFREJZVEUKICAgICAgIHotPnN0YXRlLT5zdWIuY2hlY2submVlZCArPSAodUxvbmcpTkVYVEJZVEU7CkBAIC0yNTksNiArMjY4LDcgQEAKICAgICAgIH0KICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogemxpYiBjaGVjayBva1xuIikpOwogICAgICAgei0+c3RhdGUtPm1vZGUgPSBET05FOworICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgY2FzZSBET05FOgogICAgICAgcmV0dXJuIFpfU1RSRUFNX0VORDsKICAgICBjYXNlIEJBRDoKZGlmZiAtLWdpdCBhL3NyYy9nemlwL2luZnV0aWwuaCBiL3NyYy9nemlwL2luZnV0aWwuaAppbmRleCA3MTc0YjZkLi5jZGYxOGI0IDEwMDY0NAotLS0gYS9zcmMvZ3ppcC9pbmZ1dGlsLmgKKysrIGIvc3JjL2d6aXAvaW5mdXRpbC5oCkBAIC04Niw3ICs4Niw3IEBACiAKIC8qIG1hc2tzIGZvciBsb3dlciBiaXRzIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KICNpZm5kZWYgTk9fSU5GTEFURV9NQVNLCi1sb2NhbCB1SW50IGluZmxhdGVfbWFza1sxN107Citsb2NhbCBjb25zdCB1SW50IGluZmxhdGVfbWFza1sxN107CiAjZW5kaWYKIAogLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2d6aXAvcnVsZXMubWsgYi9zcmMvZ3ppcC9ydWxlcy5tawppbmRleCAxYTJlNDhiLi40ZWE4MjNmIDEwMDY0NAotLS0gYS9zcmMvZ3ppcC9ydWxlcy5taworKysgYi9zcmMvZ3ppcC9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL2x6dy9KYW1maWxlIGIvc3JjL2x6dy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgzYWE0Li4wMDAwMDAwCi0tLSBhL3NyYy9sencvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvbHp3IEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDQtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBsencgOwotCi1MaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRsencuYyA7Ci0KLSMgZW5kIG9mIHNyYy9sencgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2x6dy9mdGx6dy5jIGIvc3JjL2x6dy9mdGx6dy5jCmluZGV4IGNiNDZmOTMuLmRkYjgxZTYgMTAwNjQ0Ci0tLSBhL3NyYy9sencvZnRsencuYworKysgYi9zcmMvbHp3L2Z0bHp3LmMKQEAgLTEsMzUgKzEsMzQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bHp3LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzdXBwb3J0IGZvciAuWiBjb21wcmVzc2VkIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIG9wdGlvbmFsIGNvbXBvbmVudCByZWxpZXMgb24gTmV0QlNEJ3Mgem9wZW4oKS4gIEl0IHNob3VsZCBtYWlubHkgICovCi0vKiAgYmUgdXNlZCB0byBwYXJzZSBjb21wcmVzc2VkIFBDRiBmb250cywgYXMgZm91bmQgd2l0aCBtYW55IFgxMSBzZXJ2ZXIgICAqLwotLyogIGRpc3RyaWJ1dGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEFsYmVydCBDaGluLUEtWW91bmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZWQgb24gY29kZSBpbiBgc3JjL2d6aXAvZnRnemlwLmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bHp3LmMKKyAqCisgKiAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5aIGNvbXByZXNzZWQgZmlsZXMuCisgKgorICogVGhpcyBvcHRpb25hbCBjb21wb25lbnQgcmVsaWVzIG9uIE5ldEJTRCdzIHpvcGVuKCkuICBJdCBzaG91bGQgbWFpbmx5CisgKiBiZSB1c2VkIHRvIHBhcnNlIGNvbXByZXNzZWQgUENGIGZvbnRzLCBhcyBmb3VuZCB3aXRoIG1hbnkgWDExIHNlcnZlcgorICogZGlzdHJpYnV0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogQWxiZXJ0IENoaW4tQS1Zb3VuZy4KKyAqCisgKiBiYXNlZCBvbiBjb2RlIGluIGBzcmMvZ3ppcC9mdGd6aXAuYycKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0xaV19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGx6dy5oPgogI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAogCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zNywxNSArMzYsMTEgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgTFpXX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9MWlcKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9MWlcKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgImx6dyBjb2RlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAjaW5jbHVkZSAiZnR6b3Blbi5oIgogCiAKQEAgLTM2MSwxMSArMzU2LDExIEBACiAgICAgbWVtb3J5ID0gc291cmNlLT5tZW1vcnk7CiAKICAgICAvKgotICAgICAqICBDaGVjayB0aGUgaGVhZGVyIHJpZ2h0IG5vdzsgdGhpcyBwcmV2ZW50cyBhbGxvY2F0aW9uIG9mIGEgaHVnZQotICAgICAqICBMWldGaWxlIG9iamVjdCAoNDAwIEtCeXRlIG9mIGhlYXAgbWVtb3J5KSBpZiBub3QgbmVjZXNzYXJ5LgorICAgICAqIENoZWNrIHRoZSBoZWFkZXIgcmlnaHQgbm93OyB0aGlzIHByZXZlbnRzIGFsbG9jYXRpb24gb2YgYSBodWdlCisgICAgICogTFpXRmlsZSBvYmplY3QgKDQwMCBLQnl0ZSBvZiBoZWFwIG1lbW9yeSkgaWYgbm90IG5lY2Vzc2FyeS4KICAgICAgKgotICAgICAqICBEaWQgSSBtZW50aW9uIHRoYXQgeW91IHNob3VsZCBuZXZlciB1c2UgLlogY29tcHJlc3NlZCBmb250Ci0gICAgICogIGZpbGVzPworICAgICAqIERpZCBJIG1lbnRpb24gdGhhdCB5b3Ugc2hvdWxkIG5ldmVyIHVzZSAuWiBjb21wcmVzc2VkIGZvbnQKKyAgICAgKiBmaWxlcz8KICAgICAgKi8KICAgICBlcnJvciA9IGZ0X2x6d19jaGVja19oZWFkZXIoIHNvdXJjZSApOwogICAgIGlmICggZXJyb3IgKQpkaWZmIC0tZ2l0IGEvc3JjL2x6dy9mdHpvcGVuLmMgYi9zcmMvbHp3L2Z0em9wZW4uYwppbmRleCAyYjg2OGJhLi44ODRkMmVjIDEwMDY0NAotLS0gYS9zcmMvbHp3L2Z0em9wZW4uYworKysgYi9zcmMvbHp3L2Z0em9wZW4uYwpAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR6b3Blbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5aIGNvbXByZXNzZWQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgb3B0aW9uYWwgY29tcG9uZW50IHJlbGllcyBvbiBOZXRCU0QncyB6b3BlbigpLiAgSXQgc2hvdWxkIG1haW5seSAgKi8KLS8qICBiZSB1c2VkIHRvIHBhcnNlIGNvbXByZXNzZWQgUENGIGZvbnRzLCBhcyBmb3VuZCB3aXRoIG1hbnkgWDExIHNlcnZlciAgICovCi0vKiAgZGlzdHJpYnV0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0em9wZW4uYworICoKKyAqICAgRnJlZVR5cGUgc3VwcG9ydCBmb3IgLlogY29tcHJlc3NlZCBmaWxlcy4KKyAqCisgKiBUaGlzIG9wdGlvbmFsIGNvbXBvbmVudCByZWxpZXMgb24gTmV0QlNEJ3Mgem9wZW4oKS4gIEl0IHNob3VsZCBtYWlubHkKKyAqIGJlIHVzZWQgdG8gcGFyc2UgY29tcHJlc3NlZCBQQ0YgZm9udHMsIGFzIGZvdW5kIHdpdGggbWFueSBYMTEgc2VydmVyCisgKiBkaXN0cmlidXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKICNpbmNsdWRlICJmdHpvcGVuLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAKICAgc3RhdGljIGludApAQCAtMTY3LDExICsxNjcsMTEgQEAKICAgICAgIG5ld19zaXplICs9IG5ld19zaXplID4+IDI7ICAvKiBkb24ndCBncm93IHRvbyBmYXN0ICovCiAKICAgICAvKgotICAgICAqICBOb3RlIHRoYXQgdGhlIGBzdWZmaXgnIGFycmF5IGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUgbWVtb3J5IGJsb2NrCi0gICAgICogIHBvaW50ZWQgdG8gYnkgYHByZWZpeCcuCisgICAgICogTm90ZSB0aGF0IHRoZSBgc3VmZml4JyBhcnJheSBpcyBsb2NhdGVkIGluIHRoZSBzYW1lIG1lbW9yeSBibG9jaworICAgICAqIHBvaW50ZWQgdG8gYnkgYHByZWZpeCcuCiAgICAgICoKLSAgICAgKiAgSSBrbm93IHRoYXQgc2l6ZW9mKEZUX0J5dGUpID09IDEgYnkgZGVmaW5pdGlvbiwgYnV0IGl0IGlzIGNsZWFyZXIKLSAgICAgKiAgdG8gd3JpdGUgaXQgbGl0ZXJhbGx5LgorICAgICAqIEkga25vdyB0aGF0IHNpemVvZihGVF9CeXRlKSA9PSAxIGJ5IGRlZmluaXRpb24sIGJ1dCBpdCBpcyBjbGVhcmVyCisgICAgICogdG8gd3JpdGUgaXQgbGl0ZXJhbGx5LgogICAgICAqCiAgICAgICovCiAgICAgaWYgKCBGVF9SRUFMTE9DX01VTFQoIHN0YXRlLT5wcmVmaXgsIG9sZF9zaXplLCBuZXdfc2l6ZSwKZGlmZiAtLWdpdCBhL3NyYy9sencvZnR6b3Blbi5oIGIvc3JjL2x6dy9mdHpvcGVuLmgKaW5kZXggNGZkMjY3ZS4uZDg3NjhmNyAxMDA2NDQKLS0tIGEvc3JjL2x6dy9mdHpvcGVuLmgKKysrIGIvc3JjL2x6dy9mdHpvcGVuLmgKQEAgLTEsMzUgKzEsMzUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0em9wZW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzdXBwb3J0IGZvciAuWiBjb21wcmVzc2VkIGZpbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIG9wdGlvbmFsIGNvbXBvbmVudCByZWxpZXMgb24gTmV0QlNEJ3Mgem9wZW4oKS4gIEl0IHNob3VsZCBtYWlubHkgICovCi0vKiAgYmUgdXNlZCB0byBwYXJzZSBjb21wcmVzc2VkIFBDRiBmb250cywgYXMgZm91bmQgd2l0aCBtYW55IFgxMSBzZXJ2ZXIgICAqLwotLyogIGRpc3RyaWJ1dGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHpvcGVuLmgKKyAqCisgKiAgIEZyZWVUeXBlIHN1cHBvcnQgZm9yIC5aIGNvbXByZXNzZWQgZmlsZXMuCisgKgorICogVGhpcyBvcHRpb25hbCBjb21wb25lbnQgcmVsaWVzIG9uIE5ldEJTRCdzIHpvcGVuKCkuICBJdCBzaG91bGQgbWFpbmx5CisgKiBiZSB1c2VkIHRvIHBhcnNlIGNvbXByZXNzZWQgUENGIGZvbnRzLCBhcyBmb3VuZCB3aXRoIG1hbnkgWDExIHNlcnZlcgorICogZGlzdHJpYnV0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogRGF2aWQgVHVybmVyLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAjaWZuZGVmIEZUWk9QRU5fSF8KICNkZWZpbmUgRlRaT1BFTl9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgogCitGVF9CRUdJTl9IRUFERVIKIAogICAvKgotICAgKiAgVGhpcyBpcyBhIGNvbXBsZXRlIHJlLWltcGxlbWVudGF0aW9uIG9mIHRoZSBMWlcgZmlsZSByZWFkZXIsCi0gICAqICBzaW5jZSB0aGUgb2xkIG9uZSB3YXMgaW5jcmVkaWJseSBiYWRseSB3cml0dGVuLCB1c2luZwotICAgKiAgNDAwIEtCeXRlIG9mIGhlYXAgbWVtb3J5IGJlZm9yZSBkZWNvbXByZXNzaW5nIGFueXRoaW5nLgorICAgKiBUaGlzIGlzIGEgY29tcGxldGUgcmUtaW1wbGVtZW50YXRpb24gb2YgdGhlIExaVyBmaWxlIHJlYWRlciwKKyAgICogc2luY2UgdGhlIG9sZCBvbmUgd2FzIGluY3JlZGlibHkgYmFkbHkgd3JpdHRlbiwgdXNpbmcKKyAgICogNDAwIEtCeXRlIG9mIGhlYXAgbWVtb3J5IGJlZm9yZSBkZWNvbXByZXNzaW5nIGFueXRoaW5nLgogICAgKgogICAgKi8KIApAQCAtNTgsNTYgKzU4LDU2IEBACiAKIAogICAvKgotICAgKiAgc3RhdGUgb2YgTFpXIGRlY29tcHJlc3NvcgorICAgKiBzdGF0ZSBvZiBMWlcgZGVjb21wcmVzc29yCiAgICAqCi0gICAqICBzbWFsbCB0ZWNobmljYWwgbm90ZQotICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogc21hbGwgdGVjaG5pY2FsIG5vdGUKKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICoKLSAgICogIFdlIHVzZSBhIGZldyB0cmlja3MgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IGFyZSBleHBsYWluZWQgaGVyZSB0bwotICAgKiAgZWFzZSBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLgorICAgKiBXZSB1c2UgYSBmZXcgdHJpY2tzIGluIHRoaXMgaW1wbGVtZW50YXRpb24gdGhhdCBhcmUgZXhwbGFpbmVkIGhlcmUgdG8KKyAgICogZWFzZSBkZWJ1Z2dpbmcgYW5kIG1haW50ZW5hbmNlLgogICAgKgotICAgKiAgLSBGaXJzdCBvZiBhbGwsIHRoZSBgcHJlZml4JyBhbmQgYHN1ZmZpeCcgYXJyYXlzIGNvbnRhaW4gdGhlIHN1ZmZpeAotICAgKiAgICBhbmQgcHJlZml4IGZvciBjb2RlcyBvdmVyIDI1NjsgdGhpcyBtZWFucyB0aGF0CisgICAqIC0gRmlyc3Qgb2YgYWxsLCB0aGUgYHByZWZpeCcgYW5kIGBzdWZmaXgnIGFycmF5cyBjb250YWluIHRoZSBzdWZmaXgKKyAgICogICBhbmQgcHJlZml4IGZvciBjb2RlcyBvdmVyIDI1NjsgdGhpcyBtZWFucyB0aGF0CiAgICAqCi0gICAqICAgICAgcHJlZml4X29mKGNvZGUpID09IHN0YXRlLT5wcmVmaXhbY29kZS0yNTZdCi0gICAqICAgICAgc3VmZml4X29mKGNvZGUpID09IHN0YXRlLT5zdWZmaXhbY29kZS0yNTZdCisgICAqICAgICBwcmVmaXhfb2YoY29kZSkgPT0gc3RhdGUtPnByZWZpeFtjb2RlLTI1Nl0KKyAgICogICAgIHN1ZmZpeF9vZihjb2RlKSA9PSBzdGF0ZS0+c3VmZml4W2NvZGUtMjU2XQogICAgKgotICAgKiAgICBFYWNoIHByZWZpeCBpcyBhIDE2LWJpdCBjb2RlLCBhbmQgZWFjaCBzdWZmaXggYW4gOC1iaXQgYnl0ZS4KKyAgICogICBFYWNoIHByZWZpeCBpcyBhIDE2LWJpdCBjb2RlLCBhbmQgZWFjaCBzdWZmaXggYW4gOC1iaXQgYnl0ZS4KICAgICoKLSAgICogICAgQm90aCBhcnJheXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBtZW1vcnkgYmxvY2ssIHBvaW50ZWQgdG8gYnkKLSAgICogICAgYHN0YXRlLT5wcmVmaXgnLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgZXF1YWxpdHkgaXMgYWx3YXlzCi0gICAqICAgIHRydWU6CisgICAqICAgQm90aCBhcnJheXMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBtZW1vcnkgYmxvY2ssIHBvaW50ZWQgdG8gYnkKKyAgICogICBgc3RhdGUtPnByZWZpeCcuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBlcXVhbGl0eSBpcyBhbHdheXMKKyAgICogICB0cnVlOgogICAgKgotICAgKiAgICAgIHN0YXRlLT5zdWZmaXggPT0gKEZUX0J5dGUqKShzdGF0ZS0+cHJlZml4ICsgc3RhdGUtPnByZWZpeF9zaXplKQorICAgKiAgICAgc3RhdGUtPnN1ZmZpeCA9PSAoRlRfQnl0ZSopKHN0YXRlLT5wcmVmaXggKyBzdGF0ZS0+cHJlZml4X3NpemUpCiAgICAqCi0gICAqICAgIE9mIGNvdXJzZSwgc3RhdGUtPnByZWZpeF9zaXplIGlzIHRoZSBudW1iZXIgb2YgcHJlZml4L3N1ZmZpeCBzbG90cwotICAgKiAgICBpbiB0aGUgYXJyYXlzLCBjb3JyZXNwb25kaW5nIHRvIGNvZGVzIDI1Ni4uMjU1K3ByZWZpeF9zaXplLgorICAgKiAgIE9mIGNvdXJzZSwgc3RhdGUtPnByZWZpeF9zaXplIGlzIHRoZSBudW1iZXIgb2YgcHJlZml4L3N1ZmZpeCBzbG90cworICAgKiAgIGluIHRoZSBhcnJheXMsIGNvcnJlc3BvbmRpbmcgdG8gY29kZXMgMjU2Li4yNTUrcHJlZml4X3NpemUuCiAgICAqCi0gICAqICAtIGBmcmVlX2VudCcgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGZyZWUgZW50cnkgaW4gdGhlIGBwcmVmaXgnCi0gICAqICAgIGFuZCBgc3VmZml4JyBhcnJheXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYG5leHQgZnJlZQotICAgKiAgICBjb2RlJyBpcyByZWFsbHkgYDI1NitmcmVlX2VudCcuCisgICAqIC0gYGZyZWVfZW50JyBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgZnJlZSBlbnRyeSBpbiB0aGUgYHByZWZpeCcKKyAgICogICBhbmQgYHN1ZmZpeCcgYXJyYXlzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGBuZXh0IGZyZWUKKyAgICogICBjb2RlJyBpcyByZWFsbHkgYDI1NitmcmVlX2VudCcuCiAgICAqCi0gICAqICAgIE1vcmVvdmVyLCBgbWF4X2ZyZWUnIGlzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgYGZyZWVfZW50JyBjYW4gcmVhY2guCisgICAqICAgTW9yZW92ZXIsIGBtYXhfZnJlZScgaXMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCBgZnJlZV9lbnQnIGNhbiByZWFjaC4KICAgICoKLSAgICogICAgYG1heF9mcmVlJyBjb3JyZXNwb25kcyB0byBgKDEgPDwgbWF4X2JpdHMpIC0gMjU2Jy4gIE5vdGUgdGhhdCB0aGlzCi0gICAqICAgIHZhbHVlIGlzIGFsd2F5cyA8PSAweEZGMDAsIHdoaWNoIG1lYW5zIHRoYXQgYm90aCBgZnJlZV9lbnQnIGFuZAotICAgKiAgICBgbWF4X2ZyZWUnIGNhbiBiZSBzdG9yZWQgaW4gYW4gRlRfVUludCB2YXJpYWJsZSwgZXZlbiBvbiAxNi1iaXQKLSAgICogICAgbWFjaGluZXMuCisgICAqICAgYG1heF9mcmVlJyBjb3JyZXNwb25kcyB0byBgKDEgPDwgbWF4X2JpdHMpIC0gMjU2Jy4gIE5vdGUgdGhhdCB0aGlzCisgICAqICAgdmFsdWUgaXMgYWx3YXlzIDw9IDB4RkYwMCwgd2hpY2ggbWVhbnMgdGhhdCBib3RoIGBmcmVlX2VudCcgYW5kCisgICAqICAgYG1heF9mcmVlJyBjYW4gYmUgc3RvcmVkIGluIGFuIEZUX1VJbnQgdmFyaWFibGUsIGV2ZW4gb24gMTYtYml0CisgICAqICAgbWFjaGluZXMuCiAgICAqCi0gICAqICAgIElmIGBmcmVlX2VudCA9PSBtYXhfZnJlZScsIHlvdSBjYW5ub3QgYWRkIG5ldyBjb2RlcyB0byB0aGUKLSAgICogICAgcHJlZml4L3N1ZmZpeCB0YWJsZS4KKyAgICogICBJZiBgZnJlZV9lbnQgPT0gbWF4X2ZyZWUnLCB5b3UgY2Fubm90IGFkZCBuZXcgY29kZXMgdG8gdGhlCisgICAqICAgcHJlZml4L3N1ZmZpeCB0YWJsZS4KICAgICoKLSAgICogIC0gYG51bV9iaXRzJyBpcyB0aGUgY3VycmVudCBudW1iZXIgb2YgY29kZSBiaXRzLCBzdGFydGluZyBhdCA5IGFuZAotICAgKiAgICBncm93aW5nIGVhY2ggdGltZSBgZnJlZV9lbnQnIHJlYWNoZXMgdGhlIHZhbHVlIG9mIGBmcmVlX2JpdHMnLiAgVGhlCi0gICAqICAgIGxhdHRlciBpcyBjb21wdXRlZCBhcyBmb2xsb3dzCisgICAqIC0gYG51bV9iaXRzJyBpcyB0aGUgY3VycmVudCBudW1iZXIgb2YgY29kZSBiaXRzLCBzdGFydGluZyBhdCA5IGFuZAorICAgKiAgIGdyb3dpbmcgZWFjaCB0aW1lIGBmcmVlX2VudCcgcmVhY2hlcyB0aGUgdmFsdWUgb2YgYGZyZWVfYml0cycuICBUaGUKKyAgICogICBsYXR0ZXIgaXMgY29tcHV0ZWQgYXMgZm9sbG93cwogICAgKgotICAgKiAgICAgIGlmIG51bV9iaXRzIDwgbWF4X2JpdHM6Ci0gICAqICAgICAgICAgZnJlZV9iaXRzID0gKDEgPDwgbnVtX2JpdHMpLTI1NgotICAgKiAgICAgIGVsc2U6Ci0gICAqICAgICAgICAgZnJlZV9iaXRzID0gbWF4X2ZyZWUgKyAxCisgICAqICAgICBpZiBudW1fYml0cyA8IG1heF9iaXRzOgorICAgKiAgICAgICAgZnJlZV9iaXRzID0gKDEgPDwgbnVtX2JpdHMpLTI1NgorICAgKiAgICAgZWxzZToKKyAgICogICAgICAgIGZyZWVfYml0cyA9IG1heF9mcmVlICsgMQogICAgKgotICAgKiAgICBTaW5jZSB0aGUgdmFsdWUgb2YgYG1heF9mcmVlICsgMScgY2FuIG5ldmVyIGJlIHJlYWNoZWQgYnkKLSAgICogICAgYGZyZWVfZW50JywgYG51bV9iaXRzJyBjYW5ub3QgZ3JvdyBsYXJnZXIgdGhhbiBgbWF4X2JpdHMnLgorICAgKiAgIFNpbmNlIHRoZSB2YWx1ZSBvZiBgbWF4X2ZyZWUgKyAxJyBjYW4gbmV2ZXIgYmUgcmVhY2hlZCBieQorICAgKiAgIGBmcmVlX2VudCcsIGBudW1fYml0cycgY2Fubm90IGdyb3cgbGFyZ2VyIHRoYW4gYG1heF9iaXRzJy4KICAgICovCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0x6d1N0YXRlUmVjXwpAQCAtMTY2LDYgKzE2Niw4IEBACiAKIC8qICovCiAKK0ZUX0VORF9IRUFERVIKKwogI2VuZGlmIC8qIEZUWk9QRU5fSF8gKi8KIAogCmRpZmYgLS1naXQgYS9zcmMvbHp3L3J1bGVzLm1rIGIvc3JjL2x6dy9ydWxlcy5tawppbmRleCAxODkzM2M0Li4zNDY4ZWUwIDEwMDY0NAotLS0gYS9zcmMvbHp3L3J1bGVzLm1rCisrKyBiL3NyYy9sencvcnVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CiAjIEFsYmVydCBDaGluLUEtWW91bmcuCiAjCiAjIGJhc2VkIG9uIGBzcmMvbHp3L3J1bGVzLm1rJwpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvSmFtZmlsZSBiL3NyYy9vdHZhbGlkL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjhlMGMuLjAwMDAwMDAKLS0tIGEvc3JjL290dmFsaWQvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvb3R2YWxpZCBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDA0LTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgb3R2YWxpZCA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gb3R2YmFzZQotICAgICAgICAgICAgICAgb3R2Y29tbW4KLSAgICAgICAgICAgICAgIG90dmdkZWYKLSAgICAgICAgICAgICAgIG90dmdwb3MKLSAgICAgICAgICAgICAgIG90dmdzdWIKLSAgICAgICAgICAgICAgIG90dmpzdGYKLSAgICAgICAgICAgICAgIG90dm1hdGgKLSAgICAgICAgICAgICAgIG90dm1vZAotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gb3R2YWxpZCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9vdHZhbGlkIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL21vZHVsZS5tayBiL3NyYy9vdHZhbGlkL21vZHVsZS5tawppbmRleCAzNGYzZGFiLi42N2I5ODIwIDEwMDY0NAotLS0gYS9zcmMvb3R2YWxpZC9tb2R1bGUubWsKKysrIGIvc3JjL290dmFsaWQvbW9kdWxlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDQtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZhbGlkLmMgYi9zcmMvb3R2YWxpZC9vdHZhbGlkLmMKaW5kZXggNDQyM2NhMS4uZDY0MDIwOSAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2YWxpZC5jCisrKyBiL3NyYy9vdHZhbGlkL290dmFsaWQuYwpAQCAtMSwyMyArMSwyMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2YWxpZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHZhbGlkYXRvciBmb3IgT3BlblR5cGUgdGFibGVzIChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3R2YWxpZC5jCisgKgorICogICBGcmVlVHlwZSB2YWxpZGF0b3IgZm9yIE9wZW5UeXBlIHRhYmxlcyAoYm9keSBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKICNpbmNsdWRlICJvdHZiYXNlLmMiCiAjaW5jbHVkZSAib3R2Y29tbW4uYyIKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmFsaWQuaCBiL3NyYy9vdHZhbGlkL290dmFsaWQuaAppbmRleCBkNzgwMWFiLi44MjA4ZmYwIDEwMDY0NAotLS0gYS9zcmMvb3R2YWxpZC9vdHZhbGlkLmgKKysrIGIvc3JjL290dmFsaWQvb3R2YWxpZC5oCkBAIC0xLDMyICsxLDMxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZhbGlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgdGFibGUgdmFsaWRhdGlvbiAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZhbGlkLmgKKyAqCisgKiAgIE9wZW5UeXBlIHRhYmxlIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIE9UVkFMSURfSF8KICNkZWZpbmUgT1RWQUxJRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKLSNpbmNsdWRlICJvdHZlcnJvci5oIiAgICAgICAgICAgLyogbXVzdCBjb21lIGJlZm9yZSBGVF9JTlRFUk5BTF9WQUxJREFURV9IICovCisjaW5jbHVkZSAib3R2ZXJyb3IuaCIgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGJlZm9yZSBgZnR2YWxpZC5oJyAqLwogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2YmFzZS5jIGIvc3JjL290dmFsaWQvb3R2YmFzZS5jCmluZGV4IGEwMWQ0NWMuLjI1MGFlOTggMTAwNjQ0Ci0tLSBhL3NyYy9vdHZhbGlkL290dmJhc2UuYworKysgYi9zcmMvb3R2YWxpZC9vdHZiYXNlLmMKQEAgLTEsMzMgKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmJhc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBCQVNFIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG90dmJhc2UuYworICoKKyAqICAgT3BlblR5cGUgQkFTRSB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJvdHZhbGlkLmgiCiAjaW5jbHVkZSAib3R2Y29tbW4uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vdHZiYXNlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgb3R2YmFzZQogCiAKICAgc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmNvbW1uLmMgYi9zcmMvb3R2YWxpZC9vdHZjb21tbi5jCmluZGV4IDBjY2ZiMDMuLmZhYWE4NDYgMTAwNjQ0Ci0tLSBhL3NyYy9vdHZhbGlkL290dmNvbW1uLmMKKysrIGIvc3JjL290dmFsaWQvb3R2Y29tbW4uYwpAQCAtMSwzMiArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Y29tbW4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIGNvbW1vbiB0YWJsZXMgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3R2Y29tbW4uYworICoKKyAqICAgT3BlblR5cGUgY29tbW9uIHRhYmxlcyB2YWxpZGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJvdHZjb21tbi5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmNvbW1vbgorI2RlZmluZSBGVF9DT01QT05FTlQgIG90dmNvbW1vbgogCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNTEsNiArMTUxLDkgQEAKICAgICBGVF9VSW50ICAgcmVzdWx0ID0gMDsKIAogCisgICAgaWYgKCAhY291bnQgKQorICAgICAgcmV0dXJuIHJlc3VsdDsKKwogICAgIHN3aXRjaCAoIENvdmVyYWdlRm9ybWF0ICkKICAgICB7CiAgICAgY2FzZSAxOgpkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2Y29tbW4uaCBiL3NyYy9vdHZhbGlkL290dmNvbW1uLmgKaW5kZXggYTM5Mjc4NC4uZjk5MjYwMyAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2Y29tbW4uaAorKysgYi9zcmMvb3R2YWxpZC9vdHZjb21tbi5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZjb21tbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgY29tbW9uIHRhYmxlcyB2YWxpZGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZjb21tbi5oCisgKgorICogICBPcGVuVHlwZSBjb21tb24gdGFibGVzIHZhbGlkYXRpb24gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBPVFZDT01NTl9IXwogI2RlZmluZSBPVFZDT01NTl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgIm90dmFsaWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZlcnJvci5oIGIvc3JjL290dmFsaWQvb3R2ZXJyb3IuaAppbmRleCAyZmNmNDJlLi45NzllOWNiIDEwMDY0NAotLS0gYS9zcmMvb3R2YWxpZC9vdHZlcnJvci5oCisrKyBiL3NyYy9vdHZhbGlkL290dmVycm9yLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG90dmVycm9yLmgKKyAqCisgKiAgIE9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUgZXJyb3IgICAgICAqLwotICAvKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBlcnJvcgorICAgKiBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIE9UVkVSUk9SX0hfCiAjZGVmaW5lIE9UVkVSUk9SX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIE9UVl9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfT1R2YWxpZAogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBPVFZFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZnZGVmLmMgYi9zcmMvb3R2YWxpZC9vdHZnZGVmLmMKaW5kZXggMDhmMzE3MS4uODg4NzRiOCAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2Z2RlZi5jCisrKyBiL3NyYy9vdHZhbGlkL290dmdkZWYuYwpAQCAtMSwzMyArMSwzMyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z2RlZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdERUYgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3R2Z2RlZi5jCisgKgorICogICBPcGVuVHlwZSBHREVGIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgIm90dmFsaWQuaCIKICNpbmNsdWRlICJvdHZjb21tbi5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmdkZWYKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdHZnZGVmCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmdwb3MuYyBiL3NyYy9vdHZhbGlkL290dmdwb3MuYwppbmRleCA2OTZiMzVjLi4yOWQ1NmY5IDEwMDY0NAotLS0gYS9zcmMvb3R2YWxpZC9vdHZncG9zLmMKKysrIGIvc3JjL290dmFsaWQvb3R2Z3Bvcy5jCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZncG9zLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR1BPUyB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZncG9zLmMKKyAqCisgKiAgIE9wZW5UeXBlIEdQT1MgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAib3R2YWxpZC5oIgpAQCAtMjEsMTQgKzIxLDE0IEBACiAjaW5jbHVkZSAib3R2Z3Bvcy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmdwb3MKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdHZncG9zCiAKIAogICBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvc3JjL290dmFsaWQvb3R2Z3Bvcy5oIGIvc3JjL290dmFsaWQvb3R2Z3Bvcy5oCmluZGV4IDk1ZjlhYzMuLjA2YTAzYTAgMTAwNjQ0Ci0tLSBhL3NyYy9vdHZhbGlkL290dmdwb3MuaAorKysgYi9zcmMvb3R2YWxpZC9vdHZncG9zLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dmdwb3MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBHUE9TIHRhYmxlIHZhbGlkYXRvciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG90dmdwb3MuaAorICoKKyAqICAgT3BlblR5cGUgR1BPUyB0YWJsZSB2YWxpZGF0b3IgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBPVFZHUE9TX0hfCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZnc3ViLmMgYi9zcmMvb3R2YWxpZC9vdHZnc3ViLmMKaW5kZXggZDM1ZWE2Ny4uZjBkNTYzYiAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2Z3N1Yi5jCisrKyBiL3NyYy9vdHZhbGlkL290dmdzdWIuYwpAQCAtMSwzMyArMSwzMyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2Z3N1Yi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdTVUIgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogb3R2Z3N1Yi5jCisgKgorICogICBPcGVuVHlwZSBHU1VCIHRhYmxlIHZhbGlkYXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgIm90dmFsaWQuaCIKICNpbmNsdWRlICJvdHZjb21tbi5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmdzdWIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdHZnc3ViCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dmpzdGYuYyBiL3NyYy9vdHZhbGlkL290dmpzdGYuYwppbmRleCA5NGQ0YWY5Li43OWRlN2I4IDEwMDY0NAotLS0gYS9zcmMvb3R2YWxpZC9vdHZqc3RmLmMKKysrIGIvc3JjL290dmFsaWQvb3R2anN0Zi5jCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZqc3RmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgSlNURiB0YWJsZSB2YWxpZGF0aW9uIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZqc3RmLmMKKyAqCisgKiAgIE9wZW5UeXBlIEpTVEYgdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAib3R2YWxpZC5oIgpAQCAtMjEsMTQgKzIxLDE0IEBACiAjaW5jbHVkZSAib3R2Z3Bvcy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dmpzdGYKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdHZqc3RmCiAKIAogI2RlZmluZSBKc3RmUHJpb3JpdHlGdW5jICBvdHZfSnN0ZlByaW9yaXR5X3ZhbGlkYXRlCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZtYXRoLmMgYi9zcmMvb3R2YWxpZC9vdHZtYXRoLmMKaW5kZXggYjk4MDBmNi4uZGZkZWFhYiAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2bWF0aC5jCisrKyBiL3NyYy9vdHZhbGlkL290dm1hdGguYwpAQCAtMSwyMSArMSwyMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3R2bWF0aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIE1BVEggdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgR2VvcmdlIFdpbGxpYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZtYXRoLmMKKyAqCisgKiAgIE9wZW5UeXBlIE1BVEggdGFibGUgdmFsaWRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBXcml0dGVuIGJ5IEdlb3JnZSBXaWxsaWFtcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAib3R2YWxpZC5oIgpAQCAtMjMsMTQgKzIzLDE0IEBACiAjaW5jbHVkZSAib3R2Z3Bvcy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX290dm1hdGgKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBvdHZtYXRoCiAKIAogCmRpZmYgLS1naXQgYS9zcmMvb3R2YWxpZC9vdHZtb2QuYyBiL3NyYy9vdHZhbGlkL290dm1vZC5jCmluZGV4IDg5ZWU0NDkuLjAxODhiMjcgMTAwNjQ0Ci0tLSBhL3NyYy9vdHZhbGlkL290dm1vZC5jCisrKyBiL3NyYy9vdHZhbGlkL290dm1vZC5jCkBAIC0xLDQxICsxLDQwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdHZtb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUncyBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZtb2QuYworICoKKyAqICAgRnJlZVR5cGUncyBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX09QRU5UWVBFX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWJsZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG90dmFsLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZvdHZhbC5oPgogCiAjaW5jbHVkZSAib3R2bW9kLmgiCiAjaW5jbHVkZSAib3R2YWxpZC5oIgogI2luY2x1ZGUgIm90dmNvbW1uLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb3R2bW9kdWxlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgb3R2bW9kdWxlCiAKIAogICBzdGF0aWMgRlRfRXJyb3IKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL290dm1vZC5oIGIvc3JjL290dmFsaWQvb3R2bW9kLmgKaW5kZXggNjkxN2JjYy4uZWZkNmRhMCAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvb3R2bW9kLmgKKysrIGIvc3JjL290dmFsaWQvb3R2bW9kLmgKQEAgLTEsMzYgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90dm1vZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSdzIE9wZW5UeXBlIHZhbGlkYXRpb24gbW9kdWxlIGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBvdHZtb2QuaAorICoKKyAqICAgRnJlZVR5cGUncyBPcGVuVHlwZSB2YWxpZGF0aW9uIG1vZHVsZSBpbXBsZW1lbnRhdGlvbgorICogICAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIE9UVk1PRF9IXwogI2RlZmluZSBPVFZNT0RfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RhcGkuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAKICAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfTW9kdWxlX0NsYXNzICkgIG90dl9tb2R1bGVfY2xhc3M7CiAKZGlmZiAtLWdpdCBhL3NyYy9vdHZhbGlkL3J1bGVzLm1rIGIvc3JjL290dmFsaWQvcnVsZXMubWsKaW5kZXggZDRmYzcyMy4uN2YwMTY5ZiAxMDA2NDQKLS0tIGEvc3JjL290dmFsaWQvcnVsZXMubWsKKysrIGIvc3JjL290dmFsaWQvcnVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNC0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwNC0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy9wY2YvSmFtZmlsZSBiL3NyYy9wY2YvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5MmIxMi4uMDAwMDAwMAotLS0gYS9zcmMvcGNmL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3BjZiBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgcGNmIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBwY2Zkcml2cgotICAgICAgICAgICAgICAgcGNmcmVhZAotICAgICAgICAgICAgICAgcGNmdXRpbAotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gcGNmIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3BjZiBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZi5jIGIvc3JjL3BjZi9wY2YuYwppbmRleCA4ZmZkNmUyLi42YjMwZmIyIDEwMDY0NAotLS0gYS9zcmMvcGNmL3BjZi5jCisrKyBiL3NyYy9wY2YvcGNmLmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogCiAjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAjaW5jbHVkZSAicGNmZHJpdnIuYyIKICNpbmNsdWRlICJwY2ZyZWFkLmMiCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZi5oIGIvc3JjL3BjZi9wY2YuaAppbmRleCBmMDM5MGNiLi4zMTM0Y2MzIDEwMDY0NAotLS0gYS9zcmMvcGNmL3BjZi5oCisrKyBiL3NyYy9wY2YvcGNmLmgKQEAgLTI5LDkgKzI5LDggQEAKICNkZWZpbmUgUENGX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC05OSwxMSArOTgsMjUgQEAKICAgICBGVF9TaG9ydCAgYXNjZW50OwogICAgIEZUX1Nob3J0ICBkZXNjZW50OwogICAgIEZUX1Nob3J0ICBhdHRyaWJ1dGVzOwotICAgIEZUX1VMb25nICBiaXRzOworCisgICAgRlRfVUxvbmcgIGJpdHM7ICAvKiBvZmZzZXQgaW50byB0aGUgUENGX0JJVE1BUFMgdGFibGUgKi8KIAogICB9IFBDRl9NZXRyaWNSZWMsICpQQ0ZfTWV0cmljOwogCiAKKyAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9FbmNSZWNfCisgIHsKKyAgICBGVF9VU2hvcnQgICBmaXJzdENvbDsKKyAgICBGVF9VU2hvcnQgICBsYXN0Q29sOworICAgIEZUX1VTaG9ydCAgIGZpcnN0Um93OworICAgIEZUX1VTaG9ydCAgIGxhc3RSb3c7CisgICAgRlRfVVNob3J0ICAgZGVmYXVsdENoYXI7CisKKyAgICBGVF9VU2hvcnQqICBvZmZzZXQ7CisKKyAgfSBQQ0ZfRW5jUmVjLCAqUENGX0VuYzsKKworCiAgIHR5cGVkZWYgc3RydWN0ICBQQ0ZfQWNjZWxSZWNfCiAgIHsKICAgICBGVF9CeXRlICAgICAgICBub092ZXJsYXA7CkBAIC0xMjQsNDEgKzEzNywzMiBAQAogICB9IFBDRl9BY2NlbFJlYywgKlBDRl9BY2NlbDsKIAogCi0gIHR5cGVkZWYgc3RydWN0ICBQQ0ZfRW5jb2RpbmdSZWNfCi0gIHsKLSAgICBGVF9Mb25nICAgIGVuYzsKLSAgICBGVF9VU2hvcnQgIGdseXBoOwotCi0gIH0gUENGX0VuY29kaW5nUmVjLCAqUENGX0VuY29kaW5nOwotCi0KKyAgLyoKKyAgICogVGhpcyBmaWxlIHVzZXMgWDExIHRlcm1pbm9sb2d5IGZvciBQQ0YgZGF0YTsgYW4gYGVuY29kaW5nJyBpbiBYMTEgc3BlYWsKKyAgICogaXMgdGhlIHNhbWUgYXMgYSBgY2hhcmFjdGVyIGNvZGUnIGluIEZyZWVUeXBlIHNwZWFrLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9GYWNlUmVjXwogICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgcm9vdDsKKyAgICBGVF9GYWNlUmVjICAgIHJvb3Q7CiAKLSAgICBGVF9TdHJlYW1SZWMgICBjb21wX3N0cmVhbTsKLSAgICBGVF9TdHJlYW0gICAgICBjb21wX3NvdXJjZTsKKyAgICBGVF9TdHJlYW1SZWMgIGNvbXBfc3RyZWFtOworICAgIEZUX1N0cmVhbSAgICAgY29tcF9zb3VyY2U7CiAKLSAgICBjaGFyKiAgICAgICAgICBjaGFyc2V0X2VuY29kaW5nOwotICAgIGNoYXIqICAgICAgICAgIGNoYXJzZXRfcmVnaXN0cnk7CisgICAgY2hhciogICAgICAgICBjaGFyc2V0X2VuY29kaW5nOworICAgIGNoYXIqICAgICAgICAgY2hhcnNldF9yZWdpc3RyeTsKIAotICAgIFBDRl9Ub2NSZWMgICAgIHRvYzsKLSAgICBQQ0ZfQWNjZWxSZWMgICBhY2NlbDsKKyAgICBQQ0ZfVG9jUmVjICAgIHRvYzsKKyAgICBQQ0ZfQWNjZWxSZWMgIGFjY2VsOwogCi0gICAgaW50ICAgICAgICAgICAgbnByb3BzOwotICAgIFBDRl9Qcm9wZXJ0eSAgIHByb3BlcnRpZXM7CisgICAgaW50ICAgICAgICAgICBucHJvcHM7CisgICAgUENGX1Byb3BlcnR5ICBwcm9wZXJ0aWVzOwogCi0gICAgRlRfVUxvbmcgICAgICAgbm1ldHJpY3M7Ci0gICAgUENGX01ldHJpYyAgICAgbWV0cmljczsKLSAgICBGVF9VTG9uZyAgICAgICBuZW5jb2RpbmdzOwotICAgIFBDRl9FbmNvZGluZyAgIGVuY29kaW5nczsKKyAgICBGVF9VTG9uZyAgICAgIG5tZXRyaWNzOworICAgIFBDRl9NZXRyaWMgICAgbWV0cmljczsKIAotICAgIEZUX1Nob3J0ICAgICAgIGRlZmF1bHRDaGFyOworICAgIFBDRl9FbmNSZWMgICAgZW5jOwogCi0gICAgRlRfVUxvbmcgICAgICAgYml0bWFwc0Zvcm1hdDsKLQotICAgIEZUX0NoYXJNYXAgICAgIGNoYXJtYXBfaGFuZGxlOwotICAgIEZUX0NoYXJNYXBSZWMgIGNoYXJtYXA7ICAvKiBhIHNpbmdsZSBjaGFybWFwIHBlciBmYWNlICovCisgICAgRlRfVUxvbmcgICAgICBiaXRtYXBzRm9ybWF0OwogCiAgIH0gUENGX0ZhY2VSZWMsICpQQ0ZfRmFjZTsKIApkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Zkcml2ci5jIGIvc3JjL3BjZi9wY2Zkcml2ci5jCmluZGV4IDAxMTlkOTQuLmU5ZGQ1MTcgMTAwNjQ0Ci0tLSBhL3NyYy9wY2YvcGNmZHJpdnIuYworKysgYi9zcmMvcGNmL3BjZmRyaXZyLmMKQEAgLTI1LDE3ICsyNSwxNiBAQAogKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfR1pJUF9ICi0jaW5jbHVkZSBGVF9MWldfSAotI2luY2x1ZGUgRlRfQlpJUDJfSAotI2luY2x1ZGUgRlRfRVJST1JTX0gKLSNpbmNsdWRlIEZUX0JERl9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Z3ppcC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bHp3Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRiemlwMi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRiZGYuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dG5hbWVpZC5oPgogCiAjaW5jbHVkZSAicGNmLmgiCiAjaW5jbHVkZSAicGNmZHJpdnIuaCIKQEAgLTQ1LDI5ICs0NCwzMiBAQAogI2luY2x1ZGUgInBjZnV0aWwuaCIKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wY2ZyZWFkCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcGNmcmVhZAogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0JERl9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2YmRmLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BjZmRyaXZlcgorI2RlZmluZSBGVF9DT01QT05FTlQgIHBjZmRyaXZlcgogCiAKKyAgLyoKKyAgICogVGhpcyBmaWxlIHVzZXMgWDExIHRlcm1pbm9sb2d5IGZvciBQQ0YgZGF0YTsgYW4gYGVuY29kaW5nJyBpbiBYMTEgc3BlYWsKKyAgICogaXMgdGhlIHNhbWUgYXMgYSBgY2hhcmFjdGVyIGNvZGUnIGluIEZyZWVUeXBlIHNwZWFrLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFBDRl9DTWFwUmVjXwogICB7Ci0gICAgRlRfQ01hcFJlYyAgICByb290OwotICAgIEZUX1VMb25nICAgICAgbnVtX2VuY29kaW5nczsKLSAgICBQQ0ZfRW5jb2RpbmcgIGVuY29kaW5nczsKKyAgICBGVF9DTWFwUmVjICByb290OworICAgIFBDRl9FbmMgICAgIGVuYzsKIAogICB9IFBDRl9DTWFwUmVjLCAqUENGX0NNYXA7CiAKQEAgLTgyLDggKzg0LDcgQEAKICAgICBGVF9VTlVTRUQoIGluaXRfZGF0YSApOwogCiAKLSAgICBjbWFwLT5udW1fZW5jb2RpbmdzID0gZmFjZS0+bmVuY29kaW5nczsKLSAgICBjbWFwLT5lbmNvZGluZ3MgICAgID0gZmFjZS0+ZW5jb2RpbmdzOworICAgIGNtYXAtPmVuYyA9ICZmYWNlLT5lbmM7CiAKICAgICByZXR1cm4gRlRfRXJyX09rOwogICB9CkBAIC05NSw4ICs5Niw3IEBACiAgICAgUENGX0NNYXAgIGNtYXAgPSAoUENGX0NNYXApcGNmY21hcDsKIAogCi0gICAgY21hcC0+ZW5jb2RpbmdzICAgICA9IE5VTEw7Ci0gICAgY21hcC0+bnVtX2VuY29kaW5ncyA9IDA7CisgICAgY21hcC0+ZW5jID0gTlVMTDsKICAgfQogCiAKQEAgLTEwNCwzNiArMTA0LDI2IEBACiAgIHBjZl9jbWFwX2NoYXJfaW5kZXgoIEZUX0NNYXAgICAgcGNmY21hcCwgIC8qIFBDRl9DTWFwICovCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUgKQogICB7Ci0gICAgUENGX0NNYXAgICAgICBjbWFwICAgICAgPSAoUENGX0NNYXApcGNmY21hcDsKLSAgICBQQ0ZfRW5jb2RpbmcgIGVuY29kaW5ncyA9IGNtYXAtPmVuY29kaW5nczsKLSAgICBGVF9VTG9uZyAgICAgIG1pbiwgbWF4LCBtaWQ7Ci0gICAgRlRfVUludCAgICAgICByZXN1bHQgICAgPSAwOworICAgIFBDRl9DTWFwICAgY21hcCA9IChQQ0ZfQ01hcClwY2ZjbWFwOworICAgIFBDRl9FbmMgICAgZW5jICA9IGNtYXAtPmVuYzsKKyAgICBGVF9VU2hvcnQgIGNoYXJjb2RlUm93OworICAgIEZUX1VTaG9ydCAgY2hhcmNvZGVDb2w7CiAKIAotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gY21hcC0+bnVtX2VuY29kaW5nczsKKyAgICBpZiAoIGNoYXJjb2RlID4gKEZUX1VJbnQzMikoIGVuYy0+bGFzdFJvdyAgKiAyNTYgKyBlbmMtPmxhc3RDb2wgICkgfHwKKyAgICAgICAgIGNoYXJjb2RlIDwgKEZUX1VJbnQzMikoIGVuYy0+Zmlyc3RSb3cgKiAyNTYgKyBlbmMtPmZpcnN0Q29sICkgKQorICAgICAgcmV0dXJuIDA7CiAKLSAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgewotICAgICAgRlRfVUxvbmcgIGNvZGU7CisgICAgY2hhcmNvZGVSb3cgPSAoRlRfVVNob3J0KSggY2hhcmNvZGUgPj4gOCApOworICAgIGNoYXJjb2RlQ29sID0gKEZUX1VTaG9ydCkoIGNoYXJjb2RlICYgMHhGRiApOwogCisgICAgaWYgKCBjaGFyY29kZUNvbCA8IGVuYy0+Zmlyc3RDb2wgfHwKKyAgICAgICAgIGNoYXJjb2RlQ29sID4gZW5jLT5sYXN0Q29sICApCisgICAgICByZXR1cm4gMDsKIAotICAgICAgbWlkICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pZF0uZW5jOwotCi0gICAgICBpZiAoIGNoYXJjb2RlID09IGNvZGUgKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBlbmNvZGluZ3NbbWlkXS5nbHlwaCArIDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoIGNoYXJjb2RlIDwgY29kZSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UKLSAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiAoRlRfVUludCllbmMtPm9mZnNldFsoIGNoYXJjb2RlUm93IC0gZW5jLT5maXJzdFJvdyApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGVuYy0+bGFzdENvbCAtIGVuYy0+Zmlyc3RDb2wgKyAxICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyY29kZUNvbCAtIGVuYy0+Zmlyc3RDb2xdOwogICB9CiAKIApAQCAtMTQxLDUyICsxMzEsNDMgQEAKICAgcGNmX2NtYXBfY2hhcl9uZXh0KCBGVF9DTWFwICAgIHBjZmNtYXAsICAgLyogUENGX0NNYXAgKi8KICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICphY2hhcmNvZGUgKQogICB7Ci0gICAgUENGX0NNYXAgICAgICBjbWFwICAgICAgPSAoUENGX0NNYXApcGNmY21hcDsKLSAgICBQQ0ZfRW5jb2RpbmcgIGVuY29kaW5ncyA9IGNtYXAtPmVuY29kaW5nczsKLSAgICBGVF9VTG9uZyAgICAgIG1pbiwgbWF4LCBtaWQ7Ci0gICAgRlRfVUxvbmcgICAgICBjaGFyY29kZSAgPSAqYWNoYXJjb2RlICsgMTsKLSAgICBGVF9VSW50ICAgICAgIHJlc3VsdCAgICA9IDA7CisgICAgUENGX0NNYXAgICBjbWFwICAgICAgPSAoUENGX0NNYXApcGNmY21hcDsKKyAgICBQQ0ZfRW5jICAgIGVuYyAgICAgICA9IGNtYXAtPmVuYzsKKyAgICBGVF9VSW50MzIgIGNoYXJjb2RlICA9ICphY2hhcmNvZGU7CisgICAgRlRfVVNob3J0ICBjaGFyY29kZVJvdzsKKyAgICBGVF9VU2hvcnQgIGNoYXJjb2RlQ29sOworICAgIEZUX1VJbnQgICAgcmVzdWx0ID0gMDsKIAogCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBjbWFwLT5udW1fZW5jb2RpbmdzOwotCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQorICAgIHdoaWxlICggY2hhcmNvZGUgPCAoRlRfVUludDMyKSggZW5jLT5sYXN0Um93ICogMjU2ICsgZW5jLT5sYXN0Q29sICkgKQogICAgIHsKLSAgICAgIEZUX1VMb25nICBjb2RlOworICAgICAgY2hhcmNvZGUrKzsKIAorICAgICAgaWYgKCBjaGFyY29kZSA8IChGVF9VSW50MzIpKCBlbmMtPmZpcnN0Um93ICogMjU2ICsgZW5jLT5maXJzdENvbCApICkKKyAgICAgICAgY2hhcmNvZGUgPSAoRlRfVUludDMyKSggZW5jLT5maXJzdFJvdyAqIDI1NiArIGVuYy0+Zmlyc3RDb2wgKTsKIAotICAgICAgbWlkICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIGNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pZF0uZW5jOworICAgICAgY2hhcmNvZGVSb3cgPSAoRlRfVVNob3J0KSggY2hhcmNvZGUgPj4gOCApOworICAgICAgY2hhcmNvZGVDb2wgPSAoRlRfVVNob3J0KSggY2hhcmNvZGUgJiAweEZGICk7CiAKLSAgICAgIGlmICggY2hhcmNvZGUgPT0gY29kZSApCisgICAgICBpZiAoIGNoYXJjb2RlQ29sIDwgZW5jLT5maXJzdENvbCApCisgICAgICAgIGNoYXJjb2RlQ29sID0gZW5jLT5maXJzdENvbDsKKyAgICAgIGVsc2UgaWYgKCBjaGFyY29kZUNvbCA+IGVuYy0+bGFzdENvbCApCiAgICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVuY29kaW5nc1ttaWRdLmdseXBoICsgMTsKLSAgICAgICAgZ290byBFeGl0OworICAgICAgICBjaGFyY29kZVJvdysrOworICAgICAgICBjaGFyY29kZUNvbCA9IGVuYy0+Zmlyc3RDb2w7CiAgICAgICB9CiAKLSAgICAgIGlmICggY2hhcmNvZGUgPCBjb2RlICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZQotICAgICAgICBtaW4gPSBtaWQgKyAxOworICAgICAgY2hhcmNvZGUgPSAoRlRfVUludDMyKSggY2hhcmNvZGVSb3cgKiAyNTYgKyBjaGFyY29kZUNvbCApOworCisgICAgICByZXN1bHQgPSAoRlRfVUludCllbmMtPm9mZnNldFsoIGNoYXJjb2RlUm93IC0gZW5jLT5maXJzdFJvdyApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBlbmMtPmxhc3RDb2wgLSBlbmMtPmZpcnN0Q29sICsgMSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJjb2RlQ29sIC0gZW5jLT5maXJzdENvbF07CisgICAgICBpZiAoIHJlc3VsdCAhPSAweEZGRkZVICkKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhcmNvZGUgPSAwOwotICAgIGlmICggbWluIDwgY21hcC0+bnVtX2VuY29kaW5ncyApCi0gICAgewotICAgICAgY2hhcmNvZGUgPSAoRlRfVUxvbmcpZW5jb2RpbmdzW21pbl0uZW5jOwotICAgICAgcmVzdWx0ICAgPSBlbmNvZGluZ3NbbWluXS5nbHlwaCArIDE7Ci0gICAgfQorICAgICphY2hhcmNvZGUgPSBjaGFyY29kZTsKIAotICBFeGl0OgotICAgIGlmICggY2hhcmNvZGUgPiAweEZGRkZGRkZGVUwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJwY2ZfY21hcF9jaGFyX25leHQ6IGNoYXJjb2RlIDB4JXggPiAzMmJpdCBBUEkiICkpOwotICAgICAgKmFjaGFyY29kZSA9IDA7Ci0gICAgICAvKiBYWFg6IHJlc3VsdCBzaG91bGQgYmUgY2hhbmdlZCB0byBpbmRpY2F0ZSBhbiBvdmVyZmxvdyBlcnJvciAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgICAqYWNoYXJjb2RlID0gKEZUX1VJbnQzMiljaGFyY29kZTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKQEAgLTIxNiw4ICsxOTcsOCBAQAogCiAgICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKIAotICAgIEZUX0ZSRUUoIGZhY2UtPmVuY29kaW5ncyApOwogICAgIEZUX0ZSRUUoIGZhY2UtPm1ldHJpY3MgKTsKKyAgICBGVF9GUkVFKCBmYWNlLT5lbmMub2Zmc2V0ICk7CiAKICAgICAvKiBmcmVlIHByb3BlcnRpZXMgKi8KICAgICBpZiAoIGZhY2UtPnByb3BlcnRpZXMgKQpAQCAtNTEyLDkgKzQ5Myw2IEBACiAKICAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKIAotICAgIGlmICggZ2x5cGhfaW5kZXggPiAwICkKLSAgICAgIGdseXBoX2luZGV4LS07Ci0KICAgICBtZXRyaWMgPSBmYWNlLT5tZXRyaWNzICsgZ2x5cGhfaW5kZXg7CiAKICAgICBiaXRtYXAtPnJvd3MgICAgICAgPSAodW5zaWduZWQgaW50KSggbWV0cmljLT5hc2NlbnQgKwpAQCAtNjAxLDExICs1NzksMTEgQEAKICAgfQogCiAKLSAvKgotICAqCi0gICogIEJERiBTRVJWSUNFCi0gICoKLSAgKi8KKyAgLyoKKyAgICoKKyAgICogQkRGIFNFUlZJQ0UKKyAgICoKKyAgICovCiAKICAgc3RhdGljIEZUX0Vycm9yCiAgIHBjZl9nZXRfYmRmX3Byb3BlcnR5KCBQQ0ZfRmFjZSAgICAgICAgICBmYWNlLApAQCAtNjI4LDE0ICs2MDYsMTUgQEAKICAgICAgICAgaWYgKCBwcm9wLT52YWx1ZS5sID4gMHg3RkZGRkZGRkwgICAgICAgICAgfHwKICAgICAgICAgICAgICBwcm9wLT52YWx1ZS5sIDwgKCAtMSAtIDB4N0ZGRkZGRkZMICkgKQogICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggInBjZl9nZXRfYmRmX3Byb3BlcnR5OiIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiB0b28gbGFyZ2UgaW50ZWdlciAweCV4IGlzIHRydW5jYXRlZFxuIiApKTsKKyAgICAgICAgICBGVF9UUkFDRTEoKCAicGNmX2dldF9iZGZfcHJvcGVydHk6IgorICAgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIGludGVnZXIgMHglbHggaXMgdHJ1bmNhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHByb3AtPnZhbHVlLmwgKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgotICAgICAgICAgKiAgVGhlIFBDRiBkcml2ZXIgbG9hZHMgYWxsIHByb3BlcnRpZXMgYXMgc2lnbmVkIGludGVnZXJzLgotICAgICAgICAgKiAgVGhpcyByZWFsbHkgZG9lc24ndCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSB0aGlzIGlzCi0gICAgICAgICAqICBzdWZmaWNpZW50IGZvciBhbnkgbWVhbmluZ2Z1bCB2YWx1ZXMuCisgICAgICAgICAqIFRoZSBQQ0YgZHJpdmVyIGxvYWRzIGFsbCBwcm9wZXJ0aWVzIGFzIHNpZ25lZCBpbnRlZ2Vycy4KKyAgICAgICAgICogVGhpcyByZWFsbHkgZG9lc24ndCBzZWVtIHRvIGJlIGEgcHJvYmxlbSwgYmVjYXVzZSB0aGlzIGlzCisgICAgICAgICAqIHN1ZmZpY2llbnQgZm9yIGFueSBtZWFuaW5nZnVsIHZhbHVlcy4KICAgICAgICAgICovCiAgICAgICAgIGFwcm9wZXJ0eS0+dHlwZSAgICAgID0gQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUjsKICAgICAgICAgYXByb3BlcnR5LT51LmludGVnZXIgPSAoRlRfSW50MzIpcHJvcC0+dmFsdWUubDsKQEAgLTY2OCw3ICs2NDcsNyBAQAogCiAKICAgLyoKLSAgICogIFBST1BFUlRZIFNFUlZJQ0UKKyAgICogUFJPUEVSVFkgU0VSVklDRQogICAgKgogICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCkBAIC03NzcsMTEgKzc1NiwxMSBAQAogICAgIChGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpcGNmX3Byb3BlcnR5X2dldCApICAgICAvKiBnZXRfcHJvcGVydHkgKi8KIAogCi0gLyoKLSAgKgotICAqICBTRVJWSUNFIExJU1QKLSAgKgotICAqLworICAvKgorICAgKgorICAgKiBTRVJWSUNFIExJU1QKKyAgICoKKyAgICovCiAKICAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBwY2Zfc2VydmljZXNbXSA9CiAgIHsKZGlmZiAtLWdpdCBhL3NyYy9wY2YvcGNmZHJpdnIuaCBiL3NyYy9wY2YvcGNmZHJpdnIuaAppbmRleCAyOWQzMDQ5Li5kNDY1MzkzIDEwMDY0NAotLS0gYS9zcmMvcGNmL3BjZmRyaXZyLmgKKysrIGIvc3JjL3BjZi9wY2Zkcml2ci5oCkBAIC0yOCwxNSArMjgsMTEgQEAKICNpZm5kZWYgUENGRFJJVlJfSF8KICNkZWZpbmUgUENGRFJJVlJfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZHJ2Lmg+CisKIAogRlRfQkVHSU5fSEVBREVSCiAKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotI2Vycm9yICJ0aGlzIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0IFBJQyB5ZXQiCi0jZW5kaWYKLQogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgcGNmX2RyaXZlcl9jbGFzczsKIAogRlRfRU5EX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2ZlcnJvci5oIGIvc3JjL3BjZi9wY2ZlcnJvci5oCmluZGV4IGFkZDhlZjIuLjhiOWU5OTAgMTAwNjQ0Ci0tLSBhL3NyYy9wY2YvcGNmZXJyb3IuaAorKysgYi9zcmMvcGNmL3BjZmVycm9yLmgKQEAgLTEsMzEgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBjZmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQQ0YgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBjZmVycm9yLmgKKyAqCisgKiAgIFBDRiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSwgMjAxMiBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBDRiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQQ0YgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBQQ0ZFUlJPUl9IXwogI2RlZmluZSBQQ0ZFUlJPUl9IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzMsNyArMzMsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBQQ0ZfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1BDRgogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBQQ0ZFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvcGNmL3BjZnJlYWQuYyBiL3NyYy9wY2YvcGNmcmVhZC5jCmluZGV4IDUzN2RhMGQuLjg4MTc2ODIgMTAwNjQ0Ci0tLSBhL3NyYy9wY2YvcGNmcmVhZC5jCisrKyBiL3NyYy9wY2YvcGNmcmVhZC5jCkBAIC0yNSwxMSArMjUsMTAgQEAKICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogI2luY2x1ZGUgInBjZi5oIgogI2luY2x1ZGUgInBjZnJlYWQuaCIKQEAgLTM3LDE0ICszNiwxNCBAQAogI2luY2x1ZGUgInBjZmVycm9yLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGNmcmVhZAorI2RlZmluZSBGVF9DT01QT05FTlQgIHBjZnJlYWQKIAogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKQEAgLTEyMiw3ICsxMjEsNyBAQAogICAgICAgICAgdG9jLT5jb3VudCA+IDkgICAgICAgICAgICAgICAgICAgICApCiAgICAgewogICAgICAgRlRfVFJBQ0UwKCggInBjZl9yZWFkX1RPQzogYWRqdXN0aW5nIG51bWJlciBvZiB0YWJsZXMiCi0gICAgICAgICAgICAgICAgICAiIChmcm9tICVkIHRvICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICIgKGZyb20gJWxkIHRvICVsZClcbiIsCiAgICAgICAgICAgICAgICAgICB0b2MtPmNvdW50LAogICAgICAgICAgICAgICAgICAgRlRfTUlOKCBzdHJlYW0tPnNpemUgPj4gNCwgOSApICkpOwogICAgICAgdG9jLT5jb3VudCA9IEZUX01JTiggc3RyZWFtLT5zaXplID4+IDQsIDkgKTsKQEAgLTE3OCwyMyArMTc3LDIzIEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiAgV2Ugbm93IGNoZWNrIHdoZXRoZXIgdGhlIGBzaXplJyBhbmQgYG9mZnNldCcgdmFsdWVzIGFyZSByZWFzb25hYmxlOgotICAgICAqICBgb2Zmc2V0JyArIGBzaXplJyBtdXN0IG5vdCBleGNlZWQgdGhlIHN0cmVhbSBzaXplLgorICAgICAqIFdlIG5vdyBjaGVjayB3aGV0aGVyIHRoZSBgc2l6ZScgYW5kIGBvZmZzZXQnIHZhbHVlcyBhcmUgcmVhc29uYWJsZToKKyAgICAgKiBgb2Zmc2V0JyArIGBzaXplJyBtdXN0IG5vdCBleGNlZWQgdGhlIHN0cmVhbSBzaXplLgogICAgICAqCi0gICAgICogIE5vdGUsIGhvd2V2ZXIsIHRoYXQgWDExJ3MgYHBjZldyaXRlRm9udCcgcm91dGluZSAodXNlZCBieSB0aGUKLSAgICAgKiAgYGJkZnRvcGNmJyBwcm9ncmFtIHRvIGNyZWF0ZSBQREYgZm9udCBmaWxlcykgaGFzIHR3byBzcGVjaWFsCi0gICAgICogIGZlYXR1cmVzLgorICAgICAqIE5vdGUsIGhvd2V2ZXIsIHRoYXQgWDExJ3MgYHBjZldyaXRlRm9udCcgcm91dGluZSAodXNlZCBieSB0aGUKKyAgICAgKiBgYmRmdG9wY2YnIHByb2dyYW0gdG8gY3JlYXRlIFBDRiBmb250IGZpbGVzKSBoYXMgdHdvIHNwZWNpYWwKKyAgICAgKiBmZWF0dXJlcy4KICAgICAgKgotICAgICAqICAtIEl0IGFsd2F5cyBhc3NpZ25zIHRoZSBhY2NlbGVyYXRvciB0YWJsZSBhIHNpemUgb2YgMTAwIGJ5dGVzIGluIHRoZQotICAgICAqICAgIFRPQywgcmVnYXJkbGVzcyBvZiBpdHMgcmVhbCBzaXplLCB3aGljaCBjYW4gdmFyeSBiZXR3ZWVuIDM0IGFuZCA3MgotICAgICAqICAgIGJ5dGVzLgorICAgICAqIC0gSXQgYWx3YXlzIGFzc2lnbnMgdGhlIGFjY2VsZXJhdG9yIHRhYmxlIGEgc2l6ZSBvZiAxMDAgYnl0ZXMgaW4gdGhlCisgICAgICogICBUT0MsIHJlZ2FyZGxlc3Mgb2YgaXRzIHJlYWwgc2l6ZSwgd2hpY2ggY2FuIHZhcnkgYmV0d2VlbiAzNCBhbmQgNzIKKyAgICAgKiAgIGJ5dGVzLgogICAgICAqCi0gICAgICogIC0gRHVlIHRvIHRoZSB3YXkgdGhlIHJvdXRpbmUgaXMgZGVzaWduZWQsIGl0IHNoaXBzIG91dCB0aGUgbGFzdCBmb250Ci0gICAgICogICAgdGFibGUgd2l0aCBpdHMgcmVhbCBzaXplLCBpZ25vcmluZyB0aGUgVE9DJ3Mgc2l6ZSB2YWx1ZS4gIFNpbmNlCi0gICAgICogICAgdGhlIFRPQyBzaXplIHZhbHVlcyBhcmUgYWx3YXlzIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiA0LCB0aGUKLSAgICAgKiAgICBkaWZmZXJlbmNlIGNhbiBiZSB1cCB0byB0aHJlZSBieXRlcyBmb3IgYWxsIHRhYmxlcyBleGNlcHQgdGhlCi0gICAgICogICAgYWNjZWxlcmF0b3IgdGFibGUsIGZvciB3aGljaCB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgYXMgbGFyZ2UgYXMgNjYKLSAgICAgKiAgICBieXRlcy4KKyAgICAgKiAtIER1ZSB0byB0aGUgd2F5IHRoZSByb3V0aW5lIGlzIGRlc2lnbmVkLCBpdCBzaGlwcyBvdXQgdGhlIGxhc3QgZm9udAorICAgICAqICAgdGFibGUgd2l0aCBpdHMgcmVhbCBzaXplLCBpZ25vcmluZyB0aGUgVE9DJ3Mgc2l6ZSB2YWx1ZS4gIFNpbmNlCisgICAgICogICB0aGUgVE9DIHNpemUgdmFsdWVzIGFyZSBhbHdheXMgcm91bmRlZCB1cCB0byBhIG11bHRpcGxlIG9mIDQsIHRoZQorICAgICAqICAgZGlmZmVyZW5jZSBjYW4gYmUgdXAgdG8gdGhyZWUgYnl0ZXMgZm9yIGFsbCB0YWJsZXMgZXhjZXB0IHRoZQorICAgICAqICAgYWNjZWxlcmF0b3IgdGFibGUsIGZvciB3aGljaCB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgYXMgbGFyZ2UgYXMgNjYKKyAgICAgKiAgIGJ5dGVzLgogICAgICAqCiAgICAgICovCiAKQEAgLTI0Miw3ICsyNDEsNyBAQAogICAgICAgICAgIGlmICggdGFibGVzW2ldLnR5cGUgPT0gKEZUX1VJbnQpKCAxIDw8IGogKSApCiAgICAgICAgICAgICBuYW1lID0gdGFibGVOYW1lc1tqXTsKIAotICAgICAgICBGVF9UUkFDRTQoKCAiICAlZDogdHlwZT0lcywgZm9ybWF0PTB4JVgsIgorICAgICAgICBGVF9UUkFDRTQoKCAiICAlZDogdHlwZT0lcywgZm9ybWF0PTB4JWxYLCIKICAgICAgICAgICAgICAgICAgICAgIiBzaXplPSVsZCAoMHglbFgpLCBvZmZzZXQ9JWxkICgweCVsWClcbiIsCiAgICAgICAgICAgICAgICAgICAgIGksIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgIHRhYmxlc1tpXS5mb3JtYXQsCkBAIC02NjEsNyArNjYwLDcgQEAKICAgICAgIHsKICAgICAgICAgcHJvcGVydGllc1tpXS52YWx1ZS5sID0gcHJvcHNbaV0udmFsdWU7CiAKLSAgICAgICAgRlRfVFJBQ0U0KCggIiAlZFxuIiwgcHJvcGVydGllc1tpXS52YWx1ZS5sICkpOworICAgICAgICBGVF9UUkFDRTQoKCAiICVsZFxuIiwgcHJvcGVydGllc1tpXS52YWx1ZS5sICkpOwogICAgICAgfQogICAgIH0KIApAQCAtNzQzLDMzICs3NDIsMzkgQEAKICAgICBpZiAoICFvcmlnX25tZXRyaWNzICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwogCi0gICAgLyogUENGIGlzIGEgZm9ybWF0IGZyb20gYW5jaWVudCB0aW1lczsgVW5pY29kZSB3YXMgaW4gaXRzICAgICAgICovCi0gICAgLyogaW5mYW5jeSwgYW5kIHdpZGVseSB1c2VkIHR3by1ieXRlIGNoYXJhY3RlciBzZXRzIGZvciBDSksgICAgICovCi0gICAgLyogc2NyaXB0cyAoQmlnIDUsIEdCIDIzMTIsIEpJUyBYIDAyMDgsIGV0Yy4pIGRpZCBoYXZlIGF0IG1vc3QgICovCi0gICAgLyogMTUwMDAgY2hhcmFjdGVycy4gIEV2ZW4gdGhlIG1vcmUgZXhvdGljIENOUyAxMTY0MyBhbmQgQ0NDSUkgICovCi0gICAgLyogc3RhbmRhcmRzLCB3aGljaCB3ZXJlIGVzc2VudGlhbGx5IHRocmVlLWJ5dGUgY2hhcmFjdGVyIHNldHMsICovCi0gICAgLyogcHJvdmlkZWQgbGVzcyB0aGVuIDY1NTM2IGFzc2lnbmVkIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2hpbGUgdGVjaG5pY2FsbHkgcG9zc2libGUgdG8gaGF2ZSBhIGxhcmdlciBudW1iZXIgb2YgZ2x5cGhzICovCi0gICAgLyogaW4gUENGIGZpbGVzLCB3ZSB0aHVzIGxpbWl0IHRoZSBudW1iZXIgdG8gNjU1MzYuICAgICAgICAgICAgICovCi0gICAgaWYgKCBvcmlnX25tZXRyaWNzID4gNjU1MzYgKQorICAgIC8qCisgICAgICogUENGIGlzIGEgZm9ybWF0IGZyb20gYW5jaWVudCB0aW1lczsgVW5pY29kZSB3YXMgaW4gaXRzIGluZmFuY3ksIGFuZAorICAgICAqIHdpZGVseSB1c2VkIHR3by1ieXRlIGNoYXJhY3RlciBzZXRzIGZvciBDSksgc2NyaXB0cyAoQmlnIDUsIEdCIDIzMTIsCisgICAgICogSklTIFggMDIwOCwgZXRjLikgZGlkIGhhdmUgYXQgbW9zdCAxNTAwMCBjaGFyYWN0ZXJzLiAgRXZlbiB0aGUgbW9yZQorICAgICAqIGV4b3RpYyBDTlMgMTE2NDMgYW5kIENDQ0lJIHN0YW5kYXJkcywgd2hpY2ggd2VyZSBlc3NlbnRpYWxseQorICAgICAqIHRocmVlLWJ5dGUgY2hhcmFjdGVyIHNldHMsIHByb3ZpZGVkIGxlc3MgdGhlbiA2NTUzNiBhc3NpZ25lZAorICAgICAqIGNoYXJhY3RlcnMuCisgICAgICoKKyAgICAgKiBXaGlsZSB0ZWNobmljYWxseSBwb3NzaWJsZSB0byBoYXZlIGEgbGFyZ2VyIG51bWJlciBvZiBnbHlwaHMgaW4gUENGCisgICAgICogZmlsZXMsIHdlIHRodXMgbGltaXQgdGhlIG51bWJlciB0byA2NTUzNSwgdGFraW5nIGludG8gYWNjb3VudCB0aGF0IHdlCisgICAgICogc3ludGhlc2l6ZSB0aGUgbWV0cmljcyBvZiBnbHlwaCAwIHRvIGJlIGEgY29weSBvZiB0aGUgYGRlZmF1bHQKKyAgICAgKiBjaGFyYWN0ZXInLCBhbmQgdGhhdCAweEZGRkYgaW4gdGhlIGVuY29kaW5ncyBhcnJheSBpbmRpY2F0ZXMgYQorICAgICAqIG1pc3NpbmcgZ2x5cGguCisgICAgICovCisgICAgaWYgKCBvcmlnX25tZXRyaWNzID4gNjU1MzQgKQogICAgIHsKICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgIiBvbmx5IGxvYWRpbmcgZmlyc3QgNjU1MzYgbWV0cmljc1xuIiApKTsKLSAgICAgIG5tZXRyaWNzID0gNjU1MzY7CisgICAgICAgICAgICAgICAgICAiIG9ubHkgbG9hZGluZyBmaXJzdCA2NTUzNCBtZXRyaWNzXG4iICkpOworICAgICAgbm1ldHJpY3MgPSA2NTUzNDsKICAgICB9CiAgICAgZWxzZQogICAgICAgbm1ldHJpY3MgPSBvcmlnX25tZXRyaWNzOwogCi0gICAgZmFjZS0+bm1ldHJpY3MgPSBubWV0cmljczsKKyAgICBmYWNlLT5ubWV0cmljcyA9IG5tZXRyaWNzICsgMTsKIAotICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5tZXRyaWNzLCBubWV0cmljcyApICkKKyAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+bWV0cmljcywgZmFjZS0+bm1ldHJpY3MgKSApCiAgICAgICByZXR1cm4gZXJyb3I7CiAKLSAgICBtZXRyaWNzID0gZmFjZS0+bWV0cmljczsKKyAgICAvKiB3ZSBoYW5kbGUgZ2x5cGggaW5kZXggMCBsYXRlciBvbiAqLworICAgIG1ldHJpY3MgPSBmYWNlLT5tZXRyaWNzICsgMTsKIAogICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBubWV0cmljczsgaSsrLCBtZXRyaWNzKysgKQorICAgIGZvciAoIGkgPSAxOyBpIDwgZmFjZS0+bm1ldHJpY3M7IGkrKywgbWV0cmljcysrICkKICAgICB7CiAgICAgICBGVF9UUkFDRTUoKCAiICBpZHggJWxkOiIsIGkgKSk7CiAgICAgICBlcnJvciA9IHBjZl9nZXRfbWV0cmljKCBzdHJlYW0sIGZvcm1hdCwgbWV0cmljcyApOwpAQCAtNzkyLDcgKzc5Nyw3IEBACiAgICAgICAgIG1ldHJpY3MtPmRlc2NlbnQgICAgICAgICAgPSAwOwogCiAgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgbWV0cmljcyBmb3IgZ2x5cGggJWRcbiIsIGkgKSk7CisgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBtZXRyaWNzIGZvciBnbHlwaCAlbGRcbiIsIGkgKSk7CiAgICAgICB9CiAgICAgfQogCkBAIC04MDgsMTIgKzgxMywxMCBAQAogICBwY2ZfZ2V0X2JpdG1hcHMoIEZUX1N0cmVhbSAgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgIFBDRl9GYWNlICAgZmFjZSApCiAgIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ICA9IEZUX0ZBQ0UoIGZhY2UgKS0+bWVtb3J5OwotICAgIEZUX0xvbmcqICAgb2Zmc2V0cyA9IE5VTEw7Ci0gICAgRlRfTG9uZyAgICBiaXRtYXBTaXplc1tHTFlQSFBBRE9QVElPTlNdOwotICAgIEZUX1VMb25nICAgZm9ybWF0LCBzaXplOwotICAgIEZUX1VMb25nICAgbmJpdG1hcHMsIG9yaWdfbmJpdG1hcHMsIGksIHNpemViaXRtYXBzID0gMDsKKyAgICBGVF9FcnJvciAgZXJyb3I7CisgICAgRlRfVUxvbmcgIGJpdG1hcFNpemVzW0dMWVBIUEFET1BUSU9OU107CisgICAgRlRfVUxvbmcgIGZvcm1hdCwgc2l6ZSwgcG9zOworICAgIEZUX1VMb25nICBuYml0bWFwcywgb3JpZ19uYml0bWFwcywgaSwgc2l6ZWJpdG1hcHMgPSAwOwogCiAKICAgICBlcnJvciA9IHBjZl9zZWVrX3RvX3RhYmxlX3R5cGUoIHN0cmVhbSwKQEAgLTg1OSwzMSArODYyLDQ2IEBACiAgICAgRlRfVFJBQ0U0KCggIiAgbnVtYmVyIG9mIGJpdG1hcHM6ICVsZFxuIiwgb3JpZ19uYml0bWFwcyApKTsKIAogICAgIC8qIHNlZSBjb21tZW50IGluIGBwY2ZfZ2V0X21ldHJpY3MnICovCi0gICAgaWYgKCBvcmlnX25iaXRtYXBzID4gNjU1MzYgKQorICAgIGlmICggb3JpZ19uYml0bWFwcyA+IDY1NTM0ICkKICAgICB7CiAgICAgICBGVF9UUkFDRTAoKCAicGNmX2dldF9iaXRtYXBzOiIKLSAgICAgICAgICAgICAgICAgICIgb25seSBsb2FkaW5nIGZpcnN0IDY1NTM2IGJpdG1hcHNcbiIgKSk7Ci0gICAgICBuYml0bWFwcyA9IDY1NTM2OworICAgICAgICAgICAgICAgICAgIiBvbmx5IGxvYWRpbmcgZmlyc3QgNjU1MzQgYml0bWFwc1xuIiApKTsKKyAgICAgIG5iaXRtYXBzID0gNjU1MzQ7CiAgICAgfQogICAgIGVsc2UKICAgICAgIG5iaXRtYXBzID0gb3JpZ19uYml0bWFwczsKIAotICAgIGlmICggbmJpdG1hcHMgIT0gZmFjZS0+bm1ldHJpY3MgKQorICAgIC8qIG5vIGV4dHJhIGJpdG1hcCBmb3IgZ2x5cGggMCAqLworICAgIGlmICggbmJpdG1hcHMgIT0gZmFjZS0+bm1ldHJpY3MgLSAxICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwogCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIG9mZnNldHMsIG5iaXRtYXBzICkgKQotICAgICAgcmV0dXJuIGVycm9yOworICAgIC8qIHN0YXJ0IHBvc2l0aW9uIG9mIGJpdG1hcCBkYXRhICovCisgICAgcG9zID0gc3RyZWFtLT5wb3MgKyBuYml0bWFwcyAqIDQgKyA0ICogNDsKIAogICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBuYml0bWFwczsgaSsrICkKKyAgICBmb3IgKCBpID0gMTsgaSA8PSBuYml0bWFwczsgaSsrICkKICAgICB7Ci0gICAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCi0gICAgICAgICh2b2lkKUZUX1JFQURfTE9ORyggb2Zmc2V0c1tpXSApOwotICAgICAgZWxzZQotICAgICAgICAodm9pZClGVF9SRUFEX0xPTkdfTEUoIG9mZnNldHNbaV0gKTsKKyAgICAgIEZUX1VMb25nICBvZmZzZXQ7CiAKLSAgICAgIEZUX1RSQUNFNSgoICIgIGJpdG1hcCAlbGQ6IG9mZnNldCAlbGQgKDB4JWxYKVxuIiwKLSAgICAgICAgICAgICAgICAgIGksIG9mZnNldHNbaV0sIG9mZnNldHNbaV0gKSk7CisKKyAgICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKKyAgICAgICAgKHZvaWQpRlRfUkVBRF9VTE9ORyggb2Zmc2V0ICk7CisgICAgICBlbHNlCisgICAgICAgICh2b2lkKUZUX1JFQURfVUxPTkdfTEUoIG9mZnNldCApOworCisgICAgICBGVF9UUkFDRTUoKCAiICBiaXRtYXAgJWx1OiBvZmZzZXQgJWx1ICgweCVsWClcbiIsCisgICAgICAgICAgICAgICAgICBpLCBvZmZzZXQsIG9mZnNldCApKTsKKworICAgICAgLyogcmlnaHQgbm93LCB3ZSBvbmx5IGNoZWNrIHRoZSBvZmZzZXQgd2l0aCBhIHJvdWdoIGVzdGltYXRlOyAqLworICAgICAgLyogYWN0dWFsIGJpdG1hcHMgYXJlIG9ubHkgbG9hZGVkIG9uIGRlbWFuZCAgICAgICAgICAgICAgICAgICAqLworICAgICAgaWYgKCBvZmZzZXQgPiBzaXplICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9nZXRfYml0bWFwczoiCisgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBvZmZzZXQgdG8gYml0bWFwIGRhdGEgb2YgZ2x5cGggJWx1XG4iLCBpICkpOworICAgICAgICBmYWNlLT5tZXRyaWNzW2ldLmJpdHMgPSBwb3M7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGZhY2UtPm1ldHJpY3NbaV0uYml0cyA9IHBvcyArIG9mZnNldDsKICAgICB9CiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEJhaWw7CkBAIC04OTEsNjIgKzkwOSw4NCBAQAogICAgIGZvciAoIGkgPSAwOyBpIDwgR0xZUEhQQURPUFRJT05TOyBpKysgKQogICAgIHsKICAgICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKLSAgICAgICAgKHZvaWQpRlRfUkVBRF9MT05HKCBiaXRtYXBTaXplc1tpXSApOworICAgICAgICAodm9pZClGVF9SRUFEX1VMT05HKCBiaXRtYXBTaXplc1tpXSApOwogICAgICAgZWxzZQotICAgICAgICAodm9pZClGVF9SRUFEX0xPTkdfTEUoIGJpdG1hcFNpemVzW2ldICk7CisgICAgICAgICh2b2lkKUZUX1JFQURfVUxPTkdfTEUoIGJpdG1hcFNpemVzW2ldICk7CiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBCYWlsOwogCi0gICAgICBzaXplYml0bWFwcyA9IChGVF9VTG9uZyliaXRtYXBTaXplc1tQQ0ZfR0xZUEhfUEFEX0lOREVYKCBmb3JtYXQgKV07CisgICAgICBzaXplYml0bWFwcyA9IGJpdG1hcFNpemVzW1BDRl9HTFlQSF9QQURfSU5ERVgoIGZvcm1hdCApXTsKIAotICAgICAgRlRfVFJBQ0U0KCggIiAgJWxkLWJpdCBwYWRkaW5nIGltcGxpZXMgYSBzaXplIG9mICVsZFxuIiwKKyAgICAgIEZUX1RSQUNFNCgoICIgICVkLWJpdCBwYWRkaW5nIGltcGxpZXMgYSBzaXplIG9mICVsdVxuIiwKICAgICAgICAgICAgICAgICAgIDggPDwgaSwgYml0bWFwU2l6ZXNbaV0gKSk7CiAgICAgfQogCi0gICAgRlRfVFJBQ0U0KCggIiAgJWxkIGJpdG1hcHMsIHVzaW5nICVsZC1iaXQgcGFkZGluZ1xuIiwKKyAgICBGVF9UUkFDRTQoKCAiICAlbHUgYml0bWFwcywgdXNpbmcgJWQtYml0IHBhZGRpbmdcbiIsCiAgICAgICAgICAgICAgICAgbmJpdG1hcHMsCiAgICAgICAgICAgICAgICAgOCA8PCBQQ0ZfR0xZUEhfUEFEX0lOREVYKCBmb3JtYXQgKSApKTsKLSAgICBGVF9UUkFDRTQoKCAiICBiaXRtYXAgc2l6ZTogJWxkXG4iLCBzaXplYml0bWFwcyApKTsKKyAgICBGVF9UUkFDRTQoKCAiICBiaXRtYXAgc2l6ZTogJWx1XG4iLCBzaXplYml0bWFwcyApKTsKIAogICAgIEZUX1VOVVNFRCggc2l6ZWJpdG1hcHMgKTsgICAgICAgLyogb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgKi8KIAotICAgIC8qIHJpZ2h0IG5vdywgd2Ugb25seSBjaGVjayB0aGUgYml0bWFwIG9mZnNldHM7ICovCi0gICAgLyogYWN0dWFsIGJpdG1hcHMgYXJlIG9ubHkgbG9hZGVkIG9uIGRlbWFuZCAgICAgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IG5iaXRtYXBzOyBpKysgKQotICAgIHsKLSAgICAgIC8qIHJvdWdoIGVzdGltYXRlICovCi0gICAgICBpZiAoICggb2Zmc2V0c1tpXSA8IDAgKSAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKCAoRlRfVUxvbmcpb2Zmc2V0c1tpXSA+IHNpemUgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X2JpdG1hcHM6IgotICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgb2Zmc2V0IHRvIGJpdG1hcCBkYXRhIG9mIGdseXBoICVsZFxuIiwgaSApKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZmFjZS0+bWV0cmljc1tpXS5iaXRzID0gc3RyZWFtLT5wb3MgKyAoRlRfVUxvbmcpb2Zmc2V0c1tpXTsKLSAgICB9Ci0KICAgICBmYWNlLT5iaXRtYXBzRm9ybWF0ID0gZm9ybWF0OwogCiAgIEJhaWw6Ci0gICAgRlRfRlJFRSggb2Zmc2V0cyApOwogICAgIHJldHVybiBlcnJvcjsKICAgfQogCiAKKyAgLyoKKyAgICogVGhpcyBmaWxlIHVzZXMgWDExIHRlcm1pbm9sb2d5IGZvciBQQ0YgZGF0YTsgYW4gYGVuY29kaW5nJyBpbiBYMTEgc3BlYWsKKyAgICogaXMgdGhlIHNhbWUgYXMgYSBjaGFyYWN0ZXIgY29kZSBpbiBGcmVlVHlwZSBzcGVhay4KKyAgICovCisjZGVmaW5lIFBDRl9FTkNfU0laRSAgMTAKKworICBzdGF0aWMKKyAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl9lbmNfaGVhZGVyW10gPQorICB7CisjdW5kZWYgIEZUX1NUUlVDVFVSRQorI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBDRl9FbmNSZWMKKworICAgIEZUX0ZSQU1FX1NUQVJUKCBQQ0ZfRU5DX1NJWkUgKSwKKyAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggZmlyc3RDb2wgKSwKKyAgICAgIEZUX0ZSQU1FX1VTSE9SVF9MRSggbGFzdENvbCApLAorICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBmaXJzdFJvdyApLAorICAgICAgRlRfRlJBTUVfVVNIT1JUX0xFKCBsYXN0Um93ICksCisgICAgICBGVF9GUkFNRV9VU0hPUlRfTEUoIGRlZmF1bHRDaGFyICksCisgICAgRlRfRlJBTUVfRU5ECisgIH07CisKKworICBzdGF0aWMKKyAgY29uc3QgRlRfRnJhbWVfRmllbGQgIHBjZl9lbmNfbXNiX2hlYWRlcltdID0KKyAgeworI3VuZGVmICBGVF9TVFJVQ1RVUkUKKyNkZWZpbmUgRlRfU1RSVUNUVVJFICBQQ0ZfRW5jUmVjCisKKyAgICBGVF9GUkFNRV9TVEFSVCggUENGX0VOQ19TSVpFICksCisgICAgICBGVF9GUkFNRV9VU0hPUlQoIGZpcnN0Q29sICksCisgICAgICBGVF9GUkFNRV9VU0hPUlQoIGxhc3RDb2wgKSwKKyAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZmlyc3RSb3cgKSwKKyAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbGFzdFJvdyApLAorICAgICAgRlRfRlJBTUVfVVNIT1JUKCBkZWZhdWx0Q2hhciApLAorICAgIEZUX0ZSQU1FX0VORAorICB9OworCisKICAgc3RhdGljIEZUX0Vycm9yCiAgIHBjZl9nZXRfZW5jb2RpbmdzKCBGVF9TdHJlYW0gIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgIFBDRl9GYWNlICAgZmFjZSApCiAgIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gRlRfRkFDRSggZmFjZSApLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICBmb3JtYXQsIHNpemU7Ci0gICAgaW50ICAgICAgICAgICBmaXJzdENvbCwgbGFzdENvbDsKLSAgICBpbnQgICAgICAgICAgIGZpcnN0Um93LCBsYXN0Um93OwotICAgIEZUX1VMb25nICAgICAgbmVuY29kaW5nOwotICAgIEZUX1VTaG9ydCAgICAgZW5jb2RpbmdPZmZzZXQ7Ci0gICAgaW50ICAgICAgICAgICBpLCBqOwotICAgIEZUX1VMb25nICAgICAgazsKLSAgICBQQ0ZfRW5jb2RpbmcgIGVuY29kaW5nID0gTlVMTDsKKyAgICBGVF9FcnJvciAgICBlcnJvcjsKKyAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBGVF9GQUNFKCBmYWNlICktPm1lbW9yeTsKKyAgICBGVF9VTG9uZyAgICBmb3JtYXQsIHNpemU7CisgICAgUENGX0VuYyAgICAgZW5jID0gJmZhY2UtPmVuYzsKKyAgICBGVF9VTG9uZyAgICBuZW5jb2Rpbmc7CisgICAgRlRfVVNob3J0KiAgb2Zmc2V0OworICAgIEZUX1VTaG9ydCAgIGRlZmF1bHRDaGFyUm93LCBkZWZhdWx0Q2hhckNvbDsKKyAgICBGVF9VU2hvcnQgICBlbmNvZGluZ09mZnNldCwgZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldDsKKyAgICBGVF9VU2hvcnQgICBpLCBqOworICAgIEZUX0J5dGUqICAgIHBvczsKIAogCiAgICAgZXJyb3IgPSBwY2Zfc2Vla190b190YWJsZV90eXBlKCBzdHJlYW0sCkBAIC05NTYsMTA1ICs5OTYsMTQ4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUgKTsKICAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgIGdvdG8gQmFpbDsKIAotICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgMTQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGZvcm1hdCA9IEZUX0dFVF9VTE9OR19MRSgpOwotCi0gICAgaWYgKCBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgKQotICAgIHsKLSAgICAgIGZpcnN0Q29sICAgICAgICAgID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgICBsYXN0Q29sICAgICAgICAgICA9IEZUX0dFVF9TSE9SVCgpOwotICAgICAgZmlyc3RSb3cgICAgICAgICAgPSBGVF9HRVRfU0hPUlQoKTsKLSAgICAgIGxhc3RSb3cgICAgICAgICAgID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgICBmYWNlLT5kZWZhdWx0Q2hhciA9IEZUX0dFVF9TSE9SVCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmlyc3RDb2wgICAgICAgICAgPSBGVF9HRVRfU0hPUlRfTEUoKTsKLSAgICAgIGxhc3RDb2wgICAgICAgICAgID0gRlRfR0VUX1NIT1JUX0xFKCk7Ci0gICAgICBmaXJzdFJvdyAgICAgICAgICA9IEZUX0dFVF9TSE9SVF9MRSgpOwotICAgICAgbGFzdFJvdyAgICAgICAgICAgPSBGVF9HRVRfU0hPUlRfTEUoKTsKLSAgICAgIGZhY2UtPmRlZmF1bHRDaGFyID0gRlRfR0VUX1NIT1JUX0xFKCk7Ci0gICAgfQotCi0gICAgRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICk7CisgICAgaWYgKCBGVF9SRUFEX1VMT05HX0xFKCBmb3JtYXQgKSApCisgICAgICBnb3RvIEJhaWw7CiAKICAgICBGVF9UUkFDRTQoKCAicGNmX2dldF9lbmNvZGluZ3M6XG4iCiAgICAgICAgICAgICAgICAgIiAgZm9ybWF0OiAweCVsWCAoJXMpXG4iLAogICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICBQQ0ZfQllURV9PUkRFUiggZm9ybWF0ICkgPT0gTVNCRmlyc3QgPyAiTVNCIiA6ICJMU0IiICkpOwogCi0gICAgaWYgKCAhUENGX0ZPUk1BVF9NQVRDSCggZm9ybWF0LCBQQ0ZfREVGQVVMVF9GT1JNQVQgKSApCisgICAgaWYgKCAhUENGX0ZPUk1BVF9NQVRDSCggZm9ybWF0LCBQQ0ZfREVGQVVMVF9GT1JNQVQgKSAmJgorICAgICAgICAgIVBDRl9GT1JNQVRfTUFUQ0goIGZvcm1hdCwgUENGX0JERl9FTkNPRElOR1MgKSAgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CiAKKyAgICBpZiAoIFBDRl9CWVRFX09SREVSKCBmb3JtYXQgKSA9PSBNU0JGaXJzdCApCisgICAgeworICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHBjZl9lbmNfbXNiX2hlYWRlciwgZW5jICkgKQorICAgICAgICBnb3RvIEJhaWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNmX2VuY19oZWFkZXIsIGVuYyApICkKKyAgICAgICAgZ290byBCYWlsOworICAgIH0KKwogICAgIEZUX1RSQUNFNCgoICIgIGZpcnN0Q29sIDB4JVgsIGxhc3RDb2wgMHglWFxuIgotICAgICAgICAgICAgICAgICIgIGZpcnN0Um93IDB4JVgsIGxhc3RSb3cgMHglWFxuIiwKLSAgICAgICAgICAgICAgICBmaXJzdENvbCwgbGFzdENvbCwKLSAgICAgICAgICAgICAgICBmaXJzdFJvdywgbGFzdFJvdyApKTsKKyAgICAgICAgICAgICAgICAiICBmaXJzdFJvdyAweCVYLCBsYXN0Um93IDB4JVhcbiIKKyAgICAgICAgICAgICAgICAiICBkZWZhdWx0Q2hhciAweCVYXG4iLAorICAgICAgICAgICAgICAgIGVuYy0+Zmlyc3RDb2wsIGVuYy0+bGFzdENvbCwKKyAgICAgICAgICAgICAgICBlbmMtPmZpcnN0Um93LCBlbmMtPmxhc3RSb3csCisgICAgICAgICAgICAgICAgZW5jLT5kZWZhdWx0Q2hhciApKTsKIAogICAgIC8qIHNhbml0eSBjaGVja3M7IHdlIGxpbWl0IG51bWJlcnMgb2Ygcm93cyBhbmQgY29sdW1ucyB0byAyNTYgKi8KLSAgICBpZiAoIGZpcnN0Q29sIDwgMCAgICAgICB8fAotICAgICAgICAgZmlyc3RDb2wgPiBsYXN0Q29sIHx8Ci0gICAgICAgICBsYXN0Q29sICA+IDB4RkYgICAgfHwKLSAgICAgICAgIGZpcnN0Um93IDwgMCAgICAgICB8fAotICAgICAgICAgZmlyc3RSb3cgPiBsYXN0Um93IHx8Ci0gICAgICAgICBsYXN0Um93ICA+IDB4RkYgICAgKQorICAgIGlmICggZW5jLT5maXJzdENvbCA+IGVuYy0+bGFzdENvbCB8fAorICAgICAgICAgZW5jLT5sYXN0Q29sICA+IDB4RkYgICAgICAgICB8fAorICAgICAgICAgZW5jLT5maXJzdFJvdyA+IGVuYy0+bGFzdFJvdyB8fAorICAgICAgICAgZW5jLT5sYXN0Um93ICA+IDB4RkYgICAgICAgICApCiAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKIAotICAgIG5lbmNvZGluZyA9IChGVF9VTG9uZykoIGxhc3RDb2wgLSBmaXJzdENvbCArIDEgKSAqCi0gICAgICAgICAgICAgICAgKEZUX1VMb25nKSggbGFzdFJvdyAtIGZpcnN0Um93ICsgMSApOworICAgIG5lbmNvZGluZyA9IChGVF9VTG9uZykoIGVuYy0+bGFzdENvbCAtIGVuYy0+Zmlyc3RDb2wgKyAxICkgKgorICAgICAgICAgICAgICAgIChGVF9VTG9uZykoIGVuYy0+bGFzdFJvdyAtIGVuYy0+Zmlyc3RSb3cgKyAxICk7CiAKLSAgICBpZiAoIEZUX05FV19BUlJBWSggZW5jb2RpbmcsIG5lbmNvZGluZyApICkKLSAgICAgIHJldHVybiBlcnJvcjsKKyAgICBpZiAoIEZUX05FV19BUlJBWSggZW5jLT5vZmZzZXQsIG5lbmNvZGluZyApICkKKyAgICAgIGdvdG8gQmFpbDsKIAogICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgMiAqIG5lbmNvZGluZyApOwogICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBCYWlsOworICAgICAgZ290byBFeGl0OwogCiAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKIAotICAgIGsgPSAwOwotICAgIGZvciAoIGkgPSBmaXJzdFJvdzsgaSA8PSBsYXN0Um93OyBpKysgKQorICAgIGRlZmF1bHRDaGFyUm93ID0gZW5jLT5kZWZhdWx0Q2hhciA+PiA4OworICAgIGRlZmF1bHRDaGFyQ29sID0gZW5jLT5kZWZhdWx0Q2hhciAmIDB4RkY7CisKKyAgICAvKiB2YWxpZGF0ZSBkZWZhdWx0IGNoYXJhY3RlciAqLworICAgIGlmICggZGVmYXVsdENoYXJSb3cgPCBlbmMtPmZpcnN0Um93IHx8CisgICAgICAgICBkZWZhdWx0Q2hhclJvdyA+IGVuYy0+bGFzdFJvdyAgfHwKKyAgICAgICAgIGRlZmF1bHRDaGFyQ29sIDwgZW5jLT5maXJzdENvbCB8fAorICAgICAgICAgZGVmYXVsdENoYXJDb2wgPiBlbmMtPmxhc3RDb2wgICkKICAgICB7Ci0gICAgICBmb3IgKCBqID0gZmlyc3RDb2w7IGogPD0gbGFzdENvbDsgaisrICkKKyAgICAgIGVuYy0+ZGVmYXVsdENoYXIgPSBlbmMtPmZpcnN0Um93ICogMjU2VSArIGVuYy0+Zmlyc3RDb2w7CisgICAgICBGVF9UUkFDRTAoKCAicGNmX2dldF9lbmNvZGluZ3M6IgorICAgICAgICAgICAgICAgICAgIiBJbnZhbGlkIGRlZmF1bHQgY2hhcmFjdGVyIHNldCB0byAldVxuIiwKKyAgICAgICAgICAgICAgICAgIGVuYy0+ZGVmYXVsdENoYXIgKSk7CisKKyAgICAgIGRlZmF1bHRDaGFyUm93ID0gZW5jLT5maXJzdFJvdzsKKyAgICAgIGRlZmF1bHRDaGFyQ29sID0gZW5jLT5maXJzdENvbDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZyZWVUeXBlIG1hbmRhdGVzIHRoYXQgZ2x5cGggaW5kZXggMCBpcyB0aGUgYHVuZGVmaW5lZCBnbHlwaCcsIHdoaWNoCisgICAgICogUENGIGNhbGxzIHRoZSBgZGVmYXVsdCBjaGFyYWN0ZXInLiAgSG93ZXZlciwgRnJlZVR5cGUgbmVlZHMgZ2x5cGgKKyAgICAgKiBpbmRleCAwIHRvIGJlIHVzZWQgZm9yIHRoZSB1bmRlZmluZWQgZ2x5cGggb25seSwgd2hpY2ggaXMgaXMgbm90IHRoZQorICAgICAqIGNhc2UgZm9yIFBDRi4gIEZvciB0aGlzIHJlYXNvbiwgd2UgYWRkIG9uZSBzbG90IGZvciBnbHlwaCBpbmRleCAwIGFuZAorICAgICAqIHNpbXBseSBjb3B5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciB0byBpdC4KKyAgICAgKgorICAgICAqIGBzdHJlYW0tPmN1cnNvcicgc3RpbGwgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lOyB3ZSBjYW4KKyAgICAgKiB0aHVzIGVhc2lseSBnZXQgdGhlIG9mZnNldCB0byB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcG9zID0gc3RyZWFtLT5jdXJzb3IgKworICAgICAgICAgICAgMiAqICggKCBkZWZhdWx0Q2hhclJvdyAtIGVuYy0+Zmlyc3RSb3cgKSAqCisgICAgICAgICAgICAgICAgICAgICggZW5jLT5sYXN0Q29sIC0gZW5jLT5maXJzdENvbCArIDEgKSArCisgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2hhckNvbCAtIGVuYy0+Zmlyc3RDb2wgKTsKKworICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKKyAgICAgIGRlZmF1bHRDaGFyRW5jb2RpbmdPZmZzZXQgPSBGVF9QRUVLX1VTSE9SVCggcG9zICk7CisgICAgZWxzZQorICAgICAgZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldCA9IEZUX1BFRUtfVVNIT1JUX0xFKCBwb3MgKTsKKworICAgIGlmICggZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldCA9PSAweEZGRkYgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X2VuY29kaW5nczoiCisgICAgICAgICAgICAgICAgICAiIE5vIGdseXBoIGZvciBkZWZhdWx0IGNoYXJhY3RlcixcbiIKKyAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgICAiIHNldHRpbmcgaXQgdG8gdGhlIGZpcnN0IGdseXBoIG9mIHRoZSBmb250XG4iICkpOworICAgICAgZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldCA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBkZWZhdWx0Q2hhckVuY29kaW5nT2Zmc2V0Kys7CisKKyAgICAgIGlmICggZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldCA+PSBmYWNlLT5ubWV0cmljcyApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfZ2V0X2VuY29kaW5nczoiCisgICAgICAgICAgICAgICAgICAgICIgSW52YWxpZCBnbHlwaCBpbmRleCBmb3IgZGVmYXVsdCBjaGFyYWN0ZXIsXG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAiCisgICAgICAgICAgICAgICAgICAgICIgc2V0dGluZyBpdCB0byB0aGUgZmlyc3QgZ2x5cGggb2YgdGhlIGZvbnRcbiIgKSk7CisgICAgICAgIGRlZmF1bHRDaGFyRW5jb2RpbmdPZmZzZXQgPSAxOworICAgICAgfQorICAgIH0KKworICAgIC8qIGNvcHkgbWV0cmljcyBvZiBkZWZhdWx0IGNoYXJhY3RlciB0byBpbmRleCAwICovCisgICAgZmFjZS0+bWV0cmljc1swXSA9IGZhY2UtPm1ldHJpY3NbZGVmYXVsdENoYXJFbmNvZGluZ09mZnNldF07CisKKyAgICAvKiBub3cgbG9vcCBvdmVyIGFsbCB2YWx1ZXMgKi8KKyAgICBvZmZzZXQgPSBlbmMtPm9mZnNldDsKKyAgICBmb3IgKCBpID0gZW5jLT5maXJzdFJvdzsgaSA8PSBlbmMtPmxhc3RSb3c7IGkrKyApCisgICAgeworICAgICAgZm9yICggaiA9IGVuYy0+Zmlyc3RDb2w7IGogPD0gZW5jLT5sYXN0Q29sOyBqKysgKQogICAgICAgewogICAgICAgICAvKiBYMTEncyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgZXF1aXZhbGVudCB0byAgKi8KICAgICAgICAgLyogYEZUX0dFVF9TSE9SVCcsIGhvd2V2ZXIgUENGIGZvbnRzIHdpdGggbW9yZSB0aGFuIDMyNzY4ICovCi0gICAgICAgIC8qIGNoYXJhY3RlcnMgKGUuZy4gYHVuaWZvbnQucGNmJykgY2xlYXJseSBzaG93IHRoYXQgYW4gICAqLworICAgICAgICAvKiBjaGFyYWN0ZXJzIChlLmcuLCBgdW5pZm9udC5wY2YnKSBjbGVhcmx5IHNob3cgdGhhdCBhbiAgKi8KICAgICAgICAgLyogdW5zaWduZWQgdmFsdWUgaXMgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgIGlmICggUENGX0JZVEVfT1JERVIoIGZvcm1hdCApID09IE1TQkZpcnN0ICkKICAgICAgICAgICBlbmNvZGluZ09mZnNldCA9IEZUX0dFVF9VU0hPUlQoKTsKICAgICAgICAgZWxzZQogICAgICAgICAgIGVuY29kaW5nT2Zmc2V0ID0gRlRfR0VUX1VTSE9SVF9MRSgpOwogCi0gICAgICAgIGlmICggZW5jb2RpbmdPZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICAgIHsKLSAgICAgICAgICBlbmNvZGluZ1trXS5lbmMgICA9IGkgKiAyNTYgKyBqOwotICAgICAgICAgIGVuY29kaW5nW2tdLmdseXBoID0gZW5jb2RpbmdPZmZzZXQ7Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjb2RlICVkICgweCUwNFgpOiBpZHggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmdba10uZW5jLCBlbmNvZGluZ1trXS5lbmMsIGVuY29kaW5nW2tdLmdseXBoICkpOwotCi0gICAgICAgICAgaysrOwotICAgICAgICB9CisgICAgICAgIC8qIGV2ZXJ5dGhpbmcgaXMgb2ZmIGJ5IDEgZHVlIHRvIHRoZSBhcnRpZmljaWFsIGdseXBoIDAgKi8KKyAgICAgICAgKm9mZnNldCsrID0gZW5jb2RpbmdPZmZzZXQgPT0gMHhGRkZGID8gMHhGRkZGCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVuY29kaW5nT2Zmc2V0ICsgMTsKICAgICAgIH0KICAgICB9CiAgICAgRlRfU3RyZWFtX0V4aXRGcmFtZSggc3RyZWFtICk7CiAKLSAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBlbmNvZGluZywgbmVuY29kaW5nLCBrICkgKQotICAgICAgZ290byBCYWlsOwotCi0gICAgZmFjZS0+bmVuY29kaW5ncyA9IGs7Ci0gICAgZmFjZS0+ZW5jb2RpbmdzICA9IGVuY29kaW5nOwotCiAgICAgcmV0dXJuIGVycm9yOwogCisgIEV4aXQ6CisgICAgRlRfRlJFRSggZW5jLT5vZmZzZXQgKTsKKwogICBCYWlsOgotICAgIEZUX0ZSRUUoIGVuY29kaW5nICk7CiAgICAgcmV0dXJuIGVycm9yOwogICB9CiAKQEAgLTExNjgsMTMgKzEyNTEsMTMgQEAKICAgICBpZiAoIEZUX0FCUyggYWNjZWwtPmZvbnRBc2NlbnQgKSA+IDB4N0ZGRiApCiAgICAgewogICAgICAgYWNjZWwtPmZvbnRBc2NlbnQgPSBhY2NlbC0+Zm9udEFzY2VudCA8IDAgPyAtMHg3RkZGIDogMHg3RkZGOwotICAgICAgRlRfVFJBQ0UwKCggInBmY19nZXRfYWNjZWw6IGNsYW1waW5nIGZvbnQgYXNjZW50IHRvIHZhbHVlICVkXG4iLAorICAgICAgRlRfVFJBQ0UwKCggInBmY19nZXRfYWNjZWw6IGNsYW1waW5nIGZvbnQgYXNjZW50IHRvIHZhbHVlICVsZFxuIiwKICAgICAgICAgICAgICAgICAgIGFjY2VsLT5mb250QXNjZW50ICkpOwogICAgIH0KICAgICBpZiAoIEZUX0FCUyggYWNjZWwtPmZvbnREZXNjZW50ICkgPiAweDdGRkYgKQogICAgIHsKICAgICAgIGFjY2VsLT5mb250RGVzY2VudCA9IGFjY2VsLT5mb250RGVzY2VudCA8IDAgPyAtMHg3RkZGIDogMHg3RkZGOwotICAgICAgRlRfVFJBQ0UwKCggInBmY19nZXRfYWNjZWw6IGNsYW1waW5nIGZvbnQgZGVzY2VudCB0byB2YWx1ZSAlZFxuIiwKKyAgICAgIEZUX1RSQUNFMCgoICJwZmNfZ2V0X2FjY2VsOiBjbGFtcGluZyBmb250IGRlc2NlbnQgdG8gdmFsdWUgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgYWNjZWwtPmZvbnREZXNjZW50ICkpOwogICAgIH0KIApAQCAtMTIyOCw5ICsxMzExLDggQEAKIAogICAgIFBDRl9Qcm9wZXJ0eSAgcHJvcDsKIAotICAgIHNpemVfdCAgbm4sIGxlbjsKLSAgICBjaGFyKiAgIHN0cmluZ3NbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKLSAgICBzaXplX3QgIGxlbmd0aHNbNF07CisgICAgY29uc3QgY2hhciogIHN0cmluZ3NbNF0gPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKKyAgICBzaXplX3QgICAgICAgbGVuZ3Roc1s0XSwgbm4sIGxlbjsKIAogCiAgICAgZmFjZS0+c3R5bGVfZmxhZ3MgPSAwOwpAQCAtMTI0Miw4ICsxMzI0LDggQEAKICAgICB7CiAgICAgICBmYWNlLT5zdHlsZV9mbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKICAgICAgIHN0cmluZ3NbMl0gPSAoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ08nIHx8Ci0gICAgICAgICAgICAgICAgICAgICAqKHByb3AtPnZhbHVlLmF0b20pID09ICdvJyApID8gKGNoYXIgKikiT2JsaXF1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSJJdGFsaWMiOworICAgICAgICAgICAgICAgICAgICAgKihwcm9wLT52YWx1ZS5hdG9tKSA9PSAnbycgKSA/ICJPYmxpcXVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJJdGFsaWMiOwogICAgIH0KIAogICAgIHByb3AgPSBwY2ZfZmluZF9wcm9wZXJ0eSggcGNmLCAiV0VJR0hUX05BTUUiICk7CkBAIC0xMjUxLDIwICsxMzMzLDIwIEBACiAgICAgICAgICAoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ0InIHx8ICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ2InICkgKQogICAgIHsKICAgICAgIGZhY2UtPnN0eWxlX2ZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLSAgICAgIHN0cmluZ3NbMV0gPSAoY2hhciopIkJvbGQiOworICAgICAgc3RyaW5nc1sxXSA9ICJCb2xkIjsKICAgICB9CiAKICAgICBwcm9wID0gcGNmX2ZpbmRfcHJvcGVydHkoIHBjZiwgIlNFVFdJRFRIX05BTUUiICk7CiAgICAgaWYgKCBwcm9wICYmIHByb3AtPmlzU3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAqKHByb3AtPnZhbHVlLmF0b20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAhKCAqKHByb3AtPnZhbHVlLmF0b20pID09ICdOJyB8fCAqKHByb3AtPnZhbHVlLmF0b20pID09ICduJyApICkKLSAgICAgIHN0cmluZ3NbM10gPSAoY2hhciopKCBwcm9wLT52YWx1ZS5hdG9tICk7CisgICAgICBzdHJpbmdzWzNdID0gKGNvbnN0IGNoYXIqKSggcHJvcC0+dmFsdWUuYXRvbSApOwogCiAgICAgcHJvcCA9IHBjZl9maW5kX3Byb3BlcnR5KCBwY2YsICJBRERfU1RZTEVfTkFNRSIgKTsKICAgICBpZiAoIHByb3AgJiYgcHJvcC0+aXNTdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICoocHJvcC0+dmFsdWUuYXRvbSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICEoICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ04nIHx8ICoocHJvcC0+dmFsdWUuYXRvbSkgPT0gJ24nICkgKQotICAgICAgc3RyaW5nc1swXSA9IChjaGFyKikoIHByb3AtPnZhbHVlLmF0b20gKTsKKyAgICAgIHN0cmluZ3NbMF0gPSAoY29uc3QgY2hhciopKCBwcm9wLT52YWx1ZS5hdG9tICk7CiAKICAgICBmb3IgKCBsZW4gPSAwLCBubiA9IDA7IG5uIDwgNDsgbm4rKyApCiAgICAgewpAQCAtMTI3OCw3ICsxMzYwLDcgQEAKIAogICAgIGlmICggbGVuID09IDAgKQogICAgIHsKLSAgICAgIHN0cmluZ3NbMF0gPSAoY2hhciopIlJlZ3VsYXIiOworICAgICAgc3RyaW5nc1swXSA9ICJSZWd1bGFyIjsKICAgICAgIGxlbmd0aHNbMF0gPSBmdF9zdHJsZW4oIHN0cmluZ3NbMF0gKTsKICAgICAgIGxlbiAgICAgICAgPSBsZW5ndGhzWzBdICsgMTsKICAgICB9CkBAIC0xMjk0LDcgKzEzNzYsNyBAQAogCiAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgNDsgbm4rKyApCiAgICAgICB7Ci0gICAgICAgIGNoYXIqICBzcmMgPSBzdHJpbmdzW25uXTsKKyAgICAgICAgY29uc3QgY2hhciogIHNyYyA9IHN0cmluZ3Nbbm5dOwogCiAKICAgICAgICAgbGVuID0gbGVuZ3Roc1tubl07CkBAIC0xMzk3LDggKzE0NzksNyBAQAogCiAKICAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTOworICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTDsKIAogICAgICAgaWYgKCBmYWNlLT5hY2NlbC5jb25zdGFudFdpZHRoICkKICAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7CkBAIC0xNDgyLDE0ICsxNTYzLDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgcm9vdC0+ZmFtaWx5X25hbWUgPSBOVUxMOwogCi0gICAgICAvKgotICAgICAgICogTm90ZTogV2Ugc2hpZnQgYWxsIGdseXBoIGluZGljZXMgYnkgKzEgc2luY2Ugd2UgbXVzdAotICAgICAgICogcmVzcGVjdCB0aGUgY29udmVudGlvbiB0aGF0IGdseXBoIDAgYWx3YXlzIGNvcnJlc3BvbmRzCi0gICAgICAgKiB0byB0aGUgYG1pc3NpbmcgZ2x5cGgnLgotICAgICAgICoKLSAgICAgICAqIFRoaXMgaW1wbGllcyBidW1waW5nIHRoZSBudW1iZXIgb2YgYGF2YWlsYWJsZScgZ2x5cGhzIGJ5IDEuCi0gICAgICAgKi8KLSAgICAgIHJvb3QtPm51bV9nbHlwaHMgPSAoRlRfTG9uZykoIGZhY2UtPm5tZXRyaWNzICsgMSApOworICAgICAgcm9vdC0+bnVtX2dseXBocyA9IChGVF9Mb25nKWZhY2UtPm5tZXRyaWNzOwogCiAgICAgICByb290LT5udW1fZml4ZWRfc2l6ZXMgPSAxOwogICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJvb3QtPmF2YWlsYWJsZV9zaXplcywgMSApICkKQEAgLTE1NTYsNyArMTYzMCw3IEBACiAgICAgICAgICAgaWYgKCBGVF9BQlMoIHByb3AtPnZhbHVlLmwgKSA+IDB4NTA0QzJMICkgLyogMHg3RkZGICogNzIyNzAvNzIwMCAqLwogICAgICAgICAgIHsKICAgICAgICAgICAgIGJzaXplLT5zaXplID0gMHg3RkZGOwotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBjZl9sb2FkX2ZvbnQ6IGNsYW1waW5nIHBvaW50IHNpemUgdG8gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogY2xhbXBpbmcgcG9pbnQgc2l6ZSB0byB2YWx1ZSAlbGRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBic2l6ZS0+c2l6ZSApKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQpAQCAtMTU3NSw3ICsxNjQ5LDcgQEAKICAgICAgICAgICBpZiAoIEZUX0FCUyggcHJvcC0+dmFsdWUubCApID4gMHg3RkZGICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBic2l6ZS0+eV9wcGVtID0gMHg3RkZGIDw8IDY7Ci0gICAgICAgICAgICBGVF9UUkFDRTAoKCAicGNmX2xvYWRfZm9udDogY2xhbXBpbmcgcGl4ZWwgc2l6ZSB0byB2YWx1ZSAlZFxuIiwKKyAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwY2ZfbG9hZF9mb250OiBjbGFtcGluZyBwaXhlbCBzaXplIHRvIHZhbHVlICVsZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGJzaXplLT55X3BwZW0gKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3NyYy9wY2YvcGNmcmVhZC5oIGIvc3JjL3BjZi9wY2ZyZWFkLmgKaW5kZXggYmVkMzBlNS4uYTU0NjQ4ZiAxMDA2NDQKLS0tIGEvc3JjL3BjZi9wY2ZyZWFkLmgKKysrIGIvc3JjL3BjZi9wY2ZyZWFkLmgKQEAgLTI5LDcgKzI5LDYgQEAKICNkZWZpbmUgUENGUkVBRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiBGVF9CRUdJTl9IRUFERVIKIApkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Z1dGlsLmMgYi9zcmMvcGNmL3BjZnV0aWwuYwppbmRleCAwNDUxZWU4Li41ZDNjMDA3IDEwMDY0NAotLS0gYS9zcmMvcGNmL3BjZnV0aWwuYworKysgYi9zcmMvcGNmL3BjZnV0aWwuYwpAQCAtMzIsMTIgKzMyLDExIEBACiAvKiBNb2RpZmllZCBmb3IgdXNlIHdpdGggRnJlZVR5cGUgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJwY2Z1dGlsLmgiCiAKIAogICAvKgotICAgKiAgSW52ZXJ0IGJpdCBvcmRlciB3aXRoaW4gZWFjaCBCWVRFIG9mIGFuIGFycmF5LgorICAgKiBJbnZlcnQgYml0IG9yZGVyIHdpdGhpbiBlYWNoIEJZVEUgb2YgYW4gYXJyYXkuCiAgICAqLwogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCkBAIC01OSw3ICs1OCw3IEBACiAKIAogICAvKgotICAgKiAgSW52ZXJ0IGJ5dGUgb3JkZXIgd2l0aGluIGVhY2ggMTYtYml0cyBvZiBhbiBhcnJheS4KKyAgICogSW52ZXJ0IGJ5dGUgb3JkZXIgd2l0aGluIGVhY2ggMTYtYml0cyBvZiBhbiBhcnJheS4KICAgICovCiAKICAgRlRfTE9DQUxfREVGKCB2b2lkICkKQEAgLTc4LDcgKzc3LDcgQEAKICAgfQogCiAgIC8qCi0gICAqICBJbnZlcnQgYnl0ZSBvcmRlciB3aXRoaW4gZWFjaCAzMi1iaXRzIG9mIGFuIGFycmF5LgorICAgKiBJbnZlcnQgYnl0ZSBvcmRlciB3aXRoaW4gZWFjaCAzMi1iaXRzIG9mIGFuIGFycmF5LgogICAgKi8KIAogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQpkaWZmIC0tZ2l0IGEvc3JjL3BjZi9wY2Z1dGlsLmggYi9zcmMvcGNmL3BjZnV0aWwuaAppbmRleCBiZTk4NmU3Li5hMTk3YzE1IDEwMDY0NAotLS0gYS9zcmMvcGNmL3BjZnV0aWwuaAorKysgYi9zcmMvcGNmL3BjZnV0aWwuaApAQCAtMzEsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvY29tcGlsZXItbWFjcm9zLmg+CiAKIEZUX0JFR0lOX0hFQURFUgogCmRpZmYgLS1naXQgYS9zcmMvcGZyL0phbWZpbGUgYi9zcmMvcGZyL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTVhN2UuLjAwMDAwMDAKLS0tIGEvc3JjL3Bmci9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wZnIgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBmciA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gcGZyY21hcAotICAgICAgICAgICAgICAgcGZyZHJpdnIKLSAgICAgICAgICAgICAgIHBmcmdsb2FkCi0gICAgICAgICAgICAgICBwZnJsb2FkCi0gICAgICAgICAgICAgICBwZnJvYmpzCi0gICAgICAgICAgICAgICBwZnJzYml0Ci0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBwZnIgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvcGZyIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wZnIvbW9kdWxlLm1rIGIvc3JjL3Bmci9tb2R1bGUubWsKaW5kZXggMjdmZWM4ZS4uNzYyMzUzZCAxMDA2NDQKLS0tIGEvc3JjL3Bmci9tb2R1bGUubWsKKysrIGIvc3JjL3Bmci9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyLmMgYi9zcmMvcGZyL3Bmci5jCmluZGV4IDE3NjA4ODIuLjkyNjRjNzcgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyLmMKKysrIGIvc3JjL3Bmci9wZnIuYwpAQCAtMSwyMyArMSwyMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBkcml2ZXIgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZyLmMKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBkcml2ZXIgY29tcG9uZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInBmcmNtYXAuYyIKICNpbmNsdWRlICJwZnJkcml2ci5jIgpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJjbWFwLmMgYi9zcmMvcGZyL3BmcmNtYXAuYwppbmRleCA2MDY0Mzc4Li5lYmM3Yjg0IDEwMDY0NAotLS0gYS9zcmMvcGZyL3BmcmNtYXAuYworKysgYi9zcmMvcGZyL3BmcmNtYXAuYwpAQCAtMSwyMyArMSwyMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyY21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBjbWFwIGhhbmRsaW5nIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZyY21hcC5jCisgKgorICogICBGcmVlVHlwZSBQRlIgY21hcCBoYW5kbGluZyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAjaW5jbHVkZSAicGZyY21hcC5oIgogI2luY2x1ZGUgInBmcm9ianMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJjbWFwLmggYi9zcmMvcGZyL3BmcmNtYXAuaAppbmRleCBjNzBhMGM4Li5hNmQ5MjBjIDEwMDY0NAotLS0gYS9zcmMvcGZyL3BmcmNtYXAuaAorKysgYi9zcmMvcGZyL3BmcmNtYXAuaApAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyY21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBjbWFwIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZyY21hcC5oCisgKgorICogICBGcmVlVHlwZSBQRlIgY21hcCBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFBGUkNNQVBfSF8KICNkZWZpbmUgUEZSQ01BUF9IXwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogI2luY2x1ZGUgInBmcnR5cGVzLmgiCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJkcml2ci5jIGIvc3JjL3Bmci9wZnJkcml2ci5jCmluZGV4IDZjN2U1MDEuLmIxNDMyMDggMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyZHJpdnIuYworKysgYi9zcmMvcGZyL3BmcmRyaXZyLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcmRyaXZyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQRlIgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBmcmRyaXZyLmMKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUEZSX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KICNpbmNsdWRlICJwZnJkcml2ci5oIgogI2luY2x1ZGUgInBmcm9ianMuaCIKIApAQCAtNTcsMTAgKzU2LDEwIEBACiAgIH0KIAogCi0gLyoKLSAgKiAgUEZSIE1FVFJJQ1MgU0VSVklDRQotICAqCi0gICovCisgIC8qCisgICAqIFBGUiBNRVRSSUNTIFNFUlZJQ0UKKyAgICoKKyAgICovCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCiAgIHBmcl9nZXRfYWR2YW5jZSggRlRfRmFjZSAgIHBmcmZhY2UsICAgICAgIC8qIFBGUl9GYWNlICovCkBAIC0xNDUsMTAgKzE0NCwxMCBAQAogICB9OwogCiAKLSAvKgotICAqICBTRVJWSUNFIExJU1QKLSAgKgotICAqLworICAvKgorICAgKiBTRVJWSUNFIExJU1QKKyAgICoKKyAgICovCiAKICAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICBwZnJfc2VydmljZXNbXSA9CiAgIHsKZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyZHJpdnIuaCBiL3NyYy9wZnIvcGZyZHJpdnIuaAppbmRleCBjYWI4NTI3Li43NjQ2YjRkIDEwMDY0NAotLS0gYS9zcmMvcGZyL3BmcmRyaXZyLmgKKysrIGIvc3JjL3Bmci9wZnJkcml2ci5oCkBAIC0xLDM5ICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJkcml2ci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBUeXBlIFBGUiBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwZnJkcml2ci5oCisgKgorICogICBIaWdoLWxldmVsIFR5cGUgUEZSIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQRlJEUklWUl9IXwogI2RlZmluZSBQRlJEUklWUl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgcGZyX2RyaXZlcl9jbGFzczsKIAotCiBGVF9FTkRfSEVBREVSCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJlcnJvci5oIGIvc3JjL3Bmci9wZnJlcnJvci5oCmluZGV4IDcwMjdjODEuLjMzNDYwZWYgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyZXJyb3IuaAorKysgYi9zcmMvcGZyL3BmcmVycm9yLmgKQEAgLTEsMzEgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQRlIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBmcmVycm9yLmgKKyAqCisgKiAgIFBGUiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBGUiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQRlIgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBQRlJFUlJPUl9IXwogI2RlZmluZSBQRlJFUlJPUl9IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzMsNyArMzMsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBQRlJfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1BGUgogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBQRlJFUlJPUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvcGZyL3Bmcmdsb2FkLmMgYi9zcmMvcGZyL3Bmcmdsb2FkLmMKaW5kZXggYjc5OTAxOS4uYWE2NDBjMyAxMDA2NDQKLS0tIGEvc3JjL3Bmci9wZnJnbG9hZC5jCisrKyBiL3NyYy9wZnIvcGZyZ2xvYWQuYwpAQCAtMSwzMCArMSwzMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBnbHlwaCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZyZ2xvYWQuYworICoKKyAqICAgRnJlZVR5cGUgUEZSIGdseXBoIGxvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAicGZyZ2xvYWQuaCIKICNpbmNsdWRlICJwZnJzYml0LmgiCiAjaW5jbHVkZSAicGZybG9hZC5oIiAgICAgICAgICAgIC8qIGZvciBtYWNybyBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgInBmcmVycm9yLmgiCiAKICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGZyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcGZyCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM1OSw5ICszNTksOSBAQAogICAgICAgICBGVF9VSW50ICBmb3JtYXQsIGZvcm1hdF9sb3csIGFyZ3NfZm9ybWF0ID0gMCwgYXJnc19jb3VudCwgbjsKIAogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICByZWFkIGluc3RydWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIHJlYWQgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICovCiAgICAgICAgIFBGUl9DSEVDSyggMSApOwogICAgICAgICBmb3JtYXQgICAgID0gUEZSX05FWFRfQllURSggcCApOwogICAgICAgICBmb3JtYXRfbG93ID0gZm9ybWF0ICYgMTU7CkBAIC00MjYsOSArNDI2LDkgQEAKICAgICAgICAgICBhcmdzX2Zvcm1hdCA9IGZvcm1hdF9sb3c7CiAgICAgICAgIH0KIAotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICBub3cgcmVhZCBhcmd1bWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIG5vdyByZWFkIGFyZ3VtZW50cworICAgICAgICAgKi8KICAgICAgICAgY3VyID0gcG9zOwogICAgICAgICBmb3IgKCBuID0gMDsgbiA8IGFyZ3NfY291bnQ7IG4rKyApCiAgICAgICAgIHsKQEAgLTQ1MSw3ICs0NTEsNyBAQAogICAgICAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxNi1iaXQgYWJzb2x1dGUgdmFsdWUgKi8KICAgICAgICAgICAgIFBGUl9DSEVDSyggMiApOwogICAgICAgICAgICAgY3VyLT54ID0gUEZSX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgeC4lZCIsIGN1ci0+eCApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNygoICIgeC4lbGQiLCBjdXItPnggKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4LWJpdCBkZWx0YSAqLwpAQCAtNDgxLDcgKzQ4MSw3IEBACiAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBhYnNvbHV0ZSB2YWx1ZSAqLwogICAgICAgICAgICAgUEZSX0NIRUNLKCAyICk7CiAgICAgICAgICAgICBjdXItPnkgPSBQRlJfTkVYVF9TSE9SVCggcCApOwotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiB5LiVkIiwgY3VyLT55ICkpOworICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiB5LiVsZCIsIGN1ci0+eSApKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDgtYml0IGRlbHRhICovCkBAIC01MTMsOSArNTEzLDkgQEAKIAogICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogIGZpbmFsbHksIGV4ZWN1dGUgaW5zdHJ1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogZmluYWxseSwgZXhlY3V0ZSBpbnN0cnVjdGlvbgorICAgICAgICAgKi8KICAgICAgICAgc3dpdGNoICggZm9ybWF0ID4+IDQgKQogICAgICAgICB7CiAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgZ2x5cGggPT4gRVhJVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJnbG9hZC5oIGIvc3JjL3Bmci9wZnJnbG9hZC5oCmluZGV4IDAxZjQ4ZDcuLmYzNTZiNGMgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyZ2xvYWQuaAorKysgYi9zcmMvcGZyL3Bmcmdsb2FkLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcmdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQRlIgZ2x5cGggbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBmcmdsb2FkLmgKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBnbHlwaCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQRlJHTE9BRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJsb2FkLmMgYi9zcmMvcGZyL3BmcmxvYWQuYwppbmRleCAyNzc2ZGE0Li5hMjgzMmU1IDEwMDY0NAotLS0gYS9zcmMvcGZyL3BmcmxvYWQuYworKysgYi9zcmMvcGZyL3BmcmxvYWQuYwpAQCAtMSwxMTQgKzEsMTE0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwZnJsb2FkLmMKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBsb2FkZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgInBmcmxvYWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKICNpbmNsdWRlICJwZnJlcnJvci5oIgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BmcgorI2RlZmluZSBGVF9DT01QT05FTlQgIHBmcgogCiAKICAgLyoKLSAgICogIFRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiBhIFBGUiBmaWxlIGlzIGFzIGZvbGxvd3MuCisgICAqIFRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiBhIFBGUiBmaWxlIGlzIGFzIGZvbGxvd3MuCiAgICAqCi0gICAqICAgIFBGUiBoZWFkZXIKLSAgICogICAgICA1OCBieXRlcyAoY29udGFpbnMgblBoeXNGb250cykKKyAgICogICBQRlIgaGVhZGVyCisgICAqICAgICA1OCBieXRlcyAoY29udGFpbnMgblBoeXNGb250cykKICAgICoKLSAgICogICAgTG9naWNhbCBmb250IGRpcmVjdG9yeSAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgMiBieXRlcyAobkxvZ0ZvbnRzKQotICAgKiAgICAgICsgbkxvZ0ZvbnRzICogNSBieXRlcworICAgKiAgIExvZ2ljYWwgZm9udCBkaXJlY3RvcnkgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQorICAgKiAgICAgMiBieXRlcyAobkxvZ0ZvbnRzKQorICAgKiAgICAgKyBuTG9nRm9udHMgKiA1IGJ5dGVzCiAgICAqCi0gICAqICAgICAgICAgPT0+ICAgbkxvZ0ZvbnRzIDw9IDEzMTA2CisgICAqICAgICAgICA9PT4gIG5Mb2dGb250cyA8PSAxMzEwNgogICAgKgotICAgKiAgICBMb2dpY2FsIGZvbnQgc2VjdGlvbiAoc2l6ZSBhdCBtb3N0IDJeMjQgYnl0ZXMpCi0gICAqICAgICAgbkxvZ0ZvbnRzICogbG9nRm9udFJlY29yZAorICAgKiAgIExvZ2ljYWwgZm9udCBzZWN0aW9uIChzaXplIGF0IG1vc3QgMl4yNCBieXRlcykKKyAgICogICAgIG5Mb2dGb250cyAqIGxvZ0ZvbnRSZWNvcmQKICAgICoKLSAgICogICAgICBsb2dGb250UmVjb3JkIChzaXplIGF0IG1vc3QgMl4xNiBieXRlcykKLSAgICogICAgICAgIDEyIGJ5dGVzIChmb250TWF0cml4KQotICAgKiAgICAgICAgKyAxIGJ5dGUgKGZsYWdzKQotICAgKiAgICAgICAgKyAwLTUgYnl0ZXMgKGRlcGVuZGluZyBvbiBgZmxhZ3MnKQotICAgKiAgICAgICAgKyAwLSgxKzI1NSooMisyNTUpKSA9IDAtNjU1MzYgKGRlcGVuZGluZyBvbiBgZmxhZ3MnKQotICAgKiAgICAgICAgKyA1IGJ5dGVzIChwaHlzaWNhbCBmb250IGluZm8pCi0gICAqICAgICAgICArIDAtMSBieXRlcyAoZGVwZW5kaW5nIG9uIFBGUiBoZWFkZXIpCisgICAqICAgICBsb2dGb250UmVjb3JkIChzaXplIGF0IG1vc3QgMl4xNiBieXRlcykKKyAgICogICAgICAgMTIgYnl0ZXMgKGZvbnRNYXRyaXgpCisgICAqICAgICAgICsgMSBieXRlIChmbGFncykKKyAgICogICAgICAgKyAwLTUgYnl0ZXMgKGRlcGVuZGluZyBvbiBgZmxhZ3MnKQorICAgKiAgICAgICArIDAtKDErMjU1KigyKzI1NSkpID0gMC02NTUzNiAoZGVwZW5kaW5nIG9uIGBmbGFncycpCisgICAqICAgICAgICsgNSBieXRlcyAocGh5c2ljYWwgZm9udCBpbmZvKQorICAgKiAgICAgICArIDAtMSBieXRlcyAoZGVwZW5kaW5nIG9uIFBGUiBoZWFkZXIpCiAgICAqCi0gICAqICAgICAgICAgPT0+ICAgbWluaW11bSBzaXplIDE4IGJ5dGVzCisgICAqICAgICAgICA9PT4gIG1pbmltdW0gc2l6ZSAxOCBieXRlcwogICAgKgotICAgKiAgICBQaHlzaWNhbCBmb250IHNlY3Rpb24gKHNpemUgYXQgbW9zdCAyXjI0IGJ5dGVzKQotICAgKiAgICAgIG5QaHlzRm9udHMgKiAocGh5c0ZvbnRSZWNvcmQKLSAgICogICAgICAgICAgICAgICAgICAgICsgbkJpdG1hcFNpemVzICogbkJtYXBDaGFycyAqIGJtYXBDaGFyUmVjb3JkKQorICAgKiAgIFBoeXNpY2FsIGZvbnQgc2VjdGlvbiAoc2l6ZSBhdCBtb3N0IDJeMjQgYnl0ZXMpCisgICAqICAgICBuUGh5c0ZvbnRzICogKHBoeXNGb250UmVjb3JkCisgICAqICAgICAgICAgICAgICAgICAgICsgbkJpdG1hcFNpemVzICogbkJtYXBDaGFycyAqIGJtYXBDaGFyUmVjb3JkKQogICAgKgotICAgKiAgICAgIHBoeXNGb250UmVjb3JkIChzaXplIGF0IG1vc3QgMl4yNCBieXRlcykKLSAgICogICAgICAgIDE0IGJ5dGVzIChmb250IGluZm8pCi0gICAqICAgICAgICArIDEgYnl0ZSAoZmxhZ3MpCi0gICAqICAgICAgICArIDAtMiAoZGVwZW5kaW5nIG9uIGBmbGFncycpCi0gICAqICAgICAgICArIDAtPyAoc3RydWN0dXJlIHRvbyBjb21wbGljYXRlZCB0byBiZSBzaG93biBoZXJlOyBkZXBlbmRpbmcgb24KLSAgICogICAgICAgICAgICAgICBgZmxhZ3MnOyBjb250YWlucyBgbkJpdG1hcFNpemVzJyBhbmQgYG5CbWFwQ2hhcnMnKQotICAgKiAgICAgICAgKyAzIGJ5dGVzIChuQXV4Qnl0ZXMpCi0gICAqICAgICAgICArIG5BdXhCeXRlcwotICAgKiAgICAgICAgKyAxIGJ5dGUgKG5CbHVlVmFsdWVzKQotICAgKiAgICAgICAgKyAyICogbkJsdWVWYWx1ZXMKLSAgICogICAgICAgICsgNiBieXRlcyAoaGludGluZyBkYXRhKQotICAgKiAgICAgICAgKyAyIGJ5dGVzIChuQ2hhcmFjdGVycykKLSAgICogICAgICAgICsgbkNoYXJhY3RlcnMgKiAoNC0xMCBieXRlcykgKGRlcGVuZGluZyBvbiBgZmxhZ3MnKQorICAgKiAgICAgcGh5c0ZvbnRSZWNvcmQgKHNpemUgYXQgbW9zdCAyXjI0IGJ5dGVzKQorICAgKiAgICAgICAxNCBieXRlcyAoZm9udCBpbmZvKQorICAgKiAgICAgICArIDEgYnl0ZSAoZmxhZ3MpCisgICAqICAgICAgICsgMC0yIChkZXBlbmRpbmcgb24gYGZsYWdzJykKKyAgICogICAgICAgKyAwLT8gKHN0cnVjdHVyZSB0b28gY29tcGxpY2F0ZWQgdG8gYmUgc2hvd24gaGVyZTsgZGVwZW5kaW5nIG9uCisgICAqICAgICAgICAgICAgICBgZmxhZ3MnOyBjb250YWlucyBgbkJpdG1hcFNpemVzJyBhbmQgYG5CbWFwQ2hhcnMnKQorICAgKiAgICAgICArIDMgYnl0ZXMgKG5BdXhCeXRlcykKKyAgICogICAgICAgKyBuQXV4Qnl0ZXMKKyAgICogICAgICAgKyAxIGJ5dGUgKG5CbHVlVmFsdWVzKQorICAgKiAgICAgICArIDIgKiBuQmx1ZVZhbHVlcworICAgKiAgICAgICArIDYgYnl0ZXMgKGhpbnRpbmcgZGF0YSkKKyAgICogICAgICAgKyAyIGJ5dGVzIChuQ2hhcmFjdGVycykKKyAgICogICAgICAgKyBuQ2hhcmFjdGVycyAqICg0LTEwIGJ5dGVzKSAoZGVwZW5kaW5nIG9uIGBmbGFncycpCiAgICAqCi0gICAqICAgICAgICAgPT0+ICAgbWluaW11bSBzaXplIDI3IGJ5dGVzCisgICAqICAgICAgICA9PT4gIG1pbmltdW0gc2l6ZSAyNyBieXRlcwogICAgKgotICAgKiAgICAgIGJtYXBDaGFyUmVjb3JkCi0gICAqICAgICAgICA0LTcgYnl0ZXMKKyAgICogICAgIGJtYXBDaGFyUmVjb3JkCisgICAqICAgICAgIDQtNyBieXRlcwogICAgKgotICAgKiAgICBHbHlwaCBwcm9ncmFtIHN0cmluZ3MgKHRocmVlIHBvc3NpYmxlIHR5cGVzOiBzaW1wbGVHcHMsIGNvbXBvdW5kR3BzLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBiaXRtYXBHcHM7IHNpemUgYXQgbW9zdCAyXjI0IGJ5dGVzKQotICAgKiAgICAgIHNpbXBsZUdwcyAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgICAxIGJ5dGUgKGZsYWdzKQotICAgKiAgICAgICAgMS0yIGJ5dGVzIChuW1hZXW9ydXMsIGRlcGVuZGluZyBvbiBgZmxhZ3MnKQotICAgKiAgICAgICAgMC0oNjQrNTEyKjIpID0gMC0xMDg4IGJ5dGVzIChkZXBlbmRpbmcgb24gYG5bWFldb3J1cycpCi0gICAqICAgICAgICAwLT8gKHN0cnVjdHVyZSB0b28gY29tcGxpY2F0ZWQgdG8gYmUgc2hvd24gaGVyZTsgZGVwZW5kaW5nIG9uCi0gICAqICAgICAgICAgICAgIGBmbGFncycpCi0gICAqICAgICAgICAxLT8gZ2x5cGggZGF0YSAoZmFpbnRseSByZXNlbWJsaW5nIFBTIFR5cGUgMSBjaGFyc3RyaW5ncykKKyAgICogICBHbHlwaCBwcm9ncmFtIHN0cmluZ3MgKHRocmVlIHBvc3NpYmxlIHR5cGVzOiBzaW1wbGVHcHMsIGNvbXBvdW5kR3BzLAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGJpdG1hcEdwczsgc2l6ZSBhdCBtb3N0IDJeMjQgYnl0ZXMpCisgICAqICAgICBzaW1wbGVHcHMgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQorICAgKiAgICAgICAxIGJ5dGUgKGZsYWdzKQorICAgKiAgICAgICAxLTIgYnl0ZXMgKG5bWFldb3J1cywgZGVwZW5kaW5nIG9uIGBmbGFncycpCisgICAqICAgICAgIDAtKDY0KzUxMioyKSA9IDAtMTA4OCBieXRlcyAoZGVwZW5kaW5nIG9uIGBuW1hZXW9ydXMnKQorICAgKiAgICAgICAwLT8gKHN0cnVjdHVyZSB0b28gY29tcGxpY2F0ZWQgdG8gYmUgc2hvd24gaGVyZTsgZGVwZW5kaW5nIG9uCisgICAqICAgICAgICAgICAgYGZsYWdzJykKKyAgICogICAgICAgMS0/IGdseXBoIGRhdGEgKGZhaW50bHkgcmVzZW1ibGluZyBQUyBUeXBlIDEgY2hhcnN0cmluZ3MpCiAgICAqCi0gICAqICAgICAgICAgPT0+ICAgbWluaW11bSBzaXplIDMgYnl0ZXMKKyAgICogICAgICAgID09PiAgbWluaW11bSBzaXplIDMgYnl0ZXMKICAgICoKLSAgICogICAgICBjb21wb3VuZEdwcyAoc2l6ZSBhdCBtb3N0IDJeMTYgYnl0ZXMpCi0gICAqICAgICAgICAxIGJ5dGUgKG5FbGVtZW50cyA8PSA2MywgZmxhZ3MpCi0gICAqICAgICAgICArIDAtKDErMjU1KigyKzI1NSkpID0gMC02NTUzNiAoZGVwZW5kaW5nIG9uIGBmbGFncycpCi0gICAqICAgICAgICArIG5FbGVtZW50cyAqICg2LTE0IGJ5dGVzKQorICAgKiAgICAgY29tcG91bmRHcHMgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQorICAgKiAgICAgICAxIGJ5dGUgKG5FbGVtZW50cyA8PSA2MywgZmxhZ3MpCisgICAqICAgICAgICsgMC0oMSsyNTUqKDIrMjU1KSkgPSAwLTY1NTM2IChkZXBlbmRpbmcgb24gYGZsYWdzJykKKyAgICogICAgICAgKyBuRWxlbWVudHMgKiAoNi0xNCBieXRlcykKICAgICoKLSAgICogICAgICBiaXRtYXBHcHMgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQotICAgKiAgICAgICAgMSBieXRlIChmbGFncykKLSAgICogICAgICAgIDMtMTMgYnl0ZXMgKHBvc2l0aW9uIGluZm8sIGRlcGVuZGluZyBvbiBgZmxhZ3MnKQotICAgKiAgICAgICAgMC0/IGJpdG1hcCBkYXRhCisgICAqICAgICBiaXRtYXBHcHMgKHNpemUgYXQgbW9zdCAyXjE2IGJ5dGVzKQorICAgKiAgICAgICAxIGJ5dGUgKGZsYWdzKQorICAgKiAgICAgICAzLTEzIGJ5dGVzIChwb3NpdGlvbiBpbmZvLCBkZXBlbmRpbmcgb24gYGZsYWdzJykKKyAgICogICAgICAgMC0/IGJpdG1hcCBkYXRhCiAgICAqCi0gICAqICAgICAgICAgPT0+ICAgbWluaW11bSBzaXplIDQgYnl0ZXMKKyAgICogICAgICAgID09PiAgbWluaW11bSBzaXplIDQgYnl0ZXMKICAgICoKLSAgICogICAgUEZSIHRyYWlsZXIKLSAgICogICAgICAgIDggYnl0ZXMKKyAgICogICBQRlIgdHJhaWxlcgorICAgKiAgICAgICA4IGJ5dGVzCiAgICAqCiAgICAqCi0gICAqID09PiAgIG1pbmltdW0gc2l6ZSBvZiBhIHZhbGlkIFBGUjoKLSAgICogICAgICAgICA1OCAoaGVhZGVyKQotICAgKiAgICAgICAgICsgMiAobkxvZ0ZvbnRzKQotICAgKiAgICAgICAgICsgMjcgKDEgcGh5c0ZvbnRSZWNvcmQpCi0gICAqICAgICAgICAgKyA4ICh0cmFpbGVyKQotICAgKiAgICAgICAgLS0tLS0KLSAgICogICAgICAgICA5NSBieXRlcworICAgKiA9PT4gIG1pbmltdW0gc2l6ZSBvZiBhIHZhbGlkIFBGUjoKKyAgICogICAgICAgIDU4IChoZWFkZXIpCisgICAqICAgICAgICArIDIgKG5Mb2dGb250cykKKyAgICogICAgICAgICsgMjcgKDEgcGh5c0ZvbnRSZWNvcmQpCisgICAqICAgICAgICArIDggKHRyYWlsZXIpCisgICAqICAgICAgIC0tLS0tCisgICAqICAgICAgICA5NSBieXRlcwogICAgKgogICAgKi8KIApkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJsb2FkLmggYi9zcmMvcGZyL3BmcmxvYWQuaAppbmRleCAzNmU4MDlhLi43NjE1YjljIDEwMDY0NAotLS0gYS9zcmMvcGZyL3BmcmxvYWQuaAorKysgYi9zcmMvcGZyL3BmcmxvYWQuaApAQCAtMSwyNiArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZybG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZybG9hZC5oCisgKgorICogICBGcmVlVHlwZSBQRlIgbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUEZSTE9BRF9IXwogI2RlZmluZSBQRlJMT0FEX0hfCiAKICNpbmNsdWRlICJwZnJvYmpzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvcGZyL3Bmcm9ianMuYyBiL3NyYy9wZnIvcGZyb2Jqcy5jCmluZGV4IDczN2I5N2IuLjkxOGU3ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyb2Jqcy5jCisrKyBiL3NyYy9wZnIvcGZyb2Jqcy5jCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIG9iamVjdCBtZXRob2RzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwZnJvYmpzLmMKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBvYmplY3QgbWV0aG9kcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAicGZyb2Jqcy5oIgpAQCAtMjEsMTUgKzIxLDE1IEBACiAjaW5jbHVkZSAicGZyZ2xvYWQuaCIKICNpbmNsdWRlICJwZnJjbWFwLmgiCiAjaW5jbHVkZSAicGZyc2JpdC5oIgotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdXRsbi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dG5hbWVpZC5oPgogCiAjaW5jbHVkZSAicGZyZXJyb3IuaCIKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wZnIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBwZnIKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgICAgICAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgKEZUX1VJbnQpKCBmYWNlX2luZGV4ICYgMHhGRkZGICksCiAgICAgICAgICAgICAgIGZhY2UtPmhlYWRlci5sb2dfZGlyX29mZnNldCwKLSAgICAgICAgICAgICAgRlRfQk9PTCggZmFjZS0+aGVhZGVyLnBoeV9mb250X21heF9zaXplX2hpZ2ggIT0gMCApICk7CisgICAgICAgICAgICAgIEZUX0JPT0woIGZhY2UtPmhlYWRlci5waHlfZm9udF9tYXhfc2l6ZV9oaWdoICkgKTsKICAgICBpZiAoIGVycm9yICkKICAgICAgIGdvdG8gRXhpdDsKIApAQCAtMzcwLDcgKzM3MCw3IEBACiAgICAgICBGVF9Cb29sICAgICAgICAgICAgc2NhbGluZzsKIAogCi0gICAgICBzY2FsaW5nID0gRlRfQk9PTCggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKTsKKyAgICAgIHNjYWxpbmcgPSBGVF9CT09MKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICk7CiAKICAgICAgIC8qIGNvcHkgb3V0bGluZSBkYXRhICovCiAgICAgICAqb3V0bGluZSA9IHNsb3QtPmdseXBoLmxvYWRlci0+YmFzZS5vdXRsaW5lOwpAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICBvdXRsaW5lLT5mbGFncyAmPSB+RlRfT1VUTElORV9PV05FUjsKICAgICAgIG91dGxpbmUtPmZsYWdzIHw9IEZUX09VVExJTkVfUkVWRVJTRV9GSUxMOwogCi0gICAgICBpZiAoIHNpemUgJiYgcGZyc2l6ZS0+bWV0cmljcy55X3BwZW0gPCAyNCApCisgICAgICBpZiAoIHBmcnNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjQgKQogICAgICAgICBvdXRsaW5lLT5mbGFncyB8PSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OOwogCiAgICAgICAvKiBjb21wdXRlIHRoZSBhZHZhbmNlIHZlY3RvciAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Bmci9wZnJvYmpzLmggYi9zcmMvcGZyL3Bmcm9ianMuaAppbmRleCA1OWM3MDlmLi44MDg4MjJmIDEwMDY0NAotLS0gYS9zcmMvcGZyL3Bmcm9ianMuaAorKysgYi9zcmMvcGZyL3Bmcm9ianMuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZyb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBvYmplY3QgbWV0aG9kcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZyb2Jqcy5oCisgKgorICogICBGcmVlVHlwZSBQRlIgb2JqZWN0IG1ldGhvZHMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQRlJPQkpTX0hfCmRpZmYgLS1naXQgYS9zcmMvcGZyL3BmcnNiaXQuYyBiL3NyYy9wZnIvcGZyc2JpdC5jCmluZGV4IGJhOTA5ZGQuLmE2NjkxZTYgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcGZyc2JpdC5jCisrKyBiL3NyYy9wZnIvcGZyc2JpdC5jCkBAIC0xLDMwICsxLDMwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwZnJzYml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUEZSIGJpdG1hcCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwZnJzYml0LmMKKyAqCisgKiAgIEZyZWVUeXBlIFBGUiBiaXRtYXAgbG9hZGVyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJwZnJzYml0LmgiCiAjaW5jbHVkZSAicGZybG9hZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KIAogI2luY2x1ZGUgInBmcmVycm9yLmgiCiAKICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcGZyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcGZyCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc0NSw3ICs3NDUsNyBAQAogICAgICAgICAgICB5cG9zICsgKEZUX0xvbmcpeXNpemUgPCBGVF9JTlRfTUlOICkKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UxKCggInBmcl9zbG90X2xvYWRfYml0bWFwOiIgKSk7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJodWdlIGJpdG1hcCBnbHlwaCAlZHglZCBvdmVyIEZUX0dseXBoU2xvdFxuIiwKKyAgICAgICAgRlRfVFJBQ0UxKCggImh1Z2UgYml0bWFwIGdseXBoICVsZHglbGQgb3ZlciBGVF9HbHlwaFNsb3RcbiIsCiAgICAgICAgICAgICAgICAgICAgICB4cG9zLCB5cG9zICkpOwogICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1BpeGVsX1NpemUgKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9wZnIvcGZyc2JpdC5oIGIvc3JjL3Bmci9wZnJzYml0LmgKaW5kZXggMDdiMjdiYy4uOGNiMGRlMCAxMDA2NDQKLS0tIGEvc3JjL3Bmci9wZnJzYml0LmgKKysrIGIvc3JjL3Bmci9wZnJzYml0LmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBmcnNiaXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQRlIgYml0bWFwIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBmcnNiaXQuaAorICoKKyAqICAgRnJlZVR5cGUgUEZSIGJpdG1hcCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQRlJTQklUX0hfCmRpZmYgLS1naXQgYS9zcmMvcGZyL3BmcnR5cGVzLmggYi9zcmMvcGZyL3BmcnR5cGVzLmgKaW5kZXggMDU4ZDZhYS4uMDZmYjgyZCAxMDA2NDQKLS0tIGEvc3JjL3Bmci9wZnJ0eXBlcy5oCisrKyBiL3NyYy9wZnIvcGZydHlwZXMuaApAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGZydHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBGUiBkYXRhIHN0cnVjdHVyZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcGZydHlwZXMuaAorICoKKyAqICAgRnJlZVR5cGUgUEZSIGRhdGEgc3RydWN0dXJlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUEZSVFlQRVNfSF8KICNkZWZpbmUgUEZSVFlQRVNfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKZGlmZiAtLWdpdCBhL3NyYy9wZnIvcnVsZXMubWsgYi9zcmMvcGZyL3J1bGVzLm1rCmluZGV4IDNhY2I3OTUuLmExZmU4MmIgMTAwNjQ0Ci0tLSBhL3NyYy9wZnIvcnVsZXMubWsKKysrIGIvc3JjL3Bmci9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L0phbWZpbGUgYi9zcmMvcHNhdXgvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzMWQ1OS4uMDAwMDAwMAotLS0gYS9zcmMvcHNhdXgvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvcHNhdXggSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBzYXV4IDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBhZm1wYXJzZQotICAgICAgICAgICAgICAgcHNhdXhtb2QKLSAgICAgICAgICAgICAgIHBzY29udgotICAgICAgICAgICAgICAgcHNvYmpzCi0gICAgICAgICAgICAgICB0MWNtYXAKLSAgICAgICAgICAgICAgIHQxZGVjb2RlCi0gICAgICAgICAgICAgICBjZmZkZWNvZGUKLSAgICAgICAgICAgICAgIHBzYXJyc3QKLSAgICAgICAgICAgICAgIHBzYmx1ZXMKLSAgICAgICAgICAgICAgIHBzZXJyb3IKLSAgICAgICAgICAgICAgIHBzZm9udAotICAgICAgICAgICAgICAgcHNmdAotICAgICAgICAgICAgICAgcHNoaW50cwotICAgICAgICAgICAgICAgcHNpbnRycAotICAgICAgICAgICAgICAgcHNyZWFkCi0gICAgICAgICAgICAgICBwc3N0YWNrCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBwc2F1eCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wc2F1eCBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvYWZtcGFyc2UuYyBiL3NyYy9wc2F1eC9hZm1wYXJzZS5jCmluZGV4IDBjMzNkNTkuLjJkNmEwZDkgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9hZm1wYXJzZS5jCisrKyBiL3NyYy9wc2F1eC9hZm1wYXJzZS5jCkBAIC0xLDI0ICsxLDIzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1wYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHBhcnNlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZm1wYXJzZS5jCisgKgorICogICBBRk0gcGFyc2VyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgogCiAjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCiAKQEAgLTI4LDEzICsyNywxMyBAQAogI2luY2x1ZGUgInBzYXV4ZXJyLmgiCiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBRk1fU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSB1c2Ugb2YgQUZNX1N0cmVhbSBpcyBsYXJnZWx5IGluc3BpcmVkIGJ5IHBhcnNlQUZNLltjaF0gZnJvbSB0MWxpYi4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEFGTV9TdHJlYW0KKyAgICoKKyAgICogVGhlIHVzZSBvZiBBRk1fU3RyZWFtIGlzIGxhcmdlbHkgaW5zcGlyZWQgYnkgcGFyc2VBRk0uW2NoXSBmcm9tIHQxbGliLgorICAgKgorICAgKi8KIAogICBlbnVtCiAgIHsKQEAgLTE5MywxMSArMTkyLDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQUZNX1BhcnNlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEFGTV9QYXJzZXIKKyAgICoKKyAgICovCiAKICAgLyogYWxsIGtleXMgZGVmaW5lZCBpbiBDaC4gNy0xMCBvZiA1MDA0LkFGTV9TcGVjLnBkZiAqLwogICB0eXBlZGVmIGVudW0gIEFGTV9Ub2tlbl8KQEAgLTk1Myw3ICs5NTIsOCBAQAogICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV9rZXJuX2RhdGEoIHBhcnNlciApOwogICAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQga2VybiBkYXRhICovCisgICAgICAgIC8qIHdlIG9ubHkgc3VwcG9ydCBrZXJuIGRhdGEsIHNvIC4uLiAqLworICAgICAgICAvKiBmYWxsIHRocm91Z2ggICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1M6CiAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvYWZtcGFyc2UuaCBiL3NyYy9wc2F1eC9hZm1wYXJzZS5oCmluZGV4IDg2Zjg1MmEuLjE2YTNhM2UgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9hZm1wYXJzZS5oCisrKyBiL3NyYy9wc2F1eC9hZm1wYXJzZS5oCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBhZm1wYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHBhcnNlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBhZm1wYXJzZS5oCisgKgorICogICBBRk0gcGFyc2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgQUZNUEFSU0VfSF8KICNkZWZpbmUgQUZNUEFSU0VfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L2NmZmRlY29kZS5jIGIvc3JjL3BzYXV4L2NmZmRlY29kZS5jCmluZGV4IDgwZDYyMmMuLjNkMmRhMWUgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9jZmZkZWNvZGUuYworKysgYi9zcmMvcHNhdXgvY2ZmZGVjb2RlLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRlY29kZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IENGRiAoVHlwZSAyKSBkZWNvZGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmRlY29kZS5jCisgKgorICogICBQb3N0U2NyaXB0IENGRiAoVHlwZSAyKSBkZWNvZGluZyByb3V0aW5lcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DRkZfVEFCTEVfTE9BRF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzZXJ2Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oPgogCiAjaW5jbHVkZSAiY2ZmZGVjb2RlLmgiCiAjaW5jbHVkZSAicHNvYmpzLmgiCkBAIC0yOCwxNCArMjcsMTQgQEAKICNpbmNsdWRlICJwc2F1eGVyci5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZmRlY29kZQorI2RlZmluZSBGVF9DT01QT05FTlQgIGNmZmRlY29kZQogCiAKICNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCkBAIC0yMzUsOCArMjM0LDggQEAKICAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7CiAgICAgfQogCi0gICAgYWR4ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLng7Ci0gICAgYWR5ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnk7CisgICAgYWR4ID0gQUREX0xPTkcoIGFkeCwgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCApOworICAgIGFkeSA9IEFERF9MT05HKCBhZHksIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnkgKTsKIAogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKICAgICAvKiBJbmNyZW1lbnRhbCBmb250cyBkb24ndCBuZWNlc3NhcmlseSBoYXZlIHZhbGlkIGNoYXJzZXRzLiAgICAgICAgKi8KQEAgLTMzMCw3ICszMjksNyBAQAogICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy54ID0gMDsKICAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueSA9IDA7CiAKLSAgICBidWlsZGVyLT5wb3NfeCA9IGFkeCAtIGFzYjsKKyAgICBidWlsZGVyLT5wb3NfeCA9IFNVQl9MT05HKCBhZHgsIGFzYiApOwogICAgIGJ1aWxkZXItPnBvc195ID0gYWR5OwogCiAgICAgLyogTm93IGxvYWQgYGFjaGFyJyBvbiB0b3Agb2YgdGhlIGJhc2Ugb3V0bGluZS4gKi8KQEAgLTM3OCwyMyArMzc3LDI2IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfY29tcHV0ZV9iaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgYmlhcyB2YWx1ZSBpbiBkZXBlbmRlbmNlIG9mIHRoZSBudW1iZXIgb2YgZ2x5cGggICAgICAgKi8KLSAgLyogICAgc3Vicm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fY2hhcnN0cmluZ190eXBlIDo6IFRoZSBgQ2hhcnN0cmluZ1R5cGUnIHZhbHVlIG9mIHRoZSB0b3AgRElDVCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3N1YnJzICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggc3Vicm91dGluZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJpYXMgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2ZmX2NvbXB1dGVfYmlhcworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQ29tcHV0ZXMgdGhlIGJpYXMgdmFsdWUgaW4gZGVwZW5kZW5jZSBvZiB0aGUgbnVtYmVyIG9mIGdseXBoCisgICAqICAgc3Vicm91dGluZXMuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBpbl9jaGFyc3RyaW5nX3R5cGUgOjoKKyAgICogICAgIFRoZSBgQ2hhcnN0cmluZ1R5cGUnIHZhbHVlIG9mIHRoZSB0b3AgRElDVAorICAgKiAgICAgZGljdGlvbmFyeS4KKyAgICoKKyAgICogICBudW1fc3VicnMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZ2x5cGggc3Vicm91dGluZXMuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgVGhlIGJpYXMgdmFsdWUuCisgICAqLwogICBzdGF0aWMgRlRfSW50CiAgIGNmZl9jb21wdXRlX2JpYXMoIEZUX0ludCAgIGluX2NoYXJzdHJpbmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgbnVtX3N1YnJzICkKQEAgLTQ2NCwyOCArNDY2LDMyIEBACiAKICNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAyIGNoYXJzdHJpbmdzIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciAgICAgICAgIDo6IFRoZSBjdXJyZW50IFR5cGUgMSBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluX2RpY3QgICAgICAgICA6OiBTZXQgdG8gMSBpZiBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0b3Agb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBESUNUIChuZWVkZWQgZm9yIE11bHRpcGxlIE1hc3RlciBDRkZzKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMiBjaGFyc3RyaW5ncyBwcm9ncmFtLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZGVjb2RlciA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgVHlwZSAxIGRlY29kZXIuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBjaGFyc3RyaW5nX2Jhc2UgOjoKKyAgICogICAgIFRoZSBiYXNlIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4KKyAgICoKKyAgICogICBjaGFyc3RyaW5nX2xlbiA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uCisgICAqCisgICAqICAgaW5fZGljdCA6OgorICAgKiAgICAgU2V0IHRvIDEgaWYgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdG9wIG9yCisgICAqICAgICBwcml2YXRlIERJQ1QgKG5lZWRlZCBmb3IgTXVsdGlwbGUgTWFzdGVyIENGRnMpLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgY2hhcnN0cmluZ19iYXNlLApAQCAtNTIzLDYgKzUyOSw5IEBACiAKICAgICBidWlsZGVyLT5wYXRoX2JlZ3VuID0gMDsKIAorICAgIGlmICggIWNoYXJzdHJpbmdfYmFzZSApCisgICAgICByZXR1cm4gRlRfRXJyX09rOworCiAgICAgem9uZS0+YmFzZSAgICAgICAgICAgPSBjaGFyc3RyaW5nX2Jhc2U7CiAgICAgbGltaXQgPSB6b25lLT5saW1pdCAgPSBjaGFyc3RyaW5nX2Jhc2UgKyBjaGFyc3RyaW5nX2xlbjsKICAgICBpcCAgICA9IHpvbmUtPmN1cnNvciA9IHpvbmUtPmJhc2U7CkBAIC01NDMsMTAgKzU1MiwxMCBAQAogICAgICAgRlRfQnl0ZSAgICAgICB2OwogCiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIERlY29kZSBvcGVyYXRvciBvciBvcGVyYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqCisgICAgICAgKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZAorICAgICAgICovCiAgICAgICB2ID0gKmlwKys7CiAgICAgICBpZiAoIHYgPj0gMzIgfHwgdiA9PSAyOCApCiAgICAgICB7CkBAIC04NTMsNiArODYyLDE1IEBACiAgICAgICAgICAgY2FzZSBjZmZfb3BfZmxleDE6CiAgICAgICAgICAgY2FzZSBjZmZfb3BfY2FsbHN1YnI6CiAgICAgICAgICAgY2FzZSBjZmZfb3BfY2FsbGdzdWJyOgorICAgICAgICAgICAgLyogZGVwcmVjYXRlZCBvcGNvZGVzICovCisgICAgICAgICAgY2FzZSBjZmZfb3BfZG90c2VjdGlvbjoKKyAgICAgICAgICAgIC8qIGludmFsaWQgVHlwZSAxIG9wY29kZXMgKi8KKyAgICAgICAgICBjYXNlIGNmZl9vcF9oc2J3OgorICAgICAgICAgIGNhc2UgY2ZmX29wX2Nsb3NlcGF0aDoKKyAgICAgICAgICBjYXNlIGNmZl9vcF9jYWxsb3RoZXJzdWJyOgorICAgICAgICAgIGNhc2UgY2ZmX29wX3NlYWM6CisgICAgICAgICAgY2FzZSBjZmZfb3Bfc2J3OgorICAgICAgICAgIGNhc2UgY2ZmX29wX3NldGN1cnJlbnRwb2ludDoKICAgICAgICAgICAgIGdvdG8gTU1fRXJyb3I7CiAKICAgICAgICAgICBkZWZhdWx0OgpAQCAtOTQ4LDEwICs5NjYsMTAgQEAKICAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW1obToKICAgICAgICAgY2FzZSBjZmZfb3BfdnN0ZW1obToKICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpcyBhbHdheXMgZXZlbiBoZXJlICovCi0gICAgICAgICAgRlRfVFJBQ0U0KCgKLSAgICAgICAgICAgICAgb3AgPT0gY2ZmX29wX2hzdGVtICAgPyAiIGhzdGVtXG4iICAgOgotICAgICAgICAgICAgKCBvcCA9PSBjZmZfb3BfdnN0ZW0gICA/ICIgdnN0ZW1cbiIgICA6Ci0gICAgICAgICAgICAoIG9wID09IGNmZl9vcF9oc3RlbWhtID8gIiBoc3RlbWhtXG4iIDogIiB2c3RlbWhtXG4iICkgKSApKTsKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiJXNcbiIsCisgICAgICAgICAgICAgIG9wID09IGNmZl9vcF9oc3RlbSAgID8gIiBoc3RlbSIgICA6CisgICAgICAgICAgICAoIG9wID09IGNmZl9vcF92c3RlbSAgID8gIiB2c3RlbSIgICA6CisgICAgICAgICAgICAoIG9wID09IGNmZl9vcF9oc3RlbWhtID8gIiBoc3RlbWhtIiA6ICIgdnN0ZW1obSIgKSApICkpOwogCiAgICAgICAgICAgaWYgKCBoaW50ZXIgKQogICAgICAgICAgICAgaGludGVyLT5zdGVtcyggaGludGVyLT5oaW50cywKQEAgLTk2NSw3ICs5ODMsOCBAQAogCiAgICAgICAgIGNhc2UgY2ZmX29wX2hpbnRtYXNrOgogICAgICAgICBjYXNlIGNmZl9vcF9jbnRybWFzazoKLSAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgPyAiIGhpbnRtYXNrIiA6ICIgY250cm1hc2siICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIlcyIsIG9wID09IGNmZl9vcF9oaW50bWFzayA/ICIgaGludG1hc2siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBjbnRybWFzayIgKSk7CiAKICAgICAgICAgICAvKiBpbXBsZW1lbnQgdnN0ZW0gd2hlbiBuZWVkZWQgLS0gICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgIC8qIHRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3Qgc2F5IGl0LCBidXQgdGhpcyBhbHNvIHdvcmtzICovCkBAIC0xMDc4LDggKzEwOTcsOCBAQAogICAgICAgICAgICAgRlRfSW50ICBwaGFzZSA9ICggb3AgPT0gY2ZmX29wX2hsaW5ldG8gKTsKIAogCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaGxpbmV0byA/ICIgaGxpbmV0b1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIHZsaW5ldG9cbiIgKSk7CisgICAgICAgICAgICBGVF9UUkFDRTQoKCAiJXNcbiIsIG9wID09IGNmZl9vcF9obGluZXRvID8gIiBobGluZXRvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgdmxpbmV0byIgKSk7CiAKICAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCAwICkKICAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CkBAIC0xMjUwLDggKzEyNjksOCBAQAogICAgICAgICAgICAgRlRfSW50ICBuYXJnczsKIAogCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfdmhjdXJ2ZXRvID8gIiB2aGN1cnZldG9cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIGh2Y3VydmV0b1xuIiApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlc1xuIiwgb3AgPT0gY2ZmX29wX3ZoY3VydmV0byA/ICIgdmhjdXJ2ZXRvIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBodmN1cnZldG8iICkpOwogCiAgICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLCB4LCB5ICkgKQogICAgICAgICAgICAgICBnb3RvIEZhaWw7CkBAIC0xNTM5LDkgKzE1NTgsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoIGR4IDwgMCApCi0gICAgICAgICAgICAgIGR4ID0gLWR4OworICAgICAgICAgICAgICBkeCA9IE5FR19MT05HKCBkeCApOwogICAgICAgICAgICAgaWYgKCBkeSA8IDAgKQotICAgICAgICAgICAgICBkeSA9IC1keTsKKyAgICAgICAgICAgICAgZHkgPSBORUdfTE9ORyggZHkgKTsKIAogICAgICAgICAgICAgLyogc3RyYW5nZSB0ZXN0LCBidXQgaGVyZSBpdCBpcy4uLiAqLwogICAgICAgICAgICAgaG9yaXpvbnRhbCA9ICggZHggPiBkeSApOwpAQCAtMTU1MSw3ICsxNTcwLDcgQEAKICAgICAgICAgICAgICAgeCA9IEFERF9MT05HKCB4LCBhcmdzWzBdICk7CiAgICAgICAgICAgICAgIHkgPSBBRERfTE9ORyggeSwgYXJnc1sxXSApOwogICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0Jvb2wpKCBjb3VudCA9PSAzICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CT09MKCBjb3VudCA9PSAzICkgKTsKICAgICAgICAgICAgICAgYXJncyArPSAyOwogICAgICAgICAgICAgfQogCkBAIC0xNTg5LDcgKzE2MDgsNyBAQAogICAgICAgICAgICAgICB4ID0gQUREX0xPTkcoIHgsIGFyZ3NbMF0gKTsKICAgICAgICAgICAgICAgeSA9IEFERF9MT05HKCB5LCBhcmdzWzFdICk7CiAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQm9vbCkoIGNvdW50ID09IDQgfHwgY291bnQgPT0gMSApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQk9PTCggY291bnQgPT0gNCB8fCBjb3VudCA9PSAxICkgKTsKICAgICAgICAgICAgICAgYXJncyArPSAyOwogICAgICAgICAgICAgfQogCkBAIC0xNzA1LDE2ICsxNzI0LDIwIEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBjZmZfb3BfcmFuZG9tOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmFuZG9tXG4iICkpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX1VJbnQzMiogIHJhbmR2YWwgPSBpbl9kaWN0ID8gJmRlY29kZXItPmNmZi0+dG9wX2ZvbnQucmFuZG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnJhbmRvbTsKIAotICAgICAgICAgIC8qIG9ubHkgdXNlIHRoZSBsb3dlciAxNiBiaXRzIG9mIGByYW5kb20nICAqLwotICAgICAgICAgIC8qIHRvIGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSAoMDsxXSAqLwotICAgICAgICAgIGFyZ3NbMF0gPSAoRlRfRml4ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgKCAoIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cmFuZG9tICYgMHhGRkZGICkgKyAxICk7Ci0gICAgICAgICAgYXJncysrOwogCi0gICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5yYW5kb20gPQotICAgICAgICAgICAgY2ZmX3JhbmRvbSggZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5yYW5kb20gKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmFuZG9tXG4iICkpOworCisgICAgICAgICAgICAvKiBvbmx5IHVzZSB0aGUgbG93ZXIgMTYgYml0cyBvZiBgcmFuZG9tJyAgKi8KKyAgICAgICAgICAgIC8qIHRvIGdlbmVyYXRlIGEgbnVtYmVyIGluIHRoZSByYW5nZSAoMDsxXSAqLworICAgICAgICAgICAgYXJnc1swXSA9IChGVF9GaXhlZCkoICggKnJhbmR2YWwgJiAweEZGRkYgKSArIDEgKTsKKyAgICAgICAgICAgIGFyZ3MrKzsKKworICAgICAgICAgICAgKnJhbmR2YWwgPSBjZmZfcmFuZG9tKCAqcmFuZHZhbCApOworICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIGNmZl9vcF9tdWw6CkBAIC0xNzI3LDcgKzE3NTAsMTAgQEAKICAgICAgICAgY2FzZSBjZmZfb3Bfc3FydDoKICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNxcnRcbiIgKSk7CiAKLSAgICAgICAgICBpZiAoIGFyZ3NbMF0gPiAwICkKKyAgICAgICAgICAvKiB3aXRob3V0IHVwcGVyIGxpbWl0IHRoZSBsb29wIGJlbG93IG1pZ2h0IG5vdCBmaW5pc2ggKi8KKyAgICAgICAgICBpZiAoIGFyZ3NbMF0gPiAweDdGRkZGRkZGTCApCisgICAgICAgICAgICBhcmdzWzBdID0gNDYzNDE7CisgICAgICAgICAgZWxzZSBpZiAoIGFyZ3NbMF0gPiAwICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBGVF9GaXhlZCAgcm9vdCA9IGFyZ3NbMF07CiAgICAgICAgICAgICBGVF9GaXhlZCAgbmV3X3Jvb3Q7CkBAIC0xODAwLDYgKzE4MjYsNyBAQAogCiAgICAgICAgICAgICBpZiAoIGlkeCA+PSAwICkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWR4ID0gaWR4ICUgY291bnQ7CiAgICAgICAgICAgICAgIHdoaWxlICggaWR4ID4gMCApCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgdG1wID0gYXJnc1tjb3VudCAtIDFdOwpAQCAtMTgxNCw2ICsxODQxLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIC8qIGJlZm9yZSBDOTkgaXQgaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCB3aGV0aGVyICAgICovCisgICAgICAgICAgICAgIC8qIHRoZSByZXN1bHQgb2YgYCUnIGlzIG5lZ2F0aXZlIGlmIHRoZSBmaXJzdCBvcGVyYW5kICovCisgICAgICAgICAgICAgIC8qIGlzIG5lZ2F0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgIGlkeCA9IC0oIE5FR19JTlQoIGlkeCApICUgY291bnQgKTsKICAgICAgICAgICAgICAgd2hpbGUgKCBpZHggPCAwICkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEZUX0ZpeGVkICB0bXAgPSBhcmdzWzBdOwpAQCAtMTkxNCw2ICsxOTQ1LDcgQEAKICAgICAgICAgY2FzZSBjZmZfb3BfYmxlbmQ6CiAgICAgICAgICAgLyogdGhpcyBvcGVyYXRvciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBUeXBlMiBzcGVjaWZpY2F0aW9uICovCiAgICAgICAgICAgLyogaW4gdmVyc2lvbiAxNi1NYXJjaC0yMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgaWYgKCBudW1fZGVzaWducyApCiAgICAgICAgICAgewogICAgICAgICAgICAgRlRfSW50ICBudW1fcmVzdWx0cyA9IChGVF9JbnQpKCBhcmdzWzBdID4+IDE2ICk7CiAKQEAgLTE5MjMsNyArMTk1NSw4IEBACiAgICAgICAgICAgICBpZiAoIG51bV9yZXN1bHRzIDwgMCApCiAgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwogCi0gICAgICAgICAgICBpZiAoIG51bV9yZXN1bHRzICogKEZUX0ludCludW1fZGVzaWducyA+IG51bV9hcmdzICkKKyAgICAgICAgICAgIGlmICggbnVtX3Jlc3VsdHMgPiBudW1fYXJncyAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgbnVtX3Jlc3VsdHMgKiAoRlRfSW50KW51bV9kZXNpZ25zID4gbnVtX2FyZ3MgKQogICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKIAogICAgICAgICAgICAgLyogc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhbmRsZSBpbnRlcnBvbGF0aW9uIG9mIG11bHRpcGxlICovCkBAIC0xOTMyLDYgKzE5NjUsOCBAQAogICAgICAgICAgICAgYXJncyAgICAgLT0gbnVtX3Jlc3VsdHMgKiAoIG51bV9kZXNpZ25zIC0gMSApOwogICAgICAgICAgICAgbnVtX2FyZ3MgLT0gbnVtX3Jlc3VsdHMgKiAoIG51bV9kZXNpZ25zIC0gMSApOwogICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIGNmZl9vcF9kb3RzZWN0aW9uOgpAQCAtMTk5OCwyMCArMjAzMywzMSBAQAogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgY2ZmX29wX2NhbGxvdGhlcnN1YnI6Ci0gICAgICAgICAgLyogdGhpcyBpcyBhbiBpbnZhbGlkIFR5cGUgMiBvcGVyYXRvcjsgaG93ZXZlciwgdGhlcmUgICAgICAgICovCi0gICAgICAgICAgLyogZXhpc3QgZm9udHMgd2hpY2ggYXJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBmcm9tIHByb2JhYmx5ICovCi0gICAgICAgICAgLyogVHlwZSAxIHRvIENGRiwgYW5kIHNvbWUgcGFyc2VycyBzZWVtIHRvIGFjY2VwdCBpdCAgICAgICAgICovCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfRml4ZWQgIGFyZzsKIAotICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbG90aGVyc3ViciAoaW52YWxpZCBvcClcbiIgKSk7CiAKLSAgICAgICAgICAvKiBzdWJzZXF1ZW50IGBwb3AnIG9wZXJhbmRzIHNob3VsZCBhZGQgdGhlIGFyZ3VtZW50cywgICAgICAgKi8KLSAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgZm9yIGB1bmtub3duJyBvdGhlciAgKi8KLSAgICAgICAgICAvKiBzdWJyb3V0aW5lcyBpbiB0aGUgVHlwZTEgc3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBYWFggRml4IHJldHVybiBhcmd1bWVudHMgKHNlZSBkaXNjdXNzaW9uIGJlbG93KS4gICAgICAgICAgKi8KLSAgICAgICAgICBhcmdzIC09IDIgKyAoIGFyZ3NbLTJdID4+IDE2ICk7Ci0gICAgICAgICAgaWYgKCBhcmdzIDwgc3RhY2sgKQotICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CisgICAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICovCisgICAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gICAgICAgICovCisgICAgICAgICAgICAvKiBwcm9iYWJseSBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0ICovCisgICAgICAgICAgICAvKiBpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbG90aGVyc3ViciAoaW52YWxpZCBvcClcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIHN1YnNlcXVlbnQgYHBvcCcgb3BlcmFuZHMgc2hvdWxkIGFkZCB0aGUgYXJndW1lbnRzLCAgICAgKi8KKyAgICAgICAgICAgIC8qIHRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGRlc2NyaWJlZCBmb3IgYHVua25vd24nICAgICAgKi8KKyAgICAgICAgICAgIC8qIG90aGVyIHN1YnJvdXRpbmVzIGluIHRoZSBUeXBlMSBzcGVjLiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIFhYWCBGaXggcmV0dXJuIGFyZ3VtZW50cyAoc2VlIGRpc2N1c3Npb24gYmVsb3cpLiAgICAgICAgKi8KKworICAgICAgICAgICAgYXJnID0gMiArICggYXJnc1stMl0gPj4gMTYgKTsKKyAgICAgICAgICAgIGlmICggYXJnID49IENGRl9NQVhfT1BFUkFORFMgKQorICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKKworICAgICAgICAgICAgYXJncyAtPSBhcmc7CisgICAgICAgICAgICBpZiAoIGFyZ3MgPCBzdGFjayApCisgICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OworICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIGNmZl9vcF9wb3A6CkBAIC0yMjUxLDI4ICsyMjk3LDM0IEBACiAjZW5kaWYgLyogQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2RlY29kZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGluZyAgIDo6IFdoZXRoZXIgaGludGluZyBpcyBhY3RpdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50X21vZGUgOjogVGhlIGhpbnRpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2ZmX2RlY29kZXJfaW5pdAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBkZWNvZGVyLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZGVjb2RlciA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgY3VycmVudCBzaXplIG9iamVjdC4KKyAgICoKKyAgICogICBzbG90IDo6CisgICAqICAgICBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuCisgICAqCisgICAqICAgaGludGluZyA6OgorICAgKiAgICAgV2hldGhlciBoaW50aW5nIGlzIGFjdGl2ZS4KKyAgICoKKyAgICogICBoaW50X21vZGUgOjoKKyAgICogICAgIFRoZSBoaW50aW5nIG1vZGUuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBjZmZfZGVjb2Rlcl9pbml0KCBDRkZfRGVjb2RlciogICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L2NmZmRlY29kZS5oIGIvc3JjL3BzYXV4L2NmZmRlY29kZS5oCmluZGV4IDBkNGY1ZmUuLjc3YTQ5NjIgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9jZmZkZWNvZGUuaAorKysgYi9zcmMvcHNhdXgvY2ZmZGVjb2RlLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRlY29kZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IENGRiAoVHlwZSAyKSBkZWNvZGluZyByb3V0aW5lcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxNy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGNmZmRlY29kZS5oCisgKgorICogICBQb3N0U2NyaXB0IENGRiAoVHlwZSAyKSBkZWNvZGluZyByb3V0aW5lcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIENGRkRFQ09ERV9IXwogI2RlZmluZSBDRkZERUNPREVfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L21vZHVsZS5tayBiL3NyYy9wc2F1eC9tb2R1bGUubWsKaW5kZXggNjU4NGQwNy4uNjUxZGIwMSAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L21vZHVsZS5taworKysgYi9zcmMvcHNhdXgvbW9kdWxlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhcnJzdC5jIGIvc3JjL3BzYXV4L3BzYXJyc3QuYwppbmRleCBhODc4MDk0Li44NzUxZDI3IDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNhcnJzdC5jCisrKyBiL3NyYy9wc2F1eC9wc2FycnN0LmMKQEAgLTEsNDMgKzEsNDMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXJyc3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNhcnJzdC5jCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgInBzZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKICNpbmNsdWRlICJwc2dsdWUuaCIKICNpbmNsdWRlICJwc2FycnN0LmgiCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhcnJzdC5oIGIvc3JjL3BzYXV4L3BzYXJyc3QuaAppbmRleCBiMzU2OGViLi4wOTg2MTdiIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNhcnJzdC5oCisrKyBiL3NyYy9wc2F1eC9wc2FycnN0LmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXJyc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNhcnJzdC5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0FSUlNUX0hfCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhdXguYyBiL3NyYy9wc2F1eC9wc2F1eC5jCmluZGV4IGZiNDQ3ZmMuLmY0MjgyMjIgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2F1eC5jCisrKyBiL3NyYy9wc2F1eC9wc2F1eC5jCkBAIC0xLDIzICsxLDIyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYXV4aWxpYXJ5IFBvc3RTY3JpcHQgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2F1eC5jCisgKgorICogICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgImFmbXBhcnNlLmMiCiAjaW5jbHVkZSAicHNhdXhtb2QuYyIKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2F1eGVyci5oIGIvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKaW5kZXggY2MzM2ZkMi4uOGI5YTk1OCAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKKysrIGIvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4ZXJyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQUyBhdXhpbGlhcnkgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzYXV4ZXJyLmgKKyAqCisgKiAgIFBTIGF1eGlsaWFyeSBtb2R1bGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQUyBhdXhpbGlhcnkgbW9kdWxlIGVycm9yIGVudW1lcmF0aW9uICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIGF1eGlsaWFyeSBtb2R1bGUgZXJyb3IgZW51bWVyYXRpb24KKyAgICogY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBQU0FVWEVSUl9IXwogI2RlZmluZSBQU0FVWEVSUl9IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU2F1eF9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUFNhdXgKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAjZW5kaWYgLyogUFNBVVhFUlJfSF8gKi8KIApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzYXV4bW9kLmMgYi9zcmMvcHNhdXgvcHNhdXhtb2QuYwppbmRleCBlZTQ5NzA4Li5lNzNiYTIyIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNhdXhtb2QuYworKysgYi9zcmMvcHNhdXgvcHNhdXhtb2QuYwpAQCAtMSwyMiArMSwyMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXhtb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGF1eGlsaWFyeSBQb3N0U2NyaXB0IG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNhdXhtb2QuYworICoKKyAqICAgRnJlZVR5cGUgYXV4aWxpYXJ5IFBvc3RTY3JpcHQgbW9kdWxlIGltcGxlbWVudGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgInBzYXV4bW9kLmgiCiAjaW5jbHVkZSAicHNvYmpzLmgiCiAjaW5jbHVkZSAidDFkZWNvZGUuaCIKQEAgLTE3MSw5ICsxNzAsOSBAQAogICB9OwogCiAKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX01vZHVsZV9DbGFzcyAgcHNhdXhfbW9kdWxlX2NsYXNzID0KLSAgeworICBGVF9ERUZJTkVfTU9EVUxFKAorICAgIHBzYXV4X21vZHVsZV9jbGFzcywKKwogICAgIDAsCiAgICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCiAgICAgInBzYXV4IiwKQEAgLTE4NSw3ICsxODQsNyBAQAogICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpTlVMTCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIE5VTEwsICAvKiBtb2R1bGVfZG9uZSAgICovCiAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBOVUxMICAgLyogZ2V0X2ludGVyZmFjZSAqLwotICB9OworICApCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNhdXhtb2QuaCBiL3NyYy9wc2F1eC9wc2F1eG1vZC5oCmluZGV4IGYzMDk3OGYuLmE2YmViZTQgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2F1eG1vZC5oCisrKyBiL3NyYy9wc2F1eC9wc2F1eG1vZC5oCkBAIC0xLDM3ICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eG1vZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYXV4aWxpYXJ5IFBvc3RTY3JpcHQgbW9kdWxlIGltcGxlbWVudGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2F1eG1vZC5oCisgKgorICogICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0FVWE1PRF9IXwogI2RlZmluZSBQU0FVWE1PRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGFwaS5oPgogCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCiAKICAgRlRfQ0FMTEJBQ0tfVEFCTEUKICAgY29uc3QgQ0ZGX0J1aWxkZXJfRnVuY3NSZWMgIGNmZl9idWlsZGVyX2Z1bmNzOwpAQCAtMzksMTAgKzM0LDI0IEBACiAgIEZUX0NBTExCQUNLX1RBQkxFCiAgIGNvbnN0IFBTX0J1aWxkZXJfRnVuY3NSZWMgICBwc19idWlsZGVyX2Z1bmNzOwogCisjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCisgIEZUX0NBTExCQUNLX1RBQkxFCisgIGNvbnN0IEFGTV9QYXJzZXJfRnVuY3NSZWMgIGFmbV9wYXJzZXJfZnVuY3M7CisjZW5kaWYKKworICBGVF9DQUxMQkFDS19UQUJMRQorICBjb25zdCBUMV9DTWFwX0NsYXNzZXNSZWMgIHQxX2NtYXBfY2xhc3NlczsKKworICBGVF9DQUxMQkFDS19UQUJMRQorICBjb25zdCBDRkZfRGVjb2Rlcl9GdW5jc1JlYyAgY2ZmX2RlY29kZXJfZnVuY3M7CisKIAogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgKSAgcHNhdXhfZHJpdmVyX2NsYXNzOwogCiAKKyAgRlRfREVDTEFSRV9NT0RVTEUoIHBzYXV4X21vZHVsZV9jbGFzcyApCisKKwogRlRfRU5EX0hFQURFUgogCiAjZW5kaWYgLyogUFNBVVhNT0RfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2JsdWVzLmMgYi9zcmMvcHNhdXgvcHNibHVlcy5jCmluZGV4IGFlMzlkMDMuLjM4NzhlOWIgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2JsdWVzLmMKKysrIGIvc3JjL3BzYXV4L3BzYmx1ZXMuYwpAQCAtMSw1NyArMSw1NyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNibHVlcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQmx1ZSBab25lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2JsdWVzLmMKKyAqCisgKiAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQmx1ZSBab25lcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IDIwMDktMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgInBzZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKICNpbmNsdWRlICJwc2JsdWVzLmgiCiAjaW5jbHVkZSAicHNoaW50cy5oIgogI2luY2x1ZGUgInBzZm9udC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmMmJsdWVzCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgY2YyYmx1ZXMKIAogCiAgIC8qCkBAIC00NTIsMTMgKzQ1MiwxMyBAQAogICAgKiB6b25lcyBpbiB0aGUgc2FtZSBwYXNzIChzZWUgYEJsdWVMb2NrJykuICBJZiBhIGhpbnQgaXMgY2FwdHVyZWQsCiAgICAqIHJldHVybiB0cnVlIGFuZCBwb3NpdGlvbiB0aGUgZWRnZShzKSBpbiBvbmUgb2YgMyB3YXlzOgogICAgKgotICAgKiAgMSkgSWYgYEJsdWVTY2FsZScgc3VwcHJlc3NlcyBvdmVyc2hvb3QsIHBvc2l0aW9uIHRoZSBjYXB0dXJlZCBlZGdlCi0gICAqICAgICBhdCB0aGUgZmxhdCBlZGdlIG9mIHRoZSB6b25lLgotICAgKiAgMikgSWYgb3ZlcnNob290IGlzIG5vdCBzdXBwcmVzc2VkIGFuZCBgQmx1ZVNoaWZ0JyByZXF1aXJlcwotICAgKiAgICAgb3ZlcnNob290LCBwb3NpdGlvbiB0aGUgY2FwdHVyZWQgZWRnZSBhIG1pbmltdW0gb2YgMSBkZXZpY2UgcGl4ZWwKLSAgICogICAgIGZyb20gdGhlIGZsYXQgZWRnZS4KLSAgICogIDMpIElmIG92ZXJzaG9vdCBpcyBub3Qgc3VwcHJlc3NlZCBvciByZXF1aXJlZCwgcG9zaXRpb24gdGhlIGNhcHR1cmVkCi0gICAqICAgICBlZGdlIGF0IHRoZSBuZWFyZXN0IGRldmljZSBwaXhlbC4KKyAgICogMSkgSWYgYEJsdWVTY2FsZScgc3VwcHJlc3NlcyBvdmVyc2hvb3QsIHBvc2l0aW9uIHRoZSBjYXB0dXJlZCBlZGdlCisgICAqICAgIGF0IHRoZSBmbGF0IGVkZ2Ugb2YgdGhlIHpvbmUuCisgICAqIDIpIElmIG92ZXJzaG9vdCBpcyBub3Qgc3VwcHJlc3NlZCBhbmQgYEJsdWVTaGlmdCcgcmVxdWlyZXMKKyAgICogICAgb3ZlcnNob290LCBwb3NpdGlvbiB0aGUgY2FwdHVyZWQgZWRnZSBhIG1pbmltdW0gb2YgMSBkZXZpY2UgcGl4ZWwKKyAgICogICAgZnJvbSB0aGUgZmxhdCBlZGdlLgorICAgKiAzKSBJZiBvdmVyc2hvb3QgaXMgbm90IHN1cHByZXNzZWQgb3IgcmVxdWlyZWQsIHBvc2l0aW9uIHRoZSBjYXB0dXJlZAorICAgKiAgICBlZGdlIGF0IHRoZSBuZWFyZXN0IGRldmljZSBwaXhlbC4KICAgICoKICAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNibHVlcy5oIGIvc3JjL3BzYXV4L3BzYmx1ZXMuaAppbmRleCAyNWVmNjg0Li41NWZiODhlIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNibHVlcy5oCisrKyBiL3NyYy9wc2F1eC9wc2JsdWVzLmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYmx1ZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGhhbmRsaW5nIEJsdWUgWm9uZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNibHVlcy5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIGhhbmRsaW5nIEJsdWUgWm9uZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICAgLyoKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2NvbnYuYyBiL3NyYy9wc2F1eC9wc2NvbnYuYwppbmRleCBhMDMzODUwLi40Y2Y1Y2Q1IDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNjb252LmMKKysrIGIvc3JjL3BzYXV4L3BzY29udi5jCkBAIC0xLDM3ICsxLDM2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2NvbnYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU29tZSBjb252ZW5pZW5jZSBjb252ZXJzaW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2NvbnYuYworICoKKyAqICAgU29tZSBjb252ZW5pZW5jZSBjb252ZXJzaW9ucyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgInBzY29udi5oIgogI2luY2x1ZGUgInBzYXV4ZXJyLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNjb252CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcHNjb252CiAKIAogICAvKiBUaGUgZm9sbG93aW5nIGFycmF5IGlzIHVzZWQgYnkgdmFyaW91cyBmdW5jdGlvbnMgdG8gcXVpY2tseSBjb252ZXJ0ICovCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNjb252LmggYi9zcmMvcHNhdXgvcHNjb252LmgKaW5kZXggZDY0M2ZmYy4uODMzZTgyNyAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzY29udi5oCisrKyBiL3NyYy9wc2F1eC9wc2NvbnYuaApAQCAtMSwyNyArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNjb252LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNjb252LmgKKyAqCisgKiAgIFNvbWUgY29udmVuaWVuY2UgY29udmVyc2lvbnMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0NPTlZfSF8KICNkZWZpbmUgUFNDT05WX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2Vycm9yLmMgYi9zcmMvcHNhdXgvcHNlcnJvci5jCmluZGV4IDkxNjllNTIuLjk4Y2ViY2YgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2Vycm9yLmMKKysrIGIvc3JjL3BzYXV4L3BzZXJyb3IuYwpAQCAtMSwzOSArMSwzOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNlcnJvci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZXJyb3IgaGFuZGxpbmcgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2Vycm9yLmMKKyAqCisgKiAgIEFkb2JlJ3MgY29kZSBmb3IgZXJyb3IgaGFuZGxpbmcgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAyMDA2LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJwc2Z0LmgiCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNlcnJvci5oIGIvc3JjL3BzYXV4L3BzZXJyb3IuaAppbmRleCAxM2Q1MjA2Li41NzM4ODUzIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNlcnJvci5oCisrKyBiL3NyYy9wc2F1eC9wc2Vycm9yLmgKQEAgLTEsNDYgKzEsNDYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzZXJyb3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGVycm9yIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNlcnJvci5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIGVycm9yIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNi0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFBTRVJST1JfSF8KICNkZWZpbmUgUFNFUlJPUl9IXwogCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC00OSw3ICs0OSw4IEBACiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfQ0YyCiAKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oPgogI2luY2x1ZGUgInBzZnQuaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNmaXhlZC5oIGIvc3JjL3BzYXV4L3BzZml4ZWQuaAppbmRleCAyMTk1ODllLi43ZGZmOWVmIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNmaXhlZC5oCisrKyBiL3NyYy9wc2F1eC9wc2ZpeGVkLmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzZml4ZWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEZpeGVkIFBvaW50IE1hdGhlbWF0aWNzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNmaXhlZC5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIEZpeGVkIFBvaW50IE1hdGhlbWF0aWNzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNGSVhFRF9IXwpAQCAtNzIsOCArNzIsNyBAQAogI2RlZmluZSBjZjJfZml4ZWRGcmFjdGlvbiggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAoICh4KSAtIGNmMl9maXhlZEZsb29yKCB4ICkgKQogI2RlZmluZSBjZjJfZnJhY1RvRml4ZWQoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSA8IDAgPyAtKCAoIC0oeCkgKyAweDIwMDAgKSA+PiAxNCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIDogICggKCAgKHgpICsgMHgyMDAwICkgPj4gMTQgKSApCisgICAgICAgICAgKCAoICh4KSArIDB4MjAwMCAtICggKHgpIDwgMCApICkgPj4gMTQgKQogCiAKICAgLyogc2lnbmVkIG51bWVyaWMgdHlwZXMgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2ZvbnQuYyBiL3NyYy9wc2F1eC9wc2ZvbnQuYwppbmRleCBkZGU2N2E3Li4wZGIxZjBjIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNmb250LmMKKysrIGIvc3JjL3BzYXV4L3BzZm9udC5jCkBAIC0xLDQzICsxLDQyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2ZvbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBmb250IGluc3RhbmNlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzZm9udC5jCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIGZvbnQgaW5zdGFuY2VzIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgogCiAjaW5jbHVkZSAicHNmdC5oIgogCkBAIC0yNzQsOSArMjczLDYgQEAKIAogICAgIGlmICggIWZvbnQtPmlzVDEgKQogICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfQ0ZGTG9hZCAgY2ZmbG9hZCA9IChGVF9TZXJ2aWNlX0NGRkxvYWQpZm9udC0+Y2ZmbG9hZDsKLQotCiAgICAgICAvKiBjaGVjayBmb3IgdmFyaWF0aW9uIHZlY3RvcnMgKi8KICAgICAgIHZzdG9yZSAgICAgICAgPSBjZjJfZ2V0VlN0b3JlKCBkZWNvZGVyICk7CiAgICAgICBoYXNWYXJpYXRpb25zID0gKCB2c3RvcmUtPmRhdGFDb3VudCAhPSAwICk7CkBAIC0yODQsNiArMjgwLDkgQEAKICAgICAgIGlmICggaGFzVmFyaWF0aW9ucyApCiAgICAgICB7CiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorICAgICAgICBGVF9TZXJ2aWNlX0NGRkxvYWQgIGNmZmxvYWQgPSAoRlRfU2VydmljZV9DRkZMb2FkKWZvbnQtPmNmZmxvYWQ7CisKKwogICAgICAgICAvKiBjaGVjayB3aGV0aGVyIFByaXZhdGUgRElDVCBpbiB0aGlzIHN1YmZvbnQgbmVlZHMgdG8gYmUgcmVwYXJzZWQgKi8KICAgICAgICAgZm9udC0+ZXJyb3IgPSBjZjJfZ2V0Tm9ybWFsaXplZFZlY3RvciggZGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbk5vcm1hbGl6ZWRWLApAQCAtMzMxLDcgKzMzMCw3IEBACiAgICAgfQogCiAgICAgLyogY29weSBoaW50ZWQgZmxhZyBvbiBlYWNoIGNhbGwgKi8KLSAgICBmb250LT5oaW50ZWQgPSAoRlRfQm9vbCkoIGZvbnQtPnJlbmRlcmluZ0ZsYWdzICYgQ0YyX0ZsYWdzSGludGVkICk7CisgICAgZm9udC0+aGludGVkID0gRlRfQk9PTCggZm9udC0+cmVuZGVyaW5nRmxhZ3MgJiBDRjJfRmxhZ3NIaW50ZWQgKTsKIAogICAgIC8qIGRldGVybWluZSBpZiB0cmFuc2Zvcm0gaGFzIGNoYW5nZWQ7ICAgICAgICovCiAgICAgLyogaW5jbHVkZSBGb250bWF0cml4IGJ1dCBpZ25vcmUgdHJhbnNsYXRpb24gKi8KQEAgLTM2Niw3ICszNjUsNyBAQAogICAgIGlmICggZm9udC0+c3RlbURhcmtlbmVkICE9ICggZm9udC0+cmVuZGVyaW5nRmxhZ3MgJiBDRjJfRmxhZ3NEYXJrZW5lZCApICkKICAgICB7CiAgICAgICBmb250LT5zdGVtRGFya2VuZWQgPQotICAgICAgICAoRlRfQm9vbCkoIGZvbnQtPnJlbmRlcmluZ0ZsYWdzICYgQ0YyX0ZsYWdzRGFya2VuZWQgKTsKKyAgICAgICAgRlRfQk9PTCggZm9udC0+cmVuZGVyaW5nRmxhZ3MgJiBDRjJfRmxhZ3NEYXJrZW5lZCApOwogCiAgICAgICAvKiBibHVlIHpvbmVzIGRlcGVuZCBvbiBkYXJrZW5lZCBmbGFnICovCiAgICAgICBuZWVkRXh0cmFTZXR1cCA9IFRSVUU7CmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNmb250LmggYi9zcmMvcHNhdXgvcHNmb250LmgKaW5kZXggZTYxMWFjNC4uODM2ZmNlNCAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzZm9udC5oCisrKyBiL3NyYy9wc2F1eC9wc2ZvbnQuaApAQCAtMSw0NiArMSw0NiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNmb250LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZm9udCBpbnN0YW5jZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2ZvbnQuaAorICoKKyAqICAgQWRvYmUncyBjb2RlIGZvciBmb250IGluc3RhbmNlcyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0ZPTlRfSF8KICNkZWZpbmUgUFNGT05UX0hfCiAKIAotI2luY2x1ZGUgRlRfU0VSVklDRV9DRkZfVEFCTEVfTE9BRF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjZmZ0bC5oPgogCiAjaW5jbHVkZSAicHNmdC5oIgogI2luY2x1ZGUgInBzYmx1ZXMuaCIKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2Z0LmMgYi9zcmMvcHNhdXgvcHNmdC5jCmluZGV4IDFmNzUwMTcuLjQxYzE2NTQgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2Z0LmMKKysrIGIvc3JjL3BzYXV4L3BzZnQuYwpAQCAtMSw0MyArMSw0MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNmdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKGJvZHkpLiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzLTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2Z0LmMKKyAqCisgKiAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAyMDEzLTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJwc2Z0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAjaW5jbHVkZSAicHNmb250LmgiCiAjaW5jbHVkZSAicHNlcnJvci5oIgpAQCAtNDUsMTEgKzQ1LDExIEBACiAjaW5jbHVkZSAiY2ZmZGVjb2RlLmgiCiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KICNlbmRpZgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NGRl9UQUJMRV9MT0FEX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNmZnRsLmg+CiAKIAogI2RlZmluZSBDRjJfTUFYX1NJWkUgIGNmMl9pbnRUb0ZpeGVkKCAyMDAwICkgICAgLyogbWF4IHBwZW0gKi8KQEAgLTEyMCwxMiArMTIwLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNsaWVudCBvdXRsaW5lOyAgICovCi0gIC8qIEZyZWVUeXBlIHVzZXMgY29vcmRpbmF0ZXMgaW4gMjYuNiBmb3JtYXQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjbGllbnQgb3V0bGluZTsKKyAgICogRnJlZVR5cGUgdXNlcyBjb29yZGluYXRlcyBpbiAyNi42IGZvcm1hdAorICAgKgorICAgKi8KIAogICBzdGF0aWMgdm9pZAogICBjZjJfYnVpbGRlcl9tb3ZlVG8oIENGMl9PdXRsaW5lQ2FsbGJhY2tzICAgICAgY2FsbGJhY2tzLApAQCAtMzEzLDcgKzMxMyw3IEBACiAgICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKICAgICBDRjJfRm9udCAgIGZvbnQ7CiAKLSAgICBGVF9Cb29sICAgIGlzX3QxID0gZGVjb2Rlci0+YnVpbGRlci5pc190MTsKKyAgICBGVF9Cb29sICBpc190MSA9IGRlY29kZXItPmJ1aWxkZXIuaXNfdDE7CiAKIAogICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJgpAQCAtMzg1LDcgKzM4NSw3IEBACiAgICAgICBGVF9aRVJPKCAmYnVmICk7CiAgICAgICBidWYuc3RhcnQgPQogICAgICAgYnVmLnB0ciAgID0gY2hhcnN0cmluZ19iYXNlOwotICAgICAgYnVmLmVuZCAgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47CisgICAgICBidWYuZW5kICAgPSBGVF9PRkZTRVQoIGNoYXJzdHJpbmdfYmFzZSwgY2hhcnN0cmluZ19sZW4gKTsKIAogICAgICAgRlRfWkVSTyggJnRyYW5zZm9ybSApOwogCkBAIC02OTcsNyArNjk3LDcgQEAKICAgICBGVF9BU1NFUlQoIGNoYXJzdHJpbmcgKyBsZW4gPj0gY2hhcnN0cmluZyApOwogCiAgICAgYnVmLT5zdGFydCA9IGNoYXJzdHJpbmc7Ci0gICAgYnVmLT5lbmQgICA9IGNoYXJzdHJpbmcgKyBsZW47CisgICAgYnVmLT5lbmQgICA9IEZUX09GRlNFVCggY2hhcnN0cmluZywgbGVuICk7CiAgICAgYnVmLT5wdHIgICA9IGJ1Zi0+c3RhcnQ7CiAKICAgICByZXR1cm4gRlRfRXJyX09rOwpAQCAtNzY3LDEzICs3NjcsMTQgQEAKICAgY2YyX2ZyZWVUMVNlYWNDb21wb25lbnQoIFBTX0RlY29kZXIqICBkZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgIGJ1ZiApCiAgIHsKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCisKICAgICBUMV9GYWNlICBmYWNlOwogICAgIEZUX0RhdGEgIGRhdGE7CiAKIAogICAgIEZUX0FTU0VSVCggZGVjb2RlciApOwogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAogICAgIGZhY2UgPSAoVDFfRmFjZSlkZWNvZGVyLT5idWlsZGVyLmZhY2U7CiAKICAgICBkYXRhLnBvaW50ZXIgPSBidWYtPnN0YXJ0OwpAQCAtNzgzLDcgKzc4NCwxMyBAQAogICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+ZnJlZV9nbHlwaF9kYXRhKAogICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKICAgICAgICAgJmRhdGEgKTsKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCisKKyNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCisKKyAgICBGVF9VTlVTRUQoIGRlY29kZXIgKTsKKyAgICBGVF9VTlVTRUQoIGJ1ZiApOworCisjZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KICAgfQogCiAKQEAgLTgxMyw3ICs4MjAsNyBAQAogICAgICAgLyogVGhlIENJRCBkcml2ZXIgc3RvcmVzIHN1YnJvdXRpbmVzIHdpdGggc2VlZCBieXRlcy4gIFRoaXMgICAgICovCiAgICAgICAvKiBjYXNlIGlzIHRha2VuIGNhcmUgb2Ygd2hlbiBkZWNvZGVyLT5zdWJyc19sZW4gPT0gMC4gICAgICAgICAgKi8KICAgICAgIGlmICggZGVjb2Rlci0+bG9jYWxzX2xlbiApCi0gICAgICAgIGJ1Zi0+ZW5kID0gYnVmLT5zdGFydCArIGRlY29kZXItPmxvY2Fsc19sZW5baWR4XTsKKyAgICAgICAgYnVmLT5lbmQgPSBGVF9PRkZTRVQoIGJ1Zi0+c3RhcnQsIGRlY29kZXItPmxvY2Fsc19sZW5baWR4XSApOwogICAgICAgZWxzZQogICAgICAgewogICAgICAgICAvKiBXZSBhcmUgdXNpbmcgc3Vicm91dGluZXMgZnJvbSBhIENJRCBmb250LiAgV2UgbXVzdCBhZGp1c3QgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2Z0LmggYi9zcmMvcHNhdXgvcHNmdC5oCmluZGV4IGFiMTcyMTEuLjNkYTQ1NGUgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2Z0LmgKKysrIGIvc3JjL3BzYXV4L3BzZnQuaApAQCAtMSw1NiArMSw1NiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNmdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2Z0LmgKKyAqCisgKiAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFBTRlRfSF8KICNkZWZpbmUgUFNGVF9IXwogCiAKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9jb21waWxlci1tYWNyb3MuaD4KICNpbmNsdWRlICJwc3R5cGVzLmgiCiAKLQogICAvKiBUT0RPOiBkaXNhYmxlIGFzc2VydHMgZm9yIG5vdyAqLwogI2RlZmluZSBDRjJfTkRFQlVHCiAKIAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdHN5c3RlbS5oPgogCiAjaW5jbHVkZSAicHNnbHVlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9IICAgIC8qIGZvciBQU19EZWNvZGVyICovCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4gICAgLyogZm9yIFBTX0RlY29kZXIgKi8KIAogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2dsdWUuaCBiL3NyYy9wc2F1eC9wc2dsdWUuaAppbmRleCA1NTQ1ZTEyLi4wMjJhYWZiIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNnbHVlLmgKKysrIGIvc3JjL3BzYXV4L3BzZ2x1ZS5oCkBAIC0xLDM5ICsxLDM5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2dsdWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzaGFyZWQgc3R1ZmYgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzZ2x1ZS5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIHNoYXJlZCBzdHVmZiAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFBTR0xVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzaGludHMuYyBiL3NyYy9wc2F1eC9wc2hpbnRzLmMKaW5kZXggMzYxNTE5Ni4uY2U4Y2ZjYSAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzaGludHMuYworKysgYi9zcmMvcHNhdXgvcHNoaW50cy5jCkBAIC0xLDQzICsxLDQzIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hpbnRzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBDRkYgaGludHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzaGludHMuYworICoKKyAqICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBDRkYgaGludHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJwc2Z0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAjaW5jbHVkZSAicHNnbHVlLmgiCiAjaW5jbHVkZSAicHNmb250LmgiCkBAIC00NSwxNCArNDUsMTQgQEAKICNpbmNsdWRlICJwc2ludHJwLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2YyaGludHMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjZjJoaW50cwogCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9IaW50TW92ZVJlY18KQEAgLTIxNyw1MiArMjE3LDQ5IEBACiAgIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCiAgIGNmMl9oaW50X2lzVmFsaWQoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKICAgewotICAgIHJldHVybiAoRlRfQm9vbCkoIGhpbnQtPmZsYWdzICE9IDAgKTsKKyAgICByZXR1cm4gRlRfQk9PTCggaGludC0+ZmxhZ3MgKTsKICAgfQogCiAKICAgc3RhdGljIEZUX0Jvb2wKICAgY2YyX2hpbnRfaXNQYWlyKCBjb25zdCBDRjJfSGludCAgaGludCApCiAgIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICAgICAgICAgICAgICAgICAgICAgICYKLSAgICAgICAgICAgICAgICAgICAgICAgICggQ0YyX1BhaXJCb3R0b20gfCBDRjJfUGFpclRvcCApICkgIT0gMCApOworICAgIHJldHVybiBGVF9CT09MKCBoaW50LT5mbGFncyAmICggQ0YyX1BhaXJCb3R0b20gfCBDRjJfUGFpclRvcCApICk7CiAgIH0KIAogCiAgIHN0YXRpYyBGVF9Cb29sCiAgIGNmMl9oaW50X2lzUGFpclRvcCggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQogICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAmIENGMl9QYWlyVG9wICkgIT0gMCApOworICAgIHJldHVybiBGVF9CT09MKCBoaW50LT5mbGFncyAmIENGMl9QYWlyVG9wICk7CiAgIH0KIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCiAgIGNmMl9oaW50X2lzVG9wKCBjb25zdCBDRjJfSGludCAgaGludCApCiAgIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICAgICAgICAgICAgICAgICAgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICAoIENGMl9QYWlyVG9wIHwgQ0YyX0dob3N0VG9wICkgKSAhPSAwICk7CisgICAgcmV0dXJuIEZUX0JPT0woIGhpbnQtPmZsYWdzICYgKCBDRjJfUGFpclRvcCB8IENGMl9HaG9zdFRvcCApICk7CiAgIH0KIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCiAgIGNmMl9oaW50X2lzQm90dG9tKCBjb25zdCBDRjJfSGludCAgaGludCApCiAgIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAmCi0gICAgICAgICAgICAgICAgICAgICAgICAoIENGMl9QYWlyQm90dG9tIHwgQ0YyX0dob3N0Qm90dG9tICkgKSAhPSAwICk7CisgICAgcmV0dXJuIEZUX0JPT0woIGhpbnQtPmZsYWdzICYgKCBDRjJfUGFpckJvdHRvbSB8IENGMl9HaG9zdEJvdHRvbSApICk7CiAgIH0KIAogCiAgIHN0YXRpYyBGVF9Cb29sCiAgIGNmMl9oaW50X2lzTG9ja2VkKCBjb25zdCBDRjJfSGludCAgaGludCApCiAgIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICYgQ0YyX0xvY2tlZCApICE9IDAgKTsKKyAgICByZXR1cm4gRlRfQk9PTCggaGludC0+ZmxhZ3MgJiBDRjJfTG9ja2VkICk7CiAgIH0KIAogCiAgIHN0YXRpYyBGVF9Cb29sCiAgIGNmMl9oaW50X2lzU3ludGhldGljKCBjb25zdCBDRjJfSGludCAgaGludCApCiAgIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICYgQ0YyX1N5bnRoZXRpYyApICE9IDAgKTsKKyAgICByZXR1cm4gRlRfQk9PTCggaGludC0+ZmxhZ3MgJiBDRjJfU3ludGhldGljICk7CiAgIH0KIAogCkBAIC0zMTMsNyArMzEwLDcgQEAKICAgICAgIENGMl9IaW50ICBoaW50ID0gJmhpbnRtYXAtPmVkZ2VbaV07CiAKIAotICAgICAgRlRfVFJBQ0U2KCggIiAgJTNkICAgICU3LjJmICAlNy4yZiAgJTVkICAlcyVzJXMlc1xuIiwKKyAgICAgIEZUX1RSQUNFNigoICIgICUzbGQgICAgJTcuMmYgICU3LjJmICAlNWQgICVzJXMlcyVzXG4iLAogICAgICAgICAgICAgICAgICAgaGludC0+aW5kZXgsCiAgICAgICAgICAgICAgICAgICBoaW50LT5jc0Nvb3JkIC8gNjU1MzYuMCwKICAgICAgICAgICAgICAgICAgIGhpbnQtPmRzQ29vcmQgLyAoIGhpbnQtPnNjYWxlICogMS4wICksCkBAIC0zMzQsNyArMzMxLDcgQEAKICAgY2YyX2hpbnRtYXBfbWFwKCBDRjJfSGludE1hcCAgaGludG1hcCwKICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgY3NDb29yZCApCiAgIHsKLSAgICBpZiAoIGhpbnRtYXAtPmNvdW50ID09IDAgfHwgISBoaW50bWFwLT5oaW50ZWQgKQorICAgIGlmICggaGludG1hcC0+Y291bnQgPT0gMCB8fCAhaGludG1hcC0+aGludGVkICkKICAgICB7CiAgICAgICAvKiB0aGVyZSBhcmUgbm8gaGludHM7IHVzZSB1bmlmb3JtIHNjYWxlIGFuZCB6ZXJvIG9mZnNldCAqLwogICAgICAgcmV0dXJuIEZUX011bEZpeCggY3NDb29yZCwgaGludG1hcC0+c2NhbGUgKTsKQEAgLTQ5Nyw3ICs0OTQsNyBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIG1vdmUgICAgID0gbW92ZURvd247CiAgICAgICAgICAgICAvKiB0cnVlIGlmIG5vbi1vcHRpbXVtIG1vdmUgKi8KLSAgICAgICAgICAgIHNhdmVFZGdlID0gKEZUX0Jvb2wpKCBtb3ZlVXAgPCAtbW92ZURvd24gKTsKKyAgICAgICAgICAgIHNhdmVFZGdlID0gRlRfQk9PTCggbW92ZVVwIDwgLW1vdmVEb3duICk7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CkBAIC0xMDI1LDEwICsxMDIyLDEwIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgRlRfVFJBQ0U2KCggaW5pdGlhbE1hcCA/ICJmbGFnczogW3BdYWlyIFtnXWhvc3QgW3Rdb3AgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2Jdb3R0b20gW0xdb2NrZWQgW1NdeW50aGV0aWNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluaXRpYWwgaGludG1hcFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiSGludHM6XG4iICkpOworICAgIEZUX1RSQUNFNigoICIlc1xuIiwgaW5pdGlhbE1hcCA/ICJmbGFnczogW3BdYWlyIFtnXWhvc3QgW3Rdb3AiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBbYl1vdHRvbSBbTF1vY2tlZCBbU115bnRoZXRpY1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0aWFsIGhpbnRtYXAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkhpbnRzOiIgKSk7CiAgICAgY2YyX2hpbnRtYXBfZHVtcCggaGludG1hcCApOwogCiAgICAgLyoKQEAgLTEyMTUsNyArMTIxMiw3IEBACiAgICAgICogKGB1JykuCiAgICAgICoKICAgICAgKiBTZWUgbm90YXRpb24gaW4KLSAgICAgKiBodHRwOi8vc29mdHN1cmZlci5jb20vQXJjaGl2ZS9hbGdvcml0aG1fMDEwNC9hbGdvcml0aG1fMDEwNEIuaHRtLgorICAgICAqIGh0dHA6Ly9nZW9tYWxnb3JpdGhtcy5jb20vYTA1LV9pbnRlcnNlY3QtMS5odG1sLgogICAgICAqIENhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbiAxNi4xNiwgYnV0IG11c3QgaGFuZGxlIHRoZSBzcXVhcmluZyBvZgogICAgICAqIGxpbmUgbGVuZ3RocyBpbiBjaGFyYWN0ZXIgc3BhY2UuICBXZSBzY2FsZSBhbGwgdmVjdG9ycyBieSAxLzMyIHRvCiAgICAgICogYXZvaWQgb3ZlcmZsb3cuICBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gNDA5NSB0byBiZSBzcXVhcmVkLiAgVGhlCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNoaW50cy5oIGIvc3JjL3BzYXV4L3BzaGludHMuaAppbmRleCA5MmUzN2U5Li4zMWE4MjMwIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNoaW50cy5oCisrKyBiL3NyYy9wc2F1eC9wc2hpbnRzLmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGludHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGhhbmRsaW5nIENGRiBoaW50cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNoaW50cy5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIGhhbmRsaW5nIENGRiBoaW50cyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0hJTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc2ludHJwLmMgYi9zcmMvcHNhdXgvcHNpbnRycC5jCmluZGV4IGRhNWE4ZGEuLjUxOWM2OTQgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc2ludHJwLmMKKysrIGIvc3JjL3BzYXV4L3BzaW50cnAuYwpAQCAtMSw0NCArMSw0NCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNpbnRycC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgQ0ZGIEludGVycHJldGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2ludHJwLmMKKyAqCisgKiAgIEFkb2JlJ3MgQ0ZGIEludGVycHJldGVyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAicHNmdC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DRkZfVEFCTEVfTE9BRF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2ZmdGwuaD4KIAogI2luY2x1ZGUgInBzZ2x1ZS5oIgogI2luY2x1ZGUgInBzZm9udC5oIgpAQCAtNTIsMTQgKzUyLDE0IEBACiAjaW5jbHVkZSAidDFkZWNvZGUuaCIgLyogZm9yIHQxIHNlYWMgICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZjJpbnRlcnAKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBjZjJpbnRlcnAKIAogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCkBAIC0yODcsNyArMjg3LDcgQEAKICAgewogICAgIENGMl9VSW50ICBpOwogICAgIENGMl9VSW50ICBjb3VudCAgICAgICA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgIEZUX0Jvb2wgICBoYXNXaWR0aEFyZyA9IChGVF9Cb29sKSggY291bnQgJiAxICk7CisgICAgRlRfQm9vbCAgIGhhc1dpZHRoQXJnID0gRlRfQk9PTCggY291bnQgJiAxICk7CiAKICAgICAvKiB2YXJpYWJsZSBhY2N1bXVsYXRlcyBkZWx0YSB2YWx1ZXMgZnJvbSBvcGVyYW5kIHN0YWNrICovCiAgICAgQ0YyX0ZpeGVkICBwb3NpdGlvbiA9IGhpbnRPZmZzZXQ7CkBAIC0zNjQsNyArMzY0LDcgQEAKIAogICAgIGlmICggZG9Db25kaXRpb25hbExhc3RSZWFkICkKICAgICB7Ci0gICAgICBGVF9Cb29sICAgIGxhc3RJc1ggPSAoRlRfQm9vbCkoCisgICAgICBGVF9Cb29sICAgIGxhc3RJc1ggPSBGVF9CT09MKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfZml4ZWRBYnMoIFNVQl9JTlQzMiggdmFsc1sxMF0sICpjdXJYICkgKSA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9maXhlZEFicyggU1VCX0lOVDMyKCB2YWxzWzExXSwgKmN1clkgKSApICk7CiAgICAgICBDRjJfRml4ZWQgIGxhc3RWYWwgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaWR4ICk7CkBAIC02MTIsMTQgKzYxMiwxNCBAQAogICAgIGNmMl9hcnJzdGFja19zZXRDb3VudCggJnN1YnJTdGFjaywgQ0YyX01BWF9TVUJSICsgMSApOwogCiAgICAgY2hhcnN0cmluZyAgPSAoQ0YyX0J1ZmZlciljZjJfYXJyc3RhY2tfZ2V0QnVmZmVyKCAmc3ViclN0YWNrICk7Ci0gICAgKmNoYXJzdHJpbmcgPSAqYnVmOyAgICAvKiBzdHJ1Y3R1cmUgY29weSAqLwotCi0gICAgY2hhcnN0cmluZ0luZGV4ID0gMDsgICAgICAgLyogZW50cnkgaXMgdmFsaWQgbm93ICovCiAKICAgICAvKiBjYXRjaCBlcnJvcnMgc28gZmFyICovCiAgICAgaWYgKCAqZXJyb3IgKQogICAgICAgZ290byBleGl0OwogCisgICAgKmNoYXJzdHJpbmcgICAgID0gKmJ1ZjsgICAgLyogc3RydWN0dXJlIGNvcHkgICAgICovCisgICAgY2hhcnN0cmluZ0luZGV4ID0gMDsgICAgICAgLyogZW50cnkgaXMgdmFsaWQgbm93ICovCisKICAgICAvKiBtYWluIGludGVycHJldGVyIGxvb3AgKi8KICAgICB3aGlsZSAoIDEgKQogICAgIHsKQEAgLTY2Myw2ICs2NjMsNyBAQAogICAgICAgICAgIC8qIFNraXAgb3V0bGluZSBjb21tYW5kcyBmaXJzdCB0aW1lIHJvdW5kLiAgICAgICAqLwogICAgICAgICAgIC8qIGBlbmRjaGFyJyB3aWxsIHRyaWdnZXIgaW5pdGlhbCBoaW50bWFwIGJ1aWxkICAqLwogICAgICAgICAgIC8qIGFuZCByZXdpbmQgdGhlIGNoYXJzdHJpbmcuICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIEZUX1RSQUNFNCgoICIgPG91dGxpbmUgY29tbWFuZCBza2lwcGVkPlxuIiApKTsKICAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtNzc1LDcgKzc3Niw4IEBACiAKICAgICAgIGNhc2UgY2YyX2NtZEhTVEVNSE06CiAgICAgICBjYXNlIGNmMl9jbWRIU1RFTToKLSAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRIU1RFTUhNID8gIiBoc3RlbWhtXG4iIDogIiBoc3RlbVxuIiApKTsKKyAgICAgICAgRlRfVFJBQ0U0KCggIiVzXG4iLCBvcDEgPT0gY2YyX2NtZEhTVEVNSE0gPyAiIGhzdGVtaG0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBoc3RlbSIgKSk7CiAKICAgICAgICAgaWYgKCAhZm9udC0+aXNUMSApCiAgICAgICAgIHsKQEAgLTgwNSw3ICs4MDcsOCBAQAogCiAgICAgICBjYXNlIGNmMl9jbWRWU1RFTUhNOgogICAgICAgY2FzZSBjZjJfY21kVlNURU06Ci0gICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kVlNURU1ITSA/ICIgdnN0ZW1obVxuIiA6ICIgdnN0ZW1cbiIgKSk7CisgICAgICAgIEZUX1RSQUNFNCgoICIlc1xuIiwgb3AxID09IGNmMl9jbWRWU1RFTUhNID8gIiB2c3RlbWhtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgdnN0ZW0iICkpOwogCiAgICAgICAgIGlmICggIWZvbnQtPmlzVDEgKQogICAgICAgICB7CkBAIC04ODgsNyArODkxLDcgQEAKICAgICAgICAgICBGVF9Cb29sICBpc1ggPSBGVF9CT09MKCBvcDEgPT0gY2YyX2NtZEhMSU5FVE8gKTsKIAogCi0gICAgICAgICAgRlRfVFJBQ0U0KCggaXNYID8gIiBobGluZXRvXG4iIDogIiB2bGluZXRvXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIlc1xuIiwgaXNYID8gIiBobGluZXRvIiA6ICIgdmxpbmV0byIgKSk7CiAKICAgICAgICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KysgKQogICAgICAgICAgIHsKQEAgLTkxNiw4ICs5MTksOCBAQAogICAgICAgICAgIENGMl9VSW50ICBpZHggICA9IDA7CiAKIAotICAgICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kUkNVUlZFTElORSA/ICIgcmN1cnZlbGluZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgcnJjdXJ2ZXRvXG4iICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIlc1xuIiwgb3AxID09IGNmMl9jbWRSQ1VSVkVMSU5FID8gIiByY3VydmVsaW5lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBycmN1cnZldG8iICkpOwogCiAgICAgICAgICAgd2hpbGUgKCBpZHggKyA2IDw9IGNvdW50ICkKICAgICAgICAgICB7CkBAIC05NTcsMTAgKzk2MCwxMCBAQAogICAgICAgICAgIEZUX1RSQUNFNCgoICIgdW5rbm93biBvcCAoJWQpXG4iLCBvcDEgKSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2xvc2VwYXRoIiApKTsKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNsb3NlcGF0aFxuIiApKTsKIAogICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIHBhdGgsIGBjbG9zZXBhdGgnIGlzIGEgbm8tb3AgKi8KLSAgICAgICAgICBwc19idWlsZGVyX2Nsb3NlX2NvbnRvdXIoICZkZWNvZGVyLT5idWlsZGVyICk7CisgICAgICAgICAgY2YyX2dseXBocGF0aF9jbG9zZU9wZW5QYXRoKCAmZ2x5cGhQYXRoICk7CiAKICAgICAgICAgICBoYXZlV2lkdGggPSBUUlVFOwogICAgICAgICB9CkBAIC05NzIsOCArOTc1LDggQEAKICAgICAgICAgICBDRjJfSW50ICBzdWJyTnVtOwogCiAKLSAgICAgICAgICBGVF9UUkFDRTQoKCBvcDEgPT0gY2YyX2NtZENBTExHU1VCUiA/ICIgY2FsbGdzdWJyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBjYWxsc3ViciIgKSk7CisgICAgICAgICAgRlRfVFJBQ0U0KCggIiVzIiwgb3AxID09IGNmMl9jbWRDQUxMR1NVQlIgPyAiIGNhbGxnc3ViciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgY2FsbHN1YnIiICkpOwogCiAgICAgICAgICAgaWYgKCAoICFmb250LT5pc1QxICYmIGNoYXJzdHJpbmdJbmRleCA+IENGMl9NQVhfU1VCUiApICAgICAgIHx8CiAgICAgICAgICAgICAgICAoICBmb250LT5pc1QxICYmIGNoYXJzdHJpbmdJbmRleCA+IFQxX01BWF9TVUJSU19DQUxMUyApICkKQEAgLTEyMTIsOCArMTIxNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgaXNWID0gRlRfQk9PTCggb3AyID09IGNmMl9lc2NWU1RFTTMgKTsKIAogCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggaXNWID8gIiB2c3RlbTNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIGhzdGVtM1xuIiApKTsKKyAgICAgICAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiJXNcbiIsIGlzViA/ICIgdnN0ZW0zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBoc3RlbTMiICkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgRlRfQVNTRVJUKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA9PSA2ICk7CiAKQEAgLTE0MzAsNiArMTQzMywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yMjsgLyogcGFzcyBGcmVlVHlwZSBlcnJvciB0aHJvdWdoICovCiAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgbGVmdCBiZWFyaW5nIGFuZCB3aWR0aCBvZiB0aGUgU0VBQyAgICovCisgICAgICAgICAgICAgICAgICAgIC8qIGdseXBoIGFzIHRoZXkgd2lsbCBiZSBlcmFzZWQgYnkgdGhlIG5leHQgbG9hZCAqLworCisgICAgICAgICAgICAgICAgICAgIGxlZnRfYmVhcmluZyA9ICpkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZzsKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSAgICAgID0gKmRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZTsKKwogICAgICAgICAgICAgICAgICAgICBjZjJfaW50ZXJwVDJDaGFyU3RyaW5nKCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MsCkBAIC0xNDQwLDExICsxNDUwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teVdpZHRoICk7CiAgICAgICAgICAgICAgICAgICAgIGNmMl9mcmVlVDFTZWFjQ29tcG9uZW50KCBkZWNvZGVyLCAmY29tcG9uZW50ICk7CiAKLSAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgbGVmdCBiZWFyaW5nIGFuZCB3aWR0aCBvZiB0aGUgYmFzZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBjaGFyYWN0ZXIgYXMgdGhleSB3aWxsIGJlIGVyYXNlZCBieSB0aGUgbmV4dCBsb2FkICovCisgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoZSBTRUFDIGdseXBoIGRvZXNuJ3QgaGF2ZSBhIChIKVNCVyBvZiBpdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogb3duIHVzZSB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgZ2x5cGguICAgICAgICAqLwogCi0gICAgICAgICAgICAgICAgICAgIGxlZnRfYmVhcmluZyA9ICpkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZzsKLSAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSAgICAgID0gKmRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhaGF2ZVdpZHRoICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgIGxlZnRfYmVhcmluZyA9ICpkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZzsKKyAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlICAgICAgPSAqZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmctPnggPSAwOwogICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZy0+eSA9IDA7CkBAIC0xNDcwLDggKzE0ODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlXaWR0aCApOwogICAgICAgICAgICAgICAgICAgICBjZjJfZnJlZVQxU2VhY0NvbXBvbmVudCggZGVjb2RlciwgJmNvbXBvbmVudCApOwogCi0gICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGJhc2UgY2hhcmFjdGVyICovCisgICAgICAgICAgICAgICAgICAgIC8qIHJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGFuZCBhZHZhbmNlIHdpZHRoICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogb2YgdGhlIFNFQUMgZ2x5cGggb3IgYmFzZSBjaGFyYWN0ZXIgKHNhdmVkIGFib3ZlKSAqLwogCiAgICAgICAgICAgICAgICAgICAgICpkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZyA9IGxlZnRfYmVhcmluZzsKICAgICAgICAgICAgICAgICAgICAgKmRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZSAgICAgID0gYWR2YW5jZTsKQEAgLTE2NDQsMTYgKzE2NTcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgc3Vicl9ubyA9IGNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKICAgICAgICAgICAgICAgICAgICAgYXJnX2NudCA9IGNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKIAotICAgICAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjayAqLwotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZm9yIGhhbmRsZWQgb3RoZXJzdWJycywgd2hlcmUgd2Uga25vdyB0aGUgbnVtYmVyIG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGFyZ3VtZW50cywgd2UgaW5jcmVhc2UgdGhlIHN0YWNrIGJ5IHRoZSB2YWx1ZSBvZiAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0ICAqLwotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgc3RhY2sgcG9pbnRlciBhcyBuZWNlc3NhcnkgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjaworICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgKiBmb3IgaGFuZGxlZCBvdGhlcnN1YnJzLCB3aGVyZSB3ZSBrbm93IHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICogYXJndW1lbnRzLCB3ZSBpbmNyZWFzZSB0aGUgc3RhY2sgYnkgdGhlIHZhbHVlIG9mCisgICAgICAgICAgICAgICAgICAgICAqIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250CisgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAqIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0CisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBzdGFjayBwb2ludGVyIGFzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAgICAgICAgICAgICAgICAgICBjb3VudCA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwogICAgICAgICAgICAgICAgICAgICBGVF9BU1NFUlQoIChDRjJfVUludClhcmdfY250IDw9IGNvdW50ICk7CkBAIC0yNDE2LDcgKzI0MzAsNyBAQAogICAgICAgICAgIFBTX0J1aWxkZXIqICBidWlsZGVyOwogCiAKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzYnciICkpOworICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHNid1xuIiApKTsKIAogICAgICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKIApAQCAtMjU2Miw3ICsyNTc2LDcgQEAKICAgICAgIGNhc2UgY2YyX2NtZEhJTlRNQVNLOgogICAgICAgICAvKiB0aGUgZmluYWwgXG4gaW4gdGhlIHRyYWNpbmcgbWVzc2FnZSBnZXRzIGFkZGVkIGluICAgICAgKi8KICAgICAgICAgLyogYGNmMl9oaW50bWFza19yZWFkJyAod2hpY2ggYWxzbyB0cmFjZXMgdGhlIG1hc2sgYnl0ZXMpICovCi0gICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kQ05UUk1BU0sgPyAiIGNudHJtYXNrIiA6ICIgaGludG1hc2siICkpOworICAgICAgICBGVF9UUkFDRTQoKCAiJXMiLCBvcDEgPT0gY2YyX2NtZENOVFJNQVNLID8gIiBjbnRybWFzayIgOiAiIGhpbnRtYXNrIiApKTsKIAogICAgICAgICAvKiBuZXZlciBhZGQgaGludHMgYWZ0ZXIgdGhlIG1hc2sgaXMgY29tcHV0ZWQgKi8KICAgICAgICAgaWYgKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDEgICAgJiYKQEAgLTI4MjgsNyArMjg0Miw3IEBACiAgICAgICAgICAgY291bnQgPSBjb3VudDEgJiB+MlU7CiAgICAgICAgICAgaWR4ICArPSBjb3VudDEgLSBjb3VudDsKIAotICAgICAgICAgIEZUX1RSQUNFNCgoIGFsdGVybmF0ZSA/ICIgaHZjdXJ2ZXRvXG4iIDogIiB2aGN1cnZldG9cbiIgKSk7CisgICAgICAgICAgRlRfVFJBQ0U0KCggIiVzXG4iLCBhbHRlcm5hdGUgPyAiIGh2Y3VydmV0byIgOiAiIHZoY3VydmV0byIgKSk7CiAKICAgICAgICAgICB3aGlsZSAoIGlkeCA8IGNvdW50ICkKICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNpbnRycC5oIGIvc3JjL3BzYXV4L3BzaW50cnAuaAppbmRleCA0NzkwYWFhLi42NjljMDljIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNpbnRycC5oCisrKyBiL3NyYy9wc2F1eC9wc2ludHJwLmgKQEAgLTEsMzkgKzEsMzkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaW50cnAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIENGRiBJbnRlcnByZXRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNpbnRycC5oCisgKgorICogICBBZG9iZSdzIENGRiBJbnRlcnByZXRlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0lOVFJQX0hfCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNvYmpzLmMgYi9zcmMvcHNhdXgvcHNvYmpzLmMKaW5kZXggZjU0YmM3ZS4uZGVmYzRkNCAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3Bzb2Jqcy5jCisrKyBiL3NyYy9wc2F1eC9wc29ianMuYwpAQCAtMSwyNiArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgZm9yIFBvc3RTY3JpcHQgZm9udHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNvYmpzLmMKKyAqCisgKiAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgZm9yIFBvc3RTY3JpcHQgZm9udHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KIAogI2luY2x1ZGUgInBzb2Jqcy5oIgogI2luY2x1ZGUgInBzY29udi5oIgpAQCAtMjksMTQgKzI4LDE0IEBACiAjaW5jbHVkZSAicHNhdXhtb2QuaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wc29ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICBwc29ianMKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDcsMjYgKzQ2LDI5IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc190YWJsZV9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIFBTX1RhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZSAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCAgOjogVGhlIHRhYmxlIHNpemUgPSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBUaGUgbWVtb3J5IG9iamVjdCB0byB1c2UgZm9yIGFsbCBzdWJzZXF1ZW50ICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgcmVhbGxvY2F0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgcHNfdGFibGVfbmV3CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplcyBhIFBTX1RhYmxlLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgdGFibGUgOjoKKyAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgdGFibGUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBjb3VudCA6OgorICAgKiAgICAgVGhlIHRhYmxlIHNpemUgPSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAqCisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBUaGUgbWVtb3J5IG9iamVjdCB0byB1c2UgZm9yIGFsbCBzdWJzZXF1ZW50CisgICAqICAgICByZWFsbG9jYXRpb25zLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgcHNfdGFibGVfbmV3KCBQU19UYWJsZSAgIHRhYmxlLAogICAgICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCkBAIC0xNDQsMzMgKzE0NiwzNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc190YWJsZV9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGRzIGFuIG9iamVjdCB0byBhIFBTX1RhYmxlLCBwb3NzaWJseSBncm93aW5nIGl0cyBtZW1vcnkgYmxvY2suICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZSAgOjogVGhlIHRhcmdldCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICAgOjogVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9iamVjdCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGNvcHkgaW4gbWVtb3J5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIGEgICovCi0gIC8qICAgIHJlYWxsb2NhdGlvbiBmYWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBwc190YWJsZV9hZGQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEFkZHMgYW4gb2JqZWN0IHRvIGEgUFNfVGFibGUsIHBvc3NpYmx5IGdyb3dpbmcgaXRzIG1lbW9yeSBibG9jay4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIHRhYmxlIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IHRhYmxlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgaWR4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIG9iamVjdCBpbiB0aGUgdGFibGUuCisgICAqCisgICAqICAgb2JqZWN0IDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGNvcHkgaW4gbWVtb3J5LgorICAgKgorICAgKiAgIGxlbmd0aCA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgc291cmNlIG9iamVjdC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgQW4gZXJyb3IgaXMgcmV0dXJuZWQgaWYgYQorICAgKiAgIHJlYWxsb2NhdGlvbiBmYWlscy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgaWR4LAotICAgICAgICAgICAgICAgIHZvaWQqICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfVUludCAgIGxlbmd0aCApCisgIHBzX3RhYmxlX2FkZCggUFNfVGFibGUgICAgIHRhYmxlLAorICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBpZHgsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIG9iamVjdCwKKyAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbGVuZ3RoICkKICAgewogICAgIGlmICggaWR4IDwgMCB8fCBpZHggPj0gdGFibGUtPm1heF9lbGVtcyApCiAgICAgewpAQCAtMjA3LDcgKzIxMyw3IEBACiAgICAgfQogCiAgICAgLyogYWRkIHRoZSBvYmplY3QgdG8gdGhlIGJhc2UgYmxvY2sgYW5kIGFkanVzdCBvZmZzZXQgKi8KLSAgICB0YWJsZS0+ZWxlbWVudHNbaWR4XSA9IHRhYmxlLT5ibG9jayArIHRhYmxlLT5jdXJzb3I7CisgICAgdGFibGUtPmVsZW1lbnRzW2lkeF0gPSBGVF9PRkZTRVQoIHRhYmxlLT5ibG9jaywgdGFibGUtPmN1cnNvciApOwogICAgIHRhYmxlLT5sZW5ndGhzIFtpZHhdID0gbGVuZ3RoOwogICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2sgKyB0YWJsZS0+Y3Vyc29yLCBvYmplY3QsIGxlbmd0aCApOwogCkBAIC0yMTYsMjIgKzIyMiwyMyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc190YWJsZV9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBQU19UYWJsZVJlYyAoaS5lLiwgcmVhbGxvY2F0ZSBpdCB0byBpdHMgY3VycmVudCAgICAgICAgKi8KLSAgLyogICAgY3Vyc29yKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGUgOjogVGhlIHRhcmdldCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCByZWxlYXNlIHRoZSBoZWFwJ3MgbWVtb3J5IGJsb2NrLiAgSXQgaXMgdXAgICovCi0gIC8qICAgIHRvIHRoZSBjYWxsZXIgdG8gY2xlYW4gaXQsIG9yIHJlZmVyZW5jZSBpdCBpbiBpdHMgb3duIHN0cnVjdHVyZXMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBwc190YWJsZV9kb25lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBGaW5hbGl6ZXMgYSBQU19UYWJsZVJlYyAoaS5lLiwgcmVhbGxvY2F0ZSBpdCB0byBpdHMgY3VycmVudAorICAgKiAgIGN1cnNvcikuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB0YWJsZSA6OgorICAgKiAgICAgVGhlIHRhcmdldCB0YWJsZS4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCByZWxlYXNlIHRoZSBoZWFwJ3MgbWVtb3J5IGJsb2NrLiAgSXQgaXMgdXAKKyAgICogICB0byB0aGUgY2FsbGVyIHRvIGNsZWFuIGl0LCBvciByZWZlcmVuY2UgaXQgaW4gaXRzIG93biBzdHJ1Y3R1cmVzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgcHNfdGFibGVfZG9uZSggUFNfVGFibGUgIHRhYmxlICkKICAgewpAQCAtNDk4LDEyICs1MDUsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBleHBvcnRlZCBwYXJzaW5nIHJvdXRpbmVzIGhhbmRsZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHN0b3AgYXQgKi8KLSAgLyogdGhlIGZpcnN0IGNoYXJhY3RlciB3aGljaCBpc24ndCBwYXJ0IG9mIHRoZSBqdXN0IGhhbmRsZWQgdG9rZW4uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBbGwgZXhwb3J0ZWQgcGFyc2luZyByb3V0aW5lcyBoYW5kbGUgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzdG9wIGF0CisgICAqIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2hpY2ggaXNuJ3QgcGFydCBvZiB0aGUganVzdCBoYW5kbGVkIHRva2VuLgorICAgKgorICAgKi8KIAogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCkBAIC0xMTAwLDE4ICsxMTA3LDIyIEBACiAgICAgICB7CiAgICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfQk9PTDoKICAgICAgICAgdmFsID0gcHNfdG9ib29sKCAmY3VyLCBsaW1pdCApOworICAgICAgICBGVF9UUkFDRTQoKCAiICVzIiwgdmFsID8gInRydWUiIDogImZhbHNlIiApKTsKICAgICAgICAgZ290byBTdG9yZV9JbnRlZ2VyOwogCiAgICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfRklYRUQ6CiAgICAgICAgIHZhbCA9IFBTX0NvbnZfVG9GaXhlZCggJmN1ciwgbGltaXQsIDAgKTsKKyAgICAgICAgRlRfVFJBQ0U0KCggIiAlZiIsIChkb3VibGUpdmFsIC8gNjU1MzYgKSk7CiAgICAgICAgIGdvdG8gU3RvcmVfSW50ZWdlcjsKIAogICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX0ZJWEVEXzEwMDA6CiAgICAgICAgIHZhbCA9IFBTX0NvbnZfVG9GaXhlZCggJmN1ciwgbGltaXQsIDMgKTsKKyAgICAgICAgRlRfVFJBQ0U0KCggIiAlZiIsIChkb3VibGUpdmFsIC8gNjU1MzYgLyAxMDAwICkpOwogICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7CiAKICAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9JTlRFR0VSOgogICAgICAgICB2YWwgPSBQU19Db252X1RvSW50KCAmY3VyLCBsaW1pdCApOworICAgICAgICBGVF9UUkFDRTQoKCAiICVsZCIsIHZhbCApKTsKICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAKICAgICAgIFN0b3JlX0ludGVnZXI6CkBAIC0xMTg4LDYgKzExOTksMTMgQEAKICAgICAgICAgICBGVF9NRU1fQ09QWSggc3RyaW5nLCBjdXIsIGxlbiApOwogICAgICAgICAgIHN0cmluZ1tsZW5dID0gMDsKIAorI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgICAgaWYgKCB0b2tlbi50eXBlID09IFQxX1RPS0VOX1RZUEVfU1RSSU5HICkKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgKCVzKSIsIHN0cmluZyApKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIC8lcyIsIHN0cmluZyApKTsKKyNlbmRpZgorCiAgICAgICAgICAgKihGVF9TdHJpbmcqKilxID0gc3RyaW5nOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTIxMyw2ICsxMjMxLDEyIEBACiAgICAgICAgICAgYmJveC0+eU1pbiA9IEZUX1JvdW5kRml4KCB0ZW1wWzFdICk7CiAgICAgICAgICAgYmJveC0+eE1heCA9IEZUX1JvdW5kRml4KCB0ZW1wWzJdICk7CiAgICAgICAgICAgYmJveC0+eU1heCA9IEZUX1JvdW5kRml4KCB0ZW1wWzNdICk7CisKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiIFslbGQgJWxkICVsZCAlbGRdIiwKKyAgICAgICAgICAgICAgICAgICAgICBiYm94LT54TWluIC8gNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgYmJveC0+eU1pbiAvIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgIGJib3gtPnhNYXggLyA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICBiYm94LT55TWF4IC8gNjU1MzYgKSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTEyNTEsNiArMTI3NSw3IEBACiAgICAgICAgICAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsKICAgICAgICAgICB9CiAKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiIFsiICkpOwogICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbWF4X29iamVjdHM7IGkrKyApCiAgICAgICAgICAgewogICAgICAgICAgICAgRlRfQkJveCogIGJib3ggPSAoRlRfQkJveCopb2JqZWN0c1tpXTsKQEAgLTEyNjAsNyArMTI4NSwxNCBAQAogICAgICAgICAgICAgYmJveC0+eU1pbiA9IEZUX1JvdW5kRml4KCB0ZW1wW2kgKyAgICAgbWF4X29iamVjdHNdICk7CiAgICAgICAgICAgICBiYm94LT54TWF4ID0gRlRfUm91bmRGaXgoIHRlbXBbaSArIDIgKiBtYXhfb2JqZWN0c10gKTsKICAgICAgICAgICAgIGJib3gtPnlNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFtpICsgMyAqIG1heF9vYmplY3RzXSApOworCisgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIFslbGQgJWxkICVsZCAlbGRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJib3gtPnhNaW4gLyA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJib3gtPnlNaW4gLyA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJib3gtPnhNYXggLyA2NTUzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJib3gtPnlNYXggLyA2NTUzNiApKTsKICAgICAgICAgICB9CisgICAgICAgICAgRlRfVFJBQ0U0KCggIl0iICkpOwogCiAgICAgICAgICAgRlRfRlJFRSggdGVtcCApOwogICAgICAgICB9CkBAIC0xMzMzLDYgKzEzNjUsOCBAQAogICAgICAgKihGVF9CeXRlKikoIChGVF9CeXRlKilvYmplY3RzWzBdICsgZmllbGQtPmNvdW50X29mZnNldCApID0KICAgICAgICAgKEZUX0J5dGUpbnVtX2VsZW1lbnRzOwogCisgICAgRlRfVFJBQ0U0KCggIiBbIiApKTsKKwogICAgIC8qIHdlIG5vdyBsb2FkIGVhY2ggZWxlbWVudCwgYWRqdXN0aW5nIHRoZSBmaWVsZC5vZmZzZXQgb24gZWFjaCBvbmUgKi8KICAgICB0b2tlbiA9IGVsZW1lbnRzOwogICAgIGZvciAoIDsgbnVtX2VsZW1lbnRzID4gMDsgbnVtX2VsZW1lbnRzLS0sIHRva2VuKysgKQpAQCAtMTM1MSw2ICsxMzg1LDggQEAKICAgICAgIGZpZWxkcmVjLm9mZnNldCArPSBmaWVsZHJlYy5zaXplOwogICAgIH0KIAorICAgIEZUX1RSQUNFNCgoICJdIiApKTsKKwogI2lmIDAgIC8qIG9ic29sZXRlIC0tIGtlZXAgZm9yIHJlZmVyZW5jZSAqLwogICAgIGlmICggcGZsYWdzICkKICAgICAgICpwZmxhZ3MgfD0gMUwgPDwgZmllbGQtPmZsYWdfYml0OwpAQCAtMTQxMCw2ICsxNDQ2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2J5dGVzICk7CiAKKyAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKKwogICAgIGlmICggZGVsaW1pdGVycyApCiAgICAgewogICAgICAgaWYgKCBjdXIgPCBwYXJzZXItPmxpbWl0ICYmICpjdXIgIT0gJz4nICkKQEAgLTE0MTksMTEgKzE0NTcsOSBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKLSAgICAgIGN1cisrOworICAgICAgcGFyc2VyLT5jdXJzb3IrKzsKICAgICB9CiAKLSAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKLQogICBFeGl0OgogICAgIHJldHVybiBlcnJvcjsKICAgfQpAQCAtMTUwOSwyNiArMTU0NSwzMSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdDFfYnVpbGRlcl9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgIDo6IFRoZSBjdXJyZW50IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGluZyA6OiBXaGV0aGVyIGhpbnRpbmcgc2hvdWxkIGJlIGFwcGxpZWQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHQxX2J1aWxkZXJfaW5pdAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgYnVpbGRlciA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgY3VycmVudCBzaXplIG9iamVjdC4KKyAgICoKKyAgICogICBnbHlwaCA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZ2x5cGggb2JqZWN0LgorICAgKgorICAgKiAgIGhpbnRpbmcgOjoKKyAgICogICAgIFdoZXRoZXIgaGludGluZyBzaG91bGQgYmUgYXBwbGllZC4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHQxX2J1aWxkZXJfaW5pdCggVDFfQnVpbGRlciAgICBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKQEAgLTE1NzIsMTkgKzE2MTMsMjAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdDFfYnVpbGRlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gIEl0cyBjb250ZW50cyBjYW4gc3RpbGwgYmUgdXNlZCAgICovCi0gIC8qICAgIGFmdGVyIHRoZSBjYWxsLCBidXQgdGhlIGZ1bmN0aW9uIHNhdmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbiAgICAgICAqLwotICAvKiAgICB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdDFfYnVpbGRlcl9kb25lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgSXRzIGNvbnRlbnRzIGNhbiBzdGlsbCBiZSB1c2VkCisgICAqICAgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uCisgICAqICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBidWlsZGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gZmluYWxpemUuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICB0MV9idWlsZGVyX2RvbmUoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQogICB7CkBAIC0xNzY5LDI2ICsxODExLDMxIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2J1aWxkZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgIDo6IFRoZSBjdXJyZW50IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludGluZyA6OiBXaGV0aGVyIGhpbnRpbmcgaXMgYWN0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGNmZl9idWlsZGVyX2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGJ1aWxkZXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBpbml0aWFsaXplLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc2l6ZSA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuCisgICAqCisgICAqICAgZ2x5cGggOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGdseXBoIG9iamVjdC4KKyAgICoKKyAgICogICBoaW50aW5nIDo6CisgICAqICAgICBXaGV0aGVyIGhpbnRpbmcgaXMgYWN0aXZlLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgY2ZmX2J1aWxkZXJfaW5pdCggQ0ZGX0J1aWxkZXIqICAgYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKQEAgLTE4NDEsMTkgKzE4ODgsMjAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2J1aWxkZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gIEl0cyBjb250ZW50cyBjYW4gc3RpbGwgYmUgdXNlZCAgICovCi0gIC8qICAgIGFmdGVyIHRoZSBjYWxsLCBidXQgdGhlIGZ1bmN0aW9uIHNhdmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbiAgICAgICAqLwotICAvKiAgICB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgY2ZmX2J1aWxkZXJfZG9uZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRmluYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gIEl0cyBjb250ZW50cyBjYW4gc3RpbGwgYmUgdXNlZAorICAgKiAgIGFmdGVyIHRoZSBjYWxsLCBidXQgdGhlIGZ1bmN0aW9uIHNhdmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbgorICAgKiAgIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBzbG90LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgYnVpbGRlciA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGZpbmFsaXplLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgY2ZmX2J1aWxkZXJfZG9uZSggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKICAgewpAQCAtMTk5Myw2ICsyMDQxLDE0IEBACiAgICAgZmlyc3QgPSBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDEKICAgICAgICAgICAgID8gMCA6IG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAyXSArIDE7CiAKKyAgICAvKiBpbiBtYWxmb3JtZWQgZm9udHMgaXQgY2FuIGhhcHBlbiB0aGF0IGEgY29udG91ciB3YXMgc3RhcnRlZCAqLworICAgIC8qIGJ1dCBubyBwb2ludHMgd2VyZSBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYgKCBvdXRsaW5lLT5uX2NvbnRvdXJzICYmIGZpcnN0ID09IG91dGxpbmUtPm5fcG9pbnRzICkKKyAgICB7CisgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzLS07CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLyogV2UgbXVzdCBub3QgaW5jbHVkZSB0aGUgbGFzdCBwb2ludCBpbiB0aGUgcGF0aCBpZiBpdCAqLwogICAgIC8qIGlzIGxvY2F0ZWQgb24gdGhlIGZpcnN0IHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID4gMSApCkBAIC0yMDMzLDI2ICsyMDg5LDMxIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc19idWlsZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBpbml0aWFsaXplLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICA6OiBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50aW5nIDo6IFdoZXRoZXIgaGludGluZyBzaG91bGQgYmUgYXBwbGllZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgcHNfYnVpbGRlcl9pbml0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBidWlsZGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gaW5pdGlhbGl6ZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IHNpemUgb2JqZWN0LgorICAgKgorICAgKiAgIGdseXBoIDo6CisgICAqICAgICBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuCisgICAqCisgICAqICAgaGludGluZyA6OgorICAgKiAgICAgV2hldGhlciBoaW50aW5nIHNob3VsZCBiZSBhcHBsaWVkLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgcHNfYnVpbGRlcl9pbml0KCBQU19CdWlsZGVyKiAgcHNfYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgYnVpbGRlciwKQEAgLTIxMTYsMTkgKzIxNzcsMjAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNfYnVpbGRlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gIEl0cyBjb250ZW50cyBjYW4gc3RpbGwgYmUgdXNlZCAgICovCi0gIC8qICAgIGFmdGVyIHRoZSBjYWxsLCBidXQgdGhlIGZ1bmN0aW9uIHNhdmVzIGltcG9ydGFudCBpbmZvcm1hdGlvbiAgICAgICAqLwotICAvKiAgICB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBmaW5hbGl6ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgcHNfYnVpbGRlcl9kb25lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgSXRzIGNvbnRlbnRzIGNhbiBzdGlsbCBiZSB1c2VkCisgICAqICAgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uCisgICAqICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBidWlsZGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gZmluYWxpemUuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBwc19idWlsZGVyX2RvbmUoIFBTX0J1aWxkZXIqICBidWlsZGVyICkKICAgewpAQCAtMjMzNiwyMyArMjM5OCwyNiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzX2RlY29kZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZXMgYSB3cmFwcGVyIGRlY29kZXIgZm9yIHVzZSBpbiB0aGUgY29tYmluZWQgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgLyBDRkYgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc19kZWNvZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZGVjb2RlciB0byBpbml0aWFsaXplLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyICAgIDo6IEEgcG9pbnRlciB0byB0aGUgb3JpZ2luYWwgZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlzX3QxICAgICAgOjogRmxhZyBpbmRpY2F0aW5nIFR5cGUgMSBvciBDRkYgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBwc19kZWNvZGVyX2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZXMgYSB3cmFwcGVyIGRlY29kZXIgZm9yIHVzZSBpbiB0aGUgY29tYmluZWQKKyAgICogICBUeXBlIDEgLyBDRkYgaW50ZXJwcmV0ZXIuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBwc19kZWNvZGVyIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGRlY29kZXIgdG8gaW5pdGlhbGl6ZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRlY29kZXIgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgb3JpZ2luYWwgZGVjb2Rlci4KKyAgICoKKyAgICogICBpc190MSA6OgorICAgKiAgICAgRmxhZyBpbmRpY2F0aW5nIFR5cGUgMSBvciBDRkYKKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHBzX2RlY29kZXJfaW5pdCggUFNfRGVjb2RlciogIHBzX2RlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIGRlY29kZXIsCkBAIC0yNTExLDcgKzI1NzYsNyBAQAogICAgICAgICAgICAgICBGVF9VU2hvcnQgIHNlZWQgKQogICB7CiAgICAgUFNfQ29udl9FZXhlY0RlY29kZSggJmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT0ZGU0VUKCBidWZmZXIsIGxlbmd0aCApLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWQgKTsKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc29ianMuaCBiL3NyYy9wc2F1eC9wc29ianMuaAppbmRleCA4ZTBmZTVmLi5mZGFkNjcyIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNvYmpzLmgKKysrIGIvc3JjL3BzYXV4L3Bzb2Jqcy5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc29ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgUG9zdFNjcmlwdCBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc29ianMuaAorICoKKyAqICAgQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgUG9zdFNjcmlwdCBmb250cyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFBTT0JKU19IXwogI2RlZmluZSBQU09CSlNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9PQkpFQ1RTX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NmZm90eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtNTMsMTAgKzUyLDEwIEBACiAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKIAogICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgaWR4LAotICAgICAgICAgICAgICAgIHZvaWQqICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfVUludCAgIGxlbmd0aCApOworICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICAgICB0YWJsZSwKKyAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgaWR4LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBvYmplY3QsCisgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGxlbmd0aCApOwogCiAgIEZUX0xPQ0FMKCB2b2lkICkKICAgcHNfdGFibGVfZG9uZSggUFNfVGFibGUgIHRhYmxlICk7CmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNyZWFkLmMgYi9zcmMvcHNhdXgvcHNyZWFkLmMKaW5kZXggNzE5ODYzYy4uN2Y2NTdmMiAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzcmVhZC5jCisrKyBiL3NyYy9wc2F1eC9wc3JlYWQuYwpAQCAtMSw0MyArMSw0MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNyZWFkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3Igc3RyZWFtIGhhbmRsaW5nIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc3JlYWQuYworICoKKyAqICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJwc2Z0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgogCiAjaW5jbHVkZSAicHNnbHVlLmgiCiAKQEAgLTEwNSw3ICsxMDUsNyBAQAogICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQogICBjZjJfYnVmX2lzRW5kKCBDRjJfQnVmZmVyICBidWYgKQogICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggYnVmLT5wdHIgPj0gYnVmLT5lbmQgKTsKKyAgICByZXR1cm4gRlRfQk9PTCggYnVmLT5wdHIgPj0gYnVmLT5lbmQgKTsKICAgfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc3JlYWQuaCBiL3NyYy9wc2F1eC9wc3JlYWQuaAppbmRleCA0NjRiMjliLi45ZTU1ZmUwIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNyZWFkLmgKKysrIGIvc3JjL3BzYXV4L3BzcmVhZC5oCkBAIC0xLDM5ICsxLDM5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc3JlYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzcmVhZC5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIHN0cmVhbSBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU1JFQURfSF8KZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC9wc3N0YWNrLmMgYi9zcmMvcHNhdXgvcHNzdGFjay5jCmluZGV4IDY5ZDA2MzMuLjdhZTUyNTYgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC9wc3N0YWNrLmMKKysrIGIvc3JjL3BzYXV4L3Bzc3RhY2suYwpAQCAtMSw0MyArMSw0MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNzdGFjay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZW11bGF0aW5nIGEgQ0ZGIHN0YWNrIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc3N0YWNrLmMKKyAqCisgKiAgIEFkb2JlJ3MgY29kZSBmb3IgZW11bGF0aW5nIGEgQ0ZGIHN0YWNrIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IKKyAqIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkCisgKiBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZQorICogdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLAorICogTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMKKyAqIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkKKyAqIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvcgorICogIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgKiByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50CisgKiBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZAorICogb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlCisgKiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseQorICogaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpcgorICogY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzCisgKiBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorICogKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKKyAqIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMKKyAqIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgKiBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YKKyAqIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKyAqCisgKiBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91CisgKiBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorICogRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLAorICogYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSAicHNmdC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgInBzZ2x1ZS5oIgogI2luY2x1ZGUgInBzZm9udC5oIgpAQCAtNTksMTIgKzU5LDEyIEBACiAgICAgQ0YyX1N0YWNrICBzdGFjayA9IE5VTEw7CiAKIAotICAgIGlmICggIUZUX05FVyggc3RhY2sgKSApCi0gICAgewotICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlOyBGVF9ORVcgemVyb2VzIGl0ICovCi0gICAgICBzdGFjay0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgc3RhY2stPmVycm9yICA9IGU7Ci0gICAgfQorICAgIGlmICggRlRfTkVXKCBzdGFjayApICkKKyAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlOyBGVF9ORVcgemVyb2VzIGl0ICovCisgICAgc3RhY2stPm1lbW9yeSA9IG1lbW9yeTsKKyAgICBzdGFjay0+ZXJyb3IgID0gZTsKIAogICAgIC8qIGFsbG9jYXRlIHRoZSBzdGFjayBidWZmZXIgKi8KICAgICBpZiAoIEZUX05FV19BUlJBWSggc3RhY2stPmJ1ZmZlciwgc3RhY2tTaXplICkgKQpAQCAtMjU4LDYgKzI1OCw5IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLyogYmVmb3JlIEM5OSBpdCBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgICAgKi8KKyAgICAvKiB0aGUgcmVzdWx0IG9mIGAlJyBpcyBuZWdhdGl2ZSBpZiB0aGUgZmlyc3Qgb3BlcmFuZCAqLworICAgIC8qIGlzIG5lZ2F0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgaWYgKCBzaGlmdCA8IDAgKQogICAgICAgc2hpZnQgPSAtKCAoIC1zaGlmdCApICUgY291bnQgKTsKICAgICBlbHNlCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcHNzdGFjay5oIGIvc3JjL3BzYXV4L3Bzc3RhY2suaAppbmRleCAzOGY3YjQxLi5iOWVmOWVkIDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvcHNzdGFjay5oCisrKyBiL3NyYy9wc2F1eC9wc3N0YWNrLmgKQEAgLTEsNDQgKzEsNDUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzc3RhY2suaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGVtdWxhdGluZyBhIENGRiBzdGFjayAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNzdGFjay5oCisgKgorICogICBBZG9iZSdzIGNvZGUgZm9yIGVtdWxhdGluZyBhIENGRiBzdGFjayAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yCisgKiBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZAorICogaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUKKyAqIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwKKyAqIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzCisgKiB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5CisgKiB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IKKyAqICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICogcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudAorICogbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQKKyAqIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZQorICogcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkKKyAqIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIKKyAqIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcworICogc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAqIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CisgKiB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzCisgKiBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICogZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mCisgKiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisgKgorICogQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdQorICogaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKyAqIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwKKyAqIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU1NUQUNLX0hfCiAjZGVmaW5lIFBTU1RBQ0tfSF8KIAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oPgogCiBGVF9CRUdJTl9IRUFERVIKIApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3BzdHlwZXMuaCBiL3NyYy9wc2F1eC9wc3R5cGVzLmgKaW5kZXggZGZiYWEzZC4uNDM1ZWY3ZSAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3BzdHlwZXMuaAorKysgYi9zcmMvcHNhdXgvcHN0eXBlcy5oCkBAIC0xLDQ2ICsxLDQ1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc3R5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBkZWZpbmluZyBkYXRhIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTEtMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzdHlwZXMuaAorICoKKyAqICAgQWRvYmUncyBjb2RlIGZvciBkZWZpbmluZyBkYXRhIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAyMDExLTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvcgorICogb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQKKyAqIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlCisgKiB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsCisgKiBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cworICogdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieQorICogdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yCisgKiAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAqIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQKKyAqIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kCisgKiBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UKKyAqIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CisgKiBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyCisgKiBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMKKyAqIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisgKiAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdAorICogdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcworICogZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAqIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZgorICogdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorICoKKyAqIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UKKyAqIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisgKiBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sCisgKiBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNUWVBFU19IXwogI2RlZmluZSBQU1RZUEVTX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvcnVsZXMubWsgYi9zcmMvcHNhdXgvcnVsZXMubWsKaW5kZXggYTg3YmZlOS4uZjQ5YWVjYiAxMDA2NDQKLS0tIGEvc3JjL3BzYXV4L3J1bGVzLm1rCisrKyBiL3NyYy9wc2F1eC9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3QxY21hcC5jIGIvc3JjL3BzYXV4L3QxY21hcC5jCmluZGV4IDExMmE3ODkuLmUyMWU5M2MgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC90MWNtYXAuYworKysgYi9zcmMvcHNhdXgvdDFjbWFwLmMKQEAgLTEsMjQgKzEsMjQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxY21hcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgY2hhcmFjdGVyIG1hcCBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxY21hcC5jCisgKgorICogICBUeXBlIDEgY2hhcmFjdGVyIG1hcCBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpbmNsdWRlICJ0MWNtYXAuaCIKIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAogI2luY2x1ZGUgInBzYXV4ZXJyLmgiCiAKQEAgLTMwNSw2ICszMDUsOSBAQAogICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwogCiAKKyAgICBpZiAoICFwc25hbWVzLT51bmljb2Rlc19pbml0ICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7CisKICAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfaW5pdCggbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZmFjZS0+dHlwZTEubnVtX2dseXBocywKZGlmZiAtLWdpdCBhL3NyYy9wc2F1eC90MWNtYXAuaCBiL3NyYy9wc2F1eC90MWNtYXAuaAppbmRleCA0MzA4ZTMxLi4wMzE3OTY1IDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvdDFjbWFwLmgKKysrIGIvc3JjL3BzYXV4L3QxY21hcC5oCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIGNoYXJhY3RlciBtYXAgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWNtYXAuaAorICoKKyAqICAgVHlwZSAxIGNoYXJhY3RlciBtYXAgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFQxQ01BUF9IXwogI2RlZmluZSBUMUNNQVBfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CiAKIEZUX0JFR0lOX0hFQURFUgogCmRpZmYgLS1naXQgYS9zcmMvcHNhdXgvdDFkZWNvZGUuYyBiL3NyYy9wc2F1eC90MWRlY29kZS5jCmluZGV4IDZhZDE0NTYuLjJlZDI3Y2EgMTAwNjQ0Ci0tLSBhL3NyYy9wc2F1eC90MWRlY29kZS5jCisrKyBiL3NyYy9wc2F1eC90MWRlY29kZS5jCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWRlY29kZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBUeXBlIDEgZGVjb2Rpbmcgcm91dGluZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWRlY29kZS5jCisgKgorICogICBQb3N0U2NyaXB0IFR5cGUgMSBkZWNvZGluZyByb3V0aW5lcyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRvdXRsbi5oPgogCiAjaW5jbHVkZSAidDFkZWNvZGUuaCIKICNpbmNsdWRlICJwc29ianMuaCIKQEAgLTMxLDE0ICszMCwxNCBAQAogLyogZW5zdXJlIHByb3BlciBzaWduIGV4dGVuc2lvbiAqLwogI2RlZmluZSBGaXgySW50KCBmICkgICggKEZUX0ludCkoRlRfU2hvcnQpKCAoZikgPj4gMTYgKSApCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxZGVjb2RlCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdDFkZWNvZGUKIAogCiAgIHR5cGVkZWYgZW51bSAgVDFfT3BlcmF0b3JfCkBAIC0xMDksMjQgKzEwOCwyNiBAQAogICB9OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlX3BzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9va3MgdXAgYSBnaXZlbiBnbHlwaCBieSBpdHMgU3RhbmRhcmRFbmNvZGluZyBjaGFyY29kZS4gIFVzZWQgdG8gICovCi0gIC8qICAgIGltcGxlbWVudCB0aGUgU0VBQyBUeXBlIDEgb3BlcmF0b3IgaW4gdGhlIEFkb2JlIGVuZ2luZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogVGhlIGNoYXJhY3RlciBjb2RlIHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBnbHlwaCBpbmRleCBpbiB0aGUgZm9udCBmYWNlLiAgUmV0dXJucyAtMSBpZiB0aGUgY29ycmVzcG9uZGluZyAgICovCi0gIC8qICAgIGdseXBoIHdhc24ndCBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGVfcHMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvb2tzIHVwIGEgZ2l2ZW4gZ2x5cGggYnkgaXRzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICBVc2VkIHRvCisgICAqICAgaW1wbGVtZW50IHRoZSBTRUFDIFR5cGUgMSBvcGVyYXRvciBpbiB0aGUgQWRvYmUgZW5naW5lCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBjaGFyY29kZSA6OgorICAgKiAgICAgVGhlIGNoYXJhY3RlciBjb2RlIHRvIGxvb2sgZm9yLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEEgZ2x5cGggaW5kZXggaW4gdGhlIGZvbnQgZmFjZS4gIFJldHVybnMgLTEgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICogICBnbHlwaCB3YXNuJ3QgZm91bmQuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCiAgIHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZV9wcyggUFNfRGVjb2RlciogIGRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIGNoYXJjb2RlICkKQEAgLTE1OSwyNCArMTYwLDI3IEBACiAKIAogI2lmZGVmIFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyB1cCBhIGdpdmVuIGdseXBoIGJ5IGl0cyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLiAgVXNlZCB0byAgKi8KLSAgLyogICAgaW1wbGVtZW50IHRoZSBTRUFDIFR5cGUgMSBvcGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGdseXBoIGluZGV4IGluIHRoZSBmb250IGZhY2UuICBSZXR1cm5zIC0xIGlmIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgZ2x5cGggd2Fzbid0IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdDFfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb29rcyB1cCBhIGdpdmVuIGdseXBoIGJ5IGl0cyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLiAgVXNlZCB0bworICAgKiAgIGltcGxlbWVudCB0aGUgU0VBQyBUeXBlIDEgb3BlcmF0b3IuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBjaGFyY29kZSA6OgorICAgKiAgICAgVGhlIGNoYXJhY3RlciBjb2RlIHRvIGxvb2sgZm9yLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEEgZ2x5cGggaW5kZXggaW4gdGhlIGZvbnQgZmFjZS4gIFJldHVybnMgLTEgaWYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICogICBnbHlwaCB3YXNuJ3QgZm91bmQuCisgICAqLwogICBzdGF0aWMgRlRfSW50CiAgIHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggVDFfRGVjb2RlciAgZGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBjaGFyY29kZSApCkBAIC0yMTcsMzAgKzIyMSwzNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MW9wZXJhdG9yX3NlYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbXBsZW1lbnRzIHRoZSBgc2VhYycgVHlwZSAxIG9wZXJhdG9yIGZvciBhIFR5cGUgMSBkZWNvZGVyLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyIDo6IFRoZSBjdXJyZW50IENJRCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzYiAgICAgOjogVGhlIGFjY2VudCdzIHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR4ICAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHkgICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJjaGFyICAgOjogVGhlIGJhc2UgY2hhcmFjdGVyJ3MgU3RhbmRhcmRFbmNvZGluZyBjaGFyY29kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNoYXIgICA6OiBUaGUgYWNjZW50IGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHQxb3BlcmF0b3Jfc2VhYworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgSW1wbGVtZW50cyB0aGUgYHNlYWMnIFR5cGUgMSBvcGVyYXRvciBmb3IgYSBUeXBlIDEgZGVjb2Rlci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRlY29kZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IENJRCBkZWNvZGVyLgorICAgKgorICAgKiAgIGFzYiA6OgorICAgKiAgICAgVGhlIGFjY2VudCdzIHNpZGUgYmVhcmluZy4KKyAgICoKKyAgICogICBhZHggOjoKKyAgICogICAgIFRoZSBob3Jpem9udGFsIG9mZnNldCBvZiB0aGUgYWNjZW50LgorICAgKgorICAgKiAgIGFkeSA6OgorICAgKiAgICAgVGhlIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgYWNjZW50LgorICAgKgorICAgKiAgIGJjaGFyIDo6CisgICAqICAgICBUaGUgYmFzZSBjaGFyYWN0ZXIncyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLgorICAgKgorICAgKiAgIGFjaGFyIDo6CisgICAqICAgICBUaGUgYWNjZW50IGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICB0MW9wZXJhdG9yX3NlYWMoIFQxX0RlY29kZXIgIGRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgYXNiLApAQCAtMzU2LDYgKzM2NiwxMiBAQAogCiAgICAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggZGVjb2Rlci0+YnVpbGRlci5sb2FkZXIgKTsgIC8qIHByZXBhcmUgbG9hZGVyICovCiAKKyAgICAvKiBzYXZlIHRoZSBsZWZ0IGJlYXJpbmcgYW5kIHdpZHRoIG9mIHRoZSBTRUFDICAgKi8KKyAgICAvKiBnbHlwaCBhcyB0aGV5IHdpbGwgYmUgZXJhc2VkIGJ5IHRoZSBuZXh0IGxvYWQgKi8KKworICAgIGxlZnRfYmVhcmluZyA9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nOworICAgIGFkdmFuY2UgICAgICA9IGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZTsKKwogICAgIC8qIHRoZSBzZWFjIG9wZXJhdG9yIG11c3Qgbm90IGJlIG5lc3RlZCAqLwogICAgIGRlY29kZXItPnNlYWMgPSBUUlVFOwogICAgIGVycm9yID0gdDFfZGVjb2Rlcl9wYXJzZV9nbHlwaCggZGVjb2RlciwgKEZUX1VJbnQpYmNoYXJfaW5kZXggKTsKQEAgLTM2MywxMSArMzc5LDE0IEBACiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAvKiBzYXZlIHRoZSBsZWZ0IGJlYXJpbmcgYW5kIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLwotICAgIC8qIGFzIHRoZXkgd2lsbCBiZSBlcmFzZWQgYnkgdGhlIG5leHQgbG9hZC4gICAgICAgICAgICAgICovCisgICAgLyogSWYgdGhlIFNFQUMgZ2x5cGggZG9lc24ndCBoYXZlIGEgKEgpU0JXIG9mIGl0cyAqLworICAgIC8qIG93biB1c2UgdGhlIHZhbHVlcyBmcm9tIHRoZSBiYXNlIGdseXBoLiAgICAgICAgKi8KIAotICAgIGxlZnRfYmVhcmluZyA9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nOwotICAgIGFkdmFuY2UgICAgICA9IGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZTsKKyAgICBpZiAoIGRlY29kZXItPmJ1aWxkZXIucGFyc2Vfc3RhdGUgIT0gVDFfUGFyc2VfSGF2ZV9XaWR0aCApCisgICAgeworICAgICAgbGVmdF9iZWFyaW5nID0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmc7CisgICAgICBhZHZhbmNlICAgICAgPSBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2U7CisgICAgfQogCiAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IDA7CiAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IDA7CkBAIC0zODUsOCArNDA0LDggQEAKICAgICBpZiAoIGVycm9yICkKICAgICAgIGdvdG8gRXhpdDsKIAotICAgIC8qIHJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAgICovCi0gICAgLyogYWR2YW5jZSB3aWR0aCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgKi8KKyAgICAvKiByZXN0b3JlIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyBhbmQgYWR2YW5jZSB3aWR0aCAgICovCisgICAgLyogb2YgdGhlIFNFQUMgZ2x5cGggb3IgYmFzZSBjaGFyYWN0ZXIgKHNhdmVkIGFib3ZlKSAqLwogCiAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7CiAgICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwpAQCAtMzk5LDI0ICs0MTgsMjcgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAxIGNoYXJzdHJpbmdzIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciAgICAgICAgIDo6IFRoZSBjdXJyZW50IFR5cGUgMSBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2Jhc2UgOjogVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJzdHJpbmdfbGVuICA6OiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBQYXJzZXMgYSBnaXZlbiBUeXBlIDEgY2hhcnN0cmluZ3MgcHJvZ3JhbS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRlY29kZXIgOjoKKyAgICogICAgIFRoZSBjdXJyZW50IFR5cGUgMSBkZWNvZGVyLgorICAgKgorICAgKiAgIGNoYXJzdHJpbmdfYmFzZSA6OgorICAgKiAgICAgVGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uCisgICAqCisgICAqICAgY2hhcnN0cmluZ19sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggVDFfRGVjb2RlciAgZGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgY2hhcnN0cmluZ19iYXNlLApAQCAtNDY2LDkgKzQ4OCw2IEBACiAgICAgaWYgKCBkZWNvZGVyLT5idWlsZGNoYXIgJiYgZGVjb2Rlci0+bGVuX2J1aWxkY2hhciA+IDAgKQogICAgICAgRlRfQVJSQVlfWkVSTyggZGVjb2Rlci0+YnVpbGRjaGFyLCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyICk7CiAKLSAgICBGVF9UUkFDRTQoKCAiXG4iCi0gICAgICAgICAgICAgICAgIlN0YXJ0IGNoYXJzdHJpbmdcbiIgKSk7Ci0KICAgICB6b25lLT5iYXNlICAgICAgICAgICA9IGNoYXJzdHJpbmdfYmFzZTsKICAgICBsaW1pdCA9IHpvbmUtPmxpbWl0ICA9IGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuOwogICAgIGlwICAgID0gem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKQEAgLTUwMywxMSArNTIyLDExIEBACiAgICAgICB9CiAjZW5kaWYKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICoKKyAgICAgICAqIERlY29kZSBvcGVyYXRvciBvciBvcGVyYW5kCisgICAgICAgKgorICAgICAgICovCiAKICAgICAgIC8qIGZpcnN0IG9mIGFsbCwgZGVjb21wcmVzcyBvcGVyYXRvciBvciB2YWx1ZSAqLwogICAgICAgc3dpdGNoICggKmlwKysgKQpAQCAtNjM5LDEwICs2NTgsOCBAQAogICAgICAgICBpZiAoIHZhbHVlID4gMzIwMDAgfHwgdmFsdWUgPCAtMzIwMDAgKQogICAgICAgICB7CiAgICAgICAgICAgaWYgKCBsYXJnZV9pbnQgKQotICAgICAgICAgIHsKICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgogICAgICAgICAgICAgICAgICAgICAgICAiIG5vIGBkaXYnIGFmdGVyIGxhcmdlIGludGVnZXJcbiIgKSk7Ci0gICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGxhcmdlX2ludCA9IFRSVUU7CiAgICAgICAgIH0KQEAgLTcxMCwxMSArNzI3LDExIEBACiAgICAgICAgIGxhcmdlX2ludCA9IEZBTFNFOwogICAgICAgfQogCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICBQdXNoIHZhbHVlIG9uIHN0YWNrLCBvciBwcm9jZXNzIG9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgKgorICAgICAgICogUHVzaCB2YWx1ZSBvbiBzdGFjaywgb3IgcHJvY2VzcyBvcGVyYXRvcgorICAgICAgICoKKyAgICAgICAqLwogICAgICAgaWYgKCBvcCA9PSBvcF9ub25lICkKICAgICAgIHsKICAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayA+PSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgKQpAQCAtNzUyLDE2ICs3NjksMTcgQEAKICAgICAgICAgc3Vicl9ubyA9IEZpeDJJbnQoIHRvcFsxXSApOwogICAgICAgICBhcmdfY250ID0gRml4MkludCggdG9wWzBdICk7CiAKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjayAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBmb3IgaGFuZGxlZCBvdGhlcnN1YnJzLCB3aGVyZSB3ZSBrbm93IHRoZSBudW1iZXIgb2YgICAgICovCi0gICAgICAgIC8qIGFyZ3VtZW50cywgd2UgaW5jcmVhc2UgdGhlIHN0YWNrIGJ5IHRoZSB2YWx1ZSBvZiAgICAgICAgKi8KLSAgICAgICAgLyoga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0IHRoZSAgKi8KLSAgICAgICAgLyogc3RhY2sgcG9pbnRlciBhcyBuZWNlc3NhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqCisgICAgICAgICAqIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjaworICAgICAgICAgKgorICAgICAgICAgKiBmb3IgaGFuZGxlZCBvdGhlcnN1YnJzLCB3aGVyZSB3ZSBrbm93IHRoZSBudW1iZXIgb2YKKyAgICAgICAgICogYXJndW1lbnRzLCB3ZSBpbmNyZWFzZSB0aGUgc3RhY2sgYnkgdGhlIHZhbHVlIG9mCisgICAgICAgICAqIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250CisgICAgICAgICAqCisgICAgICAgICAqIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0IHRoZQorICAgICAgICAgKiBzdGFjayBwb2ludGVyIGFzIG5lY2Vzc2FyeQorICAgICAgICAgKi8KIAogICAgICAgICBpZiAoIGFyZ19jbnQgPiB0b3AgLSBkZWNvZGVyLT5zdGFjayApCiAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7CkBAIC0xMjE5LDExICsxMjM3LDE0IEBACiAKICAgICAgICAgICBGVF9VTlVTRUQoIG9yaWdfeSApOwogCi0gICAgICAgICAgLyogdGhlIGBtZXRyaWNzX29ubHknIGluZGljYXRlcyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICovCi0gICAgICAgICAgLyogdGhlIGdseXBoJ3MgbWV0cmljcyAobHNiICsgYWR2YW5jZSB3aWR0aCksIG5vdCBsb2FkIHRoZSAgICovCisgICAgICAgICAgLyogYG1ldHJpY3Nfb25seScgaW5kaWNhdGVzIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgdGhlICovCisgICAgICAgICAgLyogZ2x5cGgncyBtZXRyaWNzIChsc2IgKyBhZHZhbmNlIHdpZHRoKSB3aXRob3V0IGxvYWRpbmcgdGhlICovCiAgICAgICAgICAgLyogcmVzdCBvZiBpdDsgc28gZXhpdCBpbW1lZGlhdGVseSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgaWYgKCBidWlsZGVyLT5tZXRyaWNzX29ubHkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7CiAgICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgICAgICAgIH0KIAogICAgICAgICAgIGJyZWFrOwogCkBAIC0xMjUxLDExICsxMjcyLDE0IEBACiAgICAgICAgICAgeCA9IEFERF9MT05HKCBidWlsZGVyLT5wb3NfeCwgdG9wWzBdICk7CiAgICAgICAgICAgeSA9IEFERF9MT05HKCBidWlsZGVyLT5wb3NfeSwgdG9wWzFdICk7CiAKLSAgICAgICAgICAvKiB0aGUgYG1ldHJpY3Nfb25seScgaW5kaWNhdGVzIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgICAgICAgICAvKiB0aGUgZ2x5cGgncyBtZXRyaWNzIChsc2IgKyBhZHZhbmNlIHdpZHRoKSwgbm90IGxvYWQgdGhlICAgKi8KKyAgICAgICAgICAvKiBgbWV0cmljc19vbmx5JyBpbmRpY2F0ZXMgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSB0aGUgKi8KKyAgICAgICAgICAvKiBnbHlwaCdzIG1ldHJpY3MgKGxzYiArIGFkdmFuY2Ugd2lkdGgpIHdpdGhvdXQgbG9hZGluZyB0aGUgKi8KICAgICAgICAgICAvKiByZXN0IG9mIGl0OyBzbyBleGl0IGltbWVkaWF0ZWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICBpZiAoIGJ1aWxkZXItPm1ldHJpY3Nfb25seSApCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKICAgICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CisgICAgICAgICAgfQogCiAgICAgICAgICAgYnJlYWs7CiAKQEAgLTE2MzgsMjYgKzE2NjIsMzEgQEAKICAgICByZXR1cm4gRlRfVEhST1coIFN0YWNrX1VuZGVyZmxvdyApOwogICB9CiAKLSNlbHNlIC8qIFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2RlY29kZXJfcGFyc2VfbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMSBjaGFyc3RyaW5ncyBwcm9ncmFtIHRvIGV4dHJhY3Qgd2lkdGggICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlY29kZXIgICAgICAgICA6OiBUaGUgY3VycmVudCBUeXBlIDEgZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZWxzZSAvKiAhVDFfQ09ORklHX09QVElPTl9PTERfRU5HSU5FICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHQxX2RlY29kZXJfcGFyc2VfbWV0cmljcworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAxIGNoYXJzdHJpbmdzIHByb2dyYW0gdG8gZXh0cmFjdCB3aWR0aAorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGVjb2RlciA6OgorICAgKiAgICAgVGhlIGN1cnJlbnQgVHlwZSAxIGRlY29kZXIuCisgICAqCisgICAqICAgY2hhcnN0cmluZ19iYXNlIDo6CisgICAqICAgICBUaGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4KKyAgICoKKyAgICogICBjaGFyc3RyaW5nX2xlbiA6OgorICAgKiAgICAgVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3MoIFQxX0RlY29kZXIgIGRlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgY2hhcnN0cmluZ19iYXNlLApAQCAtMTY2Nyw2ICsxNjk2LDcgQEAKICAgICBGVF9CeXRlKiAgICAgICAgIGlwOwogICAgIEZUX0J5dGUqICAgICAgICAgbGltaXQ7CiAgICAgVDFfQnVpbGRlciAgICAgICBidWlsZGVyID0gJmRlY29kZXItPmJ1aWxkZXI7CisgICAgRlRfQm9vbCAgICAgICAgICBsYXJnZV9pbnQ7CiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogICAgIEZUX0Jvb2wgICAgICAgICAgYm9sID0gVFJVRTsKQEAgLTE2ODAsMTMgKzE3MTAsMTIgQEAKIAogICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfU3RhcnQ7CiAKLSAgICBGVF9UUkFDRTQoKCAiXG4iCi0gICAgICAgICAgICAgICAgIlN0YXJ0IGNoYXJzdHJpbmc6IGdldCB3aWR0aFxuIiApKTsKLQogICAgIHpvbmUtPmJhc2UgICAgICAgICAgID0gY2hhcnN0cmluZ19iYXNlOwogICAgIGxpbWl0ID0gem9uZS0+bGltaXQgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47CiAgICAgaXAgICAgPSB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwogCisgICAgbGFyZ2VfaW50ID0gRkFMU0U7CisKICAgICAvKiBub3csIGV4ZWN1dGUgbG9vcCAqLwogICAgIHdoaWxlICggaXAgPCBsaW1pdCApCiAgICAgewpAQCAtMTY5OCwxNiArMTcyNywxNiBAQAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAgICAgICBpZiAoIGJvbCApCiAgICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgKCVkKSIsIGRlY29kZXItPnRvcCAtIGRlY29kZXItPnN0YWNrICkpOworICAgICAgICBGVF9UUkFDRTUoKCAiICglbGQpIiwgZGVjb2Rlci0+dG9wIC0gZGVjb2Rlci0+c3RhY2sgKSk7CiAgICAgICAgIGJvbCA9IEZBTFNFOwogICAgICAgfQogI2VuZGlmCiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogRGVjb2RlIG9wZXJhdG9yIG9yIG9wZXJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqCisgICAgICAgKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZAorICAgICAgICoKKyAgICAgICAqLwogCiAgICAgICAvKiBmaXJzdCBvZiBhbGwsIGRlY29tcHJlc3Mgb3BlcmF0b3Igb3IgdmFsdWUgKi8KICAgICAgIHN3aXRjaCAoICppcCsrICkKQEAgLTE3MjAsOCArMTc0OSw2IEBACiAgICAgICBjYXNlIDc6CiAgICAgICBjYXNlIDg6CiAgICAgICBjYXNlIDk6Ci0gICAgICBjYXNlIDEwOgotICAgICAgY2FzZSAxMToKICAgICAgIGNhc2UgMTQ6CiAgICAgICBjYXNlIDE1OgogICAgICAgY2FzZSAyMToKQEAgLTE3MzAsNiArMTc1NywxMyBAQAogICAgICAgY2FzZSAzMToKICAgICAgICAgZ290byBOb19XaWR0aDsKIAorICAgICAgY2FzZSAxMDoKKyAgICAgICAgb3AgPSBvcF9jYWxsc3VicjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOgorICAgICAgICBvcCA9IG9wX3JldHVybjsKKyAgICAgICAgYnJlYWs7CisKICAgICAgIGNhc2UgMTM6CiAgICAgICAgIG9wID0gb3BfaHNidzsKICAgICAgICAgYnJlYWs7CkBAIC0xNzQ3LDYgKzE3ODEsOSBAQAogICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgb3AgPSBvcF9zYnc7CiAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgb3AgPSBvcF9kaXY7CisgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBnb3RvIE5vX1dpZHRoOwpAQCAtMTc3NiwxMyArMTgxMywxOSBAQAogICAgICAgICAvKiBhbnl3YXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgaWYgKCB2YWx1ZSA+IDMyMDAwIHx8IHZhbHVlIDwgLTMyMDAwICkKICAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfbWV0cmljczoiCi0gICAgICAgICAgICAgICAgICAgICAiIGxhcmdlIGludGVnZXIgZm91bmQgZm9yIHdpZHRoXG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgIGlmICggbGFyZ2VfaW50ICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3M6IgorICAgICAgICAgICAgICAgICAgICAgICAiIG5vIGBkaXYnIGFmdGVyIGxhcmdlIGludGVnZXJcbiIgKSk7CisgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgbGFyZ2VfaW50ID0gVFJVRTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IChGVF9JbnQzMikoIChGVF9VSW50MzIpdmFsdWUgPDwgMTYgKTsKKyAgICAgICAgICBpZiAoICFsYXJnZV9pbnQgKQorICAgICAgICAgICAgdmFsdWUgPSAoRlRfSW50MzIpKCAoRlRfVUludDMyKXZhbHVlIDw8IDE2ICk7CiAgICAgICAgIH0KIAogICAgICAgICBicmVhazsKQEAgLTE4MDcsNyArMTg1MCw4IEBACiAgICAgICAgICAgICAgIHZhbHVlID0gLSggKCAoIGlwWy0yXSAtIDI1MSApICogMjU2ICkgKyBpcFstMV0gKyAxMDggKTsKICAgICAgICAgICB9CiAKLSAgICAgICAgICB2YWx1ZSA9IChGVF9JbnQzMikoIChGVF9VSW50MzIpdmFsdWUgPDwgMTYgKTsKKyAgICAgICAgICBpZiAoICFsYXJnZV9pbnQgKQorICAgICAgICAgICAgdmFsdWUgPSAoRlRfSW50MzIpKCAoRlRfVUludDMyKXZhbHVlIDw8IDE2ICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xODE3LDExICsxODYxLDE4IEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgUHVzaCB2YWx1ZSBvbiBzdGFjaywgb3IgcHJvY2VzcyBvcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICBpZiAoIGxhcmdlX2ludCAmJiAhKCBvcCA9PSBvcF9ub25lIHx8IG9wID09IG9wX2RpdiApICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9tZXRyaWNzOiIKKyAgICAgICAgICAgICAgICAgICAiIG5vIGBkaXYnIGFmdGVyIGxhcmdlIGludGVnZXJcbiIgKSk7CisgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgfQorCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICoKKyAgICAgICAqIFB1c2ggdmFsdWUgb24gc3RhY2ssIG9yIHByb2Nlc3Mgb3BlcmF0b3IKKyAgICAgICAqCisgICAgICAgKi8KICAgICAgIGlmICggb3AgPT0gb3Bfbm9uZSApCiAgICAgICB7CiAgICAgICAgIGlmICggdG9wIC0gZGVjb2Rlci0+c3RhY2sgPj0gVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTICkKQEAgLTE4MzEsNiArMTg4Miw5IEBACiAgICAgICAgIH0KIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgIGlmICggbGFyZ2VfaW50ICkKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdmFsdWUgKSk7CisgICAgICAgIGVsc2UKICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdmFsdWUgLyA2NTUzNiApKTsKICNlbmRpZgogCkBAIC0xODQ5LDExICsxOTAzLDIxIEBACiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQogCi0gICAgICAgIGlmICggdG9wIC0gZGVjb2Rlci0+c3RhY2sgIT0gbnVtX2FyZ3MgKQotICAgICAgICAgIEZUX1RSQUNFMCgoICJ0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3M6IgotICAgICAgICAgICAgICAgICAgICAgICIgdG9vIG11Y2ggb3BlcmFuZHMgb24gdGhlIHN0YWNrIgotICAgICAgICAgICAgICAgICAgICAgICIgKHNlZW4gJWQsIGV4cGVjdGVkICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICB0b3AgLSBkZWNvZGVyLT5zdGFjaywgbnVtX2FyZ3MgKSk7CisgICAgICAgIHN3aXRjaCAoIG9wICkKKyAgICAgICAgeworICAgICAgICBjYXNlIG9wX2NhbGxzdWJyOgorICAgICAgICBjYXNlIG9wX2RpdjoKKyAgICAgICAgY2FzZSBvcF9yZXR1cm46CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrICE9IG51bV9hcmdzICkKKyAgICAgICAgICAgIEZUX1RSQUNFMCgoICJ0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3M6IgorICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbXVjaCBvcGVyYW5kcyBvbiB0aGUgc3RhY2siCisgICAgICAgICAgICAgICAgICAgICAgICAiIChzZWVuICVsZCwgZXhwZWN0ZWQgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9wIC0gZGVjb2Rlci0+c3RhY2ssIG51bV9hcmdzICkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKICNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwogCkBAIC0xODczLDggKzE5MzcsOSBAQAogICAgICAgICAgIGJ1aWxkZXItPmFkdmFuY2UueSA9IDA7CiAKICAgICAgICAgICAvKiB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSB0aGUgZ2x5cGgncyBtZXRyaWNzICovCi0gICAgICAgICAgLyogKGxzYiArIGFkdmFuY2Ugd2lkdGgpLCBub3QgbG9hZCB0aGUgcmVzdCBvZiAqLwotICAgICAgICAgIC8qIGl0OyBzbyBleGl0IGltbWVkaWF0ZWx5ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAobHNiICsgYWR2YW5jZSB3aWR0aCkgd2l0aG91dCBsb2FkaW5nIHRoZSAgICovCisgICAgICAgICAgLyogcmVzdCBvZiBpdDsgc28gZXhpdCBpbW1lZGlhdGVseSAgICAgICAgICAgICAqLworICAgICAgICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7CiAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKIAogICAgICAgICBjYXNlIG9wX3NidzoKQEAgLTE4OTEsMTYgKzE5NTYsMTE2IEBACiAgICAgICAgICAgYnVpbGRlci0+YWR2YW5jZS55ID0gdG9wWzNdOwogCiAgICAgICAgICAgLyogd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgdGhlIGdseXBoJ3MgbWV0cmljcyAqLwotICAgICAgICAgIC8qIChsc2IgKyBhZHZhbmNlIHdpZHRoKSwgbm90IGxvYWQgdGhlIHJlc3Qgb2YgKi8KLSAgICAgICAgICAvKiBpdDsgc28gZXhpdCBpbW1lZGlhdGVseSAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgLyogKGxzYiArIGFkdmFuY2Ugd2lkdGgpLCB3aXRob3V0IGxvYWRpbmcgdGhlICAqLworICAgICAgICAgIC8qIHJlc3Qgb2YgaXQ7IHNvIGV4aXQgaW1tZWRpYXRlbHkgICAgICAgICAgICAgKi8KKyAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwogICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7CiAKKyAgICAgICAgY2FzZSBvcF9kaXY6CisgICAgICAgICAgRlRfVFJBQ0U0KCggIiBkaXYiICkpOworCisgICAgICAgICAgLyogaWYgYGxhcmdlX2ludCcgaXMgc2V0LCB3ZSBkaXZpZGUgdW5zY2FsZWQgbnVtYmVyczsgKi8KKyAgICAgICAgICAvKiBvdGhlcndpc2UsIHdlIGRpdmlkZSBudW1iZXJzIGluIDE2LjE2IGZvcm1hdCAtLSAgICAqLworICAgICAgICAgIC8qIGluIGJvdGggY2FzZXMsIGl0IGlzIHRoZSBzYW1lIG9wZXJhdGlvbiAgICAgICAgICAgICovCisgICAgICAgICAgKnRvcCA9IEZUX0RpdkZpeCggdG9wWzBdLCB0b3BbMV0gKTsKKyAgICAgICAgICB0b3ArKzsKKworICAgICAgICAgIGxhcmdlX2ludCA9IEZBTFNFOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugb3BfY2FsbHN1YnI6CisgICAgICAgICAgeworICAgICAgICAgICAgRlRfSW50ICBpZHg7CisKKworICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBjYWxsc3ViciIgKSk7CisKKyAgICAgICAgICAgIGlkeCA9IEZpeDJJbnQoIHRvcFswXSApOworCisgICAgICAgICAgICBpZiAoIGRlY29kZXItPnN1YnJzX2hhc2ggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBzaXplX3QqICB2YWwgPSBmdF9oYXNoX251bV9sb29rdXAoIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5zdWJyc19oYXNoICk7CisKKworICAgICAgICAgICAgICBpZiAoIHZhbCApCisgICAgICAgICAgICAgICAgaWR4ID0gKnZhbDsKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGlkeCA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IGRlY29kZXItPm51bV9zdWJycyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfbWV0cmljczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHN1YnJzIGluZGV4XG4iICkpOworICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB6b25lIC0gZGVjb2Rlci0+em9uZXMgPj0gVDFfTUFYX1NVQlJTX0NBTExTICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9tZXRyaWNzOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtYW55IG5lc3RlZCBzdWJyc1xuIiApKTsKKyAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IGlwOyAgLyogc2F2ZSBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KKworICAgICAgICAgICAgem9uZSsrOworCisgICAgICAgICAgICAvKiBUaGUgVHlwZSAxIGRyaXZlciBzdG9yZXMgc3Vicm91dGluZXMgd2l0aG91dCB0aGUgc2VlZCBieXRlcy4gKi8KKyAgICAgICAgICAgIC8qIFRoZSBDSUQgZHJpdmVyIHN0b3JlcyBzdWJyb3V0aW5lcyB3aXRoIHNlZWQgYnl0ZXMuICBUaGlzICAgICAqLworICAgICAgICAgICAgLyogY2FzZSBpcyB0YWtlbiBjYXJlIG9mIHdoZW4gZGVjb2Rlci0+c3VicnNfbGVuID09IDAuICAgICAgICAgICovCisgICAgICAgICAgICB6b25lLT5iYXNlID0gZGVjb2Rlci0+c3VicnNbaWR4XTsKKworICAgICAgICAgICAgaWYgKCBkZWNvZGVyLT5zdWJyc19sZW4gKQorICAgICAgICAgICAgICB6b25lLT5saW1pdCA9IHpvbmUtPmJhc2UgKyBkZWNvZGVyLT5zdWJyc19sZW5baWR4XTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgLyogV2UgYXJlIHVzaW5nIHN1YnJvdXRpbmVzIGZyb20gYSBDSUQgZm9udC4gIFdlIG11c3QgYWRqdXN0ICovCisgICAgICAgICAgICAgIC8qIGZvciB0aGUgc2VlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICB6b25lLT5iYXNlICArPSAoIGRlY29kZXItPmxlbklWID49IDAgPyBkZWNvZGVyLT5sZW5JViA6IDAgKTsKKyAgICAgICAgICAgICAgem9uZS0+bGltaXQgID0gZGVjb2Rlci0+c3VicnNbaWR4ICsgMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHpvbmUtPmN1cnNvciA9IHpvbmUtPmJhc2U7CisKKyAgICAgICAgICAgIGlmICggIXpvbmUtPmJhc2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX21ldHJpY3M6IgorICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52b2tpbmcgZW1wdHkgc3VicnNcbiIgKSk7CisgICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKKyAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOworICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgIGNhc2Ugb3BfcmV0dXJuOgorICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuIiApKTsKKworICAgICAgICAgIGlmICggem9uZSA8PSBkZWNvZGVyLT56b25lcyApCisgICAgICAgICAgeworICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9tZXRyaWNzOiIKKyAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIHJldHVyblxuIiApKTsKKyAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOworICAgICAgICAgIH0KKworICAgICAgICAgIHpvbmUtLTsKKyAgICAgICAgICBpcCAgICAgICAgICAgID0gem9uZS0+Y3Vyc29yOworICAgICAgICAgIGxpbWl0ICAgICAgICAgPSB6b25lLT5saW1pdDsKKyAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKKyAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfbWV0cmljczoiCiAgICAgICAgICAgICAgICAgICAgICAiIHVuaGFuZGxlZCBvcGNvZGUgJWRcbiIsIG9wICkpOwogICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwogICAgICAgICB9CiAKKyAgICAgICAgZGVjb2Rlci0+dG9wID0gdG9wOworCiAgICAgICB9IC8qIGdlbmVyYWwgb3BlcmF0b3IgcHJvY2Vzc2luZyAqLwogCiAgICAgfSAvKiB3aGlsZSBpcCA8IGxpbWl0ICovCkBAIC0xOTE3LDcgKzIwODIsOCBAQAogICBTdGFja19VbmRlcmZsb3c6CiAgICAgcmV0dXJuIEZUX1RIUk9XKCBTdGFja19VbmRlcmZsb3cgKTsKICAgfQotI2VuZGlmIC8qIFQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLworCisjZW5kaWYgLyogIVQxX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLwogCiAKICAgLyogaW5pdGlhbGl6ZSBUMSBkZWNvZGVyICovCkBAIC0xOTM0LDcgKzIxMDAsNyBAQAogICB7CiAgICAgRlRfWkVSTyggZGVjb2RlciApOwogCi0gICAgLyogcmV0cmlldmUgUFNOYW1lcyBpbnRlcmZhY2UgZnJvbSBsaXN0IG9mIGN1cnJlbnQgbW9kdWxlcyAqLworICAgIC8qIHJldHJpZXZlIGBwc25hbWVzJyBpbnRlcmZhY2UgZnJvbSBsaXN0IG9mIGN1cnJlbnQgbW9kdWxlcyAqLwogICAgIHsKICAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lczsKIApkaWZmIC0tZ2l0IGEvc3JjL3BzYXV4L3QxZGVjb2RlLmggYi9zcmMvcHNhdXgvdDFkZWNvZGUuaAppbmRleCAxZDk3MThkLi5iNzkzNTA0IDEwMDY0NAotLS0gYS9zcmMvcHNhdXgvdDFkZWNvZGUuaAorKysgYi9zcmMvcHNhdXgvdDFkZWNvZGUuaApAQCAtMSwyOCArMSwyNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkZWNvZGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgVHlwZSAxIGRlY29kaW5nIHJvdXRpbmVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDFkZWNvZGUuaAorICoKKyAqICAgUG9zdFNjcmlwdCBUeXBlIDEgZGVjb2Rpbmcgcm91dGluZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUMURFQ09ERV9IXwogI2RlZmluZSBUMURFQ09ERV9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL0phbWZpbGUgYi9zcmMvcHNoaW50ZXIvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1ZjBhZS4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvcHNoaW50ZXIgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBzaGludGVyIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBwc2hhbGdvCi0gICAgICAgICAgICAgICBwc2hnbG9iCi0gICAgICAgICAgICAgICBwc2htb2QKLSAgICAgICAgICAgICAgIHBzaHBpYwotICAgICAgICAgICAgICAgcHNocmVjCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBwc2hpbnRlciA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wc2hpbnRlciBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvbW9kdWxlLm1rIGIvc3JjL3BzaGludGVyL21vZHVsZS5tawppbmRleCAwNjcwN2JlLi5iNDQwZDJlIDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvbW9kdWxlLm1rCisrKyBiL3NyYy9wc2hpbnRlci9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMgYi9zcmMvcHNoaW50ZXIvcHNoYWxnby5jCmluZGV4IGI5ODA3N2MuLjkyMGI5YTcgMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMKKysrIGIvc3JjL3BzaGludGVyL3BzaGFsZ28uYwpAQCAtMSwzMiArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoYWxnby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGluZyBhbGdvcml0aG0gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNoYWxnby5jCisgKgorICogICBQb3N0U2NyaXB0IGhpbnRpbmcgYWxnb3JpdGhtIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgogI2luY2x1ZGUgInBzaGFsZ28uaCIKIAogI2luY2x1ZGUgInBzaG50ZXJyLmgiCiAKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9wc2hhbGdvCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgcHNoYWxnbwogCiAKICNpZmRlZiBERUJVR19ISU5URVIKQEAgLTUzLDggKzUyLDggQEAKICAgcHNoX2hpbnRfb3ZlcmxhcCggUFNIX0hpbnQgIGhpbnQxLAogICAgICAgICAgICAgICAgICAgICBQU0hfSGludCAgaGludDIgKQogICB7Ci0gICAgcmV0dXJuIGhpbnQxLT5vcmdfcG9zICsgaGludDEtPm9yZ19sZW4gPj0gaGludDItPm9yZ19wb3MgJiYKLSAgICAgICAgICAgaGludDItPm9yZ19wb3MgKyBoaW50Mi0+b3JnX2xlbiA+PSBoaW50MS0+b3JnX3BvczsKKyAgICByZXR1cm4gQUREX0lOVCggaGludDEtPm9yZ19wb3MsIGhpbnQxLT5vcmdfbGVuICkgPj0gaGludDItPm9yZ19wb3MgJiYKKyAgICAgICAgICAgQUREX0lOVCggaGludDItPm9yZ19wb3MsIGhpbnQyLT5vcmdfbGVuICkgPj0gaGludDEtPm9yZ19wb3M7CiAgIH0KIAogCkBAIC00NzksNyArNDc4LDcgQEAKIAogICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMSApCiAgICAgICAgIHBzaF9ibHVlc19zbmFwX3N0ZW0oICZnbG9iYWxzLT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcyArIGhpbnQtPm9yZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFERF9JTlQoIGhpbnQtPm9yZ19wb3MsIGhpbnQtPm9yZ19sZW4gKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduICk7CiAKQEAgLTY1OCw4ICs2NTcsOCBAQAogI2lmIDAgIC8qIG5vdCB1c2VkIGZvciBub3csIGV4cGVyaW1lbnRhbCAqLwogCiAgLyoKLSAgKiAgQSB2YXJpYW50IHRvIHBlcmZvcm0gImxpZ2h0IiBoaW50aW5nIChpLmUuIEZUX1JFTkRFUl9NT0RFX0xJR0hUKQotICAqICBvZiBzdGVtcworICAqIEEgdmFyaWFudCB0byBwZXJmb3JtICJsaWdodCIgaGludGluZyAoaS5lLiBGVF9SRU5ERVJfTU9ERV9MSUdIVCkKKyAgKiBvZiBzdGVtcwogICAqLwogICBzdGF0aWMgdm9pZAogICBwc2hfaGludF9hbGlnbl9saWdodCggUFNIX0hpbnQgICAgIGhpbnQsCkBAIC03MDMsNyArNzAyLDcgQEAKIAogICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMSApCiAgICAgICAgIHBzaF9ibHVlc19zbmFwX3N0ZW0oICZnbG9iYWxzLT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcyArIGhpbnQtPm9yZ19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFERF9JTlQoIGhpbnQtPm9yZ19wb3MsIGhpbnQtPm9yZ19sZW4gKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFsaWduICk7CiAKQEAgLTE1MzgsOCArMTUzNyw4IEBACiAgICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwogCiAKLSAgICAgICAgICAgIGlmICggb3JnX3UgPj0gaGludC0+b3JnX3BvcyAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICBvcmdfdSA8PSBoaW50LT5vcmdfcG9zICsgaGludC0+b3JnX2xlbiApCisgICAgICAgICAgICBpZiAoIG9yZ191ID49ICAgICAgICAgIGhpbnQtPm9yZ19wb3MgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICAgICBvcmdfdSA8PSBBRERfSU5UKCBoaW50LT5vcmdfcG9zLCBoaW50LT5vcmdfbGVuICkgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBwb2ludC0+aGludCA9IGhpbnQ7CiAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaGFsZ28uaCBiL3NyYy9wc2hpbnRlci9wc2hhbGdvLmgKaW5kZXggYzUwNjgzZi4uNTM2N2E1ZCAxMDA2NDQKLS0tIGEvc3JjL3BzaGludGVyL3BzaGFsZ28uaAorKysgYi9zcmMvcHNoaW50ZXIvcHNoYWxnby5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hhbGdvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50aW5nIGFsZ29yaXRobSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2hhbGdvLmgKKyAqCisgKiAgIFBvc3RTY3JpcHQgaGludGluZyBhbGdvcml0aG0gKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQU0hBTEdPX0hfCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jIGIvc3JjL3BzaGludGVyL3BzaGdsb2IuYwppbmRleCBhY2NjMDQ5Li5jZGMxYzNhIDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5jCisrKyBiL3NyYy9wc2hpbnRlci9wc2hnbG9iLmMKQEAgLTEsMjUgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGdsb2IuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBnbG9iYWwgaGludGluZyBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5zcGlyZWQgYnkgdGhlIG5ldyBhdXRvLWhpbnRlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwotLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc2hnbG9iLmMKKyAqCisgKiAgIFBvc3RTY3JpcHQgaGludGVyIGdsb2JhbCBoaW50aW5nIG1hbmFnZW1lbnQgKGJvZHkpLgorICogICBJbnNwaXJlZCBieSB0aGUgbmV3IGF1dG8taGludGVyIG1vZHVsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CiAjaW5jbHVkZSAicHNoZ2xvYi5oIgogCiAjaWZkZWYgREVCVUdfSElOVEVSCkBAIC01NjgsNyArNTY4LDcgQEAKIAogICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lKysgKQogICAgIHsKLSAgICAgIGRlbHRhID0gc3RlbV90b3AgLSB6b25lLT5vcmdfYm90dG9tOworICAgICAgZGVsdGEgPSBTVUJfTE9ORyggc3RlbV90b3AsIHpvbmUtPm9yZ19ib3R0b20gKTsKICAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCiAgICAgICAgIGJyZWFrOwogCkBAIC01OTAsNyArNTkwLDcgQEAKIAogICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lLS0gKQogICAgIHsKLSAgICAgIGRlbHRhID0gem9uZS0+b3JnX3RvcCAtIHN0ZW1fYm90OworICAgICAgZGVsdGEgPSBTVUJfTE9ORyggem9uZS0+b3JnX3RvcCwgc3RlbV9ib3QgKTsKICAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCiAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oIGIvc3JjL3BzaGludGVyL3BzaGdsb2IuaAppbmRleCBjZjgwYmY0Li44MTgxMzI0IDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoZ2xvYi5oCisrKyBiL3NyYy9wc2hpbnRlci9wc2hnbG9iLmgKQEAgLTEsMjcgKzEsMjcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaGdsb2IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBnbG9iYWwgaGludGluZyBtYW5hZ2VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzaGdsb2IuaAorICoKKyAqICAgUG9zdFNjcmlwdCBoaW50ZXIgZ2xvYmFsIGhpbnRpbmcgbWFuYWdlbWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNIR0xPQl9IXwogI2RlZmluZSBQU0hHTE9CX0hfCiAKIAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCkBAIC0zNiwyNyArMzYsMjcgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBjb25zdGFudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19HTE9CQUxTX01BWF9CTFVFX1pPTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBkZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmx1ZSB6b25lcyBpbiBhIGZvbnQgZ2xvYmFsIGhpbnRzIHN0cnVjdHVyZS4gKi8KLSAgLyogICAgU2VlIEBQU19HbG9iYWxzX0JsdWVzUmVjLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNvbnN0YW50OgorICAgKiAgIFBTX0dMT0JBTFNfTUFYX0JMVUVfWk9ORVMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibHVlIHpvbmVzIGluIGEgZm9udCBnbG9iYWwgaGludHMgc3RydWN0dXJlLgorICAgKiAgIFNlZSBAUFNfR2xvYmFsc19CbHVlc1JlYy4KKyAgICovCiAjZGVmaW5lIFBTX0dMT0JBTFNfTUFYX0JMVUVfWk9ORVMgIDE2CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBjb25zdGFudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19HTE9CQUxTX01BWF9TVERfV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBkZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhbmRhcmQgYW5kIHNuYXAgd2lkdGhzIGluIGVpdGhlciB0aGUgICAgICAgKi8KLSAgLyogICAgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBkaXJlY3Rpb24uICBTZWUgQFBTX0dsb2JhbHNfV2lkdGhzUmVjLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQGNvbnN0YW50OgorICAgKiAgIFBTX0dMT0JBTFNfTUFYX1NURF9XSURUSFMKKyAgICoKKyAgICogQGRlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFuZGFyZCBhbmQgc25hcCB3aWR0aHMgaW4gZWl0aGVyIHRoZQorICAgKiAgIGhvcml6b250YWwgb3IgdmVydGljYWwgZGlyZWN0aW9uLiAgU2VlIEBQU19HbG9iYWxzX1dpZHRoc1JlYy4KKyAgICovCiAjZGVmaW5lIFBTX0dMT0JBTFNfTUFYX1NURF9XSURUSFMgIDE2CiAKIApkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaGludGVyLmMgYi9zcmMvcHNoaW50ZXIvcHNoaW50ZXIuYwppbmRleCAwZWVkYWM0Li4zY2NhMGFkIDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoaW50ZXIuYworKysgYi9zcmMvcHNoaW50ZXIvcHNoaW50ZXIuYwpAQCAtMSwyOCArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoaW50ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgSGludGluZyBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNoaW50ZXIuYworICoKKyAqICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBIaW50aW5nIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInBzaGFsZ28uYyIKICNpbmNsdWRlICJwc2hnbG9iLmMiCiAjaW5jbHVkZSAicHNobW9kLmMiCi0jaW5jbHVkZSAicHNocGljLmMiCiAjaW5jbHVkZSAicHNocmVjLmMiCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaG1vZC5jIGIvc3JjL3BzaGludGVyL3BzaG1vZC5jCmluZGV4IDBiOGY2ZjkuLmUwYWJkMzggMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9wc2htb2QuYworKysgYi9zcmMvcHNoaW50ZXIvcHNobW9kLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaG1vZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzaG1vZC5jCisgKgorICogICBGcmVlVHlwZSBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KICNpbmNsdWRlICJwc2hyZWMuaCIKICNpbmNsdWRlICJwc2hhbGdvLmgiCi0jaW5jbHVkZSAicHNocGljLmgiCisjaW5jbHVkZSAicHNobW9kLmgiCiAKIAogICAvKiB0aGUgUG9zdHNjcmlwdCBIaW50ZXIgbW9kdWxlIHN0cnVjdHVyZSAqLwpAQCAtMTExLDcgKzExMCw3IEBACiAgICAgMHgxMDAwMEwsCiAgICAgMHgyMDAwMEwsCiAKLSAgICAmUFNISU5URVJfSU5URVJGQUNFX0dFVCwgICAgICAgICAgICAgIC8qIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKi8KKyAgICAmcHNoaW50ZXJfaW50ZXJmYWNlLCAgICAgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwogCiAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3Rvcilwc19oaW50ZXJfaW5pdCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIHBzX2hpbnRlcl9kb25lLCAgLyogbW9kdWxlX2RvbmUgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaG1vZC5oIGIvc3JjL3BzaGludGVyL3BzaG1vZC5oCmluZGV4IDU1NmRlMmYuLjJhNmViMWMgMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9wc2htb2QuaAorKysgYi9zcmMvcHNoaW50ZXIvcHNobW9kLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaG1vZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzaG1vZC5oCisgKgorICogICBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNITU9EX0hfCiAjZGVmaW5lIFBTSE1PRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGFwaS5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaG50ZXJyLmggYi9zcmMvcHNoaW50ZXIvcHNobnRlcnIuaAppbmRleCBiOWQwMmQyLi5kNjc5NTVjIDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvcHNobnRlcnIuaAorKysgYi9zcmMvcHNoaW50ZXIvcHNobnRlcnIuaApAQCAtMSwzMSArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNobnRlcnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBTIEhpbnRlciBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNobnRlcnIuaAorICoKKyAqICAgUFMgSGludGVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgUFNIaW50ZXIgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTSGludGVyIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgUFNITlRFUlJfSF8KICNkZWZpbmUgUFNITlRFUlJfSF8KIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgUFNIX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU2hpbnRlcgogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBQU0hOVEVSUl9IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNocGljLmMgYi9zcmMvcHNoaW50ZXIvcHNocGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NWFkMzEuLjAwMDAwMDAKLS0tIGEvc3JjL3BzaGludGVyL3BzaHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc2hpbnRlciBtb2R1bGUuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBzaHBpYy5oIgotI2luY2x1ZGUgInBzaG50ZXJyLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBwc2htb2QuYyAqLwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfcHNoaW50ZXJfaW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIaW50ZXJfSW50ZXJmYWNlKiAgY2xhenogKTsKLQotICB2b2lkCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnBzaGludGVyICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBwaWNfY29udGFpbmVyLT5wc2hpbnRlciApOwotICAgICAgcGljX2NvbnRhaW5lci0+cHNoaW50ZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgUFNIaW50ZXJQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+cHNoaW50ZXIgPSBjb250YWluZXI7Ci0KLSAgICAvKiBhZGQgY2FsbCB0byBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGVuIHlvdSBhZGQgbmV3IHNjcmlwdHMgKi8KLSAgICBGVF9Jbml0X0NsYXNzX3BzaGludGVyX2ludGVyZmFjZSgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPnBzaGludGVyX2ludGVyZmFjZSApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hwaWMuaCBiL3NyYy9wc2hpbnRlci9wc2hwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ2OWJhOC4uMDAwMDAwMAotLS0gYS9zcmMvcHNoaW50ZXIvcHNocGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzaGludGVyIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgUFNIUElDX0hfCi0jZGVmaW5lIFBTSFBJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIFBTSElOVEVSX0lOVEVSRkFDRV9HRVQgIHBzaGludGVyX2ludGVyZmFjZQotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSGludGVyUElDXwotICB7Ci0gICAgUFNIaW50ZXJfSW50ZXJmYWNlICBwc2hpbnRlcl9pbnRlcmZhY2U7Ci0KLSAgfSBQU0hpbnRlclBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAoIChQU0hpbnRlclBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5wc2hpbnRlciApICkKLQotI2RlZmluZSBQU0hJTlRFUl9JTlRFUkZBQ0VfR0VUICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+cHNoaW50ZXJfaW50ZXJmYWNlICkKLQotICAvKiBzZWUgcHNocGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIFBTSFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaHJlYy5jIGIvc3JjL3BzaGludGVyL3BzaHJlYy5jCmluZGV4IDY2NDhkMTMuLmJkZGNjZjIgMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9wc2hyZWMuYworKysgYi9zcmMvcHNoaW50ZXIvcHNocmVjLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaHJlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQb3N0U2NyaXB0IGhpbnRzIHJlY29yZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzaHJlYy5jCisgKgorICogICBGcmVlVHlwZSBQb3N0U2NyaXB0IGhpbnRzIHJlY29yZGVyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KIAogI2luY2x1ZGUgInBzaHJlYy5oIgogI2luY2x1ZGUgInBzaGFsZ28uaCIKQEAgLTI4LDcgKzI3LDcgQEAKICNpbmNsdWRlICJwc2hudGVyci5oIgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BzaHJlYworI2RlZmluZSBGVF9DT01QT05FTlQgIHBzaHJlYwogCiAjaWZkZWYgREVCVUdfSElOVEVSCiAgIFBTX0hpbnRzICBwc19kZWJ1Z19oaW50cyAgICAgICAgID0gTlVMTDsKQEAgLTY2Niw3ICs2NjUsNyBAQAogICAgICAgaWYgKCBsZW4gPT0gLTIxICkKICAgICAgIHsKICAgICAgICAgZmxhZ3MgfD0gUFNfSElOVF9GTEFHX0JPVFRPTTsKLSAgICAgICAgcG9zICAgKz0gbGVuOworICAgICAgICBwb3MgICAgPSBBRERfSU5UKCBwb3MsIGxlbiApOwogICAgICAgfQogICAgICAgbGVuID0gMDsKICAgICB9CkBAIC04NzUsNyArODc0LDcgQEAKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgewogICAgICAgICBGVF9FUlJPUigoICJwc19oaW50c19zdGVtOiBjb3VsZCBub3QgYWRkIHN0ZW0iCi0gICAgICAgICAgICAgICAgICAgIiAoJWQsJWQpIHRvIGhpbnRzIHRhYmxlXG4iLCBzdGVtc1swXSwgc3RlbXNbMV0gKSk7CisgICAgICAgICAgICAgICAgICAgIiAoJWxkLCVsZCkgdG8gaGludHMgdGFibGVcbiIsIHN0ZW1zWzBdLCBzdGVtc1sxXSApKTsKIAogICAgICAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKICAgICAgICAgcmV0dXJuOwpAQCAtMTE4Nyw3ICsxMTg2LDcgQEAKICAgICAgIC8qIGNvbXB1dGUgaW50ZWdlciBzdGVtIHBvc2l0aW9ucyBpbiBmb250IHVuaXRzICovCiAgICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50ICogMjsgbisrICkKICAgICAgIHsKLSAgICAgICAgeSAgICAgICArPSBjb29yZHNbbl07CisgICAgICAgIHkgICAgICAgID0gQUREX0xPTkcoIHksIGNvb3Jkc1tuXSApOwogICAgICAgICBzdGVtc1tuXSA9IEZJWEVEX1RPX0lOVCggeSApOwogICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvcHNoaW50ZXIvcHNocmVjLmggYi9zcmMvcHNoaW50ZXIvcHNocmVjLmgKaW5kZXggN2UzZGZlMC4uYjEzYzdiZSAxMDA2NDQKLS0tIGEvc3JjL3BzaGludGVyL3BzaHJlYy5oCisrKyBiL3NyYy9wc2hpbnRlci9wc2hyZWMuaApAQCAtMSwzOSArMSwzOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocmVjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RzY3JpcHQgKFR5cGUxL1R5cGUyKSBoaW50cyByZWNvcmRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNocmVjLmgKKyAqCisgKiAgIFBvc3RzY3JpcHQgKFR5cGUxL1R5cGUyKSBoaW50cyByZWNvcmRlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgYXJlIGNhbGxlZCBmcm9tIHRoZSBUeXBlIDEsIENJRCBhbmQgQ0ZGICAgICovCi0gIC8qICBmb250IGRyaXZlcnMgdG8gcmVjb3JkIHRoZSBoaW50cyBvZiBhIGdpdmVuIGNoYXJhY3Rlci9nbHlwaC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGhpbnRzIGFyZSByZWNvcmRlZCBpbiBhIHVuaWZpZWQgZm9ybWF0LCBhbmQgYXJlIGxhdGVyIHByb2Nlc3NlZCAgICovCi0gIC8qICBieSB0aGUgYG9wdGltaXplcicgYW5kIGBmaXR0ZXInIHRvIGFkanVzdCB0aGUgb3V0bGluZXMgdG8gdGhlIHBpeGVsICAgKi8KLSAgLyogIGdyaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSBhcmUgY2FsbGVkIGZyb20gdGhlIFR5cGUgMSwgQ0lEIGFuZCBDRkYKKyAgICogZm9udCBkcml2ZXJzIHRvIHJlY29yZCB0aGUgaGludHMgb2YgYSBnaXZlbiBjaGFyYWN0ZXIvZ2x5cGguCisgICAqCisgICAqIFRoZSBoaW50cyBhcmUgcmVjb3JkZWQgaW4gYSB1bmlmaWVkIGZvcm1hdCwgYW5kIGFyZSBsYXRlciBwcm9jZXNzZWQKKyAgICogYnkgdGhlIGBvcHRpbWl6ZXInIGFuZCBgZml0dGVyJyB0byBhZGp1c3QgdGhlIG91dGxpbmVzIHRvIHRoZSBwaXhlbAorICAgKiBncmlkLgorICAgKgorICAgKi8KIAogCiAjaWZuZGVmIFBTSFJFQ19IXwogI2RlZmluZSBQU0hSRUNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzaGludHMuaD4KICNpbmNsdWRlICJwc2hnbG9iLmgiCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3J1bGVzLm1rIGIvc3JjL3BzaGludGVyL3J1bGVzLm1rCmluZGV4IDk2NjY5MGUuLmM4NDVjMjUgMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9ydWxlcy5taworKysgYi9zcmMvcHNoaW50ZXIvcnVsZXMubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTMxLDcgKzMxLDYgQEAKIFBTSElOVEVSX0RSVl9TUkMgOj0gJChQU0hJTlRFUl9ESVIpL3BzaGFsZ28uYyBcCiAgICAgICAgICAgICAgICAgICAgICQoUFNISU5URVJfRElSKS9wc2hnbG9iLmMgXAogICAgICAgICAgICAgICAgICAgICAkKFBTSElOVEVSX0RJUikvcHNobW9kLmMgIFwKLSAgICAgICAgICAgICAgICAgICAgJChQU0hJTlRFUl9ESVIpL3BzaHBpYy5jICBcCiAgICAgICAgICAgICAgICAgICAgICQoUFNISU5URVJfRElSKS9wc2hyZWMuYwogCiAKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL0phbWZpbGUgYi9zcmMvcHNuYW1lcy9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGZkMzczLi4wMDAwMDAwCi0tLSBhL3NyYy9wc25hbWVzL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3BzbmFtZXMgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHBzbmFtZXMgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHBzbW9kdWxlCi0gICAgICAgICAgICAgICBwc3BpYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gcHNuYW1lcyA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9wc25hbWVzIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL21vZHVsZS5tayBiL3NyYy9wc25hbWVzL21vZHVsZS5tawppbmRleCA0MTBmNDhhLi42NzViYjM3IDEwMDY0NAotLS0gYS9zcmMvcHNuYW1lcy9tb2R1bGUubWsKKysrIGIvc3JjL3BzbmFtZXMvbW9kdWxlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jIGIvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYwppbmRleCA4OTI5ZWJlLi5iMzhmOWQzIDEwMDY0NAotLS0gYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jCisrKyBiL3NyYy9wc25hbWVzL3BzbW9kdWxlLmMKQEAgLTEsMzkgKzEsMzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQU05hbWVzIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzbW9kdWxlLmMKKyAqCisgKiAgIHBzbmFtZXMgbW9kdWxlIGltcGxlbWVudGF0aW9uIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oPgogCiAjaW5jbHVkZSAicHNtb2R1bGUuaCIKIAogICAvKgotICAgKiAgVGhlIGZpbGUgYHBzdGFibGVzLmgnIHdpdGggaXRzIGFycmF5cyBhbmQgaXRzIGZ1bmN0aW9uCi0gICAqICBgZnRfZ2V0X2Fkb2JlX2dseXBoX2luZGV4JyBpcyB1c2VmdWwgZm9yIG90aGVyIHByb2plY3RzIGFsc28gKGZvcgotICAgKiAgZXhhbXBsZSwgYHBkZml1bScgaXMgdXNpbmcgaXQpLiAgSG93ZXZlciwgaWYgdXNlZCBhcyBhIEMrKyBoZWFkZXIsCi0gICAqICBpbmNsdWRpbmcgaXQgaW4gdHdvIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMgbWFrZXMgaXQgbmVjZXNzYXJ5IHRvIHVzZQotICAgKiAgYGV4dGVybiBjb25zdCcgZm9yIHRoZSBkZWNsYXJhdGlvbiBvZiBpdHMgYXJyYXlzLCBvdGhlcndpc2UgdGhlIGRhdGEKLSAgICogIHdvdWxkIGJlIGR1cGxpY2F0ZWQgYXMgbWFuZGF0ZWQgYnkgdGhlIEMrKyBzdGFuZGFyZC4KKyAgICogVGhlIGZpbGUgYHBzdGFibGVzLmgnIHdpdGggaXRzIGFycmF5cyBhbmQgaXRzIGZ1bmN0aW9uCisgICAqIGBmdF9nZXRfYWRvYmVfZ2x5cGhfaW5kZXgnIGlzIHVzZWZ1bCBmb3Igb3RoZXIgcHJvamVjdHMgYWxzbyAoZm9yCisgICAqIGV4YW1wbGUsIGBwZGZpdW0nIGlzIHVzaW5nIGl0KS4gIEhvd2V2ZXIsIGlmIHVzZWQgYXMgYSBDKysgaGVhZGVyLAorICAgKiBpbmNsdWRpbmcgaXQgaW4gdHdvIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMgbWFrZXMgaXQgbmVjZXNzYXJ5IHRvIHVzZQorICAgKiBgZXh0ZXJuIGNvbnN0JyBmb3IgdGhlIGRlY2xhcmF0aW9uIG9mIGl0cyBhcnJheXMsIG90aGVyd2lzZSB0aGUgZGF0YQorICAgKiB3b3VsZCBiZSBkdXBsaWNhdGVkIGFzIG1hbmRhdGVkIGJ5IHRoZSBDKysgc3RhbmRhcmQuCiAgICAqCi0gICAqICBGb3IgdGhpcyByZWFzb24sIHdlIHVzZSBgREVGSU5FX1BTX1RBQkxFUycgdG8gZ3VhcmQgdGhlIGZ1bmN0aW9uCi0gICAqICBkZWZpbml0aW9ucywgYW5kIGBERUZJTkVfUFNfVEFCTEVTX0RBVEEnIHRvIHByb3ZpZGUgYm90aCBwcm9wZXIgYXJyYXkKLSAgICogIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMuCisgICAqIEZvciB0aGlzIHJlYXNvbiwgd2UgdXNlIGBERUZJTkVfUFNfVEFCTEVTJyB0byBndWFyZCB0aGUgZnVuY3Rpb24KKyAgICogZGVmaW5pdGlvbnMsIGFuZCBgREVGSU5FX1BTX1RBQkxFU19EQVRBJyB0byBwcm92aWRlIGJvdGggcHJvcGVyIGFycmF5CisgICAqIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMuCiAgICAqLwogI2luY2x1ZGUgInBzdGFibGVzLmgiCiAjZGVmaW5lICBERUZJTkVfUFNfVEFCTEVTCkBAIC00MSw3ICs0MCw2IEBACiAjaW5jbHVkZSAicHN0YWJsZXMuaCIKIAogI2luY2x1ZGUgInBzbmFtZXJyLmgiCi0jaW5jbHVkZSAicHNwaWMuaCIKIAogCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCkBAIC0zOTMsNyArMzkxLDkgQEAKICAgICAgICAgLyogUmVhbGxvY2F0ZSBpZiB0aGUgbnVtYmVyIG9mIHVzZWQgZW50cmllcyBpcyBtdWNoIHNtYWxsZXIuICovCiAgICAgICAgIGlmICggY291bnQgPCBudW1fZ2x5cGhzIC8gMiApCiAgICAgICAgIHsKLSAgICAgICAgICAodm9pZClGVF9SRU5FV19BUlJBWSggdGFibGUtPm1hcHMsIG51bV9nbHlwaHMsIGNvdW50ICk7CisgICAgICAgICAgKHZvaWQpRlRfUkVORVdfQVJSQVkoIHRhYmxlLT5tYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZ2x5cGhzICsgRVhUUkFfR0xZUEhfTElTVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCApOwogICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogICAgICAgICB9CiAKQEAgLTU3NywyOCArNTc3LDE2IEBACiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzEoCiAgICAgcHNjbWFwc19zZXJ2aWNlcywKIAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9DTUFQUywgJlBTQ01BUFNfSU5URVJGQUNFX0dFVCApCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0NNQVBTLCAmcHNjbWFwc19pbnRlcmZhY2UgKQogCiAKICAgc3RhdGljIEZUX1BvaW50ZXIKICAgcHNuYW1lc19nZXRfc2VydmljZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNlcnZpY2VfaWQgKQogICB7Ci0gICAgLyogUFNDTUFQU19TRVJWSUNFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLQotCi0gICAgaWYgKCAhbW9kdWxlICkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGxpYnJhcnkgPSBtb2R1bGUtPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gTlVMTDsKLSNlbHNlCiAgICAgRlRfVU5VU0VEKCBtb2R1bGUgKTsKLSNlbmRpZgogCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIFBTQ01BUFNfU0VSVklDRVNfR0VULCBzZXJ2aWNlX2lkICk7CisgICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHBzY21hcHNfc2VydmljZXMsIHNlcnZpY2VfaWQgKTsKICAgfQogCiAjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCkBAIC02MjEsNyArNjA5LDcgQEAKICAgICAweDIwMDAwTCwgICAvKiBkcml2ZXIgcmVxdWlyZXMgRnJlZVR5cGUgMiBvciBhYm92ZSAqLwogCiAgICAgUFVUX1BTX05BTUVTX1NFUlZJQ0UoCi0gICAgICAodm9pZCopJlBTQ01BUFNfSU5URVJGQUNFX0dFVCApLCAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KKyAgICAgICh2b2lkKikmcHNjbWFwc19pbnRlcmZhY2UgKSwgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCiAKICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbW9kdWxlX2luaXQgICAqLwogICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5oIGIvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaAppbmRleCAzZTk0ZjhiLi5jODVhOWVjIDEwMDY0NAotLS0gYS9zcmMvcHNuYW1lcy9wc21vZHVsZS5oCisrKyBiL3NyYy9wc25hbWVzL3BzbW9kdWxlLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFBTTmFtZXMgbW9kdWxlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHBzbW9kdWxlLmgKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgcHNuYW1lcyBtb2R1bGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgUFNNT0RVTEVfSF8KICNkZWZpbmUgUFNNT0RVTEVfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RhcGkuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmggYi9zcmMvcHNuYW1lcy9wc25hbWVyci5oCmluZGV4IDE0ZWI3NmMuLjE1NGM3MDEgMTAwNjQ0Ci0tLSBhL3NyYy9wc25hbWVzL3BzbmFtZXJyLmgKKysrIGIvc3JjL3BzbmFtZXMvcHNuYW1lcnIuaApAQCAtMSwzMiArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNuYW1lcnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBTIG5hbWVzIG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHNuYW1lcnIuaAorICoKKyAqICAgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGVudW1lcmF0aW9uICAgICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBQUyBuYW1lcyBtb2R1bGUgZXJyb3IgZW51bWVyYXRpb24KKyAgICogY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBQU05BTUVSUl9IXwogI2RlZmluZSBQU05BTUVSUl9IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU25hbWVzX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU25hbWVzCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogI2VuZGlmIC8qIFBTTkFNRVJSX0hfICovCiAKZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzbmFtZXMuYyBiL3NyYy9wc25hbWVzL3BzbmFtZXMuYwppbmRleCBmZWJiODBkLi5jZmYzNjg1IDEwMDY0NAotLS0gYS9zcmMvcHNuYW1lcy9wc25hbWVzLmMKKysrIGIvc3JjL3BzbmFtZXMvcHNuYW1lcy5jCkBAIC0xLDI2ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc25hbWVzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUFNOYW1lcyBtb2R1bGUgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwc25hbWVzLmMKKyAqCisgKiAgIEZyZWVUeXBlIHBzbmFtZXMgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKICNpbmNsdWRlICJwc21vZHVsZS5jIgotI2luY2x1ZGUgInBzcGljLmMiCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9wc3BpYy5jIGIvc3JjL3BzbmFtZXMvcHNwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhMDZmMy4uMDAwMDAwMAotLS0gYS9zcmMvcHNuYW1lcy9wc3BpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc25hbWVzIG1vZHVsZS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBzcGljLmgiCi0jaW5jbHVkZSAicHNuYW1lcnIuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHBzbW9kdWxlLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX3BzY21hcHNfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3BzY21hcHNfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICk7Ci0KLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3BzY21hcHNfaW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX1BzQ01hcHNSZWMqICBjbGF6eiApOwotCi0KLSAgdm9pZAotICBwc25hbWVzX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnBzbmFtZXMgKQotICAgIHsKLSAgICAgIFBTTW9kdWxlUElDKiAgY29udGFpbmVyID0gKFBTTW9kdWxlUElDKilwaWNfY29udGFpbmVyLT5wc25hbWVzOwotCi0KLSAgICAgIGlmICggY29udGFpbmVyLT5wc2NtYXBzX3NlcnZpY2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc19wc2NtYXBzX3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci0+cHNjbWFwc19zZXJ2aWNlcyApOwotICAgICAgY29udGFpbmVyLT5wc2NtYXBzX3NlcnZpY2VzID0gTlVMTDsKLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+cHNuYW1lcyA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBwc25hbWVzX21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIFBTTW9kdWxlUElDKiAgICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjb250YWluZXIsIHNpemVvZiAoICpjb250YWluZXIgKSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBGVF9NRU1fU0VUKCBjb250YWluZXIsIDAsIHNpemVvZiAoICpjb250YWluZXIgKSApOwotICAgIHBpY19jb250YWluZXItPnBzbmFtZXMgPSBjb250YWluZXI7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgZXhwZWN0cyB0aGlzIGRhdGEgKi8KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc19wc2NtYXBzX3NlcnZpY2VzKAotICAgICAgICAgICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5wc2NtYXBzX3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgRlRfSW5pdF9DbGFzc19wc2NtYXBzX2ludGVyZmFjZSggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT5wc2NtYXBzX2ludGVyZmFjZSApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBwc25hbWVzX21vZHVsZV9jbGFzc19waWNfZnJlZSggbGlicmFyeSApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3BzbmFtZXMvcHNwaWMuaCBiL3NyYy9wc25hbWVzL3BzcGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTc4MGMuLjAwMDAwMDAKLS0tIGEvc3JjL3BzbmFtZXMvcHNwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzcGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcHNuYW1lcyBtb2R1bGUuICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBQU1BJQ19IXwotI2RlZmluZSBQU1BJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIFBTQ01BUFNfU0VSVklDRVNfR0VUICAgcHNjbWFwc19zZXJ2aWNlcwotI2RlZmluZSBQU0NNQVBTX0lOVEVSRkFDRV9HRVQgIHBzY21hcHNfaW50ZXJmYWNlCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICBwc2NtYXBzX3NlcnZpY2VzOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwc1JlYyAgcHNjbWFwc19pbnRlcmZhY2U7Ci0KLSAgfSBQU01vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChQU01vZHVsZVBJQyopKChsaWIpLT5waWNfY29udGFpbmVyLnBzbmFtZXMpICkKLSNkZWZpbmUgUFNDTUFQU19TRVJWSUNFU19HRVQgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+cHNjbWFwc19zZXJ2aWNlcyApCi0jZGVmaW5lIFBTQ01BUFNfSU5URVJGQUNFX0dFVCAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnBzY21hcHNfaW50ZXJmYWNlICkKLQotCi0gIC8qIHNlZSBwc3BpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBwc25hbWVzX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi0jZW5kaWYgLyogUFNQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9wc25hbWVzL3BzdGFibGVzLmggYi9zcmMvcHNuYW1lcy9wc3RhYmxlcy5oCmluZGV4IDc5NTQ1ZWUuLmMyMTVmMTYgMTAwNjQ0Ci0tLSBhL3NyYy9wc25hbWVzL3BzdGFibGVzLmgKKysrIGIvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHN0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcHN0YWJsZXMuaAorICoKKyAqICAgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICAgLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IC0tIGRvIG5vdCBlZGl0ISAqLwpAQCAtNjA5LDEyICs2MDksMTIgQEAKIAogCiAgIC8qCi0gICAqICBUaGlzIHRhYmxlIGlzIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBBZG9iZSBHbHlwaCBMaXN0IChBR0wpLAotICAgKiAgb3B0aW1pemVkIGZvciBlZmZpY2llbnQgc2VhcmNoaW5nLiAgSXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZQotICAgKiAgYGdsbmFtZXMucHknIHB5dGhvbiBzY3JpcHQgbG9jYXRlZCBpbiB0aGUgYHNyYy90b29scycgZGlyZWN0b3J5LgorICAgKiBUaGlzIHRhYmxlIGlzIGEgY29tcHJlc3NlZCB2ZXJzaW9uIG9mIHRoZSBBZG9iZSBHbHlwaCBMaXN0IChBR0wpLAorICAgKiBvcHRpbWl6ZWQgZm9yIGVmZmljaWVudCBzZWFyY2hpbmcuICBJdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlCisgICAqIGBnbG5hbWVzLnB5JyBweXRob24gc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGBzcmMvdG9vbHMnIGRpcmVjdG9yeS4KICAgICoKLSAgICogIFRoZSBsb29rdXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBVbmljb2RlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZwotICAgKiAgaXMgZGVmaW5lZCBiZWxvdyB0aGUgdGFibGUuCisgICAqIFRoZSBsb29rdXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBVbmljb2RlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZworICAgKiBpcyBkZWZpbmVkIGJlbG93IHRoZSB0YWJsZS4KICAgICovCiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QKQEAgLTQxMzcsNyArNDEzNyw3IEBACiAKICNpZmRlZiAgREVGSU5FX1BTX1RBQkxFUwogICAvKgotICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY29tcHJlc3NlZCB0YWJsZSBlZmZpY2llbnRseS4KKyAgICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY29tcHJlc3NlZCB0YWJsZSBlZmZpY2llbnRseS4KICAgICovCiAgIHN0YXRpYyB1bnNpZ25lZCBsb25nCiAgIGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggY29uc3QgY2hhciogIG5hbWUsCmRpZmYgLS1naXQgYS9zcmMvcHNuYW1lcy9ydWxlcy5tayBiL3NyYy9wc25hbWVzL3J1bGVzLm1rCmluZGV4IDRkNjI5ZDguLjE0Y2RkYTMgMTAwNjQ0Ci0tLSBhL3NyYy9wc25hbWVzL3J1bGVzLm1rCisrKyBiL3NyYy9wc25hbWVzL3J1bGVzLm1rCkBAIC0xLDkgKzEsOSBAQAogIwotIyBGcmVlVHlwZSAyIFBTTmFtZXMgZHJpdmVyIGNvbmZpZ3VyYXRpb24gcnVsZXMKKyMgRnJlZVR5cGUgMiBwc25hbWVzIGRyaXZlciBjb25maWd1cmF0aW9uIHJ1bGVzCiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTEzLDcgKzEzLDcgQEAKICMgZnVsbHkuCiAKIAotIyBQU05hbWVzIGRyaXZlciBkaXJlY3RvcnkKKyMgcHNuYW1lcyBkcml2ZXIgZGlyZWN0b3J5CiAjCiBQU05BTUVTX0RJUiA6PSAkKFNSQ19ESVIpL3BzbmFtZXMKIApAQCAtMjYsMjAgKzI2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgJChGVF9DRkxBR1MpCiAKIAotIyBQU05hbWVzIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQorIyBwc25hbWVzIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQogIwotUFNOQU1FU19EUlZfU1JDIDo9ICQoUFNOQU1FU19ESVIpL3BzbW9kdWxlLmMgXAotICAgICAgICAgICAgICAgICAgICQoUFNOQU1FU19ESVIpL3BzcGljLmMKK1BTTkFNRVNfRFJWX1NSQyA6PSAkKFBTTkFNRVNfRElSKS9wc21vZHVsZS5jCiAKIAotIyBQU05hbWVzIGRyaXZlciBoZWFkZXJzCisjIHBzbmFtZXMgZHJpdmVyIGhlYWRlcnMKICMKIFBTTkFNRVNfRFJWX0ggOj0gJChQU05BTUVTX0RSVl9TUkM6JS5jPSUuaCkgXAogICAgICAgICAgICAgICAgICAkKFBTTkFNRVNfRElSKS9wc25hbWVyci5oICBcCiAgICAgICAgICAgICAgICAgICQoUFNOQU1FU19ESVIpL3BzdGFibGVzLmgKIAogCi0jIFBTTmFtZXMgZHJpdmVyIG9iamVjdChzKQorIyBwc25hbWVzIGRyaXZlciBvYmplY3QocykKICMKICMgICBQU05BTUVTX0RSVl9PQkpfTSBpcyB1c2VkIGR1cmluZyBgbXVsdGknIGJ1aWxkcwogIyAgIFBTTkFNRVNfRFJWX09CSl9TIGlzIHVzZWQgZHVyaW5nIGBzaW5nbGUnIGJ1aWxkcwpAQCAtNDcsMTkgKzQ2LDE5IEBACiBQU05BTUVTX0RSVl9PQkpfTSA6PSAkKFBTTkFNRVNfRFJWX1NSQzokKFBTTkFNRVNfRElSKS8lLmM9JChPQkpfRElSKS8lLiRPKQogUFNOQU1FU19EUlZfT0JKX1MgOj0gJChPQkpfRElSKS9wc25hbWVzLiRPCiAKLSMgUFNOYW1lcyBkcml2ZXIgc291cmNlIGZpbGUgZm9yIHNpbmdsZSBidWlsZAorIyBwc25hbWVzIGRyaXZlciBzb3VyY2UgZmlsZSBmb3Igc2luZ2xlIGJ1aWxkCiAjCiBQU05BTUVTX0RSVl9TUkNfUyA6PSAkKFBTTkFNRVNfRElSKS9wc25hbWVzLmMKIAogCi0jIFBTTmFtZXMgZHJpdmVyIC0gc2luZ2xlIG9iamVjdAorIyBwc25hbWVzIGRyaXZlciAtIHNpbmdsZSBvYmplY3QKICMKICQoUFNOQU1FU19EUlZfT0JKX1MpOiAkKFBTTkFNRVNfRFJWX1NSQ19TKSAkKFBTTkFNRVNfRFJWX1NSQykgXAogICAgICAgICAgICAgICAgICAgICAgICQoRlJFRVRZUEVfSCkgJChQU05BTUVTX0RSVl9IKQogCSQoUFNOQU1FU19DT01QSUxFKSAkVCQoc3Vic3QgLywkKENPTVBJTEVSX1NFUCksJEAgJChQU05BTUVTX0RSVl9TUkNfUykpCiAKIAotIyBQU05hbWVzIGRyaXZlciAtIG11bHRpcGxlIG9iamVjdHMKKyMgcHNuYW1lcyBkcml2ZXIgLSBtdWx0aXBsZSBvYmplY3RzCiAjCiAkKE9CSl9ESVIpLyUuJE86ICQoUFNOQU1FU19ESVIpLyUuYyAkKEZSRUVUWVBFX0gpICQoUFNOQU1FU19EUlZfSCkKIAkkKFBTTkFNRVNfQ09NUElMRSkgJFQkKHN1YnN0IC8sJChDT01QSUxFUl9TRVApLCRAICQ8KQpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9KYW1maWxlIGIvc3JjL3Jhc3Rlci9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzhlN2VmLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvcmFzdGVyIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSByYXN0ZXIgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0cmFzdGVyCi0gICAgICAgICAgICAgICBmdHJlbmQxCi0gICAgICAgICAgICAgICByYXN0cGljCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSByYXN0ZXIgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvcmFzdGVyIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvZnRtaXNjLmggYi9zcmMvcmFzdGVyL2Z0bWlzYy5oCmluZGV4IDdlNDAxMTkuLjZlZmU0YTkgMTAwNjQ0Ci0tLSBhL3NyYy9yYXN0ZXIvZnRtaXNjLmgKKysrIGIvc3JjL3Jhc3Rlci9mdG1pc2MuaApAQCAtMSwyOCArMSwyOCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtaXNjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1pc2NlbGxhbmVvdXMgbWFjcm9zIGZvciBzdGFuZC1hbG9uZSByYXN0ZXJpemVyIChzcGVjaWZpY2F0aW9uICAgICAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCi0vKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0bWlzYy5oCisgKgorICogICBNaXNjZWxsYW5lb3VzIG1hY3JvcyBmb3Igc3RhbmQtYWxvbmUgcmFzdGVyaXplciAoc3BlY2lmaWNhdGlvbgorICogICBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZAorICogbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyAqbm90KiBwb3J0YWJsZSEgIFlvdSBoYXZlIHRvIGFkYXB0ICovCi0gIC8qIGl0cyBkZWZpbml0aW9ucyB0byB5b3VyIHBsYXRmb3JtLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyAqbm90KiBwb3J0YWJsZSEgIFlvdSBoYXZlIHRvIGFkYXB0CisgICAqIGl0cyBkZWZpbml0aW9ucyB0byB5b3VyIHBsYXRmb3JtLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBGVE1JU0NfSF8KICNkZWZpbmUgRlRNSVNDX0hfCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMgYi9zcmMvcmFzdGVyL2Z0cmFzdGVyLmMKaW5kZXggNDM1NDczMC4uOWYwYTc5NyAxMDA2NDQKLS0tIGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jCisrKyBiL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuYwpAQCAtMSw1MSArMSw1MSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRyYXN0ZXIuYworICoKKyAqICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgdGhlIHJlc3Qgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZSwgYnkgKi8KLSAgLyogZGVmaW5pbmcgdGhlIFNUQU5EQUxPTkVfIG1hY3JvIHdoZW4gY29tcGlsaW5nIGl0LiAgWW91IGFsc28gbmVlZCB0byAgICovCi0gIC8qIHB1dCB0aGUgZmlsZXMgYGZ0aW1hZ2UuaCcgYW5kIGBmdG1pc2MuaCcgaW50byB0aGUgJChpbmNkaXIpICAgICAgICAgICAqLwotICAvKiBkaXJlY3RvcnkuICBUeXBpY2FsbHksIHlvdSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgc3JjL3Jhc3Rlci9mdHJhc3Rlci5jJyAodGhpcyBmaWxlKSB0byB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCcgYW5kIGBzcmMvcmFzdGVyL2Z0bWlzYy5oJyB0byB5b3VyICovCi0gIC8qICAgY3VycmVudCBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb21waWxlIGBmdHJhc3Rlcicgd2l0aCB0aGUgU1RBTkRBTE9ORV8gbWFjcm8gZGVmaW5lZCwgYXMgaW4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY2MgLWMgLURTVEFOREFMT05FXyBmdHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSByZW5kZXJlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgZnRfc3RhbmRhcmRfcmFzdGVyLnJhc3Rlcl9uZXcnOyBhIGJpdG1hcCBjYW4gYmUgZ2VuZXJhdGVkICAgICAgICAgICAgKi8KLSAgLyogd2l0aCBhIGNhbGwgdG8gYGZ0X3N0YW5kYXJkX3Jhc3Rlci5yYXN0ZXJfcmVuZGVyJy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGluIHRoZSBmaWxlIGBmdGltYWdlLmgnIGZvciBtb3JlICAgKi8KLSAgLyogZGV0YWlscyBvbiBob3cgdGhlIHJhc3RlciB3b3Jrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLCBieQorICAgKiBkZWZpbmluZyB0aGUgU1RBTkRBTE9ORV8gbWFjcm8gd2hlbiBjb21waWxpbmcgaXQuICBZb3UgYWxzbyBuZWVkIHRvCisgICAqIHB1dCB0aGUgZmlsZXMgYGZ0aW1hZ2UuaCcgYW5kIGBmdG1pc2MuaCcgaW50byB0aGUgJChpbmNkaXIpCisgICAqIGRpcmVjdG9yeS4gIFR5cGljYWxseSwgeW91IHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZQorICAgKgorICAgKiAtIGNvcHkgYHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYycgKHRoaXMgZmlsZSkgdG8geW91ciBjdXJyZW50IGRpcmVjdG9yeQorICAgKgorICAgKiAtIGNvcHkgYGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9yYXN0ZXIvZnRtaXNjLmgnIHRvIHlvdXIKKyAgICogICBjdXJyZW50IGRpcmVjdG9yeQorICAgKgorICAgKiAtIGNvbXBpbGUgYGZ0cmFzdGVyJyB3aXRoIHRoZSBTVEFOREFMT05FXyBtYWNybyBkZWZpbmVkLCBhcyBpbgorICAgKgorICAgKiAgICAgY2MgLWMgLURTVEFOREFMT05FXyBmdHJhc3Rlci5jCisgICAqCisgICAqIFRoZSByZW5kZXJlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8KKyAgICogYGZ0X3N0YW5kYXJkX3Jhc3Rlci5yYXN0ZXJfbmV3JzsgYSBiaXRtYXAgY2FuIGJlIGdlbmVyYXRlZAorICAgKiB3aXRoIGEgY2FsbCB0byBgZnRfc3RhbmRhcmRfcmFzdGVyLnJhc3Rlcl9yZW5kZXInLgorICAgKgorICAgKiBTZWUgdGhlIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGluIHRoZSBmaWxlIGBmdGltYWdlLmgnIGZvciBtb3JlCisgICAqIGRldGFpbHMgb24gaG93IHRoZSByYXN0ZXIgd29ya3MuCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgcmV3cml0ZSBvZiB0aGUgRnJlZVR5cGUgMS54IHNjYW4tbGluZSBjb252ZXJ0ZXIgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBpcyBhIHJld3JpdGUgb2YgdGhlIEZyZWVUeXBlIDEueCBzY2FuLWxpbmUgY29udmVydGVyCisgICAqCisgICAqLwogCiAjaWZkZWYgU1RBTkRBTE9ORV8KIApAQCAtNjIsODUgKzYyLDgzIEBACiAKICNlbHNlIC8qICFTVEFOREFMT05FXyAqLwogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJmdHJhc3Rlci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19IICAgLyogZm9yIEZUX011bERpdiBhbmQgRlRfTXVsRGl2X05vX1JvdW5kICovCi0KLSNpbmNsdWRlICJyYXN0cGljLmgiCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+IC8qIGZvciBGVF9NdWxEaXYgYW5kIEZUX011bERpdl9Ob19Sb3VuZCAqLworI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4gICAgICAgICAvKiBmb3IgRlRfT3V0bGluZV9HZXRfQ0JveCAgICAgICAgICAgICAgKi8KIAogI2VuZGlmIC8qICFTVEFOREFMT05FXyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNpbXBsZSB0ZWNobmljYWwgbm90ZSBvbiBob3cgdGhlIHJhc3RlciB3b3JrcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIENvbnZlcnRpbmcgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIGlzIGFjaGlldmVkIGluIHNldmVyYWwgc3RlcHM6ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgMSAtIERlY29tcG9zaW5nIHRoZSBvdXRsaW5lIGludG8gc3VjY2Vzc2l2ZSBgcHJvZmlsZXMnLiAgRWFjaCAgICAgICAqLwotICAvKiAgICAgICBwcm9maWxlIGlzIHNpbXBseSBhbiBhcnJheSBvZiBzY2FubGluZSBpbnRlcnNlY3Rpb25zIG9uIGEgZ2l2ZW4gKi8KLSAgLyogICAgICAgZGltZW5zaW9uLiAgQSBwcm9maWxlJ3MgbWFpbiBhdHRyaWJ1dGVzIGFyZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBvIGl0cyBzY2FubGluZSBwb3NpdGlvbiBib3VuZGFyaWVzLCBpLmUuIGBZbWluJyBhbmQgYFltYXgnICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gYW4gYXJyYXkgb2YgaW50ZXJzZWN0aW9uIGNvb3JkaW5hdGVzIGZvciBlYWNoIHNjYW5saW5lICAgICAgICAqLwotICAvKiAgICAgICAgIGJldHdlZW4gYFltaW4nIGFuZCBgWW1heCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gYSBkaXJlY3Rpb24sIGluZGljYXRpbmcgd2hldGhlciBpdCB3YXMgYnVpbHQgZ29pbmcgYHVwJyBvciAgICAqLwotICAvKiAgICAgICAgIGBkb3duJywgYXMgdGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBmb3IgZmlsbGluZyBydWxlcyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gaXRzIGRyb3Atb3V0IG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAyIC0gU3dlZXBpbmcgdGhlIHRhcmdldCBtYXAncyBzY2FubGluZXMgaW4gb3JkZXIgdG8gY29tcHV0ZSBzZWdtZW50ICovCi0gIC8qICAgICAgIGBzcGFucycgd2hpY2ggYXJlIHRoZW4gZmlsbGVkLiAgQWRkaXRpb25hbGx5LCB0aGlzIHBhc3MgICAgICAgICAqLwotICAvKiAgICAgICBwZXJmb3JtcyBkcm9wLW91dCBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIG91dGxpbmUgZGF0YSBpcyBwYXJzZWQgZHVyaW5nIHN0ZXAgMSBvbmx5LiAgVGhlIHByb2ZpbGVzIGFyZSAgICAqLwotICAvKiAgIGJ1aWx0IGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgcmVuZGVyIHBvb2wsIHVzZWQgYXMgYSBzdGFjay4gIFRoZSAgICAgKi8KLSAgLyogICBmb2xsb3dpbmcgZ3JhcGhpY3Mgc2hvd3MgdGhlIHByb2ZpbGUgbGlzdCB1bmRlciBjb25zdHJ1Y3Rpb246ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBfIF8gICAgKi8KLSAgLyogICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICovCi0gIC8qICAgIHwgcHJvZmlsZSB8IGNvb3JkaW5hdGVzIGZvciB8IHByb2ZpbGUgfCBjb29yZGluYXRlcyBmb3IgfC0tPiAgICAgICAqLwotICAvKiAgICB8ICAgIDEgICAgfCAgcHJvZmlsZSAxICAgICAgfCAgICAyICAgIHwgIHByb2ZpbGUgMiAgICAgIHwtLT4gICAgICAgKi8KLSAgLyogICAgfF9fX19fX19fX3xfX19fX19fX19fX19fX19fX3xfX19fX19fX198X19fX19fX19fX19fX19fX198X18gXyBfICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgKi8KLSAgLyogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICovCi0gIC8qIHN0YXJ0IG9mIHJlbmRlciBwb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgdG9wIG9mIHRoZSBwcm9maWxlIHN0YWNrIGlzIGtlcHQgaW4gdGhlIGB0b3AnIHZhcmlhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFzIHlvdSBjYW4gc2VlLCBhIHByb2ZpbGUgcmVjb3JkIGlzIHB1c2hlZCBvbiB0b3Agb2YgdGhlIHJlbmRlciAgICAgKi8KLSAgLyogICBwb29sLCB3aGljaCBpcyB0aGVuIGZvbGxvd2VkIGJ5IGl0cyBjb29yZGluYXRlcy9pbnRlcnNlY3Rpb25zLiAgSWYgICovCi0gIC8qICAgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uIGlzIGRldGVjdGVkIGluIHRoZSBvdXRsaW5lLCBhIG5ldyBwcm9maWxlIGlzICAqLwotICAvKiAgIGdlbmVyYXRlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHdoZW4gYWxsIHByb2ZpbGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIHRoZSBmdW5jdGlvbiAgICAgICAqLwotICAvKiAgIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUoKSBpcyB1c2VkIHRvIHJlY29yZCwgZm9yIGVhY2ggcHJvZmlsZSwgaXRzICAgKi8KLSAgLyogICBib3R0b20tbW9zdCBzY2FubGluZSBhcyB3ZWxsIGFzIHRoZSBzY2FubGluZSBhYm92ZSBpdHMgdXBtb3N0ICAgICAgICovCi0gIC8qICAgYm91bmRhcnkuICBUaGVzZSBwb3NpdGlvbnMgYXJlIGNhbGxlZCBgeS10dXJucycgYmVjYXVzZSB0aGV5IChzb3J0ICAqLwotICAvKiAgIG9mKSBjb3JyZXNwb25kIHRvIGxvY2FsIGV4dHJlbWEuICBUaGV5IGFyZSBzdG9yZWQgaW4gYSBzb3J0ZWQgbGlzdCAgKi8KLSAgLyogICBidWlsdCBmcm9tIHRoZSB0b3Agb2YgdGhlIHJlbmRlciBwb29sIGFzIGEgZG93bndhcmRzIHN0YWNrOiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIF8gXyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIDwtLXwgc29ydGVkIGxpc3Qgb2YgICAgIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICA8LS18ICBleHRyZW1hIHNjYW5saW5lcyB8ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBfIF8gX19fX19fX19fX19fX19fX19ffF9fX19fX19fX19fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJ1ZmYgICAgICAgICAgIHNpemVCdWZmID0gZW5kIG9mIHBvb2wgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIGxpc3QgaXMgbGF0ZXIgdXNlZCBkdXJpbmcgdGhlIHN3ZWVwIHBoYXNlIGluIG9yZGVyIHRvICAgICAgICAgICovCi0gIC8qICAgb3B0aW1pemUgcGVyZm9ybWFuY2UgKHNlZSB0ZWNobmljYWwgbm90ZSBvbiB0aGUgc3dlZXAgYmVsb3cpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBPZiBjb3Vyc2UsIHRoZSByYXN0ZXIgZGV0ZWN0cyB3aGV0aGVyIHRoZSB0d28gc3RhY2tzIGNvbGxpZGUgYW5kICAgICovCi0gIC8qICAgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHByb3Blcmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBIHNpbXBsZSB0ZWNobmljYWwgbm90ZSBvbiBob3cgdGhlIHJhc3RlciB3b3JrcworICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgKgorICAgKiAgIENvbnZlcnRpbmcgYW4gb3V0bGluZSBpbnRvIGEgYml0bWFwIGlzIGFjaGlldmVkIGluIHNldmVyYWwgc3RlcHM6CisgICAqCisgICAqICAgMSAtIERlY29tcG9zaW5nIHRoZSBvdXRsaW5lIGludG8gc3VjY2Vzc2l2ZSBgcHJvZmlsZXMnLiAgRWFjaAorICAgKiAgICAgICBwcm9maWxlIGlzIHNpbXBseSBhbiBhcnJheSBvZiBzY2FubGluZSBpbnRlcnNlY3Rpb25zIG9uIGEgZ2l2ZW4KKyAgICogICAgICAgZGltZW5zaW9uLiAgQSBwcm9maWxlJ3MgbWFpbiBhdHRyaWJ1dGVzIGFyZQorICAgKgorICAgKiAgICAgICBvIGl0cyBzY2FubGluZSBwb3NpdGlvbiBib3VuZGFyaWVzLCBpLmUuIGBZbWluJyBhbmQgYFltYXgnCisgICAqCisgICAqICAgICAgIG8gYW4gYXJyYXkgb2YgaW50ZXJzZWN0aW9uIGNvb3JkaW5hdGVzIGZvciBlYWNoIHNjYW5saW5lCisgICAqICAgICAgICAgYmV0d2VlbiBgWW1pbicgYW5kIGBZbWF4JworICAgKgorICAgKiAgICAgICBvIGEgZGlyZWN0aW9uLCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgd2FzIGJ1aWx0IGdvaW5nIGB1cCcgb3IKKyAgICogICAgICAgICBgZG93bicsIGFzIHRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIGZpbGxpbmcgcnVsZXMKKyAgICoKKyAgICogICAgICAgbyBpdHMgZHJvcC1vdXQgbW9kZQorICAgKgorICAgKiAgIDIgLSBTd2VlcGluZyB0aGUgdGFyZ2V0IG1hcCdzIHNjYW5saW5lcyBpbiBvcmRlciB0byBjb21wdXRlIHNlZ21lbnQKKyAgICogICAgICAgYHNwYW5zJyB3aGljaCBhcmUgdGhlbiBmaWxsZWQuICBBZGRpdGlvbmFsbHksIHRoaXMgcGFzcworICAgKiAgICAgICBwZXJmb3JtcyBkcm9wLW91dCBjb250cm9sLgorICAgKgorICAgKiAgIFRoZSBvdXRsaW5lIGRhdGEgaXMgcGFyc2VkIGR1cmluZyBzdGVwIDEgb25seS4gIFRoZSBwcm9maWxlcyBhcmUKKyAgICogICBidWlsdCBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHJlbmRlciBwb29sLCB1c2VkIGFzIGEgc3RhY2suICBUaGUKKyAgICogICBmb2xsb3dpbmcgZ3JhcGhpY3Mgc2hvd3MgdGhlIHByb2ZpbGUgbGlzdCB1bmRlciBjb25zdHJ1Y3Rpb246CisgICAqCisgICAqICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gXyBfCisgICAqICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgICAqICAgfCBwcm9maWxlIHwgY29vcmRpbmF0ZXMgZm9yIHwgcHJvZmlsZSB8IGNvb3JkaW5hdGVzIGZvciB8LS0+CisgICAqICAgfCAgICAxICAgIHwgIHByb2ZpbGUgMSAgICAgIHwgICAgMiAgICB8ICBwcm9maWxlIDIgICAgICB8LS0+CisgICAqICAgfF9fX19fX19fX3xfX19fX19fX19fX19fX19fX3xfX19fX19fX198X19fX19fX19fX19fX19fX198X18gXyBfCisgICAqCisgICAqICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAqICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAqIHN0YXJ0IG9mIHJlbmRlciBwb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AKKyAgICoKKyAgICogICBUaGUgdG9wIG9mIHRoZSBwcm9maWxlIHN0YWNrIGlzIGtlcHQgaW4gdGhlIGB0b3AnIHZhcmlhYmxlLgorICAgKgorICAgKiAgIEFzIHlvdSBjYW4gc2VlLCBhIHByb2ZpbGUgcmVjb3JkIGlzIHB1c2hlZCBvbiB0b3Agb2YgdGhlIHJlbmRlcgorICAgKiAgIHBvb2wsIHdoaWNoIGlzIHRoZW4gZm9sbG93ZWQgYnkgaXRzIGNvb3JkaW5hdGVzL2ludGVyc2VjdGlvbnMuICBJZgorICAgKiAgIGEgY2hhbmdlIG9mIGRpcmVjdGlvbiBpcyBkZXRlY3RlZCBpbiB0aGUgb3V0bGluZSwgYSBuZXcgcHJvZmlsZSBpcworICAgKiAgIGdlbmVyYXRlZCB1bnRpbCB0aGUgZW5kIG9mIHRoZSBvdXRsaW5lLgorICAgKgorICAgKiAgIE5vdGUgdGhhdCB3aGVuIGFsbCBwcm9maWxlcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLCB0aGUgZnVuY3Rpb24KKyAgICogICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlKCkgaXMgdXNlZCB0byByZWNvcmQsIGZvciBlYWNoIHByb2ZpbGUsIGl0cworICAgKiAgIGJvdHRvbS1tb3N0IHNjYW5saW5lIGFzIHdlbGwgYXMgdGhlIHNjYW5saW5lIGFib3ZlIGl0cyB1cG1vc3QKKyAgICogICBib3VuZGFyeS4gIFRoZXNlIHBvc2l0aW9ucyBhcmUgY2FsbGVkIGB5LXR1cm5zJyBiZWNhdXNlIHRoZXkgKHNvcnQKKyAgICogICBvZikgY29ycmVzcG9uZCB0byBsb2NhbCBleHRyZW1hLiAgVGhleSBhcmUgc3RvcmVkIGluIGEgc29ydGVkIGxpc3QKKyAgICogICBidWlsdCBmcm9tIHRoZSB0b3Agb2YgdGhlIHJlbmRlciBwb29sIGFzIGEgZG93bndhcmRzIHN0YWNrOgorICAgKgorICAgKiAgICAgXyBfIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwKKyAgICogICAgICAgICAgICAgICAgICAgICAgICA8LS18IHNvcnRlZCBsaXN0IG9mICAgICB8CisgICAqICAgICAgICAgICAgICAgICAgICAgICAgPC0tfCAgZXh0cmVtYSBzY2FubGluZXMgfAorICAgKiAgICAgXyBfIF9fX19fX19fX19fX19fX19fX3xfX19fX19fX19fX19fX19fX19fX3wKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICBeCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmICAgICAgICAgICBzaXplQnVmZiA9IGVuZCBvZiBwb29sCisgICAqCisgICAqICAgVGhpcyBsaXN0IGlzIGxhdGVyIHVzZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBpbiBvcmRlciB0bworICAgKiAgIG9wdGltaXplIHBlcmZvcm1hbmNlIChzZWUgdGVjaG5pY2FsIG5vdGUgb24gdGhlIHN3ZWVwIGJlbG93KS4KKyAgICoKKyAgICogICBPZiBjb3Vyc2UsIHRoZSByYXN0ZXIgZGV0ZWN0cyB3aGV0aGVyIHRoZSB0d28gc3RhY2tzIGNvbGxpZGUgYW5kCisgICAqICAgaGFuZGxlcyB0aGUgc2l0dWF0aW9uIHByb3Blcmx5LgorICAgKgorICAgKi8KIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTYzLDE0ICsxNjEsMTQgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYXN0ZXIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICByYXN0ZXIKIAogCiAjaWZkZWYgU1RBTkRBTE9ORV8KQEAgLTIyNyw4ICsyMjUsOCBAQAogI2Vsc2UgLyogIVNUQU5EQUxPTkVfICovCiAKIAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgIC8qIGZvciBGVF9UUkFDRSwgRlRfRVJST1IsIGFuZCBGVF9USFJPVyAqLworI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4gLyogZm9yIEZUX1RSQUNFLCBGVF9FUlJPUiwgYW5kIEZUX1RIUk9XICovCiAKICNpbmNsdWRlICJyYXN0ZXJycy5oIgogCkBAIC00MDAsNyArMzk4LDcgQEAKIAogCiAjZGVmaW5lIFJBU19BUkdTICAgICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgUkFTX0FSRyAgICAgICAgLyogdm9pZCAqLworI2RlZmluZSBSQVNfQVJHICAgICAgICB2b2lkCiAKICNkZWZpbmUgUkFTX1ZBUlMgICAgICAgLyogdm9pZCAqLwogI2RlZmluZSBSQVNfVkFSICAgICAgICAvKiB2b2lkICovCkBAIC00NTIsMTUgKzQ1MCwyMCBAQAogI2RlZmluZSBDRUlMSU5HKCB4ICkgICggKCAoeCkgKyByYXMucHJlY2lzaW9uIC0gMSApICYgLXJhcy5wcmVjaXNpb24gKQogI2RlZmluZSBUUlVOQyggeCApICAgICggKExvbmcpKHgpID4+IHJhcy5wcmVjaXNpb25fYml0cyApCiAjZGVmaW5lIEZSQUMoIHggKSAgICAgKCAoeCkgJiAoIHJhcy5wcmVjaXNpb24gLSAxICkgKQotI2RlZmluZSBTQ0FMRUQoIHggKSAgICggKCAoeCkgPCAwID8gLSggLSh4KSA8PCByYXMuc2NhbGVfc2hpZnQgKSAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAoICAoeCkgPDwgcmFzLnNjYWxlX3NoaWZ0ICkgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHJhcy5wcmVjaXNpb25faGFsZiApCisKKyAgLyogc2NhbGUgYW5kIHNoaWZ0IGdyaWQgdG8gcGl4ZWwgY2VudGVycyAqLworI2RlZmluZSBTQ0FMRUQoIHggKSAgICggKHgpICogcmFzLnByZWNpc2lvbl9zY2FsZSAtIHJhcy5wcmVjaXNpb25faGFsZiApCiAKICNkZWZpbmUgSVNfQk9UVE9NX09WRVJTSE9PVCggeCApIFwKICAgICAgICAgICAoQm9vbCkoIENFSUxJTkcoIHggKSAtIHggPj0gcmFzLnByZWNpc2lvbl9oYWxmICkKICNkZWZpbmUgSVNfVE9QX09WRVJTSE9PVCggeCApICAgIFwKICAgICAgICAgICAoQm9vbCkoIHggLSBGTE9PUiggeCApID49IHJhcy5wcmVjaXNpb25faGFsZiApCiAKKyAgLyogU21hcnQgZHJvcG91dCByb3VuZGluZyB0byBmaW5kIHdoaWNoIHBpeGVsIGlzIGNsb3NlciB0byBzcGFuIGVuZHMuICovCisgIC8qIFRvIG1pbWljayBXaW5kb3dzLCBzeW1tZXRyaWMgY2FzZXMgYnJlYWsgZG93biBpbmRlcGVuZW50bHkgb2YgdGhlICAqLworICAvKiBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU01BUlQoIHAsIHEgKSAgRkxPT1IoICggKHApICsgKHEpICsgcmFzLnByZWNpc2lvbiAqIDYzIC8gNjQgKSA+PiAxICkKKwogI2lmIEZUX1JFTkRFUl9QT09MX1NJWkUgPiAyMDQ4CiAjZGVmaW5lIEZUX01BWF9CTEFDS19QT09MICAoIEZUX1JFTkRFUl9QT09MX1NJWkUgLyBzaXplb2YgKCBMb25nICkgKQogI2Vsc2UKQEAgLTQ3NiwxMyArNDc5LDEwIEBACiAgICAgSW50ICAgICAgICAgcHJlY2lzaW9uX2JpdHM7ICAgICAvKiBwcmVjaXNpb24gcmVsYXRlZCB2YXJpYWJsZXMgICAgICAgICAqLwogICAgIEludCAgICAgICAgIHByZWNpc2lvbjsKICAgICBJbnQgICAgICAgICBwcmVjaXNpb25faGFsZjsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25fc2hpZnQ7CisgICAgSW50ICAgICAgICAgcHJlY2lzaW9uX3NjYWxlOwogICAgIEludCAgICAgICAgIHByZWNpc2lvbl9zdGVwOwogICAgIEludCAgICAgICAgIHByZWNpc2lvbl9qaXR0ZXI7CiAKLSAgICBJbnQgICAgICAgICBzY2FsZV9zaGlmdDsgICAgICAgIC8qID09IHByZWNpc2lvbl9zaGlmdCAgIGZvciBiaXRtYXBzICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA9PSBwcmVjaXNpb25fc2hpZnQrMSBmb3IgcGl4bWFwcyAgICAqLwotCiAgICAgUExvbmcgICAgICAgYnVmZjsgICAgICAgICAgICAgICAvKiBUaGUgcHJvZmlsZXMgYnVmZmVyICAgICAgICAgICAgICAgICAqLwogICAgIFBMb25nICAgICAgIHNpemVCdWZmOyAgICAgICAgICAgLyogUmVuZGVyIHBvb2wgc2l6ZSAgICAgICAgICAgICAgICAgICAgKi8KICAgICBQTG9uZyAgICAgICBtYXhCdWZmOyAgICAgICAgICAgIC8qIFByb2ZpbGVzIGJ1ZmZlciBzaXplICAgICAgICAgICAgICAgICovCkBAIC00OTUsOCArNDk1LDcgQEAKICAgICBUUG9pbnQqICAgICBhcmM7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgQmV6aWVyIGFyYyBwb2ludGVyICAgICAgICAgICovCiAKICAgICBVU2hvcnQgICAgICBiV2lkdGg7ICAgICAgICAgICAgIC8qIHRhcmdldCBiaXRtYXAgd2lkdGggICAgICAgICAgICAgICAgICovCi0gICAgUEJ5dGUgICAgICAgYlRhcmdldDsgICAgICAgICAgICAvKiB0YXJnZXQgYml0bWFwIGJ1ZmZlciAgICAgICAgICAgICAgICAqLwotICAgIFBCeXRlICAgICAgIGdUYXJnZXQ7ICAgICAgICAgICAgLyogdGFyZ2V0IHBpeG1hcCBidWZmZXIgICAgICAgICAgICAgICAgKi8KKyAgICBQQnl0ZSAgICAgICBiT3JpZ2luOyAgICAgICAgICAgIC8qIHRhcmdldCBiaXRtYXAgYm90dG9tLWxlZnQgb3JpZ2luICAgICovCiAKICAgICBMb25nICAgICAgICBsYXN0WCwgbGFzdFk7CiAgICAgTG9uZyAgICAgICAgbWluWSwgbWF4WTsKQEAgLTUxOSw4ICs1MTgsNiBAQAogICAgIEZUX091dGxpbmUgIG91dGxpbmU7CiAKICAgICBMb25nICAgICAgICB0cmFjZU9mczsgICAgICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGluIHRhcmdldCBiaXRtYXAgICAgICovCi0gICAgTG9uZyAgICAgICAgdHJhY2VHOyAgICAgICAgICAgICAvKiBjdXJyZW50IG9mZnNldCBpbiB0YXJnZXQgcGl4bWFwICAgICAqLwotCiAgICAgU2hvcnQgICAgICAgdHJhY2VJbmNyOyAgICAgICAgICAvKiBzd2VlcCdzIGluY3JlbWVudCBpbiB0YXJnZXQgYml0bWFwICAqLwogCiAgICAgLyogZGlzcGF0Y2ggdmFyaWFibGVzICovCkBAIC01NTMsOCArNTUwLDcgQEAKIAogI2lmZGVmIEZUX1NUQVRJQ19SQVNURVIKIAotICBzdGF0aWMgYmxhY2tfVFdvcmtlciAgY3VyX3JhczsKLSNkZWZpbmUgcmFzICBjdXJfcmFzCisgIHN0YXRpYyBibGFja19UV29ya2VyICByYXM7CiAKICNlbHNlIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCiAKQEAgLTU3MiwxOCArNTY4LDE5IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0X0hpZ2hfUHJlY2lzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHByZWNpc2lvbiB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHBhcmFtIGZsYWcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGlnaCA6OiBTZXQgdG8gVHJ1ZSBmb3IgaGlnaCBwcmVjaXNpb24gKHR5cGljYWxseSBmb3IgcHBlbSA8IDI0KSwgICovCi0gIC8qICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBTZXRfSGlnaF9QcmVjaXNpb24KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFNldCBwcmVjaXNpb24gdmFyaWFibGVzIGFjY29yZGluZyB0byBwYXJhbSBmbGFnLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgSGlnaCA6OgorICAgKiAgICAgU2V0IHRvIFRydWUgZm9yIGhpZ2ggcHJlY2lzaW9uICh0eXBpY2FsbHkgZm9yIHBwZW0gPCAyNCksCisgICAqICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAqLwogICBzdGF0aWMgdm9pZAogICBTZXRfSGlnaF9QcmVjaXNpb24oIFJBU19BUkdTIEludCAgSGlnaCApCiAgIHsKQEAgLTYyNSwyOSArNjIyLDMxIEBACiAgICAgRlRfVFJBQ0U2KCggIlNldF9IaWdoX1ByZWNpc2lvbiglcylcbiIsIEhpZ2ggPyAidHJ1ZSIgOiAiZmFsc2UiICkpOwogCiAgICAgcmFzLnByZWNpc2lvbiAgICAgICA9IDEgPDwgcmFzLnByZWNpc2lvbl9iaXRzOwotICAgIHJhcy5wcmVjaXNpb25faGFsZiAgPSByYXMucHJlY2lzaW9uIC8gMjsKLSAgICByYXMucHJlY2lzaW9uX3NoaWZ0ID0gcmFzLnByZWNpc2lvbl9iaXRzIC0gUGl4ZWxfQml0czsKKyAgICByYXMucHJlY2lzaW9uX2hhbGYgID0gcmFzLnByZWNpc2lvbiA+PiAxOworICAgIHJhcy5wcmVjaXNpb25fc2NhbGUgPSByYXMucHJlY2lzaW9uID4+IFBpeGVsX0JpdHM7CiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ld19Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIG5ldyBwcm9maWxlIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFTdGF0ZSAgICA6OiBUaGUgc3RhdGUvb3JpZW50YXRpb24gb2YgdGhlIG5ldyBwcm9maWxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3ZlcnNob290IDo6IFdoZXRoZXIgdGhlIHByb2ZpbGUncyB1bnJvdW5kZWQgc3RhcnQgcG9zaXRpb24gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBkaWZmZXJzIGJ5IGF0IGxlYXN0IGEgaGFsZiBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU1VDQ0VTUyBvbiBzdWNjZXNzLiAgRkFJTFVSRSBpbiBjYXNlIG9mIG92ZXJmbG93IG9yIG9mIGluY29oZXJlbnQgICAqLwotICAvKiAgIHByb2ZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgTmV3X1Byb2ZpbGUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENyZWF0ZSBhIG5ldyBwcm9maWxlIGluIHRoZSByZW5kZXIgcG9vbC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGFTdGF0ZSA6OgorICAgKiAgICAgVGhlIHN0YXRlL29yaWVudGF0aW9uIG9mIHRoZSBuZXcgcHJvZmlsZS4KKyAgICoKKyAgICogICBvdmVyc2hvb3QgOjoKKyAgICogICAgIFdoZXRoZXIgdGhlIHByb2ZpbGUncyB1bnJvdW5kZWQgc3RhcnQgcG9zaXRpb24KKyAgICogICAgIGRpZmZlcnMgYnkgYXQgbGVhc3QgYSBoYWxmIHBpeGVsLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgU1VDQ0VTUyBvbiBzdWNjZXNzLiAgRkFJTFVSRSBpbiBjYXNlIG9mIG92ZXJmbG93IG9yIG9mIGluY29oZXJlbnQKKyAgICogIHByb2ZpbGUuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBOZXdfUHJvZmlsZSggUkFTX0FSR1MgVFN0YXRlcyAgYVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCAgICAgb3ZlcnNob290ICkKQEAgLTY2NSw3ICs2NjQsNiBAQAogICAgICAgcmV0dXJuIEZBSUxVUkU7CiAgICAgfQogCi0gICAgcmFzLmNQcm9maWxlLT5mbGFncyAgPSAwOwogICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgID0gMDsKICAgICByYXMuY1Byb2ZpbGUtPmhlaWdodCA9IDA7CiAgICAgcmFzLmNQcm9maWxlLT5vZmZzZXQgPSByYXMudG9wOwpAQCAtNjgwLDEzICs2NzgsMTMgQEAKICAgICAgIGlmICggb3ZlcnNob290ICkKICAgICAgICAgcmFzLmNQcm9maWxlLT5mbGFncyB8PSBPdmVyc2hvb3RfQm90dG9tOwogCi0gICAgICBGVF9UUkFDRTYoKCAiICBuZXcgYXNjZW5kaW5nIHByb2ZpbGUgPSAlcFxuIiwgcmFzLmNQcm9maWxlICkpOworICAgICAgRlRfVFJBQ0U2KCggIiAgbmV3IGFzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsICh2b2lkICopcmFzLmNQcm9maWxlICkpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIERlc2NlbmRpbmdfU3RhdGU6CiAgICAgICBpZiAoIG92ZXJzaG9vdCApCiAgICAgICAgIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgfD0gT3ZlcnNob290X1RvcDsKLSAgICAgIEZUX1RSQUNFNigoICIgIG5ldyBkZXNjZW5kaW5nIHByb2ZpbGUgPSAlcFxuIiwgcmFzLmNQcm9maWxlICkpOworICAgICAgRlRfVFJBQ0U2KCggIiAgbmV3IGRlc2NlbmRpbmcgcHJvZmlsZSA9ICVwXG4iLCAodm9pZCAqKXJhcy5jUHJvZmlsZSApKTsKICAgICAgIGJyZWFrOwogCiAgICAgZGVmYXVsdDoKQEAgLTcwNiwyMSArNzA0LDIyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVuZF9Qcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplIHRoZSBjdXJyZW50IHByb2ZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG92ZXJzaG9vdCA6OiBXaGV0aGVyIHRoZSBwcm9maWxlJ3MgdW5yb3VuZGVkIGVuZCBwb3NpdGlvbiBkaWZmZXJzICAqLwotICAvKiAgICAgICAgICAgICAgICAgYnkgYXQgbGVhc3QgYSBoYWxmIHBpeGVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb3IgaW5jb2hlcmVuY3kuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgRW5kX1Byb2ZpbGUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZpbmFsaXplIHRoZSBjdXJyZW50IHByb2ZpbGUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBvdmVyc2hvb3QgOjoKKyAgICogICAgIFdoZXRoZXIgdGhlIHByb2ZpbGUncyB1bnJvdW5kZWQgZW5kIHBvc2l0aW9uIGRpZmZlcnMKKyAgICogICAgIGJ5IGF0IGxlYXN0IGEgaGFsZiBwaXhlbC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgb3IgaW5jb2hlcmVuY3kuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBFbmRfUHJvZmlsZSggUkFTX0FSR1MgQm9vbCAgb3ZlcnNob290ICkKICAgewpAQCAtNzQyLDcgKzc0MSw3IEBACiAKIAogICAgICAgRlRfVFJBQ0U2KCggIiAgZW5kaW5nIHByb2ZpbGUgJXAsIHN0YXJ0ID0gJWxkLCBoZWlnaHQgPSAlbGRcbiIsCi0gICAgICAgICAgICAgICAgICByYXMuY1Byb2ZpbGUsIHJhcy5jUHJvZmlsZS0+c3RhcnQsIGggKSk7CisgICAgICAgICAgICAgICAgICAodm9pZCAqKXJhcy5jUHJvZmlsZSwgcmFzLmNQcm9maWxlLT5zdGFydCwgaCApKTsKIAogICAgICAgcmFzLmNQcm9maWxlLT5oZWlnaHQgPSBoOwogICAgICAgaWYgKCBvdmVyc2hvb3QgKQpAQCAtNzc4LDIxICs3NzcsMjEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0X1lfVHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0IGEgc2FsaWVudCBpbnRvIHRoZSBzb3J0ZWQgbGlzdCBwbGFjZWQgb24gdG9wIG9mIHRoZSByZW5kZXIgICovCi0gIC8qICAgIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ldyB5IHNjYW5saW5lIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBJbnNlcnRfWV9UdXJuCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbnNlcnQgYSBzYWxpZW50IGludG8gdGhlIHNvcnRlZCBsaXN0IHBsYWNlZCBvbiB0b3Agb2YgdGhlIHJlbmRlcgorICAgKiAgIHBvb2wuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBOZXcgeSBzY2FubGluZSBwb3NpdGlvbi4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBJbnNlcnRfWV9UdXJuKCBSQVNfQVJHUyBJbnQgIHkgKQogICB7CkBAIC04MzQsMTcgKzgzMywxNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGp1c3QgYWxsIGxpbmtzIGluIHRoZSBwcm9maWxlcyBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgRmluYWxpemVfUHJvZmlsZV9UYWJsZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQWRqdXN0IGFsbCBsaW5rcyBpbiB0aGUgcHJvZmlsZXMgbGlzdC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBTVUNDRVNTIG9uIHN1Y2Nlc3MuICBGQUlMVVJFIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBGaW5hbGl6ZV9Qcm9maWxlX1RhYmxlKCBSQVNfQVJHICkKICAgewpAQCAtODk0LDIyICs4OTMsMjIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3BsaXRfQ29uaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3ViZGl2aWRlIG9uZSBjb25pYyBCZXppZXIgaW50byB0d28gam9pbnQgc3ViLWFyY3MgaW4gdGhlIEJlemllciAgICovCi0gIC8qICAgIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vbmUgKHN1YmRpdmlkZWQgQmV6aWVyIGlzIHRha2VuIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2spLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgcm91dGluZSBpcyB0aGUgYGJlZWYnIG9mIHRoaXMgY29tcG9uZW50LiAgSXQgaXMgIF90aGVfIGlubmVyICAqLwotICAvKiAgICBsb29wIHRoYXQgc2hvdWxkIGJlIG9wdGltaXplZCB0byBoZWxsIHRvIGdldCB0aGUgYmVzdCBwZXJmb3JtYW5jZS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgU3BsaXRfQ29uaWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFN1YmRpdmlkZSBvbmUgY29uaWMgQmV6aWVyIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluIHRoZSBCZXppZXIKKyAgICogICBzdGFjay4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIE5vbmUgKHN1YmRpdmlkZWQgQmV6aWVyIGlzIHRha2VuIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2spLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGlzIHJvdXRpbmUgaXMgdGhlIGBiZWVmJyBvZiB0aGlzIGNvbXBvbmVudC4gIEl0IGlzICBfdGhlXyBpbm5lcgorICAgKiAgIGxvb3AgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGhlbGwgdG8gZ2V0IHRoZSBiZXN0IHBlcmZvcm1hbmNlLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgU3BsaXRfQ29uaWMoIFRQb2ludCogIGJhc2UgKQogICB7CkBAIC05MTcsODkgKzkxNiwxMDEgQEAKIAogCiAgICAgYmFzZVs0XS54ID0gYmFzZVsyXS54OwotICAgIGIgPSBiYXNlWzFdLng7Ci0gICAgYSA9IGJhc2VbM10ueCA9ICggYmFzZVsyXS54ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS54ID0gKCBiYXNlWzBdLnggKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7CisgICAgYSA9IGJhc2VbMF0ueCArIGJhc2VbMV0ueDsKKyAgICBiID0gYmFzZVsxXS54ICsgYmFzZVsyXS54OworICAgIGJhc2VbM10ueCA9IGIgPj4gMTsKKyAgICBiYXNlWzJdLnggPSAoIGEgKyBiICkgPj4gMjsKKyAgICBiYXNlWzFdLnggPSBhID4+IDE7CiAKICAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7Ci0gICAgYiA9IGJhc2VbMV0ueTsKLSAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnkgPSAoIGJhc2VbMF0ueSArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gKCBhICsgYiApIC8gMjsKKyAgICBhID0gYmFzZVswXS55ICsgYmFzZVsxXS55OworICAgIGIgPSBiYXNlWzFdLnkgKyBiYXNlWzJdLnk7CisgICAgYmFzZVszXS55ID0gYiA+PiAxOworICAgIGJhc2VbMl0ueSA9ICggYSArIGIgKSA+PiAyOworICAgIGJhc2VbMV0ueSA9IGEgPj4gMTsKIAogICAgIC8qIGhhbmQgb3B0aW1pemVkLiAgZ2NjIGRvZXNuJ3Qgc2VlbSB0byBiZSB0b28gZ29vZCBhdCBjb21tb24gICAgICAqLwogICAgIC8qIGV4cHJlc3Npb24gc3Vic3RpdHV0aW9uIGFuZCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIDstKSAgICAgICAgICAqLwogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9DdWJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGUgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluIHRoZSAgKi8KLSAgLyogICAgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhlIGNvbXBvbmVudC4gIEl0IGlzIG9uZSBvZiBfdGhlXyAgICovCi0gIC8qICAgIGlubmVyIGxvb3BzIHRoYXQgc2hvdWxkIGJlIG9wdGltaXplZCBsaWtlIGhlbGwgdG8gZ2V0IHRoZSBiZXN0ICAgICAqLwotICAvKiAgICBwZXJmb3JtYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgU3BsaXRfQ3ViaWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFN1YmRpdmlkZSBhIHRoaXJkLW9yZGVyIEJlemllciBhcmMgaW50byB0d28gam9pbnQgc3ViLWFyY3MgaW4gdGhlCisgICAqICAgQmV6aWVyIHN0YWNrLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGlzIHJvdXRpbmUgaXMgdGhlIGBiZWVmJyBvZiB0aGUgY29tcG9uZW50LiAgSXQgaXMgb25lIG9mIF90aGVfCisgICAqICAgaW5uZXIgbG9vcHMgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIGxpa2UgaGVsbCB0byBnZXQgdGhlIGJlc3QKKyAgICogICBwZXJmb3JtYW5jZS4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIFNwbGl0X0N1YmljKCBUUG9pbnQqICBiYXNlICkKICAgewotICAgIExvbmcgIGEsIGIsIGMsIGQ7CisgICAgTG9uZyAgYSwgYiwgYzsKIAogCiAgICAgYmFzZVs2XS54ID0gYmFzZVszXS54OwotICAgIGMgPSBiYXNlWzFdLng7Ci0gICAgZCA9IGJhc2VbMl0ueDsKLSAgICBiYXNlWzFdLnggPSBhID0gKCBiYXNlWzBdLnggKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCArIDEgKSA+PiAxOwotICAgIGMgPSAoIGMgKyBkICsgMSApID4+IDE7Ci0gICAgYmFzZVsyXS54ID0gYSA9ICggYSArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbM10ueCA9ICggYSArIGIgKyAxICkgPj4gMTsKKyAgICBhID0gYmFzZVswXS54ICsgYmFzZVsxXS54OworICAgIGIgPSBiYXNlWzFdLnggKyBiYXNlWzJdLng7CisgICAgYyA9IGJhc2VbMl0ueCArIGJhc2VbM10ueDsKKyAgICBiYXNlWzVdLnggPSBjID4+IDE7CisgICAgYyArPSBiOworICAgIGJhc2VbNF0ueCA9IGMgPj4gMjsKKyAgICBiYXNlWzFdLnggPSBhID4+IDE7CisgICAgYSArPSBiOworICAgIGJhc2VbMl0ueCA9IGEgPj4gMjsKKyAgICBiYXNlWzNdLnggPSAoIGEgKyBjICkgPj4gMzsKIAogICAgIGJhc2VbNl0ueSA9IGJhc2VbM10ueTsKLSAgICBjID0gYmFzZVsxXS55OwotICAgIGQgPSBiYXNlWzJdLnk7Ci0gICAgYmFzZVsxXS55ID0gYSA9ICggYmFzZVswXS55ICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKyAxICkgPj4gMTsKLSAgICBjID0gKCBjICsgZCArIDEgKSA+PiAxOwotICAgIGJhc2VbMl0ueSA9IGEgPSAoIGEgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzNdLnkgPSAoIGEgKyBiICsgMSApID4+IDE7CisgICAgYSA9IGJhc2VbMF0ueSArIGJhc2VbMV0ueTsKKyAgICBiID0gYmFzZVsxXS55ICsgYmFzZVsyXS55OworICAgIGMgPSBiYXNlWzJdLnkgKyBiYXNlWzNdLnk7CisgICAgYmFzZVs1XS55ID0gYyA+PiAxOworICAgIGMgKz0gYjsKKyAgICBiYXNlWzRdLnkgPSBjID4+IDI7CisgICAgYmFzZVsxXS55ID0gYSA+PiAxOworICAgIGEgKz0gYjsKKyAgICBiYXNlWzJdLnkgPSBhID4+IDI7CisgICAgYmFzZVszXS55ID0gKCBhICsgYyApID4+IDM7CiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIGxpbmUgc2VnbWVudCBhbmQgc3RvcmUgICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4MSAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkxICAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDIgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MiAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBlbmQgcG9pbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIExpbmVfVXAKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIGxpbmUgc2VnbWVudCBhbmQgc3RvcmUKKyAgICogICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHgxIDo6CisgICAqICAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuCisgICAqCisgICAqICAgeTEgOjoKKyAgICogICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4KKyAgICoKKyAgICogICB4MiA6OgorICAgKiAgICAgVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4KKyAgICoKKyAgICogICB5MiA6OgorICAgKiAgICAgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4KKyAgICoKKyAgICogICBtaW55IDo6CisgICAqICAgICBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLgorICAgKgorICAgKiAgIG1heHkgOjoKKyAgICogICAgIEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4KKyAgICovCiAgIHN0YXRpYyBCb29sCiAgIExpbmVfVXAoIFJBU19BUkdTIExvbmcgIHgxLAogICAgICAgICAgICAgICAgICAgICBMb25nICB5MSwKQEAgLTExMTQsMzEgKzExMjUsMzcgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGluZV9Eb3duICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZSB0aGUgeC1jb29yZGluYXRlcyBvZiBhbiBkZXNjZW5kaW5nIGxpbmUgc2VnbWVudCBhbmQgc3RvcmUgICovCi0gIC8qICAgIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHgxICAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTEgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4MiAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBlbmQgcG9pbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkyICAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWlueSA6OiBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXh5IDo6IEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgTGluZV9Eb3duCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGRlc2NlbmRpbmcgbGluZSBzZWdtZW50IGFuZCBzdG9yZQorICAgKiAgIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgeDEgOjoKKyAgICogICAgIFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4KKyAgICoKKyAgICogICB5MSA6OgorICAgKiAgICAgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LgorICAgKgorICAgKiAgIHgyIDo6CisgICAqICAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LgorICAgKgorICAgKiAgIHkyIDo6CisgICAqICAgICBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LgorICAgKgorICAgKiAgIG1pbnkgOjoKKyAgICogICAgIEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuCisgICAqCisgICAqICAgbWF4eSA6OgorICAgKiAgICAgQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LgorICAgKi8KICAgc3RhdGljIEJvb2wKICAgTGluZV9Eb3duKCBSQVNfQVJHUyBMb25nICB4MSwKICAgICAgICAgICAgICAgICAgICAgICBMb25nICB5MSwKQEAgLTExNjUsMjcgKzExODIsMzEgQEAKICAgdHlwZWRlZiB2b2lkICAoKlRTcGxpdHRlcikoIFRQb2ludCogIGJhc2UgKTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlemllcl9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIEJlemllciBhcmMgYW5kIHN0b3JlICAgICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICA6OiBUaGUgZGVncmVlIG9mIHRoZSBCZXppZXIgYXJjIChlaXRoZXIgMiBvciAzKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwbGl0dGVyIDo6IFRoZSBmdW5jdGlvbiB0byBzcGxpdCBCZXppZXIgYXJjcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWlueSAgICAgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXh5ICAgICA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQmV6aWVyX1VwCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGFzY2VuZGluZyBCZXppZXIgYXJjIGFuZCBzdG9yZQorICAgKiAgIHRoZW0gaW4gdGhlIHJlbmRlciBwb29sLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGVncmVlIDo6CisgICAqICAgICBUaGUgZGVncmVlIG9mIHRoZSBCZXppZXIgYXJjIChlaXRoZXIgMiBvciAzKS4KKyAgICoKKyAgICogICBzcGxpdHRlciA6OgorICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNwbGl0IEJlemllciBhcmNzLgorICAgKgorICAgKiAgIG1pbnkgOjoKKyAgICogICAgIEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuCisgICAqCisgICAqICAgbWF4eSA6OgorICAgKiAgICAgQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LgorICAgKi8KICAgc3RhdGljIEJvb2wKICAgQmV6aWVyX1VwKCBSQVNfQVJHUyBJbnQgICAgICAgIGRlZ3JlZSwKICAgICAgICAgICAgICAgICAgICAgICBUU3BsaXR0ZXIgIHNwbGl0dGVyLApAQCAtMTI5OCwyNyArMTMxOSwzMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZXppZXJfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGRlc2NlbmRpbmcgQmV6aWVyIGFyYyBhbmQgc3RvcmUgICAgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVncmVlICAgOjogVGhlIGRlZ3JlZSBvZiB0aGUgQmV6aWVyIGFyYyAoZWl0aGVyIDIgb3IgMykuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGxpdHRlciA6OiBUaGUgZnVuY3Rpb24gdG8gc3BsaXQgQmV6aWVyIGFyY3MuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgICAgIDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSAgICAgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEJlemllcl9Eb3duCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGRlc2NlbmRpbmcgQmV6aWVyIGFyYyBhbmQgc3RvcmUKKyAgICogICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRlZ3JlZSA6OgorICAgKiAgICAgVGhlIGRlZ3JlZSBvZiB0aGUgQmV6aWVyIGFyYyAoZWl0aGVyIDIgb3IgMykuCisgICAqCisgICAqICAgc3BsaXR0ZXIgOjoKKyAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzcGxpdCBCZXppZXIgYXJjcy4KKyAgICoKKyAgICogICBtaW55IDo6CisgICAqICAgICBBIGxvd2VyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLgorICAgKgorICAgKiAgIG1heHkgOjoKKyAgICogICAgIEFuIHVwcGVyIHZlcnRpY2FsIGNsaXBwaW5nIGJvdW5kIHZhbHVlLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4KKyAgICovCiAgIHN0YXRpYyBCb29sCiAgIEJlemllcl9Eb3duKCBSQVNfQVJHUyBJbnQgICAgICAgIGRlZ3JlZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFRTcGxpdHRlciAgc3BsaXR0ZXIsCkBAIC0xMzQ3LDI1ICsxMzcyLDI3IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluamVjdCBhIG5ldyBsaW5lIHNlZ21lbnQgYW5kIGFkanVzdCB0aGUgUHJvZmlsZXMgbGlzdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIExpbmVfVG8KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluamVjdCBhIG5ldyBsaW5lIHNlZ21lbnQgYW5kIGFkanVzdCB0aGUgUHJvZmlsZXMgbGlzdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgeCA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQKKyAgICogICAgaXMgc3RvcmVkIGluIGBsYXN0WCcpLgorICAgKgorICAgKiAgeSA6OgorICAgKiAgICBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQKKyAgICogICAgaXMgc3RvcmVkIGluIGBsYXN0WScpLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93IG9yIGluY29ycmVjdAorICAgKiAgcHJvZmlsZS4KKyAgICovCiAgIHN0YXRpYyBCb29sCiAgIExpbmVfVG8oIFJBU19BUkdTIExvbmcgIHgsCiAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkgKQpAQCAtMTQ0MSwyOSArMTQ2OCwzMyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb25pY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmplY3QgYSBuZXcgY29uaWMgYXJjIGFuZCBhZGp1c3QgdGhlIHByb2ZpbGUgbGlzdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN4IDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIG5ldyBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3kgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB4ICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcyAgICovCi0gIC8qICAgICAgICAgc3RvcmVkIGluIGBsYXN0WCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB5ICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcyAgICovCi0gIC8qICAgICAgICAgc3RvcmVkIGluIGBsYXN0WScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93IG9yIGluY29ycmVjdCAgICAqLwotICAvKiAgIHByb2ZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQ29uaWNfVG8KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluamVjdCBhIG5ldyBjb25pYyBhcmMgYW5kIGFkanVzdCB0aGUgcHJvZmlsZSBsaXN0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICBjeCA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBuZXcgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogIGN5IDo6CisgICAqICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIG5ldyBjb250cm9sIHBvaW50LgorICAgKgorICAgKiAgeCA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcworICAgKiAgICBzdG9yZWQgaW4gYGxhc3RYJykuCisgICAqCisgICAqICB5IDo6CisgICAqICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzCisgICAqICAgIHN0b3JlZCBpbiBgbGFzdFknKS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QKKyAgICogIHByb2ZpbGUuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBDb25pY19UbyggUkFTX0FSR1MgTG9uZyAgY3gsCiAgICAgICAgICAgICAgICAgICAgICBMb25nICBjeSwKQEAgLTE1NTgsMzMgKzE1ODksMzkgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3ViaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5qZWN0IGEgbmV3IGN1YmljIGFyYyBhbmQgYWRqdXN0IHRoZSBwcm9maWxlIGxpc3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeDEgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZmlyc3QgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5MSA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3gyIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIHNlY29uZCBuZXcgY29udHJvbCBwb2ludC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeTIgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3Mgc2Vjb25kIG5ldyBjb250cm9sIHBvaW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHggICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcyAgKi8KLSAgLyogICAgICAgICAgc3RvcmVkIGluIGBsYXN0WCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHkgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcyAgKi8KLSAgLyogICAgICAgICAgc3RvcmVkIGluIGBsYXN0WScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cgb3IgaW5jb3JyZWN0ICAgICovCi0gIC8qICAgcHJvZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBDdWJpY19UbworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgSW5qZWN0IGEgbmV3IGN1YmljIGFyYyBhbmQgYWRqdXN0IHRoZSBwcm9maWxlIGxpc3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogIGN4MSA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogIGN5MSA6OgorICAgKiAgICBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4KKyAgICoKKyAgICogIGN4MiA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBzZWNvbmQgbmV3IGNvbnRyb2wgcG9pbnQuCisgICAqCisgICAqICBjeTIgOjoKKyAgICogICAgVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3Mgc2Vjb25kIG5ldyBjb250cm9sIHBvaW50LgorICAgKgorICAgKiAgeCA6OgorICAgKiAgICBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBlbmQgcG9pbnQgKGl0cyBzdGFydCBwb2ludCBpcworICAgKiAgICBzdG9yZWQgaW4gYGxhc3RYJykuCisgICAqCisgICAqICB5IDo6CisgICAqICAgIFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzCisgICAqICAgIHN0b3JlZCBpbiBgbGFzdFknKS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QKKyAgICogIHByb2ZpbGUuCisgICAqLwogICBzdGF0aWMgQm9vbAogICBDdWJpY19UbyggUkFTX0FSR1MgTG9uZyAgY3gxLAogICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kxLApAQCAtMTcwNSwyNyArMTc0MiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICggMCApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZWNvbXBvc2VfQ3VydmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTY2FuIHRoZSBvdXRsaW5lIGFycmF5cyBpbiBvcmRlciB0byBlbWl0IGluZGl2aWR1YWwgc2VnbWVudHMgYW5kICAgKi8KLSAgLyogICAgQmV6aWVycyBieSBjYWxsaW5nIExpbmVfVG8oKSBhbmQgQmV6aWVyX1RvKCkuICBJdCBoYW5kbGVzIGFsbCAgICAgICovCi0gIC8qICAgIHdlaXJkIGNhc2VzLCBsaWtlIHdoZW4gdGhlIGZpcnN0IHBvaW50IGlzIG9mZiB0aGUgY3VydmUsIG9yIHdoZW4gICAqLwotICAvKiAgICB0aGVyZSBhcmUgc2ltcGx5IG5vIGBvbicgcG9pbnRzIGluIHRoZSBjb250b3VyISAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaXJzdCAgIDo6IFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgcG9pbnQgaW4gdGhlIGNvbnRvdXIuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhc3QgICAgOjogVGhlIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IGluIHRoZSBjb250b3VyLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VydmUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIERlY29tcG9zZV9DdXJ2ZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgU2NhbiB0aGUgb3V0bGluZSBhcnJheXMgaW4gb3JkZXIgdG8gZW1pdCBpbmRpdmlkdWFsIHNlZ21lbnRzIGFuZAorICAgKiAgIEJlemllcnMgYnkgY2FsbGluZyBMaW5lX1RvKCkgYW5kIEJlemllcl9UbygpLiAgSXQgaGFuZGxlcyBhbGwKKyAgICogICB3ZWlyZCBjYXNlcywgbGlrZSB3aGVuIHRoZSBmaXJzdCBwb2ludCBpcyBvZmYgdGhlIGN1cnZlLCBvciB3aGVuCisgICAqICAgdGhlcmUgYXJlIHNpbXBseSBubyBgb24nIHBvaW50cyBpbiB0aGUgY29udG91ciEKKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZpcnN0IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHBvaW50IGluIHRoZSBjb250b3VyLgorICAgKgorICAgKiAgIGxhc3QgOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgY29udG91ci4KKyAgICoKKyAgICogICBmbGlwcGVkIDo6CisgICAqICAgICBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgY3VydmUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIGVycm9yLgorICAgKi8KICAgc3RhdGljIEJvb2wKICAgRGVjb21wb3NlX0N1cnZlKCBSQVNfQVJHUyBVU2hvcnQgIGZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTaG9ydCAgbGFzdCwKQEAgLTE5MzQsMjIgKzE5NzQsMjMgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydCBhIGdseXBoIGludG8gYSBzZXJpZXMgb2Ygc2VnbWVudHMgYW5kIGFyY3MgYW5kIG1ha2UgYSAgICAgICovCi0gIC8qICAgIHByb2ZpbGVzIGxpc3Qgd2l0aCB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsaXBwZWQgOjogSWYgc2V0LCBmbGlwIHRoZSBkaXJlY3Rpb24gb2YgY3VydmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBpZiBhbnkgZXJyb3Igd2FzIGVuY291bnRlcmVkIGR1cmluZyAgICAqLwotICAvKiAgICByZW5kZXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQ29udmVydF9HbHlwaAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQ29udmVydCBhIGdseXBoIGludG8gYSBzZXJpZXMgb2Ygc2VnbWVudHMgYW5kIGFyY3MgYW5kIG1ha2UgYQorICAgKiAgIHByb2ZpbGVzIGxpc3Qgd2l0aCB0aGVtLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmxpcHBlZCA6OgorICAgKiAgICAgSWYgc2V0LCBmbGlwIHRoZSBkaXJlY3Rpb24gb2YgY3VydmUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIGlmIGFueSBlcnJvciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nCisgICAqICAgcmVuZGVyaW5nLgorICAgKi8KICAgc3RhdGljIEJvb2wKICAgQ29udmVydF9HbHlwaCggUkFTX0FSR1MgSW50ICBmbGlwcGVkICkKICAgewpAQCAtMjAyOCwxMiArMjA2OSwxMiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEluaXRfTGlua2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhbiBlbXB0eSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJbml0X0xpbmtlZAorICAgKgorICAgKiAgIEluaXRpYWxpemVzIGFuIGVtcHR5IGxpbmtlZCBsaXN0LgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5pdF9MaW5rZWQoIFRQcm9maWxlTGlzdCogIGwgKQogICB7CkBAIC0yMDQxLDEyICsyMDgyLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEluc05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnRzIGEgbmV3IHByb2ZpbGUgaW4gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJbnNOZXcKKyAgICoKKyAgICogICBJbnNlcnRzIGEgbmV3IHByb2ZpbGUgaW4gYSBsaW5rZWQgbGlzdC4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc05ldyggUFByb2ZpbGVMaXN0ICBsaXN0LAogICAgICAgICAgIFBQcm9maWxlICAgICAgcHJvZmlsZSApCkBAIC0yMDcyLDEyICsyMTEzLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIERlbE9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW1vdmVzIGFuIG9sZCBwcm9maWxlIGZyb20gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWxPbGQKKyAgICoKKyAgICogICBSZW1vdmVzIGFuIG9sZCBwcm9maWxlIGZyb20gYSBsaW5rZWQgbGlzdC4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIERlbE9sZCggUFByb2ZpbGVMaXN0ICBsaXN0LAogICAgICAgICAgIFBQcm9maWxlICAgICAgcHJvZmlsZSApCkBAIC0yMTA1LDE0ICsyMTQ2LDE0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFNvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb3J0cyBhIHRyYWNlIGxpc3QuICBJbiA5NSUsIHRoZSBsaXN0IGlzIGFscmVhZHkgc29ydGVkLiAgV2UgbmVlZCAgKi8KLSAgLyogICAgYW4gYWxnb3JpdGhtIHdoaWNoIGlzIGZhc3QgaW4gdGhpcyBjYXNlLiAgQnViYmxlIHNvcnQgaXMgZW5vdWdoICAgICovCi0gIC8qICAgIGFuZCBzaW1wbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNvcnQKKyAgICoKKyAgICogICBTb3J0cyBhIHRyYWNlIGxpc3QuICBJbiA5NSUsIHRoZSBsaXN0IGlzIGFscmVhZHkgc29ydGVkLiAgV2UgbmVlZAorICAgKiAgIGFuIGFsZ29yaXRobSB3aGljaCBpcyBmYXN0IGluIHRoaXMgY2FzZS4gIEJ1YmJsZSBzb3J0IGlzIGVub3VnaAorICAgKiAgIGFuZCBzaW1wbGUuCisgICAqLwogICBzdGF0aWMgdm9pZAogICBTb3J0KCBQUHJvZmlsZUxpc3QgIGxpc3QgKQogICB7CkBAIC0yMTYzLDE0ICsyMjA0LDE0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFZlcnRpY2FsIFN3ZWVwIFByb2NlZHVyZSBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIHZlcnRpY2FsIGJsYWNrL3doaXRlIHN3ZWVwICAgKi8KLSAgLyogIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFZlcnRpY2FsIFN3ZWVwIFByb2NlZHVyZSBTZXQKKyAgICoKKyAgICogVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIHZlcnRpY2FsIGJsYWNrL3doaXRlIHN3ZWVwCisgICAqIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4KKyAgICoKKyAgICovCiAKICAgc3RhdGljIHZvaWQKICAgVmVydGljYWxfU3dlZXBfSW5pdCggUkFTX0FSR1MgU2hvcnQqICBtaW4sCkBAIC0yMTgzLDggKzIyMjQsNiBAQAogCiAgICAgcmFzLnRyYWNlSW5jciA9IChTaG9ydCktcGl0Y2g7CiAgICAgcmFzLnRyYWNlT2ZzICA9IC0qbWluICogcGl0Y2g7Ci0gICAgaWYgKCBwaXRjaCA+IDAgKQotICAgICAgcmFzLnRyYWNlT2ZzICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcGl0Y2g7CiAgIH0KIAogCkBAIC0yMjA3LDIxICsyMjQ2LDI1IEBACiAKICAgICAvKiBpbiBoaWdoLXByZWNpc2lvbiBtb2RlLCB3ZSBuZWVkIDEyIGRpZ2l0cyBhZnRlciB0aGUgY29tbWEgdG8gKi8KICAgICAvKiByZXByZXNlbnQgbXVsdGlwbGVzIG9mIDEvKDE8PDEyKSA9IDEvNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9UUkFDRTcoKCAiICB5PSVkIHg9WyUuMTJmOyUuMTJmXSwgZHJvcC1vdXQ9JWQiLAorICAgIEZUX1RSQUNFNygoICIgIHk9JWQgeD1bJSAuMTJmOyUgLjEyZl0iLAogICAgICAgICAgICAgICAgIHksCiAgICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgZHJvcE91dENvbnRyb2wgKSk7CisgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7CiAKICAgICAvKiBEcm9wLW91dCBjb250cm9sICovCiAKLSAgICBlMSA9IFRSVU5DKCBDRUlMSU5HKCB4MSApICk7CisgICAgZTEgPSBDRUlMSU5HKCB4MSApOworICAgIGUyID0gRkxPT1IoIHgyICk7CiAKKyAgICAvKiB0YWtlIGNhcmUgb2YgdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIHRoZSBsZWZ0ICovCisgICAgLyogYW5kIHJpZ2h0IGNvbnRvdXIgbGllIGV4YWN0bHkgb24gcGl4ZWwgY2VudGVycyAgICAqLwogICAgIGlmICggZHJvcE91dENvbnRyb2wgIT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHgyIC0geDEgLSByYXMucHJlY2lzaW9uIDw9IHJhcy5wcmVjaXNpb25faml0dGVyICkKKyAgICAgICAgIHgyIC0geDEgLSByYXMucHJlY2lzaW9uIDw9IHJhcy5wcmVjaXNpb25faml0dGVyICYmCisgICAgICAgICBlMSAhPSB4MSAmJiBlMiAhPSB4MiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICBlMiA9IGUxOwotICAgIGVsc2UKLSAgICAgIGUyID0gVFJVTkMoIEZMT09SKCB4MiApICk7CisKKyAgICBlMSA9IFRSVU5DKCBlMSApOworICAgIGUyID0gVFJVTkMoIGUyICk7CiAKICAgICBpZiAoIGUyID49IDAgJiYgZTEgPCByYXMuYldpZHRoICkKICAgICB7CkBAIC0yMjM0LDcgKzIyNzcsNyBAQAogICAgICAgaWYgKCBlMiA+PSByYXMuYldpZHRoICkKICAgICAgICAgZTIgPSByYXMuYldpZHRoIC0gMTsKIAotICAgICAgRlRfVFJBQ0U3KCggIiAtPiB4PVslZDslZF0iLCBlMSwgZTIgKSk7CisgICAgICBGVF9UUkFDRTcoKCAiIC0+IHg9WyVsZDslbGRdIiwgZTEsIGUyICkpOwogCiAgICAgICBjMSA9IChTaG9ydCkoIGUxID4+IDMgKTsKICAgICAgIGMyID0gKFNob3J0KSggZTIgPj4gMyApOwpAQCAtMjI0Miw3ICsyMjg1LDcgQEAKICAgICAgIGYxID0gKEJ5dGUpICAoIDB4RkYgPj4gKCBlMSAmIDcgKSApOwogICAgICAgZjIgPSAoQnl0ZSkgfiggMHg3RiA+PiAoIGUyICYgNyApICk7CiAKLSAgICAgIHRhcmdldCA9IHJhcy5iVGFyZ2V0ICsgcmFzLnRyYWNlT2ZzICsgYzE7CisgICAgICB0YXJnZXQgPSByYXMuYk9yaWdpbiArIHJhcy50cmFjZU9mcyArIGMxOwogICAgICAgYzIgLT0gYzE7CiAKICAgICAgIGlmICggYzIgPiAwICkKQEAgLTIyNTIsMTIgKzIyOTUsOSBAQAogICAgICAgICAvKiBtZW1zZXQoKSBpcyBzbG93ZXIgdGhhbiB0aGUgZm9sbG93aW5nIGNvZGUgb24gbWFueSBwbGF0Zm9ybXMuICovCiAgICAgICAgIC8qIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQsIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzLCAgKi8KICAgICAgICAgLyogdGhlIHNwYW4gbGVuZ3RoIGluIGJ5dGVzIGlzIHJlbGF0aXZlbHkgc21hbGwuICAgICAgICAgICAgICAgICAqLwotICAgICAgICBjMi0tOwotICAgICAgICB3aGlsZSAoIGMyID4gMCApCi0gICAgICAgIHsKKyAgICAgICAgd2hpbGUgKCAtLWMyID4gMCApCiAgICAgICAgICAgKigrK3RhcmdldCkgPSAweEZGOwotICAgICAgICAgIGMyLS07Ci0gICAgICAgIH0KKwogICAgICAgICB0YXJnZXRbMV0gfD0gZjI7CiAgICAgICB9CiAgICAgICBlbHNlCkBAIC0yMjc5LDcgKzIzMTksNyBAQAogICAgIFNob3J0ICBjMSwgZjE7CiAKIAotICAgIEZUX1RSQUNFNygoICIgIHk9JWQgeD1bJS4xMmY7JS4xMmZdIiwKKyAgICBGVF9UUkFDRTcoKCAiICB5PSVkIHg9WyUgLjEyZjslIC4xMmZdIiwKICAgICAgICAgICAgICAgICB5LAogICAgICAgICAgICAgICAgIHgxIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uLAogICAgICAgICAgICAgICAgIHgyIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uICkpOwpAQCAtMjMxNiw4ICsyMzU2LDYgQEAKICAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBsZWZ0LT5mbGFncyAmIDc7CiAKIAotICAgICAgRlRfVFJBQ0U3KCggIiwgZHJvcC1vdXQ9JWQiLCBkcm9wT3V0Q29udHJvbCApKTsKLQogICAgICAgaWYgKCBlMSA9PSBlMiArIHJhcy5wcmVjaXNpb24gKQogICAgICAgewogICAgICAgICBzd2l0Y2ggKCBkcm9wT3V0Q29udHJvbCApCkBAIC0yMzI3LDcgKzIzNjUsNyBAQAogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgNDogLyogc21hcnQgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7CisgICAgICAgICAgcHhsID0gU01BUlQoIHgxLCB4MiApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgMTogLyogc2ltcGxlIGRyb3Atb3V0cyBleGNsdWRpbmcgc3R1YnMgKi8KQEAgLTIzNzYsNyArMjQxNCw3IEBACiAgICAgICAgICAgaWYgKCBkcm9wT3V0Q29udHJvbCA9PSAxICkKICAgICAgICAgICAgIHB4bCA9IGUyOwogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7CisgICAgICAgICAgICBweGwgPSBTTUFSVCggeDEsIHgyICk7CiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDogLyogbW9kZXMgMiwgMywgNiwgNyAqLwpAQCAtMjQwMCw3ICsyNDM4LDcgQEAKICAgICAgICAgZjEgPSAoU2hvcnQpKCBlMSAmICA3ICk7CiAKICAgICAgICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHJhcy5iVGFyZ2V0W3Jhcy50cmFjZU9mcyArIGMxXSAmICggMHg4MCA+PiBmMSApICkKKyAgICAgICAgICAgICByYXMuYk9yaWdpbltyYXMudHJhY2VPZnMgKyBjMV0gJiAoIDB4ODAgPj4gZjEgKSApCiAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgfQogICAgICAgZWxzZQpAQCAtMjQxMSwxNiArMjQ0OSwxNiBAQAogCiAgICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCiAgICAgewotICAgICAgRlRfVFJBQ0U3KCggIiAtPiB4PSVkIChkcm9wLW91dCkiLCBlMSApKTsKKyAgICAgIEZUX1RSQUNFNygoICIgLT4geD0lbGQiLCBlMSApKTsKIAogICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7CiAgICAgICBmMSA9IChTaG9ydCkoIGUxICYgNyApOwogCi0gICAgICByYXMuYlRhcmdldFtyYXMudHJhY2VPZnMgKyBjMV0gfD0gKGNoYXIpKCAweDgwID4+IGYxICk7CisgICAgICByYXMuYk9yaWdpbltyYXMudHJhY2VPZnMgKyBjMV0gfD0gKGNoYXIpKCAweDgwID4+IGYxICk7CiAgICAgfQogCiAgIEV4aXQ6Ci0gICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKKyAgICBGVF9UUkFDRTcoKCAiIGRyb3BvdXQ9JWRcbiIsIGxlZnQtPmZsYWdzICYgNyApKTsKICAgfQogCiAKQEAgLTI0MzEsMTQgKzI0NjksMTQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBIb3Jpem9udGFsIFN3ZWVwIFByb2NlZHVyZSBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIGhvcml6b250YWwgYmxhY2svd2hpdGUgICAgICovCi0gIC8qICBzd2VlcCBwaGFzZSBieSB0aGUgZ2VuZXJpYyBEcmF3X1N3ZWVwKCkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSG9yaXpvbnRhbCBTd2VlcCBQcm9jZWR1cmUgU2V0CisgICAqCisgICAqIFRoZXNlIGZvdXIgcm91dGluZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBob3Jpem9udGFsIGJsYWNrL3doaXRlCisgICAqIHN3ZWVwIHBoYXNlIGJ5IHRoZSBnZW5lcmljIERyYXdfU3dlZXAoKSBmdW5jdGlvbi4KKyAgICoKKyAgICovCiAKICAgc3RhdGljIHZvaWQKICAgSG9yaXpvbnRhbF9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKQEAgLTI0NTgsNDkgKzI0OTYsNjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIHJpZ2h0ICkKICAgeworICAgIExvbmcgIGUxLCBlMjsKKwogICAgIEZUX1VOVVNFRCggbGVmdCApOwogICAgIEZUX1VOVVNFRCggcmlnaHQgKTsKIAogCi0gICAgaWYgKCB4MiAtIHgxIDwgcmFzLnByZWNpc2lvbiApCisgICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslIC4xMmY7JSAuMTJmXSIsCisgICAgICAgICAgICAgICAgeSwKKyAgICAgICAgICAgICAgICB4MSAvIChkb3VibGUpcmFzLnByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICB4MiAvIChkb3VibGUpcmFzLnByZWNpc2lvbiApKTsKKworICAgIC8qIFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIHByb2NlZHVyZSBidXQgdGhlIHZlcnRpY2FsIHN3ZWVwICAgKi8KKyAgICAvKiBtaXNoYW5kbGVzIGhvcml6b250YWwgbGluZXMgdGhyb3VnaCBwaXhlbCBjZW50ZXJzLiAgU28gd2UgICovCisgICAgLyogaGF2ZSB0byBjaGVjayBwZXJmZWN0bHkgYWxpZ25lZCBzcGFuIGVkZ2VzIGhlcmUuICAgICAgICAgICAqLworICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBYWFg6IENhbiB3ZSBoYW5kbGUgaG9yaXpvbnRhbCBsaW5lcyBiZXR0ZXIgYW5kIGRyb3AgdGhpcz8gICovCisKKyAgICBlMSA9IENFSUxJTkcoIHgxICk7CisKKyAgICBpZiAoIHgxID09IGUxICkKICAgICB7Ci0gICAgICBMb25nICBlMSwgZTI7CisgICAgICBlMSA9IFRSVU5DKCBlMSApOwogCi0KLSAgICAgIEZUX1RSQUNFNygoICIgIHg9JWQgeT1bJS4xMmY7JS4xMmZdIiwKLSAgICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICB4MSAvIChkb3VibGUpcmFzLnByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgIHgyIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uICkpOwotCi0gICAgICBlMSA9IENFSUxJTkcoIHgxICk7Ci0gICAgICBlMiA9IEZMT09SICAoIHgyICk7Ci0KLSAgICAgIGlmICggZTEgPT0gZTIgKQorICAgICAgaWYgKCBlMSA+PSAwICYmIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyApCiAgICAgICB7Ci0gICAgICAgIGUxID0gVFJVTkMoIGUxICk7Ci0KLSAgICAgICAgaWYgKCBlMSA+PSAwICYmIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyApCi0gICAgICAgIHsKLSAgICAgICAgICBCeXRlICAgZjE7Ci0gICAgICAgICAgUEJ5dGUgIGJpdHM7Ci0gICAgICAgICAgUEJ5dGUgIHA7CisgICAgICAgIEJ5dGUgICBmMTsKKyAgICAgICAgUEJ5dGUgIGJpdHM7CiAKIAotICAgICAgICAgIEZUX1RSQUNFNygoICIgLT4geT0lZCAoZHJvcC1vdXQpIiwgZTEgKSk7CisgICAgICAgIGJpdHMgPSByYXMuYk9yaWdpbiArICggeSA+PiAzICkgLSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7CisgICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7CiAKLSAgICAgICAgICBiaXRzID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOwotICAgICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7Ci0gICAgICAgICAgcCAgICA9IGJpdHMgLSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7CisgICAgICAgIEZUX1RSQUNFNygoIGJpdHNbMF0gJiBmMSA/ICIgcmVkdW5kYW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIC0+IHk9JWxkIGVkZ2UiLCBlMSApKTsKIAotICAgICAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICAgICAgcCArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgICAgICBwWzBdIHw9IGYxOwotICAgICAgICB9CisgICAgICAgIGJpdHNbMF0gfD0gZjE7CiAgICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFNygoICJcbiIgKSk7CiAgICAgfQorCisgICAgZTIgPSBGTE9PUiAgKCB4MiApOworCisgICAgaWYgKCB4MiA9PSBlMiApCisgICAgeworICAgICAgZTIgPSBUUlVOQyggZTIgKTsKKworICAgICAgaWYgKCBlMiA+PSAwICYmIChVTG9uZyllMiA8IHJhcy50YXJnZXQucm93cyApCisgICAgICB7CisgICAgICAgIEJ5dGUgICBmMTsKKyAgICAgICAgUEJ5dGUgIGJpdHM7CisKKworICAgICAgICBiaXRzID0gcmFzLmJPcmlnaW4gKyAoIHkgPj4gMyApIC0gZTIgKiByYXMudGFyZ2V0LnBpdGNoOworICAgICAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOworCisgICAgICAgIEZUX1RSQUNFNygoIGJpdHNbMF0gJiBmMSA/ICIgcmVkdW5kYW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiIC0+IHk9JWxkIGVkZ2UiLCBlMiApKTsKKworICAgICAgICBiaXRzWzBdIHw9IGYxOworICAgICAgfQorICAgIH0KKworICAgIEZUX1RSQUNFNygoICJcbiIgKSk7CiAgIH0KIAogCkBAIC0yNTE2LDcgKzI1NzMsNyBAQAogICAgIEJ5dGUgICBmMTsKIAogCi0gICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslLjEyZjslLjEyZl0iLAorICAgIEZUX1RSQUNFNygoICIgIHg9JWQgeT1bJSAuMTJmOyUgLjEyZl0iLAogICAgICAgICAgICAgICAgIHksCiAgICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCiAgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7CkBAIC0yNTQyLDggKzI1OTksNiBAQAogICAgICAgSW50ICBkcm9wT3V0Q29udHJvbCA9IGxlZnQtPmZsYWdzICYgNzsKIAogCi0gICAgICBGVF9UUkFDRTcoKCAiLCBkcm9wb3V0PSVkIiwgZHJvcE91dENvbnRyb2wgKSk7Ci0KICAgICAgIGlmICggZTEgPT0gZTIgKyByYXMucHJlY2lzaW9uICkKICAgICAgIHsKICAgICAgICAgc3dpdGNoICggZHJvcE91dENvbnRyb2wgKQpAQCAtMjU1Myw3ICsyNjA4LDcgQEAKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDQ6IC8qIHNtYXJ0IGRyb3Atb3V0cyBpbmNsdWRpbmcgc3R1YnMgKi8KLSAgICAgICAgICBweGwgPSBGTE9PUiggKCB4MSArIHgyIC0gMSApIC8gMiArIHJhcy5wcmVjaXNpb25faGFsZiApOworICAgICAgICAgIHB4bCA9IFNNQVJUKCB4MSwgeDIgKTsKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIDE6IC8qIHNpbXBsZSBkcm9wLW91dHMgZXhjbHVkaW5nIHN0dWJzICovCkBAIC0yNTc3LDcgKzI2MzIsNyBAQAogICAgICAgICAgIGlmICggZHJvcE91dENvbnRyb2wgPT0gMSApCiAgICAgICAgICAgICBweGwgPSBlMjsKICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBweGwgPSBGTE9PUiggKCB4MSArIHgyIC0gMSApIC8gMiArIHJhcy5wcmVjaXNpb25faGFsZiApOworICAgICAgICAgICAgcHhsID0gU01BUlQoIHgxLCB4MiApOwogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6IC8qIG1vZGVzIDIsIDMsIDYsIDcgKi8KQEAgLTI1OTcsMTMgKzI2NTIsOSBAQAogCiAgICAgICAgIGUxID0gVFJVTkMoIGUxICk7CiAKLSAgICAgICAgYml0cyA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKKyAgICAgICAgYml0cyA9IHJhcy5iT3JpZ2luICsgKCB5ID4+IDMgKSAtIGUxICogcmFzLnRhcmdldC5waXRjaDsKICAgICAgICAgZjEgICA9IChCeXRlKSggMHg4MCA+PiAoIHkgJiA3ICkgKTsKIAotICAgICAgICBiaXRzIC09IGUxICogcmFzLnRhcmdldC5waXRjaDsKLSAgICAgICAgaWYgKCByYXMudGFyZ2V0LnBpdGNoID4gMCApCi0gICAgICAgICAgYml0cyArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KICAgICAgICAgaWYgKCBlMSA+PSAwICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAoVUxvbmcpZTEgPCByYXMudGFyZ2V0LnJvd3MgJiYKICAgICAgICAgICAgICAqYml0cyAmIGYxICAgICAgICAgICAgICAgICAgKQpAQCAtMjYxNywyMCArMjY2OCwxNiBAQAogCiAgICAgaWYgKCBlMSA+PSAwICYmIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyApCiAgICAgewotICAgICAgRlRfVFJBQ0U3KCggIiAtPiB5PSVkIChkcm9wLW91dCkiLCBlMSApKTsKKyAgICAgIEZUX1RSQUNFNygoICIgLT4geT0lbGQiLCBlMSApKTsKIAotICAgICAgYml0cyAgPSByYXMuYlRhcmdldCArICggeSA+PiAzICk7CisgICAgICBiaXRzICA9IHJhcy5iT3JpZ2luICsgKCB5ID4+IDMgKSAtIGUxICogcmFzLnRhcmdldC5waXRjaDsKICAgICAgIGYxICAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotICAgICAgYml0cyAtPSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICBiaXRzICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKIAogICAgICAgYml0c1swXSB8PSBmMTsKICAgICB9CiAKICAgRXhpdDoKLSAgICBGVF9UUkFDRTcoKCAiXG4iICkpOworICAgIEZUX1RSQUNFNygoICIgZHJvcG91dD0lZFxuIiwgbGVmdC0+ZmxhZ3MgJiA3ICkpOwogICB9CiAKIApAQCAtMjY0MiwxMSArMjY4OSwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBHZW5lcmljIFN3ZWVwIERyYXdpbmcgcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBHZW5lcmljIFN3ZWVwIERyYXdpbmcgcm91dGluZQorICAgKgorICAgKi8KIAogICBzdGF0aWMgQm9vbAogICBEcmF3X1N3ZWVwKCBSQVNfQVJHICkKQEAgLTI3NjQsNyArMjgxMSw3IEBACiAgICAgICAgIFBfTGVmdCAgPSBkcmF3X2xlZnQ7CiAgICAgICAgIFBfUmlnaHQgPSBkcmF3X3JpZ2h0OwogCi0gICAgICAgIHdoaWxlICggUF9MZWZ0ICkKKyAgICAgICAgd2hpbGUgKCBQX0xlZnQgJiYgUF9SaWdodCApCiAgICAgICAgIHsKICAgICAgICAgICB4MSA9IFBfTGVmdCAtPlg7CiAgICAgICAgICAgeDIgPSBQX1JpZ2h0LT5YOwpAQCAtMjg2NSw3ICsyOTEyLDcgQEAKICAgICBQX0xlZnQgID0gZHJhd19sZWZ0OwogICAgIFBfUmlnaHQgPSBkcmF3X3JpZ2h0OwogCi0gICAgd2hpbGUgKCBQX0xlZnQgKQorICAgIHdoaWxlICggUF9MZWZ0ICYmIFBfUmlnaHQgKQogICAgIHsKICAgICAgIGlmICggUF9MZWZ0LT5jb3VudEwgKQogICAgICAgewpAQCAtMjg4OCwyMCArMjkzNSwxMDkgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyX1NpbmdsZV9QYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGVyZm9ybSBvbmUgc3dlZXAgd2l0aCBzdWItYmFuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyZXIgZXJyb3IgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNUQU5EQUxPTkVfCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHNob3VsZCBvbmx5IGNvbXBpbGUgaW4gc3RhbmQtYWxvbmUgbW9kZSwKKyAgICogaS5lLiwgd2hlbiBidWlsZGluZyB0aGlzIGNvbXBvbmVudCB3aXRob3V0IHRoZSByZXN0IG9mIEZyZWVUeXBlLgorICAgKgorICAgKi8KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfR2V0X0NCb3gKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiBhbiBvdXRsaW5lJ3MgYGNvbnRyb2wgYm94Jy4gIFRoZSBjb250cm9sIGJveCBlbmNsb3NlcyBhbGwKKyAgICogICB0aGUgb3V0bGluZSdzIHBvaW50cywgaW5jbHVkaW5nIELDqXppZXIgY29udHJvbCBwb2ludHMuICBUaG91Z2ggaXQKKyAgICogICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlCisgICAqICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUKKyAgICogICB0aGF0IGNvbnRhaW5zIELDqXppZXIgb3V0c2lkZSBhcmNzKS4KKyAgICoKKyAgICogICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcKKyAgICogICBib3ggY2FuIHRha2UgbXVjaCBtb3JlIHRpbWUgYXMgaXQgbmVlZHMgdG8gd2FsayBvdmVyIGFsbCBzZWdtZW50cworICAgKiAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZQorICAgKiAgIGBmdGJib3gnIGNvbXBvbmVudCwgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBvdXRsaW5lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuCisgICAqCisgICAqIEBPdXRwdXQ6CisgICAqICAgYWNib3ggOjoKKyAgICogICAgIFRoZSBvdXRsaW5lJ3MgY29udHJvbCBib3guCisgICAqCisgICAqIEBOb3RlOgorICAgKiAgIFNlZSBARlRfR2x5cGhfR2V0X0NCb3ggZm9yIGEgZGlzY3Vzc2lvbiBvZiB0cmlja3kgZm9udHMuCisgICAqLworCisgIHN0YXRpYyB2b2lkCisgIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKQorICB7CisgICAgTG9uZyAgeE1pbiwgeU1pbiwgeE1heCwgeU1heDsKKworCisgICAgaWYgKCBvdXRsaW5lICYmIGFjYm94ICkKKyAgICB7CisgICAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzID09IDAgKQorICAgICAgeworICAgICAgICB4TWluID0gMDsKKyAgICAgICAgeU1pbiA9IDA7CisgICAgICAgIHhNYXggPSAwOworICAgICAgICB5TWF4ID0gMDsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgRlRfVmVjdG9yKiAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7CisgICAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7CisKKworICAgICAgICB4TWluID0geE1heCA9IHZlYy0+eDsKKyAgICAgICAgeU1pbiA9IHlNYXggPSB2ZWMtPnk7CisgICAgICAgIHZlYysrOworCisgICAgICAgIGZvciAoIDsgdmVjIDwgbGltaXQ7IHZlYysrICkKKyAgICAgICAgeworICAgICAgICAgIExvbmcgIHgsIHk7CisKKworICAgICAgICAgIHggPSB2ZWMtPng7CisgICAgICAgICAgaWYgKCB4IDwgeE1pbiApIHhNaW4gPSB4OworICAgICAgICAgIGlmICggeCA+IHhNYXggKSB4TWF4ID0geDsKKworICAgICAgICAgIHkgPSB2ZWMtPnk7CisgICAgICAgICAgaWYgKCB5IDwgeU1pbiApIHlNaW4gPSB5OworICAgICAgICAgIGlmICggeSA+IHlNYXggKSB5TWF4ID0geTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYWNib3gtPnhNaW4gPSB4TWluOworICAgICAgYWNib3gtPnhNYXggPSB4TWF4OworICAgICAgYWNib3gtPnlNaW4gPSB5TWluOworICAgICAgYWNib3gtPnlNYXggPSB5TWF4OworICAgIH0KKyAgfQorCisjZW5kaWYgLyogU1RBTkRBTE9ORV8gKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUmVuZGVyX1NpbmdsZV9QYXNzCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBQZXJmb3JtIG9uZSBzd2VlcCB3aXRoIHN1Yi1iYW5kaW5nLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmxpcHBlZCA6OgorICAgKiAgICAgSWYgc2V0LCBmbGlwIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG91dGxpbmUuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgUmVuZGVyZXIgZXJyb3IgY29kZS4KKyAgICovCiAgIHN0YXRpYyBpbnQKICAgUmVuZGVyX1NpbmdsZV9QYXNzKCBSQVNfQVJHUyBCb29sICBmbGlwcGVkICkKICAgewpAQCAtMjk2MywxNyArMzA5OSwxNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXJfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXIgYSBnbHlwaCBpbiBhIGJpdG1hcC4gIFN1Yi1iYW5kaW5nIGlmIG5lZWRlZC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUmVuZGVyX0dseXBoCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBSZW5kZXIgYSBnbHlwaCBpbiBhIGJpdG1hcC4gIFN1Yi1iYW5kaW5nIGlmIG5lZWRlZC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIFJlbmRlcl9HbHlwaCggUkFTX0FSRyApCiAgIHsKQEAgLTI5ODIsNyArMzExOCw2IEBACiAKICAgICBTZXRfSGlnaF9QcmVjaXNpb24oIFJBU19WQVJTIHJhcy5vdXRsaW5lLmZsYWdzICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gKTsKLSAgICByYXMuc2NhbGVfc2hpZnQgPSByYXMucHJlY2lzaW9uX3NoaWZ0OwogCiAgICAgaWYgKCByYXMub3V0bGluZS5mbGFncyAmIEZUX09VVExJTkVfSUdOT1JFX0RST1BPVVRTICkKICAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IDI7CkBAIC0zMDEzLDcgKzMxNDgsMTAgQEAKICAgICByYXMuYmFuZF9zdGFja1swXS55X21heCA9IChTaG9ydCkoIHJhcy50YXJnZXQucm93cyAtIDEgKTsKIAogICAgIHJhcy5iV2lkdGggID0gKFVTaG9ydClyYXMudGFyZ2V0LndpZHRoOwotICAgIHJhcy5iVGFyZ2V0ID0gKEJ5dGUqKXJhcy50YXJnZXQuYnVmZmVyOworICAgIHJhcy5iT3JpZ2luID0gKEJ5dGUqKXJhcy50YXJnZXQuYnVmZmVyOworCisgICAgaWYgKCByYXMudGFyZ2V0LnBpdGNoID4gMCApCisgICAgICByYXMuYk9yaWdpbiArPSAoTG9uZykoIHJhcy50YXJnZXQucm93cyAtIDEgKSAqIHJhcy50YXJnZXQucGl0Y2g7CiAKICAgICBpZiAoICggZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDAgKSApICE9IDAgKQogICAgICAgcmV0dXJuIGVycm9yOwpAQCAtMzE0Niw3ICszMjg0LDkgQEAKICAgICBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSAgICA9IChjb25zdCBGVF9PdXRsaW5lKilwYXJhbXMtPnNvdXJjZTsKICAgICBjb25zdCBGVF9CaXRtYXAqICAgdGFyZ2V0X21hcCA9IHBhcmFtcy0+dGFyZ2V0OwogCisjaWZuZGVmIEZUX1NUQVRJQ19SQVNURVIKICAgICBibGFja19UV29ya2VyICB3b3JrZXJbMV07CisjZW5kaWYKIAogICAgIExvbmcgIGJ1ZmZlcltGVF9NQVhfQkxBQ0tfUE9PTF07CiAKQEAgLTMxODUsMjUgKzMzMjUsMTEgQEAKICAgICBpZiAoICF0YXJnZXRfbWFwLT5idWZmZXIgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkICk7CiAKLSAgICAvKiByZWplY3QgdG9vIGxhcmdlIG91dGxpbmUgY29vcmRpbmF0ZXMgKi8KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gdmVjICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgewotICAgICAgICBpZiAoIHZlYy0+eCA8IC0weDEwMDAwMDBMIHx8IHZlYy0+eCA+IDB4MTAwMDAwMEwgfHwKLSAgICAgICAgICAgICB2ZWMtPnkgPCAtMHgxMDAwMDAwTCB8fCB2ZWMtPnkgPiAweDEwMDAwMDBMICkKLSAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotICAgICAgfQotICAgIH0KLQogICAgIHJhcy5vdXRsaW5lID0gKm91dGxpbmU7CiAgICAgcmFzLnRhcmdldCAgPSAqdGFyZ2V0X21hcDsKIAotICAgIHdvcmtlci0+YnVmZiAgICAgPSBidWZmZXI7Ci0gICAgd29ya2VyLT5zaXplQnVmZiA9ICgmYnVmZmVyKVsxXTsgLyogUG9pbnRzIHRvIHJpZ2h0IGFmdGVyIGJ1ZmZlci4gKi8KKyAgICByYXMuYnVmZiAgICAgPSBidWZmZXI7CisgICAgcmFzLnNpemVCdWZmID0gKCZidWZmZXIpWzFdOyAvKiBQb2ludHMgdG8gcmlnaHQgYWZ0ZXIgYnVmZmVyLiAqLwogCiAgICAgcmV0dXJuIFJlbmRlcl9HbHlwaCggUkFTX1ZBUiApOwogICB9CmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL2Z0cmFzdGVyLmggYi9zcmMvcmFzdGVyL2Z0cmFzdGVyLmgKaW5kZXggNDBiNWQ2ZC4uMWIyZWUzYyAxMDA2NDQKLS0tIGEvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oCisrKyBiL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRyYXN0ZXIuaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkCisgKiBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRSQVNURVJfSF8KQEAgLTIyLDE3ICsyMiwxOCBAQAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU1BR0VfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0aW1hZ2UuaD4KIAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oPgogCiBGVF9CRUdJTl9IRUFERVIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZSBpZiB5b3UgYXJlIHVzaW5nIGZ0cmFzdGVyLmMgYXMgYSAgICAgICAgICovCi0gIC8qIHN0YW5kYWxvbmUgbW9kdWxlLCBmdWxseSBpbmRlcGVuZGVudCBvZiBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IGFyZSB1c2luZyBmdHJhc3Rlci5jIGFzIGEKKyAgICogc3RhbmRhbG9uZSBtb2R1bGUsIGZ1bGx5IGluZGVwZW5kZW50IG9mIEZyZWVUeXBlLgorICAgKi8KIC8qICNkZWZpbmUgU1RBTkRBTE9ORV8gKi8KIAogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgKSAgZnRfc3RhbmRhcmRfcmFzdGVyOwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9mdHJlbmQxLmMgYi9zcmMvcmFzdGVyL2Z0cmVuZDEuYwppbmRleCBhN2NlOTczLi41N2ZlZDliIDEwMDY0NAotLS0gYS9zcmMvcmFzdGVyL2Z0cmVuZDEuYworKysgYi9zcmMvcmFzdGVyL2Z0cmVuZDEuYwpAQCAtMSwyOCArMSwyNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZW5kMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZnRyZW5kMS5jCisgKgorICogICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciBpbnRlcmZhY2UgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CiAjaW5jbHVkZSAiZnRyZW5kMS5oIgogI2luY2x1ZGUgImZ0cmFzdGVyLmgiCi0jaW5jbHVkZSAicmFzdHBpYy5oIgogCiAjaW5jbHVkZSAicmFzdGVycnMuaCIKIApAQCAtMTI4LDcgKzEyNiwxMSBAQAogICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzICY9IH5GVF9HTFlQSF9PV05fQklUTUFQOwogICAgIH0KIAotICAgIGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKCBzbG90LCBtb2RlLCBvcmlnaW4gKTsKKyAgICBpZiAoIGZ0X2dseXBoc2xvdF9wcmVzZXRfYml0bWFwKCBzbG90LCBtb2RlLCBvcmlnaW4gKSApCisgICAgeworICAgICAgZXJyb3IgPSBGVF9USFJPVyggUmFzdGVyX092ZXJmbG93ICk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQogCiAgICAgLyogYWxsb2NhdGUgbmV3IG9uZSAqLwogICAgIGlmICggRlRfQUxMT0NfTVVMVCggYml0bWFwLT5idWZmZXIsIGJpdG1hcC0+cm93cywgYml0bWFwLT5waXRjaCApICkKQEAgLTE5Nyw3ICsxOTksNyBAQAogICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Jhc3RlcjFfZ2V0X2Nib3gsICAgLyogZ2V0X2dseXBoX2Nib3ggICovCiAgICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfcmFzdGVyMV9zZXRfbW9kZSwgICAvKiBzZXRfbW9kZSAgICAgICAgKi8KIAotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSZGVF9TVEFOREFSRF9SQVNURVJfR0VUICAgICAgICAgLyogcmFzdGVyX2NsYXNzICAgICovCisgICAgKEZUX1Jhc3Rlcl9GdW5jcyopJmZ0X3N0YW5kYXJkX3Jhc3RlciAgICAgICAgICAgICAvKiByYXN0ZXJfY2xhc3MgICAgKi8KICAgKQogCiAKZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvZnRyZW5kMS5oIGIvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKaW5kZXggMmFiZGYyZC4uM2Y2YmU1MyAxMDA2NDQKLS0tIGEvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKKysrIGIvc3JjL3Jhc3Rlci9mdHJlbmQxLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZDEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0cmVuZDEuaAorICoKKyAqICAgVGhlIEZyZWVUeXBlIGdseXBoIHJhc3Rlcml6ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRSRU5EMV9IXwogI2RlZmluZSBGVFJFTkQxX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9SRU5ERVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0cmVuZGVyLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL21vZHVsZS5tayBiL3NyYy9yYXN0ZXIvbW9kdWxlLm1rCmluZGV4IGIxMTVmNDEuLjM2MDA3MzIgMTAwNjQ0Ci0tLSBhL3NyYy9yYXN0ZXIvbW9kdWxlLm1rCisrKyBiL3NyYy9yYXN0ZXIvbW9kdWxlLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL3Jhc3Rlci5jIGIvc3JjL3Jhc3Rlci9yYXN0ZXIuYwppbmRleCA3NmVkZDIxLi5jZDM3OTQzIDEwMDY0NAotLS0gYS9zcmMvcmFzdGVyL3Jhc3Rlci5jCisrKyBiL3NyYy9yYXN0ZXIvcmFzdGVyLmMKQEAgLTEsMjcgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb25vY2hyb21lIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHJhc3Rlci5jCisgKgorICogICBGcmVlVHlwZSBtb25vY2hyb21lIHJhc3RlcmVyIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogCiAjaW5jbHVkZSAiZnRyYXN0ZXIuYyIKICNpbmNsdWRlICJmdHJlbmQxLmMiCi0jaW5jbHVkZSAicmFzdHBpYy5jIgogCiAKIC8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oIGIvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oCmluZGV4IDIyYTNlMTUuLmEyOTY1MWEgMTAwNjQ0Ci0tLSBhL3NyYy9yYXN0ZXIvcmFzdGVycnMuaAorKysgYi9zcmMvcmFzdGVyL3Jhc3RlcnJzLmgKQEAgLTEsMzIgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3RlcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtb25vY2hyb21lIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHJhc3RlcnJzLmgKKyAqCisgKiAgIG1vbm9jaHJvbWUgcmVuZGVyZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBtb25vY2hyb21lIHJlbmRlcmVyIGVycm9yIGVudW1lcmF0aW9uICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIG1vbm9jaHJvbWUgcmVuZGVyZXIgZXJyb3IgZW51bWVyYXRpb24KKyAgICogY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBSQVNURVJSU19IXwogI2RlZmluZSBSQVNURVJSU19IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBSYXN0ZXJfRXJyXwogI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1Jhc3RlcgogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBSQVNURVJSU19IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvcmFzdGVyL3Jhc3RwaWMuYyBiL3NyYy9yYXN0ZXIvcmFzdHBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGM4OTgxLi4wMDAwMDAwCi0tLSBhL3NyYy9yYXN0ZXIvcmFzdHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcmFzdHBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciByYXN0ZXIgbW9kdWxlLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInJhc3RwaWMuaCIKLSNpbmNsdWRlICJyYXN0ZXJycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRyYXN0ZXIuYyAqLwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfZnRfc3RhbmRhcmRfcmFzdGVyKCBGVF9SYXN0ZXJfRnVuY3MqICBmdW5jcyApOwotCi0KLSAgdm9pZAotICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+cmFzdGVyICkKLSAgICB7Ci0gICAgICBSYXN0ZXJQSUMqICBjb250YWluZXIgPSAoUmFzdGVyUElDKilwaWNfY29udGFpbmVyLT5yYXN0ZXI7Ci0KLQotICAgICAgaWYgKCAtLWNvbnRhaW5lci0+cmVmX2NvdW50ICkKLSAgICAgICAgcmV0dXJuOwotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5yYXN0ZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIFJhc3RlclBJQyogICAgICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogWFhYOiBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gc2VydmVkIHRoZSBubyBsb25nZXIgYXZhaWxhYmxlICAqLwotICAgIC8qICAgICAgcmFzdGVyNSByZW5kZXJlciBpdCB1c2VzIHJlZmVyZW5jZSBjb3VudGluZywgd2hpY2ggY291bGQgKi8KLSAgICAvKiAgICAgIGJlIHJlbW92ZWQgbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5yYXN0ZXIgKQotICAgIHsKLSAgICAgICgoUmFzdGVyUElDKilwaWNfY29udGFpbmVyLT5yYXN0ZXIpLT5yZWZfY291bnQrKzsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+cmFzdGVyID0gY29udGFpbmVyOwotCi0gICAgY29udGFpbmVyLT5yZWZfY291bnQgPSAxOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9zdGFuZGFyZF9yYXN0ZXIoICZjb250YWluZXItPmZ0X3N0YW5kYXJkX3Jhc3RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Jhc3Rlci9yYXN0cGljLmggYi9zcmMvcmFzdGVyL3Jhc3RwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQwODc3Yy4uMDAwMDAwMAotLS0gYS9zcmMvcmFzdGVyL3Jhc3RwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3RwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcmFzdGVyIG1vZHVsZS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBSQVNUUElDX0hfCi0jZGVmaW5lIFJBU1RQSUNfSF8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfU1RBTkRBUkRfUkFTVEVSX0dFVCAgZnRfc3RhbmRhcmRfcmFzdGVyCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFJhc3RlclBJQ18KLSAgewotICAgIGludCAgICAgICAgICAgICAgcmVmX2NvdW50OwotICAgIEZUX1Jhc3Rlcl9GdW5jcyAgZnRfc3RhbmRhcmRfcmFzdGVyOwotCi0gIH0gUmFzdGVyUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoUmFzdGVyUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnJhc3RlciApICkKLSNkZWZpbmUgRlRfU1RBTkRBUkRfUkFTVEVSX0dFVCAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X3N0YW5kYXJkX3Jhc3RlciApCi0KLQotICAvKiBzZWUgcmFzdHBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIFJBU1RQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9yYXN0ZXIvcnVsZXMubWsgYi9zcmMvcmFzdGVyL3J1bGVzLm1rCmluZGV4IDlhZWYxZjAuLjNlOTQ5ZDcgMTAwNjQ0Ci0tLSBhL3NyYy9yYXN0ZXIvcnVsZXMubWsKKysrIGIvc3JjL3Jhc3Rlci9ydWxlcy5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMjgsOCArMjgsNyBAQAogIyByYXN0ZXIgZHJpdmVyIHNvdXJjZXMgKGkuZS4sIEMgZmlsZXMpCiAjCiBSQVNURVJfRFJWX1NSQyA6PSAkKFJBU1RFUl9ESVIpL2Z0cmFzdGVyLmMgXAotICAgICAgICAgICAgICAgICAgJChSQVNURVJfRElSKS9mdHJlbmQxLmMgIFwKLSAgICAgICAgICAgICAgICAgICQoUkFTVEVSX0RJUikvcmFzdHBpYy5jCisgICAgICAgICAgICAgICAgICAkKFJBU1RFUl9ESVIpL2Z0cmVuZDEuYwogCiAKICMgcmFzdGVyIGRyaXZlciBoZWFkZXJzCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9KYW1maWxlIGIvc3JjL3NmbnQvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc5NzdmYy4uMDAwMDAwMAotLS0gYS9zcmMvc2ZudC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9zZm50IEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBzZm50IDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBwbmdzaGltCi0gICAgICAgICAgICAgICBzZmRyaXZlcgotICAgICAgICAgICAgICAgc2ZudHBpYwotICAgICAgICAgICAgICAgc2ZvYmpzCi0gICAgICAgICAgICAgICB0dGJkZgotICAgICAgICAgICAgICAgdHRjbWFwCi0gICAgICAgICAgICAgICB0dGtlcm4KLSAgICAgICAgICAgICAgIHR0bG9hZAotICAgICAgICAgICAgICAgdHRtdHgKLSAgICAgICAgICAgICAgIHR0cG9zdAotICAgICAgICAgICAgICAgdHRzYml0Ci0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBzZm50IDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3NmbnQgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvbW9kdWxlLm1rIGIvc3JjL3NmbnQvbW9kdWxlLm1rCmluZGV4IDUxY2E2N2UuLjBmNDU5ZDggMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L21vZHVsZS5taworKysgYi9zcmMvc2ZudC9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3BuZ3NoaW0uYyBiL3NyYy9zZm50L3BuZ3NoaW0uYwppbmRleCAxNjAyMDI2Li5mNTUwMTYxIDEwMDY0NAotLS0gYS9zcmMvc2ZudC9wbmdzaGltLmMKKysrIGIvc3JjL3NmbnQvcG5nc2hpbS5jCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwbmdzaGltLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUE5HIEJpdG1hcCBnbHlwaCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdvb2dsZSwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXcml0dGVuIGJ5IFN0dWFydCBHaWxsIGFuZCBCZWhkYWQgRXNmYWhib2QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogcG5nc2hpbS5jCisgKgorICogICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKKyAqIEdvb2dsZSwgSW5jLgorICogV3JpdHRlbiBieSBTdHVhcnQgR2lsbCBhbmQgQmVoZGFkIEVzZmFoYm9kLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgogI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAogCiAKQEAgLTYxLDEzICs2MCwxOSBAQAogICAgIC8qIHByZWRhdGVzIGNsYW5nOyB0aGUgYF9fQllURV9PUkRFUl9fJyBwcmVwcm9jZXNzb3Igc3ltYm9sIHdhcyAqLwogICAgIC8qIGludHJvZHVjZWQgaW4gZ2NjIDQuNiBhbmQgY2xhbmcgMy4yLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAqLwogICAgIC8qIGBfX2J1aWx0aW5fc2h1ZmZsZScgZm9yIGdjYyB3YXMgaW50cm9kdWNlZCBpbiBnY2MgNC43LjAuICAgICAqLwotI2lmICggKCBkZWZpbmVkKCBfX0dOVUNfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgICAgICAgICAgICBcCisgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW50ZWwgY29tcGlsZXJzIGRvIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBfX2J1aWx0aW5fc2h1ZmZsZTsgICovCisKKyAgICAvKiBUaGUgSW50ZWwgY2hlY2sgbXVzdCBiZSBmaXJzdC4gKi8KKyNpZiAhZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAorICAgICggKCBkZWZpbmVkKCBfX0dOVUNfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAgICAgICAgICAgICBcCiAgICAgICAgICggKCBfX0dOVUNfXyA+PSA1ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgIFwKICAgICAgICAgKCAoIF9fR05VQ19fID09IDQgKSAmJiAoIF9fR05VQ19NSU5PUl9fID49IDcgKSApICkgKSAgICAgICAgIHx8ICAgXAogICAgICAgKCBkZWZpbmVkKCBfX2NsYW5nX18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICAgICBcCiAgICAgICAgICggKCBfX2NsYW5nX21ham9yX18gPj0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgIFwKICAgICAgICAgKCAoIF9fY2xhbmdfbWFqb3JfXyA9PSAzICkgJiYgKCBfX2NsYW5nX21pbm9yX18gPj0gMiApICkgKSApICkgJiYgXAogICAgIGRlZmluZWQoIF9fT1BUSU1JWkVfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCisgICAgZGVmaW5lZCggX19TU0VfXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKICAgICBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXwogCiAjaWZkZWYgX19jbGFuZ19fCkBAIC0zMjcsNiArMzMyLDEzIEBACiAKICAgICBpZiAoIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcyApCiAgICAgeworICAgICAgLyogcmVqZWN0IHRvbyBsYXJnZSBiaXRtYXBzIHNpbWlsYXJseSB0byB0aGUgcmFzdGVyaXplciAqLworICAgICAgaWYgKCBpbWdIZWlnaHQgPiAweDdGRkYgfHwgaW1nV2lkdGggPiAweDdGRkYgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBBcnJheV9Ub29fTGFyZ2UgKTsKKyAgICAgICAgZ290byBEZXN0cm95RXhpdDsKKyAgICAgIH0KKwogICAgICAgbWV0cmljcy0+d2lkdGggID0gKEZUX1VTaG9ydClpbWdXaWR0aDsKICAgICAgIG1ldHJpY3MtPmhlaWdodCA9IChGVF9VU2hvcnQpaW1nSGVpZ2h0OwogCkBAIC0zMzUsMTMgKzM0Nyw2IEBACiAgICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7CiAgICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCAqIDQgKTsKICAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLQotICAgICAgLyogcmVqZWN0IHRvbyBsYXJnZSBiaXRtYXBzIHNpbWlsYXJseSB0byB0aGUgcmFzdGVyaXplciAqLwotICAgICAgaWYgKCBtYXAtPnJvd3MgPiAweDdGRkYgfHwgbWFwLT53aWR0aCA+IDB4N0ZGRiApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotICAgICAgICBnb3RvIERlc3Ryb3lFeGl0OwotICAgICAgfQogICAgIH0KIAogICAgIC8qIGNvbnZlcnQgcGFsZXR0ZS9ncmF5IGltYWdlIHRvIHJnYiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvcG5nc2hpbS5oIGIvc3JjL3NmbnQvcG5nc2hpbS5oCmluZGV4IDE5NDIzOGMuLjJkNmU4M2QgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3BuZ3NoaW0uaAorKysgYi9zcmMvc2ZudC9wbmdzaGltLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBuZ3NoaW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgU3R1YXJ0IEdpbGwgYW5kIEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwbmdzaGltLmgKKyAqCisgKiAgIFBORyBCaXRtYXAgZ2x5cGggc3VwcG9ydC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAyMCBieQorICogR29vZ2xlLCBJbmMuCisgKiBXcml0dGVuIGJ5IFN0dWFydCBHaWxsIGFuZCBCZWhkYWQgRXNmYWhib2QuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBQTkdTSElNX0hfCiAjZGVmaW5lIFBOR1NISU1fSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJ0dGxvYWQuaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9ydWxlcy5tayBiL3NyYy9zZm50L3J1bGVzLm1rCmluZGV4IDgzYWNjNjYuLmY1NmVmMDYgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3J1bGVzLm1rCisrKyBiL3NyYy9zZm50L3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0yOCwxNyArMjgsMjEgQEAKIAogIyBTRk5UIGRyaXZlciBzb3VyY2VzIChpLmUuLCBDIGZpbGVzKQogIwotU0ZOVF9EUlZfU1JDIDo9ICQoU0ZOVF9ESVIpL3R0bG9hZC5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0bXR4LmMgICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0Y21hcC5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0c2JpdC5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0cG9zdC5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0a2Vybi5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0YmRmLmMgICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3Nmb2Jqcy5jICAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3NmZHJpdmVyLmMgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3NmbnRwaWMuYyAgXAotICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3BuZ3NoaW0uYworU0ZOVF9EUlZfU1JDIDo9ICQoU0ZOVF9ESVIpL3BuZ3NoaW0uYyAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSKS9zZmRyaXZlci5jICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUikvc2ZvYmpzLmMgICAgXAorICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3Nmd29mZi5jICAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSKS9zZndvZmYyLmMgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRiZGYuYyAgICAgXAorICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0Y21hcC5jICAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSKS90dGNvbHIuYyAgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRjcGFsLmMgICAgXAorICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0a2Vybi5jICAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSKS90dGxvYWQuYyAgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUikvdHRtdHguYyAgICAgXAorICAgICAgICAgICAgICAgICQoU0ZOVF9ESVIpL3R0cG9zdC5jICAgIFwKKyAgICAgICAgICAgICAgICAkKFNGTlRfRElSKS90dHNiaXQuYyAgICBcCisgICAgICAgICAgICAgICAgJChTRk5UX0RJUikvd29mZjJ0YWdzLmMKIAogIyBTRk5UIGRyaXZlciBoZWFkZXJzCiAjCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmRyaXZlci5jIGIvc3JjL3NmbnQvc2Zkcml2ZXIuYwppbmRleCAzMDNlMWNhLi4wNDYwMzM5IDEwMDY0NAotLS0gYS9zcmMvc2ZudC9zZmRyaXZlci5jCisrKyBiL3NyYy9zZm50L3NmZHJpdmVyLmMKQEAgLTEsMzEgKzEsMjkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmZHJpdmVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFNGTlQgZHJpdmVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHNmZHJpdmVyLmMKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgU0ZOVCBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dG5hbWVpZC5oPgogCiAjaW5jbHVkZSAic2Zkcml2ZXIuaCIKICNpbmNsdWRlICJ0dGxvYWQuaCIKICNpbmNsdWRlICJzZm9ianMuaCIKLSNpbmNsdWRlICJzZm50cGljLmgiCiAKICNpbmNsdWRlICJzZmVycm9ycy5oIgogCkBAIC0zMyw0MiArMzEsNDcgQEAKICNpbmNsdWRlICJ0dHNiaXQuaCIKICNlbmRpZgogCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9DT0xPUl9MQVlFUlMKKyNpbmNsdWRlICJ0dGNvbHIuaCIKKyNpbmNsdWRlICJ0dGNwYWwuaCIKKyNlbmRpZgorCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCiAjaW5jbHVkZSAidHRwb3N0LmgiCiAjZW5kaWYKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCiAjaW5jbHVkZSAidHRiZGYuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJ0dGNtYXAuaCIKICNpbmNsdWRlICJ0dGtlcm4uaCIKICNpbmNsdWRlICJ0dG10eC5oIgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmg+CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaD4KICNlbmRpZgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3NmZHJpdmVyCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgc2Zkcml2ZXIKIAogCiAgIC8qCi0gICAqICBTRk5UIFRBQkxFIFNFUlZJQ0UKKyAgICogU0ZOVCBUQUJMRSBTRVJWSUNFCiAgICAqCiAgICAqLwogCkBAIC0xNTUsNyArMTU4LDcgQEAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKIAogICAvKgotICAgKiAgR0xZUEggRElDVCBTRVJWSUNFCisgICAqIEdMWVBIIERJQ1QgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMTc4LDggKzE4MSw4IEBACiAKIAogICBzdGF0aWMgRlRfVUludAotICBzZm50X2dldF9uYW1lX2luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKKyAgc2ZudF9nZXRfbmFtZV9pbmRleCggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCiAgIHsKICAgICBUVF9GYWNlICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwogCkBAIC0xOTEsNyArMTk0LDcgQEAKICAgICBlbHNlIGlmICggKEZUX1VMb25nKWZhY2UtPm51bV9nbHlwaHMgPCBGVF9VSU5UX01BWCApCiAgICAgICBtYXhfZ2lkID0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBoczsKICAgICBlbHNlCi0gICAgICBGVF9UUkFDRTAoKCAiSWdub3JlIGdseXBoIG5hbWVzIGZvciBpbnZhbGlkIEdJRCAweCUwOHggLSAweCUwOHhcbiIsCisgICAgICBGVF9UUkFDRTAoKCAiSWdub3JlIGdseXBoIG5hbWVzIGZvciBpbnZhbGlkIEdJRCAweCUwOHggLSAweCUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVgsIGZhY2UtPm51bV9nbHlwaHMgKSk7CiAKICAgICBmb3IgKCBpID0gMDsgaSA8IG1heF9naWQ7IGkrKyApCkBAIC0yMjIsNyArMjI1LDcgQEAKIAogCiAgIC8qCi0gICAqICBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQorICAgKiBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtMzcxLDQ3ICszNzQsNjEgQEAKICAgICAgIHsKICAgICAgIGNhc2UgMTU6CiAgICAgICAgIGs0IF49IChGVF9VSW50MzIpdGFpbFsxNF0gPDwgMTY7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgY2FzZSAxNDoKICAgICAgICAgazQgXj0gKEZUX1VJbnQzMil0YWlsWzEzXSA8PCA4OworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgIGNhc2UgMTM6CiAgICAgICAgIGs0IF49IChGVF9VSW50MzIpdGFpbFsxMl07CiAgICAgICAgIGs0ICo9IGM0OwogICAgICAgICBrNCAgPSBST1RMMzIoIGs0LCAxOCApOwogICAgICAgICBrNCAqPSBjMTsKICAgICAgICAgaDQgXj0gazQ7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogCiAgICAgICBjYXNlIDEyOgogICAgICAgICBrMyBePSAoRlRfVUludDMyKXRhaWxbMTFdIDw8IDI0OworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgIGNhc2UgMTE6CiAgICAgICAgIGszIF49IChGVF9VSW50MzIpdGFpbFsxMF0gPDwgMTY7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgY2FzZSAxMDoKICAgICAgICAgazMgXj0gKEZUX1VJbnQzMil0YWlsWzldIDw8IDg7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgY2FzZSA5OgogICAgICAgICBrMyBePSAoRlRfVUludDMyKXRhaWxbOF07CiAgICAgICAgIGszICo9IGMzOwogICAgICAgICBrMyAgPSBST1RMMzIoIGszLCAxNyApOwogICAgICAgICBrMyAqPSBjNDsKICAgICAgICAgaDMgXj0gazM7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogCiAgICAgICBjYXNlIDg6CiAgICAgICAgIGsyIF49IChGVF9VSW50MzIpdGFpbFs3XSA8PCAyNDsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICBjYXNlIDc6CiAgICAgICAgIGsyIF49IChGVF9VSW50MzIpdGFpbFs2XSA8PCAxNjsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICBjYXNlIDY6CiAgICAgICAgIGsyIF49IChGVF9VSW50MzIpdGFpbFs1XSA8PCA4OworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgIGNhc2UgNToKICAgICAgICAgazIgXj0gKEZUX1VJbnQzMil0YWlsWzRdOwogICAgICAgICBrMiAqPSBjMjsKICAgICAgICAgazIgID0gUk9UTDMyKCBrMiwgMTYgKTsKICAgICAgICAgazIgKj0gYzM7CiAgICAgICAgIGgyIF49IGsyOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KIAogICAgICAgY2FzZSA0OgogICAgICAgICBrMSBePSAoRlRfVUludDMyKXRhaWxbM10gPDwgMjQ7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgY2FzZSAzOgogICAgICAgICBrMSBePSAoRlRfVUludDMyKXRhaWxbMl0gPDwgMTY7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogICAgICAgY2FzZSAyOgogICAgICAgICBrMSBePSAoRlRfVUludDMyKXRhaWxbMV0gPDwgODsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCiAgICAgICBjYXNlIDE6CiAgICAgICAgIGsxIF49IChGVF9VSW50MzIpdGFpbFswXTsKICAgICAgICAgazEgKj0gYzE7CkBAIC00NjAsMTQgKzQ3NywxMiBAQAogICB0eXBlZGVmIGludCAoKmNoYXJfdHlwZV9mdW5jKSggaW50ICBjICk7CiAKIAotICAvKiBoYW5kbGluZyBvZiBQSUQvRUlEIDMvMCBhbmQgMy8xIGlzIHRoZSBzYW1lICovCisgIC8qIEhhbmRsaW5nIG9mIFBJRC9FSUQgMy8wIGFuZCAzLzEgaXMgdGhlIHNhbWUuICovCiAjZGVmaW5lIElTX1dJTiggbiApICAoIChuKS0+cGxhdGZvcm1JRCA9PSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICggKG4pLT5lbmNvZGluZ0lEID09IDEgfHwgKG4pLT5lbmNvZGluZ0lEID09IDAgKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgIChuKS0+bGFuZ3VhZ2VJRCA9PSAweDQwOSAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICggKG4pLT5lbmNvZGluZ0lEID09IDEgfHwgKG4pLT5lbmNvZGluZ0lEID09IDAgKSApCiAKICNkZWZpbmUgSVNfQVBQTEUoIG4gKSAgKCAobiktPnBsYXRmb3JtSUQgPT0gMSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKG4pLT5lbmNvZGluZ0lEID09IDAgJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgIChuKS0+bGFuZ3VhZ2VJRCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAobiktPmVuY29kaW5nSUQgPT0gMCApCiAKICAgc3RhdGljIGNoYXIqCiAgIGdldF93aW5fc3RyaW5nKCBGVF9NZW1vcnkgICAgICAgbWVtb3J5LApAQCAtNDkxLDQyICs1MDYsNDAgQEAKIAogICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGVudHJ5LT5zdHJpbmdPZmZzZXQgKSB8fAogICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGVudHJ5LT5zdHJpbmdMZW5ndGggKSApCi0gICAgewotICAgICAgRlRfRlJFRSggcmVzdWx0ICk7Ci0gICAgICBlbnRyeS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgPSAwOwotICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgICBnb3RvIGdldF93aW5fc3RyaW5nX2Vycm9yOwogCiAgICAgciA9IChGVF9TdHJpbmcqKXJlc3VsdDsKICAgICBwID0gKEZUX0NoYXIqKXN0cmVhbS0+Y3Vyc29yOwogCiAgICAgZm9yICggbGVuID0gZW50cnktPnN0cmluZ0xlbmd0aCAvIDI7IGxlbiA+IDA7IGxlbi0tLCBwICs9IDIgKQogICAgIHsKLSAgICAgIGlmICggcFswXSA9PSAwICkKKyAgICAgIGlmICggcFswXSA9PSAwICYmIGNoYXJfdHlwZSggcFsxXSApICkKKyAgICAgICAgKnIrKyA9IHBbMV07CisgICAgICBlbHNlCiAgICAgICB7Ci0gICAgICAgIGlmICggY2hhcl90eXBlKCBwWzFdICkgKQotICAgICAgICAgICpyKysgPSBwWzFdOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHJlcG9ydF9pbnZhbGlkX2NoYXJhY3RlcnMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFMCgoICJnZXRfd2luX3N0cmluZzoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIENoYXJhY3RlciBgJWMnICgweCVYKSBpbnZhbGlkIGluIFBTIG5hbWUgc3RyaW5nXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcFsxXSwgcFsxXSApKTsKLSAgICAgICAgICAgIC8qIGl0J3Mgbm90IHRoZSBqb2Igb2YgRnJlZVR5cGUgdG8gY29ycmVjdCBQUyBuYW1lcy4uLiAqLwotICAgICAgICAgICAgKnIrKyA9IHBbMV07Ci0gICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGlmICggcmVwb3J0X2ludmFsaWRfY2hhcmFjdGVycyApCisgICAgICAgICAgRlRfVFJBQ0UwKCggImdldF93aW5fc3RyaW5nOiIKKyAgICAgICAgICAgICAgICAgICAgICAiIENoYXJhY3RlciAweCVYIGludmFsaWQgaW4gUFMgbmFtZSBzdHJpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClwWzBdKSoyNTYgKyAodW5zaWduZWQpcFsxXSApKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQotICAgICpyID0gJ1wwJzsKKyAgICBpZiAoICFsZW4gKQorICAgICAgKnIgPSAnXDAnOwogCiAgICAgRlRfRlJBTUVfRVhJVCgpOwogCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoICFsZW4gKQorICAgICAgcmV0dXJuIHJlc3VsdDsKKworICBnZXRfd2luX3N0cmluZ19lcnJvcjoKKyAgICBGVF9GUkVFKCByZXN1bHQgKTsKKworICAgIGVudHJ5LT5zdHJpbmdMZW5ndGggPSAwOworICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgPSAwOworICAgIEZUX0ZSRUUoIGVudHJ5LT5zdHJpbmcgKTsKKworICAgIHJldHVybiBOVUxMOwogICB9CiAKIApAQCAtNTUyLDE0ICs1NjUsNyBAQAogCiAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZW50cnktPnN0cmluZ09mZnNldCApIHx8CiAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggZW50cnktPnN0cmluZ0xlbmd0aCApICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCByZXN1bHQgKTsKLSAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgPSAwOwotICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICBGVF9GUkVFKCBlbnRyeS0+c3RyaW5nICk7Ci0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KKyAgICAgIGdvdG8gZ2V0X2FwcGxlX3N0cmluZ19lcnJvcjsKIAogICAgIHIgPSAoRlRfU3RyaW5nKilyZXN1bHQ7CiAgICAgcCA9IChGVF9DaGFyKilzdHJlYW0tPmN1cnNvcjsKQEAgLTU3MSwyMCArNTc3LDI4IEBACiAgICAgICBlbHNlCiAgICAgICB7CiAgICAgICAgIGlmICggcmVwb3J0X2ludmFsaWRfY2hhcmFjdGVycyApCi0gICAgICAgIHsKICAgICAgICAgICBGVF9UUkFDRTAoKCAiZ2V0X2FwcGxlX3N0cmluZzoiCiAgICAgICAgICAgICAgICAgICAgICAgIiBDaGFyYWN0ZXIgYCVjJyAoMHglWCkgaW52YWxpZCBpbiBQUyBuYW1lIHN0cmluZ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAqcCwgKnAgKSk7Ci0gICAgICAgICAgLyogaXQncyBub3QgdGhlIGpvYiBvZiBGcmVlVHlwZSB0byBjb3JyZWN0IFBTIG5hbWVzLi4uICovCi0gICAgICAgICAgKnIrKyA9ICpwOwotICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICAqciA9ICdcMCc7CisgICAgaWYgKCAhbGVuICkKKyAgICAgICpyID0gJ1wwJzsKIAogICAgIEZUX0ZSQU1FX0VYSVQoKTsKIAotICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKCAhbGVuICkKKyAgICAgIHJldHVybiByZXN1bHQ7CisKKyAgZ2V0X2FwcGxlX3N0cmluZ19lcnJvcjoKKyAgICBGVF9GUkVFKCByZXN1bHQgKTsKKworICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgPSAwOworICAgIGVudHJ5LT5zdHJpbmdMZW5ndGggPSAwOworICAgIEZUX0ZSRUUoIGVudHJ5LT5zdHJpbmcgKTsKKworICAgIHJldHVybiBOVUxMOwogICB9CiAKIApAQCAtNjA3LDEwICs2MjEsMTAgQEAKIAogICAgICAgaWYgKCBuYW1lLT5uYW1lSUQgPT0gaWQgJiYgbmFtZS0+c3RyaW5nTGVuZ3RoID4gMCApCiAgICAgICB7Ci0gICAgICAgIGlmICggSVNfV0lOKCBuYW1lICkgKQorICAgICAgICBpZiAoIElTX1dJTiggbmFtZSApICYmICggbmFtZS0+bGFuZ3VhZ2VJRCA9PSAweDQwOSB8fCAqd2luID09IC0xICkgKQogICAgICAgICAgICp3aW4gPSBuOwogCi0gICAgICAgIGlmICggSVNfQVBQTEUoIG5hbWUgKSApCisgICAgICAgIGlmICggSVNfQVBQTEUoIG5hbWUgKSAmJiAoIG5hbWUtPmxhbmd1YWdlSUQgPT0gMCB8fCAqYXBwbGUgPT0gLTEgKSApCiAgICAgICAgICAgKmFwcGxlID0gbjsKICAgICAgIH0KICAgICB9CkBAIC02NDMsOSArNjU3LDkgQEAKIAogCiAgIC8qCi0gICAqICBGaW5kIHRoZSBzaG9ydGVzdCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgMTYuMTYgZml4ZWQgcG9pbnQKLSAgICogIG51bWJlci4gIFRoZSBmdW5jdGlvbiBmaWxscyBgYnVmJyB3aXRoIHRoZSByZXN1bHQsIHJldHVybmluZyBhIHBvaW50ZXIKLSAgICogIHRvIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgcmVwcmVzZW50YXRpb24ncyBsYXN0IGJ5dGUuCisgICAqIEZpbmQgdGhlIHNob3J0ZXN0IGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSAxNi4xNiBmaXhlZCBwb2ludAorICAgKiBudW1iZXIuICBUaGUgZnVuY3Rpb24gZmlsbHMgYGJ1Zicgd2l0aCB0aGUgcmVzdWx0LCByZXR1cm5pbmcgYSBwb2ludGVyCisgICAqIHRvIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgcmVwcmVzZW50YXRpb24ncyBsYXN0IGJ5dGUuCiAgICAqLwogCiAgIHN0YXRpYyBjaGFyKgpAQCAtNjczLDcgKzY4Nyw3IEBACiAgICAgaWYgKCBmaXhlZCA8IDAgKQogICAgIHsKICAgICAgICpwKysgPSAnLSc7Ci0gICAgICBmaXhlZCA9IC1maXhlZDsKKyAgICAgIGZpeGVkID0gTkVHX0lOVCggZml4ZWQgKTsKICAgICB9CiAKICAgICBpbnRfcGFydCAgPSAoIGZpeGVkID4+IDE2ICkgJiAweEZGRkY7CkBAIC04MjgsMTMgKzg0MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIHdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaXNfYWxwaGFudW1lcmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgICAgZWxzZQorICAgICAgaWYgKCAhcmVzdWx0ICYmIGFwcGxlICE9IC0xICkKICAgICAgICAgcmVzdWx0ID0gZ2V0X2FwcGxlX3N0cmluZyggZmFjZS0+cm9vdC5tZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm5hbWVfdGFibGUuc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgYXBwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfaXNfYWxwaGFudW1lcmljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7CiAKKyAgICAgIGlmICggIXJlc3VsdCApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMCgoICJzZm50X2dldF92YXJfcHNfbmFtZToiCisgICAgICAgICAgICAgICAgICAgICIgTm8gdmFsaWQgUFMgbmFtZSBwcmVmaXggZm9yIGZvbnQgaW5zdGFuY2VzIGZvdW5kXG4iICkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgIH0KKwogICAgICAgbGVuID0gZnRfc3RybGVuKCByZXN1bHQgKTsKIAogICAgICAgLyogc2FuaXRpemUgaWYgbmVjZXNzYXJ5OyB3ZSByZXNlcnZlIHNwYWNlIGZvciAzNiBieXRlcyAoYSAxMjhiaXQgICovCkBAIC0xMDUyLDcgKzEwNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyB3aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9pc19wb3N0c2NyaXB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKTsKLSAgICBlbHNlCisgICAgaWYgKCAhcmVzdWx0ICYmIGFwcGxlICE9IC0xICkKICAgICAgIHJlc3VsdCA9IGdldF9hcHBsZV9zdHJpbmcoIGZhY2UtPnJvb3QubWVtb3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bmFtZV90YWJsZS5zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgYXBwbGUsCkBAIC0xMDczLDcgKzEwOTQsNyBAQAogCiAKICAgLyoKLSAgICogIFRUIENNQVAgSU5GTworICAgKiBUVCBDTUFQIElORk8KICAgICovCiAgIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoCiAgICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvLApAQCAtMTEzMiw0MSArMTE1Myw0MSBAQAogCiAKICAgLyoKLSAgICogIFNFUlZJQ0UgTElTVAorICAgKiBTRVJWSUNFIExJU1QKICAgICovCiAKICNpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAmJiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fQkRGCiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUoCiAgICAgc2ZudF9zZXJ2aWNlcywKIAotICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJlNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX0dMWVBIX0RJQ1RfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQkRGLCAgICAgICAgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfQkRGX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICkKKyAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUsCisgICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJnNmbnRfc2VydmljZV9wc19uYW1lLAorICAgIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZzZm50X3NlcnZpY2VfZ2x5cGhfZGljdCwKKyAgICBGVF9TRVJWSUNFX0lEX0JERiwgICAgICAgICAgICAgICAgICAmc2ZudF9zZXJ2aWNlX2JkZiwKKyAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmdHRfc2VydmljZV9nZXRfY21hcF9pbmZvICkKICNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCiAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQoCiAgICAgc2ZudF9zZXJ2aWNlcywKIAotICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJlNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX0dMWVBIX0RJQ1RfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgKQorICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZzZm50X3NlcnZpY2Vfc2ZudF90YWJsZSwKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmc2ZudF9zZXJ2aWNlX3BzX25hbWUsCisgICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJnNmbnRfc2VydmljZV9nbHlwaF9kaWN0LAorICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZ0dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8gKQogI2VsaWYgZGVmaW5lZCBUVF9DT05GSUdfT1BUSU9OX0JERgogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KAogICAgIHNmbnRfc2VydmljZXMsCiAKLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9CREYsICAgICAgICAgICAgICAgICAgJlNGTlRfU0VSVklDRV9CREZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgKQorICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZzZm50X3NlcnZpY2Vfc2ZudF90YWJsZSwKKyAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmc2ZudF9zZXJ2aWNlX3BzX25hbWUsCisgICAgRlRfU0VSVklDRV9JRF9CREYsICAgICAgICAgICAgICAgICAgJnNmbnRfc2VydmljZV9iZGYsCisgICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJnR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyApCiAjZWxzZQogICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMzKAogICAgIHNmbnRfc2VydmljZXMsCiAKLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJlRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCApCisgICAgRlRfU0VSVklDRV9JRF9TRk5UX1RBQkxFLCAgICAgICAgICAgJnNmbnRfc2VydmljZV9zZm50X3RhYmxlLAorICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZzZm50X3NlcnZpY2VfcHNfbmFtZSwKKyAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmdHRfc2VydmljZV9nZXRfY21hcF9pbmZvICkKICNlbmRpZgogCiAKQEAgLTExNzQsMjEgKzExOTUsOSBAQAogICBzZm50X2dldF9pbnRlcmZhY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZHVsZV9pbnRlcmZhY2UgKQogICB7Ci0gICAgLyogU0ZOVF9TRVJWSUNFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLQotCi0gICAgaWYgKCAhbW9kdWxlICkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGxpYnJhcnkgPSBtb2R1bGUtPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gTlVMTDsKLSNlbHNlCiAgICAgRlRfVU5VU0VEKCBtb2R1bGUgKTsKLSNlbmRpZgogCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIFNGTlRfU0VSVklDRVNfR0VULCBtb2R1bGVfaW50ZXJmYWNlICk7CisgICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHNmbnRfc2VydmljZXMsIG1vZHVsZV9pbnRlcmZhY2UgKTsKICAgfQogCiAKQEAgLTExOTgsNiArMTIwNywxMiBAQAogI2RlZmluZSBQVVRfRU1CRURERURfQklUTUFQUyggYSApICBOVUxMCiAjZW5kaWYKIAorI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTCisjZGVmaW5lIFBVVF9DT0xPUl9MQVlFUlMoIGEgKSAgYQorI2Vsc2UKKyNkZWZpbmUgUFVUX0NPTE9SX0xBWUVSUyggYSApICBOVUxMCisjZW5kaWYKKwogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwogI2RlZmluZSBQVVRfUFNfTkFNRVMoIGEgKSAgYQogI2Vsc2UKQEAgLTEyNTYsOSArMTI3MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgIGZyZWVfZWJsYyAgICAgICAqLwogCiAgICAgUFVUX0VNQkVEREVEX0JJVE1BUFMoIHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlICAgICApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jIHNldF9zYml0X3N0cmlrZSAqLworICAgICAgICAgICAgICAgICAgIC8qIFRUX1NldF9TQml0X1N0cmlrZV9GdW5jICAgICAgc2V0X3NiaXRfc3RyaWtlICAgICAqLwogICAgIFBVVF9FTUJFRERFRF9CSVRNQVBTKCB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MgKSwKLSAgICAgICAgICAgICAgICAgICAgLyogVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jIGxvYWRfc3RyaWtlX21ldHJpY3MgKi8KKyAgICAgICAgICAgICAgICAgICAvKiBUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMgIGxvYWRfc3RyaWtlX21ldHJpY3MgKi8KKworICAgIFBVVF9DT0xPUl9MQVlFUlMoIHR0X2ZhY2VfbG9hZF9jcGFsICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgbG9hZF9jcGFsICAgICAgICovCisgICAgUFVUX0NPTE9SX0xBWUVSUyggdHRfZmFjZV9sb2FkX2NvbHIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICBsb2FkX2NvbHIgICAgICAgKi8KKyAgICBQVVRfQ09MT1JfTEFZRVJTKCB0dF9mYWNlX2ZyZWVfY3BhbCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUX0ZyZWVfVGFibGVfRnVuYyAgICAgIGZyZWVfY3BhbCAgICAgICAqLworICAgIFBVVF9DT0xPUl9MQVlFUlMoIHR0X2ZhY2VfZnJlZV9jb2xyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgZnJlZV9jb2xyICAgICAgICovCisgICAgUFVUX0NPTE9SX0xBWUVSUyggdHRfZmFjZV9wYWxldHRlX3NldCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRUX1NldF9QYWxldHRlX0Z1bmMgICAgIHNldF9wYWxldHRlICAgICAqLworICAgIFBVVF9DT0xPUl9MQVlFUlMoIHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9HZXRfQ29scl9MYXllcl9GdW5jICBnZXRfY29scl9sYXllciAgKi8KKyAgICBQVVRfQ09MT1JfTEFZRVJTKCB0dF9mYWNlX2NvbHJfYmxlbmRfbGF5ZXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUVF9CbGVuZF9Db2xyX0Z1bmMgICAgICBjb2xyX2JsZW5kICAgICAgKi8KIAogICAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MsICAgIC8qIFRUX0dldF9NZXRyaWNzX0Z1bmMgICAgIGdldF9tZXRyaWNzICAgICAqLwogCkBAIC0xMjc3LDcgKzEzMDcsNyBAQAogICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uIDEuMCAgICAgICAgICAgICAgICAgICAgICovCiAgICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBoaWdoZXIgKi8KIAotICAgIChjb25zdCB2b2lkKikmU0ZOVF9JTlRFUkZBQ0VfR0VULCAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLworICAgIChjb25zdCB2b2lkKikmc2ZudF9pbnRlcmZhY2UsICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCiAKICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKU5VTEwsICAgICAgICAgICAgICAgLyogbW9kdWxlX2luaXQgICAqLwogICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZmRyaXZlci5oIGIvc3JjL3NmbnQvc2Zkcml2ZXIuaAppbmRleCA4MWMyMmQyLi4xYWMyNzA2IDEwMDY0NAotLS0gYS9zcmMvc2ZudC9zZmRyaXZlci5oCisrKyBiL3NyYy9zZm50L3NmZHJpdmVyLmgKQEAgLTEsMzUgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFNGTlQgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHNmZHJpdmVyLmgKKyAqCisgKiAgIEhpZ2gtbGV2ZWwgU0ZOVCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgU0ZEUklWRVJfSF8KICNkZWZpbmUgU0ZEUklWRVJfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RhcGkuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotCiAgIEZUX0RFQ0xBUkVfTU9EVUxFKCBzZm50X21vZHVsZV9jbGFzcyApCiAKLQogRlRfRU5EX0hFQURFUgogCiAjZW5kaWYgLyogU0ZEUklWRVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3NmZXJyb3JzLmggYi9zcmMvc2ZudC9zZmVycm9ycy5oCmluZGV4IDc0MDAzZDQuLjU1YzNlNzYgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3NmZXJyb3JzLmgKKysrIGIvc3JjL3NmbnQvc2ZlcnJvcnMuaApAQCAtMSwzMSArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2ZlcnJvcnMuaAorICoKKyAqICAgU0ZOVCBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFNGTlQgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBTRk5UIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgU0ZFUlJPUlNfSF8KICNkZWZpbmUgU0ZFUlJPUlNfSF8KIAotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KIAogI3VuZGVmIEZURVJST1JTX0hfCiAKQEAgLTMzLDcgKzMzLDcgQEAKICNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgU0ZOVF9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfU0ZOVAogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBTRkVSUk9SU19IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm50LmMgYi9zcmMvc2ZudC9zZm50LmMKaW5kZXggOGI5YTZiMy4uNDcxMjM5ZiAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvc2ZudC5jCisrKyBiL3NyYy9zZm50L3NmbnQuYwpAQCAtMSwzNSArMSwzOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2ZudC5jCisgKgorICogICBTaW5nbGUgb2JqZWN0IGxpYnJhcnkgY29tcG9uZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInBuZ3NoaW0uYyIKICNpbmNsdWRlICJzZmRyaXZlci5jIgotI2luY2x1ZGUgInNmbnRwaWMuYyIKICNpbmNsdWRlICJzZm9ianMuYyIKKyNpbmNsdWRlICJzZndvZmYuYyIKKyNpbmNsdWRlICJzZndvZmYyLmMiCiAjaW5jbHVkZSAidHRiZGYuYyIKICNpbmNsdWRlICJ0dGNtYXAuYyIKKyNpbmNsdWRlICJ0dGNvbHIuYyIKKyNpbmNsdWRlICJ0dGNwYWwuYyIKKwogI2luY2x1ZGUgInR0a2Vybi5jIgogI2luY2x1ZGUgInR0bG9hZC5jIgogI2luY2x1ZGUgInR0bXR4LmMiCiAjaW5jbHVkZSAidHRwb3N0LmMiCiAjaW5jbHVkZSAidHRzYml0LmMiCisjaW5jbHVkZSAid29mZjJ0YWdzLmMiCiAKIAogLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm50cGljLmMgYi9zcmMvc2ZudC9zZm50cGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmQ4MTYuLjAwMDAwMDAKLS0tIGEvc3JjL3NmbnQvc2ZudHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnRwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc2ZudCBtb2R1bGUuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJzZm50cGljLmgiCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHNmZHJpdmVyLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX3NmbnRfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3NmbnRfc2VydmljZXMoIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfYmRmKCBGVF9TZXJ2aWNlX0JERlJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X2ludGVyZmFjZSggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRk5UX0ludGVyZmFjZSogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCgKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX3BzX25hbWUoCi0gICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV9nZXRfY21hcF9pbmZvKAotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgRlRfU2VydmljZV9UVENNYXBzUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9zZm50X3RhYmxlKAotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyogIGNsYXp6ICk7Ci0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIHR0Y21hcC5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3R0X2NtYXBfY2xhc3NlcyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwX0NsYXNzKiAgY2xhenogKTsKLQotCi0gIHZvaWQKLSAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5zZm50ICkKLSAgICB7Ci0gICAgICBzZm50TW9kdWxlUElDKiAgY29udGFpbmVyID0gKHNmbnRNb2R1bGVQSUMqKXBpY19jb250YWluZXItPnNmbnQ7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPnNmbnRfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3NmbnRfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5zZm50X3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnNmbnRfc2VydmljZXMgPSBOVUxMOwotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+dHRfY21hcF9jbGFzc2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItPnR0X2NtYXBfY2xhc3NlcyApOwotICAgICAgY29udGFpbmVyLT50dF9jbWFwX2NsYXNzZXMgPSBOVUxMOwotCi0gICAgICBGVF9GUkVFKCBjb250YWluZXIgKTsKLSAgICAgIHBpY19jb250YWluZXItPnNmbnQgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBzZm50TW9kdWxlUElDKiAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIGFsbG9jYXRlIHBvaW50ZXIsIGNsZWFyIGFuZCBzZXQgZ2xvYmFsIGNvbnRhaW5lciBwb2ludGVyICovCi0gICAgaWYgKCBGVF9BTExPQyggY29udGFpbmVyLCBzaXplb2YgKCAqY29udGFpbmVyICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgRlRfTUVNX1NFVCggY29udGFpbmVyLCAwLCBzaXplb2YgKCAqY29udGFpbmVyICkgKTsKLSAgICBwaWNfY29udGFpbmVyLT5zZm50ID0gY29udGFpbmVyOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3Nfc2ZudF9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGFpbmVyLT50dF9jbWFwX2NsYXNzZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCApOwotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX3BzX25hbWUoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5zZm50X3NlcnZpY2VfcHNfbmFtZSApOwotICAgIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV9nZXRfY21hcF9pbmZvKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+dHRfc2VydmljZV9nZXRfY21hcF9pbmZvICk7Ci0gICAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2Vfc2ZudF90YWJsZSgKLSAgICAgICZjb250YWluZXItPnNmbnRfc2VydmljZV9zZm50X3RhYmxlICk7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9iZGYoICZjb250YWluZXItPnNmbnRfc2VydmljZV9iZGYgKTsKLSNlbmRpZgotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9pbnRlcmZhY2UoIGxpYnJhcnksICZjb250YWluZXItPnNmbnRfaW50ZXJmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHNmbnRfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZudHBpYy5oIGIvc3JjL3NmbnQvc2ZudHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQzMTIyLi4wMDAwMDAwCi0tLSBhL3NyYy9zZm50L3NmbnRwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm50cGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHNmbnQgbW9kdWxlLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgU0ZOVFBJQ19IXwotI2RlZmluZSBTRk5UUElDX0hfCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgU0ZOVF9TRVJWSUNFU19HRVQgICAgICAgICAgICBzZm50X3NlcnZpY2VzCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX1BTX05BTUVfR0VUICAgICBzZm50X3NlcnZpY2VfcHNfbmFtZQotI2RlZmluZSBUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgICAgIHR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbwotI2RlZmluZSBUVF9DTUFQX0NMQVNTRVNfR0VUICAgICAgICAgIHR0X2NtYXBfY2xhc3NlcwotI2RlZmluZSBTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQgIHNmbnRfc2VydmljZV9zZm50X3RhYmxlCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9CREZfR0VUICAgICAgICAgc2ZudF9zZXJ2aWNlX2JkZgotI2RlZmluZSBTRk5UX0lOVEVSRkFDRV9HRVQgICAgICAgICAgIHNmbnRfaW50ZXJmYWNlCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogc29tZSBpbmNsdWRlIGZpbGVzIHJlcXVpcmVkIGZvciBtZW1iZXJzIG9mIHNmbnRNb2R1bGVQSUMgKi8KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UVF9DTUFQX0gKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0jaW5jbHVkZSAidHRiZGYuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0gKLSNlbmRpZgotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSAidHRjbWFwLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIHNmbnRNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgIHNmbnRfc2VydmljZXM7Ci0gICAgRlRfU2VydmljZV9HbHlwaERpY3RSZWMgICBzZm50X3NlcnZpY2VfZ2x5cGhfZGljdDsKLSAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIHNmbnRfc2VydmljZV9wc19uYW1lOwotICAgIEZUX1NlcnZpY2VfVFRDTWFwc1JlYyAgICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvOwotICAgIFRUX0NNYXBfQ2xhc3MqICAgICAgICAgICAgdHRfY21hcF9jbGFzc2VzOwotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyAgc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGU7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBGVF9TZXJ2aWNlX0JERlJlYyAgICAgICAgIHNmbnRfc2VydmljZV9iZGY7Ci0jZW5kaWYKLSAgICBTRk5UX0ludGVyZmFjZSAgICAgICAgICAgIHNmbnRfaW50ZXJmYWNlOwotCi0gIH0gc2ZudE1vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoc2ZudE1vZHVsZVBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5zZm50ICkgKQotCi0jZGVmaW5lIFNGTlRfU0VSVklDRVNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfc2VydmljZXMgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX3BzX25hbWUgKQotI2RlZmluZSBUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfZ2V0X2NtYXBfaW5mbyApCi0jZGVmaW5lIFRUX0NNQVBfQ0xBU1NFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfY21hcF9jbGFzc2VzICkKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfc2VydmljZV9zZm50X3RhYmxlICkKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX0JERl9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX2JkZiApCi0jZGVmaW5lIFNGTlRfSU5URVJGQUNFX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X2ludGVyZmFjZSApCi0KLQotICAvKiBzZWUgc2ZudHBpYy5jIGZvciB0aGUgaW1wbGVtZW50YXRpb24gKi8KLSAgdm9pZAotICBzZm50X21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHNmbnRfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0jZW5kaWYgLyogU0ZOVFBJQ19IXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2ZvYmpzLmMgYi9zcmMvc2ZudC9zZm9ianMuYwppbmRleCA2YmE4NTA5Li4zOTQ2MGJlIDEwMDY0NAotLS0gYS9zcmMvc2ZudC9zZm9ianMuYworKysgYi9zcmMvc2ZudC9zZm9ianMuYwpAQCAtMSwzNyArMSwzNyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNGTlQgb2JqZWN0IG1hbmFnZW1lbnQgKGJhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2ZvYmpzLmMKKyAqCisgKiAgIFNGTlQgb2JqZWN0IG1hbmFnZW1lbnQgKGJhc2UpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAic2ZvYmpzLmgiCiAjaW5jbHVkZSAidHRsb2FkLmgiCiAjaW5jbHVkZSAidHRjbWFwLmgiCiAjaW5jbHVkZSAidHRrZXJuLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9TRk5UX05BTUVTX0gKLSNpbmNsdWRlIEZUX0daSVBfSAorI2luY2x1ZGUgInNmd29mZi5oIgorI2luY2x1ZGUgInNmd29mZjIuaCIKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0bmFtZWlkLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdHNuYW1lcy5oPgogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KICNlbmRpZgogCiAjaW5jbHVkZSAic2ZlcnJvcnMuaCIKQEAgLTQxLDE0ICs0MSwxNCBAQAogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc2ZvYmpzCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgc2ZvYmpzCiAKIAogCkBAIC0zMzcsNDA4ICszMzcsMTMgQEAKICAgfQogCiAKLSNkZWZpbmUgV1JJVEVfVVNIT1JUKCBwLCB2ICkgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDggKTsgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMCApOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgV1JJVEVfVUxPTkcoIHAsIHYgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDI0ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDE2ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICA4ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICAwICk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLQotICBzdGF0aWMgdm9pZAotICBzZm50X3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7Ci0KLSAgICBzdHJlYW0tPnNpemUgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgID0gTlVMTDsKLSAgICBzdHJlYW0tPmNsb3NlID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBjb21wYXJlX29mZnNldHMoIGNvbnN0IHZvaWQqICBhLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKLSAgewotICAgIFdPRkZfVGFibGUgIHRhYmxlMSA9ICooV09GRl9UYWJsZSopYTsKLSAgICBXT0ZGX1RhYmxlICB0YWJsZTIgPSAqKFdPRkZfVGFibGUqKWI7Ci0KLSAgICBGVF9VTG9uZyAgb2Zmc2V0MSA9IHRhYmxlMS0+T2Zmc2V0OwotICAgIEZUX1VMb25nICBvZmZzZXQyID0gdGFibGUyLT5PZmZzZXQ7Ci0KLQotICAgIGlmICggb2Zmc2V0MSA+IG9mZnNldDIgKQotICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZSBpZiAoIG9mZnNldDEgPCBvZmZzZXQyICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogUmVwbGFjZSBgZmFjZS0+cm9vdC5zdHJlYW0nIHdpdGggYSBzdHJlYW0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkICovCi0gIC8qIFNGTlQgb2YgYSBXT0ZGIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB3b2ZmX29wZW5fZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBXT0ZGX0hlYWRlclJlYyAgd29mZjsKLSAgICBXT0ZGX1RhYmxlICAgICAgdGFibGVzICA9IE5VTEw7Ci0gICAgV09GRl9UYWJsZSogICAgIGluZGljZXMgPSBOVUxMOwotCi0gICAgRlRfVUxvbmcgICAgICAgIHdvZmZfb2Zmc2V0OwotCi0gICAgRlRfQnl0ZSogICAgICAgIHNmbnQgICAgICAgID0gTlVMTDsKLSAgICBGVF9TdHJlYW0gICAgICAgc2ZudF9zdHJlYW0gPSBOVUxMOwotCi0gICAgRlRfQnl0ZSogICAgICAgIHNmbnRfaGVhZGVyOwotICAgIEZUX1VMb25nICAgICAgICBzZm50X29mZnNldDsKLQotICAgIEZUX0ludCAgICAgICAgICBubjsKLSAgICBGVF9VTG9uZyAgICAgICAgb2xkX3RhZyA9IDA7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdvZmZfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdPRkZfSGVhZGVyUmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA0NCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHNpZ25hdHVyZSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGZsYXZvciApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGxlbmd0aCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bV90YWJsZXMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCByZXNlcnZlZCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHRvdGFsU2ZudFNpemUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYWpvclZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtaW5vclZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBtZXRhT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggbWV0YUxlbmd0aCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1ldGFPcmlnTGVuZ3RoICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggcHJpdk9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHByaXZMZW5ndGggKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtID09IGZhY2UtPnJvb3Quc3RyZWFtICk7Ci0gICAgRlRfQVNTRVJUKCBGVF9TVFJFQU1fUE9TKCkgPT0gMCApOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdvZmZfaGVhZGVyX2ZpZWxkcywgJndvZmYgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjdXJzZSBiYWNrIGhlcmUgb3IgaGl0IFRUQyBjb2RlLiAqLwotICAgIGlmICggd29mZi5mbGF2b3IgPT0gVFRBR193T0ZGIHx8IHdvZmYuZmxhdm9yID09IFRUQUdfdHRjZiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIC8qIE1pc2NlbGxhbmVvdXMgY2hlY2tzLiAqLwotICAgIGlmICggd29mZi5sZW5ndGggIT0gc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIHdvZmYubnVtX3RhYmxlcyA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICA0NCArIHdvZmYubnVtX3RhYmxlcyAqIDIwVUwgPj0gd29mZi5sZW5ndGggICAgICAgICAgICAgICB8fAotICAgICAgICAgMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNlVMID49IHdvZmYudG90YWxTZm50U2l6ZSAgICAgICAgfHwKLSAgICAgICAgICggd29mZi50b3RhbFNmbnRTaXplICYgMyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIHdvZmYubWV0YU9mZnNldCA9PSAwICYmICggd29mZi5tZXRhTGVuZ3RoICE9IDAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZi5tZXRhT3JpZ0xlbmd0aCAhPSAwICkgKSB8fAotICAgICAgICAgKCB3b2ZmLm1ldGFMZW5ndGggIT0gMCAmJiB3b2ZmLm1ldGFPcmlnTGVuZ3RoID09IDAgKSAgICAgfHwKLSAgICAgICAgICggd29mZi5wcml2T2Zmc2V0ID09IDAgJiYgd29mZi5wcml2TGVuZ3RoICE9IDAgKSAgICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCBXT0ZGIGhlYWRlclxuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIH0KLQotICAgIC8qIERvbid0IHRydXN0IGB0b3RhbFNmbnRTaXplJyBiZWZvcmUgdGhvcm91Z2ggY2hlY2tzLiAqLwotICAgIGlmICggRlRfQUxMT0MoIHNmbnQsIDEyICsgd29mZi5udW1fdGFibGVzICogMTZVTCApIHx8Ci0gICAgICAgICBGVF9ORVcoIHNmbnRfc3RyZWFtICkgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2ZudF9oZWFkZXIgPSBzZm50OwotCi0gICAgLyogV3JpdGUgc2ZudCBoZWFkZXIuICovCi0gICAgewotICAgICAgRlRfVUludCAgc2VhcmNoUmFuZ2UsIGVudHJ5U2VsZWN0b3IsIHJhbmdlU2hpZnQsIHg7Ci0KLQotICAgICAgeCAgICAgICAgICAgICA9IHdvZmYubnVtX3RhYmxlczsKLSAgICAgIGVudHJ5U2VsZWN0b3IgPSAwOwotICAgICAgd2hpbGUgKCB4ICkKLSAgICAgIHsKLSAgICAgICAgeCAgICAgICAgICAgID4+PSAxOwotICAgICAgICBlbnRyeVNlbGVjdG9yICs9IDE7Ci0gICAgICB9Ci0gICAgICBlbnRyeVNlbGVjdG9yLS07Ci0KLSAgICAgIHNlYXJjaFJhbmdlID0gKCAxIDw8IGVudHJ5U2VsZWN0b3IgKSAqIDE2OwotICAgICAgcmFuZ2VTaGlmdCAgPSB3b2ZmLm51bV90YWJsZXMgKiAxNiAtIHNlYXJjaFJhbmdlOwotCi0gICAgICBXUklURV9VTE9ORyAoIHNmbnRfaGVhZGVyLCB3b2ZmLmZsYXZvciApOwotICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgd29mZi5udW1fdGFibGVzICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCBzZWFyY2hSYW5nZSApOwotICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgZW50cnlTZWxlY3RvciApOwotICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgcmFuZ2VTaGlmdCApOwotICAgIH0KLQotICAgIC8qIFdoaWxlIHRoZSBlbnRyaWVzIGluIHRoZSBzZm50IGhlYWRlciBtdXN0IGJlIHNvcnRlZCBieSB0aGUgKi8KLSAgICAvKiB0YWcgdmFsdWUsIHRoZSB0YWJsZXMgdGhlbXNlbHZlcyBhcmUgbm90LiAgV2UgdGh1cyBoYXZlIHRvICovCi0gICAgLyogc29ydCB0aGVtIGJ5IG9mZnNldCBhbmQgY2hlY2sgdGhhdCB0aGV5IGRvbid0IG92ZXJsYXAuICAgICAqLwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlcywgd29mZi5udW1fdGFibGVzICkgIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGluZGljZXMsIHdvZmYubnVtX3RhYmxlcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFMigoICJcbiIKLSAgICAgICAgICAgICAgICAiICB0YWcgICAgb2Zmc2V0ICAgIGNvbXBMZW4gIG9yaWdMZW4gIGNoZWNrc3VtXG4iCi0gICAgICAgICAgICAgICAgIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApKTsKLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDIwTCAqIHdvZmYubnVtX3RhYmxlcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmLm51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIFdPRkZfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47Ci0KLSAgICAgIHRhYmxlLT5UYWcgICAgICAgID0gRlRfR0VUX1RBRzQoKTsKLSAgICAgIHRhYmxlLT5PZmZzZXQgICAgID0gRlRfR0VUX1VMT05HKCk7Ci0gICAgICB0YWJsZS0+Q29tcExlbmd0aCA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgdGFibGUtPk9yaWdMZW5ndGggPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIHRhYmxlLT5DaGVja1N1bSAgID0gRlRfR0VUX1VMT05HKCk7Ci0KLSAgICAgIEZUX1RSQUNFMigoICIgICVjJWMlYyVjICAlMDhseCAgJTA4bHggICUwOGx4ICAlMDhseFxuIiwKLSAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyA+PiAyNCApLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLT5UYWcgPj4gOCAgKSwKLSAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyAgICAgICApLAotICAgICAgICAgICAgICAgICAgdGFibGUtPk9mZnNldCwKLSAgICAgICAgICAgICAgICAgIHRhYmxlLT5Db21wTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgdGFibGUtPk9yaWdMZW5ndGgsCi0gICAgICAgICAgICAgICAgICB0YWJsZS0+Q2hlY2tTdW0gKSk7Ci0KLSAgICAgIGlmICggdGFibGUtPlRhZyA8PSBvbGRfdGFnICkKLSAgICAgIHsKLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAgIEZUX0VSUk9SKCggIndvZmZfZm9udF9vcGVuOiB0YWJsZSB0YWdzIGFyZSBub3Qgc29ydGVkXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgb2xkX3RhZyAgICAgPSB0YWJsZS0+VGFnOwotICAgICAgaW5kaWNlc1tubl0gPSB0YWJsZTsKLSAgICB9Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KLQotICAgIGZ0X3Fzb3J0KCBpbmRpY2VzLAotICAgICAgICAgICAgICB3b2ZmLm51bV90YWJsZXMsCi0gICAgICAgICAgICAgIHNpemVvZiAoIFdPRkZfVGFibGUgKSwKLSAgICAgICAgICAgICAgY29tcGFyZV9vZmZzZXRzICk7Ci0KLSAgICAvKiBDaGVjayBvZmZzZXRzIGFuZCBsZW5ndGhzLiAqLwotCi0gICAgd29mZl9vZmZzZXQgPSA0NCArIHdvZmYubnVtX3RhYmxlcyAqIDIwTDsKLSAgICBzZm50X29mZnNldCA9IDEyICsgd29mZi5udW1fdGFibGVzICogMTZMOwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IHdvZmYubnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgV09GRl9UYWJsZSAgdGFibGUgPSBpbmRpY2VzW25uXTsKLQotCi0gICAgICBpZiAoIHRhYmxlLT5PZmZzZXQgIT0gd29mZl9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgdGFibGUtPkNvbXBMZW5ndGggPiB3b2ZmLmxlbmd0aCAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB0YWJsZS0+T2Zmc2V0ID4gd29mZi5sZW5ndGggLSB0YWJsZS0+Q29tcExlbmd0aCAgICAgIHx8Ci0gICAgICAgICAgIHRhYmxlLT5PcmlnTGVuZ3RoID4gd29mZi50b3RhbFNmbnRTaXplICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgc2ZudF9vZmZzZXQgPiB3b2ZmLnRvdGFsU2ZudFNpemUgLSB0YWJsZS0+T3JpZ0xlbmd0aCB8fAotICAgICAgICAgICB0YWJsZS0+Q29tcExlbmd0aCA+IHRhYmxlLT5PcmlnTGVuZ3RoICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IGludmFsaWQgdGFibGUgb2Zmc2V0c1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHRhYmxlLT5PcmlnT2Zmc2V0ID0gc2ZudF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFRoZSBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGVzIG9mIDQuICovCi0gICAgICB3b2ZmX29mZnNldCArPSAoIHRhYmxlLT5Db21wTGVuZ3RoICsgMyApICYgfjNVOwotICAgICAgc2ZudF9vZmZzZXQgKz0gKCB0YWJsZS0+T3JpZ0xlbmd0aCArIDMgKSAmIH4zVTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpbmFsIGNoZWNrcyEKLSAgICAgKgotICAgICAqIFdlIGRvbid0IGRlY29kZSBhbmQgY2hlY2sgdGhlIG1ldGFkYXRhIGJsb2NrLgotICAgICAqIFdlIGRvbid0IGNoZWNrIHRhYmxlIGNoZWNrc3VtcyBlaXRoZXIuCi0gICAgICogQnV0IG90aGVyIHRoYW4gdGhvc2UsIEkgdGhpbmsgd2UgaW1wbGVtZW50IGFsbAotICAgICAqIGBNVVNUJyBjaGVja3MgZnJvbSB0aGUgc3BlYy4KLSAgICAgKi8KLQotICAgIGlmICggd29mZi5tZXRhT2Zmc2V0ICkKLSAgICB7Ci0gICAgICBpZiAoIHdvZmYubWV0YU9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHdvZmYubWV0YU9mZnNldCArIHdvZmYubWV0YUxlbmd0aCA+IHdvZmYubGVuZ3RoICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IgotICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBgbWV0YWRhdGEnIG9mZnNldCBvciBsZW5ndGhcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBXZSBoYXZlIHBhZGRpbmcgb25seSAuLi4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ICs9IHdvZmYubWV0YUxlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoIHdvZmYucHJpdk9mZnNldCApCi0gICAgewotICAgICAgLyogLi4uIGlmIGl0IGlzbid0IHRoZSBsYXN0IGJsb2NrLiAqLwotICAgICAgd29mZl9vZmZzZXQgPSAoIHdvZmZfb2Zmc2V0ICsgMyApICYgfjNVOwotCi0gICAgICBpZiAoIHdvZmYucHJpdk9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHdvZmYucHJpdk9mZnNldCArIHdvZmYucHJpdkxlbmd0aCA+IHdvZmYubGVuZ3RoICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IGludmFsaWQgYHByaXZhdGUnIG9mZnNldCBvciBsZW5ndGhcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBObyBwYWRkaW5nIGZvciB0aGUgbGFzdCBibG9jay4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ICs9IHdvZmYucHJpdkxlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoIHNmbnRfb2Zmc2V0ICE9IHdvZmYudG90YWxTZm50U2l6ZSB8fAotICAgICAgICAgd29mZl9vZmZzZXQgIT0gd29mZi5sZW5ndGggICAgICAgICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCBgc2ZudCcgdGFibGUgc3RydWN0dXJlXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIE5vdyB1c2UgYHRvdGFsU2ZudFNpemUnLiAqLwotICAgIGlmICggRlRfUkVBTExPQyggc2ZudCwKLSAgICAgICAgICAgICAgICAgICAgIDEyICsgd29mZi5udW1fdGFibGVzICogMTZVTCwKLSAgICAgICAgICAgICAgICAgICAgIHdvZmYudG90YWxTZm50U2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNmbnRfaGVhZGVyID0gc2ZudCArIDEyOwotCi0gICAgLyogV3JpdGUgdGhlIHRhYmxlcy4gKi8KLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmLm51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIFdPRkZfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47Ci0KLQotICAgICAgLyogV3JpdGUgU0ZOVCB0YWJsZSBlbnRyeS4gKi8KLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPlRhZyApOwotICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+Q2hlY2tTdW0gKTsKLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdPZmZzZXQgKTsKLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdMZW5ndGggKTsKLQotICAgICAgLyogV3JpdGUgdGFibGUgZGF0YS4gKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlLT5PZmZzZXQgKSAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHRhYmxlLT5Db21wTGVuZ3RoICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggdGFibGUtPkNvbXBMZW5ndGggPT0gdGFibGUtPk9yaWdMZW5ndGggKQotICAgICAgewotICAgICAgICAvKiBVbmNvbXByZXNzZWQgZGF0YTsganVzdCBjb3B5LiAqLwotICAgICAgICBmdF9tZW1jcHkoIHNmbnQgKyB0YWJsZS0+T3JpZ09mZnNldCwKLSAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmN1cnNvciwKLSAgICAgICAgICAgICAgICAgICB0YWJsZS0+T3JpZ0xlbmd0aCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLQotICAgICAgICAvKiBVbmNvbXByZXNzIHdpdGggemxpYi4gKi8KLSAgICAgICAgRlRfVUxvbmcgIG91dHB1dF9sZW4gPSB0YWJsZS0+T3JpZ0xlbmd0aDsKLQotCi0gICAgICAgIGVycm9yID0gRlRfR3ppcF9VbmNvbXByZXNzKCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50ICsgdGFibGUtPk9yaWdPZmZzZXQsICZvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jdXJzb3IsIHRhYmxlLT5Db21wTGVuZ3RoICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgaWYgKCBvdXRwdXRfbGVuICE9IHRhYmxlLT5PcmlnTGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggIndvZmZfZm9udF9vcGVuOiBjb21wcmVzc2VkIHRhYmxlIGxlbmd0aCBtaXNtYXRjaFxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCICovCi0KLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCICovCi0gICAgICB9Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgICAgLyogV2UgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGUgcGFkZGluZyBieXRlcyBpbiB0aGUgV09GRiBmaWxlIGFyZSAgICAgKi8KLSAgICAgIC8qIGFjdHVhbGx5ICdcMCcuICBGb3IgdGhlIG91dHB1dCwgaG93ZXZlciwgd2UgZG8gc2V0IHRoZW0gcHJvcGVybHkuICovCi0gICAgICBzZm50X29mZnNldCA9IHRhYmxlLT5PcmlnT2Zmc2V0ICsgdGFibGUtPk9yaWdMZW5ndGg7Ci0gICAgICB3aGlsZSAoIHNmbnRfb2Zmc2V0ICYgMyApCi0gICAgICB7Ci0gICAgICAgIHNmbnRbc2ZudF9vZmZzZXRdID0gJ1wwJzsKLSAgICAgICAgc2ZudF9vZmZzZXQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBPayEgIEZpbmFsbHkgcmVhZHkuICBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHVybi4gKi8KLSAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggc2ZudF9zdHJlYW0sIHNmbnQsIHdvZmYudG90YWxTZm50U2l6ZSApOwotICAgIHNmbnRfc3RyZWFtLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBzZm50X3N0cmVhbS0+Y2xvc2UgID0gc2ZudF9zdHJlYW1fY2xvc2U7Ci0KLSAgICBGVF9TdHJlYW1fRnJlZSgKLSAgICAgIGZhY2UtPnJvb3Quc3RyZWFtLAotICAgICAgKCBmYWNlLT5yb290LmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICkgIT0gMCApOwotCi0gICAgZmFjZS0+cm9vdC5zdHJlYW0gPSBzZm50X3N0cmVhbTsKLQotICAgIGZhY2UtPnJvb3QuZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTTsKLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIHRhYmxlcyApOwotICAgIEZUX0ZSRUUoIGluZGljZXMgKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHNmbnQgKTsKLSAgICAgIEZUX1N0cmVhbV9DbG9zZSggc2ZudF9zdHJlYW0gKTsKLSAgICAgIEZUX0ZSRUUoIHNmbnRfc3RyZWFtICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI3VuZGVmIFdSSVRFX1VTSE9SVAotI3VuZGVmIFdSSVRFX1VMT05HCi0KLQogICAvKiBGaWxsIGluIGZhY2UtPnR0Y19oZWFkZXIuICBJZiB0aGUgZm9udCBpcyBub3QgYSBUVEMsIGl0IGlzICovCiAgIC8qIHN5bnRoZXNpemVkIGludG8gYSBUVEMgd2l0aCBvbmUgb2Zmc2V0IHRhYmxlLiAgICAgICAgICAgICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIHNmbnRfb3Blbl9mb250KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgZmFjZSApCisgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgIHdvZmYyX251bV9mYWNlcyApCiAgIHsKICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwogICAgIEZUX0Vycm9yICAgZXJyb3I7CkBAIC03ODIsNiArMzg3LDI1IEBACiAgICAgICBnb3RvIHJldHJ5OwogICAgIH0KIAorICAgIGlmICggdGFnID09IFRUQUdfd09GMiApCisgICAgeworICAgICAgRlRfVFJBQ0UyKCggInNmbnRfb3Blbl9mb250OiBmaWxlIGlzIGEgV09GRjI7IHN5bnRoZXNpemluZyBTRk5UXG4iICkpOworCisgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgZXJyb3IgPSB3b2ZmMl9vcGVuX2ZvbnQoIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZjJfbnVtX2ZhY2VzICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICAvKiBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHJ5ISAqLworICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07CisgICAgICBnb3RvIHJldHJ5OworICAgIH0KKwogICAgIGlmICggdGFnICE9IDB4MDAwMTAwMDBVTCAmJgogICAgICAgICAgdGFnICE9IFRUQUdfdHRjZiAgICAmJgogICAgICAgICAgdGFnICE9IFRUQUdfT1RUTyAgICAmJgpAQCAtODU4LDkgKzQ4MiwxMCBAQAogICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKICAgewogICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5ID0gZmFjZS0+cm9vdC5kcml2ZXItPnJvb3QubGlicmFyeTsKKyAgICBGVF9MaWJyYXJ5ICAgIGxpYnJhcnkgICAgICAgICA9IGZhY2UtPnJvb3QuZHJpdmVyLT5yb290LmxpYnJhcnk7CiAgICAgU0ZOVF9TZXJ2aWNlICBzZm50OwogICAgIEZUX0ludCAgICAgICAgZmFjZV9pbmRleDsKKyAgICBGVF9Mb25nICAgICAgIHdvZmYyX251bV9mYWNlcyA9IDA7CiAKIAogICAgIC8qIGZvciBub3csIHBhcmFtZXRlcnMgYXJlIHVudXNlZCAqLwpAQCAtOTExLDE0ICs1MzYsMTkgQEAKIAogICAgIEZUX1RSQUNFMigoICJTRk5UIGRyaXZlclxuIiApKTsKIAotICAgIGVycm9yID0gc2ZudF9vcGVuX2ZvbnQoIHN0cmVhbSwgZmFjZSApOworICAgIGVycm9yID0gc2ZudF9vcGVuX2ZvbnQoIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlX2luc3RhbmNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3b2ZmMl9udW1fZmFjZXMgKTsKICAgICBpZiAoIGVycm9yICkKICAgICAgIHJldHVybiBlcnJvcjsKIAogICAgIC8qIFN0cmVhbSBtYXkgaGF2ZSBjaGFuZ2VkIGluIHNmbnRfb3Blbl9mb250LiAqLwogICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwogCi0gICAgRlRfVFJBQ0UyKCggInNmbnRfaW5pdF9mYWNlOiAlMDhwLCAlZFxuIiwgZmFjZSwgZmFjZV9pbnN0YW5jZV9pbmRleCApKTsKKyAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICVwIChpbmRleCAlZClcbiIsCisgICAgICAgICAgICAgICAgKHZvaWQgKilmYWNlLAorICAgICAgICAgICAgICAgIGZhY2VfaW5zdGFuY2VfaW5kZXggKSk7CiAKICAgICBmYWNlX2luZGV4ID0gRlRfQUJTKCBmYWNlX2luc3RhbmNlX2luZGV4ICkgJiAweEZGRkY7CiAKQEAgLTEwMDEsMTUgKzYzMSwxNSBAQAogICAgICAgICBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCB8PSBUVF9GQUNFX0ZMQUdfVkFSX0ZWQVI7CiAKICAgICAgIC8qCi0gICAgICAgKiAgQXMgZG9jdW1lbnRlZCBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiwgYW4gZW50cnkgZm9yIHRoZQotICAgICAgICogIGRlZmF1bHQgaW5zdGFuY2UgbWF5IGJlIG9taXR0ZWQgaW4gdGhlIG5hbWVkIGluc3RhbmNlIHRhYmxlLiAgSW4KLSAgICAgICAqICBwYXJ0aWN1bGFyIHRoaXMgbWVhbnMgdGhhdCBldmVuIGlmIHRoZXJlIGlzIG5vIG5hbWVkIGluc3RhbmNlCi0gICAgICAgKiAgdGFibGUgaW4gdGhlIGZvbnQgd2UgYWN0dWFsbHkgZG8gaGF2ZSBhIG5hbWVkIGluc3RhbmNlLCBuYW1lbHkgdGhlCi0gICAgICAgKiAgZGVmYXVsdCBpbnN0YW5jZS4KKyAgICAgICAqIEFzIGRvY3VtZW50ZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24sIGFuIGVudHJ5IGZvciB0aGUKKyAgICAgICAqIGRlZmF1bHQgaW5zdGFuY2UgbWF5IGJlIG9taXR0ZWQgaW4gdGhlIG5hbWVkIGluc3RhbmNlIHRhYmxlLiAgSW4KKyAgICAgICAqIHBhcnRpY3VsYXIgdGhpcyBtZWFucyB0aGF0IGV2ZW4gaWYgdGhlcmUgaXMgbm8gbmFtZWQgaW5zdGFuY2UKKyAgICAgICAqIHRhYmxlIGluIHRoZSBmb250IHdlIGFjdHVhbGx5IGRvIGhhdmUgYSBuYW1lZCBpbnN0YW5jZSwgbmFtZWx5IHRoZQorICAgICAgICogZGVmYXVsdCBpbnN0YW5jZS4KICAgICAgICAqCi0gICAgICAgKiAgRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgd2FudCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpbiBvdXIgbGlzdAotICAgICAgICogIG9mIG5hbWVkIGluc3RhbmNlcy4gIElmIGl0IGlzIG1pc3NpbmcsIHdlIHRyeSB0byBzeW50aGVzaXplIGl0Ci0gICAgICAgKiAgbGF0ZXIgb24uICBIZXJlLCB3ZSBoYXZlIHRvIGFkanVzdCBgbnVtX2luc3RhbmNlcycgYWNjb3JkaW5nbHkuCisgICAgICAgKiBGb3IgY29uc2lzdGVuY3ksIHdlIGFsd2F5cyB3YW50IHRoZSBkZWZhdWx0IGluc3RhbmNlIGluIG91ciBsaXN0CisgICAgICAgKiBvZiBuYW1lZCBpbnN0YW5jZXMuICBJZiBpdCBpcyBtaXNzaW5nLCB3ZSB0cnkgdG8gc3ludGhlc2l6ZSBpdAorICAgICAgICogbGF0ZXIgb24uICBIZXJlLCB3ZSBoYXZlIHRvIGFkanVzdCBgbnVtX2luc3RhbmNlcycgYWNjb3JkaW5nbHkuCiAgICAgICAgKi8KIAogICAgICAgaWYgKCAoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9GVkFSICkgJiYKQEAgLTEwODQsNiArNzE0LDEwIEBACiAgICAgZmFjZS0+cm9vdC5udW1fZmFjZXMgID0gZmFjZS0+dHRjX2hlYWRlci5jb3VudDsKICAgICBmYWNlLT5yb290LmZhY2VfaW5kZXggPSBmYWNlX2luc3RhbmNlX2luZGV4OwogCisgICAgLyogYG51bV9mYWNlcycgZm9yIGEgV09GRjIgbmVlZHMgdG8gYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LiAqLworICAgIGlmICggd29mZjJfbnVtX2ZhY2VzICkKKyAgICAgIGZhY2UtPnJvb3QubnVtX2ZhY2VzID0gd29mZjJfbnVtX2ZhY2VzOworCiAgICAgcmV0dXJuIGVycm9yOwogICB9CiAKQEAgLTExODYsNyArODIwLDcgQEAKICAgICAvKiBpdCBkb2Vzbid0IGNvbnRhaW4gb3V0bGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgICBGVF9UUkFDRTIoKCAic2ZudF9sb2FkX2ZhY2U6ICUwOHBcblxuIiwgZmFjZSApKTsKKyAgICBGVF9UUkFDRTIoKCAic2ZudF9sb2FkX2ZhY2U6ICVwXG5cbiIsICh2b2lkICopZmFjZSApKTsKIAogICAgIC8qIGRvIHdlIGhhdmUgb3V0bGluZXMgaW4gdGhlcmU/ICovCiAjaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTApAQCAtMTM0MSw2ICs5NzUsMTMgQEAKICAgICBpZiAoIHNmbnQtPmxvYWRfZWJsYyApCiAgICAgICBMT0FEXyggZWJsYyApOwogCisgICAgLyogY29sb3JlZCBnbHlwaCBzdXBwb3J0ICovCisgICAgaWYgKCBzZm50LT5sb2FkX2NwYWwgKQorICAgIHsKKyAgICAgIExPQURfKCBjcGFsICk7CisgICAgICBMT0FEXyggY29sciApOworICAgIH0KKwogICAgIC8qIGNvbnNpZGVyIHRoZSBwY2x0LCBrZXJuaW5nLCBhbmQgZ2FzcCB0YWJsZXMgYXMgb3B0aW9uYWwgKi8KICAgICBMT0FEXyggcGNsdCApOwogICAgIExPQURfKCBnYXNwICk7CkBAIC0xMzg5LDEyICsxMDMwLDEzIEBACiAgICAgICBGVF9Mb25nICBmbGFncyA9IHJvb3QtPmZhY2VfZmxhZ3M7CiAKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIGZhY2UgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgKgorICAgICAgICogQ29tcHV0ZSBmYWNlIGZsYWdzLgorICAgICAgICovCiAgICAgICBpZiAoIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9PSBUVF9TQklUX1RBQkxFX1RZUEVfQ0JMQyB8fAotICAgICAgICAgICBmYWNlLT5zYml0X3RhYmxlX3R5cGUgPT0gVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVggKQorICAgICAgICAgICBmYWNlLT5zYml0X3RhYmxlX3R5cGUgPT0gVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVggfHwKKyAgICAgICAgICAgZmFjZS0+Y29sciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0NPTE9SOyAgICAgIC8qIGNvbG9yIGdseXBocyAqLwogCiAgICAgICBpZiAoIGhhc19vdXRsaW5lID09IFRSVUUgKQpAQCAtMTQzOCwxMCArMTA4MCwxMCBAQAogCiAgICAgICByb290LT5mYWNlX2ZsYWdzID0gZmxhZ3M7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQ29tcHV0ZSBzdHlsZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICoKKyAgICAgICAqIENvbXB1dGUgc3R5bGUgZmxhZ3MuCisgICAgICAgKi8KIAogICAgICAgZmxhZ3MgPSAwOwogICAgICAgaWYgKCBoYXNfb3V0bGluZSA9PSBUUlVFICYmIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQpAQCAtMTQ3MSwxNCArMTExMywxNCBAQAogCiAgICAgICByb290LT5zdHlsZV9mbGFncyB8PSBmbGFnczsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBQb2xpc2ggdGhlIGNoYXJtYXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgVHJ5IHRvIHNldCB0aGUgY2hhcm1hcCBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtICYgICAgICovCi0gICAgICAvKiAgIGVuY29kaW5nIElEIG9mIGVhY2ggY2hhcm1hcC4gIEVtdWxhdGUgVW5pY29kZSBjaGFybWFwIGlmIG9uZSAgICAqLwotICAgICAgLyogICBpcyBtaXNzaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICoKKyAgICAgICAqIFBvbGlzaCB0aGUgY2hhcm1hcHMuCisgICAgICAgKgorICAgICAgICogICBUcnkgdG8gc2V0IHRoZSBjaGFybWFwIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0gJgorICAgICAgICogICBlbmNvZGluZyBJRCBvZiBlYWNoIGNoYXJtYXAuICBFbXVsYXRlIFVuaWNvZGUgY2hhcm1hcCBpZiBvbmUKKyAgICAgICAqICAgaXMgbWlzc2luZy4KKyAgICAgICAqLwogCiAgICAgICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBmYWNlICk7ICAvKiBpZ25vcmUgZXJyb3JzICovCiAKQEAgLTE1MjEsNyArMTE2Myw4IEBACiAgICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggKEZUX0NNYXBfQ2xhc3MpJnR0X2NtYXBfdW5pY29kZV9jbGFzc19yZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJmNtYXByZWMsIE5VTEwgKTsKICAgICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICkKKyAgICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSAmJgorICAgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKIApAQCAtMTUzMyw5ICsxMTc2LDkgQEAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKIAogICAgICAgLyoKLSAgICAgICAqICBOb3cgYWxsb2NhdGUgdGhlIHJvb3QgYXJyYXkgb2YgRlRfQml0bWFwX1NpemUgcmVjb3JkcyBhbmQKLSAgICAgICAqICBwb3B1bGF0ZSB0aGVtLiAgVW5mb3J0dW5hdGVseSwgaXQgaXNuJ3QgcG9zc2libGUgdG8gaW5kaWNhdGUgYml0Ci0gICAgICAgKiAgZGVwdGhzIGluIHRoZSBGVF9CaXRtYXBfU2l6ZSByZWNvcmQuICBUaGlzIGlzIGEgZGVzaWduIGVycm9yLgorICAgICAgICogTm93IGFsbG9jYXRlIHRoZSByb290IGFycmF5IG9mIEZUX0JpdG1hcF9TaXplIHJlY29yZHMgYW5kCisgICAgICAgKiBwb3B1bGF0ZSB0aGVtLiAgVW5mb3J0dW5hdGVseSwgaXQgaXNuJ3QgcG9zc2libGUgdG8gaW5kaWNhdGUgYml0CisgICAgICAgKiBkZXB0aHMgaW4gdGhlIEZUX0JpdG1hcF9TaXplIHJlY29yZC4gIFRoaXMgaXMgYSBkZXNpZ24gZXJyb3IuCiAgICAgICAgKi8KICAgICAgIHsKICAgICAgICAgRlRfVUludCAgY291bnQ7CkBAIC0xNjE1LDEwICsxMjU4LDEwIEBACiAgICAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFOwogCiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogIFNldCB1cCBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICoKKyAgICAgICAqIFNldCB1cCBtZXRyaWNzLgorICAgICAgICovCiAgICAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCByb290ICkgKQogICAgICAgewogICAgICAgICAvKiBYWFggV2hhdCBhYm91dCBpZiBvdXRsaW5lIGhlYWRlciBpcyBtaXNzaW5nICovCkBAIC0xNjMwLDU5ICsxMjczLDczIEBACiAgICAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IGZhY2UtPmhlYWRlci5Vbml0c19QZXJfRU07CiAKIAotICAgICAgICAvKiBYWFg6IENvbXB1dGluZyB0aGUgYXNjZW5kZXIvZGVzY2VuZGVyL2hlaWdodCBpcyB2ZXJ5IGRpZmZlcmVudCAqLwotICAgICAgICAvKiAgICAgIGZyb20gd2hhdCB0aGUgc3BlY2lmaWNhdGlvbiB0ZWxscyB5b3UuICBBcHBhcmVudGx5LCB3ZSAgICAqLwotICAgICAgICAvKiAgICAgIG11c3QgYmUgY2FyZWZ1bCBiZWNhdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIC0gbm90IGFsbCBmb250cyBoYXZlIGFuIE9TLzIgdGFibGU7IGluIHRoaXMgY2FzZSwgd2UgdGFrZSAqLwotICAgICAgICAvKiAgICAgICAgdGhlIHZhbHVlcyBpbiB0aGUgaG9yaXpvbnRhbCBoZWFkZXIuICBIb3dldmVyLCB0aGVzZSAgICAqLwotICAgICAgICAvKiAgICAgICAgdmFsdWVzIHZlcnkgb2Z0ZW4gYXJlIG5vdCByZWxpYWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIC0gb3RoZXJ3aXNlLCB0aGUgY29ycmVjdCB0eXBvZ3JhcGhpYyB2YWx1ZXMgYXJlIGluIHRoZSAgICAqLwotICAgICAgICAvKiAgICAgICAgc1R5cG9Bc2NlbmRlciwgc1R5cG9EZXNjZW5kZXIgJiBzVHlwb0xpbmVHYXAgZmllbGRzLiAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgSG93ZXZlciwgY2VydGFpbiBmb250cyBoYXZlIHRoZXNlIGZpZWxkcyBzZXQgdG8gMC4gICAgICAqLwotICAgICAgICAvKiAgICAgICAgUmF0aGVyLCB0aGV5IGhhdmUgdXNXaW5Bc2NlbnQgJiB1c1dpbkRlc2NlbnQgY29ycmVjdGx5ICAqLwotICAgICAgICAvKiAgICAgICAgc2V0IChidXQgd2l0aCBkaWZmZXJlbnQgdmFsdWVzKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIEFzIGFuIGV4YW1wbGUsIEFyaWFsIE5hcnJvdyBpcyBpbXBsZW1lbnRlZCB0aHJvdWdoIGZvdXIgICAqLwotICAgICAgICAvKiAgICAgIGZpbGVzIEFSSUFMTi5UVEYsIEFSSUFMTkkuVFRGLCBBUklBTE5CLlRURiAmIEFSSUFMTkJJLlRURiAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIFN0cmFuZ2VseSwgYWxsIGZvbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWVzIGluIHRoZWlyICAgICAgICAqLwotICAgICAgICAvKiAgICAgIHNUeXBvWFhYIGZpZWxkcywgZXhjZXB0IEFSSUFMTkIgd2hpY2ggc2V0cyB0aGVtIHRvIDAuICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCB0aGV5IGFsbCBoYXZlIGRpZmZlcmVudCAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgIHVzV2luQXNjZW50L0Rlc2NlbnQgdmFsdWVzIC0tIGFzIGEgY29uY2x1c2lvbiwgdGhlIE9TLzIgICAqLwotICAgICAgICAvKiAgICAgIHRhYmxlIGNhbm5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHRleHQgaGVpZ2h0IHJlbGlhYmx5ISAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKgorICAgICAgICAgKiBDb21wdXRpbmcgdGhlIGFzY2VuZGVyL2Rlc2NlbmRlci9oZWlnaHQgaXMgdHJpY2t5LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiB2MS44LjMgc2F5czoKKyAgICAgICAgICoKKyAgICAgICAgICogICBbT1MvMidzXSBzVHlwb0FzY2VuZGVyLCBzVHlwb0Rlc2NlbmRlciBhbmQgc1R5cG9MaW5lR2FwIGZpZWxkcworICAgICAgICAgKiAgIGFyZSBpbnRlbmRlZCB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gbGF5IG91dCBkb2N1bWVudHMgaW4gYQorICAgICAgICAgKiAgIHR5cG9ncmFwaGljYWxseS1jb3JyZWN0IGFuZCBwb3J0YWJsZSBmYXNoaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGlzIHNvbWV3aGF0IGF0IG9kZHMgd2l0aCB0aGUgZGVjYWRlcyBvZiBiYWNrd2FyZHMKKyAgICAgICAgICogY29tcGF0aWJpbGl0eSwgb3BlcmF0aW5nIHN5c3RlbXMgYW5kIGFwcGxpY2F0aW9ucyBkb2luZyB3aGF0ZXZlcgorICAgICAgICAgKiB0aGV5IHdhbnQsIG5vdCB0byBtZW50aW9uIGJyb2tlbiBmb250cy4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90IGFsbCBmb250cyBoYXZlIGFuIE9TLzIgdGFibGU7IGluIHRoaXMgY2FzZSwgd2UgdGFrZSB0aGUgdmFsdWVzCisgICAgICAgICAqIGluIHRoZSBob3Jpem9udGFsIGhlYWRlciwgYWx0aG91Z2ggdGhlcmUgaXMgbm90aGluZyBzdG9wcGluZyB0aGUKKyAgICAgICAgICogdmFsdWVzIGZyb20gYmVpbmcgdW5yZWxpYWJsZS4gRXZlbiB3aXRoIGEgT1MvMiB0YWJsZSwgY2VydGFpbiBmb250cworICAgICAgICAgKiBzZXQgdGhlIHNUeXBvQXNjZW5kZXIsIHNUeXBvRGVzY2VuZGVyIGFuZCBzVHlwb0xpbmVHYXAgZmllbGRzIHRvIDAKKyAgICAgICAgICogYW5kIGluc3RlYWQgY29ycmVjdGx5IHNldCB1c1dpbkFzY2VudCBhbmQgdXNXaW5EZXNjZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBBcyBhbiBleGFtcGxlLCBBcmlhbCBOYXJyb3cgaXMgc2hpcHBlZCBhcyBmb3VyIGZpbGVzIEFSSUFMTi5UVEYsCisgICAgICAgICAqIEFSSUFMTkkuVFRGLCBBUklBTE5CLlRURiBhbmQgQVJJQUxOQkkuVFRGLiBTdHJhbmdlbHksIGFsbCBmb250cyBoYXZlCisgICAgICAgICAqIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGVpciBzVHlwbyogZmllbGRzLCBleGNlcHQgQVJJQUxOQi50dGYgd2hpY2gKKyAgICAgICAgICogc2V0cyB0aGVtIHRvIDAuIEFsbCBvZiB0aGVtIGhhdmUgZGlmZmVyZW50IHVzV2luQXNjZW50L0Rlc2NlbnQKKyAgICAgICAgICogdmFsdWVzLiBUaGUgT1MvMiB0YWJsZSB0aGVyZWZvcmUgY2Fubm90IGJlIHRydXN0ZWQgZm9yIGNvbXB1dGluZyB0aGUKKyAgICAgICAgICogdGV4dCBoZWlnaHQgcmVsaWFibHkuCisgICAgICAgICAqCisgICAgICAgICAqIEFzIGEgY29tcHJvbWlzZSwgZG8gdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICoKKyAgICAgICAgICogMS4gSWYgdGhlIE9TLzIgdGFibGUgZXhpc3RzIGFuZCB0aGUgZnNTZWxlY3Rpb24gYml0IDcgaXMgc2V0CisgICAgICAgICAqICAgIChVU0VfVFlQT19NRVRSSUNTKSwgdHJ1c3QgdGhlIGZvbnQgYW5kIHVzZSB0aGUgc1R5cG8qIG1ldHJpY3MuCisgICAgICAgICAqIDIuIE90aGVyd2lzZSwgdXNlIHRoZSBgaGhlYScgdGFibGUncyBtZXRyaWNzLgorICAgICAgICAgKiAzLiBJZiB0aGV5IGFyZSB6ZXJvIGFuZCB0aGUgT1MvMiB0YWJsZSBleGlzdHMsCisgICAgICAgICAqICAgIDEuIHVzZSB0aGUgT1MvMiB0YWJsZSdzIHNUeXBvKiBtZXRyaWNzIGlmIHRoZXkgYXJlIG5vbi16ZXJvLgorICAgICAgICAgKiAgICAyLiBPdGhlcndpc2UsIHVzZSB0aGUgT1MvMiB0YWJsZSdzIHVzV2luKiBtZXRyaWNzLgorICAgICAgICAgKi8KIAotICAgICAgICAvKiBUaGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciBhcmUgdGFrZW4gZnJvbSB0aGUgYGhoZWEnIHRhYmxlLiAqLwotICAgICAgICAvKiBJZiB6ZXJvLCB0aGV5IGFyZSB0YWtlbiBmcm9tIHRoZSBgT1MvMicgdGFibGUuICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXI7Ci0gICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyOwotCi0gICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5MaW5lX0dhcDsKLQotICAgICAgICBpZiAoICEoIHJvb3QtPmFzY2VuZGVyIHx8IHJvb3QtPmRlc2NlbmRlciApICkKKyAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICYmIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDEyOCApCiAgICAgICAgIHsKLSAgICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQorICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOworICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKKyAgICAgICAgICByb290LT5oZWlnaHQgICAgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvTGluZUdhcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICByb290LT5hc2NlbmRlciAgPSBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyOworICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyOworICAgICAgICAgIHJvb3QtPmhlaWdodCAgICA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkxpbmVfR2FwOworCisgICAgICAgICAgaWYgKCAhKCByb290LT5hc2NlbmRlciB8fCByb290LT5kZXNjZW5kZXIgKSApCiAgICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciB8fCBmYWNlLT5vczIuc1R5cG9EZXNjZW5kZXIgKQorICAgICAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXI7Ci0gICAgICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKLQotICAgICAgICAgICAgICByb290LT5oZWlnaHQgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0xpbmVHYXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9ICAoRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luQXNjZW50OwotICAgICAgICAgICAgICByb290LT5kZXNjZW5kZXIgPSAtKEZUX1Nob3J0KWZhY2UtPm9zMi51c1dpbkRlc2NlbnQ7Ci0KLSAgICAgICAgICAgICAgcm9vdC0+aGVpZ2h0ID0gcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXI7CisgICAgICAgICAgICAgIGlmICggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgfHwgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOworICAgICAgICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKKyAgICAgICAgICAgICAgICByb290LT5oZWlnaHQgICAgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvTGluZUdhcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb290LT5hc2NlbmRlciAgPSAgKEZUX1Nob3J0KWZhY2UtPm9zMi51c1dpbkFzY2VudDsKKyAgICAgICAgICAgICAgICByb290LT5kZXNjZW5kZXIgPSAtKEZUX1Nob3J0KWZhY2UtPm9zMi51c1dpbkRlc2NlbnQ7CisgICAgICAgICAgICAgICAgcm9vdC0+aGVpZ2h0ICAgID0gIHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzM3LDYgKzEzOTQsMTMgQEAKICAgICAgIC8qIGRlc3Ryb3kgdGhlIGVtYmVkZGVkIGJpdG1hcHMgdGFibGUgaWYgaXQgaXMgbG9hZGVkICovCiAgICAgICBpZiAoIHNmbnQtPmZyZWVfZWJsYyApCiAgICAgICAgIHNmbnQtPmZyZWVfZWJsYyggZmFjZSApOworCisgICAgICAvKiBkZXN0cm95IGNvbG9yIHRhYmxlIGRhdGEgaWYgaXQgaXMgbG9hZGVkICovCisgICAgICBpZiAoIHNmbnQtPmZyZWVfY3BhbCApCisgICAgICB7CisgICAgICAgIHNmbnQtPmZyZWVfY3BhbCggZmFjZSApOworICAgICAgICBzZm50LT5mcmVlX2NvbHIoIGZhY2UgKTsKKyAgICAgIH0KICAgICB9CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgpAQCAtMTc5MiwxMSArMTQ1NiwxOCBAQAogICAgIEZUX0ZSRUUoIGZhY2UtPnNiaXRfc3RyaWtlX21hcCApOwogICAgIGZhY2UtPnJvb3QubnVtX2ZpeGVkX3NpemVzID0gMDsKIAotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKICAgICBGVF9GUkVFKCBmYWNlLT5wb3N0c2NyaXB0X25hbWUgKTsKKworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKICAgICBGVF9GUkVFKCBmYWNlLT52YXJfcG9zdHNjcmlwdF9wcmVmaXggKTsKICNlbmRpZgogCisgICAgLyogZnJlZWluZyBnbHlwaCBjb2xvciBwYWxldHRlIGRhdGEgKi8KKyAgICBGVF9GUkVFKCBmYWNlLT5wYWxldHRlX2RhdGEucGFsZXR0ZV9uYW1lX2lkcyApOworICAgIEZUX0ZSRUUoIGZhY2UtPnBhbGV0dGVfZGF0YS5wYWxldHRlX2ZsYWdzICk7CisgICAgRlRfRlJFRSggZmFjZS0+cGFsZXR0ZV9kYXRhLnBhbGV0dGVfZW50cnlfbmFtZV9pZHMgKTsKKyAgICBGVF9GUkVFKCBmYWNlLT5wYWxldHRlICk7CisKICAgICBmYWNlLT5zZm50ID0gTlVMTDsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvc2ZudC9zZm9ianMuaCBiL3NyYy9zZm50L3Nmb2Jqcy5oCmluZGV4IDFiOGQxYmUuLmU4ZTMwNDIgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3Nmb2Jqcy5oCisrKyBiL3NyYy9zZm50L3Nmb2Jqcy5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZm9ianMuaAorICoKKyAqICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFNGT0JKU19IXwogI2RlZmluZSBTRk9CSlNfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpAQCAtNTMsNyArNTIsNyBAQAogCiBGVF9FTkRfSEVBREVSCiAKLSNlbmRpZiAvKiBTRkRSSVZFUl9IXyAqLworI2VuZGlmIC8qIFNGT0JKU19IXyAqLwogCiAKIC8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvc2Z3b2ZmLmMgYi9zcmMvc2ZudC9zZndvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGEzMmUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvc2Z3b2ZmLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2Z3b2ZmLmMKKyAqCisgKiAgIFdPRkYgZm9ybWF0IG1hbmFnZW1lbnQgKGJhc2UpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2luY2x1ZGUgInNmd29mZi5oIgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0Z3ppcC5oPgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHNmd29mZgorCisKKyNkZWZpbmUgV1JJVEVfVVNIT1JUKCBwLCB2ICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDggKTsgXAorICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKyNkZWZpbmUgV1JJVEVfVUxPTkcoIHAsIHYgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDI0ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDE2ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICA4ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICAwICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKworICBzdGF0aWMgdm9pZAorICBzZm50X3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworCisgICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7CisKKyAgICBzdHJlYW0tPnNpemUgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgID0gTlVMTDsKKyAgICBzdHJlYW0tPmNsb3NlID0gTlVMTDsKKyAgfQorCisKKyAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQorICBjb21wYXJlX29mZnNldHMoIGNvbnN0IHZvaWQqICBhLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKKyAgeworICAgIFdPRkZfVGFibGUgIHRhYmxlMSA9ICooV09GRl9UYWJsZSopYTsKKyAgICBXT0ZGX1RhYmxlICB0YWJsZTIgPSAqKFdPRkZfVGFibGUqKWI7CisKKyAgICBGVF9VTG9uZyAgb2Zmc2V0MSA9IHRhYmxlMS0+T2Zmc2V0OworICAgIEZUX1VMb25nICBvZmZzZXQyID0gdGFibGUyLT5PZmZzZXQ7CisKKworICAgIGlmICggb2Zmc2V0MSA+IG9mZnNldDIgKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoIG9mZnNldDEgPCBvZmZzZXQyICkKKyAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyogUmVwbGFjZSBgZmFjZS0+cm9vdC5zdHJlYW0nIHdpdGggYSBzdHJlYW0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkICovCisgIC8qIFNGTlQgb2YgYSBXT0ZGIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQorICB3b2ZmX29wZW5fZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UgKQorICB7CisgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OworICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7CisKKyAgICBXT0ZGX0hlYWRlclJlYyAgd29mZjsKKyAgICBXT0ZGX1RhYmxlICAgICAgdGFibGVzICA9IE5VTEw7CisgICAgV09GRl9UYWJsZSogICAgIGluZGljZXMgPSBOVUxMOworCisgICAgRlRfVUxvbmcgICAgICAgIHdvZmZfb2Zmc2V0OworCisgICAgRlRfQnl0ZSogICAgICAgIHNmbnQgICAgICAgID0gTlVMTDsKKyAgICBGVF9TdHJlYW0gICAgICAgc2ZudF9zdHJlYW0gPSBOVUxMOworCisgICAgRlRfQnl0ZSogICAgICAgIHNmbnRfaGVhZGVyOworICAgIEZUX1VMb25nICAgICAgICBzZm50X29mZnNldDsKKworICAgIEZUX0ludCAgICAgICAgICBubjsKKyAgICBGVF9VTG9uZyAgICAgICAgb2xkX3RhZyA9IDA7CisKKyAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdvZmZfaGVhZGVyX2ZpZWxkc1tdID0KKyAgICB7CisjdW5kZWYgIEZUX1NUUlVDVFVSRQorI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdPRkZfSGVhZGVyUmVjCisKKyAgICAgIEZUX0ZSQU1FX1NUQVJUKCA0NCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHNpZ25hdHVyZSApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGZsYXZvciApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGxlbmd0aCApLAorICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bV90YWJsZXMgKSwKKyAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCByZXNlcnZlZCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHRvdGFsU2ZudFNpemUgKSwKKyAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYWpvclZlcnNpb24gKSwKKyAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtaW5vclZlcnNpb24gKSwKKyAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBtZXRhT2Zmc2V0ICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICggbWV0YUxlbmd0aCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1ldGFPcmlnTGVuZ3RoICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICggcHJpdk9mZnNldCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHByaXZMZW5ndGggKSwKKyAgICAgIEZUX0ZSQU1FX0VORAorICAgIH07CisKKworICAgIEZUX0FTU0VSVCggc3RyZWFtID09IGZhY2UtPnJvb3Quc3RyZWFtICk7CisgICAgRlRfQVNTRVJUKCBGVF9TVFJFQU1fUE9TKCkgPT0gMCApOworCisgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdvZmZfaGVhZGVyX2ZpZWxkcywgJndvZmYgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjdXJzZSBiYWNrIGhlcmUgb3IgaGl0IFRUQyBjb2RlLiAqLworICAgIGlmICggd29mZi5mbGF2b3IgPT0gVFRBR193T0ZGIHx8IHdvZmYuZmxhdm9yID09IFRUQUdfdHRjZiApCisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKworICAgIC8qIE1pc2NlbGxhbmVvdXMgY2hlY2tzLiAqLworICAgIGlmICggd29mZi5sZW5ndGggIT0gc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIHdvZmYubnVtX3RhYmxlcyA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICA0NCArIHdvZmYubnVtX3RhYmxlcyAqIDIwVUwgPj0gd29mZi5sZW5ndGggICAgICAgICAgICAgICB8fAorICAgICAgICAgMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNlVMID49IHdvZmYudG90YWxTZm50U2l6ZSAgICAgICAgfHwKKyAgICAgICAgICggd29mZi50b3RhbFNmbnRTaXplICYgMyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAoIHdvZmYubWV0YU9mZnNldCA9PSAwICYmICggd29mZi5tZXRhTGVuZ3RoICE9IDAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZi5tZXRhT3JpZ0xlbmd0aCAhPSAwICkgKSB8fAorICAgICAgICAgKCB3b2ZmLm1ldGFMZW5ndGggIT0gMCAmJiB3b2ZmLm1ldGFPcmlnTGVuZ3RoID09IDAgKSAgICAgfHwKKyAgICAgICAgICggd29mZi5wcml2T2Zmc2V0ID09IDAgJiYgd29mZi5wcml2TGVuZ3RoICE9IDAgKSAgICAgICAgICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCBXT0ZGIGhlYWRlclxuIiApKTsKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgIH0KKworICAgIC8qIERvbid0IHRydXN0IGB0b3RhbFNmbnRTaXplJyBiZWZvcmUgdGhvcm91Z2ggY2hlY2tzLiAqLworICAgIGlmICggRlRfQUxMT0MoIHNmbnQsIDEyICsgd29mZi5udW1fdGFibGVzICogMTZVTCApIHx8CisgICAgICAgICBGVF9ORVcoIHNmbnRfc3RyZWFtICkgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgZ290byBFeGl0OworCisgICAgc2ZudF9oZWFkZXIgPSBzZm50OworCisgICAgLyogV3JpdGUgc2ZudCBoZWFkZXIuICovCisgICAgeworICAgICAgRlRfVUludCAgc2VhcmNoUmFuZ2UsIGVudHJ5U2VsZWN0b3IsIHJhbmdlU2hpZnQsIHg7CisKKworICAgICAgeCAgICAgICAgICAgICA9IHdvZmYubnVtX3RhYmxlczsKKyAgICAgIGVudHJ5U2VsZWN0b3IgPSAwOworICAgICAgd2hpbGUgKCB4ICkKKyAgICAgIHsKKyAgICAgICAgeCAgICAgICAgICAgID4+PSAxOworICAgICAgICBlbnRyeVNlbGVjdG9yICs9IDE7CisgICAgICB9CisgICAgICBlbnRyeVNlbGVjdG9yLS07CisKKyAgICAgIHNlYXJjaFJhbmdlID0gKCAxIDw8IGVudHJ5U2VsZWN0b3IgKSAqIDE2OworICAgICAgcmFuZ2VTaGlmdCAgPSB3b2ZmLm51bV90YWJsZXMgKiAxNiAtIHNlYXJjaFJhbmdlOworCisgICAgICBXUklURV9VTE9ORyAoIHNmbnRfaGVhZGVyLCB3b2ZmLmZsYXZvciApOworICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgd29mZi5udW1fdGFibGVzICk7CisgICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCBzZWFyY2hSYW5nZSApOworICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgZW50cnlTZWxlY3RvciApOworICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgcmFuZ2VTaGlmdCApOworICAgIH0KKworICAgIC8qIFdoaWxlIHRoZSBlbnRyaWVzIGluIHRoZSBzZm50IGhlYWRlciBtdXN0IGJlIHNvcnRlZCBieSB0aGUgKi8KKyAgICAvKiB0YWcgdmFsdWUsIHRoZSB0YWJsZXMgdGhlbXNlbHZlcyBhcmUgbm90LiAgV2UgdGh1cyBoYXZlIHRvICovCisgICAgLyogc29ydCB0aGVtIGJ5IG9mZnNldCBhbmQgY2hlY2sgdGhhdCB0aGV5IGRvbid0IG92ZXJsYXAuICAgICAqLworCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlcywgd29mZi5udW1fdGFibGVzICkgIHx8CisgICAgICAgICBGVF9ORVdfQVJSQVkoIGluZGljZXMsIHdvZmYubnVtX3RhYmxlcyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIEZUX1RSQUNFMigoICJcbiIKKyAgICAgICAgICAgICAgICAiICB0YWcgICAgb2Zmc2V0ICAgIGNvbXBMZW4gIG9yaWdMZW4gIGNoZWNrc3VtXG4iCisgICAgICAgICAgICAgICAgIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApKTsKKworICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDIwTCAqIHdvZmYubnVtX3RhYmxlcyApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmLm51bV90YWJsZXM7IG5uKysgKQorICAgIHsKKyAgICAgIFdPRkZfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47CisKKyAgICAgIHRhYmxlLT5UYWcgICAgICAgID0gRlRfR0VUX1RBRzQoKTsKKyAgICAgIHRhYmxlLT5PZmZzZXQgICAgID0gRlRfR0VUX1VMT05HKCk7CisgICAgICB0YWJsZS0+Q29tcExlbmd0aCA9IEZUX0dFVF9VTE9ORygpOworICAgICAgdGFibGUtPk9yaWdMZW5ndGggPSBGVF9HRVRfVUxPTkcoKTsKKyAgICAgIHRhYmxlLT5DaGVja1N1bSAgID0gRlRfR0VUX1VMT05HKCk7CisKKyAgICAgIEZUX1RSQUNFMigoICIgICVjJWMlYyVjICAlMDhseCAgJTA4bHggICUwOGx4ICAlMDhseFxuIiwKKyAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyA+PiAyNCApLAorICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnID4+IDE2ICksCisgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLT5UYWcgPj4gOCAgKSwKKyAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyAgICAgICApLAorICAgICAgICAgICAgICAgICAgdGFibGUtPk9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHRhYmxlLT5Db21wTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgdGFibGUtPk9yaWdMZW5ndGgsCisgICAgICAgICAgICAgICAgICB0YWJsZS0+Q2hlY2tTdW0gKSk7CisKKyAgICAgIGlmICggdGFibGUtPlRhZyA8PSBvbGRfdGFnICkKKyAgICAgIHsKKyAgICAgICAgRlRfRlJBTUVfRVhJVCgpOworCisgICAgICAgIEZUX0VSUk9SKCggIndvZmZfZm9udF9vcGVuOiB0YWJsZSB0YWdzIGFyZSBub3Qgc29ydGVkXG4iICkpOworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgb2xkX3RhZyAgICAgPSB0YWJsZS0+VGFnOworICAgICAgaW5kaWNlc1tubl0gPSB0YWJsZTsKKyAgICB9CisKKyAgICBGVF9GUkFNRV9FWElUKCk7CisKKyAgICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KKworICAgIGZ0X3Fzb3J0KCBpbmRpY2VzLAorICAgICAgICAgICAgICB3b2ZmLm51bV90YWJsZXMsCisgICAgICAgICAgICAgIHNpemVvZiAoIFdPRkZfVGFibGUgKSwKKyAgICAgICAgICAgICAgY29tcGFyZV9vZmZzZXRzICk7CisKKyAgICAvKiBDaGVjayBvZmZzZXRzIGFuZCBsZW5ndGhzLiAqLworCisgICAgd29mZl9vZmZzZXQgPSA0NCArIHdvZmYubnVtX3RhYmxlcyAqIDIwTDsKKyAgICBzZm50X29mZnNldCA9IDEyICsgd29mZi5udW1fdGFibGVzICogMTZMOworCisgICAgZm9yICggbm4gPSAwOyBubiA8IHdvZmYubnVtX3RhYmxlczsgbm4rKyApCisgICAgeworICAgICAgV09GRl9UYWJsZSAgdGFibGUgPSBpbmRpY2VzW25uXTsKKworCisgICAgICBpZiAoIHRhYmxlLT5PZmZzZXQgIT0gd29mZl9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgdGFibGUtPkNvbXBMZW5ndGggPiB3b2ZmLmxlbmd0aCAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICB0YWJsZS0+T2Zmc2V0ID4gd29mZi5sZW5ndGggLSB0YWJsZS0+Q29tcExlbmd0aCAgICAgIHx8CisgICAgICAgICAgIHRhYmxlLT5PcmlnTGVuZ3RoID4gd29mZi50b3RhbFNmbnRTaXplICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgc2ZudF9vZmZzZXQgPiB3b2ZmLnRvdGFsU2ZudFNpemUgLSB0YWJsZS0+T3JpZ0xlbmd0aCB8fAorICAgICAgICAgICB0YWJsZS0+Q29tcExlbmd0aCA+IHRhYmxlLT5PcmlnTGVuZ3RoICAgICAgICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IGludmFsaWQgdGFibGUgb2Zmc2V0c1xuIiApKTsKKyAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisKKyAgICAgIHRhYmxlLT5PcmlnT2Zmc2V0ID0gc2ZudF9vZmZzZXQ7CisKKyAgICAgIC8qIFRoZSBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGVzIG9mIDQuICovCisgICAgICB3b2ZmX29mZnNldCArPSAoIHRhYmxlLT5Db21wTGVuZ3RoICsgMyApICYgfjNVOworICAgICAgc2ZudF9vZmZzZXQgKz0gKCB0YWJsZS0+T3JpZ0xlbmd0aCArIDMgKSAmIH4zVTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpbmFsIGNoZWNrcyEKKyAgICAgKgorICAgICAqIFdlIGRvbid0IGRlY29kZSBhbmQgY2hlY2sgdGhlIG1ldGFkYXRhIGJsb2NrLgorICAgICAqIFdlIGRvbid0IGNoZWNrIHRhYmxlIGNoZWNrc3VtcyBlaXRoZXIuCisgICAgICogQnV0IG90aGVyIHRoYW4gdGhvc2UsIEkgdGhpbmsgd2UgaW1wbGVtZW50IGFsbAorICAgICAqIGBNVVNUJyBjaGVja3MgZnJvbSB0aGUgc3BlYy4KKyAgICAgKi8KKworICAgIGlmICggd29mZi5tZXRhT2Zmc2V0ICkKKyAgICB7CisgICAgICBpZiAoIHdvZmYubWV0YU9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIHdvZmYubWV0YU9mZnNldCArIHdvZmYubWV0YUxlbmd0aCA+IHdvZmYubGVuZ3RoICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IgorICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBgbWV0YWRhdGEnIG9mZnNldCBvciBsZW5ndGhcbiIgKSk7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICAvKiBXZSBoYXZlIHBhZGRpbmcgb25seSAuLi4gKi8KKyAgICAgIHdvZmZfb2Zmc2V0ICs9IHdvZmYubWV0YUxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoIHdvZmYucHJpdk9mZnNldCApCisgICAgeworICAgICAgLyogLi4uIGlmIGl0IGlzbid0IHRoZSBsYXN0IGJsb2NrLiAqLworICAgICAgd29mZl9vZmZzZXQgPSAoIHdvZmZfb2Zmc2V0ICsgMyApICYgfjNVOworCisgICAgICBpZiAoIHdvZmYucHJpdk9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIHdvZmYucHJpdk9mZnNldCArIHdvZmYucHJpdkxlbmd0aCA+IHdvZmYubGVuZ3RoICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAid29mZl9mb250X29wZW46IGludmFsaWQgYHByaXZhdGUnIG9mZnNldCBvciBsZW5ndGhcbiIgKSk7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICAvKiBObyBwYWRkaW5nIGZvciB0aGUgbGFzdCBibG9jay4gKi8KKyAgICAgIHdvZmZfb2Zmc2V0ICs9IHdvZmYucHJpdkxlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoIHNmbnRfb2Zmc2V0ICE9IHdvZmYudG90YWxTZm50U2l6ZSB8fAorICAgICAgICAgd29mZl9vZmZzZXQgIT0gd29mZi5sZW5ndGggICAgICAgICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogaW52YWxpZCBgc2ZudCcgdGFibGUgc3RydWN0dXJlXG4iICkpOworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIC8qIE5vdyB1c2UgYHRvdGFsU2ZudFNpemUnLiAqLworICAgIGlmICggRlRfUkVBTExPQyggc2ZudCwKKyAgICAgICAgICAgICAgICAgICAgIDEyICsgd29mZi5udW1fdGFibGVzICogMTZVTCwKKyAgICAgICAgICAgICAgICAgICAgIHdvZmYudG90YWxTZm50U2l6ZSApICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHNmbnRfaGVhZGVyID0gc2ZudCArIDEyOworCisgICAgLyogV3JpdGUgdGhlIHRhYmxlcy4gKi8KKworICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmLm51bV90YWJsZXM7IG5uKysgKQorICAgIHsKKyAgICAgIFdPRkZfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47CisKKworICAgICAgLyogV3JpdGUgU0ZOVCB0YWJsZSBlbnRyeS4gKi8KKyAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPlRhZyApOworICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+Q2hlY2tTdW0gKTsKKyAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdPZmZzZXQgKTsKKyAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdMZW5ndGggKTsKKworICAgICAgLyogV3JpdGUgdGFibGUgZGF0YS4gKi8KKyAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlLT5PZmZzZXQgKSAgICAgfHwKKyAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHRhYmxlLT5Db21wTGVuZ3RoICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGlmICggdGFibGUtPkNvbXBMZW5ndGggPT0gdGFibGUtPk9yaWdMZW5ndGggKQorICAgICAgeworICAgICAgICAvKiBVbmNvbXByZXNzZWQgZGF0YTsganVzdCBjb3B5LiAqLworICAgICAgICBmdF9tZW1jcHkoIHNmbnQgKyB0YWJsZS0+T3JpZ09mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmN1cnNvciwKKyAgICAgICAgICAgICAgICAgICB0YWJsZS0+T3JpZ0xlbmd0aCApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKKworICAgICAgICAvKiBVbmNvbXByZXNzIHdpdGggemxpYi4gKi8KKyAgICAgICAgRlRfVUxvbmcgIG91dHB1dF9sZW4gPSB0YWJsZS0+T3JpZ0xlbmd0aDsKKworCisgICAgICAgIGVycm9yID0gRlRfR3ppcF9VbmNvbXByZXNzKCBtZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50ICsgdGFibGUtPk9yaWdPZmZzZXQsICZvdXRwdXRfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jdXJzb3IsIHRhYmxlLT5Db21wTGVuZ3RoICk7CisgICAgICAgIGlmICggZXJyb3IgKQorICAgICAgICAgIGdvdG8gRXhpdDE7CisgICAgICAgIGlmICggb3V0cHV0X2xlbiAhPSB0YWJsZS0+T3JpZ0xlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9FUlJPUigoICJ3b2ZmX2ZvbnRfb3BlbjogY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggbWlzbWF0Y2hcbiIgKSk7CisgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgICAgIGdvdG8gRXhpdDE7CisgICAgICAgIH0KKworI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KKworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKyAgICAgICAgZ290byBFeGl0MTsKKworI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCICovCisgICAgICB9CisKKyAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKKworICAgICAgLyogV2UgZG9uJ3QgY2hlY2sgd2hldGhlciB0aGUgcGFkZGluZyBieXRlcyBpbiB0aGUgV09GRiBmaWxlIGFyZSAgICAgKi8KKyAgICAgIC8qIGFjdHVhbGx5ICdcMCcuICBGb3IgdGhlIG91dHB1dCwgaG93ZXZlciwgd2UgZG8gc2V0IHRoZW0gcHJvcGVybHkuICovCisgICAgICBzZm50X29mZnNldCA9IHRhYmxlLT5PcmlnT2Zmc2V0ICsgdGFibGUtPk9yaWdMZW5ndGg7CisgICAgICB3aGlsZSAoIHNmbnRfb2Zmc2V0ICYgMyApCisgICAgICB7CisgICAgICAgIHNmbnRbc2ZudF9vZmZzZXRdID0gJ1wwJzsKKyAgICAgICAgc2ZudF9vZmZzZXQrKzsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBPayEgIEZpbmFsbHkgcmVhZHkuICBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHVybi4gKi8KKyAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggc2ZudF9zdHJlYW0sIHNmbnQsIHdvZmYudG90YWxTZm50U2l6ZSApOworICAgIHNmbnRfc3RyZWFtLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBzZm50X3N0cmVhbS0+Y2xvc2UgID0gc2ZudF9zdHJlYW1fY2xvc2U7CisKKyAgICBGVF9TdHJlYW1fRnJlZSgKKyAgICAgIGZhY2UtPnJvb3Quc3RyZWFtLAorICAgICAgKCBmYWNlLT5yb290LmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICkgIT0gMCApOworCisgICAgZmFjZS0+cm9vdC5zdHJlYW0gPSBzZm50X3N0cmVhbTsKKworICAgIGZhY2UtPnJvb3QuZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTTsKKworICBFeGl0OgorICAgIEZUX0ZSRUUoIHRhYmxlcyApOworICAgIEZUX0ZSRUUoIGluZGljZXMgKTsKKworICAgIGlmICggZXJyb3IgKQorICAgIHsKKyAgICAgIEZUX0ZSRUUoIHNmbnQgKTsKKyAgICAgIEZUX1N0cmVhbV9DbG9zZSggc2ZudF9zdHJlYW0gKTsKKyAgICAgIEZUX0ZSRUUoIHNmbnRfc3RyZWFtICk7CisgICAgfQorCisgICAgcmV0dXJuIGVycm9yOworCisgIEV4aXQxOgorICAgIEZUX0ZSQU1FX0VYSVQoKTsKKyAgICBnb3RvIEV4aXQ7CisgIH0KKworCisjdW5kZWYgV1JJVEVfVVNIT1JUCisjdW5kZWYgV1JJVEVfVUxPTkcKKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3Nmd29mZi5oIGIvc3JjL3NmbnQvc2Z3b2ZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3N2FiMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3Nmd29mZi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2Z3b2ZmLmgKKyAqCisgKiAgIFdPRkZGIGZvcm1hdCBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLworCisKKyNpZm5kZWYgU0ZXT0ZGX0hfCisjZGVmaW5lIFNGV09GRl9IXworCisKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisKKworRlRfQkVHSU5fSEVBREVSCisKKworICBGVF9MT0NBTCggRlRfRXJyb3IgKQorICB3b2ZmX29wZW5fZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UgKTsKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBTRldPRkZfSF8gKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3Nmd29mZjIuYyBiL3NyYy9zZm50L3Nmd29mZjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgyMDJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvc2Z3b2ZmMi5jCkBAIC0wLDAgKzEsMjMzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzZndvZmYyLmMKKyAqCisgKiAgIFdPRkYyIGZvcm1hdCBtYW5hZ2VtZW50IChiYXNlKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTktMjAyMCBieQorICogTmlraGlsIFJhbWFrcmlzaG5hbiwgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLworCisjaW5jbHVkZSAic2Z3b2ZmMi5oIgorI2luY2x1ZGUgIndvZmYydGFncy5oIgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorCisKKyNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9CUk9UTEkKKworI2luY2x1ZGUgPGJyb3RsaS9kZWNvZGUuaD4KKworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgc2Z3b2ZmMgorCisKKyNkZWZpbmUgUkVBRF8yNTVVU0hPUlQoIHZhciApICBGVF9TRVRfRVJST1IoIFJlYWQyNTVVU2hvcnQoIHN0cmVhbSwgJnZhciApICkKKworI2RlZmluZSBSRUFEX0JBU0UxMjgoIHZhciApICAgIEZUX1NFVF9FUlJPUiggUmVhZEJhc2UxMjgoIHN0cmVhbSwgJnZhciApICkKKworICAvKiBgdmFyJyBzaG91bGQgYmUgRlRfVUxvbmcgKi8KKyNkZWZpbmUgUk9VTkQ0KCB2YXIgKSAgICAgICAgICAoICggdmFyICsgMyApICYgfjNVTCApCisKKyNkZWZpbmUgV1JJVEVfVVNIT1JUKCBwLCB2ICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDggKTsgXAorICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKyNkZWZpbmUgV1JJVEVfVUxPTkcoIHAsIHYgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDI0ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDE2ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICA4ICk7IFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICAwICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKyNkZWZpbmUgV1JJVEVfU0hPUlQoIHAsIHYgKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDggKTsgXAorICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMCApOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICB9IHdoaWxlICggMCApCisKKyNkZWZpbmUgV1JJVEVfU0ZOVF9CVUYoIGJ1ZiwgcyApIFwKKyAgICAgICAgICB3cml0ZV9idWYoICZzZm50LCBzZm50X3NpemUsICZkZXN0X29mZnNldCwgYnVmLCBzLCBtZW1vcnkgKQorCisjZGVmaW5lIFdSSVRFX1NGTlRfQlVGX0FUKCBvZmZzZXQsIGJ1ZiwgcyApIFwKKyAgICAgICAgICB3cml0ZV9idWYoICZzZm50LCBzZm50X3NpemUsICZvZmZzZXQsIGJ1ZiwgcywgbWVtb3J5ICkKKworI2RlZmluZSBOX0NPTlRPVVJfU1RSRUFNICAgIDAKKyNkZWZpbmUgTl9QT0lOVFNfU1RSRUFNICAgICAxCisjZGVmaW5lIEZMQUdfU1RSRUFNICAgICAgICAgMgorI2RlZmluZSBHTFlQSF9TVFJFQU0gICAgICAgIDMKKyNkZWZpbmUgQ09NUE9TSVRFX1NUUkVBTSAgICA0CisjZGVmaW5lIEJCT1hfU1RSRUFNICAgICAgICAgNQorI2RlZmluZSBJTlNUUlVDVElPTl9TVFJFQU0gIDYKKworCisgIHN0YXRpYyB2b2lkCisgIHN0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQorICB7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKworCisgICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7CisKKyAgICBzdHJlYW0tPnNpemUgID0gMDsKKyAgICBzdHJlYW0tPmJhc2UgID0gTlVMTDsKKyAgICBzdHJlYW0tPmNsb3NlID0gTlVMTDsKKyAgfQorCisKKyAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQorICBjb21wYXJlX3RhZ3MoIGNvbnN0IHZvaWQqICBhLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKKyAgeworICAgIFdPRkYyX1RhYmxlICB0YWJsZTEgPSAqKFdPRkYyX1RhYmxlKilhOworICAgIFdPRkYyX1RhYmxlICB0YWJsZTIgPSAqKFdPRkYyX1RhYmxlKiliOworCisgICAgRlRfVUxvbmcgIHRhZzEgPSB0YWJsZTEtPlRhZzsKKyAgICBGVF9VTG9uZyAgdGFnMiA9IHRhYmxlMi0+VGFnOworCisKKyAgICBpZiAoIHRhZzEgPiB0YWcyICkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKCB0YWcxIDwgdGFnMiApCisgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworCisgIHN0YXRpYyBGVF9FcnJvcgorICBSZWFkMjU1VVNob3J0KCBGVF9TdHJlYW0gICBzdHJlYW0sCisgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIHZhbHVlICkKKyAgeworICAgIGNvbnN0IEZUX0J5dGUgICAgb25lTW9yZUJ5dGVDb2RlMSA9IDI1NTsKKyAgICBjb25zdCBGVF9CeXRlICAgIG9uZU1vcmVCeXRlQ29kZTIgPSAyNTQ7CisgICAgY29uc3QgRlRfQnl0ZSAgICB3b3JkQ29kZSAgICAgICAgID0gMjUzOworICAgIGNvbnN0IEZUX1VTaG9ydCAgbG93ZXN0VUNvZGUgICAgICA9IDI1MzsKKworICAgIEZUX0Vycm9yICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOworICAgIEZUX0J5dGUgICAgY29kZTsKKyAgICBGVF9CeXRlICAgIHJlc3VsdF9ieXRlICA9IDA7CisgICAgRlRfVVNob3J0ICByZXN1bHRfc2hvcnQgPSAwOworCisKKyAgICBpZiAoIEZUX1JFQURfQllURSggY29kZSApICkKKyAgICAgIHJldHVybiBlcnJvcjsKKyAgICBpZiAoIGNvZGUgPT0gd29yZENvZGUgKQorICAgIHsKKyAgICAgIC8qIFJlYWQgbmV4dCB0d28gYnl0ZXMgYW5kIHN0b3JlIGBGVF9VU2hvcnQnIHZhbHVlLiAqLworICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggcmVzdWx0X3Nob3J0ICkgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAqdmFsdWUgPSByZXN1bHRfc2hvcnQ7CisgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgIH0KKyAgICBlbHNlIGlmICggY29kZSA9PSBvbmVNb3JlQnl0ZUNvZGUxICkKKyAgICB7CisgICAgICBpZiAoIEZUX1JFQURfQllURSggcmVzdWx0X2J5dGUgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICp2YWx1ZSA9IHJlc3VsdF9ieXRlICsgbG93ZXN0VUNvZGU7CisgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgIH0KKyAgICBlbHNlIGlmICggY29kZSA9PSBvbmVNb3JlQnl0ZUNvZGUyICkKKyAgICB7CisgICAgICBpZiAoIEZUX1JFQURfQllURSggcmVzdWx0X2J5dGUgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICp2YWx1ZSA9IHJlc3VsdF9ieXRlICsgbG93ZXN0VUNvZGUgKiAyOworICAgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICp2YWx1ZSA9IGNvZGU7CisgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgIH0KKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIFJlYWRCYXNlMTI4KCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgIEZUX1VMb25nKiAgdmFsdWUgKQorICB7CisgICAgRlRfVUxvbmcgIHJlc3VsdCA9IDA7CisgICAgRlRfSW50ICAgIGk7CisgICAgRlRfQnl0ZSAgIGNvZGU7CisgICAgRlRfRXJyb3IgIGVycm9yICA9IEZUX0Vycl9PazsKKworCisgICAgZm9yICggaSA9IDA7IGkgPCA1OyArK2kgKQorICAgIHsKKyAgICAgIGNvZGUgPSAwOworICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGNvZGUgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgLyogTGVhZGluZyB6ZXJvcyBhcmUgaW52YWxpZC4gKi8KKyAgICAgIGlmICggaSA9PSAwICYmIGNvZGUgPT0gMHg4MCApCisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgICAvKiBJZiBhbnkgb2YgdG9wIHNldmVuIGJpdHMgYXJlIHNldCB0aGVuIHdlJ3JlIGFib3V0IHRvIG92ZXJmbG93LiAqLworICAgICAgaWYgKCByZXN1bHQgJiAweGZlMDAwMDAwICkKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAgIHJlc3VsdCA9ICggcmVzdWx0IDw8IDcgKSB8ICggY29kZSAmIDB4N2YgKTsKKworICAgICAgLyogU3BpbiB1bnRpbCBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBkYXRhIGJ5dGUgaXMgZmFsc2UuICovCisgICAgICBpZiAoICggY29kZSAmIDB4ODAgKSA9PSAwICkKKyAgICAgIHsKKyAgICAgICAgKnZhbHVlID0gcmVzdWx0OworICAgICAgICByZXR1cm4gRlRfRXJyX09rOworICAgICAgfQorICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSBub3QgdG8gZXhjZWVkIHRoZSBzaXplIGJvdW5kLiAqLworICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICB9CisKKworICAvKiBFeHRlbmQgbWVtb3J5IG9mIGBkc3RfYnl0ZXMnIGJ1ZmZlciBhbmQgY29weSBkYXRhIGZyb20gYHNyYycuICovCisgIHN0YXRpYyBGVF9FcnJvcgorICB3cml0ZV9idWYoIEZUX0J5dGUqKiAgZHN0X2J5dGVzLAorICAgICAgICAgICAgIEZUX1VMb25nKiAgZHN0X3NpemUsCisgICAgICAgICAgICAgRlRfVUxvbmcqICBvZmZzZXQsCisgICAgICAgICAgICAgRlRfQnl0ZSogICBzcmMsCisgICAgICAgICAgICAgRlRfVUxvbmcgICBzaXplLAorICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKKyAgeworICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKKyAgICAvKiBXZSBhcmUgcmVhbGxvY2F0aW5nIG1lbW9yeSBmb3IgYGRzdCcsIHNvIGl0cyBwb2ludGVyIG1heSBjaGFuZ2UuICovCisgICAgRlRfQnl0ZSogIGRzdCAgID0gKmRzdF9ieXRlczsKKworCisgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBhcmUgd2l0aGluIGxpbWl0cy4gKi8KKyAgICBpZiAoICggKm9mZnNldCArIHNpemUgKSA+IFdPRkYyX0RFRkFVTFRfTUFYX1NJWkUgICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7CisKKyAgICAvKiBSZWFsbG9jYXRlIGBkc3QnLiAqLworICAgIGlmICggKCAqb2Zmc2V0ICsgc2l6ZSApID4gKmRzdF9zaXplICkKKyAgICB7CisgICAgICBGVF9UUkFDRTYoKCAiUmVhbGxvY2F0aW5nICVsdSB0byAlbHUuXG4iLAorICAgICAgICAgICAgICAgICAgKmRzdF9zaXplLCAoKm9mZnNldCArIHNpemUpICkpOworICAgICAgaWYgKCBGVF9SRUFMTE9DKCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoICpkc3Rfc2l6ZSApLAorICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKCAqb2Zmc2V0ICsgc2l6ZSApICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgICpkc3Rfc2l6ZSA9ICpvZmZzZXQgKyBzaXplOworICAgIH0KKworICAgIC8qIENvcHkgZGF0YS4gKi8KKyAgICBmdF9tZW1jcHkoIGRzdCArICpvZmZzZXQsIHNyYywgc2l6ZSApOworCisgICAgKm9mZnNldCArPSBzaXplOworICAgIC8qIFNldCBwb2ludGVyIG9mIGBkc3QnIHRvIGl0cyBjb3JyZWN0IHZhbHVlLiAqLworICAgICpkc3RfYnl0ZXMgPSBkc3Q7CisKKyAgRXhpdDoKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qIFBhZCBidWZmZXIgdG8gY2xvc2VzdCBtdWx0aXBsZSBvZiA0LiAqLworICBzdGF0aWMgRlRfRXJyb3IKKyAgcGFkNCggRlRfQnl0ZSoqICBzZm50X2J5dGVzLAorICAgICAgICBGVF9VTG9uZyogIHNmbnRfc2l6ZSwKKyAgICAgICAgRlRfVUxvbmcqICBvdXRfb2Zmc2V0LAorICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCisgIHsKKyAgICBGVF9CeXRlKiAgc2ZudCAgICAgICAgPSAqc2ZudF9ieXRlczsKKyAgICBGVF9VTG9uZyAgZGVzdF9vZmZzZXQgPSAqb3V0X29mZnNldDsKKworICAgIEZUX0J5dGUgICB6ZXJvZXNbXSA9IHsgMCwgMCwgMCB9OworICAgIEZUX1VMb25nICBwYWRfYnl0ZXM7CisKKworICAgIGlmICggZGVzdF9vZmZzZXQgKyAzIDwgZGVzdF9vZmZzZXQgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICBwYWRfYnl0ZXMgPSBST1VORDQoIGRlc3Rfb2Zmc2V0ICkgLSBkZXN0X29mZnNldDsKKyAgICBpZiAoIHBhZF9ieXRlcyA+IDAgKQorICAgIHsKKyAgICAgIGlmICggV1JJVEVfU0ZOVF9CVUYoICZ6ZXJvZXNbMF0sIHBhZF9ieXRlcyApICkKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgKnNmbnRfYnl0ZXMgPSBzZm50OworICAgICpvdXRfb2Zmc2V0ID0gZGVzdF9vZmZzZXQ7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyogQ2FsY3VsYXRlIHRhYmxlIGNoZWNrc3VtIG9mIGBidWYnLiAqLworICBzdGF0aWMgRlRfVUxvbmcKKyAgY29tcHV0ZV9VTG9uZ19zdW0oIEZUX0J5dGUqICBidWYsCisgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc2l6ZSApCisgIHsKKyAgICBGVF9VTG9uZyAgY2hlY2tzdW0gICAgID0gMDsKKyAgICBGVF9VTG9uZyAgYWxpZ25lZF9zaXplID0gc2l6ZSAmIH4zVUw7CisgICAgRlRfVUxvbmcgIGk7CisgICAgRlRfVUxvbmcgIHY7CisKKworICAgIGZvciAoIGkgPSAwOyBpIDwgYWxpZ25lZF9zaXplOyBpICs9IDQgKQorICAgICAgY2hlY2tzdW0gKz0gKCAoRlRfVUxvbmcpYnVmW2kgICAgXSA8PCAyNCApIHwKKyAgICAgICAgICAgICAgICAgICggKEZUX1VMb25nKWJ1ZltpICsgMV0gPDwgMTYgKSB8CisgICAgICAgICAgICAgICAgICAoIChGVF9VTG9uZylidWZbaSArIDJdIDw8ICA4ICkgfAorICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpYnVmW2kgKyAzXSA8PCAgMCApOworCisgICAgLyogSWYgc2l6ZSBpcyBub3QgYWxpZ25lZCB0byA0LCB0cmVhdCBhcyBpZiBpdCBpcyBwYWRkZWQgd2l0aCAwcy4gKi8KKyAgICBpZiAoIHNpemUgIT0gYWxpZ25lZF9zaXplICkKKyAgICB7CisgICAgICB2ID0gMDsKKyAgICAgIGZvciAoIGkgPSBhbGlnbmVkX3NpemUgOyBpIDwgc2l6ZTsgKytpICkKKyAgICAgICAgdiB8PSAoRlRfVUxvbmcpYnVmW2ldIDw8ICggMjQgLSA4ICogKCBpICYgMyApICk7CisgICAgICBjaGVja3N1bSArPSB2OworICAgIH0KKworICAgIHJldHVybiBjaGVja3N1bTsKKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIHdvZmYyX2RlY29tcHJlc3MoIEZUX0J5dGUqICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIHNyYywKKyAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIHNyY19zaXplICkKKyAgeworI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSQorCisgICAgLyogdGhpcyBjYXN0IGlzIG9ubHkgb2YgaW1wb3J0YW5jZSBvbiAzMmJpdCBzeXN0ZW1zOyAqLworICAgIC8qIHdlIGRvbid0IHZhbGlkYXRlIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGVF9PZmZzZXQgICAgICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZSA9IChGVF9PZmZzZXQpZHN0X3NpemU7CisgICAgQnJvdGxpRGVjb2RlclJlc3VsdCAgcmVzdWx0OworCisKKyAgICByZXN1bHQgPSBCcm90bGlEZWNvZGVyRGVjb21wcmVzcyggc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVuY29tcHJlc3NlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKTsKKworICAgIGlmICggcmVzdWx0ICE9IEJST1RMSV9ERUNPREVSX1JFU1VMVF9TVUNDRVNTIHx8CisgICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZSAhPSBkc3Rfc2l6ZSAgICAgICAgICAgKQorICAgIHsKKyAgICAgIEZUX0VSUk9SKCggIndvZmYyX2RlY29tcHJlc3M6IFN0cmVhbSBsZW5ndGggbWlzbWF0Y2guXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgRlRfVFJBQ0UyKCggIndvZmYyX2RlY29tcHJlc3M6IEJyb3RsaSBzdHJlYW0gZGVjb21wcmVzc2VkLlxuIiApKTsKKyAgICByZXR1cm4gRlRfRXJyX09rOworCisjZWxzZSAvKiAhRlRfQ09ORklHX09QVElPTl9VU0VfQlJPVExJICovCisKKyAgICBGVF9FUlJPUigoICJ3b2ZmMl9kZWNvbXByZXNzOiBCcm90bGkgc3VwcG9ydCBub3QgYXZhaWxhYmxlLlxuIiApKTsKKyAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOworCisjZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX0JST1RMSSAqLworICB9CisKKworICBzdGF0aWMgV09GRjJfVGFibGUKKyAgZmluZF90YWJsZSggV09GRjJfVGFibGUqICB0YWJsZXMsCisgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgbnVtX3RhYmxlcywKKyAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICB0YWcgKQorICB7CisgICAgRlRfSW50ICBpOworCisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV90YWJsZXM7IGkrKyApCisgICAgeworICAgICAgaWYgKCB0YWJsZXNbaV0tPlRhZyA9PSB0YWcgKQorICAgICAgICByZXR1cm4gdGFibGVzW2ldOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisKKyAgLyogUmVhZCBgbnVtYmVyT2ZITWV0cmljcycgZmllbGQgZnJvbSBgaGhlYScgdGFibGUuICovCisgIHN0YXRpYyBGVF9FcnJvcgorICByZWFkX251bV9obWV0cmljcyggRlRfU3RyZWFtICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgbnVtX2htZXRyaWNzICkKKyAgeworICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgRlRfVVNob3J0ICBudW1fbWV0cmljczsKKworCisgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggMzQgKSAgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBudW1fbWV0cmljcyApICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgKm51bV9obWV0cmljcyA9IG51bV9tZXRyaWNzOworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKiBBbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIG92ZXJmbG93LXNhZmUgYWRkaXRpb24uICovCisgIHN0YXRpYyBGVF9JbnQKKyAgd2l0aF9zaWduKCBGVF9CeXRlICBmbGFnLAorICAgICAgICAgICAgIEZUX0ludCAgIGJhc2VfdmFsICkKKyAgeworICAgIC8qIFByZWNvbmRpdGlvbjogMCA8PSBiYXNlX3ZhbCA8IDY1NTM2ICh0byBhdm9pZCBvdmVyZmxvdykuICovCisgICAgcmV0dXJuICggZmxhZyAmIDEgKSA/IGJhc2VfdmFsIDogLWJhc2VfdmFsOworICB9CisKKworICAvKiBBbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIG92ZXJmbG93LXNhZmUgYWRkaXRpb24uICovCisgIHN0YXRpYyBGVF9JbnQKKyAgc2FmZV9pbnRfYWRkaXRpb24oIEZUX0ludCAgIGEsCisgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICBiLAorICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgcmVzdWx0ICkKKyAgeworICAgIGlmICggKCAoIGEgPiAwICkgJiYgKCBiID4gRlRfSU5UX01BWCAtIGEgKSApIHx8CisgICAgICAgICAoICggYSA8IDAgKSAmJiAoIGIgPCBGVF9JTlRfTUlOIC0gYSApICkgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAqcmVzdWx0ID0gYSArIGI7CisgICAgcmV0dXJuIEZUX0Vycl9PazsKKyAgfQorCisKKyAgLyoKKyAgICogRGVjb2RlIHZhcmlhYmxlLWxlbmd0aCAoZmxhZywgeENvb3JkaW5hdGUsIHlDb29yZGluYXRlKSB0cmlwbGV0IGZvciBhCisgICAqIHNpbXBsZSBnbHlwaC4gIFNlZQorICAgKgorICAgKiAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XT0ZGMi8jdHJpcGxldF9kZWNvZGluZworICAgKi8KKyAgc3RhdGljIEZUX0Vycm9yCisgIHRyaXBsZXRfZGVjb2RlKCBjb25zdCBGVF9CeXRlKiAgZmxhZ3NfaW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgaW4sCisgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBuX3BvaW50cywKKyAgICAgICAgICAgICAgICAgIFdPRkYyX1BvaW50ICAgICByZXN1bHQsCisgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgaW5fYnl0ZXNfdXNlZCApCisgIHsKKyAgICBGVF9JbnQgIHggPSAwOworICAgIEZUX0ludCAgeSA9IDA7CisgICAgRlRfSW50ICBkeDsKKyAgICBGVF9JbnQgIGR5OworICAgIEZUX0ludCAgYjAsIGIxLCBiMjsKKworICAgIEZUX1VMb25nICB0cmlwbGV0X2luZGV4ID0gMDsKKyAgICBGVF9VTG9uZyAgZGF0YV9ieXRlczsKKworICAgIEZUX1VJbnQgIGk7CisKKworICAgIGlmICggbl9wb2ludHMgPiBpbl9zaXplICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgZm9yICggaSA9IDA7IGkgPCBuX3BvaW50czsgKytpICkKKyAgICB7CisgICAgICBGVF9CeXRlICBmbGFnICAgICA9IGZsYWdzX2luW2ldOworICAgICAgRlRfQm9vbCAgb25fY3VydmUgPSAhKCBmbGFnID4+IDcgKTsKKworCisgICAgICBmbGFnICY9IDB4N2Y7CisgICAgICBpZiAoIGZsYWcgPCA4NCApCisgICAgICAgIGRhdGFfYnl0ZXMgPSAxOworICAgICAgZWxzZSBpZiAoIGZsYWcgPCAxMjAgKQorICAgICAgICBkYXRhX2J5dGVzID0gMjsKKyAgICAgIGVsc2UgaWYgKCBmbGFnIDwgMTI0ICkKKyAgICAgICAgZGF0YV9ieXRlcyA9IDM7CisgICAgICBlbHNlCisgICAgICAgIGRhdGFfYnl0ZXMgPSA0OworCisgICAgICAvKiBPdmVyZmxvdyBjaGVja3MgKi8KKyAgICAgIGlmICggdHJpcGxldF9pbmRleCArIGRhdGFfYnl0ZXMgPiBpbl9zaXplICAgICAgIHx8CisgICAgICAgICAgIHRyaXBsZXRfaW5kZXggKyBkYXRhX2J5dGVzIDwgdHJpcGxldF9pbmRleCApCisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgICBpZiAoIGZsYWcgPCAxMCApCisgICAgICB7CisgICAgICAgIGR4ID0gMDsKKyAgICAgICAgZHkgPSB3aXRoX3NpZ24oIGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAoICggZmxhZyAmIDE0ICkgPDwgNyApICsgaW5bdHJpcGxldF9pbmRleF0gKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCBmbGFnIDwgMjAgKQorICAgICAgeworICAgICAgICBkeCA9IHdpdGhfc2lnbiggZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICggKCAoIGZsYWcgLSAxMCApICYgMTQgKSA8PCA3ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBpblt0cmlwbGV0X2luZGV4XSApOworICAgICAgICBkeSA9IDA7CisgICAgICB9CisgICAgICBlbHNlIGlmICggZmxhZyA8IDg0ICkKKyAgICAgIHsKKyAgICAgICAgYjAgPSBmbGFnIC0gMjA7CisgICAgICAgIGIxID0gaW5bdHJpcGxldF9pbmRleF07CisgICAgICAgIGR4ID0gd2l0aF9zaWduKCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgMSArICggYjAgJiAweDMwICkgKyAoIGIxID4+IDQgKSApOworICAgICAgICBkeSA9IHdpdGhfc2lnbiggZmxhZyA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgMSArICggKCBiMCAmIDB4MGMgKSA8PCAyICkgKyAoIGIxICYgMHgwZiApICk7CisgICAgICB9CisgICAgICBlbHNlIGlmICggZmxhZyA8IDEyMCApCisgICAgICB7CisgICAgICAgIGIwID0gZmxhZyAtIDg0OworICAgICAgICBkeCA9IHdpdGhfc2lnbiggZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDEgKyAoICggYjAgLyAxMiApIDw8IDggKSArIGluW3RyaXBsZXRfaW5kZXhdICk7CisgICAgICAgIGR5ID0gd2l0aF9zaWduKCBmbGFnID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxICsgKCAoICggYjAgJSAxMiApID4+IDIgKSA8PCA4ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBpblt0cmlwbGV0X2luZGV4ICsgMV0gKTsKKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCBmbGFnIDwgMTI0ICkKKyAgICAgIHsKKyAgICAgICAgYjIgPSBpblt0cmlwbGV0X2luZGV4ICsgMV07CisgICAgICAgIGR4ID0gd2l0aF9zaWduKCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBpblt0cmlwbGV0X2luZGV4XSA8PCA0ICkgKyAoIGIyID4+IDQgKSApOworICAgICAgICBkeSA9IHdpdGhfc2lnbiggZmxhZyA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKCAoIGIyICYgMHgwZiApIDw8IDggKSArIGluW3RyaXBsZXRfaW5kZXggKyAyXSApOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBkeCA9IHdpdGhfc2lnbiggZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICggaW5bdHJpcGxldF9pbmRleF0gPDwgOCApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5bdHJpcGxldF9pbmRleCArIDFdICk7CisgICAgICAgIGR5ID0gd2l0aF9zaWduKCBmbGFnID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAoIGluW3RyaXBsZXRfaW5kZXggKyAyXSA8PCA4ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBpblt0cmlwbGV0X2luZGV4ICsgM10gKTsKKyAgICAgIH0KKworICAgICAgdHJpcGxldF9pbmRleCArPSBkYXRhX2J5dGVzOworCisgICAgICBpZiAoIHNhZmVfaW50X2FkZGl0aW9uKCB4LCBkeCwgJnggKSApCisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgICBpZiAoIHNhZmVfaW50X2FkZGl0aW9uKCB5LCBkeSwgJnkgKSApCisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgICByZXN1bHRbaV0ueCAgICAgICAgPSB4OworICAgICAgcmVzdWx0W2ldLnkgICAgICAgID0geTsKKyAgICAgIHJlc3VsdFtpXS5vbl9jdXJ2ZSA9IG9uX2N1cnZlOworICAgIH0KKworICAgICppbl9ieXRlc191c2VkID0gdHJpcGxldF9pbmRleDsKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKiBTdG9yZSBkZWNvZGVkIHBvaW50cyBpbiBnbHlwaCBidWZmZXIuICovCisgIHN0YXRpYyBGVF9FcnJvcgorICBzdG9yZV9wb2ludHMoIEZUX1VMb25nICAgICAgICAgICBuX3BvaW50cywKKyAgICAgICAgICAgICAgICBjb25zdCBXT0ZGMl9Qb2ludCAgcG9pbnRzLAorICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICAgICBuX2NvbnRvdXJzLAorICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICAgICBpbnN0cnVjdGlvbl9sZW4sCisgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICAgZHN0X3NpemUsCisgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgICAgIGdseXBoX3NpemUgKQorICB7CisgICAgRlRfVUludCAgIGZsYWdfb2Zmc2V0ICA9IDEwICsgKCAyICogbl9jb250b3VycyApICsgMiArIGluc3RydWN0aW9uX2xlbjsKKyAgICBGVF9CeXRlICAgbGFzdF9mbGFnICAgID0gMHhGRlU7CisgICAgRlRfQnl0ZSAgIHJlcGVhdF9jb3VudCA9IDA7CisgICAgRlRfSW50ICAgIGxhc3RfeCAgICAgICA9IDA7CisgICAgRlRfSW50ICAgIGxhc3RfeSAgICAgICA9IDA7CisgICAgRlRfVUludCAgIHhfYnl0ZXMgICAgICA9IDA7CisgICAgRlRfVUludCAgIHlfYnl0ZXMgICAgICA9IDA7CisgICAgRlRfVUludCAgIHh5X2J5dGVzOworICAgIEZUX1VJbnQgICBpOworICAgIEZUX1VJbnQgICB4X29mZnNldDsKKyAgICBGVF9VSW50ICAgeV9vZmZzZXQ7CisgICAgRlRfQnl0ZSogIHBvaW50ZXI7CisKKworICAgIGZvciAoIGkgPSAwOyBpIDwgbl9wb2ludHM7ICsraSApCisgICAgeworICAgICAgY29uc3QgV09GRjJfUG9pbnRSZWMgIHBvaW50ID0gcG9pbnRzW2ldOworCisgICAgICBGVF9CeXRlICBmbGFnID0gcG9pbnQub25fY3VydmUgPyBHTFlGX09OX0NVUlZFIDogMDsKKyAgICAgIEZUX0ludCAgIGR4ICAgPSBwb2ludC54IC0gbGFzdF94OworICAgICAgRlRfSW50ICAgZHkgICA9IHBvaW50LnkgLSBsYXN0X3k7CisKKworICAgICAgaWYgKCBkeCA9PSAwICkKKyAgICAgICAgZmxhZyB8PSBHTFlGX1RISVNfWF9JU19TQU1FOworICAgICAgZWxzZSBpZiAoIGR4ID4gLTI1NiAmJiBkeCA8IDI1NiApCisgICAgICB7CisgICAgICAgIGZsYWcgfD0gR0xZRl9YX1NIT1JUIHwgKCBkeCA+IDAgPyBHTFlGX1RISVNfWF9JU19TQU1FIDogMCApOworICAgICAgICB4X2J5dGVzICs9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHhfYnl0ZXMgKz0gMjsKKworICAgICAgaWYgKCBkeSA9PSAwICkKKyAgICAgICAgZmxhZyB8PSBHTFlGX1RISVNfWV9JU19TQU1FOworICAgICAgZWxzZSBpZiAoIGR5ID4gLTI1NiAmJiBkeSA8IDI1NiApCisgICAgICB7CisgICAgICAgIGZsYWcgfD0gR0xZRl9ZX1NIT1JUIHwgKCBkeSA+IDAgPyBHTFlGX1RISVNfWV9JU19TQU1FIDogMCApOworICAgICAgICB5X2J5dGVzICs9IDE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHlfYnl0ZXMgKz0gMjsKKworICAgICAgaWYgKCBmbGFnID09IGxhc3RfZmxhZyAmJiByZXBlYXRfY291bnQgIT0gMjU1ICkKKyAgICAgIHsKKyAgICAgICAgZHN0W2ZsYWdfb2Zmc2V0IC0gMV0gfD0gR0xZRl9SRVBFQVQ7CisgICAgICAgIHJlcGVhdF9jb3VudCsrOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIHJlcGVhdF9jb3VudCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggZmxhZ19vZmZzZXQgPj0gZHN0X3NpemUgKQorICAgICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAgICAgICBkc3RbZmxhZ19vZmZzZXQrK10gPSByZXBlYXRfY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBmbGFnX29mZnNldCA+PSBkc3Rfc2l6ZSApCisgICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAgICAgZHN0W2ZsYWdfb2Zmc2V0KytdID0gZmxhZzsKKyAgICAgICAgcmVwZWF0X2NvdW50ICAgICAgID0gMDsKKyAgICAgIH0KKworICAgICAgbGFzdF94ICAgID0gcG9pbnQueDsKKyAgICAgIGxhc3RfeSAgICA9IHBvaW50Lnk7CisgICAgICBsYXN0X2ZsYWcgPSBmbGFnOworICAgIH0KKworICAgIGlmICggcmVwZWF0X2NvdW50ICE9IDAgKQorICAgIHsKKyAgICAgIGlmICggZmxhZ19vZmZzZXQgPj0gZHN0X3NpemUgKQorICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKworICAgICAgZHN0W2ZsYWdfb2Zmc2V0KytdID0gcmVwZWF0X2NvdW50OworICAgIH0KKworICAgIHh5X2J5dGVzID0geF9ieXRlcyArIHlfYnl0ZXM7CisgICAgaWYgKCB4eV9ieXRlcyA8IHhfYnl0ZXMgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIGZsYWdfb2Zmc2V0ICsgeHlfYnl0ZXMgPCBmbGFnX29mZnNldCB8fAorICAgICAgICAgZmxhZ19vZmZzZXQgKyB4eV9ieXRlcyA+IGRzdF9zaXplICAgICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgeF9vZmZzZXQgPSBmbGFnX29mZnNldDsKKyAgICB5X29mZnNldCA9IGZsYWdfb2Zmc2V0ICsgeF9ieXRlczsKKyAgICBsYXN0X3ggPSAwOworICAgIGxhc3RfeSA9IDA7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5fcG9pbnRzOyArK2kgKQorICAgIHsKKyAgICAgIEZUX0ludCAgZHggPSBwb2ludHNbaV0ueCAtIGxhc3RfeDsKKyAgICAgIEZUX0ludCAgZHkgPSBwb2ludHNbaV0ueSAtIGxhc3RfeTsKKworCisgICAgICBpZiAoIGR4ID09IDAgKQorICAgICAgICA7CisgICAgICBlbHNlIGlmICggZHggPiAtMjU2ICYmIGR4IDwgMjU2ICkKKyAgICAgICAgZHN0W3hfb2Zmc2V0KytdID0gKEZUX0J5dGUpRlRfQUJTKCBkeCApOworICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwb2ludGVyID0gZHN0ICsgeF9vZmZzZXQ7CisgICAgICAgIFdSSVRFX1NIT1JUKCBwb2ludGVyLCBkeCApOworICAgICAgICB4X29mZnNldCArPSAyOworICAgICAgfQorCisgICAgICBsYXN0X3ggKz0gZHg7CisKKyAgICAgIGlmICggZHkgPT0gMCApCisgICAgICAgIDsKKyAgICAgIGVsc2UgaWYgKCBkeSA+IC0yNTYgJiYgZHkgPCAyNTYgKQorICAgICAgICBkc3RbeV9vZmZzZXQrK10gPSAoRlRfQnl0ZSlGVF9BQlMoIGR5ICk7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHBvaW50ZXIgPSBkc3QgKyB5X29mZnNldDsKKyAgICAgICAgV1JJVEVfU0hPUlQoIHBvaW50ZXIsIGR5ICk7CisgICAgICAgIHlfb2Zmc2V0ICs9IDI7CisgICAgICB9CisKKyAgICAgIGxhc3RfeSArPSBkeTsKKyAgICB9CisKKyAgICAqZ2x5cGhfc2l6ZSA9IHlfb2Zmc2V0OworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIHN0YXRpYyB2b2lkCisgIGNvbXB1dGVfYmJveCggRlRfVUxvbmcgICAgICAgICAgIG5fcG9pbnRzLAorICAgICAgICAgICAgICAgIGNvbnN0IFdPRkYyX1BvaW50ICBwb2ludHMsCisgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgICAgIGRzdCwKKyAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICAgICAgc3JjX3hfbWluICkKKyAgeworICAgIEZUX0ludCAgeF9taW4gPSAwOworICAgIEZUX0ludCAgeV9taW4gPSAwOworICAgIEZUX0ludCAgeF9tYXggPSAwOworICAgIEZUX0ludCAgeV9tYXggPSAwOworCisgICAgRlRfVUludCAgaTsKKworICAgIEZUX1VMb25nICBvZmZzZXQ7CisgICAgRlRfQnl0ZSogIHBvaW50ZXI7CisKKworICAgIGlmICggbl9wb2ludHMgPiAwICkKKyAgICB7CisgICAgICB4X21pbiA9IHBvaW50c1swXS54OworICAgICAgeV9taW4gPSBwb2ludHNbMF0ueTsKKyAgICAgIHhfbWF4ID0gcG9pbnRzWzBdLng7CisgICAgICB5X21heCA9IHBvaW50c1swXS55OworICAgIH0KKworICAgIGZvciAoIGkgPSAxOyBpIDwgbl9wb2ludHM7ICsraSApCisgICAgeworICAgICAgRlRfSW50ICB4ID0gcG9pbnRzW2ldLng7CisgICAgICBGVF9JbnQgIHkgPSBwb2ludHNbaV0ueTsKKworCisgICAgICB4X21pbiA9IEZUX01JTiggeCwgeF9taW4gKTsKKyAgICAgIHlfbWluID0gRlRfTUlOKCB5LCB5X21pbiApOworICAgICAgeF9tYXggPSBGVF9NQVgoIHgsIHhfbWF4ICk7CisgICAgICB5X21heCA9IEZUX01BWCggeSwgeV9tYXggKTsKKyAgICB9CisKKyAgICAvKiBXcml0ZSB2YWx1ZXMgdG8gYGdseWYnIHJlY29yZC4gKi8KKyAgICBvZmZzZXQgID0gMjsKKyAgICBwb2ludGVyID0gZHN0ICsgb2Zmc2V0OworCisgICAgV1JJVEVfU0hPUlQoIHBvaW50ZXIsIHhfbWluICk7CisgICAgV1JJVEVfU0hPUlQoIHBvaW50ZXIsIHlfbWluICk7CisgICAgV1JJVEVfU0hPUlQoIHBvaW50ZXIsIHhfbWF4ICk7CisgICAgV1JJVEVfU0hPUlQoIHBvaW50ZXIsIHlfbWF4ICk7CisKKyAgICAqc3JjX3hfbWluID0gKEZUX1VTaG9ydCl4X21pbjsKKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIGNvbXBvc2l0ZUdseXBoX3NpemUoIEZUX1N0cmVhbSAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgIGhhdmVfaW5zdHJ1Y3Rpb25zICkKKyAgeworICAgIEZUX0Vycm9yICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOworICAgIEZUX1VMb25nICAgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0OworICAgIEZUX0Jvb2wgICAgd2VfaGF2ZV9pbnN0ID0gRkFMU0U7CisgICAgRlRfVVNob3J0ICBmbGFncyAgICAgICAgPSBGTEFHX01PUkVfQ09NUE9ORU5UUzsKKworCisgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3RhcnRfb2Zmc2V0ICkgKQorICAgICAgZ290byBFeGl0OworICAgIHdoaWxlICggZmxhZ3MgJiBGTEFHX01PUkVfQ09NUE9ORU5UUyApCisgICAgeworICAgICAgRlRfVUxvbmcgIGFyZ19zaXplOworCisKKyAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGZsYWdzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB3ZV9oYXZlX2luc3QgfD0gKCBmbGFncyAmIEZMQUdfV0VfSEFWRV9JTlNUUlVDVElPTlMgKSAhPSAwOworICAgICAgLyogZ2x5cGggaW5kZXggKi8KKyAgICAgIGFyZ19zaXplID0gMjsKKyAgICAgIGlmICggZmxhZ3MgJiBGTEFHX0FSR18xX0FORF8yX0FSRV9XT1JEUyApCisgICAgICAgIGFyZ19zaXplICs9IDQ7CisgICAgICBlbHNlCisgICAgICAgIGFyZ19zaXplICs9IDI7CisKKyAgICAgIGlmICggZmxhZ3MgJiBGTEFHX1dFX0hBVkVfQV9TQ0FMRSApCisgICAgICAgIGFyZ19zaXplICs9IDI7CisgICAgICBlbHNlIGlmICggZmxhZ3MgJiBGTEFHX1dFX0hBVkVfQU5fWF9BTkRfWV9TQ0FMRSApCisgICAgICAgIGFyZ19zaXplICs9IDQ7CisgICAgICBlbHNlIGlmICggZmxhZ3MgJiBGTEFHX1dFX0hBVkVfQV9UV09fQllfVFdPICkKKyAgICAgICAgYXJnX3NpemUgKz0gODsKKworICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggYXJnX3NpemUgKSApCisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICAqc2l6ZSAgICAgICAgICAgICAgPSBGVF9TVFJFQU1fUE9TKCkgLSBzdGFydF9vZmZzZXQ7CisgICAgKmhhdmVfaW5zdHJ1Y3Rpb25zID0gd2VfaGF2ZV9pbnN0OworCisgIEV4aXQ6CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICAvKiBTdG9yZSBsb2NhIHZhbHVlcyAocHJvdmlkZWQgYnkgYHJlY29uc3RydWN0X2dseWYnKSB0byBvdXRwdXQgc3RyZWFtLiAqLworICBzdGF0aWMgRlRfRXJyb3IKKyAgc3RvcmVfbG9jYSggRlRfVUxvbmcqICBsb2NhX3ZhbHVlcywKKyAgICAgICAgICAgICAgRlRfVUxvbmcgICBsb2NhX3ZhbHVlc19zaXplLAorICAgICAgICAgICAgICBGVF9VU2hvcnQgIGluZGV4X2Zvcm1hdCwKKyAgICAgICAgICAgICAgRlRfVUxvbmcqICBjaGVja3N1bSwKKyAgICAgICAgICAgICAgRlRfQnl0ZSoqICBzZm50X2J5dGVzLAorICAgICAgICAgICAgICBGVF9VTG9uZyogIHNmbnRfc2l6ZSwKKyAgICAgICAgICAgICAgRlRfVUxvbmcqICBvdXRfb2Zmc2V0LAorICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCisgIHsKKyAgICBGVF9FcnJvciAgZXJyb3IgICAgICAgPSBGVF9FcnJfT2s7CisgICAgRlRfQnl0ZSogIHNmbnQgICAgICAgID0gKnNmbnRfYnl0ZXM7CisgICAgRlRfVUxvbmcgIGRlc3Rfb2Zmc2V0ID0gKm91dF9vZmZzZXQ7CisKKyAgICBGVF9CeXRlKiAgbG9jYV9idWYgPSBOVUxMOworICAgIEZUX0J5dGUqICBkc3QgICAgICA9IE5VTEw7CisKKyAgICBGVF9VSW50ICAgaSA9IDA7CisgICAgRlRfVUxvbmcgIGxvY2FfYnVmX3NpemU7CisKKyAgICBjb25zdCBGVF9VTG9uZyAgb2Zmc2V0X3NpemUgPSBpbmRleF9mb3JtYXQgPyA0IDogMjsKKworCisgICAgaWYgKCAoIGxvY2FfdmFsdWVzX3NpemUgPDwgMiApID4+IDIgIT0gbG9jYV92YWx1ZXNfc2l6ZSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBsb2NhX2J1Zl9zaXplID0gbG9jYV92YWx1ZXNfc2l6ZSAqIG9mZnNldF9zaXplOworICAgIGlmICggRlRfTkVXX0FSUkFZKCBsb2NhX2J1ZiwgbG9jYV9idWZfc2l6ZSApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIGRzdCA9IGxvY2FfYnVmOworICAgIGZvciAoIGkgPSAwOyBpIDwgbG9jYV92YWx1ZXNfc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICBGVF9VTG9uZyAgdmFsdWUgPSBsb2NhX3ZhbHVlc1tpXTsKKworCisgICAgICBpZiAoIGluZGV4X2Zvcm1hdCApCisgICAgICAgIFdSSVRFX1VMT05HKCBkc3QsIHZhbHVlICk7CisgICAgICBlbHNlCisgICAgICAgIFdSSVRFX1VTSE9SVCggZHN0LCAoIHZhbHVlID4+IDEgKSApOworICAgIH0KKworICAgICpjaGVja3N1bSA9IGNvbXB1dGVfVUxvbmdfc3VtKCBsb2NhX2J1ZiwgbG9jYV9idWZfc2l6ZSApOworICAgIC8qIFdyaXRlIGBsb2NhJyB0YWJsZSB0byBzZm50IGJ1ZmZlci4gKi8KKyAgICBpZiAoIFdSSVRFX1NGTlRfQlVGKCBsb2NhX2J1ZiwgbG9jYV9idWZfc2l6ZSApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIFNldCBwb2ludGVyIGBzZm50X2J5dGVzJyB0byBpdHMgY29ycmVjdCB2YWx1ZS4gKi8KKyAgICAqc2ZudF9ieXRlcyA9IHNmbnQ7CisgICAgKm91dF9vZmZzZXQgPSBkZXN0X29mZnNldDsKKworICAgIEZUX0ZSRUUoIGxvY2FfYnVmICk7CisgICAgcmV0dXJuIGVycm9yOworCisgIEZhaWw6CisgICAgaWYgKCAhZXJyb3IgKQorICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgRlRfRlJFRSggbG9jYV9idWYgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIHJlY29uc3RydWN0X2dseWYoIEZUX1N0cmVhbSAgICBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICBnbHlmX2NoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgbG9jYV9jaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICAgIHNmbnRfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICBzZm50X3NpemUsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICBvdXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICBXT0ZGMl9JbmZvICAgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSApCisgIHsKKyAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7CisgICAgRlRfQnl0ZSogIHNmbnQgID0gKnNmbnRfYnl0ZXM7CisKKyAgICAvKiBjdXJyZW50IHBvc2l0aW9uIGluIHN0cmVhbSAqLworICAgIGNvbnN0IEZUX1VMb25nICBwb3MgPSBGVF9TVFJFQU1fUE9TKCk7CisKKyAgICBGVF9VSW50ICBudW1fc3Vic3RyZWFtcyA9IDc7CisKKyAgICBGVF9VU2hvcnQgIG51bV9nbHlwaHM7CisgICAgRlRfVVNob3J0ICBpbmRleF9mb3JtYXQ7CisgICAgRlRfVUxvbmcgICBleHBlY3RlZF9sb2NhX2xlbmd0aDsKKyAgICBGVF9VSW50ICAgIG9mZnNldDsKKyAgICBGVF9VSW50ICAgIGk7CisgICAgRlRfVUxvbmcgICBwb2ludHNfc2l6ZTsKKyAgICBGVF9VTG9uZyAgIGJpdG1hcF9sZW5ndGg7CisgICAgRlRfVUxvbmcgICBnbHlwaF9idWZfc2l6ZTsKKyAgICBGVF9VTG9uZyAgIGJib3hfYml0bWFwX29mZnNldDsKKworICAgIGNvbnN0IEZUX1VMb25nICBnbHlmX3N0YXJ0ICA9ICpvdXRfb2Zmc2V0OworICAgIEZUX1VMb25nICAgICAgICBkZXN0X29mZnNldCA9ICpvdXRfb2Zmc2V0OworCisgICAgV09GRjJfU3Vic3RyZWFtICBzdWJzdHJlYW1zID0gTlVMTDsKKworICAgIEZUX1VMb25nKiAgICBsb2NhX3ZhbHVlcyAgPSBOVUxMOworICAgIEZUX1VTaG9ydCogICBuX3BvaW50c19hcnIgPSBOVUxMOworICAgIEZUX0J5dGUqICAgICBnbHlwaF9idWYgICAgPSBOVUxMOworICAgIFdPRkYyX1BvaW50ICBwb2ludHMgICAgICAgPSBOVUxMOworCisKKyAgICBpZiAoIEZUX05FV19BUlJBWSggc3Vic3RyZWFtcywgbnVtX3N1YnN0cmVhbXMgKSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCA0ICkgKQorICAgICAgZ290byBGYWlsOworICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9nbHlwaHMgKSApCisgICAgICBnb3RvIEZhaWw7CisgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggaW5kZXhfZm9ybWF0ICkgKQorICAgICAgZ290byBGYWlsOworCisgICAgRlRfVFJBQ0U0KCggIm51bV9nbHlwaHMgPSAldTsgaW5kZXhfZm9ybWF0ID0gJXVcbiIsCisgICAgICAgICAgICAgICAgbnVtX2dseXBocywgaW5kZXhfZm9ybWF0ICkpOworCisgICAgaW5mby0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7CisKKyAgICAvKiBDYWxjdWxhdGUgZXhwZWN0ZWQgbGVuZ3RoIG9mIGxvY2EgYW5kIGNvbXBhcmUuICAgICAgICAgICovCisgICAgLyogU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XT0ZGMi8jY29uZm9ybS1tdXN0UmVqZWN0TG9jYSAqLworICAgIC8qIGluZGV4X2Zvcm1hdCA9IDAgPT4gU2hvcnQgdmVyc2lvbiBgbG9jYScuICAgICAgICAgICAgICAgKi8KKyAgICAvKiBpbmRleF9mb3JtYXQgPSAxID0+IExvbmcgdmVyc2lvbiBgbG9jYScuICAgICAgICAgICAgICAgICovCisgICAgZXhwZWN0ZWRfbG9jYV9sZW5ndGggPSAoIGluZGV4X2Zvcm1hdCA/IDQgOiAyICkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChGVF9VTG9uZyludW1fZ2x5cGhzICsgMSApOworICAgIGlmICggaW5mby0+bG9jYV90YWJsZS0+ZHN0X2xlbmd0aCAhPSBleHBlY3RlZF9sb2NhX2xlbmd0aCApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBvZmZzZXQgPSAoIDIgKyBudW1fc3Vic3RyZWFtcyApICogNDsKKyAgICBpZiAoIG9mZnNldCA+IGluZm8tPmdseWZfdGFibGUtPlRyYW5zZm9ybUxlbmd0aCApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9zdWJzdHJlYW1zOyArK2kgKQorICAgIHsKKyAgICAgIEZUX1VMb25nICBzdWJzdHJlYW1fc2l6ZTsKKworCisgICAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHN1YnN0cmVhbV9zaXplICkgKQorICAgICAgICBnb3RvIEZhaWw7CisgICAgICBpZiAoIHN1YnN0cmVhbV9zaXplID4gaW5mby0+Z2x5Zl90YWJsZS0+VHJhbnNmb3JtTGVuZ3RoIC0gb2Zmc2V0ICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBzdWJzdHJlYW1zW2ldLnN0YXJ0ICA9IHBvcyArIG9mZnNldDsKKyAgICAgIHN1YnN0cmVhbXNbaV0ub2Zmc2V0ID0gcG9zICsgb2Zmc2V0OworICAgICAgc3Vic3RyZWFtc1tpXS5zaXplICAgPSBzdWJzdHJlYW1fc2l6ZTsKKworICAgICAgRlRfVFJBQ0U1KCggIiAgU3Vic3RyZWFtICVkOiBvZmZzZXQgPSAlbHU7IHNpemUgPSAlbHU7XG4iLAorICAgICAgICAgICAgICAgICAgaSwgc3Vic3RyZWFtc1tpXS5vZmZzZXQsIHN1YnN0cmVhbXNbaV0uc2l6ZSApKTsKKyAgICAgIG9mZnNldCArPSBzdWJzdHJlYW1fc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoIEZUX05FV19BUlJBWSggbG9jYV92YWx1ZXMsIG51bV9nbHlwaHMgKyAxICkgKQorICAgICAgZ290byBGYWlsOworCisgICAgcG9pbnRzX3NpemUgICAgICAgID0gMDsKKyAgICBiYm94X2JpdG1hcF9vZmZzZXQgPSBzdWJzdHJlYW1zW0JCT1hfU1RSRUFNXS5vZmZzZXQ7CisKKyAgICAvKiBTaXplIG9mIGJib3hCaXRtYXAgPSA0ICogZmxvb3IoKG51bUdseXBocyArIDMxKSAvIDMyKSAqLworICAgIGJpdG1hcF9sZW5ndGggICAgICAgICAgICAgICAgICAgPSAoICggbnVtX2dseXBocyArIDMxVSApID4+IDUgKSA8PCAyOworICAgIHN1YnN0cmVhbXNbQkJPWF9TVFJFQU1dLm9mZnNldCArPSBiaXRtYXBfbGVuZ3RoOworCisgICAgZ2x5cGhfYnVmX3NpemUgPSBXT0ZGMl9ERUZBVUxUX0dMWVBIX0JVRjsKKyAgICBpZiAoIEZUX05FV19BUlJBWSggZ2x5cGhfYnVmLCBnbHlwaF9idWZfc2l6ZSApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIGlmICggRlRfTkVXX0FSUkFZKCBpbmZvLT54X21pbnMsIG51bV9nbHlwaHMgKSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9nbHlwaHM7ICsraSApCisgICAgeworICAgICAgRlRfVUxvbmcgICBnbHlwaF9zaXplID0gMDsKKyAgICAgIEZUX1VTaG9ydCAgbl9jb250b3VycyA9IDA7CisgICAgICBGVF9Cb29sICAgIGhhdmVfYmJveCAgPSBGQUxTRTsKKyAgICAgIEZUX0J5dGUgICAgYmJveF9iaXRtYXA7CisgICAgICBGVF9VTG9uZyAgIGJib3hfb2Zmc2V0OworICAgICAgRlRfVVNob3J0ICB4X21pbiAgICAgID0gMDsKKworCisgICAgICAvKiBTZXQgYGhhdmVfYmJveCcuICovCisgICAgICBiYm94X29mZnNldCA9IGJib3hfYml0bWFwX29mZnNldCArICggaSA+PiAzICk7CisgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBiYm94X29mZnNldCApIHx8CisgICAgICAgICAgIEZUX1JFQURfQllURSggYmJveF9iaXRtYXAgKSAgICkKKyAgICAgICAgZ290byBGYWlsOworICAgICAgaWYgKCBiYm94X2JpdG1hcCAmICggMHg4MCA+PiAoIGkgJiA3ICkgKSApCisgICAgICAgIGhhdmVfYmJveCA9IFRSVUU7CisKKyAgICAgIC8qIFJlYWQgdmFsdWUgZnJvbSBgbkNvbnRvdXJTdHJlYW0nLiAqLworICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tOX0NPTlRPVVJfU1RSRUFNXS5vZmZzZXQgKSB8fAorICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggbl9jb250b3VycyApICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIHN1YnN0cmVhbXNbTl9DT05UT1VSX1NUUkVBTV0ub2Zmc2V0ICs9IDI7CisKKyAgICAgIGlmICggbl9jb250b3VycyA9PSAweGZmZmYgKQorICAgICAgeworICAgICAgICAvKiBjb21wb3NpdGUgZ2x5cGggKi8KKyAgICAgICAgRlRfQm9vbCAgICBoYXZlX2luc3RydWN0aW9ucyA9IEZBTFNFOworICAgICAgICBGVF9VU2hvcnQgIGluc3RydWN0aW9uX3NpemUgID0gMDsKKyAgICAgICAgRlRfVUxvbmcgICBjb21wb3NpdGVfc2l6ZTsKKyAgICAgICAgRlRfVUxvbmcgICBzaXplX25lZWRlZDsKKyAgICAgICAgRlRfQnl0ZSogICBwb2ludGVyICAgICAgICAgICA9IE5VTEw7CisKKworICAgICAgICAvKiBDb21wb3NpdGUgZ2x5cGhzIG11c3QgaGF2ZSBleHBsaWNpdCBiYm94LiAqLworICAgICAgICBpZiAoICFoYXZlX2Jib3ggKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBpZiAoIGNvbXBvc2l0ZUdseXBoX3NpemUoIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHJlYW1zW0NPTVBPU0lURV9TVFJFQU1dLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9zaXRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhdmVfaW5zdHJ1Y3Rpb25zKSApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIGlmICggaGF2ZV9pbnN0cnVjdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tHTFlQSF9TVFJFQU1dLm9mZnNldCApIHx8CisgICAgICAgICAgICAgICBSRUFEXzI1NVVTSE9SVCggaW5zdHJ1Y3Rpb25fc2l6ZSApICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICBzdWJzdHJlYW1zW0dMWVBIX1NUUkVBTV0ub2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV9uZWVkZWQgPSAxMiArIGNvbXBvc2l0ZV9zaXplICsgaW5zdHJ1Y3Rpb25fc2l6ZTsKKyAgICAgICAgaWYgKCBnbHlwaF9idWZfc2l6ZSA8IHNpemVfbmVlZGVkICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGdseXBoX2J1ZiwgZ2x5cGhfYnVmX3NpemUsIHNpemVfbmVlZGVkICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIGdseXBoX2J1Zl9zaXplID0gc2l6ZV9uZWVkZWQ7CisgICAgICAgIH0KKworICAgICAgICBwb2ludGVyID0gZ2x5cGhfYnVmICsgZ2x5cGhfc2l6ZTsKKyAgICAgICAgV1JJVEVfVVNIT1JUKCBwb2ludGVyLCBuX2NvbnRvdXJzICk7CisgICAgICAgIGdseXBoX3NpemUgKz0gMjsKKworICAgICAgICAvKiBSZWFkIHhfbWluIGZvciBjdXJyZW50IGdseXBoLiAqLworICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzdWJzdHJlYW1zW0JCT1hfU1RSRUFNXS5vZmZzZXQgKSB8fAorICAgICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCB4X21pbiApICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAvKiBObyBpbmNyZW1lbnQgaGVyZSBiZWNhdXNlIHdlIHJlYWQgYWdhaW4uICovCisKKyAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tCQk9YX1NUUkVBTV0ub2Zmc2V0ICkgfHwKKyAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggZ2x5cGhfYnVmICsgZ2x5cGhfc2l6ZSwgOCApICAgICAgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBzdWJzdHJlYW1zW0JCT1hfU1RSRUFNXS5vZmZzZXQgKz0gODsKKyAgICAgICAgZ2x5cGhfc2l6ZSAgICAgICAgICAgICAgICAgICAgICs9IDg7CisKKyAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tDT01QT1NJVEVfU1RSRUFNXS5vZmZzZXQgKSAgICB8fAorICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBnbHlwaF9idWYgKyBnbHlwaF9zaXplLCBjb21wb3NpdGVfc2l6ZSApICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgc3Vic3RyZWFtc1tDT01QT1NJVEVfU1RSRUFNXS5vZmZzZXQgKz0gY29tcG9zaXRlX3NpemU7CisgICAgICAgIGdseXBoX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGNvbXBvc2l0ZV9zaXplOworCisgICAgICAgIGlmICggaGF2ZV9pbnN0cnVjdGlvbnMgKQorICAgICAgICB7CisgICAgICAgICAgcG9pbnRlciA9IGdseXBoX2J1ZiArIGdseXBoX3NpemU7CisgICAgICAgICAgV1JJVEVfVVNIT1JUKCBwb2ludGVyLCBpbnN0cnVjdGlvbl9zaXplICk7CisgICAgICAgICAgZ2x5cGhfc2l6ZSArPSAyOworCisgICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tJTlNUUlVDVElPTl9TVFJFQU1dLm9mZnNldCApICAgIHx8CisgICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggZ2x5cGhfYnVmICsgZ2x5cGhfc2l6ZSwgaW5zdHJ1Y3Rpb25fc2l6ZSApICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgIHN1YnN0cmVhbXNbSU5TVFJVQ1RJT05fU1RSRUFNXS5vZmZzZXQgKz0gaW5zdHJ1Y3Rpb25fc2l6ZTsKKyAgICAgICAgICBnbHlwaF9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGluc3RydWN0aW9uX3NpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgaWYgKCBuX2NvbnRvdXJzID4gMCApCisgICAgICB7CisgICAgICAgIC8qIHNpbXBsZSBnbHlwaCAqLworICAgICAgICBGVF9VTG9uZyAgIHRvdGFsX25fcG9pbnRzID0gMDsKKyAgICAgICAgRlRfVVNob3J0ICBuX3BvaW50c19jb250b3VyOworICAgICAgICBGVF9VSW50ICAgIGo7CisgICAgICAgIEZUX1VMb25nICAgZmxhZ19zaXplOworICAgICAgICBGVF9VTG9uZyAgIHRyaXBsZXRfc2l6ZTsKKyAgICAgICAgRlRfVUxvbmcgICB0cmlwbGV0X2J5dGVzX3VzZWQ7CisgICAgICAgIEZUX0J5dGUqICAgZmxhZ3NfYnVmICAgPSBOVUxMOworICAgICAgICBGVF9CeXRlKiAgIHRyaXBsZXRfYnVmID0gTlVMTDsKKyAgICAgICAgRlRfVVNob3J0ICBpbnN0cnVjdGlvbl9zaXplOworICAgICAgICBGVF9VTG9uZyAgIHNpemVfbmVlZGVkOworICAgICAgICBGVF9JbnQgICAgIGVuZF9wb2ludDsKKyAgICAgICAgRlRfVUludCAgICBjb250b3VyX2l4OworCisgICAgICAgIEZUX0J5dGUqICAgcG9pbnRlciA9IE5VTEw7CisKKworICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggbl9wb2ludHNfYXJyLCBuX2NvbnRvdXJzICkgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzdWJzdHJlYW1zW05fUE9JTlRTX1NUUkVBTV0ub2Zmc2V0ICkgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5fY29udG91cnM7ICsraiApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIFJFQURfMjU1VVNIT1JUKCBuX3BvaW50c19jb250b3VyICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIG5fcG9pbnRzX2FycltqXSA9IG5fcG9pbnRzX2NvbnRvdXI7CisgICAgICAgICAgLyogUHJldmVudCBuZWdhdGl2ZS9vdmVyZmxvdy4gKi8KKyAgICAgICAgICBpZiAoIHRvdGFsX25fcG9pbnRzICsgbl9wb2ludHNfY29udG91ciA8IHRvdGFsX25fcG9pbnRzICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgICB0b3RhbF9uX3BvaW50cyArPSBuX3BvaW50c19jb250b3VyOworICAgICAgICB9CisgICAgICAgIHN1YnN0cmVhbXNbTl9QT0lOVFNfU1RSRUFNXS5vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7CisKKyAgICAgICAgZmxhZ19zaXplID0gdG90YWxfbl9wb2ludHM7CisgICAgICAgIGlmICggZmxhZ19zaXplID4gc3Vic3RyZWFtc1tGTEFHX1NUUkVBTV0uc2l6ZSApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIGZsYWdzX2J1ZiAgID0gc3RyZWFtLT5iYXNlICsgc3Vic3RyZWFtc1tGTEFHX1NUUkVBTV0ub2Zmc2V0OworICAgICAgICB0cmlwbGV0X2J1ZiA9IHN0cmVhbS0+YmFzZSArIHN1YnN0cmVhbXNbR0xZUEhfU1RSRUFNXS5vZmZzZXQ7CisKKyAgICAgICAgaWYgKCBzdWJzdHJlYW1zW0dMWVBIX1NUUkVBTV0uc2l6ZSA8CisgICAgICAgICAgICAgICAoIHN1YnN0cmVhbXNbR0xZUEhfU1RSRUFNXS5vZmZzZXQgLQorICAgICAgICAgICAgICAgICBzdWJzdHJlYW1zW0dMWVBIX1NUUkVBTV0uc3RhcnQgKSApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIHRyaXBsZXRfc2l6ZSAgICAgICA9IHN1YnN0cmVhbXNbR0xZUEhfU1RSRUFNXS5zaXplIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHN1YnN0cmVhbXNbR0xZUEhfU1RSRUFNXS5vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyZWFtc1tHTFlQSF9TVFJFQU1dLnN0YXJ0ICk7CisgICAgICAgIHRyaXBsZXRfYnl0ZXNfdXNlZCA9IDA7CisKKyAgICAgICAgLyogQ3JlYXRlIGFycmF5IHRvIHN0b3JlIHBvaW50IGluZm9ybWF0aW9uLiAqLworICAgICAgICBwb2ludHNfc2l6ZSA9IHRvdGFsX25fcG9pbnRzOworICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggcG9pbnRzLCBwb2ludHNfc2l6ZSApICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgaWYgKCB0cmlwbGV0X2RlY29kZSggZmxhZ3NfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlwbGV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcGxldF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9uX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJpcGxldF9ieXRlc191c2VkICkgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBzdWJzdHJlYW1zW0ZMQUdfU1RSRUFNXS5vZmZzZXQgICs9IGZsYWdfc2l6ZTsKKyAgICAgICAgc3Vic3RyZWFtc1tHTFlQSF9TVFJFQU1dLm9mZnNldCArPSB0cmlwbGV0X2J5dGVzX3VzZWQ7CisKKyAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggc3Vic3RyZWFtc1tHTFlQSF9TVFJFQU1dLm9mZnNldCApIHx8CisgICAgICAgICAgICAgUkVBRF8yNTVVU0hPUlQoIGluc3RydWN0aW9uX3NpemUgKSAgICAgICAgICAgICAgICApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIHN1YnN0cmVhbXNbR0xZUEhfU1RSRUFNXS5vZmZzZXQgPSBGVF9TVFJFQU1fUE9TKCk7CisKKyAgICAgICAgaWYgKCB0b3RhbF9uX3BvaW50cyA+PSAoIDEgPDwgMjcgKSApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIHNpemVfbmVlZGVkID0gMTIgKworICAgICAgICAgICAgICAgICAgICAgICggMiAqIG5fY29udG91cnMgKSArCisgICAgICAgICAgICAgICAgICAgICAgKCA1ICogdG90YWxfbl9wb2ludHMgKSArCisgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2l6ZTsKKyAgICAgICAgaWYgKCBnbHlwaF9idWZfc2l6ZSA8IHNpemVfbmVlZGVkICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGdseXBoX2J1ZiwgZ2x5cGhfYnVmX3NpemUsIHNpemVfbmVlZGVkICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIGdseXBoX2J1Zl9zaXplID0gc2l6ZV9uZWVkZWQ7CisgICAgICAgIH0KKworICAgICAgICBwb2ludGVyID0gZ2x5cGhfYnVmICsgZ2x5cGhfc2l6ZTsKKyAgICAgICAgV1JJVEVfVVNIT1JUKCBwb2ludGVyLCBuX2NvbnRvdXJzICk7CisgICAgICAgIGdseXBoX3NpemUgKz0gMjsKKworICAgICAgICBpZiAoIGhhdmVfYmJveCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBSZWFkIHhfbWluIGZvciBjdXJyZW50IGdseXBoLiAqLworICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHN1YnN0cmVhbXNbQkJPWF9TVFJFQU1dLm9mZnNldCApIHx8CisgICAgICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggeF9taW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIC8qIE5vIGluY3JlbWVudCBoZXJlIGJlY2F1c2Ugd2UgcmVhZCBhZ2Fpbi4gKi8KKworICAgICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHN1YnN0cmVhbXNbQkJPWF9TVFJFQU1dLm9mZnNldCApIHx8CisgICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggZ2x5cGhfYnVmICsgZ2x5cGhfc2l6ZSwgOCApICAgICAgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIHN1YnN0cmVhbXNbQkJPWF9TVFJFQU1dLm9mZnNldCArPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICBjb21wdXRlX2Jib3goIHRvdGFsX25fcG9pbnRzLCBwb2ludHMsIGdseXBoX2J1ZiwgJnhfbWluICk7CisKKyAgICAgICAgZ2x5cGhfc2l6ZSA9IENPTlRPVVJfT0ZGU0VUX0VORF9QT0lOVDsKKworICAgICAgICBwb2ludGVyICAgPSBnbHlwaF9idWYgKyBnbHlwaF9zaXplOworICAgICAgICBlbmRfcG9pbnQgPSAtMTsKKworICAgICAgICBmb3IgKCBjb250b3VyX2l4ID0gMDsgY29udG91cl9peCA8IG5fY29udG91cnM7ICsrY29udG91cl9peCApCisgICAgICAgIHsKKyAgICAgICAgICBlbmRfcG9pbnQgKz0gbl9wb2ludHNfYXJyW2NvbnRvdXJfaXhdOworICAgICAgICAgIGlmICggZW5kX3BvaW50ID49IDY1NTM2ICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgIFdSSVRFX1NIT1JUKCBwb2ludGVyLCBlbmRfcG9pbnQgKTsKKyAgICAgICAgICBnbHlwaF9zaXplICs9IDI7CisgICAgICAgIH0KKworICAgICAgICBXUklURV9VU0hPUlQoIHBvaW50ZXIsIGluc3RydWN0aW9uX3NpemUgKTsKKyAgICAgICAgZ2x5cGhfc2l6ZSArPSAyOworCisgICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHN1YnN0cmVhbXNbSU5TVFJVQ1RJT05fU1RSRUFNXS5vZmZzZXQgKSAgICB8fAorICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBnbHlwaF9idWYgKyBnbHlwaF9zaXplLCBpbnN0cnVjdGlvbl9zaXplICkgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICBzdWJzdHJlYW1zW0lOU1RSVUNUSU9OX1NUUkVBTV0ub2Zmc2V0ICs9IGluc3RydWN0aW9uX3NpemU7CisgICAgICAgIGdseXBoX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gaW5zdHJ1Y3Rpb25fc2l6ZTsKKworICAgICAgICBpZiAoIHN0b3JlX3BvaW50cyggdG90YWxfbl9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2NvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoX3NpemUgKSApCisgICAgICAgICAgZ290byBGYWlsOworCisgICAgICAgIEZUX0ZSRUUoIHBvaW50cyApOworICAgICAgICBGVF9GUkVFKCBuX3BvaW50c19hcnIgKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgLyogRW1wdHkgZ2x5cGguICAgICAgICAgICovCisgICAgICAgIC8qIE11c3Qgbm90IGhhdmUgYSBiYm94LiAqLworICAgICAgICBpZiAoIGhhdmVfYmJveCApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9FUlJPUigoICJFbXB0eSBnbHlwaCBoYXMgYSBiYm94LlxuIiApKTsKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgbG9jYV92YWx1ZXNbaV0gPSBkZXN0X29mZnNldCAtIGdseWZfc3RhcnQ7CisKKyAgICAgIGlmICggV1JJVEVfU0ZOVF9CVUYoIGdseXBoX2J1ZiwgZ2x5cGhfc2l6ZSApICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICBpZiAoIHBhZDQoICZzZm50LCBzZm50X3NpemUsICZkZXN0X29mZnNldCwgbWVtb3J5ICkgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICpnbHlmX2NoZWNrc3VtICs9IGNvbXB1dGVfVUxvbmdfc3VtKCBnbHlwaF9idWYsIGdseXBoX3NpemUgKTsKKworICAgICAgLyogU3RvcmUgeF9taW5zLCBtYXkgYmUgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgYGhtdHgnLiAqLworICAgICAgaWYgKCBuX2NvbnRvdXJzID4gMCApCisgICAgICAgIGluZm8tPnhfbWluc1tpXSA9IChGVF9TaG9ydCl4X21pbjsKKyAgICB9CisKKyAgICBpbmZvLT5nbHlmX3RhYmxlLT5kc3RfbGVuZ3RoID0gZGVzdF9vZmZzZXQgLSBpbmZvLT5nbHlmX3RhYmxlLT5kc3Rfb2Zmc2V0OworICAgIGluZm8tPmxvY2FfdGFibGUtPmRzdF9vZmZzZXQgPSBkZXN0X29mZnNldDsKKworICAgIC8qIGBsb2NhW25dJyB3aWxsIGJlIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIGBnbHlmJyB0YWJsZS4gKi8KKyAgICBsb2NhX3ZhbHVlc1tudW1fZ2x5cGhzXSA9IGluZm8tPmdseWZfdGFibGUtPmRzdF9sZW5ndGg7CisKKyAgICBpZiAoIHN0b3JlX2xvY2EoIGxvY2FfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgbnVtX2dseXBocyArIDEsCisgICAgICAgICAgICAgICAgICAgICBpbmRleF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICBsb2NhX2NoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgJnNmbnQsCisgICAgICAgICAgICAgICAgICAgICBzZm50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAmZGVzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBpbmZvLT5sb2NhX3RhYmxlLT5kc3RfbGVuZ3RoID0gZGVzdF9vZmZzZXQgLSBpbmZvLT5sb2NhX3RhYmxlLT5kc3Rfb2Zmc2V0OworCisgICAgRlRfVFJBQ0U0KCggIiAgbG9jYSB0YWJsZSBpbmZvOlxuIiApKTsKKyAgICBGVF9UUkFDRTQoKCAiICAgIGRzdF9vZmZzZXQgPSAlbHVcbiIsIGluZm8tPmxvY2FfdGFibGUtPmRzdF9vZmZzZXQgKSk7CisgICAgRlRfVFJBQ0U0KCggIiAgICBkc3RfbGVuZ3RoID0gJWx1XG4iLCBpbmZvLT5sb2NhX3RhYmxlLT5kc3RfbGVuZ3RoICkpOworICAgIEZUX1RSQUNFNCgoICIgICAgY2hlY2tzdW0gPSAlMDlseFxuIiwgKmxvY2FfY2hlY2tzdW0gKSk7CisKKyAgICAvKiBTZXQgcG9pbnRlciBgc2ZudF9ieXRlcycgdG8gaXRzIGNvcnJlY3QgdmFsdWUuICovCisgICAgKnNmbnRfYnl0ZXMgPSBzZm50OworICAgICpvdXRfb2Zmc2V0ID0gZGVzdF9vZmZzZXQ7CisKKyAgICBGVF9GUkVFKCBzdWJzdHJlYW1zICk7CisgICAgRlRfRlJFRSggbG9jYV92YWx1ZXMgKTsKKyAgICBGVF9GUkVFKCBuX3BvaW50c19hcnIgKTsKKyAgICBGVF9GUkVFKCBnbHlwaF9idWYgKTsKKyAgICBGVF9GUkVFKCBwb2ludHMgKTsKKworICAgIHJldHVybiBlcnJvcjsKKworICBGYWlsOgorICAgIGlmICggIWVycm9yICkKKyAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKworICAgIC8qIFNldCBwb2ludGVyIGBzZm50X2J5dGVzJyB0byBpdHMgY29ycmVjdCB2YWx1ZS4gKi8KKyAgICAqc2ZudF9ieXRlcyA9IHNmbnQ7CisKKyAgICBGVF9GUkVFKCBzdWJzdHJlYW1zICk7CisgICAgRlRfRlJFRSggbG9jYV92YWx1ZXMgKTsKKyAgICBGVF9GUkVFKCBuX3BvaW50c19hcnIgKTsKKyAgICBGVF9GUkVFKCBnbHlwaF9idWYgKTsKKyAgICBGVF9GUkVFKCBwb2ludHMgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgLyogR2V0IGB4X21pbnMnIGZvciB1bnRyYW5zZm9ybWVkIGBnbHlmJyB0YWJsZS4gKi8KKyAgc3RhdGljIEZUX0Vycm9yCisgIGdldF94X21pbnMoIEZUX1N0cmVhbSAgICAgc3RyZWFtLAorICAgICAgICAgICAgICBXT0ZGMl9UYWJsZSogIHRhYmxlcywKKyAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBudW1fdGFibGVzLAorICAgICAgICAgICAgICBXT0ZGMl9JbmZvICAgIGluZm8sCisgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKKyAgeworICAgIEZUX1VTaG9ydCAgbnVtX2dseXBoczsKKyAgICBGVF9VU2hvcnQgIGluZGV4X2Zvcm1hdDsKKyAgICBGVF9VTG9uZyAgIGdseWZfb2Zmc2V0OworICAgIEZUX1VTaG9ydCAgZ2x5Zl9vZmZzZXRfc2hvcnQ7CisgICAgRlRfVUxvbmcgICBsb2NhX29mZnNldDsKKyAgICBGVF9JbnQgICAgIGk7CisgICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKKyAgICBGVF9VTG9uZyAgIG9mZnNldF9zaXplOworCisgICAgLyogQXQgdGhpcyBwb2ludCBvZiB0aW1lIHRob3NlIHRhYmxlcyBtaWdodCBub3QgaGF2ZSBiZWVuIHJlYWQgeWV0LiAqLworICAgIGNvbnN0IFdPRkYyX1RhYmxlICBtYXhwX3RhYmxlID0gZmluZF90YWJsZSggdGFibGVzLCBudW1fdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRBR19tYXhwICk7CisgICAgY29uc3QgV09GRjJfVGFibGUgIGhlYWRfdGFibGUgPSBmaW5kX3RhYmxlKCB0YWJsZXMsIG51bV90YWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEFHX2hlYWQgKTsKKworCisgICAgaWYgKCAhbWF4cF90YWJsZSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiYG1heHAnIHRhYmxlIGlzIG1pc3NpbmcuXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgaWYgKCAhaGVhZF90YWJsZSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiYGhlYWQnIHRhYmxlIGlzIG1pc3NpbmcuXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgaWYgKCAhaW5mby0+bG9jYV90YWJsZSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiYGxvY2EnIHRhYmxlIGlzIG1pc3NpbmcuXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgLyogUmVhZCBgbnVtR2x5cGhzJyBmaWVsZCBmcm9tIGBtYXhwJyB0YWJsZS4gKi8KKyAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBtYXhwX3RhYmxlLT5zcmNfb2Zmc2V0ICkgfHwgRlRfU1RSRUFNX1NLSVAoIDggKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBudW1fZ2x5cGhzICkgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgaW5mby0+bnVtX2dseXBocyA9IG51bV9nbHlwaHM7CisKKyAgICAvKiBSZWFkIGBpbmRleFRvTG9jRm9ybWF0JyBmaWVsZCBmcm9tIGBoZWFkJyB0YWJsZS4gKi8KKyAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBoZWFkX3RhYmxlLT5zcmNfb2Zmc2V0ICkgfHwKKyAgICAgICAgIEZUX1NUUkVBTV9TS0lQKCA1MCApICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggaW5kZXhfZm9ybWF0ICkgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgb2Zmc2V0X3NpemUgPSBpbmRleF9mb3JtYXQgPyA0IDogMjsKKworICAgIC8qIENyZWF0ZSBgeF9taW5zJyBhcnJheS4gKi8KKyAgICBpZiAoIEZUX05FV19BUlJBWSggaW5mby0+eF9taW5zLCBudW1fZ2x5cGhzICkgKQorICAgICAgcmV0dXJuIGVycm9yOworCisgICAgbG9jYV9vZmZzZXQgPSBpbmZvLT5sb2NhX3RhYmxlLT5zcmNfb2Zmc2V0OworCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fZ2x5cGhzOyArK2kgKQorICAgIHsKKyAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGxvY2Ffb2Zmc2V0ICkgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgIGxvY2Ffb2Zmc2V0ICs9IG9mZnNldF9zaXplOworCisgICAgICBpZiAoIGluZGV4X2Zvcm1hdCApCisgICAgICB7CisgICAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggZ2x5Zl9vZmZzZXQgKSApCisgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBnbHlmX29mZnNldF9zaG9ydCApICkKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgZ2x5Zl9vZmZzZXQgPSAoRlRfVUxvbmcpKCBnbHlmX29mZnNldF9zaG9ydCApOworICAgICAgICBnbHlmX29mZnNldCA9IGdseWZfb2Zmc2V0IDw8IDE7CisgICAgICB9CisKKyAgICAgIGdseWZfb2Zmc2V0ICs9IGluZm8tPmdseWZfdGFibGUtPnNyY19vZmZzZXQ7CisKKyAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGdseWZfb2Zmc2V0ICkgfHwgRlRfU1RSRUFNX1NLSVAoIDIgKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgaWYgKCBGVF9SRUFEX1NIT1JUKCBpbmZvLT54X21pbnNbaV0gKSApCisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIHN0YXRpYyBGVF9FcnJvcgorICByZWNvbnN0cnVjdF9obXR4KCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICBudW1fZ2x5cGhzLAorICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgIG51bV9obWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICB4X21pbnMsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgc2ZudF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzZm50X3NpemUsCisgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgb3V0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQorICB7CisgICAgRlRfRXJyb3IgIGVycm9yICAgICAgID0gRlRfRXJyX09rOworICAgIEZUX0J5dGUqICBzZm50ICAgICAgICA9ICpzZm50X2J5dGVzOworICAgIEZUX1VMb25nICBkZXN0X29mZnNldCA9ICpvdXRfb2Zmc2V0OworCisgICAgRlRfQnl0ZSAgIGhtdHhfZmxhZ3M7CisgICAgRlRfQm9vbCAgIGhhc19wcm9wb3J0aW9uYWxfbHNicywgaGFzX21vbm9zcGFjZV9sc2JzOworICAgIEZUX1VMb25nICBobXR4X3RhYmxlX3NpemU7CisgICAgRlRfSW50ICAgIGk7CisKKyAgICBGVF9VU2hvcnQqICBhZHZhbmNlX3dpZHRocyA9IE5VTEw7CisgICAgRlRfU2hvcnQqICAgbHNicyAgICAgICAgICAgPSBOVUxMOworICAgIEZUX0J5dGUqICAgIGhtdHhfdGFibGUgICAgID0gTlVMTDsKKyAgICBGVF9CeXRlKiAgICBkc3QgICAgICAgICAgICA9IE5VTEw7CisKKworICAgIGlmICggRlRfUkVBRF9CWVRFKCBobXR4X2ZsYWdzICkgKQorICAgICAgZ290byBGYWlsOworCisgICAgaGFzX3Byb3BvcnRpb25hbF9sc2JzID0gKCBobXR4X2ZsYWdzICYgMSApID09IDA7CisgICAgaGFzX21vbm9zcGFjZV9sc2JzICAgID0gKCBobXR4X2ZsYWdzICYgMiApID09IDA7CisKKyAgICAvKiBCaXRzIDItNyBhcmUgcmVzZXJ2ZWQgYW5kIE1VU1QgYmUgemVyby4gKi8KKyAgICBpZiAoICggaG10eF9mbGFncyAmIDB4RkMgKSAhPSAwICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIEFyZSB5b3UgUkVBTExZIHRyYW5zZm9ybWVkPyAqLworICAgIGlmICggaGFzX3Byb3BvcnRpb25hbF9sc2JzICYmIGhhc19tb25vc3BhY2VfbHNicyApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBDYW5ub3QgaGF2ZSBhIHRyYW5zZm9ybWVkIGBobXR4JyB3aXRob3V0IGBnbHlmJy4gKi8KKyAgICBpZiAoICggbnVtX2htZXRyaWNzID4gbnVtX2dseXBocyApIHx8CisgICAgICAgICAoIG51bV9obWV0cmljcyA8IDEgKSAgICAgICAgICApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LiAqLworICAgIGlmICggbnVtX2htZXRyaWNzIDwgMSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBpZiAoIEZUX05FV19BUlJBWSggYWR2YW5jZV93aWR0aHMsIG51bV9obWV0cmljcyApIHx8CisgICAgICAgICBGVF9ORVdfQVJSQVkoIGxzYnMsIG51bV9nbHlwaHMgKSAgICAgICAgICAgICApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBSZWFkIGBhZHZhbmNlV2lkdGgnIHN0cmVhbS4gIEFsd2F5cyBwcmVzZW50LiAqLworICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2htZXRyaWNzOyBpKysgKQorICAgIHsKKyAgICAgIEZUX1VTaG9ydCAgYWR2YW5jZV93aWR0aDsKKworCisgICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBhZHZhbmNlX3dpZHRoICkgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIGFkdmFuY2Vfd2lkdGhzW2ldID0gYWR2YW5jZV93aWR0aDsKKyAgICB9CisKKyAgICAvKiBsc2IgdmFsdWVzIGZvciBwcm9wb3J0aW9uYWwgZ2x5cGhzLiAqLworICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2htZXRyaWNzOyBpKysgKQorICAgIHsKKyAgICAgIEZUX1Nob3J0ICBsc2I7CisKKworICAgICAgaWYgKCBoYXNfcHJvcG9ydGlvbmFsX2xzYnMgKQorICAgICAgeworICAgICAgICBpZiAoIEZUX1JFQURfU0hPUlQoIGxzYiApICkKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGxzYiA9IHhfbWluc1tpXTsKKworICAgICAgbHNic1tpXSA9IGxzYjsKKyAgICB9CisKKyAgICAvKiBsc2IgdmFsdWVzIGZvciBtb25vc3BhY2VkIGdseXBocy4gKi8KKyAgICBmb3IgKCBpID0gbnVtX2htZXRyaWNzOyBpIDwgbnVtX2dseXBoczsgaSsrICkKKyAgICB7CisgICAgICBGVF9TaG9ydCAgbHNiOworCisKKyAgICAgIGlmICggaGFzX21vbm9zcGFjZV9sc2JzICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBGVF9SRUFEX1NIT1JUKCBsc2IgKSApCisgICAgICAgICAgZ290byBGYWlsOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBsc2IgPSB4X21pbnNbaV07CisKKyAgICAgIGxzYnNbaV0gPSBsc2I7CisgICAgfQorCisgICAgLyogQnVpbGQgdGhlIGhtdHggdGFibGUuICovCisgICAgaG10eF90YWJsZV9zaXplID0gMiAqIG51bV9obWV0cmljcyArIDIgKiBudW1fZ2x5cGhzOworICAgIGlmICggRlRfTkVXX0FSUkFZKCBobXR4X3RhYmxlLCBobXR4X3RhYmxlX3NpemUgKSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICBkc3QgPSBobXR4X3RhYmxlOworICAgIEZUX1RSQUNFNigoICJobXR4IHZhbHVlczogXG4iICkpOworICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2dseXBoczsgaSsrICkKKyAgICB7CisgICAgICBpZiAoIGkgPCBudW1faG1ldHJpY3MgKQorICAgICAgeworICAgICAgICBXUklURV9TSE9SVCggZHN0LCBhZHZhbmNlX3dpZHRoc1tpXSApOworICAgICAgICBGVF9UUkFDRTYoKCAiJWQgIiwgYWR2YW5jZV93aWR0aHNbaV0gKSk7CisgICAgICB9CisKKyAgICAgIFdSSVRFX1NIT1JUKCBkc3QsIGxzYnNbaV0gKTsKKyAgICAgIEZUX1RSQUNFNigoICIlZCAiLCBsc2JzW2ldICkpOworICAgIH0KKyAgICBGVF9UUkFDRTYoKCAiXG4iICkpOworCisgICAgKmNoZWNrc3VtID0gY29tcHV0ZV9VTG9uZ19zdW0oIGhtdHhfdGFibGUsIGhtdHhfdGFibGVfc2l6ZSApOworICAgIC8qIFdyaXRlIGBobXR4JyB0YWJsZSB0byBzZm50IGJ1ZmZlci4gKi8KKyAgICBpZiAoIFdSSVRFX1NGTlRfQlVGKCBobXR4X3RhYmxlLCBobXR4X3RhYmxlX3NpemUgKSApCisgICAgICBnb3RvIEZhaWw7CisKKyAgICAvKiBTZXQgcG9pbnRlciBgc2ZudF9ieXRlcycgdG8gaXRzIGNvcnJlY3QgdmFsdWUuICovCisgICAgKnNmbnRfYnl0ZXMgPSBzZm50OworICAgICpvdXRfb2Zmc2V0ID0gZGVzdF9vZmZzZXQ7CisKKyAgICBGVF9GUkVFKCBhZHZhbmNlX3dpZHRocyApOworICAgIEZUX0ZSRUUoIGxzYnMgKTsKKyAgICBGVF9GUkVFKCBobXR4X3RhYmxlICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisKKyAgRmFpbDoKKyAgICBGVF9GUkVFKCBhZHZhbmNlX3dpZHRocyApOworICAgIEZUX0ZSRUUoIGxzYnMgKTsKKyAgICBGVF9GUkVFKCBobXR4X3RhYmxlICk7CisKKyAgICBpZiAoICFlcnJvciApCisgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIHN0YXRpYyBGVF9FcnJvcgorICByZWNvbnN0cnVjdF9mb250KCBGVF9CeXRlKiAgICAgIHRyYW5zZm9ybWVkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICB0cmFuc2Zvcm1lZF9idWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgV09GRjJfVGFibGUqICBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICBXT0ZGMl9IZWFkZXIgIHdvZmYyLAorICAgICAgICAgICAgICAgICAgICBXT0ZGMl9JbmZvICAgIGluZm8sCisgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgICAgc2ZudF9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICBzZm50X3NpemUsCisgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKKyAgeworICAgIC8qIE1lbW9yeSBtYW5hZ2VtZW50IG9mIGB0cmFuc2Zvcm1lZF9idWYnIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4gKi8KKworICAgIEZUX0Vycm9yICAgZXJyb3IgICAgICAgPSBGVF9FcnJfT2s7CisgICAgRlRfU3RyZWFtICBzdHJlYW0gICAgICA9IE5VTEw7CisgICAgRlRfQnl0ZSogICBidWZfY3Vyc29yICA9IE5VTEw7CisgICAgRlRfQnl0ZSogICB0YWJsZV9lbnRyeSA9IE5VTEw7CisKKyAgICAvKiBXZSBhcmUgcmVhbGxvY2F0aW5nIG1lbW9yeSBmb3IgYHNmbnQnLCBzbyBpdHMgcG9pbnRlciBtYXkgY2hhbmdlLiAqLworICAgIEZUX0J5dGUqICAgc2ZudCA9ICpzZm50X2J5dGVzOworCisgICAgRlRfVVNob3J0ICBudW1fdGFibGVzICA9IHdvZmYyLT5udW1fdGFibGVzOworICAgIEZUX1VMb25nICAgZGVzdF9vZmZzZXQgPSAxMiArIG51bV90YWJsZXMgKiAxNlVMOworCisgICAgRlRfVUxvbmcgICBjaGVja3N1bSAgICAgID0gMDsKKyAgICBGVF9VTG9uZyAgIGxvY2FfY2hlY2tzdW0gPSAwOworICAgIEZUX0ludCAgICAgbm4gICAgICAgICAgICA9IDA7CisgICAgRlRfVVNob3J0ICBudW1faG1ldHJpY3MgID0gMDsKKyAgICBGVF9VTG9uZyAgIGZvbnRfY2hlY2tzdW0gPSBpbmZvLT5oZWFkZXJfY2hlY2tzdW07CisgICAgRlRfQm9vbCAgICBpc19nbHlmX3hmb3JtID0gRkFMU0U7CisKKyAgICBGVF9VTG9uZyAgdGFibGVfZW50cnlfb2Zmc2V0ID0gMTI7CisKKworICAgIC8qIEEgZmV3IHRhYmxlIGNoZWNrcyBiZWZvcmUgcmVjb25zdHJ1Y3Rpb24uICovCisgICAgLyogYGdseWYnIG11c3QgYmUgcHJlc2VudCB3aXRoIGBsb2NhJy4gICAgICAgKi8KKyAgICBpbmZvLT5nbHlmX3RhYmxlID0gZmluZF90YWJsZSggaW5kaWNlcywgbnVtX3RhYmxlcywgVFRBR19nbHlmICk7CisgICAgaW5mby0+bG9jYV90YWJsZSA9IGZpbmRfdGFibGUoIGluZGljZXMsIG51bV90YWJsZXMsIFRUQUdfbG9jYSApOworCisgICAgaWYgKCAoIGluZm8tPmdseWZfdGFibGUgPT0gTlVMTCApIF4gKCBpbmZvLT5sb2NhX3RhYmxlID09IE5VTEwgKSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiT25lIG9mIGBnbHlmJy9gbG9jYScgdGFibGVzIG1pc3NpbmcuXG4iICkpOworICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgfQorCisgICAgLyogQm90aCBgZ2x5ZicgYW5kIGBsb2NhJyBtdXN0IGhhdmUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gKi8KKyAgICBpZiAoIGluZm8tPmdseWZfdGFibGUgIT0gTlVMTCApCisgICAgeworICAgICAgaWYgKCAoIGluZm8tPmdseWZfdGFibGUtPmZsYWdzICYgV09GRjJfRkxBR1NfVFJBTlNGT1JNICkgIT0KKyAgICAgICAgICAgKCBpbmZvLT5sb2NhX3RhYmxlLT5mbGFncyAmIFdPRkYyX0ZMQUdTX1RSQU5TRk9STSApICkKKyAgICAgIHsKKyAgICAgICAgRlRfRVJST1IoKCAiVHJhbnNmb3JtYXRpb24gbWlzbWF0Y2giCisgICAgICAgICAgICAgICAgICAgIiBiZXR3ZWVuIGBnbHlmJyBhbmQgYGxvY2EnIHRhYmxlLiIgKSk7CisgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgfQorICAgIH0KKworICAgIC8qIENyZWF0ZSBidWZmZXIgZm9yIHRhYmxlIGVudHJpZXMuICovCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlX2VudHJ5LCAxNiApICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIC8qIENyZWF0ZSBhIHN0cmVhbSBmb3IgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIuICovCisgICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKKyAgICAgIGdvdG8gRmFpbDsKKyAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggc3RyZWFtLCB0cmFuc2Zvcm1lZF9idWYsIHRyYW5zZm9ybWVkX2J1Zl9zaXplICk7CisKKyAgICBGVF9BU1NFUlQoIEZUX1NUUkVBTV9QT1MoKSA9PSAwICk7CisKKyAgICAvKiBSZWNvbnN0cnVjdC9jb3B5IHRhYmxlcyB0byBvdXRwdXQgc3RyZWFtLiAqLworICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fdGFibGVzOyBubisrICkKKyAgICB7CisgICAgICBXT0ZGMl9UYWJsZVJlYyAgdGFibGUgPSAqKCBpbmRpY2VzW25uXSApOworCisKKyAgICAgIEZUX1RSQUNFMygoICJTZWVraW5nIHRvICVsZCB3aXRoIHRhYmxlIHNpemUgJWxkLlxuIiwKKyAgICAgICAgICAgICAgICAgIHRhYmxlLnNyY19vZmZzZXQsIHRhYmxlLnNyY19sZW5ndGggKSk7CisgICAgICBGVF9UUkFDRTMoKCAiVGFibGUgdGFnOiAlYyVjJWMlYy5cbiIsCisgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLlRhZyA+PiAyNCApLAorICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS5UYWcgPj4gMTYgKSwKKyAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUuVGFnID4+IDggICksCisgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLlRhZyAgICAgICApICkpOworCisgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZS5zcmNfb2Zmc2V0ICkgKQorICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgIGlmICggdGFibGUuc3JjX29mZnNldCArIHRhYmxlLnNyY19sZW5ndGggPiB0cmFuc2Zvcm1lZF9idWZfc2l6ZSApCisgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgLyogR2V0IHN0cmVhbSBzaXplIGZvciBmaWVsZHMgb2YgYGhtdHgnIHRhYmxlLiAqLworICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19oaGVhICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCByZWFkX251bV9obWV0cmljcyggc3RyZWFtLCAmbnVtX2htZXRyaWNzICkgKQorICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIH0KKworICAgICAgaW5mby0+bnVtX2htZXRyaWNzID0gbnVtX2htZXRyaWNzOworCisgICAgICBjaGVja3N1bSA9IDA7CisgICAgICBpZiAoICggdGFibGUuZmxhZ3MgJiBXT0ZGMl9GTEFHU19UUkFOU0ZPUk0gKSAhPSBXT0ZGMl9GTEFHU19UUkFOU0ZPUk0gKQorICAgICAgeworICAgICAgICAvKiBDaGVjayB3aGV0aGVyIGBoZWFkJyBpcyBhdCBsZWFzdCAxMiBieXRlcy4gKi8KKyAgICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19oZWFkICkKKyAgICAgICAgeworICAgICAgICAgIGlmICggdGFibGUuc3JjX2xlbmd0aCA8IDEyICkKKyAgICAgICAgICAgIGdvdG8gRmFpbDsKKworICAgICAgICAgIGJ1Zl9jdXJzb3IgPSB0cmFuc2Zvcm1lZF9idWYgKyB0YWJsZS5zcmNfb2Zmc2V0ICsgODsKKyAgICAgICAgICAvKiBTZXQgY2hlY2tTdW1BZGp1c3RtZW50ID0gMCAqLworICAgICAgICAgIFdSSVRFX1VMT05HKCBidWZfY3Vyc29yLCAwICk7CisgICAgICAgIH0KKworICAgICAgICB0YWJsZS5kc3Rfb2Zmc2V0ID0gZGVzdF9vZmZzZXQ7CisKKyAgICAgICAgY2hlY2tzdW0gPSBjb21wdXRlX1VMb25nX3N1bSggdHJhbnNmb3JtZWRfYnVmICsgdGFibGUuc3JjX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc3JjX2xlbmd0aCApOworICAgICAgICBGVF9UUkFDRTQoKCAiQ2hlY2tzdW0gPSAlMDlseC5cbiIsIGNoZWNrc3VtICkpOworCisgICAgICAgIGlmICggV1JJVEVfU0ZOVF9CVUYoIHRyYW5zZm9ybWVkX2J1ZiArIHRhYmxlLnNyY19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNyY19sZW5ndGggKSApCisgICAgICAgICAgZ290byBGYWlsOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBGVF9UUkFDRTMoKCAiVGhpcyB0YWJsZSBpcyB0cmFuc2Zvcm1lZC5cbiIgKSk7CisKKyAgICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19nbHlmICkKKyAgICAgICAgeworICAgICAgICAgIGlzX2dseWZfeGZvcm0gICAgPSBUUlVFOworICAgICAgICAgIHRhYmxlLmRzdF9vZmZzZXQgPSBkZXN0X29mZnNldDsKKworICAgICAgICAgIGlmICggcmVjb25zdHJ1Y3RfZ2x5Ziggc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxvY2FfY2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ZudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKSApCisgICAgICAgICAgICBnb3RvIEZhaWw7CisKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiQ2hlY2tzdW0gPSAlMDlseC5cbiIsIGNoZWNrc3VtICkpOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX2xvY2EgKQorICAgICAgICAgIGNoZWNrc3VtID0gbG9jYV9jaGVja3N1bTsKKworICAgICAgICBlbHNlIGlmICggdGFibGUuVGFnID09IFRUQUdfaG10eCApCisgICAgICAgIHsKKyAgICAgICAgICAvKiBJZiBnbHlmIGlzIG5vdCB0cmFuc2Zvcm1lZCBhbmQgaG10eCBpcywgaGFuZGxlIHNlcGFyYXRlbHkuICovCisgICAgICAgICAgaWYgKCAhaXNfZ2x5Zl94Zm9ybSApCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBnZXRfeF9taW5zKCBzdHJlYW0sIGluZGljZXMsIG51bV90YWJsZXMsIGluZm8sIG1lbW9yeSApICkKKyAgICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICAgIH0KKworICAgICAgICAgIHRhYmxlLmRzdF9vZmZzZXQgPSBkZXN0X29mZnNldDsKKworICAgICAgICAgIGlmICggcmVjb25zdHJ1Y3RfaG10eCggc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bnVtX2dseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm51bV9obWV0cmljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnhfbWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZm50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICkgKQorICAgICAgICAgICAgZ290byBGYWlsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIC8qIFVua25vd24gdHJhbnNmb3JtLiAqLworICAgICAgICAgIEZUX0VSUk9SKCggIlVua25vd24gdGFibGUgdHJhbnNmb3JtLlxuIiApKTsKKyAgICAgICAgICBnb3RvIEZhaWw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgZm9udF9jaGVja3N1bSArPSBjaGVja3N1bTsKKworICAgICAgYnVmX2N1cnNvciA9ICZ0YWJsZV9lbnRyeVswXTsKKyAgICAgIFdSSVRFX1VMT05HKCBidWZfY3Vyc29yLCB0YWJsZS5UYWcgKTsKKyAgICAgIFdSSVRFX1VMT05HKCBidWZfY3Vyc29yLCBjaGVja3N1bSApOworICAgICAgV1JJVEVfVUxPTkcoIGJ1Zl9jdXJzb3IsIHRhYmxlLmRzdF9vZmZzZXQgKTsKKyAgICAgIFdSSVRFX1VMT05HKCBidWZfY3Vyc29yLCB0YWJsZS5kc3RfbGVuZ3RoICk7CisKKyAgICAgIFdSSVRFX1NGTlRfQlVGX0FUKCB0YWJsZV9lbnRyeV9vZmZzZXQsIHRhYmxlX2VudHJ5LCAxNiApOworCisgICAgICAvKiBVcGRhdGUgY2hlY2tzdW0uICovCisgICAgICBmb250X2NoZWNrc3VtICs9IGNvbXB1dGVfVUxvbmdfc3VtKCB0YWJsZV9lbnRyeSwgMTYgKTsKKworICAgICAgaWYgKCBwYWQ0KCAmc2ZudCwgc2ZudF9zaXplLCAmZGVzdF9vZmZzZXQsIG1lbW9yeSApICkKKyAgICAgICAgZ290byBGYWlsOworCisgICAgICAvKiBTYW5pdHkgY2hlY2suICovCisgICAgICBpZiAoIChGVF9VTG9uZykoIHRhYmxlLmRzdF9vZmZzZXQgKyB0YWJsZS5kc3RfbGVuZ3RoICkgPiBkZXN0X29mZnNldCApCisgICAgICB7CisgICAgICAgIEZUX0VSUk9SKCggIlRhYmxlIHdhcyBwYXJ0aWFsbHkgd3JpdHRlbi5cbiIgKSk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBVcGRhdGUgYGhlYWQnIGNoZWNrU3VtQWRqdXN0bWVudC4gKi8KKyAgICBpbmZvLT5oZWFkX3RhYmxlID0gZmluZF90YWJsZSggaW5kaWNlcywgbnVtX3RhYmxlcywgVFRBR19oZWFkICk7CisgICAgaWYgKCAhaW5mby0+aGVhZF90YWJsZSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAiYGhlYWQnIHRhYmxlIGlzIG1pc3NpbmcuXG4iICkpOworICAgICAgZ290byBGYWlsOworICAgIH0KKworICAgIGlmICggaW5mby0+aGVhZF90YWJsZS0+ZHN0X2xlbmd0aCA8IDEyICkKKyAgICAgIGdvdG8gRmFpbDsKKworICAgIGJ1Zl9jdXJzb3IgICAgPSBzZm50ICsgaW5mby0+aGVhZF90YWJsZS0+ZHN0X29mZnNldCArIDg7CisgICAgZm9udF9jaGVja3N1bSA9IDB4QjFCMEFGQkEgLSBmb250X2NoZWNrc3VtOworCisgICAgV1JJVEVfVUxPTkcoIGJ1Zl9jdXJzb3IsIGZvbnRfY2hlY2tzdW0gKTsKKworICAgIEZUX1RSQUNFMigoICJGaW5hbCBjaGVja3N1bSA9ICUwOWx4LlxuIiwgZm9udF9jaGVja3N1bSApKTsKKworICAgIHdvZmYyLT5hY3R1YWxfc2ZudF9zaXplID0gZGVzdF9vZmZzZXQ7CisKKyAgICAvKiBTZXQgcG9pbnRlciBvZiBzZm50IHN0cmVhbSB0byBpdHMgY29ycmVjdCB2YWx1ZS4gKi8KKyAgICAqc2ZudF9ieXRlcyA9IHNmbnQ7CisKKyAgICBGVF9GUkVFKCB0YWJsZV9lbnRyeSApOworICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7CisgICAgRlRfRlJFRSggc3RyZWFtICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisKKyAgRmFpbDoKKyAgICBpZiAoICFlcnJvciApCisgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAvKiBTZXQgcG9pbnRlciBvZiBzZm50IHN0cmVhbSB0byBpdHMgY29ycmVjdCB2YWx1ZS4gKi8KKyAgICAqc2ZudF9ieXRlcyA9IHNmbnQ7CisKKyAgICBGVF9GUkVFKCB0YWJsZV9lbnRyeSApOworICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7CisgICAgRlRfRlJFRSggc3RyZWFtICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIC8qIFJlcGxhY2UgYGZhY2UtPnJvb3Quc3RyZWFtJyB3aXRoIGEgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCAqLworICAvKiBTRk5UIG9mIGEgV09GRjIgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKKyAgd29mZjJfb3Blbl9mb250KCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICBmYWNlX2luc3RhbmNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgbnVtX2ZhY2VzICkKKyAgeworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisgICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7CisgICAgRlRfSW50ICAgICBmYWNlX2luZGV4OworCisgICAgV09GRjJfSGVhZGVyUmVjICB3b2ZmMjsKKyAgICBXT0ZGMl9JbmZvUmVjICAgIGluZm8gICAgICAgICA9IHsgMCwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9OworICAgIFdPRkYyX1RhYmxlICAgICAgdGFibGVzICAgICAgID0gTlVMTDsKKyAgICBXT0ZGMl9UYWJsZSogICAgIGluZGljZXMgICAgICA9IE5VTEw7CisgICAgV09GRjJfVGFibGUqICAgICB0ZW1wX2luZGljZXMgPSBOVUxMOworICAgIFdPRkYyX1RhYmxlICAgICAgbGFzdF90YWJsZTsKKworICAgIEZUX0ludCAgICAgbm47CisgICAgRlRfVUxvbmcgICBqOworICAgIEZUX1VMb25nICAgZmxhZ3M7CisgICAgRlRfVVNob3J0ICB4Zm9ybV92ZXJzaW9uOworICAgIEZUX1VMb25nICAgc3JjX29mZnNldCA9IDA7CisKKyAgICBGVF9VSW50ICAgIGdseWZfaW5kZXg7CisgICAgRlRfVUludCAgICBsb2NhX2luZGV4OworICAgIEZUX1VJbnQzMiAgZmlsZV9vZmZzZXQ7CisKKyAgICBGVF9CeXRlKiAgIHNmbnQgICAgICAgID0gTlVMTDsKKyAgICBGVF9TdHJlYW0gIHNmbnRfc3RyZWFtID0gTlVMTDsKKyAgICBGVF9CeXRlKiAgIHNmbnRfaGVhZGVyOworICAgIEZUX1VMb25nICAgc2ZudF9zaXplOworCisgICAgRlRfQnl0ZSogIHVuY29tcHJlc3NlZF9idWYgPSBOVUxMOworCisgICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB3b2ZmMl9oZWFkZXJfZmllbGRzW10gPQorICAgIHsKKyN1bmRlZiAgRlRfU1RSVUNUVVJFCisjZGVmaW5lIEZUX1NUUlVDVFVSRSAgV09GRjJfSGVhZGVyUmVjCisKKyAgICAgIEZUX0ZSQU1FX1NUQVJUKCA0OCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAgICAgKCBzaWduYXR1cmUgKSwKKyAgICAgICAgRlRfRlJBTUVfVUxPTkcgICAgICggZmxhdm9yICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICAgICAoIGxlbmd0aCApLAorICAgICAgICBGVF9GUkFNRV9VU0hPUlQgICAgKCBudW1fdGFibGVzICksCisgICAgICAgIEZUX0ZSQU1FX1NLSVBfQllURVMoIDIgKSwKKyAgICAgICAgRlRfRlJBTUVfVUxPTkcgICAgICggdG90YWxTZm50U2l6ZSApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAgICAgKCB0b3RhbENvbXByZXNzZWRTaXplICksCisgICAgICAgIEZUX0ZSQU1FX1NLSVBfQllURVMoIDIgKiAyICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICAgICAoIG1ldGFPZmZzZXQgKSwKKyAgICAgICAgRlRfRlJBTUVfVUxPTkcgICAgICggbWV0YUxlbmd0aCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAgICAgKCBtZXRhT3JpZ0xlbmd0aCApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAgICAgKCBwcml2T2Zmc2V0ICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICAgICAoIHByaXZMZW5ndGggKSwKKyAgICAgIEZUX0ZSQU1FX0VORAorICAgIH07CisKKworICAgIEZUX0FTU0VSVCggc3RyZWFtID09IGZhY2UtPnJvb3Quc3RyZWFtICk7CisgICAgRlRfQVNTRVJUKCBGVF9TVFJFQU1fUE9TKCkgPT0gMCApOworCisgICAgZmFjZV9pbmRleCA9IEZUX0FCUyggKmZhY2VfaW5zdGFuY2VfaW5kZXggKSAmIDB4RkZGRjsKKworICAgIC8qIFJlYWQgV09GRjIgSGVhZGVyLiAqLworICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCB3b2ZmMl9oZWFkZXJfZmllbGRzLCAmd29mZjIgKSApCisgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBGVF9UUkFDRTQoKCAic2lnbmF0dXJlICAgICAtPiAweCVsWFxuIiwgd29mZjIuc2lnbmF0dXJlICkpOworICAgIEZUX1RSQUNFMigoICJmbGF2b3IgICAgICAgIC0+IDB4JTA4bHhcbiIsIHdvZmYyLmZsYXZvciApKTsKKyAgICBGVF9UUkFDRTQoKCAibGVuZ3RoICAgICAgICAtPiAlbHVcbiIsIHdvZmYyLmxlbmd0aCApKTsKKyAgICBGVF9UUkFDRTIoKCAibnVtX3RhYmxlcyAgICAtPiAlaHVcbiIsIHdvZmYyLm51bV90YWJsZXMgKSk7CisgICAgRlRfVFJBQ0U0KCggInRvdGFsU2ZudFNpemUgLT4gJWx1XG4iLCB3b2ZmMi50b3RhbFNmbnRTaXplICkpOworICAgIEZUX1RSQUNFNCgoICJtZXRhT2Zmc2V0ICAgIC0+ICVsdVxuIiwgd29mZjIubWV0YU9mZnNldCApKTsKKyAgICBGVF9UUkFDRTQoKCAibWV0YUxlbmd0aCAgICAtPiAlbHVcbiIsIHdvZmYyLm1ldGFMZW5ndGggKSk7CisgICAgRlRfVFJBQ0U0KCggInByaXZPZmZzZXQgICAgLT4gJWx1XG4iLCB3b2ZmMi5wcml2T2Zmc2V0ICkpOworICAgIEZUX1RSQUNFNCgoICJwcml2TGVuZ3RoICAgIC0+ICVsdVxuIiwgd29mZjIucHJpdkxlbmd0aCApKTsKKworICAgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCByZWN1cnNlIGJhY2sgaGVyZS4gKi8KKyAgICBpZiAoIHdvZmYyLmZsYXZvciA9PSBUVEFHX3dPRjIgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgICAvKiBNaXNjZWxsYW5lb3VzIGNoZWNrcy4gKi8KKyAgICBpZiAoIHdvZmYyLmxlbmd0aCAhPSBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIHdvZmYyLm51bV90YWJsZXMgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIDQ4ICsgd29mZjIubnVtX3RhYmxlcyAqIDIwVUwgPj0gd29mZjIubGVuZ3RoICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICggd29mZjIubWV0YU9mZnNldCA9PSAwICYmICggd29mZjIubWV0YUxlbmd0aCAhPSAwICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b2ZmMi5tZXRhT3JpZ0xlbmd0aCAhPSAwICkgKSB8fAorICAgICAgICAgKCB3b2ZmMi5tZXRhTGVuZ3RoICE9IDAgJiYgd29mZjIubWV0YU9yaWdMZW5ndGggPT0gMCApICAgICB8fAorICAgICAgICAgKCB3b2ZmMi5tZXRhT2Zmc2V0ID49IHdvZmYyLmxlbmd0aCApICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgKCB3b2ZmMi5sZW5ndGggLSB3b2ZmMi5tZXRhT2Zmc2V0IDwgd29mZjIubWV0YUxlbmd0aCApICAgICB8fAorICAgICAgICAgKCB3b2ZmMi5wcml2T2Zmc2V0ID09IDAgJiYgd29mZjIucHJpdkxlbmd0aCAhPSAwICkgICAgICAgICB8fAorICAgICAgICAgKCB3b2ZmMi5wcml2T2Zmc2V0ID49IHdvZmYyLmxlbmd0aCApICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgKCB3b2ZmMi5sZW5ndGggLSB3b2ZmMi5wcml2T2Zmc2V0IDwgd29mZjIucHJpdkxlbmd0aCApICAgICApCisgICAgeworICAgICAgRlRfRVJST1IoKCAid29mZjJfb3Blbl9mb250OiBpbnZhbGlkIFdPRkYyIGhlYWRlclxuIiApKTsKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgIH0KKworICAgIEZUX1RSQUNFMigoICJ3b2ZmMl9vcGVuX2ZvbnQ6IFdPRkYyIEhlYWRlciBpcyB2YWxpZC5cbiIgKSk7CisKKyAgICB3b2ZmMi50dGNfZm9udHMgPSBOVUxMOworCisgICAgLyogUmVhZCB0YWJsZSBkaXJlY3RvcnkuICovCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlcywgd29mZjIubnVtX3RhYmxlcyApICB8fAorICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbmRpY2VzLCB3b2ZmMi5udW1fdGFibGVzICkgKQorICAgICAgZ290byBFeGl0OworCisgICAgRlRfVFJBQ0UyKCgKKyAgICAgICJcbiIKKyAgICAgICIgIHRhZyAgICBmbGFncyAgICB0cmFuc2Zvcm0gIG9yaWdMZW4gICB0cmFuc2Zvcm1MZW4gICBvZmZzZXRcbiIKKyAgICAgICIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOworICAgLyogIiAgWFhYWCAgWFhYWFhYWFggIFhYWFhYWFhYICAgWFhYWFhYWFggICAgWFhYWFhYWFggICAgWFhYWFhYWFgiICovCisKKyAgICBmb3IgKCBubiA9IDA7IG5uIDwgd29mZjIubnVtX3RhYmxlczsgbm4rKyApCisgICAgeworICAgICAgV09GRjJfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47CisKKworICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIHRhYmxlLT5GbGFnQnl0ZSApICkKKyAgICAgICAgZ290byBFeGl0OworCisgICAgICBpZiAoICggdGFibGUtPkZsYWdCeXRlICYgMHgzZiApID09IDB4M2YgKQorICAgICAgeworICAgICAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHRhYmxlLT5UYWcgKSApCisgICAgICAgICAgZ290byBFeGl0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICB0YWJsZS0+VGFnID0gd29mZjJfa25vd25fdGFncyggdGFibGUtPkZsYWdCeXRlICYgMHgzZiApOworICAgICAgICBpZiAoICF0YWJsZS0+VGFnICkKKyAgICAgICAgeworICAgICAgICAgIEZUX0VSUk9SKCggIndvZmYyX29wZW5fZm9udDogVW5rbm93biB0YWJsZSB0YWcuIiApKTsKKyAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZsYWdzID0gMDsKKyAgICAgIHhmb3JtX3ZlcnNpb24gPSAoIHRhYmxlLT5GbGFnQnl0ZSA+PiA2ICkgJiAweDAzOworCisgICAgICAvKiAwIG1lYW5zIHhmb3JtIGZvciBnbHlwaC9sb2NhLCBub24tMCBmb3Igb3RoZXJzLiAqLworICAgICAgaWYgKCB0YWJsZS0+VGFnID09IFRUQUdfZ2x5ZiB8fCB0YWJsZS0+VGFnID09IFRUQUdfbG9jYSApCisgICAgICB7CisgICAgICAgIGlmICggeGZvcm1fdmVyc2lvbiA9PSAwICkKKyAgICAgICAgICBmbGFncyB8PSBXT0ZGMl9GTEFHU19UUkFOU0ZPUk07CisgICAgICB9CisgICAgICBlbHNlIGlmICggeGZvcm1fdmVyc2lvbiAhPSAwICkKKyAgICAgICAgZmxhZ3MgfD0gV09GRjJfRkxBR1NfVFJBTlNGT1JNOworCisgICAgICBmbGFncyB8PSB4Zm9ybV92ZXJzaW9uOworCisgICAgICBpZiAoIFJFQURfQkFTRTEyOCggdGFibGUtPmRzdF9sZW5ndGggKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgdGFibGUtPlRyYW5zZm9ybUxlbmd0aCA9IHRhYmxlLT5kc3RfbGVuZ3RoOworCisgICAgICBpZiAoICggZmxhZ3MgJiBXT0ZGMl9GTEFHU19UUkFOU0ZPUk0gKSAhPSAwICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBSRUFEX0JBU0UxMjgoIHRhYmxlLT5UcmFuc2Zvcm1MZW5ndGggKSApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIGlmICggdGFibGUtPlRhZyA9PSBUVEFHX2xvY2EgJiYgdGFibGUtPlRyYW5zZm9ybUxlbmd0aCApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9FUlJPUigoICJ3b2ZmMl9vcGVuX2ZvbnQ6IEludmFsaWQgbG9jYSBgdHJhbnNmb3JtTGVuZ3RoJy5cbiIgKSk7CisgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoIHNyY19vZmZzZXQgKyB0YWJsZS0+VHJhbnNmb3JtTGVuZ3RoIDwgc3JjX29mZnNldCApCisgICAgICB7CisgICAgICAgIEZUX0VSUk9SKCggIndvZmYyX29wZW5fZm9udDogaW52YWxpZCBXT0ZGMiB0YWJsZSBkaXJlY3RvcnkuXG4iICkpOworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgdGFibGUtPnNyY19vZmZzZXQgPSBzcmNfb2Zmc2V0OworICAgICAgdGFibGUtPnNyY19sZW5ndGggPSB0YWJsZS0+VHJhbnNmb3JtTGVuZ3RoOworICAgICAgc3JjX29mZnNldCAgICAgICArPSB0YWJsZS0+VHJhbnNmb3JtTGVuZ3RoOworICAgICAgdGFibGUtPmZsYWdzICAgICAgPSBmbGFnczsKKworICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgICUwOGQgICUwOGQgICAlMDhsZCAgICAlMDhsZCAgICAlMDhsZFxuIiwKKyAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyA+PiAyNCApLAorICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnID4+IDE2ICksCisgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLT5UYWcgPj4gOCAgKSwKKyAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyAgICAgICApLAorICAgICAgICAgICAgICAgICAgdGFibGUtPkZsYWdCeXRlICYgMHgzZiwKKyAgICAgICAgICAgICAgICAgICggdGFibGUtPkZsYWdCeXRlID4+IDYgKSAmIDB4MDMsCisgICAgICAgICAgICAgICAgICB0YWJsZS0+ZHN0X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgIHRhYmxlLT5UcmFuc2Zvcm1MZW5ndGgsCisgICAgICAgICAgICAgICAgICB0YWJsZS0+c3JjX29mZnNldCApKTsKKworICAgICAgaW5kaWNlc1tubl0gPSB0YWJsZTsKKyAgICB9CisKKyAgICAvKiBFbmQgb2YgbGFzdCB0YWJsZSBpcyB1bmNvbXByZXNzZWQgc2l6ZS4gKi8KKyAgICBsYXN0X3RhYmxlID0gaW5kaWNlc1t3b2ZmMi5udW1fdGFibGVzIC0gMV07CisKKyAgICB3b2ZmMi51bmNvbXByZXNzZWRfc2l6ZSA9IGxhc3RfdGFibGUtPnNyY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF90YWJsZS0+c3JjX2xlbmd0aDsKKyAgICBpZiAoIHdvZmYyLnVuY29tcHJlc3NlZF9zaXplIDwgbGFzdF90YWJsZS0+c3JjX29mZnNldCApCisgICAgeworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIEZUX1RSQUNFMigoICJUYWJsZSBkaXJlY3RvcnkgcGFyc2VkLlxuIiApKTsKKworICAgIC8qIENoZWNrIGZvciBhbmQgcmVhZCBjb2xsZWN0aW9uIGRpcmVjdG9yeS4gKi8KKyAgICB3b2ZmMi5udW1fZm9udHMgICAgICA9IDE7CisgICAgd29mZjIuaGVhZGVyX3ZlcnNpb24gPSAwOworCisgICAgaWYgKCB3b2ZmMi5mbGF2b3IgPT0gVFRBR190dGNmICkKKyAgICB7CisgICAgICBGVF9UUkFDRTIoKCAiRm9udCBpcyBhIFRUQywgcmVhZGluZyBjb2xsZWN0aW9uIGRpcmVjdG9yeS5cbiIgKSk7CisKKyAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggd29mZjIuaGVhZGVyX3ZlcnNpb24gKSApCisgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgaWYgKCB3b2ZmMi5oZWFkZXJfdmVyc2lvbiAhPSAweDAwMDEwMDAwICYmCisgICAgICAgICAgIHdvZmYyLmhlYWRlcl92ZXJzaW9uICE9IDB4MDAwMjAwMDAgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKworICAgICAgaWYgKCBSRUFEXzI1NVVTSE9SVCggd29mZjIubnVtX2ZvbnRzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGlmICggIXdvZmYyLm51bV9mb250cyApCisgICAgICB7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorCisgICAgICBGVF9UUkFDRTQoKCAiTnVtYmVyIG9mIGZvbnRzIGluIFRUQzogJWRcbiIsIHdvZmYyLm51bV9mb250cyApKTsKKworICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHdvZmYyLnR0Y19mb250cywgd29mZjIubnVtX2ZvbnRzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmMi5udW1fZm9udHM7IG5uKysgKQorICAgICAgeworICAgICAgICBXT0ZGMl9UdGNGb250ICB0dGNfZm9udCA9IHdvZmYyLnR0Y19mb250cyArIG5uOworCisKKyAgICAgICAgaWYgKCBSRUFEXzI1NVVTSE9SVCggdHRjX2ZvbnQtPm51bV90YWJsZXMgKSApCisgICAgICAgICAgZ290byBFeGl0OworICAgICAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHR0Y19mb250LT5mbGF2b3IgKSApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCB0dGNfZm9udC0+dGFibGVfaW5kaWNlcywgdHRjX2ZvbnQtPm51bV90YWJsZXMgKSApCisgICAgICAgICAgZ290byBFeGl0OworCisgICAgICAgIEZUX1RSQUNFNSgoICJOdW1iZXIgb2YgdGFibGVzIGluIGZvbnQgJWQ6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBubiwgdHRjX2ZvbnQtPm51bV90YWJsZXMgKSk7CisKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgICBpZiAoIHR0Y19mb250LT5udW1fdGFibGVzICkKKyAgICAgICAgICBGVF9UUkFDRTYoKCAiICBJbmRpY2VzOiAiICkpOworI2VuZGlmCisKKyAgICAgICAgZ2x5Zl9pbmRleCA9IDA7CisgICAgICAgIGxvY2FfaW5kZXggPSAwOworCisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgdHRjX2ZvbnQtPm51bV90YWJsZXM7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9VU2hvcnQgICAgdGFibGVfaW5kZXg7CisgICAgICAgICAgV09GRjJfVGFibGUgIHRhYmxlOworCisKKyAgICAgICAgICBpZiAoIFJFQURfMjU1VVNIT1JUKCB0YWJsZV9pbmRleCApICkKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKworICAgICAgICAgIEZUX1RSQUNFNigoICIlaHUgIiwgdGFibGVfaW5kZXggKSk7CisgICAgICAgICAgaWYgKCB0YWJsZV9pbmRleCA+PSB3b2ZmMi5udW1fdGFibGVzICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBGVF9FUlJPUigoICJ3b2ZmMl9vcGVuX2ZvbnQ6IGludmFsaWQgdGFibGUgaW5kZXhcbiIgKSk7CisgICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgdHRjX2ZvbnQtPnRhYmxlX2luZGljZXNbal0gPSB0YWJsZV9pbmRleDsKKworICAgICAgICAgIHRhYmxlID0gaW5kaWNlc1t0YWJsZV9pbmRleF07CisgICAgICAgICAgaWYgKCB0YWJsZS0+VGFnID09IFRUQUdfbG9jYSApCisgICAgICAgICAgICBsb2NhX2luZGV4ID0gdGFibGVfaW5kZXg7CisgICAgICAgICAgaWYgKCB0YWJsZS0+VGFnID09IFRUQUdfZ2x5ZiApCisgICAgICAgICAgICBnbHlmX2luZGV4ID0gdGFibGVfaW5kZXg7CisgICAgICAgIH0KKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICAgIGlmICggdHRjX2ZvbnQtPm51bV90YWJsZXMgKQorICAgICAgICAgIEZUX1RSQUNFNigoICJcbiIgKSk7CisjZW5kaWYKKworICAgICAgICAvKiBnbHlmIGFuZCBsb2NhIG11c3QgYmUgY29uc2VjdXRpdmUgKi8KKyAgICAgICAgaWYgKCBnbHlmX2luZGV4ID4gMCB8fCBsb2NhX2luZGV4ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIGdseWZfaW5kZXggPiBsb2NhX2luZGV4ICAgICAgfHwKKyAgICAgICAgICAgICAgIGxvY2FfaW5kZXggLSBnbHlmX2luZGV4ICE9IDEgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyogQ29sbGVjdGlvbiBkaXJlY3RvcnkgcmVhZGluZyBjb21wbGV0ZS4gKi8KKyAgICAgIEZUX1RSQUNFMigoICJXT0ZGMiBjb2xsZWN0aW9uIGRpcmVjdG9yeSBpcyB2YWxpZC5cbiIgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHdvZmYyLnR0Y19mb250cyA9IE5VTEw7CisKKyAgICB3b2ZmMi5jb21wcmVzc2VkX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKKyAgICBmaWxlX29mZnNldCAgICAgICAgICAgICA9IFJPVU5ENCggd29mZjIuY29tcHJlc3NlZF9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b2ZmMi50b3RhbENvbXByZXNzZWRTaXplICk7CisKKyAgICAvKiBTb21lIG1vcmUgY2hlY2tzIGJlZm9yZSB3ZSBzdGFydCByZWFkaW5nIHRoZSB0YWJsZXMuICovCisgICAgaWYgKCBmaWxlX29mZnNldCA+IHdvZmYyLmxlbmd0aCApCisgICAgeworICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmICggd29mZjIubWV0YU9mZnNldCApCisgICAgeworICAgICAgaWYgKCBmaWxlX29mZnNldCAhPSB3b2ZmMi5tZXRhT2Zmc2V0ICkKKyAgICAgIHsKKyAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisgICAgICBmaWxlX29mZnNldCA9IFJPVU5ENCh3b2ZmMi5tZXRhT2Zmc2V0ICsgd29mZjIubWV0YUxlbmd0aCk7CisgICAgfQorCisgICAgaWYgKCB3b2ZmMi5wcml2T2Zmc2V0ICkKKyAgICB7CisgICAgICBpZiAoIGZpbGVfb2Zmc2V0ICE9IHdvZmYyLnByaXZPZmZzZXQgKQorICAgICAgeworICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIH0KKyAgICAgIGZpbGVfb2Zmc2V0ID0gUk9VTkQ0KHdvZmYyLnByaXZPZmZzZXQgKyB3b2ZmMi5wcml2TGVuZ3RoKTsKKyAgICB9CisKKyAgICBpZiAoIGZpbGVfb2Zmc2V0ICE9ICggUk9VTkQ0KCB3b2ZmMi5sZW5ndGggKSApICkKKyAgICB7CisgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogVmFsaWRhdGUgcmVxdWVzdGVkIGZhY2UgaW5kZXguICovCisgICAgKm51bV9mYWNlcyA9IHdvZmYyLm51bV9mb250czsKKyAgICAvKiB2YWx1ZSAtKE4rMSkgcmVxdWVzdHMgaW5mb3JtYXRpb24gb24gaW5kZXggTiAqLworICAgIGlmICggKmZhY2VfaW5zdGFuY2VfaW5kZXggPCAwICkKKyAgICAgIGZhY2VfaW5kZXgtLTsKKworICAgIGlmICggZmFjZV9pbmRleCA+PSB3b2ZmMi5udW1fZm9udHMgKQorICAgIHsKKyAgICAgIGlmICggKmZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCisgICAgICB7CisgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICAgICAgZ290byBFeGl0OworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBmYWNlX2luZGV4ID0gMDsKKyAgICB9CisKKyAgICAvKiBPbmx5IHJldGFpbiB0YWJsZXMgb2YgdGhlIHJlcXVlc3RlZCBmYWNlIGluIGEgVFRDLiAqLworICAgIGlmICggd29mZjIuaGVhZGVyX3ZlcnNpb24gKQorICAgIHsKKyAgICAgIFdPRkYyX1R0Y0ZvbnQgIHR0Y19mb250ID0gd29mZjIudHRjX2ZvbnRzICsgZmFjZV9pbmRleDsKKworCisgICAgICAvKiBDcmVhdGUgYSB0ZW1wb3JhcnkgYXJyYXkuICovCisgICAgICBpZiAoIEZUX05FV19BUlJBWSggdGVtcF9pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHR0Y19mb250LT5udW1fdGFibGVzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIEZUX1RSQUNFNCgoICJTdG9yaW5nIHRhYmxlcyBmb3IgVFRDIGZhY2UgaW5kZXggJWQuXG4iLCBmYWNlX2luZGV4ICkpOworICAgICAgZm9yICggbm4gPSAwOyBubiA8IHR0Y19mb250LT5udW1fdGFibGVzOyBubisrICkKKyAgICAgICAgdGVtcF9pbmRpY2VzW25uXSA9IGluZGljZXNbdHRjX2ZvbnQtPnRhYmxlX2luZGljZXNbbm5dXTsKKworICAgICAgLyogUmVzaXplIGFycmF5IHRvIHJlcXVpcmVkIHNpemUuICovCisgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZjIubnVtX3RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0Y19mb250LT5udW1fdGFibGVzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKKyAgICAgIGZvciAoIG5uID0gMDsgbm4gPCB0dGNfZm9udC0+bnVtX3RhYmxlczsgbm4rKyApCisgICAgICAgIGluZGljZXNbbm5dID0gdGVtcF9pbmRpY2VzW25uXTsKKworICAgICAgRlRfRlJFRSggdGVtcF9pbmRpY2VzICk7CisKKyAgICAgIC8qIENoYW5nZSBoZWFkZXIgdmFsdWVzLiAqLworICAgICAgd29mZjIuZmxhdm9yICAgICA9IHR0Y19mb250LT5mbGF2b3I7CisgICAgICB3b2ZmMi5udW1fdGFibGVzID0gdHRjX2ZvbnQtPm51bV90YWJsZXM7CisgICAgfQorCisgICAgLyogV2UgbmVlZCB0byBhbGxvY2F0ZSB0aGlzIG11Y2ggYXQgdGhlIG1pbmltdW0uICovCisgICAgc2ZudF9zaXplID0gMTIgKyB3b2ZmMi5udW1fdGFibGVzICogMTZVTDsKKyAgICAvKiBUaGlzIGlzIHdoYXQgd2Ugbm9ybWFsbHkgZXhwZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW5pdGlhbGx5IHRydXN0IGB0b3RhbFNmbnRTaXplJyBhbmQgY2hhbmdlIGxhdGVyIGFzIHJlcXVpcmVkLiAqLworICAgIGlmICggd29mZjIudG90YWxTZm50U2l6ZSA+IHNmbnRfc2l6ZSApCisgICAgeworICAgICAgLyogSG93ZXZlciwgYWRqdXN0IHRoZSB2YWx1ZSB0byBzb21ldGhpbmcgcmVhc29uYWJsZS4gKi8KKworICAgICAgLyogRmFjdG9yIDY0IGlzIGhldXJpc3RpYy4gKi8KKyAgICAgIGlmICggKCB3b2ZmMi50b3RhbFNmbnRTaXplID4+IDYgKSA+IHdvZmYyLmxlbmd0aCApCisgICAgICAgIHNmbnRfc2l6ZSA9IHdvZmYyLmxlbmd0aCA8PCA2OworICAgICAgZWxzZQorICAgICAgICBzZm50X3NpemUgPSB3b2ZmMi50b3RhbFNmbnRTaXplOworCisgICAgICAvKiBWYWx1ZSAxPDwyNiA9IDY3MTA4ODY0IGlzIGhldXJpc3RpYy4gKi8KKyAgICAgIGlmIChzZm50X3NpemUgPj0gKDEgPDwgMjYpKQorICAgICAgICBzZm50X3NpemUgPSAxIDw8IDI2OworCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgIGlmICggc2ZudF9zaXplICE9IHdvZmYyLnRvdGFsU2ZudFNpemUgKQorICAgICAgICBGVF9UUkFDRTQoKCAiYWRqdXN0aW5nIGVzdGltYXRlIG9mIHVuY29tcHJlc3NlZCBmb250IHNpemUiCisgICAgICAgICAgICAgICAgICAgICIgdG8gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBzZm50X3NpemUgKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiBXcml0ZSBzZm50IGhlYWRlci4gKi8KKyAgICBpZiAoIEZUX0FMTE9DKCBzZm50LCBzZm50X3NpemUgKSB8fAorICAgICAgICAgRlRfTkVXKCBzZm50X3N0cmVhbSApICAgICAgICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHNmbnRfaGVhZGVyID0gc2ZudDsKKworICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgd29mZjIuZmxhdm9yICk7CisKKyAgICBpZiAoIHdvZmYyLm51bV90YWJsZXMgKQorICAgIHsKKyAgICAgIEZUX1VJbnQgIHNlYXJjaFJhbmdlLCBlbnRyeVNlbGVjdG9yLCByYW5nZVNoaWZ0LCB4OworCisKKyAgICAgIHggICAgICAgICAgICAgPSB3b2ZmMi5udW1fdGFibGVzOworICAgICAgZW50cnlTZWxlY3RvciA9IDA7CisgICAgICB3aGlsZSAoIHggKQorICAgICAgeworICAgICAgICB4ICAgICAgICAgICAgPj49IDE7CisgICAgICAgIGVudHJ5U2VsZWN0b3IgKz0gMTsKKyAgICAgIH0KKyAgICAgIGVudHJ5U2VsZWN0b3ItLTsKKworICAgICAgc2VhcmNoUmFuZ2UgPSAoIDEgPDwgZW50cnlTZWxlY3RvciApICogMTY7CisgICAgICByYW5nZVNoaWZ0ICA9ICggd29mZjIubnVtX3RhYmxlcyAqIDE2ICkgLSBzZWFyY2hSYW5nZTsKKworICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgd29mZjIubnVtX3RhYmxlcyApOworICAgICAgV1JJVEVfVVNIT1JUKCBzZm50X2hlYWRlciwgc2VhcmNoUmFuZ2UgKTsKKyAgICAgIFdSSVRFX1VTSE9SVCggc2ZudF9oZWFkZXIsIGVudHJ5U2VsZWN0b3IgKTsKKyAgICAgIFdSSVRFX1VTSE9SVCggc2ZudF9oZWFkZXIsIHJhbmdlU2hpZnQgKTsKKyAgICB9CisKKyAgICBpbmZvLmhlYWRlcl9jaGVja3N1bSA9IGNvbXB1dGVfVUxvbmdfc3VtKCBzZm50LCAxMiApOworCisgICAgLyogU29ydCB0YWJsZXMgYnkgdGFnLiAqLworICAgIGZ0X3Fzb3J0KCBpbmRpY2VzLAorICAgICAgICAgICAgICB3b2ZmMi5udW1fdGFibGVzLAorICAgICAgICAgICAgICBzaXplb2YgKCBXT0ZGMl9UYWJsZSApLAorICAgICAgICAgICAgICBjb21wYXJlX3RhZ3MgKTsKKworICAgIGlmICggd29mZjIudW5jb21wcmVzc2VkX3NpemUgPCAxICkKKyAgICB7CisgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgaWYgKCB3b2ZmMi51bmNvbXByZXNzZWRfc2l6ZSA+IHNmbnRfc2l6ZSApCisgICAgeworICAgICAgRlRfRVJST1IoKCAid29mZjJfb3Blbl9mb250OiBTRk5UIHRhYmxlIGxlbmd0aHMgYXJlIHRvbyBsYXJnZS5cbiIgKSk7CisgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB1bmNvbXByZXNzZWQgdGFibGUgZGF0YS4gKi8KKyAgICBpZiAoIEZUX0FMTE9DKCB1bmNvbXByZXNzZWRfYnVmLCB3b2ZmMi51bmNvbXByZXNzZWRfc2l6ZSApIHx8CisgICAgICAgICBGVF9GUkFNRV9FTlRFUiggd29mZjIudG90YWxDb21wcmVzc2VkU2l6ZSApICAgICAgICAgICApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICAvKiBVbmNvbXByZXNzIHRoZSBzdHJlYW0uICovCisgICAgZXJyb3IgPSB3b2ZmMl9kZWNvbXByZXNzKCB1bmNvbXByZXNzZWRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZjIudW5jb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmN1cnNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvZmYyLnRvdGFsQ29tcHJlc3NlZFNpemUgKTsKKworICAgIEZUX0ZSQU1FX0VYSVQoKTsKKworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgZXJyb3IgPSByZWNvbnN0cnVjdF9mb250KCB1bmNvbXByZXNzZWRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZjIudW5jb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndvZmYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2ZudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZm50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKKworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgLyogUmVzaXplIGBzZm50JyB0byBhY3R1YWwgc2l6ZSBvZiBzZm50IHN0cmVhbS4gKi8KKyAgICBpZiAoIHdvZmYyLmFjdHVhbF9zZm50X3NpemUgPCBzZm50X3NpemUgKQorICAgIHsKKyAgICAgIEZUX1RSQUNFNSgoICJUcmltbWluZyBzZm50IHN0cmVhbSBmcm9tICVsdSB0byAlbHUuXG4iLAorICAgICAgICAgICAgICAgICAgc2ZudF9zaXplLCB3b2ZmMi5hY3R1YWxfc2ZudF9zaXplICkpOworICAgICAgaWYgKCBGVF9SRUFMTE9DKCBzZm50LAorICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKCBzZm50X3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKSggd29mZjIuYWN0dWFsX3NmbnRfc2l6ZSApICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCisgICAgLyogYHJlY29uc3RydWN0X2ZvbnQnIGhhcyBkb25lIGFsbCB0aGUgd29yay4gKi8KKyAgICAvKiBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHVybi4gICAgICAgICAgICAgICAqLworICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzZm50X3N0cmVhbSwgc2ZudCwgd29mZjIuYWN0dWFsX3NmbnRfc2l6ZSApOworICAgIHNmbnRfc3RyZWFtLT5tZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKKyAgICBzZm50X3N0cmVhbS0+Y2xvc2UgID0gc3RyZWFtX2Nsb3NlOworCisgICAgRlRfU3RyZWFtX0ZyZWUoCisgICAgICBmYWNlLT5yb290LnN0cmVhbSwKKyAgICAgICggZmFjZS0+cm9vdC5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSApICE9IDAgKTsKKworICAgIGZhY2UtPnJvb3Quc3RyZWFtICAgICAgPSBzZm50X3N0cmVhbTsKKyAgICBmYWNlLT5yb290LmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU07CisKKyAgICAvKiBTZXQgZmFjZV9pbmRleCB0byAwIG9yIC0xLiAqLworICAgIGlmICggKmZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCisgICAgICAqZmFjZV9pbnN0YW5jZV9pbmRleCA9IDA7CisgICAgZWxzZQorICAgICAgKmZhY2VfaW5zdGFuY2VfaW5kZXggPSAtMTsKKworICAgIEZUX1RSQUNFMigoICJ3b2ZmMl9vcGVuX2ZvbnQ6IFNGTlQgc3ludGhlc2l6ZWQuXG4iICkpOworCisgIEV4aXQ6CisgICAgRlRfRlJFRSggdGFibGVzICk7CisgICAgRlRfRlJFRSggaW5kaWNlcyApOworICAgIEZUX0ZSRUUoIHVuY29tcHJlc3NlZF9idWYgKTsKKyAgICBGVF9GUkVFKCBpbmZvLnhfbWlucyApOworCisgICAgaWYgKCB3b2ZmMi50dGNfZm9udHMgKQorICAgIHsKKyAgICAgIFdPRkYyX1R0Y0ZvbnQgIHR0Y19mb250ID0gd29mZjIudHRjX2ZvbnRzOworCisKKyAgICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmMi5udW1fZm9udHM7IG5uKysgKQorICAgICAgeworICAgICAgICBGVF9GUkVFKCB0dGNfZm9udC0+dGFibGVfaW5kaWNlcyApOworICAgICAgICB0dGNfZm9udCsrOworICAgICAgfQorCisgICAgICBGVF9GUkVFKCB3b2ZmMi50dGNfZm9udHMgKTsKKyAgICB9CisKKyAgICBpZiAoIGVycm9yICkKKyAgICB7CisgICAgICBGVF9GUkVFKCBzZm50ICk7CisgICAgICBpZiAoIHNmbnRfc3RyZWFtICkKKyAgICAgIHsKKyAgICAgICAgRlRfU3RyZWFtX0Nsb3NlKCBzZm50X3N0cmVhbSApOworICAgICAgICBGVF9GUkVFKCBzZm50X3N0cmVhbSApOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyN1bmRlZiBSRUFEXzI1NVVTSE9SVAorI3VuZGVmIFJFQURfQkFTRTEyOAorI3VuZGVmIFJPVU5ENAorI3VuZGVmIFdSSVRFX1VTSE9SVAorI3VuZGVmIFdSSVRFX1VMT05HCisjdW5kZWYgV1JJVEVfU0hPUlQKKyN1bmRlZiBXUklURV9TRk5UX0JVRgorI3VuZGVmIFdSSVRFX1NGTlRfQlVGX0FUCisKKyN1bmRlZiBOX0NPTlRPVVJfU1RSRUFNCisjdW5kZWYgTl9QT0lOVFNfU1RSRUFNCisjdW5kZWYgRkxBR19TVFJFQU0KKyN1bmRlZiBHTFlQSF9TVFJFQU0KKyN1bmRlZiBDT01QT1NJVEVfU1RSRUFNCisjdW5kZWYgQkJPWF9TVFJFQU0KKyN1bmRlZiBJTlNUUlVDVElPTl9TVFJFQU0KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3Nmd29mZjIuaCBiL3NyYy9zZm50L3Nmd29mZjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OThmNjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvc2Z3b2ZmMi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc2Z3b2ZmMi5oCisgKgorICogICBXT0ZGRjIgZm9ybWF0IG1hbmFnZW1lbnQgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxOS0yMDIwIGJ5CisgKiBOaWtoaWwgUmFtYWtyaXNobmFuLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2lmbmRlZiBTRldPRkYyX0hfCisjZGVmaW5lIFNGV09GRjJfSF8KKworCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgLyogTGVhdmUgdGhlIGZpcnN0IGJ5dGUgb3BlbiB0byBzdG9yZSBgZmxhZ19ieXRlJy4gKi8KKyNkZWZpbmUgV09GRjJfRkxBR1NfVFJBTlNGT1JNICAgMSA8PCA4CisKKyNkZWZpbmUgV09GRjJfU0ZOVF9IRUFERVJfU0laRSAgMTIKKyNkZWZpbmUgV09GRjJfU0ZOVF9FTlRSWV9TSVpFICAgMTYKKworICAvKiBTdWdnZXN0ZWQgbWF4aW11bSBzaXplIGZvciBvdXRwdXQuICovCisjZGVmaW5lIFdPRkYyX0RFRkFVTFRfTUFYX1NJWkUgIDMwICogMTAyNCAqIDEwMjQKKworICAvKiA5OCUgb2YgR29vZ2xlIEZvbnRzIGhhdmUgbm8gZ2x5cGggYWJvdmUgNWsgYnl0ZXMuICovCisjZGVmaW5lIFdPRkYyX0RFRkFVTFRfR0xZUEhfQlVGICA1MTIwCisKKyAgLyogQ29tcG9zaXRlIGdseXBoIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogU2VlIGBDb21wb3NpdGVHbHlwaC5qYXZhJyBpbiBgc2ZudGx5JyBmb3IgZnVsbCBkZWZpbml0aW9ucy4gKi8KKyNkZWZpbmUgRkxBR19BUkdfMV9BTkRfMl9BUkVfV09SRFMgICAgIDEgPDwgMAorI2RlZmluZSBGTEFHX1dFX0hBVkVfQV9TQ0FMRSAgICAgICAgICAgMSA8PCAzCisjZGVmaW5lIEZMQUdfTU9SRV9DT01QT05FTlRTICAgICAgICAgICAxIDw8IDUKKyNkZWZpbmUgRkxBR19XRV9IQVZFX0FOX1hfQU5EX1lfU0NBTEUgIDEgPDwgNgorI2RlZmluZSBGTEFHX1dFX0hBVkVfQV9UV09fQllfVFdPICAgICAgMSA8PCA3CisjZGVmaW5lIEZMQUdfV0VfSEFWRV9JTlNUUlVDVElPTlMgICAgICAxIDw8IDgKKworICAvKiBTaW1wbGUgZ2x5cGggZmxhZ3MgKi8KKyNkZWZpbmUgR0xZRl9PTl9DVVJWRSAgICAgICAgMSA8PCAwCisjZGVmaW5lIEdMWUZfWF9TSE9SVCAgICAgICAgIDEgPDwgMQorI2RlZmluZSBHTFlGX1lfU0hPUlQgICAgICAgICAxIDw8IDIKKyNkZWZpbmUgR0xZRl9SRVBFQVQgICAgICAgICAgMSA8PCAzCisjZGVmaW5lIEdMWUZfVEhJU19YX0lTX1NBTUUgIDEgPDwgNAorI2RlZmluZSBHTFlGX1RISVNfWV9JU19TQU1FICAxIDw8IDUKKworICAvKiBPdGhlciBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ09OVE9VUl9PRkZTRVRfRU5EX1BPSU5UICAxMAorCisKKyAgRlRfTE9DQUwoIEZUX0Vycm9yICkKKyAgd29mZjJfb3Blbl9mb250KCBGVF9TdHJlYW0gIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICBmYWNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgbnVtX2ZhY2VzICk7CisKKworRlRfRU5EX0hFQURFUgorCisjZW5kaWYgLyogU0ZXT0ZGMl9IXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRiZGYuYyBiL3NyYy9zZm50L3R0YmRmLmMKaW5kZXggNTM0MjAxZi4uYTI4N2QzYSAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRiZGYuYworKysgYi9zcmMvc2ZudC90dGJkZi5jCkBAIC0xLDI1ICsxLDI0IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGJkZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzIChib2R5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGJkZi5jCisgKgorICogICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CiAjaW5jbHVkZSAidHRiZGYuaCIKIAogI2luY2x1ZGUgInNmZXJyb3JzLmgiCkBAIC0yNywxNCArMjYsMTQgQEAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0YmRmCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHRiZGYKIAogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCkBAIC00NSw3ICs0NCw3IEBACiAKICAgICBpZiAoIGJkZi0+bG9hZGVkICkKICAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0UoZmFjZSktPnN0cmVhbTsKKyAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gRlRfRkFDRSggZmFjZSApLT5zdHJlYW07CiAKIAogICAgICAgaWYgKCBiZGYtPnRhYmxlICkKQEAgLTExMSw4ICsxMTAsOCBAQAogICAgICAgICBGVF9VSW50ICBudW1faXRlbXMgPSBGVF9QRUVLX1VTSE9SVCggcCArIDIgKTsKIAogICAgICAgICAvKgotICAgICAgICAgKiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWUgc2V0cyB0aGVtc2VsdmVzLCBzaW5jZSB0aGlzCi0gICAgICAgICAqICBpcyBkb25lIGxhdGVyLgorICAgICAgICAgKiBXZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSB2YWx1ZSBzZXRzIHRoZW1zZWx2ZXMsIHNpbmNlIHRoaXMKKyAgICAgICAgICogaXMgZG9uZSBsYXRlci4KICAgICAgICAgICovCiAgICAgICAgIHN0cmlrZSArPSAxMCAqIG51bV9pdGVtczsKIApAQCAtMTQyLDcgKzE0MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3AgKQogICB7CiAgICAgVFRfQkRGICAgICBiZGYgICA9ICZmYWNlLT5iZGY7Ci0gICAgRlRfU2l6ZSAgICBzaXplICA9IEZUX0ZBQ0UoZmFjZSktPnNpemU7CisgICAgRlRfU2l6ZSAgICBzaXplICA9IEZUX0ZBQ0UoIGZhY2UgKS0+c2l6ZTsKICAgICBGVF9FcnJvciAgIGVycm9yID0gRlRfRXJyX09rOwogICAgIEZUX0J5dGUqICAgcDsKICAgICBGVF9VSW50ICAgIGNvdW50OwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRiZGYuaCBiL3NyYy9zZm50L3R0YmRmLmgKaW5kZXggODA5YTY2My4uZTYwYzAxYyAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRiZGYuaAorKysgYi9zcmMvc2ZudC90dGJkZi5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIEJERiBwcm9wZXJ0aWVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGJkZi5oCisgKgorICogICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVEJERl9IXwogI2RlZmluZSBUVEJERl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgRlRfQkRGX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGJkZi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjbWFwLmMgYi9zcmMvc2ZudC90dGNtYXAuYwppbmRleCA5OTZlNjY0Li41NTZhNzEyIDEwMDY0NAotLS0gYS9zcmMvc2ZudC90dGNtYXAuYworKysgYi9zcmMvc2ZudC90dGNtYXAuYwpAQCAtMSw0MyArMSw0MSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHRjbWFwLmMKKyAqCisgKiAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KIAotI2luY2x1ZGUgInNmZXJyb3JzLmgiICAgICAgICAgICAvKiBtdXN0IGNvbWUgYmVmb3JlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggKi8KKyNpbmNsdWRlICJzZmVycm9ycy5oIiAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGNvbWUgYmVmb3JlIGBmdHZhbGlkLmgnICovCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CiAjaW5jbHVkZSAidHRsb2FkLmgiCiAjaW5jbHVkZSAidHRjbWFwLmgiCiAjaW5jbHVkZSAidHRwb3N0LmgiCi0jaW5jbHVkZSAic2ZudHBpYy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Y21hcAorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0Y21hcAogCiAKICNkZWZpbmUgVFRfUEVFS19TSE9SVCAgIEZUX1BFRUtfU0hPUlQKQEAgLTc3LDE5ICs3NSwxOSBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICBtdXN0IGJlIDAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhfaWRzICAgNiAgICAgICAgICAgICAgQllURVsyNTZdICAgICBhcnJheSBvZiBnbHlwaCBpbmRpY2VzICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDI2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUQUJMRSBPVkVSVklFVworICAgKiAtLS0tLS0tLS0tLS0tLQorICAgKgorICAgKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgREVTQ1JJUFRJT04KKyAgICoKKyAgICogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgIG11c3QgYmUgMAorICAgKiAgIGxlbmd0aCAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzCisgICAqICAgbGFuZ3VhZ2UgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZQorICAgKiAgIGdseXBoX2lkcyAgIDYgICAgICAgICAgICAgIEJZVEVbMjU2XSAgICAgYXJyYXkgb2YgZ2x5cGggaW5kaWNlcworICAgKiAgICAgICAgICAgICAgIDI2MgorICAgKi8KIAogI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCiAKQEAgLTIzOCw1NyArMjM2LDU3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgVFlQRSAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgbXVzdCBiZSAyICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgMiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgIHRhYmxlIGxlbmd0aCBpbiBieXRlcyAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZSAgICAgICAgKi8KLSAgLyogICBrZXlzICAgICAgICA2ICAgICAgICAgICAgICBVU0hPUlRbMjU2XSAgICAgc3ViLWhlYWRlciBrZXlzICAgICAgICAgICovCi0gIC8qICAgc3VicyAgICAgICAgNTE4ICAgICAgICAgICAgU1VCSEVBRFtOU1VCU10gIHN1Yi1oZWFkZXJzIGFycmF5ICAgICAgICAqLwotICAvKiAgIGdseXBoX2lkcyAgIDUxOCtOU1VCKjggICAgIFVTSE9SVFtdICAgICAgICBnbHlwaCBJRCBhcnJheSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBga2V5cycgdGFibGUgaXMgdXNlZCB0byBtYXAgY2hhcmNvZGUgaGlnaCBieXRlcyB0byBzdWItaGVhZGVycy4gICAqLwotICAvKiBUaGUgdmFsdWUgb2YgYE5TVUJTJyBpcyB0aGUgbnVtYmVyIG9mIHN1Yi1oZWFkZXJzIGRlZmluZWQgaW4gdGhlICAgICAgKi8KLSAgLyogdGFibGUgYW5kIGlzIGNvbXB1dGVkIGJ5IGZpbmRpbmcgdGhlIG1heGltdW0gb2YgdGhlIGBrZXlzJyB0YWJsZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgZm9yIGFueSBgbicsIGBrZXlzW25dJyBpcyBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiB0aGUgYHN1YnMnICAgKi8KLSAgLyogdGFibGUsIGkuZS4sIGl0IGlzIHRoZSBjb3JyZXNwb25kaW5nIHN1Yi1oZWFkZXIgaW5kZXggbXVsdGlwbGllZCAgICAgICovCi0gIC8qIGJ5IDguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBzdWItaGVhZGVyIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgIFRZUEUgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmlyc3QgICAgICAgMCAgICAgICAgICAgVVNIT1JUICAgICAgICAgIGZpcnN0IHZhbGlkIGxvdy1ieXRlICAgICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgIDIgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBudW1iZXIgb2YgdmFsaWQgbG93LWJ5dGVzICAgKi8KLSAgLyogICBkZWx0YSAgICAgICA0ICAgICAgICAgICBTSE9SVCAgICAgICAgICAgc2VlIGJlbG93ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgb2Zmc2V0ICAgICAgNiAgICAgICAgICAgVVNIT1JUICAgICAgICAgIHNlZSBiZWxvdyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBzdWItaGVhZGVyIGRlZmluZXMsIGZvciBlYWNoIGhpZ2ggYnl0ZSwgdGhlIHJhbmdlIG9mIHZhbGlkICAgICAgICAgICovCi0gIC8qIGxvdyBieXRlcyB3aXRoaW4gdGhlIGNoYXJtYXAuICBOb3RlIHRoYXQgdGhlIHJhbmdlIGRlZmluZWQgYnkgYGZpcnN0JyAqLwotICAvKiBhbmQgYGNvdW50JyBtdXN0IGJlIGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4gdGhlIGludGVydmFsIFswLi4yNTVdICAgICAgKi8KLSAgLyogYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhIGNoYXJhY3RlciBjb2RlIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSBnaXZlbiBzdWItaGVhZGVyLCB0aGVuICAgICAgKi8KLSAgLyogbWFwcGluZyBpdCB0byBhIGdseXBoIGluZGV4IGlzIGRvbmUgYXMgZm9sbG93cy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAqIFRoZSB2YWx1ZSBvZiBgb2Zmc2V0JyBpcyByZWFkLiAgVGhpcyBpcyBhIF9ieXRlXyBkaXN0YW5jZSBmcm9tIHRoZSAgKi8KLSAgLyogICBsb2NhdGlvbiBvZiB0aGUgYG9mZnNldCcgZmllbGQgaXRzZWxmIGludG8gYSBzbGljZSBvZiB0aGUgICAgICAgICAgICovCi0gIC8qICAgYGdseXBoX2lkcycgdGFibGUuICBMZXQncyBjYWxsIGl0IGBzbGljZScgKGl0IGlzIGEgVVNIT1JUW10sIHRvbykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKiBUaGUgdmFsdWUgYHNsaWNlW2NoYXIubG8gLSBmaXJzdF0nIGlzIHJlYWQuICBJZiBpdCBpcyAwLCB0aGVyZSBpcyAgICovCi0gIC8qICAgbm8gZ2x5cGggZm9yIHRoZSBjaGFyY29kZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBkZWx0YScgaXMgICAgICAqLwotICAvKiAgIGFkZGVkIHRvIGl0IChtb2R1bG8gNjU1MzYpIHRvIGZvcm0gYSBuZXcgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHVwIHRvIHRoZSB2YWxpZGF0aW9uIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCBhbGwgb2Zmc2V0cyBmYWxsICAgICAqLwotICAvKiB3aXRoaW4gdGhlIGdseXBoIElEcyB0YWJsZSAoYW5kIG5vdCB3aXRoaW4gdGhlIGBzdWJzJyB0YWJsZSBpdHNlbGYgb3IgKi8KLSAgLyogb3V0c2lkZSBvZiB0aGUgQ01hcCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVEFCTEUgT1ZFUlZJRVcKKyAgICogLS0tLS0tLS0tLS0tLS0KKyAgICoKKyAgICogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICAgICAgREVTQ1JJUFRJT04KKyAgICoKKyAgICogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgbXVzdCBiZSAyCisgICAqICAgbGVuZ3RoICAgICAgMiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgIHRhYmxlIGxlbmd0aCBpbiBieXRlcworICAgKiAgIGxhbmd1YWdlICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZQorICAgKiAgIGtleXMgICAgICAgIDYgICAgICAgICAgICAgIFVTSE9SVFsyNTZdICAgICBzdWItaGVhZGVyIGtleXMKKyAgICogICBzdWJzICAgICAgICA1MTggICAgICAgICAgICBTVUJIRUFEW05TVUJTXSAgc3ViLWhlYWRlcnMgYXJyYXkKKyAgICogICBnbHlwaF9pZHMgICA1MTgrTlNVQio4ICAgICBVU0hPUlRbXSAgICAgICAgZ2x5cGggSUQgYXJyYXkKKyAgICoKKyAgICogVGhlIGBrZXlzJyB0YWJsZSBpcyB1c2VkIHRvIG1hcCBjaGFyY29kZSBoaWdoIGJ5dGVzIHRvIHN1Yi1oZWFkZXJzLgorICAgKiBUaGUgdmFsdWUgb2YgYE5TVUJTJyBpcyB0aGUgbnVtYmVyIG9mIHN1Yi1oZWFkZXJzIGRlZmluZWQgaW4gdGhlCisgICAqIHRhYmxlIGFuZCBpcyBjb21wdXRlZCBieSBmaW5kaW5nIHRoZSBtYXhpbXVtIG9mIHRoZSBga2V5cycgdGFibGUuCisgICAqCisgICAqIE5vdGUgdGhhdCBmb3IgYW55IGBuJywgYGtleXNbbl0nIGlzIGEgYnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBgc3VicycKKyAgICogdGFibGUsIGkuZS4sIGl0IGlzIHRoZSBjb3JyZXNwb25kaW5nIHN1Yi1oZWFkZXIgaW5kZXggbXVsdGlwbGllZAorICAgKiBieSA4LgorICAgKgorICAgKiBFYWNoIHN1Yi1oZWFkZXIgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgorICAgKgorICAgKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgIFRZUEUgICAgICAgICAgICBERVNDUklQVElPTgorICAgKgorICAgKiAgIGZpcnN0ICAgICAgIDAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBmaXJzdCB2YWxpZCBsb3ctYnl0ZQorICAgKiAgIGNvdW50ICAgICAgIDIgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBudW1iZXIgb2YgdmFsaWQgbG93LWJ5dGVzCisgICAqICAgZGVsdGEgICAgICAgNCAgICAgICAgICAgU0hPUlQgICAgICAgICAgIHNlZSBiZWxvdworICAgKiAgIG9mZnNldCAgICAgIDYgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBzZWUgYmVsb3cKKyAgICoKKyAgICogQSBzdWItaGVhZGVyIGRlZmluZXMsIGZvciBlYWNoIGhpZ2ggYnl0ZSwgdGhlIHJhbmdlIG9mIHZhbGlkCisgICAqIGxvdyBieXRlcyB3aXRoaW4gdGhlIGNoYXJtYXAuICBOb3RlIHRoYXQgdGhlIHJhbmdlIGRlZmluZWQgYnkgYGZpcnN0JworICAgKiBhbmQgYGNvdW50JyBtdXN0IGJlIGNvbXBsZXRlbHkgaW5jbHVkZWQgaW4gdGhlIGludGVydmFsIFswLi4yNTVdCisgICAqIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4KKyAgICoKKyAgICogSWYgYSBjaGFyYWN0ZXIgY29kZSBpcyBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gc3ViLWhlYWRlciwgdGhlbgorICAgKiBtYXBwaW5nIGl0IHRvIGEgZ2x5cGggaW5kZXggaXMgZG9uZSBhcyBmb2xsb3dzLgorICAgKgorICAgKiAtIFRoZSB2YWx1ZSBvZiBgb2Zmc2V0JyBpcyByZWFkLiAgVGhpcyBpcyBhIF9ieXRlXyBkaXN0YW5jZSBmcm9tIHRoZQorICAgKiAgIGxvY2F0aW9uIG9mIHRoZSBgb2Zmc2V0JyBmaWVsZCBpdHNlbGYgaW50byBhIHNsaWNlIG9mIHRoZQorICAgKiAgIGBnbHlwaF9pZHMnIHRhYmxlLiAgTGV0J3MgY2FsbCBpdCBgc2xpY2UnIChpdCBpcyBhIFVTSE9SVFtdLCB0b28pLgorICAgKgorICAgKiAtIFRoZSB2YWx1ZSBgc2xpY2VbY2hhci5sbyAtIGZpcnN0XScgaXMgcmVhZC4gIElmIGl0IGlzIDAsIHRoZXJlIGlzCisgICAqICAgbm8gZ2x5cGggZm9yIHRoZSBjaGFyY29kZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBkZWx0YScgaXMKKyAgICogICBhZGRlZCB0byBpdCAobW9kdWxvIDY1NTM2KSB0byBmb3JtIGEgbmV3IGdseXBoIGluZGV4LgorICAgKgorICAgKiBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdGlvbiByb3V0aW5lIHRvIGNoZWNrIHRoYXQgYWxsIG9mZnNldHMgZmFsbAorICAgKiB3aXRoaW4gdGhlIGdseXBoIElEcyB0YWJsZSAoYW5kIG5vdCB3aXRoaW4gdGhlIGBzdWJzJyB0YWJsZSBpdHNlbGYgb3IKKyAgICogb3V0c2lkZSBvZiB0aGUgQ01hcCkuCisgICAqLwogCiAjaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzIKIApAQCAtNjI2LDY4ICs2MjQsNjggQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgbXVzdCBiZSA0ICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIHRhYmxlIGxlbmd0aCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBieXRlcyAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc2VnQ291bnRYMiAgICA2ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICAyKk5VTV9TRUdTICAgICAgICAgICAqLwotICAvKiAgIHNlYXJjaFJhbmdlICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMiooMSA8PCBMT0dfU0VHUykgICAgKi8KLSAgLyogICBlbnRyeVNlbGVjdG9yIDEwICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIExPR19TRUdTICAgICAgICAgICAgICovCi0gIC8qICAgcmFuZ2VTaGlmdCAgICAxMiAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBzZWdDb3VudFgyIC0gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSYW5nZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kQ291bnQgICAgICAxNCAgICAgICAgICAgICBVU0hPUlRbTlVNX1NFR1NdICBlbmQgY2hhcmNvZGUgZm9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50OyBsYXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIDB4RkZGRiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHBhZCAgICAgICAgICAgMTQrTlVNX1NFR1MqMiAgVVNIT1JUICAgICAgICAgICAgcGFkZGluZyAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRDb3VudCAgICAxNitOVU1fU0VHUyoyICBVU0hPUlRbTlVNX1NFR1NdICBmaXJzdCBjaGFyY29kZSBmb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgaWREZWx0YSAgICAgICAxNitOVU1fU0VHUyo0ICBTSE9SVFtOVU1fU0VHU10gICBkZWx0YSBmb3IgZWFjaCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCAgICAgICAgICAgICAgKi8KLSAgLyogICBpZE9mZnNldCAgICAgIDE2K05VTV9TRUdTKjYgIFNIT1JUW05VTV9TRUdTXSAgIHJhbmdlIG9mZnNldCBmb3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlZ21lbnQ7IGNhbiBiZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhJZHMgICAgICAxNitOVU1fU0VHUyo4ICBVU0hPUlRbXSAgICAgICAgICBhcnJheSBvZiBnbHlwaCBJRCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENoYXJhY3RlciBjb2RlcyBhcmUgbW9kZWxsZWQgYnkgYSBzZXJpZXMgb2Ygb3JkZXJlZCAoaW5jcmVhc2luZykgICAgICAqLwotICAvKiBpbnRlcnZhbHMgY2FsbGVkIHNlZ21lbnRzLiAgRWFjaCBzZWdtZW50IGhhcyBzdGFydCBhbmQgZW5kIGNvZGVzLCAgICAgKi8KLSAgLyogcHJvdmlkZWQgYnkgdGhlIGBzdGFydENvdW50JyBhbmQgYGVuZENvdW50JyBhcnJheXMuICBTZWdtZW50cyBtdXN0ICAgICovCi0gIC8qIG5vdCBvdmVybGFwLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gdGhlIHZhbHVlICAgICAqLwotICAvKiAweEZGRkYgZm9yIGBlbmRDb3VudCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmaWVsZHMgYHNlYXJjaFJhbmdlJywgYGVudHJ5U2VsZWN0b3InIGFuZCBgcmFuZ2VTaGlmdCcgYXJlIGJldHRlciAqLwotICAvKiBpZ25vcmVkICh0aGV5IGFyZSB0cmFjZXMgb2Ygb3Zlci1lbmdpbmVlcmluZyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgICAgKi8KLSAgLyogc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIHNlZ21lbnQgYWxzbyBoYXMgYSBzaWduZWQgYGRlbHRhJywgYXMgd2VsbCBhcyBhbiBvcHRpb25hbCBvZmZzZXQgKi8KLSAgLyogd2l0aGluIHRoZSBgZ2x5cGhJZHMnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiBhIHNlZ21lbnQncyBpZE9mZnNldCBpcyAwLCB0aGUgZ2x5cGggaW5kZXggY29ycmVzcG9uZGluZyB0byBhbnkgICAgKi8KLSAgLyogY2hhcmNvZGUgd2l0aGluIHRoZSBzZWdtZW50IGlzIG9idGFpbmVkIGJ5IGFkZGluZyB0aGUgdmFsdWUgb2YgICAgICAgICovCi0gIC8qIGBpZERlbHRhJyBkaXJlY3RseSB0byB0aGUgY2hhcmNvZGUsIG1vZHVsbyA2NTUzNi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3RoZXJ3aXNlLCBhIGdseXBoIGluZGV4IGlzIHRha2VuIGZyb20gdGhlIGdseXBoIElEcyBzdWItYXJyYXkgZm9yICAgICovCi0gIC8qIHRoZSBzZWdtZW50LCBhbmQgdGhlIHZhbHVlIG9mIGBpZERlbHRhJyBpcyBhZGRlZCB0byBpdC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZpbmFsbHksIG5vdGUgdGhhdCBhIGxvdCBvZiBmb250cyBjb250YWluIGFuIGludmFsaWQgbGFzdCBzZWdtZW50LCAgICAqLwotICAvKiB3aGVyZSBgc3RhcnQnIGFuZCBgZW5kJyBhcmUgY29ycmVjdGx5IHNldCB0byAweEZGRkYgYnV0IGJvdGggYGRlbHRhJyAgKi8KLSAgLyogYW5kIGBvZmZzZXQnIGFyZSBpbmNvcnJlY3QgKGUuZy4sIGBvcGVuc19fXy50dGYnIHdoaWNoIGNvbWVzIHdpdGggICAgICovCi0gIC8qIE9wZW5PZmZpY2Uub3JnKS4gIFdlIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGRlYWwgd2l0aCB0aGVtIGNvcnJlY3RseS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRBQkxFIE9WRVJWSUVXCisgICAqIC0tLS0tLS0tLS0tLS0tCisgICAqCisgICAqICAgTkFNRSAgICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICAgICAgICBERVNDUklQVElPTgorICAgKgorICAgKiAgIGZvcm1hdCAgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgbXVzdCBiZSA0CisgICAqICAgbGVuZ3RoICAgICAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICB0YWJsZSBsZW5ndGgKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGJ5dGVzCisgICAqICAgbGFuZ3VhZ2UgICAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZQorICAgKgorICAgKiAgIHNlZ0NvdW50WDIgICAgNiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMipOVU1fU0VHUworICAgKiAgIHNlYXJjaFJhbmdlICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMiooMSA8PCBMT0dfU0VHUykKKyAgICogICBlbnRyeVNlbGVjdG9yIDEwICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIExPR19TRUdTCisgICAqICAgcmFuZ2VTaGlmdCAgICAxMiAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBzZWdDb3VudFgyIC0KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmFuZ2UKKyAgICoKKyAgICogICBlbmRDb3VudCAgICAgIDE0ICAgICAgICAgICAgIFVTSE9SVFtOVU1fU0VHU10gIGVuZCBjaGFyY29kZSBmb3IKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VnbWVudDsgbGFzdAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgMHhGRkZGCisgICAqCisgICAqICAgcGFkICAgICAgICAgICAxNCtOVU1fU0VHUyoyICBVU0hPUlQgICAgICAgICAgICBwYWRkaW5nCisgICAqCisgICAqICAgc3RhcnRDb3VudCAgICAxNitOVU1fU0VHUyoyICBVU0hPUlRbTlVNX1NFR1NdICBmaXJzdCBjaGFyY29kZSBmb3IKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VnbWVudAorICAgKgorICAgKiAgIGlkRGVsdGEgICAgICAgMTYrTlVNX1NFR1MqNCAgU0hPUlRbTlVNX1NFR1NdICAgZGVsdGEgZm9yIGVhY2gKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQKKyAgICogICBpZE9mZnNldCAgICAgIDE2K05VTV9TRUdTKjYgIFNIT1JUW05VTV9TRUdTXSAgIHJhbmdlIG9mZnNldCBmb3IKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VnbWVudDsgY2FuIGJlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvCisgICAqCisgICAqICAgZ2x5cGhJZHMgICAgICAxNitOVU1fU0VHUyo4ICBVU0hPUlRbXSAgICAgICAgICBhcnJheSBvZiBnbHlwaCBJRAorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzCisgICAqCisgICAqIENoYXJhY3RlciBjb2RlcyBhcmUgbW9kZWxsZWQgYnkgYSBzZXJpZXMgb2Ygb3JkZXJlZCAoaW5jcmVhc2luZykKKyAgICogaW50ZXJ2YWxzIGNhbGxlZCBzZWdtZW50cy4gIEVhY2ggc2VnbWVudCBoYXMgc3RhcnQgYW5kIGVuZCBjb2RlcywKKyAgICogcHJvdmlkZWQgYnkgdGhlIGBzdGFydENvdW50JyBhbmQgYGVuZENvdW50JyBhcnJheXMuICBTZWdtZW50cyBtdXN0CisgICAqIG5vdCBvdmVybGFwLCBhbmQgdGhlIGxhc3Qgc2VnbWVudCBzaG91bGQgYWx3YXlzIGNvbnRhaW4gdGhlIHZhbHVlCisgICAqIDB4RkZGRiBmb3IgYGVuZENvdW50Jy4KKyAgICoKKyAgICogVGhlIGZpZWxkcyBgc2VhcmNoUmFuZ2UnLCBgZW50cnlTZWxlY3RvcicgYW5kIGByYW5nZVNoaWZ0JyBhcmUgYmV0dGVyCisgICAqIGlnbm9yZWQgKHRoZXkgYXJlIHRyYWNlcyBvZiBvdmVyLWVuZ2luZWVyaW5nIGluIHRoZSBUcnVlVHlwZQorICAgKiBzcGVjaWZpY2F0aW9uKS4KKyAgICoKKyAgICogRWFjaCBzZWdtZW50IGFsc28gaGFzIGEgc2lnbmVkIGBkZWx0YScsIGFzIHdlbGwgYXMgYW4gb3B0aW9uYWwgb2Zmc2V0CisgICAqIHdpdGhpbiB0aGUgYGdseXBoSWRzJyB0YWJsZS4KKyAgICoKKyAgICogSWYgYSBzZWdtZW50J3MgaWRPZmZzZXQgaXMgMCwgdGhlIGdseXBoIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gYW55CisgICAqIGNoYXJjb2RlIHdpdGhpbiB0aGUgc2VnbWVudCBpcyBvYnRhaW5lZCBieSBhZGRpbmcgdGhlIHZhbHVlIG9mCisgICAqIGBpZERlbHRhJyBkaXJlY3RseSB0byB0aGUgY2hhcmNvZGUsIG1vZHVsbyA2NTUzNi4KKyAgICoKKyAgICogT3RoZXJ3aXNlLCBhIGdseXBoIGluZGV4IGlzIHRha2VuIGZyb20gdGhlIGdseXBoIElEcyBzdWItYXJyYXkgZm9yCisgICAqIHRoZSBzZWdtZW50LCBhbmQgdGhlIHZhbHVlIG9mIGBpZERlbHRhJyBpcyBhZGRlZCB0byBpdC4KKyAgICoKKyAgICoKKyAgICogRmluYWxseSwgbm90ZSB0aGF0IGEgbG90IG9mIGZvbnRzIGNvbnRhaW4gYW4gaW52YWxpZCBsYXN0IHNlZ21lbnQsCisgICAqIHdoZXJlIGBzdGFydCcgYW5kIGBlbmQnIGFyZSBjb3JyZWN0bHkgc2V0IHRvIDB4RkZGRiBidXQgYm90aCBgZGVsdGEnCisgICAqIGFuZCBgb2Zmc2V0JyBhcmUgaW5jb3JyZWN0IChlLmcuLCBgb3BlbnNfX18udHRmJyB3aGljaCBjb21lcyB3aXRoCisgICAqIE9wZW5PZmZpY2Uub3JnKS4gIFdlIG5lZWQgc3BlY2lhbCBjb2RlIHRvIGRlYWwgd2l0aCB0aGVtIGNvcnJlY3RseS4KKyAgICovCiAKICNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAogCkBAIC0xNTczLDIzICsxNTcxLDIzIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgIFRZUEUgICAgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBtdXN0IGJlIDYgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAqLwotICAvKiAgIGxhbmd1YWdlICAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZmlyc3QgICAgICAgIDYgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgZmlyc3Qgc2VnbWVudCBjb2RlICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgICA4ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIHNlZ21lbnQgc2l6ZSBpbiBjaGFycyAgKi8KLSAgLyogICBnbHlwaElkcyAgICAgMTAgICAgICAgICAgICAgVVNIT1JUW2NvdW50XSAgICBnbHlwaCBJRHMgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHZlcnkgc2ltcGxpZmllZCBzZWdtZW50IG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUQUJMRSBPVkVSVklFVworICAgKiAtLS0tLS0tLS0tLS0tLQorICAgKgorICAgKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgICBUWVBFICAgICAgICAgICAgIERFU0NSSVBUSU9OCisgICAqCisgICAqICAgZm9ybWF0ICAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgbXVzdCBiZSA2CisgICAqICAgbGVuZ3RoICAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzCisgICAqICAgbGFuZ3VhZ2UgICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUKKyAgICoKKyAgICogICBmaXJzdCAgICAgICAgNiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBmaXJzdCBzZWdtZW50IGNvZGUKKyAgICogICBjb3VudCAgICAgICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBzZWdtZW50IHNpemUgaW4gY2hhcnMKKyAgICogICBnbHlwaElkcyAgICAgMTAgICAgICAgICAgICAgVVNIT1JUW2NvdW50XSAgICBnbHlwaCBJRHMKKyAgICoKKyAgICogQSB2ZXJ5IHNpbXBsaWZpZWQgc2VnbWVudCBtYXBwaW5nLgorICAgKi8KIAogI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF82CiAKQEAgLTE3NjgsMjYgKzE3NjYsMjYgQEAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgIG11c3QgYmUgOCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICAgICAgVUxPTkcgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgKi8KLSAgLyogICBpczMyICAgICAgICAxMiAgICAgICAgICAgICBCWVRFWzgxOTJdICAzMi1iaXRuZXNzIGJpdG1hcCAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgODIwNCAgICAgICAgICAgVUxPTkcgICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgICAgIFVMT05HICAgICAgIGZpcnN0IGNoYXJjb2RlICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgICAgICBVTE9ORyAgICAgICBsYXN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRJZCAgICAgOCAgICAgICAgICAgICAgVUxPTkcgICAgICAgc3RhcnQgZ2x5cGggSUQgZm9yIHRoZSBncm91cCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRBQkxFIE9WRVJWSUVXCisgICAqIC0tLS0tLS0tLS0tLS0tCisgICAqCisgICAqICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICAgICAgVFlQRSAgICAgICAgREVTQ1JJUFRJT04KKyAgICoKKyAgICogICBmb3JtYXQgICAgICAwICAgICAgICAgICAgICBVU0hPUlQgICAgICBtdXN0IGJlIDgKKyAgICogICByZXNlcnZlZCAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICByZXNlcnZlZAorICAgKiAgIGxlbmd0aCAgICAgIDQgICAgICAgICAgICAgIFVMT05HICAgICAgIGxlbmd0aCBpbiBieXRlcworICAgKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlCisgICAqICAgaXMzMiAgICAgICAgMTIgICAgICAgICAgICAgQllURVs4MTkyXSAgMzItYml0bmVzcyBiaXRtYXAKKyAgICogICBjb3VudCAgICAgICA4MjA0ICAgICAgICAgICBVTE9ORyAgICAgICBudW1iZXIgb2YgZ3JvdXBzCisgICAqCisgICAqIFRoaXMgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGBjb3VudCcgZ3JvdXBzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICAgKgorICAgKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgICAgIFVMT05HICAgICAgIGZpcnN0IGNoYXJjb2RlCisgICAqICAgZW5kICAgICAgICAgNCAgICAgICAgICAgICAgVUxPTkcgICAgICAgbGFzdCBjaGFyY29kZQorICAgKiAgIHN0YXJ0SWQgICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIHN0YXJ0IGdseXBoIElEIGZvciB0aGUgZ3JvdXAKKyAgICovCiAKICNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfOAogCkBAIC0yMDM3LDIyICsyMDM1LDIyIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgIE9GRlNFVCAgVFlQRSAgICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgIDAgICAgICBVU0hPUlQgICAgICAgICAgICAgbXVzdCBiZSAxMCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAyICAgICAgVVNIT1JUICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgNCAgICAgIFVMT05HICAgICAgICAgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgIDggICAgICBVTE9ORyAgICAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAxMiAgICAgIFVMT05HICAgICAgICAgICAgICBmaXJzdCBjaGFyIGluIHJhbmdlICAgICAgICAgICAgKi8KLSAgLyogICBjb3VudCAgICAgMTYgICAgICBVTE9ORyAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJzIGluIHJhbmdlICAgICAgICovCi0gIC8qICAgZ2x5cGhJZHMgIDIwICAgICAgVVNIT1JUW2NvdW50XSAgICAgIGdseXBoIGluZGljZXMgY292ZXJlZCAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRBQkxFIE9WRVJWSUVXCisgICAqIC0tLS0tLS0tLS0tLS0tCisgICAqCisgICAqICAgTkFNRSAgICAgIE9GRlNFVCAgVFlQRSAgICAgICAgICAgICAgIERFU0NSSVBUSU9OCisgICAqCisgICAqICAgZm9ybWF0ICAgICAwICAgICAgVVNIT1JUICAgICAgICAgICAgIG11c3QgYmUgMTAKKyAgICogICByZXNlcnZlZCAgIDIgICAgICBVU0hPUlQgICAgICAgICAgICAgcmVzZXJ2ZWQKKyAgICogICBsZW5ndGggICAgIDQgICAgICBVTE9ORyAgICAgICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzCisgICAqICAgbGFuZ3VhZ2UgICA4ICAgICAgVUxPTkcgICAgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlCisgICAqCisgICAqICAgc3RhcnQgICAgIDEyICAgICAgVUxPTkcgICAgICAgICAgICAgIGZpcnN0IGNoYXIgaW4gcmFuZ2UKKyAgICogICBjb3VudCAgICAgMTYgICAgICBVTE9ORyAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJzIGluIHJhbmdlCisgICAqICAgZ2x5cGhJZHMgIDIwICAgICAgVVNIT1JUW2NvdW50XSAgICAgIGdseXBoIGluZGljZXMgY292ZXJlZAorICAgKi8KIAogI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAogCkBAIC0yMjA5LDI2ICsyMjA3LDI2IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICBUWVBFICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgIFVTSE9SVCAgICAgbXVzdCBiZSAxMiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDQgICAgICAgICAgVUxPTkcgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA4ICAgICAgICAgIFVMT05HICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgMTIgICAgICAgICBVTE9ORyAgICAgIG51bWJlciBvZiBncm91cHMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGBjb3VudCcgZ3JvdXBzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgICAwICAgICAgICAgIFVMT05HICAgICAgZmlyc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0SWQgICAgIDggICAgICAgICAgVUxPTkcgICAgICBzdGFydCBnbHlwaCBJRCBmb3IgdGhlIGdyb3VwICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUQUJMRSBPVkVSVklFVworICAgKiAtLS0tLS0tLS0tLS0tLQorICAgKgorICAgKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgVFlQRSAgICAgICBERVNDUklQVElPTgorICAgKgorICAgKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgVVNIT1JUICAgICBtdXN0IGJlIDEyCisgICAqICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkCisgICAqICAgbGVuZ3RoICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxlbmd0aCBpbiBieXRlcworICAgKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgVUxPTkcgICAgICBNYWMgbGFuZ3VhZ2UgY29kZQorICAgKiAgIGNvdW50ICAgICAgIDEyICAgICAgICAgVUxPTkcgICAgICBudW1iZXIgb2YgZ3JvdXBzCisgICAqICAgICAgICAgICAgICAgMTYKKyAgICoKKyAgICogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAqCisgICAqICAgc3RhcnQgICAgICAgMCAgICAgICAgICBVTE9ORyAgICAgIGZpcnN0IGNoYXJjb2RlCisgICAqICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUKKyAgICogICBzdGFydElkICAgICA4ICAgICAgICAgIFVMT05HICAgICAgc3RhcnQgZ2x5cGggSUQgZm9yIHRoZSBncm91cAorICAgKi8KIAogI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMgogCkBAIC0yMzY5LDEwICsyMzY3LDcgQEAKICAgICAgICAgLyogaWYgYGdpbmRleCcgaXMgaW52YWxpZCwgdGhlIHJlbWFpbmluZyB2YWx1ZXMgKi8KICAgICAgICAgLyogaW4gdGhpcyBncm91cCBhcmUgaW52YWxpZCwgdG9vICAgICAgICAgICAgICAgKi8KICAgICAgICAgaWYgKCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCi0gICAgICAgIHsKLSAgICAgICAgICBnaW5kZXggPSAwOwogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CiAKICAgICAgICAgY21hcC0+Y3VyX2NoYXJjb2RlID0gY2hhcl9jb2RlOwogICAgICAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSBnaW5kZXg7CkBAIC0yNTY1LDI2ICsyNTYwLDI2IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICBUWVBFICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgIFVTSE9SVCAgICAgbXVzdCBiZSAxMyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDQgICAgICAgICAgVUxPTkcgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA4ICAgICAgICAgIFVMT05HICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgMTIgICAgICAgICBVTE9ORyAgICAgIG51bWJlciBvZiBncm91cHMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGBjb3VudCcgZ3JvdXBzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgICAwICAgICAgICAgIFVMT05HICAgICAgZmlyc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGdseXBoSWQgICAgIDggICAgICAgICAgVUxPTkcgICAgICBnbHlwaCBJRCBmb3IgdGhlIHdob2xlIGdyb3VwICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUQUJMRSBPVkVSVklFVworICAgKiAtLS0tLS0tLS0tLS0tLQorICAgKgorICAgKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgVFlQRSAgICAgICBERVNDUklQVElPTgorICAgKgorICAgKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgVVNIT1JUICAgICBtdXN0IGJlIDEzCisgICAqICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkCisgICAqICAgbGVuZ3RoICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxlbmd0aCBpbiBieXRlcworICAgKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgVUxPTkcgICAgICBNYWMgbGFuZ3VhZ2UgY29kZQorICAgKiAgIGNvdW50ICAgICAgIDEyICAgICAgICAgVUxPTkcgICAgICBudW1iZXIgb2YgZ3JvdXBzCisgICAqICAgICAgICAgICAgICAgMTYKKyAgICoKKyAgICogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICAqCisgICAqICAgc3RhcnQgICAgICAgMCAgICAgICAgICBVTE9ORyAgICAgIGZpcnN0IGNoYXJjb2RlCisgICAqICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUKKyAgICogICBnbHlwaElkICAgICA4ICAgICAgICAgIFVMT05HICAgICAgZ2x5cGggSUQgZm9yIHRoZSB3aG9sZSBncm91cAorICAgKi8KIAogI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMwogCkBAIC0yODkxLDU4ICsyODg2LDU5IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgIE9GRlNFVCAgVFlQRSAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAgICAwICAgICBVU0hPUlQgIG11c3QgYmUgMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgICAgMiAgICAgVUxPTkcgICB0YWJsZSBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG51bVNlbGVjdG9yICAgIDYgICAgIFVMT05HICAgbnVtYmVyIG9mIHZhcmlhdGlvbiBzZWwuIHJlY29yZHMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvbGxvd2VkIGJ5IG51bVNlbGVjdG9yIHJlY29yZHMsIGVhY2ggb2Ygd2hpY2ggbG9va3MgbGlrZSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB2YXJTZWxlY3RvciAgICAwICAgICBVSU5UMjQgIFVuaWNvZGUgY29kZXBvaW50IG9mIHNlbC4gICAgICAgICAgICAgICovCi0gIC8qICAgZGVmYXVsdE9mZiAgICAgMyAgICAgVUxPTkcgICBvZmZzZXQgdG8gYSBkZWZhdWx0IFVWUyB0YWJsZSAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmluZyBhbnkgdmFyaWFudHMgdG8gYmUgZm91bmQgaW4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub3JtYWwgVW5pY29kZSBzdWJ0YWJsZS4gICAgICAgICAgICovCi0gIC8qICAgbm9uRGVmT2ZmICAgICAgNyAgICAgVUxPTkcgICBvZmZzZXQgdG8gYSBub24tZGVmYXVsdCBVVlMgdGFibGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmluZyBhbnkgdmFyaWFudHMgbm90IGluIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIGNtYXAsIHdpdGggR0lEcyBoZXJlICAgICAgICAgICovCi0gIC8qIChlaXRoZXIgb2Zmc2V0IG1heSBiZSAwIE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VsZWN0b3JzIGFyZSBzb3J0ZWQgYnkgY29kZSBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIGRlZmF1bHQgVW5pY29kZSBWYXJpYXRpb24gU2VsZWN0b3IgKFVWUykgc3VidGFibGUgaXMganVzdCBhIGxpc3Qgb2YgKi8KLSAgLyogcmFuZ2VzIG9mIGNvZGUgcG9pbnRzIHdoaWNoIGFyZSB0byBiZSBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgY21hcC4gIE5vICovCi0gIC8qIGdseXBoIElEcyAoR0lEcykgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1SYW5nZXMgICAgICAwICAgICBVTE9ORyAgIG51bWJlciBvZiByYW5nZXMgZm9sbG93aW5nICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHJhbmdlIGxvb2tzIGxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdW5pU3RhcnQgICAgICAgMCAgICAgVUlOVDI0ICBjb2RlIHBvaW50IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBhZGRpdGlvbmFsQ250ICAzICAgICBVQllURSAgIGNvdW50IG9mIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBpbiB0aGlzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAoemVybyBtZWFucyBhIHJhbmdlIG9mIGEgc2luZ2xlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJhbmdlcyBhcmUgc29ydGVkIGJ5IGB1bmlTdGFydCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBub24tZGVmYXVsdCBVbmljb2RlIFZhcmlhdGlvbiBTZWxlY3RvciAoVVZTKSBzdWJ0YWJsZSBpcyBhIGxpc3Qgb2YgICovCi0gIC8qIG1hcHBpbmdzIGZyb20gY29kZXBvaW50IHRvIEdJRC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1NYXBwaW5ncyAgICAwICAgICBVTE9ORyAgIG51bWJlciBvZiBtYXBwaW5ncyAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHJhbmdlIGxvb2tzIGxpa2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdW5pU3RhcnQgICAgICAgMCAgICAgVUlOVDI0ICBjb2RlIHBvaW50IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyByYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBHSUQgICAgICAgICAgICAzICAgICBVU0hPUlQgIGFuZCBpdHMgR0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSYW5nZXMgYXJlIHNvcnRlZCBieSBgdW5pU3RhcnQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRBQkxFIE9WRVJWSUVXCisgICAqIC0tLS0tLS0tLS0tLS0tCisgICAqCisgICAqICAgTkFNRSAgICAgICAgIE9GRlNFVCAgVFlQRSAgICBERVNDUklQVElPTgorICAgKgorICAgKiAgIGZvcm1hdCAgICAgICAgIDAgICAgIFVTSE9SVCAgbXVzdCBiZSAxNAorICAgKiAgIGxlbmd0aCAgICAgICAgIDIgICAgIFVMT05HICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzCisgICAqICAgbnVtU2VsZWN0b3IgICAgNiAgICAgVUxPTkcgICBudW1iZXIgb2YgdmFyaWF0aW9uIHNlbC4gcmVjb3JkcworICAgKgorICAgKiBGb2xsb3dlZCBieSBudW1TZWxlY3RvciByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGxvb2tzIGxpa2UKKyAgICoKKyAgICogICB2YXJTZWxlY3RvciAgICAwICAgICBVSU5UMjQgIFVuaWNvZGUgY29kZXBvaW50IG9mIHNlbC4KKyAgICogICBkZWZhdWx0T2ZmICAgICAzICAgICBVTE9ORyAgIG9mZnNldCB0byBhIGRlZmF1bHQgVVZTIHRhYmxlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliaW5nIGFueSB2YXJpYW50cyB0byBiZSBmb3VuZCBpbgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vcm1hbCBVbmljb2RlIHN1YnRhYmxlLgorICAgKiAgIG5vbkRlZk9mZiAgICAgIDcgICAgIFVMT05HICAgb2Zmc2V0IHRvIGEgbm9uLWRlZmF1bHQgVVZTIHRhYmxlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmliaW5nIGFueSB2YXJpYW50cyBub3QgaW4gdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBjbWFwLCB3aXRoIEdJRHMgaGVyZQorICAgKiAoZWl0aGVyIG9mZnNldCBtYXkgYmUgMCBOVUxMKQorICAgKgorICAgKiBTZWxlY3RvcnMgYXJlIHNvcnRlZCBieSBjb2RlIHBvaW50LgorICAgKgorICAgKiBBIGRlZmF1bHQgVW5pY29kZSBWYXJpYXRpb24gU2VsZWN0b3IgKFVWUykgc3VidGFibGUgaXMganVzdCBhIGxpc3Qgb2YKKyAgICogcmFuZ2VzIG9mIGNvZGUgcG9pbnRzIHdoaWNoIGFyZSB0byBiZSBmb3VuZCBpbiB0aGUgc3RhbmRhcmQgY21hcC4gIE5vCisgICAqIGdseXBoIElEcyAoR0lEcykgaGVyZS4KKyAgICoKKyAgICogICBudW1SYW5nZXMgICAgICAwICAgICBVTE9ORyAgIG51bWJlciBvZiByYW5nZXMgZm9sbG93aW5nCisgICAqCisgICAqIEEgcmFuZ2UgbG9va3MgbGlrZQorICAgKgorICAgKiAgIHVuaVN0YXJ0ICAgICAgIDAgICAgIFVJTlQyNCAgY29kZSBwb2ludCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHJhbmdlCisgICAqICAgYWRkaXRpb25hbENudCAgMyAgICAgVUJZVEUgICBjb3VudCBvZiBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4gdGhpcworICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKHplcm8gbWVhbnMgYSByYW5nZSBvZiBhIHNpbmdsZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyKQorICAgKgorICAgKiBSYW5nZXMgYXJlIHNvcnRlZCBieSBgdW5pU3RhcnQnLgorICAgKgorICAgKiBBIG5vbi1kZWZhdWx0IFVuaWNvZGUgVmFyaWF0aW9uIFNlbGVjdG9yIChVVlMpIHN1YnRhYmxlIGlzIGEgbGlzdCBvZgorICAgKiBtYXBwaW5ncyBmcm9tIGNvZGVwb2ludCB0byBHSUQuCisgICAqCisgICAqICAgbnVtTWFwcGluZ3MgICAgMCAgICAgVUxPTkcgICBudW1iZXIgb2YgbWFwcGluZ3MKKyAgICoKKyAgICogQSByYW5nZSBsb29rcyBsaWtlCisgICAqCisgICAqICAgdW5pU3RhcnQgICAgICAgMCAgICAgVUlOVDI0ICBjb2RlIHBvaW50IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4KKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmFuZ2UKKyAgICogICBHSUQgICAgICAgICAgICAzICAgICBVU0hPUlQgIGFuZCBpdHMgR0lECisgICAqCisgICAqIFJhbmdlcyBhcmUgc29ydGVkIGJ5IGB1bmlTdGFydCcuCisgICAqLwogCiAjaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzE0CiAKQEAgLTM2NjEsNyArMzY1Nyw3IEBACiAgIHR0X2dldF9nbHlwaF9uYW1lKCBUVF9GYWNlICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaWR4ICkKICAgewotICAgIEZUX1N0cmluZyogIFBTbmFtZTsKKyAgICBGVF9TdHJpbmcqICBQU25hbWUgPSBOVUxMOwogCiAKICAgICB0dF9mYWNlX2dldF9wc19uYW1lKCBmYWNlLCBpZHgsICZQU25hbWUgKTsKQEAgLTM2ODEsNiArMzY3Nyw5IEBACiAgICAgRlRfVU5VU0VEKCBwb2ludGVyICk7CiAKIAorICAgIGlmICggIXBzbmFtZXMtPnVuaWNvZGVzX2luaXQgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKKwogICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19pbml0KCBtZW1vcnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290Lm51bV9nbHlwaHMsCkBAIC0zNzQ5LDcwICszNzQ4LDE1IEBACiAKICNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KIAotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwogCiAgIHN0YXRpYyBjb25zdCBUVF9DTWFwX0NsYXNzICB0dF9jbWFwX2NsYXNzZXNbXSA9CiAgIHsKKyN1bmRlZiAgVFRDTUFQQ0lURU0KICNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSAgJmEsCiAjaW5jbHVkZSAidHRjbWFwYy5oIgogICAgIE5VTEwsCiAgIH07CiAKLSNlbHNlIC8qRlRfQ09ORklHX09QVElPTl9QSUMqLwotCi0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyogIGNsYXp6ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGNsYXp6ICkKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKQotICB7Ci0gICAgVFRfQ01hcF9DbGFzcyogICAgIGNsYXp6ICA9IE5VTEw7Ci0gICAgVFRfQ01hcF9DbGFzc1JlYyogIHJlY3M7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpbnQgIGkgPSAwOwotCi0KLSNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSBpKys7Ci0jaW5jbHVkZSAidHRjbWFwYy5oIgotCi0gICAgLyogYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBib3RoIHRoZSBwb2ludGVycyAqLwotICAgIC8qIHBsdXMgdGVybWluYXRvciBhbmQgdGhlIGNsYXNzIGluc3RhbmNlcyAgICAgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBUVF9DTWFwX0NsYXNzUmVjICkgKiBpICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBpbnN0YW5jZXMgZm9sbG93cyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgKi8KLSAgICByZWNzID0gKFRUX0NNYXBfQ2xhc3NSZWMqKSggKGNoYXIqKWNsYXp6ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKTsKLSAgICBpICAgID0gMDsKLQotI3VuZGVmIFRUQ01BUENJVEVNCi0jZGVmaW5lICBUVENNQVBDSVRFTSggYSApICAgICAgICAgICAgIFwKLSAgICBGVF9Jbml0X0NsYXNzXyAjIyBhKCAmcmVjc1tpXSApOyAgXAotICAgIGNsYXp6W2ldID0gJnJlY3NbaV07ICAgICAgICAgICAgICBcCi0gICAgaSsrOwotI2luY2x1ZGUgInR0Y21hcGMuaCIKLQotICAgIGNsYXp6W2ldID0gTlVMTDsKLQotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKkZUX0NPTkZJR19PUFRJT05fUElDKi8KLQogCiAgIC8qIHBhcnNlIHRoZSBgY21hcCcgdGFibGUgYW5kIGJ1aWxkIHRoZSBjb3JyZXNwb25kaW5nIFRUX0NNYXAgb2JqZWN0cyAqLwogICAvKiBpbiB0aGUgY3VycmVudCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM4MjAsMjkgKzM3NjQsMzMgQEAKICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfYnVpbGRfY21hcHMoIFRUX0ZhY2UgIGZhY2UgKQogICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIHRhYmxlID0gZmFjZS0+Y21hcF90YWJsZTsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgbGltaXQgPSB0YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKKyAgICBGVF9CeXRlKiBjb25zdCAgICAgdGFibGUgICA9IGZhY2UtPmNtYXBfdGFibGU7CisgICAgRlRfQnl0ZSogICAgICAgICAgIGxpbWl0OwogICAgIEZUX1VJbnQgdm9sYXRpbGUgICBudW1fY21hcHM7Ci0gICAgRlRfQnl0ZSogdm9sYXRpbGUgIHAgICAgID0gdGFibGU7CisgICAgRlRfQnl0ZSogdm9sYXRpbGUgIHAgICAgICAgPSB0YWJsZTsKICAgICBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwogCiAgICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7CiAKIAotICAgIGlmICggIXAgfHwgcCArIDQgPiBsaW1pdCApCisgICAgaWYgKCAhcCB8fCBmYWNlLT5jbWFwX3NpemUgPCA0ICkKICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwogCi0gICAgLyogb25seSByZWNvZ25pemUgZm9ybWF0IDAgKi8KLSAgICBpZiAoIFRUX05FWFRfVVNIT1JUKCBwICkgIT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidHRfZmFjZV9idWlsZF9jbWFwczoiCi0gICAgICAgICAgICAgICAgICIgdW5zdXBwb3J0ZWQgYGNtYXAnIHRhYmxlIGZvcm1hdCA9ICVkXG4iLAotICAgICAgICAgICAgICAgICBUVF9QRUVLX1VTSE9SVCggcCAtIDIgKSApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIH0KKyAgICAvKiBWZXJzaW9uIDEuOC4zIG9mIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgKi8KKyAgICAvKiAoaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvdHlwb2dyYXBoeS9vcGVudHlwZS9zcGVjL2NtYXApOiAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIFRoZSAnY21hcCcgdGFibGUgdmVyc2lvbiBudW1iZXIgcmVtYWlucyBhdCAweDAwMDAgZm9yIGZvbnRzIHRoYXQgKi8KKyAgICAvKiAgIG1ha2UgdXNlIG9mIHRoZSBuZXdlciBzdWJ0YWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBUaGlzIGVzc2VudGlhbGx5IG1lYW5zIHRoYXQgYSB2ZXJzaW9uIGZvcm1hdCB0ZXN0IGlzIHVzZWxlc3MuICAgICAgKi8KKworICAgIC8qIGlnbm9yZSBmb3JtYXQgKi8KKyAgICBwICs9IDI7CiAKICAgICBudW1fY21hcHMgPSBUVF9ORVhUX1VTSE9SVCggcCApOworICAgIEZUX1RSQUNFNCgoICJ0dF9mYWNlX2J1aWxkX2NtYXBzOiAlZCBjbWFwc1xuIiwgbnVtX2NtYXBzICkpOwogCisgICAgbGltaXQgPSB0YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKICAgICBmb3IgKCA7IG51bV9jbWFwcyA+IDAgJiYgcCArIDggPD0gbGltaXQ7IG51bV9jbWFwcy0tICkKICAgICB7CiAgICAgICBGVF9DaGFyTWFwUmVjICBjaGFybWFwOwpAQCAtMzg1OSw3ICszODA3LDcgQEAKICAgICAgIHsKICAgICAgICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICAgICAgIGNtYXAgICA9IHRhYmxlICsgb2Zmc2V0OwogICAgICAgICB2b2xhdGlsZSBGVF9VSW50ICAgICAgICAgICAgICAgZm9ybWF0ID0gVFRfUEVFS19VU0hPUlQoIGNtYXAgKTsKLSAgICAgICAgY29uc3QgVFRfQ01hcF9DbGFzcyogdm9sYXRpbGUgIHBjbGF6eiA9IFRUX0NNQVBfQ0xBU1NFU19HRVQ7CisgICAgICAgIGNvbnN0IFRUX0NNYXBfQ2xhc3MqIHZvbGF0aWxlICBwY2xhenogPSB0dF9jbWFwX2NsYXNzZXM7CiAgICAgICAgIFRUX0NNYXBfQ2xhc3Mgdm9sYXRpbGUgICAgICAgICBjbGF6ejsKIAogCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGNtYXAuaCBiL3NyYy9zZm50L3R0Y21hcC5oCmluZGV4IGQyNjRkOTkuLmM3ZDdjMjEgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3R0Y21hcC5oCisrKyBiL3NyYy9zZm50L3R0Y21hcC5oCkBAIC0xLDI5ICsxLDI4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGNtYXAuaAorICoKKyAqICAgVHJ1ZVR5cGUgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVENNQVBfSF8KICNkZWZpbmUgVFRDTUFQX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHZhbGlkLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGNtYXAuaD4KIAogRlRfQkVHSU5fSEVBREVSCiAKQEAgLTU2LDggKzU1LDYgQEAKICAgfSBUVF9DTWFwX0NsYXNzUmVjOwogCiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQogI2RlZmluZSBGVF9ERUZJTkVfVFRfQ01BUCggY2xhc3NfLCAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgXApAQCAtOTIsNDEgKzg5LDEwIEBACiAgICAgZ2V0X2NtYXBfaW5mb18gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfTsKIAotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KIAotI2RlZmluZSBGVF9ERUZJTkVfVFRfQ01BUCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2luZGV4XywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Y2hhcl9saXN0XywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY21hcF9pbmZvXyApICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIFRUX0NNYXBfQ2xhc3NSZWMqICBjbGF6eiApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouc2l6ZSAgICAgICAgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5pbml0ICAgICAgICAgICAgID0gaW5pdF87ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmRvbmUgICAgICAgICAgICAgPSBkb25lXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouY2hhcl9pbmRleCAgICAgICA9IGNoYXJfaW5kZXhfOyAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5jaGFyX25leHQgICAgICAgID0gY2hhcl9uZXh0XzsgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJfdmFyX2luZGV4ICAgPSBjaGFyX3Zhcl9pbmRleF87ICAgIFwKLSAgICBjbGF6ei0+Y2xhenouY2hhcl92YXJfZGVmYXVsdCA9IGNoYXJfdmFyX2RlZmF1bHRfOyAgXAotICAgIGNsYXp6LT5jbGF6ei52YXJpYW50X2xpc3QgICAgID0gdmFyaWFudF9saXN0XzsgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJ2YXJpYW50X2xpc3QgPSBjaGFydmFyaWFudF9saXN0XzsgIFwKLSAgICBjbGF6ei0+Y2xhenoudmFyaWFudGNoYXJfbGlzdCA9IHZhcmlhbnRjaGFyX2xpc3RfOyAgXAotICAgIGNsYXp6LT5mb3JtYXQgICAgICAgICAgICAgICAgID0gZm9ybWF0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnZhbGlkYXRlICAgICAgICAgICAgICAgPSB2YWxpZGF0ZV87ICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NtYXBfaW5mbyAgICAgICAgICA9IGdldF9jbWFwX2luZm9fOyAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLworI3VuZGVmICBUVENNQVBDSVRFTQorI2RlZmluZSBUVENNQVBDSVRFTSggYSApICBGVF9DQUxMQkFDS19UQUJMRSAgY29uc3QgVFRfQ01hcF9DbGFzc1JlYyAgYTsKKyNpbmNsdWRlICJ0dGNtYXBjLmgiCiAKIAogICB0eXBlZGVmIHN0cnVjdCAgVFRfVmFsaWRhdG9yUmVjXwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjbWFwYy5oIGIvc3JjL3NmbnQvdHRjbWFwYy5oCmluZGV4IDQ5ODBlOWQuLjJlNGNlNTAgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3R0Y21hcGMuaAorKysgYi9zcmMvc2ZudC90dGNtYXBjLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Y21hcGMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUVCBDTUFQIGNsYXNzZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0Y21hcGMuaAorICoKKyAqICAgVFQgQ01BUCBjbGFzc2VzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDIwIGJ5CisgKiBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzAKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0Y29sci5jIGIvc3JjL3NmbnQvdHRjb2xyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyNWUzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3R0Y29sci5jCkBAIC0wLDAgKzEsNDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0Y29sci5jCisgKgorICogICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgY29sb3JlZCBnbHlwaCBsYXllciBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBTaGFvIFl1IFpoYW5nIDxzaGFvemhhbmdAZmIuY29tPi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBgQ09MUicgdGFibGUgc3BlY2lmaWNhdGlvbjoKKyAgICoKKyAgICogICBodHRwczovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2NvbHIuaHRtCisgICAqCisgICAqLworCisKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGNvbG9yLmg+CisKKworI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTCisKKyNpbmNsdWRlICJ0dGNvbHIuaCIKKworCisgIC8qIE5PVEU6IFRoZXNlIGFyZSB0aGUgdGFibGUgc2l6ZXMgY2FsY3VsYXRlZCB0aHJvdWdoIHRoZSBzcGVjcy4gKi8KKyNkZWZpbmUgQkFTRV9HTFlQSF9TSVpFICAgICAgICAgICAgNlUKKyNkZWZpbmUgTEFZRVJfU0laRSAgICAgICAgICAgICAgICAgNFUKKyNkZWZpbmUgQ09MUl9IRUFERVJfU0laRSAgICAgICAgICAxNFUKKworCisgIHR5cGVkZWYgc3RydWN0IEJhc2VHbHlwaFJlY29yZF8KKyAgeworICAgIEZUX1VTaG9ydCAgZ2lkOworICAgIEZUX1VTaG9ydCAgZmlyc3RfbGF5ZXJfaW5kZXg7CisgICAgRlRfVVNob3J0ICBudW1fbGF5ZXJzOworCisgIH0gQmFzZUdseXBoUmVjb3JkOworCisKKyAgdHlwZWRlZiBzdHJ1Y3QgQ29scl8KKyAgeworICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsKKyAgICBGVF9VU2hvcnQgIG51bV9iYXNlX2dseXBoczsKKyAgICBGVF9VU2hvcnQgIG51bV9sYXllcnM7CisKKyAgICBGVF9CeXRlKiAgYmFzZV9nbHlwaHM7CisgICAgRlRfQnl0ZSogIGxheWVyczsKKworICAgIC8qIFRoZSBtZW1vcnkgd2hpY2ggYmFja3MgdXAgdGhlIGBDT0xSJyB0YWJsZS4gKi8KKyAgICB2b2lkKiAgICAgdGFibGU7CisgICAgRlRfVUxvbmcgIHRhYmxlX3NpemU7CisKKyAgfSBDb2xyOworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCisjdW5kZWYgIEZUX0NPTVBPTkVOVAorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0Y29scgorCisKKyAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCisgIHR0X2ZhY2VfbG9hZF9jb2xyKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCisgIHsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7CisKKyAgICBGVF9CeXRlKiAgdGFibGUgPSBOVUxMOworICAgIEZUX0J5dGUqICBwICAgICA9IE5VTEw7CisKKyAgICBDb2xyKiAgY29sciA9IE5VTEw7CisKKyAgICBGVF9VTG9uZyAgYmFzZV9nbHlwaF9vZmZzZXQsIGxheWVyX29mZnNldDsKKyAgICBGVF9VTG9uZyAgdGFibGVfc2l6ZTsKKworCisgICAgLyogYENPTFInIGFsd2F5cyBuZWVkcyBgQ1BBTCcgKi8KKyAgICBpZiAoICFmYWNlLT5jcGFsICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworCisgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX0NPTFIsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gTm9Db2xyOworCisgICAgaWYgKCB0YWJsZV9zaXplIDwgQ09MUl9IRUFERVJfU0laRSApCisgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfc2l6ZSwgdGFibGUgKSApCisgICAgICBnb3RvIE5vQ29scjsKKworICAgIHAgPSB0YWJsZTsKKworICAgIGlmICggRlRfTkVXKCBjb2xyICkgKQorICAgICAgZ290byBOb0NvbHI7CisKKyAgICBjb2xyLT52ZXJzaW9uID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKyAgICBpZiAoIGNvbHItPnZlcnNpb24gIT0gMCApCisgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgIGNvbHItPm51bV9iYXNlX2dseXBocyA9IEZUX05FWFRfVVNIT1JUKCBwICk7CisgICAgYmFzZV9nbHlwaF9vZmZzZXQgICAgID0gRlRfTkVYVF9VTE9ORyggcCApOworCisgICAgaWYgKCBiYXNlX2dseXBoX29mZnNldCA+PSB0YWJsZV9zaXplICkKKyAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworICAgIGlmICggY29sci0+bnVtX2Jhc2VfZ2x5cGhzICogQkFTRV9HTFlQSF9TSVpFID4KKyAgICAgICAgICAgdGFibGVfc2l6ZSAtIGJhc2VfZ2x5cGhfb2Zmc2V0ICkKKyAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworCisgICAgbGF5ZXJfb2Zmc2V0ICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKKyAgICBjb2xyLT5udW1fbGF5ZXJzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKworICAgIGlmICggbGF5ZXJfb2Zmc2V0ID49IHRhYmxlX3NpemUgKQorICAgICAgZ290byBJbnZhbGlkVGFibGU7CisgICAgaWYgKCBjb2xyLT5udW1fbGF5ZXJzICogTEFZRVJfU0laRSA+IHRhYmxlX3NpemUgLSBsYXllcl9vZmZzZXQgKQorICAgICAgZ290byBJbnZhbGlkVGFibGU7CisKKyAgICBjb2xyLT5iYXNlX2dseXBocyA9IChGVF9CeXRlKikoIHRhYmxlICsgYmFzZV9nbHlwaF9vZmZzZXQgKTsKKyAgICBjb2xyLT5sYXllcnMgICAgICA9IChGVF9CeXRlKikoIHRhYmxlICsgbGF5ZXJfb2Zmc2V0ICAgICAgKTsKKyAgICBjb2xyLT50YWJsZSAgICAgICA9IHRhYmxlOworICAgIGNvbHItPnRhYmxlX3NpemUgID0gdGFibGVfc2l6ZTsKKworICAgIGZhY2UtPmNvbHIgPSBjb2xyOworCisgICAgcmV0dXJuIEZUX0Vycl9PazsKKworICBJbnZhbGlkVGFibGU6CisgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgIE5vQ29scjoKKyAgICBGVF9GUkFNRV9SRUxFQVNFKCB0YWJsZSApOworICAgIEZUX0ZSRUUoIGNvbHIgKTsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgRlRfTE9DQUxfREVGKCB2b2lkICkKKyAgdHRfZmFjZV9mcmVlX2NvbHIoIFRUX0ZhY2UgIGZhY2UgKQorICB7CisgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OworCisgICAgQ29sciogIGNvbHIgPSAoQ29sciopZmFjZS0+Y29scjsKKworCisgICAgaWYgKCBjb2xyICkKKyAgICB7CisgICAgICBGVF9GUkFNRV9SRUxFQVNFKCBjb2xyLT50YWJsZSApOworICAgICAgRlRfRlJFRSggY29sciApOworICAgIH0KKyAgfQorCisKKyAgc3RhdGljIEZUX0Jvb2wKKyAgZmluZF9iYXNlX2dseXBoX3JlY29yZCggRlRfQnl0ZSogICAgICAgICAgYmFzZV9nbHlwaF9iZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICAgbnVtX2Jhc2VfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIGdseXBoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlR2x5cGhSZWNvcmQqICByZWNvcmQgKQorICB7CisgICAgRlRfSW50ICBtaW4gPSAwOworICAgIEZUX0ludCAgbWF4ID0gbnVtX2Jhc2VfZ2x5cGggLSAxOworCisKKyAgICB3aGlsZSAoIG1pbiA8PSBtYXggKQorICAgIHsKKyAgICAgIEZUX0ludCAgICBtaWQgPSBtaW4gKyAoIG1heCAtIG1pbiApIC8gMjsKKyAgICAgIEZUX0J5dGUqICBwICAgPSBiYXNlX2dseXBoX2JlZ2luICsgbWlkICogQkFTRV9HTFlQSF9TSVpFOworCisgICAgICBGVF9VU2hvcnQgIGdpZCA9IEZUX05FWFRfVVNIT1JUKCBwICk7CisKKworICAgICAgaWYgKCBnaWQgPCBnbHlwaF9pZCApCisgICAgICAgIG1pbiA9IG1pZCArIDE7CisgICAgICBlbHNlIGlmIChnaWQgPiBnbHlwaF9pZCApCisgICAgICAgIG1heCA9IG1pZCAtIDE7CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIHJlY29yZC0+Z2lkICAgICAgICAgICAgICAgPSBnaWQ7CisgICAgICAgIHJlY29yZC0+Zmlyc3RfbGF5ZXJfaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOworICAgICAgICByZWNvcmQtPm51bV9sYXllcnMgICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKKyAgdHRfZmFjZV9nZXRfY29scl9sYXllciggVFRfRmFjZSAgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICBiYXNlX2dseXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAqYWdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAqYWNvbG9yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MYXllckl0ZXJhdG9yKiAgaXRlcmF0b3IgKQorICB7CisgICAgQ29sciogICAgICAgICAgICBjb2xyID0gKENvbHIqKWZhY2UtPmNvbHI7CisgICAgQmFzZUdseXBoUmVjb3JkICBnbHlwaF9yZWNvcmQ7CisKKworICAgIGlmICggIWNvbHIgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoICFpdGVyYXRvci0+cCApCisgICAgeworICAgICAgRlRfVUxvbmcgIG9mZnNldDsKKworCisgICAgICAvKiBmaXJzdCBjYWxsIHRvIGZ1bmN0aW9uICovCisgICAgICBpdGVyYXRvci0+bGF5ZXIgPSAwOworCisgICAgICBpZiAoICFmaW5kX2Jhc2VfZ2x5cGhfcmVjb3JkKCBjb2xyLT5iYXNlX2dseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHItPm51bV9iYXNlX2dseXBocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZ2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhfcmVjb3JkICkgKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgaWYgKCBnbHlwaF9yZWNvcmQubnVtX2xheWVycyApCisgICAgICAgIGl0ZXJhdG9yLT5udW1fbGF5ZXJzID0gZ2x5cGhfcmVjb3JkLm51bV9sYXllcnM7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworCisgICAgICBvZmZzZXQgPSBMQVlFUl9TSVpFICogZ2x5cGhfcmVjb3JkLmZpcnN0X2xheWVyX2luZGV4OworICAgICAgaWYgKCBvZmZzZXQgKyBMQVlFUl9TSVpFICogZ2x5cGhfcmVjb3JkLm51bV9sYXllcnMgPiBjb2xyLT50YWJsZV9zaXplICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIGl0ZXJhdG9yLT5wID0gY29sci0+bGF5ZXJzICsgb2Zmc2V0OworICAgIH0KKworICAgIGlmICggaXRlcmF0b3ItPmxheWVyID49IGl0ZXJhdG9yLT5udW1fbGF5ZXJzICkKKyAgICAgIHJldHVybiAwOworCisgICAgKmFnbHlwaF9pbmRleCA9IEZUX05FWFRfVVNIT1JUKCBpdGVyYXRvci0+cCApOworICAgICphY29sb3JfaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggaXRlcmF0b3ItPnAgKTsKKworICAgIGlmICggKmFnbHlwaF9pbmRleCA+PSAoRlRfVUludCkoIEZUX0ZBQ0UoIGZhY2UgKS0+bnVtX2dseXBocyApICAgfHwKKyAgICAgICAgICggKmFjb2xvcl9pbmRleCAhPSAweEZGRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAqYWNvbG9yX2luZGV4ID49IGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZV9lbnRyaWVzICkgKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpdGVyYXRvci0+bGF5ZXIrKzsKKworICAgIHJldHVybiAxOworICB9CisKKworICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKKyAgdHRfZmFjZV9jb2xyX2JsZW5kX2xheWVyKCBUVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIGRzdFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzcmNTbG90ICkKKyAgeworICAgIEZUX0Vycm9yICBlcnJvcjsKKworICAgIEZUX1VJbnQgIHgsIHk7CisgICAgRlRfQnl0ZSAgYiwgZywgciwgYWxwaGE7CisKKyAgICBGVF9VTG9uZyAgc2l6ZTsKKyAgICBGVF9CeXRlKiAgc3JjOworICAgIEZUX0J5dGUqICBkc3Q7CisKKworICAgIGlmICggIWRzdFNsb3QtPmJpdG1hcC5idWZmZXIgKQorICAgIHsKKyAgICAgIC8qIEluaXRpYWxpemUgZGVzdGluYXRpb24gb2YgY29sb3IgYml0bWFwICovCisgICAgICAvKiB3aXRoIHRoZSBzaXplIG9mIGZpcnN0IGNvbXBvbmVudC4gICAgICAqLworICAgICAgZHN0U2xvdC0+Yml0bWFwX2xlZnQgPSBzcmNTbG90LT5iaXRtYXBfbGVmdDsKKyAgICAgIGRzdFNsb3QtPmJpdG1hcF90b3AgID0gc3JjU2xvdC0+Yml0bWFwX3RvcDsKKworICAgICAgZHN0U2xvdC0+Yml0bWFwLndpZHRoICAgICAgPSBzcmNTbG90LT5iaXRtYXAud2lkdGg7CisgICAgICBkc3RTbG90LT5iaXRtYXAucm93cyAgICAgICA9IHNyY1Nsb3QtPmJpdG1hcC5yb3dzOworICAgICAgZHN0U2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7CisgICAgICBkc3RTbG90LT5iaXRtYXAucGl0Y2ggICAgICA9IChpbnQpZHN0U2xvdC0+Yml0bWFwLndpZHRoICogNDsKKyAgICAgIGRzdFNsb3QtPmJpdG1hcC5udW1fZ3JheXMgID0gMjU2OworCisgICAgICBzaXplID0gZHN0U2xvdC0+Yml0bWFwLnJvd3MgKiAodW5zaWduZWQgaW50KWRzdFNsb3QtPmJpdG1hcC5waXRjaDsKKworICAgICAgZXJyb3IgPSBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBkc3RTbG90LCBzaXplICk7CisgICAgICBpZiAoIGVycm9yICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgICBGVF9NRU1fWkVSTyggZHN0U2xvdC0+Yml0bWFwLmJ1ZmZlciwgc2l6ZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgLyogUmVzaXplIGRlc3RpbmF0aW9uIGlmIG5lZWRlZCBzdWNoIHRoYXQgbmV3IGNvbXBvbmVudCBmaXRzLiAqLworICAgICAgRlRfSW50ICB4X21pbiwgeF9tYXgsIHlfbWluLCB5X21heDsKKworCisgICAgICB4X21pbiA9IEZUX01JTiggZHN0U2xvdC0+Yml0bWFwX2xlZnQsIHNyY1Nsb3QtPmJpdG1hcF9sZWZ0ICk7CisgICAgICB4X21heCA9IEZUX01BWCggZHN0U2xvdC0+Yml0bWFwX2xlZnQgKyAoRlRfSW50KWRzdFNsb3QtPmJpdG1hcC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBzcmNTbG90LT5iaXRtYXBfbGVmdCArIChGVF9JbnQpc3JjU2xvdC0+Yml0bWFwLndpZHRoICk7CisKKyAgICAgIHlfbWluID0gRlRfTUlOKCBkc3RTbG90LT5iaXRtYXBfdG9wIC0gKEZUX0ludClkc3RTbG90LT5iaXRtYXAucm93cywKKyAgICAgICAgICAgICAgICAgICAgICBzcmNTbG90LT5iaXRtYXBfdG9wIC0gKEZUX0ludClzcmNTbG90LT5iaXRtYXAucm93cyApOworICAgICAgeV9tYXggPSBGVF9NQVgoIGRzdFNsb3QtPmJpdG1hcF90b3AsIHNyY1Nsb3QtPmJpdG1hcF90b3AgKTsKKworICAgICAgaWYgKCB4X21pbiAhPSBkc3RTbG90LT5iaXRtYXBfbGVmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIHhfbWF4ICE9IGRzdFNsb3QtPmJpdG1hcF9sZWZ0ICsgKEZUX0ludClkc3RTbG90LT5iaXRtYXAud2lkdGggfHwKKyAgICAgICAgICAgeV9taW4gIT0gZHN0U2xvdC0+Yml0bWFwX3RvcCAtIChGVF9JbnQpZHN0U2xvdC0+Yml0bWFwLnJvd3MgICB8fAorICAgICAgICAgICB5X21heCAhPSBkc3RTbG90LT5iaXRtYXBfdG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKworICAgICAgICBGVF9VSW50ICB3aWR0aCA9IChGVF9VSW50KSggeF9tYXggLSB4X21pbiApOworICAgICAgICBGVF9VSW50ICByb3dzICA9IChGVF9VSW50KSggeV9tYXggLSB5X21pbiApOworICAgICAgICBGVF9VSW50ICBwaXRjaCA9IHdpZHRoICogNDsKKworICAgICAgICBGVF9CeXRlKiAgYnVmID0gTlVMTDsKKyAgICAgICAgRlRfQnl0ZSogIHA7CisgICAgICAgIEZUX0J5dGUqICBxOworCisKKyAgICAgICAgc2l6ZSAgPSByb3dzICogcGl0Y2g7CisgICAgICAgIGlmICggRlRfQUxMT0MoIGJ1Ziwgc2l6ZSApICkKKyAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgcCA9IGRzdFNsb3QtPmJpdG1hcC5idWZmZXI7CisgICAgICAgIHEgPSBidWYgKworICAgICAgICAgICAgKGludClwaXRjaCAqICggeV9tYXggLSBkc3RTbG90LT5iaXRtYXBfdG9wICkgKworICAgICAgICAgICAgNCAqICggZHN0U2xvdC0+Yml0bWFwX2xlZnQgLSB4X21pbiApOworCisgICAgICAgIGZvciAoIHkgPSAwOyB5IDwgZHN0U2xvdC0+Yml0bWFwLnJvd3M7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9NRU1fQ09QWSggcSwgcCwgZHN0U2xvdC0+Yml0bWFwLndpZHRoICogNCApOworCisgICAgICAgICAgcCArPSBkc3RTbG90LT5iaXRtYXAucGl0Y2g7CisgICAgICAgICAgcSArPSBwaXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwKCBkc3RTbG90LCBidWYgKTsKKworICAgICAgICBkc3RTbG90LT5iaXRtYXBfdG9wICA9IHlfbWF4OworICAgICAgICBkc3RTbG90LT5iaXRtYXBfbGVmdCA9IHhfbWluOworCisgICAgICAgIGRzdFNsb3QtPmJpdG1hcC53aWR0aCA9IHdpZHRoOworICAgICAgICBkc3RTbG90LT5iaXRtYXAucm93cyAgPSByb3dzOworICAgICAgICBkc3RTbG90LT5iaXRtYXAucGl0Y2ggPSAoaW50KXBpdGNoOworCisgICAgICAgIGRzdFNsb3QtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOworICAgICAgICBkc3RTbG90LT5mb3JtYXQgICAgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIGNvbG9yX2luZGV4ID09IDB4RkZGRiApCisgICAgeworICAgICAgaWYgKCBmYWNlLT5oYXZlX2ZvcmVncm91bmRfY29sb3IgKQorICAgICAgeworICAgICAgICBiICAgICA9IGZhY2UtPmZvcmVncm91bmRfY29sb3IuYmx1ZTsKKyAgICAgICAgZyAgICAgPSBmYWNlLT5mb3JlZ3JvdW5kX2NvbG9yLmdyZWVuOworICAgICAgICByICAgICA9IGZhY2UtPmZvcmVncm91bmRfY29sb3IucmVkOworICAgICAgICBhbHBoYSA9IGZhY2UtPmZvcmVncm91bmRfY29sb3IuYWxwaGE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggZmFjZS0+cGFsZXR0ZV9kYXRhLnBhbGV0dGVfZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgKCBmYWNlLT5wYWxldHRlX2RhdGEucGFsZXR0ZV9mbGFnc1tmYWNlLT5wYWxldHRlX2luZGV4XSAmCisgICAgICAgICAgICAgICAgIEZUX1BBTEVUVEVfRk9SX0RBUktfQkFDS0dST1VORCAgICAgICAgICAgICAgICAgICAgICApICkKKyAgICAgICAgeworICAgICAgICAgIC8qIHdoaXRlIG9wYXF1ZSAqLworICAgICAgICAgIGIgICAgID0gMHhGRjsKKyAgICAgICAgICBnICAgICA9IDB4RkY7CisgICAgICAgICAgciAgICAgPSAweEZGOworICAgICAgICAgIGFscGhhID0gMHhGRjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAvKiBibGFjayBvcGFxdWUgKi8KKyAgICAgICAgICBiICAgICA9IDB4MDA7CisgICAgICAgICAgZyAgICAgPSAweDAwOworICAgICAgICAgIHIgICAgID0gMHgwMDsKKyAgICAgICAgICBhbHBoYSA9IDB4RkY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGIgICAgID0gZmFjZS0+cGFsZXR0ZVtjb2xvcl9pbmRleF0uYmx1ZTsKKyAgICAgIGcgICAgID0gZmFjZS0+cGFsZXR0ZVtjb2xvcl9pbmRleF0uZ3JlZW47CisgICAgICByICAgICA9IGZhY2UtPnBhbGV0dGVbY29sb3JfaW5kZXhdLnJlZDsKKyAgICAgIGFscGhhID0gZmFjZS0+cGFsZXR0ZVtjb2xvcl9pbmRleF0uYWxwaGE7CisgICAgfQorCisgICAgLyogWFhYIENvbnZlcnQgaWYgc3JjU2xvdC5iaXRtYXAgaXMgbm90IGdyZXk/ICovCisgICAgc3JjID0gc3JjU2xvdC0+Yml0bWFwLmJ1ZmZlcjsKKyAgICBkc3QgPSBkc3RTbG90LT5iaXRtYXAuYnVmZmVyICsKKyAgICAgICAgICBkc3RTbG90LT5iaXRtYXAucGl0Y2ggKiAoIGRzdFNsb3QtPmJpdG1hcF90b3AgLSBzcmNTbG90LT5iaXRtYXBfdG9wICkgKworICAgICAgICAgIDQgKiAoIHNyY1Nsb3QtPmJpdG1hcF9sZWZ0IC0gZHN0U2xvdC0+Yml0bWFwX2xlZnQgKTsKKworICAgIGZvciAoIHkgPSAwOyB5IDwgc3JjU2xvdC0+Yml0bWFwLnJvd3M7IHkrKyApCisgICAgeworICAgICAgZm9yICggeCA9IDA7IHggPCBzcmNTbG90LT5iaXRtYXAud2lkdGg7IHgrKyApCisgICAgICB7CisgICAgICAgIGludCAgYWEgPSBzcmNbeF07CisgICAgICAgIGludCAgZmEgPSBhbHBoYSAqIGFhIC8gMjU1OworCisgICAgICAgIGludCAgZmIgPSBiICogZmEgLyAyNTU7CisgICAgICAgIGludCAgZmcgPSBnICogZmEgLyAyNTU7CisgICAgICAgIGludCAgZnIgPSByICogZmEgLyAyNTU7CisKKyAgICAgICAgaW50ICBiYTIgPSAyNTUgLSBmYTsKKworICAgICAgICBpbnQgIGJiID0gZHN0WzQgKiB4ICsgMF07CisgICAgICAgIGludCAgYmcgPSBkc3RbNCAqIHggKyAxXTsKKyAgICAgICAgaW50ICBiciA9IGRzdFs0ICogeCArIDJdOworICAgICAgICBpbnQgIGJhID0gZHN0WzQgKiB4ICsgM107CisKKworICAgICAgICBkc3RbNCAqIHggKyAwXSA9IChGVF9CeXRlKSggYmIgKiBiYTIgLyAyNTUgKyBmYiApOworICAgICAgICBkc3RbNCAqIHggKyAxXSA9IChGVF9CeXRlKSggYmcgKiBiYTIgLyAyNTUgKyBmZyApOworICAgICAgICBkc3RbNCAqIHggKyAyXSA9IChGVF9CeXRlKSggYnIgKiBiYTIgLyAyNTUgKyBmciApOworICAgICAgICBkc3RbNCAqIHggKyAzXSA9IChGVF9CeXRlKSggYmEgKiBiYTIgLyAyNTUgKyBmYSApOworICAgICAgfQorCisgICAgICBzcmMgKz0gc3JjU2xvdC0+Yml0bWFwLnBpdGNoOworICAgICAgZHN0ICs9IGRzdFNsb3QtPmJpdG1hcC5waXRjaDsKKyAgICB9CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKyNlbHNlIC8qICFUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSUyAqLworCisgIC8qIEFOU0kgQyBkb2Vzbid0IGxpa2UgZW1wdHkgc291cmNlIGZpbGVzICovCisgIHR5cGVkZWYgaW50ICBfdHRfY29scl9kdW1teTsKKworI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSUyAqLworCisvKiBFT0YgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0Y29sci5oIGIvc3JjL3NmbnQvdHRjb2xyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxMjE2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zZm50L3R0Y29sci5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHRjb2xyLmgKKyAqCisgKiAgIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBjb2xvcmVkIGdseXBoIGxheWVyIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxOC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IFNoYW8gWXUgWmhhbmcgPHNoYW96aGFuZ0BmYi5jb20+LgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLworCisKKyNpZm5kZWYgX19UVENPTFJfSF9fCisjZGVmaW5lIF9fVFRDT0xSX0hfXworCisKKyNpbmNsdWRlICJ0dGxvYWQuaCIKKworCitGVF9CRUdJTl9IRUFERVIKKworCisgIEZUX0xPQ0FMKCBGVF9FcnJvciApCisgIHR0X2ZhY2VfbG9hZF9jb2xyKCBUVF9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOworCisgIEZUX0xPQ0FMKCB2b2lkICkKKyAgdHRfZmFjZV9mcmVlX2NvbHIoIFRUX0ZhY2UgIGZhY2UgKTsKKworICBGVF9MT0NBTCggRlRfQm9vbCApCisgIHR0X2ZhY2VfZ2V0X2NvbHJfbGF5ZXIoIFRUX0ZhY2UgICAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgYmFzZV9nbHlwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgKmFnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgKmFjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGF5ZXJJdGVyYXRvciogIGl0ZXJhdG9yICk7CisKKyAgRlRfTE9DQUwoIEZUX0Vycm9yICkKKyAgdHRfZmFjZV9jb2xyX2JsZW5kX2xheWVyKCBUVF9GYWNlICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBjb2xvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIGRzdFNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzcmNTbG90ICk7CisKKworRlRfRU5EX0hFQURFUgorCisKKyNlbmRpZiAvKiBfX1RUQ09MUl9IX18gKi8KKworLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dGNwYWwuYyBiL3NyYy9zZm50L3R0Y3BhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTE0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc2ZudC90dGNwYWwuYwpAQCAtMCwwICsxLDMxMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGNwYWwuYworICoKKyAqICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGNvbG9yIHBhbGV0dGUgc3VwcG9ydCAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgU2hhbyBZdSBaaGFuZyA8c2hhb3poYW5nQGZiLmNvbT4uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogYENQQUwnIHRhYmxlIHNwZWNpZmljYXRpb246CisgICAqCisgICAqICAgaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9jcGFsLmh0bQorICAgKgorICAgKi8KKworCisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRjb2xvci5oPgorCisKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTE9SX0xBWUVSUworCisjaW5jbHVkZSAidHRjcGFsLmgiCisKKworICAvKiBOT1RFOiBUaGVzZSBhcmUgdGhlIHRhYmxlIHNpemVzIGNhbGN1bGF0ZWQgdGhyb3VnaCB0aGUgc3BlY3MuICovCisjZGVmaW5lIENQQUxfVjBfSEVBREVSX0JBU0VfU0laRSAgMTJVCisjZGVmaW5lIENPTE9SX1NJWkUgICAgICAgICAgICAgICAgIDRVCisKKworICAvKiBhbGwgZGF0YSBmcm9tIGBDUEFMJyBub3QgY292ZXJlZCBpbiBGVF9QYWxldHRlX0RhdGEgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgQ3BhbF8KKyAgeworICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsgICAgICAgIC8qIFRhYmxlIHZlcnNpb24gbnVtYmVyICgwIG9yIDEgc3VwcG9ydGVkKS4gKi8KKyAgICBGVF9VU2hvcnQgIG51bV9jb2xvcnM7ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGNvbG9yIHJlY29yZHMsICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbWJpbmVkIGZvciBhbGwgcGFsZXR0ZXMuICAgICAqLworICAgIEZUX0J5dGUqICBjb2xvcnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkdCQSBhcnJheSBvZiBjb2xvcnMgKi8KKyAgICBGVF9CeXRlKiAgY29sb3JfaW5kaWNlczsgLyogSW5kZXggb2YgZWFjaCBwYWxldHRlJ3MgZmlyc3QgY29sb3IgcmVjb3JkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHRoZSBjb21iaW5lZCBjb2xvciByZWNvcmQgYXJyYXkuICAgICAgICAqLworCisgICAgLyogVGhlIG1lbW9yeSB3aGljaCBiYWNrcyB1cCB0aGUgYENQQUwnIHRhYmxlLiAqLworICAgIHZvaWQqICAgICB0YWJsZTsKKyAgICBGVF9VTG9uZyAgdGFibGVfc2l6ZTsKKworICB9IENwYWw7CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KKyN1bmRlZiAgRlRfQ09NUE9ORU5UCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHRjcGFsCisKKworICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKKyAgdHRfZmFjZV9sb2FkX2NwYWwoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKKyAgeworICAgIEZUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKworICAgIEZUX0J5dGUqICB0YWJsZSA9IE5VTEw7CisgICAgRlRfQnl0ZSogIHAgICAgID0gTlVMTDsKKworICAgIENwYWwqICBjcGFsID0gTlVMTDsKKworICAgIEZUX1VMb25nICBjb2xvcnNfb2Zmc2V0OworICAgIEZUX1VMb25nICB0YWJsZV9zaXplOworCisKKyAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfQ1BBTCwgc3RyZWFtLCAmdGFibGVfc2l6ZSApOworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBOb0NwYWw7CisKKyAgICBpZiAoIHRhYmxlX3NpemUgPCBDUEFMX1YwX0hFQURFUl9CQVNFX1NJWkUgKQorICAgICAgZ290byBJbnZhbGlkVGFibGU7CisKKyAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX3NpemUsIHRhYmxlICkgKQorICAgICAgZ290byBOb0NwYWw7CisKKyAgICBwID0gdGFibGU7CisKKyAgICBpZiAoIEZUX05FVyggY3BhbCApICkKKyAgICAgIGdvdG8gTm9DcGFsOworCisgICAgY3BhbC0+dmVyc2lvbiA9IEZUX05FWFRfVVNIT1JUKCBwICk7CisgICAgaWYgKCBjcGFsLT52ZXJzaW9uID4gMSApCisgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZV9lbnRyaWVzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKyAgICBmYWNlLT5wYWxldHRlX2RhdGEubnVtX3BhbGV0dGVzICAgICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7CisKKyAgICBjcGFsLT5udW1fY29sb3JzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKyAgICBjb2xvcnNfb2Zmc2V0ICAgID0gRlRfTkVYVF9VTE9ORyggcCApOworCisgICAgaWYgKCBDUEFMX1YwX0hFQURFUl9CQVNFX1NJWkUgICAgICAgICAgICAgKworICAgICAgICAgZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlcyAqIDJVID4gdGFibGVfc2l6ZSApCisgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgIGlmICggY29sb3JzX29mZnNldCA+PSB0YWJsZV9zaXplICkKKyAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworICAgIGlmICggY3BhbC0+bnVtX2NvbG9ycyAqIENPTE9SX1NJWkUgPiB0YWJsZV9zaXplIC0gY29sb3JzX29mZnNldCApCisgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgIGlmICggZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlX2VudHJpZXMgPiBjcGFsLT5udW1fY29sb3JzICkKKyAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworCisgICAgY3BhbC0+Y29sb3JfaW5kaWNlcyA9IHA7CisgICAgY3BhbC0+Y29sb3JzICAgICAgICA9IChGVF9CeXRlKikoIHRhYmxlICsgY29sb3JzX29mZnNldCApOworCisgICAgaWYgKCBjcGFsLT52ZXJzaW9uID09IDEgKQorICAgIHsKKyAgICAgIEZUX1VMb25nICAgIHR5cGVfb2Zmc2V0LCBsYWJlbF9vZmZzZXQsIGVudHJ5X2xhYmVsX29mZnNldDsKKyAgICAgIEZUX1VTaG9ydCogIGFycmF5ID0gTlVMTDsKKyAgICAgIEZUX1VTaG9ydCogIGxpbWl0OworICAgICAgRlRfVVNob3J0KiAgcTsKKworCisgICAgICBpZiAoIENQQUxfVjBfSEVBREVSX0JBU0VfU0laRSAgICAgICAgICAgICArCisgICAgICAgICAgIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZXMgKiAyVSArCisgICAgICAgICAgIDNVICogNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IHRhYmxlX3NpemUgKQorICAgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKworICAgICAgcCArPSBmYWNlLT5wYWxldHRlX2RhdGEubnVtX3BhbGV0dGVzICogMlU7CisKKyAgICAgIHR5cGVfb2Zmc2V0ICAgICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKKyAgICAgIGxhYmVsX29mZnNldCAgICAgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKKyAgICAgIGVudHJ5X2xhYmVsX29mZnNldCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKKworICAgICAgaWYgKCB0eXBlX29mZnNldCApCisgICAgICB7CisgICAgICAgIGlmICggdHlwZV9vZmZzZXQgPj0gdGFibGVfc2l6ZSApCisgICAgICAgICAgZ290byBJbnZhbGlkVGFibGU7CisgICAgICAgIGlmICggZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlcyAqIDJVID4KKyAgICAgICAgICAgICAgIHRhYmxlX3NpemUgLSB0eXBlX29mZnNldCApCisgICAgICAgICAgZ290byBJbnZhbGlkVGFibGU7CisKKyAgICAgICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBhcnJheSwgZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlcyApICkKKyAgICAgICAgICBnb3RvIE5vQ3BhbDsKKworICAgICAgICBwICAgICA9IHRhYmxlICsgdHlwZV9vZmZzZXQ7CisgICAgICAgIHEgICAgID0gYXJyYXk7CisgICAgICAgIGxpbWl0ID0gcSArIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZXM7CisKKyAgICAgICAgd2hpbGUgKCBxIDwgbGltaXQgKQorICAgICAgICAgICpxKysgPSBGVF9ORVhUX1VTSE9SVCggcCApOworCisgICAgICAgIGZhY2UtPnBhbGV0dGVfZGF0YS5wYWxldHRlX2ZsYWdzID0gYXJyYXk7CisgICAgICB9CisKKyAgICAgIGlmICggbGFiZWxfb2Zmc2V0ICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCBsYWJlbF9vZmZzZXQgPj0gdGFibGVfc2l6ZSApCisgICAgICAgICAgZ290byBJbnZhbGlkVGFibGU7CisgICAgICAgIGlmICggZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlcyAqIDJVID4KKyAgICAgICAgICAgICAgIHRhYmxlX3NpemUgLSBsYWJlbF9vZmZzZXQgKQorICAgICAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworCisgICAgICAgIGlmICggRlRfUU5FV19BUlJBWSggYXJyYXksIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZXMgKSApCisgICAgICAgICAgZ290byBOb0NwYWw7CisKKyAgICAgICAgcCAgICAgPSB0YWJsZSArIGxhYmVsX29mZnNldDsKKyAgICAgICAgcSAgICAgPSBhcnJheTsKKyAgICAgICAgbGltaXQgPSBxICsgZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlczsKKworICAgICAgICB3aGlsZSAoIHEgPCBsaW1pdCApCisgICAgICAgICAgKnErKyA9IEZUX05FWFRfVVNIT1JUKCBwICk7CisKKyAgICAgICAgZmFjZS0+cGFsZXR0ZV9kYXRhLnBhbGV0dGVfbmFtZV9pZHMgPSBhcnJheTsKKyAgICAgIH0KKworICAgICAgaWYgKCBlbnRyeV9sYWJlbF9vZmZzZXQgKQorICAgICAgeworICAgICAgICBpZiAoIGVudHJ5X2xhYmVsX29mZnNldCA+PSB0YWJsZV9zaXplICkKKyAgICAgICAgICBnb3RvIEludmFsaWRUYWJsZTsKKyAgICAgICAgaWYgKCBmYWNlLT5wYWxldHRlX2RhdGEubnVtX3BhbGV0dGVfZW50cmllcyAqIDJVID4KKyAgICAgICAgICAgICAgIHRhYmxlX3NpemUgLSBlbnRyeV9sYWJlbF9vZmZzZXQgKQorICAgICAgICAgIGdvdG8gSW52YWxpZFRhYmxlOworCisgICAgICAgIGlmICggRlRfUU5FV19BUlJBWSggYXJyYXksIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZV9lbnRyaWVzICkgKQorICAgICAgICAgIGdvdG8gTm9DcGFsOworCisgICAgICAgIHAgICAgID0gdGFibGUgKyBlbnRyeV9sYWJlbF9vZmZzZXQ7CisgICAgICAgIHEgICAgID0gYXJyYXk7CisgICAgICAgIGxpbWl0ID0gcSArIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZV9lbnRyaWVzOworCisgICAgICAgIHdoaWxlICggcSA8IGxpbWl0ICkKKyAgICAgICAgICAqcSsrID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKKworICAgICAgICBmYWNlLT5wYWxldHRlX2RhdGEucGFsZXR0ZV9lbnRyeV9uYW1lX2lkcyA9IGFycmF5OworICAgICAgfQorICAgIH0KKworICAgIGNwYWwtPnRhYmxlICAgICAgPSB0YWJsZTsKKyAgICBjcGFsLT50YWJsZV9zaXplID0gdGFibGVfc2l6ZTsKKworICAgIGZhY2UtPmNwYWwgPSBjcGFsOworCisgICAgLyogc2V0IHVwIGRlZmF1bHQgcGFsZXR0ZSAqLworICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5wYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5wYWxldHRlX2RhdGEubnVtX3BhbGV0dGVfZW50cmllcyApICkKKyAgICAgIGdvdG8gTm9DcGFsOworCisgICAgaWYgKCB0dF9mYWNlX3BhbGV0dGVfc2V0KCBmYWNlLCAwICkgKQorICAgICAgZ290byBJbnZhbGlkVGFibGU7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworCisgIEludmFsaWRUYWJsZToKKyAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisKKyAgTm9DcGFsOgorICAgIEZUX0ZSQU1FX1JFTEVBU0UoIHRhYmxlICk7CisgICAgRlRfRlJFRSggY3BhbCApOworCisgICAgZmFjZS0+Y3BhbCA9IE5VTEw7CisKKyAgICAvKiBhcnJheXMgaW4gYGZhY2UtPnBhbGV0dGVfZGF0YScgYW5kIGBmYWNlLT5wYWxldHRlJyAqLworICAgIC8qIGFyZSBmcmVlZCBpbiBgc2ZudF9kb25lX2ZhY2UnICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworCisgIEZUX0xPQ0FMX0RFRiggdm9pZCApCisgIHR0X2ZhY2VfZnJlZV9jcGFsKCBUVF9GYWNlICBmYWNlICkKKyAgeworICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07CisgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKKworICAgIENwYWwqICBjcGFsID0gKENwYWwqKWZhY2UtPmNwYWw7CisKKworICAgIGlmICggY3BhbCApCisgICAgeworICAgICAgRlRfRlJBTUVfUkVMRUFTRSggY3BhbC0+dGFibGUgKTsKKyAgICAgIEZUX0ZSRUUoIGNwYWwgKTsKKyAgICB9CisgIH0KKworCisgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQorICB0dF9mYWNlX3BhbGV0dGVfc2V0KCBUVF9GYWNlICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBwYWxldHRlX2luZGV4ICkKKyAgeworICAgIENwYWwqICBjcGFsID0gKENwYWwqKWZhY2UtPmNwYWw7CisKKyAgICBGVF9CeXRlKiAgIG9mZnNldDsKKyAgICBGVF9CeXRlKiAgIHA7CisKKyAgICBGVF9Db2xvciogIHE7CisgICAgRlRfQ29sb3IqICBsaW1pdDsKKworICAgIEZUX1VTaG9ydCAgY29sb3JfaW5kZXg7CisKKworICAgIGlmICggIWNwYWwgfHwgcGFsZXR0ZV9pbmRleCA+PSBmYWNlLT5wYWxldHRlX2RhdGEubnVtX3BhbGV0dGVzICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOworCisgICAgb2Zmc2V0ICAgICAgPSBjcGFsLT5jb2xvcl9pbmRpY2VzICsgMiAqIHBhbGV0dGVfaW5kZXg7CisgICAgY29sb3JfaW5kZXggPSBGVF9QRUVLX1VTSE9SVCggb2Zmc2V0ICk7CisKKyAgICBpZiAoIGNvbG9yX2luZGV4ICsgZmFjZS0+cGFsZXR0ZV9kYXRhLm51bV9wYWxldHRlX2VudHJpZXMgPgorICAgICAgICAgICBjcGFsLT5udW1fY29sb3JzICkKKyAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOworCisgICAgcCAgICAgPSBjcGFsLT5jb2xvcnMgKyBDT0xPUl9TSVpFICogY29sb3JfaW5kZXg7CisgICAgcSAgICAgPSBmYWNlLT5wYWxldHRlOworICAgIGxpbWl0ID0gcSArIGZhY2UtPnBhbGV0dGVfZGF0YS5udW1fcGFsZXR0ZV9lbnRyaWVzOworCisgICAgd2hpbGUgKCBxIDwgbGltaXQgKQorICAgIHsKKyAgICAgIHEtPmJsdWUgID0gRlRfTkVYVF9CWVRFKCBwICk7CisgICAgICBxLT5ncmVlbiA9IEZUX05FWFRfQllURSggcCApOworICAgICAgcS0+cmVkICAgPSBGVF9ORVhUX0JZVEUoIHAgKTsKKyAgICAgIHEtPmFscGhhID0gRlRfTkVYVF9CWVRFKCBwICk7CisKKyAgICAgIHErKzsKKyAgICB9CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTICovCisKKyAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KKyAgdHlwZWRlZiBpbnQgIF90dF9jcGFsX2R1bW15OworCisjZW5kaWYgLyogIVRUX0NPTkZJR19PUFRJT05fQ09MT1JfTEFZRVJTICovCisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRjcGFsLmggYi9zcmMvc2ZudC90dGNwYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQ0YmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvdHRjcGFsLmgKQEAgLTAsMCArMSw0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGNwYWwuaAorICoKKyAqICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGNvbG9yIHBhbGV0dGUgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE4LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgU2hhbyBZdSBaaGFuZyA8c2hhb3poYW5nQGZiLmNvbT4uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCisKKworI2lmbmRlZiBfX1RUQ1BBTF9IX18KKyNkZWZpbmUgX19UVENQQUxfSF9fCisKKworI2luY2x1ZGUgInR0bG9hZC5oIgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgRlRfTE9DQUwoIEZUX0Vycm9yICkKKyAgdHRfZmFjZV9sb2FkX2NwYWwoIFRUX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7CisKKyAgRlRfTE9DQUwoIHZvaWQgKQorICB0dF9mYWNlX2ZyZWVfY3BhbCggVFRfRmFjZSAgZmFjZSApOworCisgIEZUX0xPQ0FMKCBGVF9FcnJvciApCisgIHR0X2ZhY2VfcGFsZXR0ZV9zZXQoIFRUX0ZhY2UgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHBhbGV0dGVfaW5kZXggKTsKKworCitGVF9FTkRfSEVBREVSCisKKworI2VuZGlmIC8qIF9fVFRDUEFMX0hfXyAqLworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0a2Vybi5jIGIvc3JjL3NmbnQvdHRrZXJuLmMKaW5kZXggNjhmMTVhMi4uZDRhNzBjNyAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRrZXJuLmMKKysrIGIvc3JjL3NmbnQvdHRrZXJuLmMKQEAgLTEsMzkgKzEsMzggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0a2Vybi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwotLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGtlcm4uYworICoKKyAqICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUga2VybmluZyB0YWJsZS4gIFRoaXMgZG9lc24ndCBoYW5kbGUKKyAqICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CiAjaW5jbHVkZSAidHRrZXJuLmgiCiAKICNpbmNsdWRlICJzZmVycm9ycy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0a2VybgorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0a2VybgogCiAKICN1bmRlZiAgVFRfS0VSTl9JTkRFWApAQCAtMTI3LDggKzEyNiw4IEBACiAgICAgICBhdmFpbCB8PSBtYXNrOwogCiAgICAgICAvKgotICAgICAgICogIE5vdyBjaGVjayB3aGV0aGVyIHRoZSBwYWlycyBpbiB0aGlzIHRhYmxlIGFyZSBvcmRlcmVkLgotICAgICAgICogIFdlIHRoZW4gY2FuIHVzZSBiaW5hcnkgc2VhcmNoLgorICAgICAgICogTm93IGNoZWNrIHdoZXRoZXIgdGhlIHBhaXJzIGluIHRoaXMgdGFibGUgYXJlIG9yZGVyZWQuCisgICAgICAgKiBXZSB0aGVuIGNhbiB1c2UgYmluYXJ5IHNlYXJjaC4KICAgICAgICAqLwogICAgICAgaWYgKCBudW1fcGFpcnMgPiAwICkKICAgICAgIHsKQEAgLTI4Myw4ICsyODIsOCBAQAogICAgICAgICBicmVhazsKIAogICAgICAgIC8qCi0gICAgICAgICogIFdlIGRvbid0IHN1cHBvcnQgZm9ybWF0IDIgYmVjYXVzZSB3ZSBoYXZlbid0IHNlZW4gYSBzaW5nbGUgZm9udAotICAgICAgICAqICB1c2luZyBpdCBpbiByZWFsIGxpZmUuLi4KKyAgICAgICAgKiBXZSBkb24ndCBzdXBwb3J0IGZvcm1hdCAyIGJlY2F1c2Ugd2UgaGF2ZW4ndCBzZWVuIGEgc2luZ2xlIGZvbnQKKyAgICAgICAgKiB1c2luZyBpdCBpbiByZWFsIGxpZmUuLi4KICAgICAgICAgKi8KIAogICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0a2Vybi5oIGIvc3JjL3NmbnQvdHRrZXJuLmgKaW5kZXggNGU0NWQwOS4uZjQ0YjViZCAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRrZXJuLmgKKysrIGIvc3JjL3NmbnQvdHRrZXJuLmgKQEAgLTEsMjkgKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0a2Vybi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSBrZXJuaW5nIHRhYmxlLiAgVGhpcyBkb2Vzbid0IGhhbmRsZSAgICAgICAgICAqLwotLyogICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGtlcm4uaAorICoKKyAqICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUga2VybmluZyB0YWJsZS4gIFRoaXMgZG9lc24ndCBoYW5kbGUKKyAqICAga2VybmluZyBkYXRhIHdpdGhpbiB0aGUgR1BPUyB0YWJsZSBhdCB0aGUgbW9tZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVEtFUk5fSF8KICNkZWZpbmUgVFRLRVJOX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRsb2FkLmMgYi9zcmMvc2ZudC90dGxvYWQuYwppbmRleCBhODZhNTQ2Li40YjQ2ZjQxIDEwMDY0NAotLS0gYS9zcmMvc2ZudC90dGxvYWQuYworKysgYi9zcmMvc2ZudC90dGxvYWQuYwpAQCAtMSw1NyArMSw1OCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcywgaS5lLiwgdGFibGVzIHRoYXQgY2FuIGJlIGVpdGhlciBpbiAgICovCi0vKiAgICBUVEYgb3IgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0bG9hZC5jCisgKgorICogICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMsIGkuZS4sIHRhYmxlcyB0aGF0IGNhbiBiZSBlaXRoZXIgaW4KKyAqICAgVFRGIG9yIE9URiBmb250cyAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KICNpbmNsdWRlICJ0dGxvYWQuaCIKIAogI2luY2x1ZGUgInNmZXJyb3JzLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRsb2FkCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHRsb2FkCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyBmb3IgYSBUcnVlVHlwZSB0YWJsZSBieSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgOjogVGhlIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgdGFibGUgZGlyZWN0b3J5IGVudHJ5LiAgMCBpZiBub3QgZm91bmQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvb2t1cF90YWJsZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTG9va3MgZm9yIGEgVHJ1ZVR5cGUgdGFibGUgYnkgbmFtZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgZmFjZSBvYmplY3QgaGFuZGxlLgorICAgKgorICAgKiAgIHRhZyA6OgorICAgKiAgICAgVGhlIHNlYXJjaGVkIHRhZy4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBBIHBvaW50ZXIgdG8gdGhlIHRhYmxlIGRpcmVjdG9yeSBlbnRyeS4gIDAgaWYgbm90IGZvdW5kLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBUVF9UYWJsZSAgKQogICB0dF9mYWNlX2xvb2t1cF90YWJsZSggVFRfRmFjZSAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdGFnICApCkBAIC02Myw4ICs2NCw4IEBACiAjZW5kaWYKIAogCi0gICAgRlRfVFJBQ0U0KCggInR0X2ZhY2VfbG9va3VwX3RhYmxlOiAlMDhwLCBgJWMlYyVjJWMnIC0tICIsCi0gICAgICAgICAgICAgICAgZmFjZSwKKyAgICBGVF9UUkFDRTQoKCAidHRfZmFjZV9sb29rdXBfdGFibGU6ICVwLCBgJWMlYyVjJWMnIC0tICIsCisgICAgICAgICAgICAgICAgKHZvaWQgKilmYWNlLAogICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnID4+IDI0ICksCiAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWcgPj4gMTYgKSwKICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhZyA+PiA4ICApLApAQCAtMTAxLDI3ICsxMDIsMzEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9nb3RvX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9va3MgZm9yIGEgVHJ1ZVR5cGUgdGFibGUgYnkgbmFtZSwgdGhlbiBzZWVrIGEgc3RyZWFtIHRvIGl0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgOjogVGhlIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgc3RyZWFtIHRvIHNlZWsgd2hlbiB0aGUgdGFibGUgaXMgZm91bmQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSB0YWJsZSBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2dvdG9fdGFibGUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUsIHRoZW4gc2VlayBhIHN0cmVhbSB0byBpdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgZmFjZSBvYmplY3QgaGFuZGxlLgorICAgKgorICAgKiAgIHRhZyA6OgorICAgKiAgICAgVGhlIHNlYXJjaGVkIHRhZy4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBzdHJlYW0gdG8gc2VlayB3aGVuIHRoZSB0YWJsZSBpcyBmb3VuZC4KKyAgICoKKyAgICogQE91dHB1dDoKKyAgICogICBsZW5ndGggOjoKKyAgICogICAgIFRoZSBsZW5ndGggb2YgdGhlIHRhYmxlIGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9nb3RvX3RhYmxlKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCkBAIC0zMDksMjggKzMxNCwzMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZm9udF9kaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgaGVhZGVyIG9mIGEgU0ZOVCBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNmbnQgICAgICAgOjogVGhlIFNGTlQgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gY3Vyc29yIG11c3QgYmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9udCBkaXJlY3RvcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfZm9udF9kaXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvYWRzIHRoZSBoZWFkZXIgb2YgYSBTRk5UIGZvbnQgZmlsZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIHNmbnQgOjoKKyAgICogICAgIFRoZSBTRk5UIGhlYWRlci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbnQgZGlyZWN0b3J5LgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfbG9hZF9mb250X2RpciggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTM1NCw3ICszNjIsNyBAQAogICAgIH07CiAKIAotICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX2xvYWRfZm9udF9kaXI6ICUwOHBcbiIsIGZhY2UgKSk7CisgICAgRlRfVFJBQ0UyKCggInR0X2ZhY2VfbG9hZF9mb250X2RpcjogJXBcbiIsICh2b2lkICopZmFjZSApKTsKIAogICAgIC8qIHJlYWQgdGhlIG9mZnNldCB0YWJsZSAqLwogCkBAIC0zODgsNyArMzk2LDE1IEBACiAgICAgICB9CiAgICAgfQogICAgIGVsc2UKKyAgICB7CiAgICAgICB2YWxpZF9lbnRyaWVzID0gc2ZudC5udW1fdGFibGVzOworICAgICAgaWYgKCAhdmFsaWRfZW50cmllcyApCisgICAgICB7CisgICAgICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX2xvYWRfZm9udF9kaXI6IG5vIHZhbGlkIHRhYmxlcyBmb3VuZFxuIiApKTsKKyAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgICB9CisgICAgfQogCiAgICAgZmFjZS0+bnVtX3RhYmxlcyA9IHZhbGlkX2VudHJpZXM7CiAgICAgZmFjZS0+Zm9ybWF0X3RhZyA9IHNmbnQuZm9ybWF0X3RhZzsKQEAgLTQ5Niw0NiArNTEyLDUxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9hbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudCAgICovCi0gIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KLSAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLwotICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9hbnkKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvYWRzIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBmYWNlIG9iamVjdCB0byBsb29rIGZvci4KKyAgICoKKyAgICogICB0YWcgOjoKKyAgICogICAgIFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudAorICAgKiAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyCisgICAqICAgICB0byBhIHZhbGlkIFRydWVUeXBlIHRhYmxlIHRhZyB0aGF0IHlvdSBjYW4gZm9yZ2Ugd2l0aAorICAgKiAgICAgdGhlIE1BS0VfVFRfVEFHIG1hY3JvLgorICAgKgorICAgKiAgIG9mZnNldCA6OgorICAgKiAgICAgVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmCisgICAqICAgICB0YWcgPT0gMCkuCisgICAqCisgICAqICAgbGVuZ3RoIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgZGVjaXNpb24gdmFyaWFibGU6CisgICAqCisgICAqICAgICBJZiBsZW5ndGggPT0gTlVMTDoKKyAgICogICAgICAgTG9hZHMgdGhlIHdob2xlIHRhYmxlLiAgUmV0dXJucyBhbiBlcnJvciBpZgorICAgKiAgICAgICBgb2Zmc2V0JyA9PSAwIQorICAgKgorICAgKiAgICAgSWYgKmxlbmd0aCA9PSAwOgorICAgKiAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuCisgICAqICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKKyAgICogICAgICAgYHRhZycuCisgICAqCisgICAqICAgICBJZiAqbGVuZ3RoICE9IDA6CisgICAqICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsCisgICAqICAgICAgIHN0YXJ0aW5nIGF0IG9mZnNldCBgb2Zmc2V0JyAoaW4gdGFibGUgb3IgZm9udCB0b28pLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIGJ1ZmZlciA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IGJ1ZmZlci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfbG9hZF9hbnkoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCkBAIC01ODYsMjIgKzYwNywyNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgVHJ1ZVR5cGUgdGFibGUgYGhlYWQnIG9yIGBiaGVkJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvYWRzIHRoZSBUcnVlVHlwZSB0YWJsZSBgaGVhZCcgb3IgYGJoZWQnLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKQEAgLTYyMiwxMCArNjQ1LDEwIEBACiAgICAgICAgIEZUX0ZSQU1FX0xPTkcgICggTWFnaWNfTnVtYmVyICksCiAgICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggRmxhZ3MgKSwKICAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBVbml0c19QZXJfRU0gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBDcmVhdGVkWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggQ3JlYXRlZFsxXSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIE1vZGlmaWVkWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggTW9kaWZpZWRbMV0gKSwKKyAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBDcmVhdGVkWzBdICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICggQ3JlYXRlZFsxXSApLAorICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIE1vZGlmaWVkWzBdICksCisgICAgICAgIEZUX0ZSQU1FX1VMT05HICggTW9kaWZpZWRbMV0gKSwKICAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB4TWluICksCiAgICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeU1pbiApLAogICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhNYXggKSwKQEAgLTY3NiwyMiArNjk5LDI0IEBACiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbWF4cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgbWF4aW11bSBwcm9maWxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfbWF4cAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTG9hZHMgdGhlIG1heGltdW0gcHJvZmlsZSBpbnRvIGEgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfbG9hZF9tYXhwKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCkBAIC03ODQsMjIgKzgwOSwyNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfbmFtZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTG9hZHMgdGhlIG5hbWUgcmVjb3Jkcy4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9sb2FkX25hbWUoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTg5Niw3ICs5MjMsNyBAQAogICAgICAgLyogbG9hZCBsYW5ndWFnZSB0YWdzICovCiAgICAgICB7CiAgICAgICAgIFRUX0xhbmdUYWcgIGVudHJ5ID0gdGFibGUtPmxhbmdUYWdzOwotICAgICAgICBUVF9MYW5nVGFnICBsaW1pdCA9IGVudHJ5ICsgdGFibGUtPm51bUxhbmdUYWdSZWNvcmRzOworICAgICAgICBUVF9MYW5nVGFnICBsaW1pdCA9IEZUX09GRlNFVCggZW50cnksIHRhYmxlLT5udW1MYW5nVGFnUmVjb3JkcyApOwogCiAKICAgICAgICAgZm9yICggOyBlbnRyeSA8IGxpbWl0OyBlbnRyeSsrICkKQEAgLTk4MSwxNyArMTAwOCwxOCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2ZyZWVfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlcyB0aGUgbmFtZSByZWNvcmRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZmFjZV9mcmVlX25hbWUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZyZWVzIHRoZSBuYW1lIHJlY29yZHMuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgdHRfZmFjZV9mcmVlX25hbWUoIFRUX0ZhY2UgIGZhY2UgKQogICB7CkBAIC0xMDMwLDIzICsxMDU4LDI1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9jbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBjbWFwIGRpcmVjdG9yeSBpbiBhIGZhY2Ugb2JqZWN0LiAgVGhlIGNtYXBzIHRoZW1zZWx2ZXMgICAqLwotICAvKiAgICBhcmUgbG9hZGVkIG9uIGRlbWFuZCBpbiB0aGUgYHR0Y21hcC5jJyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfY21hcAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTG9hZHMgdGhlIGNtYXAgZGlyZWN0b3J5IGluIGEgZmFjZSBvYmplY3QuICBUaGUgY21hcHMgdGhlbXNlbHZlcworICAgKiAgIGFyZSBsb2FkZWQgb24gZGVtYW5kIGluIHRoZSBgdHRjbWFwLmMnIG1vZHVsZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfY21hcCggVFRfRmFjZSAgICBmYWNlLApAQCAtMTA2OCwyMiArMTA5OCwyNCBAQAogCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfb3MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgT1MyIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfb3MyCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkcyB0aGUgT1MyIHRhYmxlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfb3MyKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTEyMjgsMjIgKzEyNjAsMjQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX3Bvc3RzY3JpcHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIFBvc3RzY3JpcHQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZmFjZV9sb2FkX3Bvc3RzY3JpcHQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvYWRzIHRoZSBQb3N0c2NyaXB0IHRhYmxlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfcG9zdCggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQpAQCAtMTI4MCw3ICsxMzE0LDcgQEAKICAgICAvKiB3ZSBkb24ndCBsb2FkIHRoZSBnbHlwaCBuYW1lcywgd2UgZG8gdGhhdCBpbiBhbm90aGVyICovCiAgICAgLyogbW9kdWxlICh0dHBvc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgRlRfVFJBQ0UzKCggIkZvcm1hdFR5cGU6ICAgMHgleFxuIiwgcG9zdC0+Rm9ybWF0VHlwZSApKTsKKyAgICBGVF9UUkFDRTMoKCAiRm9ybWF0VHlwZTogICAweCVseFxuIiwgcG9zdC0+Rm9ybWF0VHlwZSApKTsKICAgICBGVF9UUkFDRTMoKCAiaXNGaXhlZFBpdGNoOiAgICVzXG4iLCBwb3N0LT5pc0ZpeGVkUGl0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIgIHllcyIgOiAiICAgbm8iICkpOwogCkBAIC0xMjg4LDIyICsxMzIyLDI0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wY2x0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBQQ0wgNSBUYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9wY2x0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkcyB0aGUgUENMIDUgVGFibGUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfbG9hZF9wY2x0KCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCkBAIC0xMzQ5LDIyICsxMzg1LDI0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9nYXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBgZ2FzcCcgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9nYXNwCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkcyB0aGUgYGdhc3AnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9sb2FkX2dhc3AoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0bG9hZC5oIGIvc3JjL3NmbnQvdHRsb2FkLmgKaW5kZXggZjk0YmU4Yi4uNGU1M2Q4YiAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRsb2FkLmgKKysrIGIvc3JjL3NmbnQvdHRsb2FkLmgKQEAgLTEsMjkgKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMsIGkuZS4sIHRhYmxlcyB0aGF0IGNhbiBiZSBlaXRoZXIgaW4gICAqLwotLyogICAgVFRGIG9yIE9URiBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGxvYWQuaAorICoKKyAqICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzLCBpLmUuLCB0YWJsZXMgdGhhdCBjYW4gYmUgZWl0aGVyIGluCisgKiAgIFRURiBvciBPVEYgZm9udHMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVExPQURfSF8KICNkZWZpbmUgVFRMT0FEX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRtdHguYyBiL3NyYy9zZm50L3R0bXR4LmMKaW5kZXggNmRkZGE5NS4uMDIxMTIzMyAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRtdHguYworKysgYi9zcmMvc2ZudC90dG10eC5jCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG10eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgbWV0cmljcyB0YWJsZXMgY29tbW9uIHRvIFRURiBhbmQgT1RGIGZvbnRzIChib2R5KS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dG10eC5jCisgKgorICogICBMb2FkIHRoZSBtZXRyaWNzIHRhYmxlcyBjb21tb24gdG8gVFRGIGFuZCBPVEYgZm9udHMgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KICNlbmRpZgogCiAjaW5jbHVkZSAidHRtdHguaCIKQEAgLTM4LDM0ICszNywzNyBAQAogICAvKiAgICAgICAgICAgIGJvdGggdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhlYWRlcnMuICAgICAgICAgICAgICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dG10eAorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0bXR4CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfaG10eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBgaG10eCcgb3IgYHZtdHgnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgYHZtdHgnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9obXR4CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBgaG10eCcgb3IgYHZtdHgnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgIHZlcnRpY2FsIDo6CisgICAqICAgICBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCBgdm10eCcuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfaG10eCggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCkBAIC0xMDIsMjQgKzEwNCwyNyBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfaGhlYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBgaGhlYScgb3IgJ3ZoZWEnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgYHZoZWEnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9oaGVhCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBgaGhlYScgb3IgJ3ZoZWEnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBUaGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiAgIHZlcnRpY2FsIDo6CisgICAqICAgICBBIGJvb2xlYW4gZmxhZy4gIElmIHNldCwgbG9hZCBgdmhlYScuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfaGhlYSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCkBAIC0xOTAsMzAgKzE5NSwzNSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2dldF9tZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhICAgICAgKi8KLSAgLyogICAgZ2l2ZW4gZ2x5cGguICBUaGUgdmFsdWVzIGFyZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgKHRvcCBzaWRlICAgICAgICovCi0gIC8qICAgIGJlYXJpbmcgZm9yIHZlcnRpY2FsIG1ldHJpY3MpIGFuZCBhZHZhbmNlIHdpZHRoIChhZHZhbmNlIGhlaWdodCAgICAqLwotICAvKiAgICBmb3IgdmVydGljYWwgbWV0cmljcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGZhY2Ugc3RydWN0dXJlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IElmIHNldCB0byBUUlVFLCBnZXQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJlYXJpbmcgOjogVGhlIGJlYXJpbmcsIGVpdGhlciBsZWZ0IHNpZGUgb3IgdG9wIHNpZGUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYWR2YW5jZSA6OiBUaGUgYWR2YW5jZSB3aWR0aCBvciBhZHZhbmNlIGhlaWdodCwgZGVwZW5kaW5nIG9uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdGhlIGB2ZXJ0aWNhbCcgZmxhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFJldHVybiB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEKKyAgICogICBnaXZlbiBnbHlwaC4gIFRoZSB2YWx1ZXMgYXJlIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyAodG9wIHNpZGUKKyAgICogICBiZWFyaW5nIGZvciB2ZXJ0aWNhbCBtZXRyaWNzKSBhbmQgYWR2YW5jZSB3aWR0aCAoYWR2YW5jZSBoZWlnaHQKKyAgICogICBmb3IgdmVydGljYWwgbWV0cmljcykuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIFRydWVUeXBlIGZhY2Ugc3RydWN0dXJlLgorICAgKgorICAgKiAgIHZlcnRpY2FsIDo6CisgICAqICAgICBJZiBzZXQgdG8gVFJVRSwgZ2V0IHZlcnRpY2FsIG1ldHJpY3MuCisgICAqCisgICAqICAgZ2luZGV4IDo6CisgICAqICAgICBUaGUgZ2x5cGggaW5kZXguCisgICAqCisgICAqIEBPdXRwdXQ6CisgICAqICAgYWJlYXJpbmcgOjoKKyAgICogICAgIFRoZSBiZWFyaW5nLCBlaXRoZXIgbGVmdCBzaWRlIG9yIHRvcCBzaWRlLgorICAgKgorICAgKiAgIGFhZHZhbmNlIDo6CisgICAqICAgICBUaGUgYWR2YW5jZSB3aWR0aCBvciBhZHZhbmNlIGhlaWdodCwgZGVwZW5kaW5nIG9uCisgICAqICAgICB0aGUgYHZlcnRpY2FsJyBmbGFnLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgdHRfZmFjZV9nZXRfbWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdmVydGljYWwsCkBAIC0yNjksNyArMjc5LDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgdGFibGVfcG9zICs9IDQgKiAoIGsgLSAxICk7Ci0gICAgICAgIGlmICggdGFibGVfcG9zICsgNCA+IHRhYmxlX2VuZCApCisgICAgICAgIGlmICggdGFibGVfcG9zICsgMiA+IHRhYmxlX2VuZCApCiAgICAgICAgICAgZ290byBOb0RhdGE7CiAKICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGVfcG9zICkgfHwKQEAgLTI4MSw3ICsyOTEsOSBAQAogICAgICAgICAgICphYmVhcmluZyA9IDA7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIGlmICggIUZUX1NUUkVBTV9TRUVLKCB0YWJsZV9wb3MgKSApCisgICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggdGFibGVfcG9zICkgKQorICAgICAgICAgICAgKmFiZWFyaW5nID0gMDsKKyAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAodm9pZClGVF9SRUFEX1NIT1JUKCAqYWJlYXJpbmcgKTsKICAgICAgICAgfQogICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvdHRtdHguaCBiL3NyYy9zZm50L3R0bXR4LmgKaW5kZXggYWIwMGFjZC4uZGJhNjVjYSAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRtdHguaAorKysgYi9zcmMvc2ZudC90dG10eC5oCkBAIC0xLDI4ICsxLDI3IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG10eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgbWV0cmljcyB0YWJsZXMgY29tbW9uIHRvIFRURiBhbmQgT1RGIGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dG10eC5oCisgKgorICogICBMb2FkIHRoZSBtZXRyaWNzIHRhYmxlcyBjb21tb24gdG8gVFRGIGFuZCBPVEYgZm9udHMgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVE1UWF9IXwogI2RlZmluZSBUVE1UWF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0cG9zdC5jIGIvc3JjL3NmbnQvdHRwb3N0LmMKaW5kZXggNmRlOTllZi4uZTkzYTRiZiAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRwb3N0LmMKKysrIGIvc3JjL3NmbnQvdHRwb3N0LmMKQEAgLTEsMzQgKzEsMzMgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cG9zdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IG5hbWUgdGFibGUgcHJvY2Vzc2luZyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzICAgICAqLwotLyogICAgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dHBvc3QuYworICoKKyAqICAgUG9zdFNjcmlwdCBuYW1lIHRhYmxlIHByb2Nlc3NpbmcgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cworICogICAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBwb3N0IHRhYmxlIGlzIG5vdCBjb21wbGV0ZWx5IGxvYWRlZCBieSB0aGUgY29yZSBlbmdpbmUuICBUaGlzICAgICAqLwotICAvKiBmaWxlIGxvYWRzIHRoZSBtaXNzaW5nIFBTIGdseXBoIG5hbWVzIGFuZCBpbXBsZW1lbnRzIGFuIEFQSSB0byBhY2Nlc3MgKi8KLSAgLyogdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBwb3N0IHRhYmxlIGlzIG5vdCBjb21wbGV0ZWx5IGxvYWRlZCBieSB0aGUgY29yZSBlbmdpbmUuICBUaGlzCisgICAqIGZpbGUgbG9hZHMgdGhlIG1pc3NpbmcgUFMgZ2x5cGggbmFtZXMgYW5kIGltcGxlbWVudHMgYW4gQVBJIHRvIGFjY2VzcworICAgKiB0aGVtLgorICAgKgorICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KIAogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCkBAIC0zOCwyMyArMzcsMjMgQEAKICNpbmNsdWRlICJzZmVycm9ycy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0cG9zdAorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0cG9zdAogCiAKLSAgLyogSWYgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlzIGRlZmluZWQsIHdlIHJlbHkgb24gdGhlIGBQU05hbWVzJyAqLworICAvKiBJZiB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaXMgZGVmaW5lZCwgd2UgcmVseSBvbiB0aGUgYHBzbmFtZXMnICovCiAgIC8qIG1vZHVsZSB0byBncmFiIHRoZSBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwogCiAKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaD4KIAogI2RlZmluZSBNQUNfTkFNRSggeCApICAoRlRfU3RyaW5nKilwc25hbWVzLT5tYWNpbnRvc2hfbmFtZSggKEZUX1VJbnQpKHgpICkKIApAQCAtNjIsOSArNjEsOSBAQAogI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCiAKIAotICAgLyogT3RoZXJ3aXNlLCB3ZSBpZ25vcmUgdGhlIGBQU05hbWVzJyBtb2R1bGUsIGFuZCBwcm92aWRlIG91ciBvd24gICovCisgICAvKiBPdGhlcndpc2UsIHdlIGlnbm9yZSB0aGUgYHBzbmFtZXMnIG1vZHVsZSwgYW5kIHByb3ZpZGUgb3VyIG93biAgKi8KICAgIC8qIHRhYmxlIG9mIE1hYyBuYW1lcy4gIFRodXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGEgdmVyc2lvbiBvZiAqLwotICAgLyogRnJlZVR5cGUgd2l0aG91dCB0aGUgVHlwZSAxIGRyaXZlciAmIFBTTmFtZXMgbW9kdWxlLiAgICAgICAgICAgICovCisgICAvKiBGcmVlVHlwZSB3aXRob3V0IHRoZSBUeXBlIDEgZHJpdmVyICYgcHNuYW1lcyBtb2R1bGUuICAgICAgICAgICAgKi8KIAogI2RlZmluZSBNQUNfTkFNRSggeCApICAoRlRfU3RyaW5nKil0dF9wb3N0X2RlZmF1bHRfbmFtZXNbeF0KIApAQCAtMjQwLDcgKzIzOSw3IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICJsb2FkX2Zvcm1hdF8yMDogJWQgYnl0ZSBsZWZ0IGluIHBvc3QgdGFibGVcbiIsCisgICAgICAgICAgRlRfVFJBQ0U2KCggImxvYWRfZm9ybWF0XzIwOiAlbGQgYnl0ZSBsZWZ0IGluIHBvc3QgdGFibGVcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9saW1pdCAtIEZUX1NUUkVBTV9QT1MoKSApKTsKIAogICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBsZW4gKSApCkBAIC00NTksMjggKzQ1OCwzMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2dldF9wc19uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTbmFtZSA6OiBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgVW5kZWZpbmVkIGluIGNhc2Ugb2YgICAqLwotICAvKiAgICAgICAgICAgICAgZXJyb3IsIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2dldF9wc19uYW1lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlLgorICAgKgorICAgKiAgIGlkeCA6OgorICAgKiAgICAgVGhlIGdseXBoIGluZGV4LgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgUFNuYW1lIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgVW5kZWZpbmVkIGluIGNhc2Ugb2YKKyAgICogICAgIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLgorICAgKgorICAgKiAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nIQorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9nZXRfcHNfbmFtZSggVFRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHBvc3QuaCBiL3NyYy9zZm50L3R0cG9zdC5oCmluZGV4IDNiZWMwN2UuLjk0YzdkMTYgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3R0cG9zdC5oCisrKyBiL3NyYy9zZm50L3R0cG9zdC5oCkBAIC0xLDIwICsxLDIwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBvc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBuYW1lIHRhYmxlIHByb2Nlc3NpbmcgZm9yIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBmb250cyAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHRwb3N0LmgKKyAqCisgKiAgIFBvc3RTY3JpcHQgbmFtZSB0YWJsZSBwcm9jZXNzaW5nIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZm9udHMKKyAqICAgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVFBPU1RfSF8KQEAgLTIzLDcgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCmRpZmYgLS1naXQgYS9zcmMvc2ZudC90dHNiaXQuYyBiL3NyYy9zZm50L3R0c2JpdC5jCmluZGV4IDMzYjg2NDAuLjlkZDQ0MTkgMTAwNjQ0Ci0tLSBhL3NyYy9zZm50L3R0c2JpdC5jCisrKyBiL3NyYy9zZm50L3R0c2JpdC5jCkBAIC0xLDI5ICsxLDI4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHNiaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDUtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMgYnkgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdvb2dsZSBBdXRob3Iocyk6IEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dHNiaXQuYworICoKKyAqICAgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0IChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIENvcHlyaWdodCAyMDEzIGJ5IEdvb2dsZSwgSW5jLgorICogR29vZ2xlIEF1dGhvcihzKTogQmVoZGFkIEVzZmFoYm9kLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfQklUTUFQX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGJpdG1hcC5oPgogCiAKICNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKQEAgLTM2LDE0ICszNSwxNCBAQAogI2luY2x1ZGUgInBuZ3NoaW0uaCIKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dHNiaXQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0dHNiaXQKIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQpAQCAtMTI5LDggKzEyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKgotICAgICAgICAgKiAgQ291bnQgdGhlIG51bWJlciBvZiBzdHJpa2VzIGF2YWlsYWJsZSBpbiB0aGUgdGFibGUuICBXZSBhcmUgYSBiaXQKLSAgICAgICAgICogIHBhcmFub2lkIHRoZXJlIGFuZCBkb24ndCB0cnVzdCB0aGUgZGF0YS4KKyAgICAgICAgICogQ291bnQgdGhlIG51bWJlciBvZiBzdHJpa2VzIGF2YWlsYWJsZSBpbiB0aGUgdGFibGUuICBXZSBhcmUgYSBiaXQKKyAgICAgICAgICogcGFyYW5vaWQgdGhlcmUgYW5kIGRvbid0IHRydXN0IHRoZSBkYXRhLgogICAgICAgICAgKi8KICAgICAgICAgY291bnQgPSAoRlRfVUludCludW1fc3RyaWtlczsKICAgICAgICAgaWYgKCA4ICsgNDhVTCAqIGNvdW50ID4gdGFibGVfc2l6ZSApCkBAIC0xODIsOCArMTgxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdCBiYWQgcmVuZGVyaW5nIHJlc3VsdHNcbiIgKSk7CiAKICAgICAgICAgLyoKLSAgICAgICAgICogIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaWtlcyBhdmFpbGFibGUgaW4gdGhlIHRhYmxlLiAgV2UgYXJlIGEgYml0Ci0gICAgICAgICAqICBwYXJhbm9pZCB0aGVyZSBhbmQgZG9uJ3QgdHJ1c3QgdGhlIGRhdGEuCisgICAgICAgICAqIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaWtlcyBhdmFpbGFibGUgaW4gdGhlIHRhYmxlLiAgV2UgYXJlIGEgYml0CisgICAgICAgICAqIHBhcmFub2lkIHRoZXJlIGFuZCBkb24ndCB0cnVzdCB0aGUgZGF0YS4KICAgICAgICAgICovCiAgICAgICAgIGNvdW50ID0gKEZUX1VJbnQpbnVtX3N0cmlrZXM7CiAgICAgICAgIGlmICggOCArIDRVTCAqIGNvdW50ID4gdGFibGVfc2l6ZSApCkBAIC0zNDgsNyArMzQ3LDcgQEAKICAgICAgICAgICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3M6IgogICAgICAgICAgICAgICAgICAgICAgICAgIiBzYW5pdGl6aW5nIGludmFsaWQgYXNjZW5kZXIgYW5kIGRlc2NlbmRlclxuIgogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHZhbHVlcyBmb3Igc3RyaWtlICVkICglZHBwZW0sICVkcHBlbSlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIHZhbHVlcyBmb3Igc3RyaWtlICVsZCAoJWRwcGVtLCAlZHBwZW0pXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9wcGVtLCBtZXRyaWNzLT55X3BwZW0gKSk7CiAKQEAgLTEwMTQsOCArMTAxMyw4IEBACiAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9jb21wb25lbnRzOyBubisrICkKICAgICB7CiAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgRlRfQnl0ZSAgZHggICAgID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICBGVF9CeXRlICBkeSAgICAgPSBGVF9ORVhUX0JZVEUoIHAgKTsKKyAgICAgIEZUX0NoYXIgIGR4ICAgICA9IEZUX05FWFRfQ0hBUiggcCApOworICAgICAgRlRfQ2hhciAgZHkgICAgID0gRlRfTkVYVF9DSEFSKCBwICk7CiAKIAogICAgICAgLyogTkI6IGEgcmVjdXJzaXZlIGNhbGwgKi8KZGlmZiAtLWdpdCBhL3NyYy9zZm50L3R0c2JpdC5oIGIvc3JjL3NmbnQvdHRzYml0LmgKaW5kZXggY2UyYWYzYy4uYjg2N2U0MyAxMDA2NDQKLS0tIGEvc3JjL3NmbnQvdHRzYml0LmgKKysrIGIvc3JjL3NmbnQvdHRzYml0LmgKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c2JpdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0c2JpdC5oCisgKgorICogICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUVFNCSVRfSF8KICNkZWZpbmUgVFRTQklUX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAidHRsb2FkLmgiCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvd29mZjJ0YWdzLmMgYi9zcmMvc2ZudC93b2ZmMnRhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDlmMmU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvd29mZjJ0YWdzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogd29mZjJ0YWdzLmMKKyAqCisgKiAgIFdPRkYyIEZvbnQgdGFibGUgdGFncyAoYmFzZSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgYnkKKyAqIE5pa2hpbCBSYW1ha3Jpc2huYW4sIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSAid29mZjJ0YWdzLmgiCisKKyAgLyoKKyAgICogUmV0dXJuIHRhZyBmcm9tIGluZGV4IGluIHRoZSBvcmRlciBnaXZlbiBpbiBXT0ZGMiBzcGVjaWZpY2F0aW9uLgorICAgKgorICAgKiBTZWUKKyAgICoKKyAgICogICAgICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL1dPRkYyLyN0YWJsZV9kaXJfZm9ybWF0CisgICAqCisgICAqIGZvciBkZXRhaWxzLgorICAgKi8KKyAgRlRfTE9DQUxfREVGKCBGVF9VTG9uZyApCisgIHdvZmYyX2tub3duX3RhZ3MoIEZUX0J5dGUgIGluZGV4ICkKKyAgeworICAgIGNvbnN0IEZUX1VMb25nICBrbm93bl90YWdzWzYzXSA9CisgICAgeworICAgICAgRlRfTUFLRV9UQUcoJ2MnLCAnbScsICdhJywgJ3AnKSwgIC8qICAwICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2gnLCAnZScsICdhJywgJ2QnKSwgIC8qICAxICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2gnLCAnaCcsICdlJywgJ2EnKSwgIC8qICAyICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2gnLCAnbScsICd0JywgJ3gnKSwgIC8qICAzICAqLworICAgICAgRlRfTUFLRV9UQUcoJ20nLCAnYScsICd4JywgJ3AnKSwgIC8qICA0ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ24nLCAnYScsICdtJywgJ2UnKSwgIC8qICA1ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ08nLCAnUycsICcvJywgJzInKSwgIC8qICA2ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ3AnLCAnbycsICdzJywgJ3QnKSwgIC8qICA3ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2MnLCAndicsICd0JywgJyAnKSwgIC8qICA4ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2YnLCAncCcsICdnJywgJ20nKSwgIC8qICA5ICAqLworICAgICAgRlRfTUFLRV9UQUcoJ2cnLCAnbCcsICd5JywgJ2YnKSwgIC8qICAxMCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2wnLCAnbycsICdjJywgJ2EnKSwgIC8qICAxMSAqLworICAgICAgRlRfTUFLRV9UQUcoJ3AnLCAncicsICdlJywgJ3AnKSwgIC8qICAxMiAqLworICAgICAgRlRfTUFLRV9UQUcoJ0MnLCAnRicsICdGJywgJyAnKSwgIC8qICAxMyAqLworICAgICAgRlRfTUFLRV9UQUcoJ1YnLCAnTycsICdSJywgJ0cnKSwgIC8qICAxNCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0UnLCAnQicsICdEJywgJ1QnKSwgIC8qICAxNSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0UnLCAnQicsICdMJywgJ0MnKSwgIC8qICAxNiAqLworICAgICAgRlRfTUFLRV9UQUcoJ2cnLCAnYScsICdzJywgJ3AnKSwgIC8qICAxNyAqLworICAgICAgRlRfTUFLRV9UQUcoJ2gnLCAnZCcsICdtJywgJ3gnKSwgIC8qICAxOCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2snLCAnZScsICdyJywgJ24nKSwgIC8qICAxOSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0wnLCAnVCcsICdTJywgJ0gnKSwgIC8qICAyMCAqLworICAgICAgRlRfTUFLRV9UQUcoJ1AnLCAnQycsICdMJywgJ1QnKSwgIC8qICAyMSAqLworICAgICAgRlRfTUFLRV9UQUcoJ1YnLCAnRCcsICdNJywgJ1gnKSwgIC8qICAyMiAqLworICAgICAgRlRfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwgIC8qICAyMyAqLworICAgICAgRlRfTUFLRV9UQUcoJ3YnLCAnbScsICd0JywgJ3gnKSwgIC8qICAyNCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0InLCAnQScsICdTJywgJ0UnKSwgIC8qICAyNSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0cnLCAnRCcsICdFJywgJ0YnKSwgIC8qICAyNiAqLworICAgICAgRlRfTUFLRV9UQUcoJ0cnLCAnUCcsICdPJywgJ1MnKSwgIC8qICAyNyAqLworICAgICAgRlRfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwgIC8qICAyOCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0UnLCAnQicsICdTJywgJ0MnKSwgIC8qICAyOSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0onLCAnUycsICdUJywgJ0YnKSwgIC8qICAzMCAqLworICAgICAgRlRfTUFLRV9UQUcoJ00nLCAnQScsICdUJywgJ0gnKSwgIC8qICAzMSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0MnLCAnQicsICdEJywgJ1QnKSwgIC8qICAzMiAqLworICAgICAgRlRfTUFLRV9UQUcoJ0MnLCAnQicsICdMJywgJ0MnKSwgIC8qICAzMyAqLworICAgICAgRlRfTUFLRV9UQUcoJ0MnLCAnTycsICdMJywgJ1InKSwgIC8qICAzNCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0MnLCAnUCcsICdBJywgJ0wnKSwgIC8qICAzNSAqLworICAgICAgRlRfTUFLRV9UQUcoJ1MnLCAnVicsICdHJywgJyAnKSwgIC8qICAzNiAqLworICAgICAgRlRfTUFLRV9UQUcoJ3MnLCAnYicsICdpJywgJ3gnKSwgIC8qICAzNyAqLworICAgICAgRlRfTUFLRV9UQUcoJ2EnLCAnYycsICduJywgJ3QnKSwgIC8qICAzOCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2EnLCAndicsICdhJywgJ3InKSwgIC8qICAzOSAqLworICAgICAgRlRfTUFLRV9UQUcoJ2InLCAnZCcsICdhJywgJ3QnKSwgIC8qICA0MCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2InLCAnbCcsICdvJywgJ2MnKSwgIC8qICA0MSAqLworICAgICAgRlRfTUFLRV9UQUcoJ2InLCAncycsICdsJywgJ24nKSwgIC8qICA0MiAqLworICAgICAgRlRfTUFLRV9UQUcoJ2MnLCAndicsICdhJywgJ3InKSwgIC8qICA0MyAqLworICAgICAgRlRfTUFLRV9UQUcoJ2YnLCAnZCcsICdzJywgJ2MnKSwgIC8qICA0NCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2YnLCAnZScsICdhJywgJ3QnKSwgIC8qICA0NSAqLworICAgICAgRlRfTUFLRV9UQUcoJ2YnLCAnbScsICd0JywgJ3gnKSwgIC8qICA0NiAqLworICAgICAgRlRfTUFLRV9UQUcoJ2YnLCAndicsICdhJywgJ3InKSwgIC8qICA0NyAqLworICAgICAgRlRfTUFLRV9UQUcoJ2cnLCAndicsICdhJywgJ3InKSwgIC8qICA0OCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2gnLCAncycsICd0JywgJ3knKSwgIC8qICA0OSAqLworICAgICAgRlRfTUFLRV9UQUcoJ2onLCAndScsICdzJywgJ3QnKSwgIC8qICA1MCAqLworICAgICAgRlRfTUFLRV9UQUcoJ2wnLCAnYycsICdhJywgJ3InKSwgIC8qICA1MSAqLworICAgICAgRlRfTUFLRV9UQUcoJ20nLCAnbycsICdyJywgJ3QnKSwgIC8qICA1MiAqLworICAgICAgRlRfTUFLRV9UQUcoJ20nLCAnbycsICdyJywgJ3gnKSwgIC8qICA1MyAqLworICAgICAgRlRfTUFLRV9UQUcoJ28nLCAncCcsICdiJywgJ2QnKSwgIC8qICA1NCAqLworICAgICAgRlRfTUFLRV9UQUcoJ3AnLCAncicsICdvJywgJ3AnKSwgIC8qICA1NSAqLworICAgICAgRlRfTUFLRV9UQUcoJ3QnLCAncicsICdhJywgJ2snKSwgIC8qICA1NiAqLworICAgICAgRlRfTUFLRV9UQUcoJ1onLCAnYScsICdwJywgJ2YnKSwgIC8qICA1NyAqLworICAgICAgRlRfTUFLRV9UQUcoJ1MnLCAnaScsICdsJywgJ2YnKSwgIC8qICA1OCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0cnLCAnbCcsICdhJywgJ3QnKSwgIC8qICA1OSAqLworICAgICAgRlRfTUFLRV9UQUcoJ0cnLCAnbCcsICdvJywgJ2MnKSwgIC8qICA2MCAqLworICAgICAgRlRfTUFLRV9UQUcoJ0YnLCAnZScsICdhJywgJ3QnKSwgIC8qICA2MSAqLworICAgICAgRlRfTUFLRV9UQUcoJ1MnLCAnaScsICdsJywgJ2wnKSwgIC8qICA2MiAqLworICAgIH07CisKKworICAgIGlmICggaW5kZXggPiA2MiApCisgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBrbm93bl90YWdzW2luZGV4XTsKKyAgfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3NmbnQvd29mZjJ0YWdzLmggYi9zcmMvc2ZudC93b2ZmMnRhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM3Yzc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3NmbnQvd29mZjJ0YWdzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB3b2ZmMnRhZ3MuaAorICoKKyAqICAgV09GRkYyIEZvbnQgdGFibGUgdGFncyAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE5LTIwMjAgYnkKKyAqIE5pa2hpbCBSYW1ha3Jpc2huYW4sIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KKworCisjaWZuZGVmIFdPRkYyVEFHU19ICisjZGVmaW5lIFdPRkYyVEFHU19ICisKKworI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NvbXBpbGVyLW1hY3Jvcy5oPgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisKKyAgRlRfTE9DQUwoIEZUX1VMb25nICkKKyAgd29mZjJfa25vd25fdGFncyggRlRfQnl0ZSAgaW5kZXggKTsKKworCitGVF9FTkRfSEVBREVSCisKKyNlbmRpZiAvKiBXT0ZGMlRBR1NfSCAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9KYW1maWxlIGIvc3JjL3Ntb290aC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU3ZDVlLi4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvc21vb3RoIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxOCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBzbW9vdGggOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0Z3JheXMKLSAgICAgICAgICAgICAgIGZ0c21vb3RoCi0gICAgICAgICAgICAgICBmdHNwaWMKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHNtb290aCA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9zbW9vdGggSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9mdGdyYXlzLmMgYi9zcmMvc21vb3RoL2Z0Z3JheXMuYwppbmRleCA4MDNhMTllLi42ODE5MDBmIDEwMDY0NAotLS0gYS9zcmMvc21vb3RoL2Z0Z3JheXMuYworKysgYi9zcmMvc21vb3RoL2Z0Z3JheXMuYwpAQCAtMSw5NCArMSwxMDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3JheXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBIG5ldyBgcGVyZmVjdCcgYW50aS1hbGlhc2luZyByZW5kZXJlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0Z3JheXMuYworICoKKyAqICAgQSBuZXcgYHBlcmZlY3QnIGFudGktYWxpYXNpbmcgcmVuZGVyZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgdGhlIHJlc3Qgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZSwgYnkgKi8KLSAgLyogZGVmaW5pbmcgdGhlIFNUQU5EQUxPTkVfIG1hY3JvIHdoZW4gY29tcGlsaW5nIGl0LiAgWW91IGFsc28gbmVlZCB0byAgICovCi0gIC8qIHB1dCB0aGUgZmlsZXMgYGZ0Z3JheXMuaCcgYW5kIGBmdGltYWdlLmgnIGludG8gdGhlIGN1cnJlbnQgICAgICAgICAgICAqLwotICAvKiBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBUeXBpY2FsbHksIHlvdSBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgc3JjL3Ntb290aC9mdGdyYXlzLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCcgYW5kIGBzcmMvc21vb3RoL2Z0Z3JheXMuaCcgdG8gdGhlICovCi0gIC8qICAgc2FtZSBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb21waWxlIGBmdGdyYXlzJyB3aXRoIHRoZSBTVEFOREFMT05FXyBtYWNybyBkZWZpbmVkLCBhcyBpbiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY2MgLWMgLURTVEFOREFMT05FXyBmdGdyYXlzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSByZW5kZXJlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgZnRfZ3JheV9yYXN0ZXIucmFzdGVyX25ldyc7IGFuIGFudGktYWxpYXNlZCBiaXRtYXAgY2FuIGJlIGdlbmVyYXRlZCAgKi8KLSAgLyogd2l0aCBhIGNhbGwgdG8gYGZ0X2dyYXlfcmFzdGVyLnJhc3Rlcl9yZW5kZXInLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGluIHRoZSBmaWxlIGBmdGltYWdlLmgnIGZvciBtb3JlICAgKi8KLSAgLyogZGV0YWlscyBvbiBob3cgdGhlIHJhc3RlciB3b3Jrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLCBieQorICAgKiBkZWZpbmluZyB0aGUgU1RBTkRBTE9ORV8gbWFjcm8gd2hlbiBjb21waWxpbmcgaXQuICBZb3UgYWxzbyBuZWVkIHRvCisgICAqIHB1dCB0aGUgZmlsZXMgYGZ0Z3JheXMuaCcgYW5kIGBmdGltYWdlLmgnIGludG8gdGhlIGN1cnJlbnQKKyAgICogY29tcGlsYXRpb24gZGlyZWN0b3J5LiAgVHlwaWNhbGx5LCB5b3UgY291bGQgZG8gc29tZXRoaW5nIGxpa2UKKyAgICoKKyAgICogLSBjb3B5IGBzcmMvc21vb3RoL2Z0Z3JheXMuYycgKHRoaXMgZmlsZSkgdG8geW91ciBjdXJyZW50IGRpcmVjdG9yeQorICAgKgorICAgKiAtIGNvcHkgYGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9zbW9vdGgvZnRncmF5cy5oJyB0byB0aGUKKyAgICogICBzYW1lIGRpcmVjdG9yeQorICAgKgorICAgKiAtIGNvbXBpbGUgYGZ0Z3JheXMnIHdpdGggdGhlIFNUQU5EQUxPTkVfIG1hY3JvIGRlZmluZWQsIGFzIGluCisgICAqCisgICAqICAgICBjYyAtYyAtRFNUQU5EQUxPTkVfIGZ0Z3JheXMuYworICAgKgorICAgKiBUaGUgcmVuZGVyZXIgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYSBjYWxsIHRvCisgICAqIGBmdF9ncmF5X3Jhc3Rlci5yYXN0ZXJfbmV3JzsgYW4gYW50aS1hbGlhc2VkIGJpdG1hcCBjYW4gYmUgZ2VuZXJhdGVkCisgICAqIHdpdGggYSBjYWxsIHRvIGBmdF9ncmF5X3Jhc3Rlci5yYXN0ZXJfcmVuZGVyJy4KKyAgICoKKyAgICogU2VlIHRoZSBjb21tZW50cyBhbmQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZmlsZSBgZnRpbWFnZS5oJyBmb3IgbW9yZQorICAgKiBkZXRhaWxzIG9uIGhvdyB0aGUgcmFzdGVyIHdvcmtzLgorICAgKgorICAgKi8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgYSBuZXcgYW50aS1hbGlhc2luZyBzY2FuLWNvbnZlcnRlciBmb3IgRnJlZVR5cGUgMi4gIFRoZSAgICAgICAqLwotICAvKiBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIF92ZXJ5XyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIHRoZSBzdGFuZGFyZCAgKi8KLSAgLyogYGZ0cmFzdGVyJyBtb2R1bGUuICBBY3R1YWxseSwgYGZ0Z3JheXMnIGNvbXB1dGVzIHRoZSBfZXhhY3RfICAgICAgICAgICovCi0gIC8qIGNvdmVyYWdlIG9mIHRoZSBvdXRsaW5lIG9uIGVhY2ggcGl4ZWwgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgYmFzZWQgb24gaWRlYXMgdGhhdCBJIGluaXRpYWxseSBmb3VuZCBpbiBSYXBoIExldmllbidzICAgICAgICAgICovCi0gIC8qIGV4Y2VsbGVudCBMaWJBcnQgZ3JhcGhpY3MgbGlicmFyeSAoc2VlIGh0dHA6Ly93d3cubGV2aWVuLmNvbS9saWJhcnQgICAqLwotICAvKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhvdWdoIHRoZSB3ZWIgcGFnZXMgZG8gbm90IHRlbGwgYW55dGhpbmcgICAgICAgKi8KLSAgLyogYWJvdXQgdGhlIHJlbmRlcmVyOyB5b3UnbGwgaGF2ZSB0byBkaXZlIGludG8gdGhlIHNvdXJjZSBjb2RlIHRvICAgICAgICovCi0gIC8qIHVuZGVyc3RhbmQgaG93IGl0IHdvcmtzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGlzIGlzIGEgX3ZlcnlfIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiAgICAgICAgICovCi0gIC8qIGNvbXBhcmVkIHRvIFJhcGgncy4gIENvdmVyYWdlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIHZlcnkgICAgICAgICAqLwotICAvKiBkaWZmZXJlbnQgd2F5LCBhbmQgSSBkb24ndCB1c2Ugc29ydGVkIHZlY3RvciBwYXRocy4gIEFsc28sIGl0IGRvZXNuJ3QgKi8KLSAgLyogdXNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlbmRlcmVyIGhhcyB0aGUgZm9sbG93aW5nIGFkdmFudGFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgZG9lc24ndCBuZWVkIGFuIGludGVybWVkaWF0ZSBiaXRtYXAuICBJbnN0ZWFkLCBvbmUgY2FuIHN1cHBseSBhICAqLwotICAvKiAgIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIHRvIGRyYXcgZ3JheSAgKi8KLSAgLyogICBzcGFucyBvbiBhbnkgdGFyZ2V0IHN1cmZhY2UuICBZb3UgY2FuIHRodXMgZG8gZGlyZWN0IGNvbXBvc2l0aW9uIG9uICovCi0gIC8qICAgYW55IGtpbmQgb2YgYml0bWFwLCBwcm92aWRlZCB0aGF0IHlvdSBnaXZlIHRoZSByZW5kZXJlciB0aGUgcmlnaHQgICAqLwotICAvKiAgIGNhbGxiYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gQSBwZXJmZWN0IGFudGktYWxpYXNlciwgaS5lLiwgaXQgY29tcHV0ZXMgdGhlIF9leGFjdF8gY292ZXJhZ2Ugb24gICAqLwotICAvKiAgIGVhY2ggcGl4ZWwgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgcGVyZm9ybXMgYSBzaW5nbGUgcGFzcyBvbiB0aGUgb3V0bGluZSAodGhlIGBzdGFuZGFyZCcgRlQyICAgICAgICAqLwotICAvKiAgIHJlbmRlcmVyIG1ha2VzIHR3byBwYXNzZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgY2FuIGVhc2lseSBiZSBtb2RpZmllZCB0byByZW5kZXIgdG8gX2FueV8gbnVtYmVyIG9mIGdyYXkgbGV2ZWxzICAqLwotICAvKiAgIGNoZWFwbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gRm9yIHNtYWxsICg8IDIwKSBwaXhlbCBzaXplcywgaXQgaXMgZmFzdGVyIHRoYW4gdGhlIHN0YW5kYXJkICAgICAgICAqLwotICAvKiAgIHJlbmRlcmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBpcyBhIG5ldyBhbnRpLWFsaWFzaW5nIHNjYW4tY29udmVydGVyIGZvciBGcmVlVHlwZSAyLiAgVGhlCisgICAqIGFsZ29yaXRobSB1c2VkIGhlcmUgaXMgX3ZlcnlfIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgaW4gdGhlIHN0YW5kYXJkCisgICAqIGBmdHJhc3RlcicgbW9kdWxlLiAgQWN0dWFsbHksIGBmdGdyYXlzJyBjb21wdXRlcyB0aGUgX2V4YWN0XworICAgKiBjb3ZlcmFnZSBvZiB0aGUgb3V0bGluZSBvbiBlYWNoIHBpeGVsIGNlbGwgYnkgc3RyYWlnaHQgc2VnbWVudHMuCisgICAqCisgICAqIEl0IGlzIGJhc2VkIG9uIGlkZWFzIHRoYXQgSSBpbml0aWFsbHkgZm91bmQgaW4gUmFwaCBMZXZpZW4ncworICAgKiBleGNlbGxlbnQgTGliQXJ0IGdyYXBoaWNzIGxpYnJhcnkgKHNlZSBodHRwczovL3d3dy5sZXZpZW4uY29tL2xpYmFydAorICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhvdWdoIHRoZSB3ZWIgcGFnZXMgZG8gbm90IHRlbGwgYW55dGhpbmcKKyAgICogYWJvdXQgdGhlIHJlbmRlcmVyOyB5b3UnbGwgaGF2ZSB0byBkaXZlIGludG8gdGhlIHNvdXJjZSBjb2RlIHRvCisgICAqIHVuZGVyc3RhbmQgaG93IGl0IHdvcmtzKS4KKyAgICoKKyAgICogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGlzIGlzIGEgX3ZlcnlfIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgorICAgKiBjb21wYXJlZCB0byBSYXBoJ3MuICBDb3ZlcmFnZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSB2ZXJ5CisgICAqIGRpZmZlcmVudCB3YXksIGFuZCBJIGRvbid0IHVzZSBzb3J0ZWQgdmVjdG9yIHBhdGhzLiAgQWxzbywgaXQgZG9lc24ndAorICAgKiB1c2UgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLgorICAgKgorICAgKiBCw6l6aWVyIHNlZ21lbnRzIGFyZSBmbGF0dGVuZWQgYnkgc3BsaXR0aW5nIHRoZW0gdW50aWwgdGhlaXIgZGV2aWF0aW9uCisgICAqIGZyb20gc3RyYWlnaHQgbGluZSBiZWNvbWVzIG11Y2ggc21hbGxlciB0aGFuIGEgcGl4ZWwuICBUaGVyZWZvcmUsIHRoZQorICAgKiBwaXhlbCBjb3ZlcmFnZSBieSBhIELDqXppZXIgY3VydmUgaXMgY2FsY3VsYXRlZCBhcHByb3hpbWF0ZWx5LiAgVG8KKyAgICogZXN0aW1hdGUgdGhlIGRldmlhdGlvbiwgd2UgdXNlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjb250cm9sIHBvaW50CisgICAqIHRvIHRoZSBjb25pYyBjaG9yZCBjZW50cmUgb3IgdGhlIGN1YmljIGNob3JkIHRyaXNlY3Rpb24uICBUaGVzZQorICAgKiBkaXN0YW5jZXMgdmFuaXNoIGZhc3QgYWZ0ZXIgZWFjaCBzcGxpdC4gIEluIHRoZSBjb25pYyBjYXNlLCB0aGV5IHZhbmlzaAorICAgKiBwcmVkaWN0YWJseSBhbmQgdGhlIG51bWJlciBvZiBuZWNlc3Nhcnkgc3BsaXRzIGNhbiBiZSBjYWxjdWxhdGVkLgorICAgKgorICAgKiBUaGlzIHJlbmRlcmVyIGhhcyB0aGUgZm9sbG93aW5nIGFkdmFudGFnZXM6CisgICAqCisgICAqIC0gSXQgZG9lc24ndCBuZWVkIGFuIGludGVybWVkaWF0ZSBiaXRtYXAuICBJbnN0ZWFkLCBvbmUgY2FuIHN1cHBseSBhCisgICAqICAgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgcmVuZGVyZXIgdG8gZHJhdyBncmF5CisgICAqICAgc3BhbnMgb24gYW55IHRhcmdldCBzdXJmYWNlLiAgWW91IGNhbiB0aHVzIGRvIGRpcmVjdCBjb21wb3NpdGlvbiBvbgorICAgKiAgIGFueSBraW5kIG9mIGJpdG1hcCwgcHJvdmlkZWQgdGhhdCB5b3UgZ2l2ZSB0aGUgcmVuZGVyZXIgdGhlIHJpZ2h0CisgICAqICAgY2FsbGJhY2suCisgICAqCisgICAqIC0gQSBwZXJmZWN0IGFudGktYWxpYXNlciwgaS5lLiwgaXQgY29tcHV0ZXMgdGhlIF9leGFjdF8gY292ZXJhZ2Ugb24KKyAgICogICBlYWNoIHBpeGVsIGNlbGwgYnkgc3RyYWlnaHQgc2VnbWVudHMuCisgICAqCisgICAqIC0gSXQgcGVyZm9ybXMgYSBzaW5nbGUgcGFzcyBvbiB0aGUgb3V0bGluZSAodGhlIGBzdGFuZGFyZCcgRlQyCisgICAqICAgcmVuZGVyZXIgbWFrZXMgdHdvIHBhc3NlcykuCisgICAqCisgICAqIC0gSXQgY2FuIGVhc2lseSBiZSBtb2RpZmllZCB0byByZW5kZXIgdG8gX2FueV8gbnVtYmVyIG9mIGdyYXkgbGV2ZWxzCisgICAqICAgY2hlYXBseS4KKyAgICoKKyAgICogLSBGb3Igc21hbGwgKDwgODApIHBpeGVsIHNpemVzLCBpdCBpcyBmYXN0ZXIgdGhhbiB0aGUgc3RhbmRhcmQKKyAgICogICByZW5kZXJlci4KKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc21vb3RoCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgc21vb3RoCiAKIAogI2lmZGVmIFNUQU5EQUxPTkVfCkBAIC0xMTIsOSArMTIwLDkgQEAKIAogCiAgIC8qCi0gICAqICBBcHByb3hpbWF0ZSBzcXJ0KHgqeCt5KnkpIHVzaW5nIHRoZSBgYWxwaGEgbWF4IHBsdXMgYmV0YSBtaW4nCi0gICAqICBhbGdvcml0aG0uICBXZSB1c2UgYWxwaGEgPSAxLCBiZXRhID0gMy84LCBnaXZpbmcgdXMgcmVzdWx0cyB3aXRoIGEKLSAgICogIGxhcmdlc3QgZXJyb3IgbGVzcyB0aGFuIDclIGNvbXBhcmVkIHRvIHRoZSBleGFjdCB2YWx1ZS4KKyAgICogQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJworICAgKiBhbGdvcml0aG0uICBXZSB1c2UgYWxwaGEgPSAxLCBiZXRhID0gMy84LCBnaXZpbmcgdXMgcmVzdWx0cyB3aXRoIGEKKyAgICogbGFyZ2VzdCBlcnJvciBsZXNzIHRoYW4gNyUgY29tcGFyZWQgdG8gdGhlIGV4YWN0IHZhbHVlLgogICAgKi8KICNkZWZpbmUgRlRfSFlQT1QoIHgsIHkgKSAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICggeCA9IEZUX0FCUyggeCApLCAgICAgICAgICAgICBcCkBAIC0yMjIsMTAgKzIzMCwxMCBAQAogI2VuZGlmCiAKICNkZWZpbmUgRlRfVEhST1coIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBGVF9UaHJvdyggRlRfRVJSX0NBVCggRXJyUmFzdGVyLCBlICksICAgXAorICAgICAgICAgICggRlRfVGhyb3coIEZUX0VSUl9DQVQoIEVyclJhc3Rlcl8sIGUgKSwgIFwKICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18gKSAgICAgICAgICAgICAgICAgIHwgXAotICAgICAgICAgICAgRlRfRVJSX0NBVCggRXJyUmFzdGVyLCBlICkgICAgICAgICAgICApCisgICAgICAgICAgICBGVF9FUlJfQ0FUKCBFcnJSYXN0ZXJfLCBlICkgICAgICAgICAgICkKIAogI2Vsc2UgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCiAKQEAgLTI3MCwxNyArMjc4LDE0IEBACiAjZWxzZSAvKiAhU1RBTkRBTE9ORV8gKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJmdGdyYXlzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KIAogI2luY2x1ZGUgImZ0c21lcnJzLmgiCiAKLSNpbmNsdWRlICJmdHNwaWMuaCIKLQogI2RlZmluZSBTbW9vdGhfRXJyX0ludmFsaWRfTW9kZSAgICAgU21vb3RoX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoCiAjZGVmaW5lIFNtb290aF9FcnJfTWVtb3J5X092ZXJmbG93ICBTbW9vdGhfRXJyX091dF9PZl9NZW1vcnkKICNkZWZpbmUgRXJyUmFzdGVyX01lbW9yeV9PdmVyZmxvdyAgIFNtb290aF9FcnJfT3V0X09mX01lbW9yeQpAQCAtMzI5LDE3ICszMzQsOSBAQAogICAvKiBtdXN0IGJlIGF0IGxlYXN0IDYgYml0cyEgKi8KICNkZWZpbmUgUElYRUxfQklUUyAgOAogCi0jdW5kZWYgRkxPT1IKLSN1bmRlZiBDRUlMSU5HCi0jdW5kZWYgVFJVTkMKLSN1bmRlZiBTQ0FMRUQKLQogI2RlZmluZSBPTkVfUElYRUwgICAgICAgKCAxIDw8IFBJWEVMX0JJVFMgKQotI2RlZmluZSBUUlVOQyggeCApICAgICAgKCAoVENvb3JkKSggKHgpID4+IFBJWEVMX0JJVFMgKSApCi0jZGVmaW5lIFNVQlBJWEVMUyggeCApICAoIChUUG9zKSh4KSAqIE9ORV9QSVhFTCApCi0jZGVmaW5lIEZMT09SKCB4ICkgICAgICAoICh4KSAmIC1PTkVfUElYRUwgKQotI2RlZmluZSBDRUlMSU5HKCB4ICkgICAgKCAoICh4KSArIE9ORV9QSVhFTCAtIDEgKSAmIC1PTkVfUElYRUwgKQotI2RlZmluZSBST1VORCggeCApICAgICAgKCAoICh4KSArIE9ORV9QSVhFTCAvIDIgKSAmIC1PTkVfUElYRUwgKQorI2RlZmluZSBUUlVOQyggeCApICAgICAgKFRDb29yZCkoICh4KSA+PiBQSVhFTF9CSVRTICkKKyNkZWZpbmUgRlJBQ1QoIHggKSAgICAgIChUQ29vcmQpKCAoeCkgJiAoIE9ORV9QSVhFTCAtIDEgKSApCiAKICNpZiBQSVhFTF9CSVRTID49IDYKICNkZWZpbmUgVVBTQ0FMRSggeCApICAgICggKHgpICogKCBPTkVfUElYRUwgPj4gNiApICkKQEAgLTM5MCwxNSArMzg3LDE1IEBACiAjZGVmaW5lIEZUX1VESVZQUkVQKCBjLCBiICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBsb25nICBiICMjIF9yID0gYyA/IChsb25nKSggRlRfVUxPTkdfTUFYID4+IFBJWEVMX0JJVFMgKSAvICggYiApIFwKICAgICAgICAgICAgICAgICAgICAgOiAwCi0jZGVmaW5lIEZUX1VESVYoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICggKCAodW5zaWduZWQgbG9uZykoIGEgKSAqICh1bnNpZ25lZCBsb25nKSggYiAjIyBfciApICkgPj4gICBcCi0gICAgKCBzaXplb2YoIGxvbmcgKSAqIEZUX0NIQVJfQklUIC0gUElYRUxfQklUUyApICkKKyNkZWZpbmUgRlRfVURJViggYSwgYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVENvb3JkKSggKCAodW5zaWduZWQgbG9uZykoIGEgKSAqICh1bnNpZ25lZCBsb25nKSggYiAjIyBfciApICkgPj4gICBcCisgICAgICAgICAgICAoIHNpemVvZiggbG9uZyApICogRlRfQ0hBUl9CSVQgLSBQSVhFTF9CSVRTICkgKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUWVBFIERFRklOSVRJT05TCisgICAqLwogCiAgIC8qIGRvbid0IGNoYW5nZSB0aGUgZm9sbG93aW5nIHR5cGVzIHRvIEZUX0ludCBvciBGVF9Qb3MsIHNpbmNlIHdlIG1pZ2h0ICovCiAgIC8qIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8gImZsb2F0IiBvciAiZG91YmxlIiB3aGVuIGV4cGVyaW1lbnRpbmcgd2l0aCAgICovCkBAIC00MzQsNiArNDMxLDkgQEAKICNkZWZpbmUgRlRfTUFYX0dSQVlfUE9PTCAgKCAyMDQ4IC8gc2l6ZW9mICggVENlbGwgKSApCiAjZW5kaWYKIAorICAvKiBGVF9TcGFuIGJ1ZmZlciBzaXplIGZvciBkaXJlY3QgcmVuZGVyaW5nIG9ubHkgKi8KKyNkZWZpbmUgRlRfTUFYX0dSQVlfU1BBTlMgIDEwCisKIAogI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgICAgICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwogICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBzdHJ1Y3R1cmUgd2FzIHBhZGRlZCBkdWUgdG8gICAqLwpAQCAtNDY3LDYgKzQ2Nyw4IEBACiAKICAgICBGVF9SYXN0ZXJfU3Bhbl9GdW5jICByZW5kZXJfc3BhbjsKICAgICB2b2lkKiAgICAgICAgICAgICAgICByZW5kZXJfc3Bhbl9kYXRhOworICAgIEZUX1NwYW4gICAgICAgICAgICAgIHNwYW5zW0ZUX01BWF9HUkFZX1NQQU5TXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBudW1fc3BhbnM7CiAKICAgfSBncmF5X1RXb3JrZXIsICpncmF5X1BXb3JrZXI7CiAKQEAgLTUxNiwxMCArNTE4LDEwIEBACiAjZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVjb3JkIHRoZSBjdXJyZW50IGNlbGwgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUmVjb3JkIHRoZSBjdXJyZW50IGNlbGwgaW4gdGhlIGxpbmtlZCBsaXN0LgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX0FSRyApCiAgIHsKQEAgLTUyOCwxMCArNTMwLDkgQEAKIAogCiAgICAgcGNlbGwgPSAmcmFzLnljZWxsc1tyYXMuZXkgLSByYXMubWluX2V5XTsKLSAgICBmb3IgKDs7KQorICAgIHdoaWxlICggKCBjZWxsID0gKnBjZWxsICkgKQogICAgIHsKLSAgICAgIGNlbGwgPSAqcGNlbGw7Ci0gICAgICBpZiAoICFjZWxsIHx8IGNlbGwtPnggPiB4ICkKKyAgICAgIGlmICggY2VsbC0+eCA+IHggKQogICAgICAgICBicmVhazsKIAogICAgICAgaWYgKCBjZWxsLT54ID09IHggKQpAQCAtNTYxLDEwICs1NjIsMTAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZXQgdGhlIGN1cnJlbnQgY2VsbCB0byBhIG5ldyBwb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTZXQgdGhlIGN1cnJlbnQgY2VsbCB0byBhIG5ldyBwb3NpdGlvbi4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIGdyYXlfc2V0X2NlbGwoIFJBU19BUkdfIFRDb29yZCAgZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb29yZCAgZXkgKQpAQCAtNTc5LDE2ICs1ODAsMTMgQEAKICAgICAvKiBOb3RlIHRoYXQgaWYgYSBjZWxsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBjbGlwcGluZyByZWdpb24sIGl0IGlzICAgICovCiAgICAgLyogYWN0dWFsbHkgc2V0IHRvIHRoZSAobWluX2V4LTEpIGhvcml6b250YWwgcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwogCi0gICAgaWYgKCBleCA8IHJhcy5taW5fZXggKQotICAgICAgZXggPSByYXMubWluX2V4IC0gMTsKLQogICAgIC8qIHJlY29yZCB0aGUgY3VycmVudCBvbmUgaWYgaXQgaXMgdmFsaWQgYW5kIHN1YnN0YW50aWFsICovCiAgICAgaWYgKCAhcmFzLmludmFsaWQgJiYgKCByYXMuYXJlYSB8fCByYXMuY292ZXIgKSApCiAgICAgICBncmF5X3JlY29yZF9jZWxsKCBSQVNfVkFSICk7CiAKICAgICByYXMuYXJlYSAgPSAwOwogICAgIHJhcy5jb3ZlciA9IDA7Ci0gICAgcmFzLmV4ICAgID0gZXg7CisgICAgcmFzLmV4ICAgID0gRlRfTUFYKCBleCwgcmFzLm1pbl9leCAtIDEgKTsKICAgICByYXMuZXkgICAgPSBleTsKIAogICAgIHJhcy5pbnZhbGlkID0gKCBleSA+PSByYXMubWF4X2V5IHx8IGV5IDwgcmFzLm1pbl9leSB8fApAQCAtNTk4LDEwICs1OTYsMTAgQEAKIAogI2lmbmRlZiBGVF9MT05HNjQKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlbmRlciBhIHNjYW5saW5lIGFzIG9uZSBvciBtb3JlIGNlbGxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJlbmRlciBhIHNjYW5saW5lIGFzIG9uZSBvciBtb3JlIGNlbGxzLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19BUkdfIFRDb29yZCAgZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICAgIHgxLApAQCAtNjI0LDggKzYyMiw4IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZngxICAgPSAoVENvb3JkKSggeDEgLSBTVUJQSVhFTFMoIGV4MSApICk7Ci0gICAgZngyICAgPSAoVENvb3JkKSggeDIgLSBTVUJQSVhFTFMoIGV4MiApICk7CisgICAgZngxICAgPSBGUkFDVCggeDEgKTsKKyAgICBmeDIgICA9IEZSQUNUKCB4MiApOwogCiAgICAgLyogZXZlcnl0aGluZyBpcyBsb2NhdGVkIGluIGEgc2luZ2xlIGNlbGwuICBUaGF0IGlzIGVhc3khICovCiAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NTIsNiArNjUwLDkgQEAKICAgICAgIGR4ICAgID0gLWR4OwogICAgIH0KIAorICAgIC8qIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgeS1kZWx0YSBpcyBtb2QvZHguIEl0IGlzIGVzc2VudGlhbCB0byAqLworICAgIC8qIGtlZXAgdHJhY2sgb2YgaXRzIGFjY3VtdWxhdGlvbiBmb3IgYWNjdXJhdGUgcmVuZGVyaW5nLiAgICAgICAqLworICAgIC8qIFhYWDogeS1kZWx0YSBhbmQgeC1kZWx0YSBiZWxvdyBzaG91bGQgYmUgcmVsYXRlZC4gICAgICAgICAgICAqLwogICAgIEZUX0RJVl9NT0QoIFRDb29yZCwgcCwgZHgsIGRlbHRhLCBtb2QgKTsKIAogICAgIHJhcy5hcmVhICArPSAoVEFyZWEpKCAoIGZ4MSArIGZpcnN0ICkgKiBkZWx0YSApOwpAQCAtNjk2LDEwICs2OTcsMTAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSZW5kZXIgYSBnaXZlbiBsaW5lIGFzIGEgc2VyaWVzIG9mIHNjYW5saW5lcy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBSZW5kZXIgYSBnaXZlbiBsaW5lIGFzIGEgc2VyaWVzIG9mIHNjYW5saW5lcy4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIGdyYXlfcmVuZGVyX2xpbmUoIFJBU19BUkdfIFRQb3MgIHRvX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgIHRvX3kgKQpAQCAtNzE3LDggKzcxOCw4IEBACiAgICAgICAgICAoIGV5MSA8ICByYXMubWluX2V5ICYmIGV5MiA8ICByYXMubWluX2V5ICkgKQogICAgICAgZ290byBFbmQ7CiAKLSAgICBmeTEgPSAoVENvb3JkKSggcmFzLnkgLSBTVUJQSVhFTFMoIGV5MSApICk7Ci0gICAgZnkyID0gKFRDb29yZCkoIHRvX3kgLSBTVUJQSVhFTFMoIGV5MiApICk7CisgICAgZnkxID0gRlJBQ1QoIHJhcy55ICk7CisgICAgZnkyID0gRlJBQ1QoIHRvX3kgKTsKIAogICAgIC8qIGV2ZXJ5dGhpbmcgaXMgb24gYSBzaW5nbGUgc2NhbmxpbmUgKi8KICAgICBpZiAoIGV5MSA9PSBleTIgKQpAQCAtNzM0LDcgKzczNSw3IEBACiAgICAgaWYgKCBkeCA9PSAwICkKICAgICB7CiAgICAgICBUQ29vcmQgIGV4ICAgICA9IFRSVU5DKCByYXMueCApOwotICAgICAgVENvb3JkICB0d29fZnggPSAoVENvb3JkKSggKCByYXMueCAtIFNVQlBJWEVMUyggZXggKSApIDw8IDEgKTsKKyAgICAgIFRDb29yZCAgdHdvX2Z4ID0gRlJBQ1QoIHJhcy54ICkgPDwgMTsKICAgICAgIFRBcmVhICAgYXJlYTsKIAogCkBAIC03ODksNiArNzkwLDggQEAKICAgICAgIGR5ICAgID0gLWR5OwogICAgIH0KIAorICAgIC8qIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgeC1kZWx0YSBpcyBtb2QvZHkuIEl0IGlzIGVzc2VudGlhbCB0byAqLworICAgIC8qIGtlZXAgdHJhY2sgb2YgaXRzIGFjY3VtdWxhdGlvbiBmb3IgYWNjdXJhdGUgcmVuZGVyaW5nLiAgICAgICAqLwogICAgIEZUX0RJVl9NT0QoIFRDb29yZCwgcCwgZHksIGRlbHRhLCBtb2QgKTsKIAogICAgIHggPSByYXMueCArIGRlbHRhOwpAQCAtODM3LDE2ICs4NDAsMTcgQEAKIAogI2Vsc2UKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlbmRlciBhIHN0cmFpZ2h0IGxpbmUgYWNyb3NzIG11bHRpcGxlIGNlbGxzIGluIGFueSBkaXJlY3Rpb24uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJlbmRlciBhIHN0cmFpZ2h0IGxpbmUgYWNyb3NzIG11bHRpcGxlIGNlbGxzIGluIGFueSBkaXJlY3Rpb24uCisgICAqLwogICBzdGF0aWMgdm9pZAogICBncmF5X3JlbmRlcl9saW5lKCBSQVNfQVJHXyBUUG9zICB0b194LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICB0b195ICkKICAgewotICAgIFRQb3MgICAgZHgsIGR5LCBmeDEsIGZ5MSwgZngyLCBmeTI7Ci0gICAgVENvb3JkICBleDEsIGV4MiwgZXkxLCBleTI7CisgICAgVFBvcyAgICBkeCwgZHk7CisgICAgVENvb3JkICBmeDEsIGZ5MSwgZngyLCBmeTI7CisgICAgVENvb3JkICBleDEsIGV5MSwgZXgyLCBleTI7CiAKIAogICAgIGV5MSA9IFRSVU5DKCByYXMueSApOwpAQCAtODYwLDggKzg2NCw4IEBACiAgICAgZXgxID0gVFJVTkMoIHJhcy54ICk7CiAgICAgZXgyID0gVFJVTkMoIHRvX3ggKTsKIAotICAgIGZ4MSA9IHJhcy54IC0gU1VCUElYRUxTKCBleDEgKTsKLSAgICBmeTEgPSByYXMueSAtIFNVQlBJWEVMUyggZXkxICk7CisgICAgZngxID0gRlJBQ1QoIHJhcy54ICk7CisgICAgZnkxID0gRlJBQ1QoIHJhcy55ICk7CiAKICAgICBkeCA9IHRvX3ggLSByYXMueDsKICAgICBkeSA9IHRvX3kgLSByYXMueTsKQEAgLTg3MCw4ICs4NzQsOCBAQAogICAgICAgOwogICAgIGVsc2UgaWYgKCBkeSA9PSAwICkgLyogZXgxICE9IGV4MiAqLyAgLyogYW55IGhvcml6b250YWwgbGluZSAqLwogICAgIHsKLSAgICAgIGV4MSA9IGV4MjsKLSAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkxICk7CisgICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBleDIsIGV5MiApOworICAgICAgZ290byBFbmQ7CiAgICAgfQogICAgIGVsc2UgaWYgKCBkeCA9PSAwICkKICAgICB7CkBAIC04OTgsNyArOTAyLDcgQEAKICAgICB9CiAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbnkgb3RoZXIgbGluZSAqLwogICAgIHsKLSAgICAgIFRQb3MgIHByb2QgPSBkeCAqIGZ5MSAtIGR5ICogZngxOworICAgICAgVFBvcyAgcHJvZCA9IGR4ICogKFRQb3MpZnkxIC0gZHkgKiAoVFBvcylmeDE7CiAgICAgICBGVF9VRElWUFJFUCggZXgxICE9IGV4MiwgZHggKTsKICAgICAgIEZUX1VESVZQUkVQKCBleTEgIT0gZXkyLCBkeSApOwogCkBAIC05MTIsNyArOTE2LDcgQEAKICAgICAgICAgICAgICAgICAgIHByb2QgLSBkeCAqIE9ORV9QSVhFTCAgICAgICAgICAgICAgICAgID4gIDAgKSAvKiBsZWZ0ICovCiAgICAgICAgIHsKICAgICAgICAgICBmeDIgPSAwOwotICAgICAgICAgIGZ5MiA9IChUUG9zKUZUX1VESVYoIC1wcm9kLCAtZHggKTsKKyAgICAgICAgICBmeTIgPSBGVF9VRElWKCAtcHJvZCwgLWR4ICk7CiAgICAgICAgICAgcHJvZCAtPSBkeSAqIE9ORV9QSVhFTDsKICAgICAgICAgICByYXMuY292ZXIgKz0gKCBmeTIgLSBmeTEgKTsKICAgICAgICAgICByYXMuYXJlYSAgKz0gKCBmeTIgLSBmeTEgKSAqICggZngxICsgZngyICk7CkBAIC05MjQsNyArOTI4LDcgQEAKICAgICAgICAgICAgICAgICAgIHByb2QgLSBkeCAqIE9ORV9QSVhFTCArIGR5ICogT05FX1BJWEVMID4gIDAgKSAvKiB1cCAqLwogICAgICAgICB7CiAgICAgICAgICAgcHJvZCAtPSBkeCAqIE9ORV9QSVhFTDsKLSAgICAgICAgICBmeDIgPSAoVFBvcylGVF9VRElWKCAtcHJvZCwgZHkgKTsKKyAgICAgICAgICBmeDIgPSBGVF9VRElWKCAtcHJvZCwgZHkgKTsKICAgICAgICAgICBmeTIgPSBPTkVfUElYRUw7CiAgICAgICAgICAgcmFzLmNvdmVyICs9ICggZnkyIC0gZnkxICk7CiAgICAgICAgICAgcmFzLmFyZWEgICs9ICggZnkyIC0gZnkxICkgKiAoIGZ4MSArIGZ4MiApOwpAQCAtOTM3LDcgKzk0MSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICBwcm9kICs9IGR5ICogT05FX1BJWEVMOwogICAgICAgICAgIGZ4MiA9IE9ORV9QSVhFTDsKLSAgICAgICAgICBmeTIgPSAoVFBvcylGVF9VRElWKCBwcm9kLCBkeCApOworICAgICAgICAgIGZ5MiA9IEZUX1VESVYoIHByb2QsIGR4ICk7CiAgICAgICAgICAgcmFzLmNvdmVyICs9ICggZnkyIC0gZnkxICk7CiAgICAgICAgICAgcmFzLmFyZWEgICs9ICggZnkyIC0gZnkxICkgKiAoIGZ4MSArIGZ4MiApOwogICAgICAgICAgIGZ4MSA9IDA7CkBAIC05NDcsNyArOTUxLDcgQEAKICAgICAgICAgZWxzZSAvKiAoIHByb2QgICAgICAgICAgICAgICAgICArIGR5ICogT05FX1BJWEVMIDwgIDAgJiYKICAgICAgICAgICAgICAgICAgIHByb2QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gIDAgKSAgICBkb3duICovCiAgICAgICAgIHsKLSAgICAgICAgICBmeDIgPSAoVFBvcylGVF9VRElWKCBwcm9kLCAtZHkgKTsKKyAgICAgICAgICBmeDIgPSBGVF9VRElWKCBwcm9kLCAtZHkgKTsKICAgICAgICAgICBmeTIgPSAwOwogICAgICAgICAgIHByb2QgKz0gZHggKiBPTkVfUElYRUw7CiAgICAgICAgICAgcmFzLmNvdmVyICs9ICggZnkyIC0gZnkxICk7CkBAIC05NjEsOCArOTY1LDggQEAKICAgICAgIH0gd2hpbGUgKCBleDEgIT0gZXgyIHx8IGV5MSAhPSBleTIgKTsKICAgICB9CiAKLSAgICBmeDIgPSB0b194IC0gU1VCUElYRUxTKCBleDIgKTsKLSAgICBmeTIgPSB0b195IC0gU1VCUElYRUxTKCBleTIgKTsKKyAgICBmeDIgPSBGUkFDVCggdG9feCApOworICAgIGZ5MiA9IEZSQUNUKCB0b195ICk7CiAKICAgICByYXMuY292ZXIgKz0gKCBmeTIgLSBmeTEgKTsKICAgICByYXMuYXJlYSAgKz0gKCBmeTIgLSBmeTEgKSAqICggZngxICsgZngyICk7CkBAIC05ODEsMTYgKzk4NSwxOCBAQAogCiAKICAgICBiYXNlWzRdLnggPSBiYXNlWzJdLng7Ci0gICAgYiA9IGJhc2VbMV0ueDsKLSAgICBhID0gYmFzZVszXS54ID0gKCBiYXNlWzJdLnggKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnggPSAoIGJhc2VbMF0ueCArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gKCBhICsgYiApIC8gMjsKKyAgICBhID0gYmFzZVswXS54ICsgYmFzZVsxXS54OworICAgIGIgPSBiYXNlWzFdLnggKyBiYXNlWzJdLng7CisgICAgYmFzZVszXS54ID0gYiA+PiAxOworICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSA+PiAyOworICAgIGJhc2VbMV0ueCA9IGEgPj4gMTsKIAogICAgIGJhc2VbNF0ueSA9IGJhc2VbMl0ueTsKLSAgICBiID0gYmFzZVsxXS55OwotICAgIGEgPSBiYXNlWzNdLnkgPSAoIGJhc2VbMl0ueSArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueSA9ICggYmFzZVswXS55ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgLyAyOworICAgIGEgPSBiYXNlWzBdLnkgKyBiYXNlWzFdLnk7CisgICAgYiA9IGJhc2VbMV0ueSArIGJhc2VbMl0ueTsKKyAgICBiYXNlWzNdLnkgPSBiID4+IDE7CisgICAgYmFzZVsyXS55ID0gKCBhICsgYiApID4+IDI7CisgICAgYmFzZVsxXS55ID0gYSA+PiAxOwogICB9CiAKIApAQCAtMTA0NCwxMiArMTA1MCwxMSBAQAogICAgIC8qIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9zIGluIHRoZSBjb3VudGVyLiAgICAgICAgICovCiAgICAgZG8KICAgICB7Ci0gICAgICBzcGxpdCA9IDE7Ci0gICAgICB3aGlsZSAoICggZHJhdyAmIHNwbGl0ICkgPT0gMCApCisgICAgICBzcGxpdCA9IGRyYXcgJiAoIC1kcmF3ICk7ICAvKiBpc29sYXRlIHRoZSByaWdodG1vc3QgMS1iaXQgKi8KKyAgICAgIHdoaWxlICggKCBzcGxpdCA+Pj0gMSApICkKICAgICAgIHsKICAgICAgICAgZ3JheV9zcGxpdF9jb25pYyggYXJjICk7CiAgICAgICAgIGFyYyArPSAyOwotICAgICAgICBzcGxpdCA8PD0gMTsKICAgICAgIH0KIAogICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gYXJjWzBdLngsIGFyY1swXS55ICk7CkBAIC0xMDYyLDI4ICsxMDY3LDMyIEBACiAgIHN0YXRpYyB2b2lkCiAgIGdyYXlfc3BsaXRfY3ViaWMoIEZUX1ZlY3RvciogIGJhc2UgKQogICB7Ci0gICAgVFBvcyAgYSwgYiwgYywgZDsKKyAgICBUUG9zICBhLCBiLCBjOwogCiAKICAgICBiYXNlWzZdLnggPSBiYXNlWzNdLng7Ci0gICAgYyA9IGJhc2VbMV0ueDsKLSAgICBkID0gYmFzZVsyXS54OwotICAgIGJhc2VbMV0ueCA9IGEgPSAoIGJhc2VbMF0ueCArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnggPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICkgLyAyOworICAgIGEgPSBiYXNlWzBdLnggKyBiYXNlWzFdLng7CisgICAgYiA9IGJhc2VbMV0ueCArIGJhc2VbMl0ueDsKKyAgICBjID0gYmFzZVsyXS54ICsgYmFzZVszXS54OworICAgIGJhc2VbNV0ueCA9IGMgPj4gMTsKKyAgICBjICs9IGI7CisgICAgYmFzZVs0XS54ID0gYyA+PiAyOworICAgIGJhc2VbMV0ueCA9IGEgPj4gMTsKKyAgICBhICs9IGI7CisgICAgYmFzZVsyXS54ID0gYSA+PiAyOworICAgIGJhc2VbM10ueCA9ICggYSArIGMgKSA+PiAzOwogCiAgICAgYmFzZVs2XS55ID0gYmFzZVszXS55OwotICAgIGMgPSBiYXNlWzFdLnk7Ci0gICAgZCA9IGJhc2VbMl0ueTsKLSAgICBiYXNlWzFdLnkgPSBhID0gKCBiYXNlWzBdLnkgKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiApIC8gMjsKKyAgICBhID0gYmFzZVswXS55ICsgYmFzZVsxXS55OworICAgIGIgPSBiYXNlWzFdLnkgKyBiYXNlWzJdLnk7CisgICAgYyA9IGJhc2VbMl0ueSArIGJhc2VbM10ueTsKKyAgICBiYXNlWzVdLnkgPSBjID4+IDE7CisgICAgYyArPSBiOworICAgIGJhc2VbNF0ueSA9IGMgPj4gMjsKKyAgICBiYXNlWzFdLnkgPSBhID4+IDE7CisgICAgYSArPSBiOworICAgIGJhc2VbMl0ueSA9IGEgPj4gMjsKKyAgICBiYXNlWzNdLnkgPSAoIGEgKyBjICkgPj4gMzsKICAgfQogCiAKQEAgLTEwOTQsOSArMTEwMyw2IEBACiAgIHsKICAgICBGVF9WZWN0b3IgICBiZXpfc3RhY2tbMTYgKiAzICsgMV07ICAvKiBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYmlzZWN0aW9ucyAqLwogICAgIEZUX1ZlY3RvciogIGFyYyA9IGJlel9zdGFjazsKLSAgICBUUG9zICAgICAgICBkeCwgZHksIGR4XywgZHlfOwotICAgIFRQb3MgICAgICAgIGR4MSwgZHkxLCBkeDIsIGR5MjsKLSAgICBUUG9zICAgICAgICBMLCBzLCBzX2xpbWl0OwogCiAKICAgICBhcmNbMF0ueCA9IFVQU0NBTEUoIHRvLT54ICk7CkBAIC0xMTI1LDQ1ICsxMTMxLDEzIEBACiAKICAgICBmb3IgKDs7KQogICAgIHsKLSAgICAgIC8qIERlY2lkZSB3aGV0aGVyIHRvIHNwbGl0IG9yIGRyYXcuIFNlZSBgUmFwaWQgVGVybWluYXRpb24gICAgICAgICAgKi8KLSAgICAgIC8qIEV2YWx1YXRpb24gZm9yIFJlY3Vyc2l2ZSBTdWJkaXZpc2lvbiBvZiBCZXppZXIgQ3VydmVzJyBieSBUaG9tYXMgKi8KLSAgICAgIC8qIEYuIEhhaW4sIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGh0dHA6Ly93d3cuY2lzLnNvdXRoYWxhYmFtYS5lZHUvfmhhaW4vZ2VuZXJhbC9QdWJsaWNhdGlvbnMvQmV6aWVyL0NhbWVyYS1yZWFkeSUyMENJU1NUMDIlMjAyLnBkZiAqLwotCi0gICAgICAvKiBkeCBhbmQgZHkgYXJlIHggYW5kIHkgY29tcG9uZW50cyBvZiB0aGUgUDAtUDMgY2hvcmQgdmVjdG9yLiAqLwotICAgICAgZHggPSBkeF8gPSBhcmNbM10ueCAtIGFyY1swXS54OwotICAgICAgZHkgPSBkeV8gPSBhcmNbM10ueSAtIGFyY1swXS55OwotCi0gICAgICBMID0gRlRfSFlQT1QoIGR4XywgZHlfICk7Ci0KLSAgICAgIC8qIEF2b2lkIHBvc3NpYmxlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVsb3cgYnkgc3BsaXR0aW5nLiAqLwotICAgICAgaWYgKCBMID4gMzI3NjcgKQotICAgICAgICBnb3RvIFNwbGl0OwotCi0gICAgICAvKiBNYXggZGV2aWF0aW9uIG1heSBiZSBhcyBtdWNoIGFzIChzL0wpICogMy80IChpZiBIYWluJ3MgdiA9IDEpLiAqLwotICAgICAgc19saW1pdCA9IEwgKiAoVFBvcykoIE9ORV9QSVhFTCAvIDYgKTsKLQotICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMSB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgIGR4MSA9IGFyY1sxXS54IC0gYXJjWzBdLng7Ci0gICAgICBkeTEgPSBhcmNbMV0ueSAtIGFyY1swXS55OwotICAgICAgcyA9IEZUX0FCUyggU1VCX0xPTkcoIE1VTF9MT05HKCBkeSwgZHgxICksIE1VTF9MT05HKCBkeCwgZHkxICkgKSApOwotCi0gICAgICBpZiAoIHMgPiBzX2xpbWl0ICkKLSAgICAgICAgZ290byBTcGxpdDsKLQotICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMiB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgIGR4MiA9IGFyY1syXS54IC0gYXJjWzBdLng7Ci0gICAgICBkeTIgPSBhcmNbMl0ueSAtIGFyY1swXS55OwotICAgICAgcyA9IEZUX0FCUyggU1VCX0xPTkcoIE1VTF9MT05HKCBkeSwgZHgyICksIE1VTF9MT05HKCBkeCwgZHkyICkgKSApOwotCi0gICAgICBpZiAoIHMgPiBzX2xpbWl0ICkKLSAgICAgICAgZ290byBTcGxpdDsKLQotICAgICAgLyogU3BsaXQgc3VwZXIgY3Vydnkgc2VnbWVudHMgd2hlcmUgdGhlIG9mZiBwb2ludHMgYXJlIHNvIGZhcgotICAgICAgICAgZnJvbSB0aGUgY2hvcmQgdGhhdCB0aGUgYW5nbGVzIFAwLVAxLVAzIG9yIFAwLVAyLVAzIGJlY29tZQotICAgICAgICAgYWN1dGUgYXMgZGV0ZWN0ZWQgYnkgYXBwcm9wcmlhdGUgZG90IHByb2R1Y3RzLiAqLwotICAgICAgaWYgKCBkeDEgKiAoIGR4MSAtIGR4ICkgKyBkeTEgKiAoIGR5MSAtIGR5ICkgPiAwIHx8Ci0gICAgICAgICAgIGR4MiAqICggZHgyIC0gZHggKSArIGR5MiAqICggZHkyIC0gZHkgKSA+IDAgKQorICAgICAgLyogd2l0aCBlYWNoIHNwbGl0LCBjb250cm9sIHBvaW50cyBxdWlja2x5IGNvbnZlcmdlIHRvd2FyZHMgICovCisgICAgICAvKiBjaG9yZCB0cmlzZWN0aW9uIHBvaW50cyBhbmQgdGhlIHZhbmlzaGluZyBkaXN0YW5jZXMgYmVsb3cgKi8KKyAgICAgIC8qIGluZGljYXRlIHdoZW4gdGhlIHNlZ21lbnQgaXMgZmxhdCBlbm91Z2ggdG8gZHJhdyAgICAgICAgICAqLworICAgICAgaWYgKCBGVF9BQlMoIDIgKiBhcmNbMF0ueCAtIDMgKiBhcmNbMV0ueCArIGFyY1szXS54ICkgPiBPTkVfUElYRUwgLyAyIHx8CisgICAgICAgICAgIEZUX0FCUyggMiAqIGFyY1swXS55IC0gMyAqIGFyY1sxXS55ICsgYXJjWzNdLnkgKSA+IE9ORV9QSVhFTCAvIDIgfHwKKyAgICAgICAgICAgRlRfQUJTKCBhcmNbMF0ueCAtIDMgKiBhcmNbMl0ueCArIDIgKiBhcmNbM10ueCApID4gT05FX1BJWEVMIC8gMiB8fAorICAgICAgICAgICBGVF9BQlMoIGFyY1swXS55IC0gMyAqIGFyY1syXS55ICsgMiAqIGFyY1szXS55ICkgPiBPTkVfUElYRUwgLyAyICkKICAgICAgICAgZ290byBTcGxpdDsKIAogICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gYXJjWzBdLngsIGFyY1swXS55ICk7CkBAIC0xMjM4LDggKzEyMTIsNiBAQAogICB7CiAgICAgLyogc2NhbGUgdGhlIGNvdmVyYWdlIGZyb20gMC4uKE9ORV9QSVhFTCpPTkVfUElYRUwqMikgdG8gMC4uMjU2ICAqLwogICAgIGNvdmVyYWdlID4+PSBQSVhFTF9CSVRTICogMiArIDEgLSA4OwotICAgIGlmICggY292ZXJhZ2UgPCAwICkKLSAgICAgIGNvdmVyYWdlID0gLWNvdmVyYWdlIC0gMTsKIAogICAgIC8qIGNvbXB1dGUgdGhlIGxpbmUncyBjb3ZlcmFnZSBkZXBlbmRpbmcgb24gdGhlIG91dGxpbmUgZmlsbCBydWxlICovCiAgICAgaWYgKCByYXMub3V0bGluZS5mbGFncyAmIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCApCkBAIC0xMjQ5LDIzICsxMjIxLDMwIEBACiAgICAgICBpZiAoIGNvdmVyYWdlID49IDI1NiApCiAgICAgICAgIGNvdmVyYWdlID0gNTExIC0gY292ZXJhZ2U7CiAgICAgfQotICAgIGVsc2UKKyAgICBlbHNlICAvKiBkZWZhdWx0IG5vbi16ZXJvIHdpbmRpbmcgcnVsZSAqLwogICAgIHsKLSAgICAgIC8qIG5vcm1hbCBub24temVybyB3aW5kaW5nIHJ1bGUgKi8KKyAgICAgIGlmICggY292ZXJhZ2UgPCAwICkKKyAgICAgICAgY292ZXJhZ2UgPSB+Y292ZXJhZ2U7ICAvKiB0aGUgc2FtZSBhcyAtY292ZXJhZ2UgLSAxICovCisKICAgICAgIGlmICggY292ZXJhZ2UgPj0gMjU2ICkKICAgICAgICAgY292ZXJhZ2UgPSAyNTU7CiAgICAgfQogCi0gICAgaWYgKCByYXMucmVuZGVyX3NwYW4gKSAgLyogZm9yIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBvbmx5ICovCisgICAgaWYgKCByYXMubnVtX3NwYW5zID49IDAgKSAgLyogZm9yIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBvbmx5ICovCiAgICAgewotICAgICAgRlRfU3BhbiAgc3BhbjsKKyAgICAgIEZUX1NwYW4qICBzcGFuID0gcmFzLnNwYW5zICsgcmFzLm51bV9zcGFucysrOwogCiAKLSAgICAgIHNwYW4ueCAgICAgICAgPSAoc2hvcnQpeDsKLSAgICAgIHNwYW4ubGVuICAgICAgPSAodW5zaWduZWQgc2hvcnQpYWNvdW50OwotICAgICAgc3Bhbi5jb3ZlcmFnZSA9ICh1bnNpZ25lZCBjaGFyKWNvdmVyYWdlOworICAgICAgc3Bhbi0+eCAgICAgICAgPSAoc2hvcnQpeDsKKyAgICAgIHNwYW4tPmxlbiAgICAgID0gKHVuc2lnbmVkIHNob3J0KWFjb3VudDsKKyAgICAgIHNwYW4tPmNvdmVyYWdlID0gKHVuc2lnbmVkIGNoYXIpY292ZXJhZ2U7CiAKLSAgICAgIHJhcy5yZW5kZXJfc3BhbiggeSwgMSwgJnNwYW4sIHJhcy5yZW5kZXJfc3Bhbl9kYXRhICk7CisgICAgICBpZiAoIHJhcy5udW1fc3BhbnMgPT0gRlRfTUFYX0dSQVlfU1BBTlMgKQorICAgICAgeworICAgICAgICAvKiBmbHVzaCB0aGUgc3BhbiBidWZmZXIgYW5kIHJlc2V0IHRoZSBjb3VudCAqLworICAgICAgICByYXMucmVuZGVyX3NwYW4oIHksIHJhcy5udW1fc3BhbnMsIHJhcy5zcGFucywgcmFzLnJlbmRlcl9zcGFuX2RhdGEgKTsKKyAgICAgICAgcmFzLm51bV9zcGFucyA9IDA7CisgICAgICB9CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC0xMjc5LDE0ICsxMjU4LDI5IEBACiAgICAgICAgKi8KICAgICAgIHN3aXRjaCAoIGFjb3VudCApCiAgICAgICB7Ci0gICAgICBjYXNlIDc6ICpxKysgPSBjOwotICAgICAgY2FzZSA2OiAqcSsrID0gYzsKLSAgICAgIGNhc2UgNTogKnErKyA9IGM7Ci0gICAgICBjYXNlIDQ6ICpxKysgPSBjOwotICAgICAgY2FzZSAzOiAqcSsrID0gYzsKLSAgICAgIGNhc2UgMjogKnErKyA9IGM7Ci0gICAgICBjYXNlIDE6ICpxICAgPSBjOwotICAgICAgY2FzZSAwOiBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgKnErKyA9IGM7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgY2FzZSA2OgorICAgICAgICAqcSsrID0gYzsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIDU6CisgICAgICAgICpxKysgPSBjOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgNDoKKyAgICAgICAgKnErKyA9IGM7CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgY2FzZSAzOgorICAgICAgICAqcSsrID0gYzsKKyAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICBjYXNlIDI6CisgICAgICAgICpxKysgPSBjOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgMToKKyAgICAgICAgKnEgPSBjOworICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgIGNhc2UgMDoKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBGVF9NRU1fU0VUKCBxLCBjLCBhY291bnQgKTsKICAgICAgIH0KQEAgLTEzMjQsNTMgKzEzMTgsNjMgQEAKIAogICAgICAgaWYgKCBjb3ZlciAhPSAwICkKICAgICAgICAgZ3JheV9obGluZSggUkFTX1ZBUl8geCwgeSwgY292ZXIsIHJhcy5tYXhfZXggLSB4ICk7CisKKyAgICAgIGlmICggcmFzLm51bV9zcGFucyA+IDAgKSAgLyogZm9yIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBvbmx5ICovCisgICAgICB7CisgICAgICAgIC8qIGZsdXNoIHRoZSBzcGFuIGJ1ZmZlciBhbmQgcmVzZXQgdGhlIGNvdW50ICovCisgICAgICAgIHJhcy5yZW5kZXJfc3BhbiggeSwgcmFzLm51bV9zcGFucywgcmFzLnNwYW5zLCByYXMucmVuZGVyX3NwYW5fZGF0YSApOworICAgICAgICByYXMubnVtX3NwYW5zID0gMDsKKyAgICAgIH0KICAgICB9CiAgIH0KIAogCiAjaWZkZWYgU1RBTkRBTE9ORV8KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzaG91bGQgb25seSBjb21waWxlIGluIHN0YW5kLWFsb25lIG1vZGUsICAgICAqLwotICAvKiAgaS5lLiwgd2hlbiBidWlsZGluZyB0aGlzIGNvbXBvbmVudCB3aXRob3V0IHRoZSByZXN0IG9mIEZyZWVUeXBlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIG9ubHkgY29tcGlsZSBpbiBzdGFuZC1hbG9uZSBtb2RlLAorICAgKiBpLmUuLCB3aGVuIGJ1aWxkaW5nIHRoaXMgY29tcG9uZW50IHdpdGhvdXQgdGhlIHJlc3Qgb2YgRnJlZVR5cGUuCisgICAqCisgICAqLwogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdhbGsgb3ZlciBhbiBvdXRsaW5lJ3Mgc3RydWN0dXJlIHRvIGRlY29tcG9zZSBpdCBpbnRvIGluZGl2aWR1YWwgICAqLwotICAvKiAgICBzZWdtZW50cyBhbmQgQsOpemllciBhcmNzLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHNvIGFibGUgdG8gZW1pdCAgICAgICovCi0gIC8qICAgIGBtb3ZlIHRvJyBhbmQgYGNsb3NlIHRvJyBvcGVyYXRpb25zIHRvIGluZGljYXRlIHRoZSBzdGFydCBhbmQgZW5kICAqLwotICAvKiAgICBvZiBuZXcgY29udG91cnMgaW4gdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNfaW50ZXJmYWNlIDo6IEEgdGFibGUgb2YgYGVtaXR0ZXJzJywgaS5lLiwgZnVuY3Rpb24gcG9pbnRlcnMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQgZHVyaW5nIGRlY29tcG9zaXRpb24gdG8gaW5kaWNhdGUgcGF0aCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICAgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHdoaWNoIGlzIHBhc3NlZCB0byBlYWNoICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBkdXJpbmcgdGhlICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIEZUX091dGxpbmVfRGVjb21wb3NlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBXYWxrIG92ZXIgYW4gb3V0bGluZSdzIHN0cnVjdHVyZSB0byBkZWNvbXBvc2UgaXQgaW50byBpbmRpdmlkdWFsCisgICAqICAgc2VnbWVudHMgYW5kIELDqXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhYmxlIHRvIGVtaXQKKyAgICogICBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZAorICAgKiAgIG9mIG5ldyBjb250b3VycyBpbiB0aGUgb3V0bGluZS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIG91dGxpbmUgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgc291cmNlIHRhcmdldC4KKyAgICoKKyAgICogICBmdW5jX2ludGVyZmFjZSA6OgorICAgKiAgICAgQSB0YWJsZSBvZiBgZW1pdHRlcnMnLCBpLmUuLCBmdW5jdGlvbiBwb2ludGVycworICAgKiAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGgKKyAgICogICAgIG9wZXJhdGlvbnMuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB1c2VyIDo6CisgICAqICAgICBBIHR5cGVsZXNzIHBvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIHRvIGVhY2gKKyAgICogICAgIGVtaXR0ZXIgZHVyaW5nIHRoZSBkZWNvbXBvc2l0aW9uLiAgSXQgY2FuIGJlCisgICAqICAgICB1c2VkIHRvIHN0b3JlIHRoZSBzdGF0ZSBkdXJpbmcgdGhlCisgICAqICAgICBkZWNvbXBvc2l0aW9uLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBzdGF0aWMgaW50CiAgIEZUX091dGxpbmVfRGVjb21wb3NlKCBjb25zdCBGVF9PdXRsaW5lKiAgICAgICAgb3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MqICBmdW5jX2ludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICkKICAgewogI3VuZGVmIFNDQUxFRAotI2RlZmluZSBTQ0FMRUQoIHggKSAgKCAoICh4KSA8PCBzaGlmdCApIC0gZGVsdGEgKQorI2RlZmluZSBTQ0FMRUQoIHggKSAgKCAoeCkgKiAoIDFMIDw8IHNoaWZ0ICkgLSBkZWx0YSApCiAKICAgICBGVF9WZWN0b3IgICB2X2xhc3Q7CiAgICAgRlRfVmVjdG9yICAgdl9jb250cm9sOwpAQCAtMTYxMCw4MSArMTYxNCw2IEBACiAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKICAgfQogCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQ0JveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGFuIG91dGxpbmUncyBgY29udHJvbCBib3gnLiAgVGhlIGNvbnRyb2wgYm94IGVuY2xvc2VzIGFsbCAgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgcG9pbnRzLCBpbmNsdWRpbmcgQsOpemllciBjb250cm9sIHBvaW50cy4gIFRob3VnaCBpdCAgKi8KLSAgLyogICAgY29pbmNpZGVzIHdpdGggdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBmb3IgbW9zdCBnbHlwaHMsIGl0IGNhbiBiZSAgICovCi0gIC8qICAgIHNsaWdodGx5IGxhcmdlciBpbiBzb21lIHNpdHVhdGlvbnMgKGxpa2Ugd2hlbiByb3RhdGluZyBhbiBvdXRsaW5lICAqLwotICAvKiAgICB0aGF0IGNvbnRhaW5zIELDqXppZXIgb3V0c2lkZSBhcmNzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KLSAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCi0gIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLwotICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQsIHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2JveCAgIDo6IFRoZSBvdXRsaW5lJ3MgY29udHJvbCBib3guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX0dseXBoX0dldF9DQm94IGZvciBhIGRpc2N1c3Npb24gb2YgdHJpY2t5IGZvbnRzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgRlRfT3V0bGluZV9HZXRfQ0JveCggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICAgICAgICphY2JveCApCi0gIHsKLSAgICBUUG9zICB4TWluLCB5TWluLCB4TWF4LCB5TWF4OwotCi0KLSAgICBpZiAoIG91dGxpbmUgJiYgYWNib3ggKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHhNaW4gPSAwOwotICAgICAgICB5TWluID0gMDsKLSAgICAgICAgeE1heCA9IDA7Ci0gICAgICAgIHlNYXggPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgICAgRlRfVmVjdG9yKiAgbGltaXQgPSB2ZWMgKyBvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICAgIHhNaW4gPSB4TWF4ID0gdmVjLT54OwotICAgICAgICB5TWluID0geU1heCA9IHZlYy0+eTsKLSAgICAgICAgdmVjKys7Ci0KLSAgICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgICB7Ci0gICAgICAgICAgVFBvcyAgeCwgeTsKLQotCi0gICAgICAgICAgeCA9IHZlYy0+eDsKLSAgICAgICAgICBpZiAoIHggPCB4TWluICkgeE1pbiA9IHg7Ci0gICAgICAgICAgaWYgKCB4ID4geE1heCApIHhNYXggPSB4OwotCi0gICAgICAgICAgeSA9IHZlYy0+eTsKLSAgICAgICAgICBpZiAoIHkgPCB5TWluICkgeU1pbiA9IHk7Ci0gICAgICAgICAgaWYgKCB5ID4geU1heCApIHlNYXggPSB5OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBhY2JveC0+eE1pbiA9IHhNaW47Ci0gICAgICBhY2JveC0+eE1heCA9IHhNYXg7Ci0gICAgICBhY2JveC0+eU1pbiA9IHlNaW47Ci0gICAgICBhY2JveC0+eU1heCA9IHlNYXg7Ci0gICAgfQotICB9Ci0KICNlbmRpZiAvKiBTVEFOREFMT05FXyAqLwogCiAKQEAgLTE3MDIsMjMgKzE2MzEsMjQgQEAKIAogCiAgIHN0YXRpYyBpbnQKLSAgZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfQVJHICkKKyAgZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfQVJHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgY29udGludWVkICkKICAgeworICAgIGludCAgZXJyb3I7CiAKLSAgICB2b2xhdGlsZSBpbnQgIGVycm9yID0gMDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBGVF9PdXRsaW5lX0Z1bmNzIGZ1bmNfaW50ZXJmYWNlOwotICAgICAgSW5pdF9DbGFzc19mdW5jX2ludGVyZmFjZSgmZnVuY19pbnRlcmZhY2UpOwotI2VuZGlmCiAKICAgICBpZiAoIGZ0X3NldGptcCggcmFzLmp1bXBfYnVmZmVyICkgPT0gMCApCiAgICAgeworICAgICAgaWYgKCBjb250aW51ZWQgKQorICAgICAgICBGVF9UcmFjZV9EaXNhYmxlKCk7CiAgICAgICBlcnJvciA9IEZUX091dGxpbmVfRGVjb21wb3NlKCAmcmFzLm91dGxpbmUsICZmdW5jX2ludGVyZmFjZSwgJnJhcyApOworICAgICAgaWYgKCBjb250aW51ZWQgKQorICAgICAgICBGVF9UcmFjZV9FbmFibGUoKTsKKwogICAgICAgaWYgKCAhcmFzLmludmFsaWQgKQogICAgICAgICBncmF5X3JlY29yZF9jZWxsKCBSQVNfVkFSICk7CiAKLSAgICAgIEZUX1RSQUNFNygoICJiYW5kIFslZC4uJWRdOiAlZCBjZWxsJXNcbiIsCisgICAgICBGVF9UUkFDRTcoKCAiYmFuZCBbJWQuLiVkXTogJWxkIGNlbGwlc1xuIiwKICAgICAgICAgICAgICAgICAgIHJhcy5taW5fZXksCiAgICAgICAgICAgICAgICAgICByYXMubWF4X2V5LAogICAgICAgICAgICAgICAgICAgcmFzLm51bV9jZWxscywKQEAgLTE3NDEsOCArMTY3MSw2IEBACiAgIHsKICAgICBjb25zdCBUQ29vcmQgIHlNaW4gPSByYXMubWluX2V5OwogICAgIGNvbnN0IFRDb29yZCAgeU1heCA9IHJhcy5tYXhfZXk7Ci0gICAgY29uc3QgVENvb3JkICB4TWluID0gcmFzLm1pbl9leDsKLSAgICBjb25zdCBUQ29vcmQgIHhNYXggPSByYXMubWF4X2V4OwogCiAgICAgVENlbGwgICAgYnVmZmVyW0ZUX01BWF9HUkFZX1BPT0xdOwogICAgIHNpemVfdCAgIGhlaWdodCA9IChzaXplX3QpKCB5TWF4IC0geU1pbiApOwpAQCAtMTc1MSw2ICsxNjc5LDggQEAKICAgICBUQ29vcmQgICBiYW5kc1szMl07ICAvKiBlbm91Z2ggdG8gYWNjb21tb2RhdGUgYmlzZWN0aW9ucyAqLwogICAgIFRDb29yZCogIGJhbmQ7CiAKKyAgICBpbnQgIGNvbnRpbnVlZCA9IDA7CisKIAogICAgIC8qIHNldCB1cCB2ZXJ0aWNhbCBiYW5kcyAqLwogICAgIGlmICggaGVpZ2h0ID4gbiApCkBAIC0xNzc0LDggKzE3MDQsOCBAQAogICAgICAgcmFzLm1heF9leSA9IEZUX01JTiggeSwgeU1heCApOwogCiAgICAgICBiYW5kICAgID0gYmFuZHM7Ci0gICAgICBiYW5kWzFdID0geE1pbjsKLSAgICAgIGJhbmRbMF0gPSB4TWF4OworICAgICAgYmFuZFsxXSA9IHJhcy5taW5fZXk7CisgICAgICBiYW5kWzBdID0gcmFzLm1heF9leTsKIAogICAgICAgZG8KICAgICAgIHsKQEAgLTE3ODcsMTAgKzE3MTcsMTEgQEAKIAogICAgICAgICByYXMubnVtX2NlbGxzID0gMDsKICAgICAgICAgcmFzLmludmFsaWQgICA9IDE7Ci0gICAgICAgIHJhcy5taW5fZXggICAgPSBiYW5kWzFdOwotICAgICAgICByYXMubWF4X2V4ICAgID0gYmFuZFswXTsKKyAgICAgICAgcmFzLm1pbl9leSAgICA9IGJhbmRbMV07CisgICAgICAgIHJhcy5tYXhfZXkgICAgPSBiYW5kWzBdOwogCi0gICAgICAgIGVycm9yID0gZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfVkFSICk7CisgICAgICAgIGVycm9yICAgICA9IGdyYXlfY29udmVydF9nbHlwaF9pbm5lciggUkFTX1ZBUiwgY29udGludWVkICk7CisgICAgICAgIGNvbnRpbnVlZCA9IDE7CiAKICAgICAgICAgaWYgKCAhZXJyb3IgKQogICAgICAgICB7CkBAIC0xODI3LDcgKzE3NTgsNiBAQAogICB7CiAgICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgPSAoY29uc3QgRlRfT3V0bGluZSopcGFyYW1zLT5zb3VyY2U7CiAgICAgY29uc3QgRlRfQml0bWFwKiAgIHRhcmdldF9tYXAgPSBwYXJhbXMtPnRhcmdldDsKLSAgICBGVF9CQm94ICAgICAgICAgICAgY2JveCwgY2xpcDsKIAogI2lmbmRlZiBGVF9TVEFUSUNfUkFTVEVSCiAgICAgZ3JheV9UV29ya2VyICB3b3JrZXJbMV07CkBAIC0xODY0LDYgKzE3OTQsMTIgQEAKIAogICAgICAgcmFzLnJlbmRlcl9zcGFuICAgICAgPSAoRlRfUmFzdGVyX1NwYW5fRnVuYylwYXJhbXMtPmdyYXlfc3BhbnM7CiAgICAgICByYXMucmVuZGVyX3NwYW5fZGF0YSA9IHBhcmFtcy0+dXNlcjsKKyAgICAgIHJhcy5udW1fc3BhbnMgICAgICAgID0gMDsKKworICAgICAgcmFzLm1pbl9leCA9IHBhcmFtcy0+Y2xpcF9ib3gueE1pbjsKKyAgICAgIHJhcy5taW5fZXkgPSBwYXJhbXMtPmNsaXBfYm94LnlNaW47CisgICAgICByYXMubWF4X2V4ID0gcGFyYW1zLT5jbGlwX2JveC54TWF4OworICAgICAgcmFzLm1heF9leSA9IHBhcmFtcy0+Y2xpcF9ib3gueU1heDsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTE4ODgsNDYgKzE4MjQsMTUgQEAKIAogICAgICAgcmFzLnJlbmRlcl9zcGFuICAgICAgPSAoRlRfUmFzdGVyX1NwYW5fRnVuYylOVUxMOwogICAgICAgcmFzLnJlbmRlcl9zcGFuX2RhdGEgPSBOVUxMOworICAgICAgcmFzLm51bV9zcGFucyAgICAgICAgPSAtMTsgIC8qIGludmFsaWQgKi8KKworICAgICAgcmFzLm1pbl9leCA9IDA7CisgICAgICByYXMubWluX2V5ID0gMDsKKyAgICAgIHJhcy5tYXhfZXggPSAoRlRfUG9zKXRhcmdldF9tYXAtPndpZHRoOworICAgICAgcmFzLm1heF9leSA9IChGVF9Qb3MpdGFyZ2V0X21hcC0+cm93czsKICAgICB9CiAKLSAgICBGVF9PdXRsaW5lX0dldF9DQm94KCBvdXRsaW5lLCAmY2JveCApOwotCi0gICAgLyogcmVqZWN0IHRvbyBsYXJnZSBvdXRsaW5lIGNvb3JkaW5hdGVzICovCi0gICAgaWYgKCBjYm94LnhNaW4gPCAtMHgxMDAwMDAwTCB8fCBjYm94LnhNYXggPiAweDEwMDAwMDBMIHx8Ci0gICAgICAgICBjYm94LnlNaW4gPCAtMHgxMDAwMDAwTCB8fCBjYm94LnlNYXggPiAweDEwMDAwMDBMICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICAvKiB0cnVuY2F0ZSB0aGUgYm91bmRpbmcgYm94IHRvIGludGVnZXIgcGl4ZWxzICovCi0gICAgY2JveC54TWluID0gY2JveC54TWluID4+IDY7Ci0gICAgY2JveC55TWluID0gY2JveC55TWluID4+IDY7Ci0gICAgY2JveC54TWF4ID0gKCBjYm94LnhNYXggKyA2MyApID4+IDY7Ci0gICAgY2JveC55TWF4ID0gKCBjYm94LnlNYXggKyA2MyApID4+IDY7Ci0KLSAgICAvKiBjb21wdXRlIGNsaXBwaW5nIGJveCAqLwotICAgIGlmICggISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCApICkKLSAgICB7Ci0gICAgICAvKiBjb21wdXRlIGNsaXAgYm94IGZyb20gdGFyZ2V0IHBpeG1hcCAqLwotICAgICAgY2xpcC54TWluID0gMDsKLSAgICAgIGNsaXAueU1pbiA9IDA7Ci0gICAgICBjbGlwLnhNYXggPSAoRlRfUG9zKXRhcmdldF9tYXAtPndpZHRoOwotICAgICAgY2xpcC55TWF4ID0gKEZUX1Bvcyl0YXJnZXRfbWFwLT5yb3dzOwotICAgIH0KLSAgICBlbHNlIGlmICggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0NMSVAgKQotICAgICAgY2xpcCA9IHBhcmFtcy0+Y2xpcF9ib3g7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNsaXAueE1pbiA9IC0zMjc2OEw7Ci0gICAgICBjbGlwLnlNaW4gPSAtMzI3NjhMOwotICAgICAgY2xpcC54TWF4ID0gIDMyNzY3TDsKLSAgICAgIGNsaXAueU1heCA9ICAzMjc2N0w7Ci0gICAgfQotCi0gICAgLyogY2xpcCB0byB0YXJnZXQgYml0bWFwLCBleGl0IGlmIG5vdGhpbmcgdG8gZG8gKi8KLSAgICByYXMubWluX2V4ID0gRlRfTUFYKCBjYm94LnhNaW4sIGNsaXAueE1pbiApOwotICAgIHJhcy5taW5fZXkgPSBGVF9NQVgoIGNib3gueU1pbiwgY2xpcC55TWluICk7Ci0gICAgcmFzLm1heF9leCA9IEZUX01JTiggY2JveC54TWF4LCBjbGlwLnhNYXggKTsKLSAgICByYXMubWF4X2V5ID0gRlRfTUlOKCBjYm94LnlNYXgsIGNsaXAueU1heCApOwotCisgICAgLyogZXhpdCBpZiBub3RoaW5nIHRvIGRvICovCiAgICAgaWYgKCByYXMubWF4X2V4IDw9IHJhcy5taW5fZXggfHwgcmFzLm1heF9leSA8PSByYXMubWluX2V5ICkKICAgICAgIHJldHVybiAwOwogCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0Z3JheXMuaCBiL3NyYy9zbW9vdGgvZnRncmF5cy5oCmluZGV4IDllMTFjYTYuLmNhYmE2MzIgMTAwNjQ0Ci0tLSBhL3NyYy9zbW9vdGgvZnRncmF5cy5oCisrKyBiL3NyYy9zbW9vdGgvZnRncmF5cy5oCkBAIC0xLDE5ICsxLDE5IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdyYXlzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc21vb3RoIHJlbmRlcmVyIGRlY2xhcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdGdyYXlzLmgKKyAqCisgKiAgIEZyZWVUeXBlIHNtb290aCByZW5kZXJlciBkZWNsYXJhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBGVEdSQVlTX0hfCkBAIC0yOCwxOSArMjgsMTggQEAKICNpbmNsdWRlICJmdGltYWdlLmgiCiAjZWxzZQogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0ggLyogZm9yIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0jaW5jbHVkZSBGVF9JTUFHRV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRpbWFnZS5oPgogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRvIG1ha2UgZnRncmF5cy5oIGluZGVwZW5kZW50IGZyb20gY29uZmlndXJhdGlvbiBmaWxlcyB3ZSBjaGVjayAgICAgICAqLwotICAvKiB3aGV0aGVyIEZUX0VYUE9SVF9WQVIgaGFzIGJlZW4gZGVmaW5lZCBhbHJlYWR5LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9uIHNvbWUgc3lzdGVtcyBhbmQgY29tcGlsZXJzIChXaW4zMiBtb3N0bHkpLCBhbiBleHRyYSBrZXl3b3JkIGlzICAgICAqLwotICAvKiBuZWNlc3NhcnkgdG8gY29tcGlsZSB0aGUgbGlicmFyeSBhcyBhIERMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUbyBtYWtlIGZ0Z3JheXMuaCBpbmRlcGVuZGVudCBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2UgY2hlY2sKKyAgICogd2hldGhlciBGVF9FWFBPUlRfVkFSIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeS4KKyAgICoKKyAgICogT24gc29tZSBzeXN0ZW1zIGFuZCBjb21waWxlcnMgKFdpbjMyIG1vc3RseSksIGFuIGV4dHJhIGtleXdvcmQgaXMKKyAgICogbmVjZXNzYXJ5IHRvIGNvbXBpbGUgdGhlIGxpYnJhcnkgYXMgYSBETEwuCisgICAqLwogI2lmbmRlZiBGVF9FWFBPUlRfVkFSCiAjZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzbWVycnMuaCBiL3NyYy9zbW9vdGgvZnRzbWVycnMuaAppbmRleCAyMjZkYzFiLi5lOTNmM2RmIDEwMDY0NAotLS0gYS9zcmMvc21vb3RoL2Z0c21lcnJzLmgKKysrIGIvc3JjL3Ntb290aC9mdHNtZXJycy5oCkBAIC0xLDMyICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgc21vb3RoIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHNtZXJycy5oCisgKgorICogICBzbW9vdGggcmVuZGVyZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBzbW9vdGggcmVuZGVyZXIgZXJyb3IgZW51bWVyYXRpb24gICAgICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHNtb290aCByZW5kZXJlciBlcnJvciBlbnVtZXJhdGlvbgorICAgKiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIEZUU01FUlJTX0hfCiAjZGVmaW5lIEZUU01FUlJTX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIFNtb290aF9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfU21vb3RoCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogI2VuZGlmIC8qIEZUU01FUlJTX0hfICovCiAKZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzbW9vdGguYyBiL3NyYy9zbW9vdGgvZnRzbW9vdGguYwppbmRleCBlZjE3NmJkLi41ZDY2YmQ2IDEwMDY0NAotLS0gYS9zcmMvc21vb3RoL2Z0c21vb3RoLmMKKysrIGIvc3JjL3Ntb290aC9mdHNtb290aC5jCkBAIC0xLDQyICsxLDMwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtb290aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQW50aS1hbGlhc2luZyByZW5kZXJlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBmdHNtb290aC5jCisgKgorICogICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KICNpbmNsdWRlICJmdHNtb290aC5oIgogI2luY2x1ZGUgImZ0Z3JheXMuaCIKLSNpbmNsdWRlICJmdHNwaWMuaCIKIAogI2luY2x1ZGUgImZ0c21lcnJzLmgiCiAKIAotICAvKiBpbml0aWFsaXplIHJlbmRlcmVyIC0tIGluaXQgaXRzIHJhc3RlciAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX2luaXQoIEZUX1JlbmRlcmVyICByZW5kZXIgKQotICB7Ci0gICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfcmVzZXQoIHJlbmRlci0+cmFzdGVyLCBOVUxMLCAwICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KICAgLyogc2V0cyByZW5kZXItc3BlY2lmaWMgbW9kZSAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgZnRfc21vb3RoX3NldF9tb2RlKCBGVF9SZW5kZXJlciAgcmVuZGVyLApAQCAtODgsMTQgKzc2LDM1OSBAQAogICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJnNsb3QtPm91dGxpbmUsIGNib3ggKTsKICAgfQogCisgIHR5cGVkZWYgc3RydWN0IFRPcmlnaW5fCisgIHsKKyAgICB1bnNpZ25lZCBjaGFyKiAgb3JpZ2luOyAgLyogcGl4bWFwIG9yaWdpbiBhdCB0aGUgYm90dG9tLWxlZnQgKi8KKyAgICBpbnQgICAgICAgICAgICAgcGl0Y2g7ICAgLyogcGl0Y2ggdG8gZ28gZG93biBvbmUgcm93ICovCiAKLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCisgIH0gVE9yaWdpbjsKKworI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORworCisgIC8qIGluaXRpYWxpemUgcmVuZGVyZXIgLS0gaW5pdCBpdHMgcmFzdGVyICovCiAgIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIHJlcXVpcmVkX21vZGUgKQorICBmdF9zbW9vdGhfaW5pdCggRlRfUmVuZGVyZXIgIHJlbmRlciApCisgIHsKKyAgICBGVF9WZWN0b3IqICBzdWIgPSByZW5kZXItPnJvb3QubGlicmFyeS0+bGNkX2dlb21ldHJ5OworCisKKyAgICAvKiBzZXQgdXAgZGVmYXVsdCBzdWJwaXhlbCBnZW9tZXRyeSBmb3Igc3RyaXBlZCBSR0IgcGFuZWxzLiAqLworICAgIHN1YlswXS54ID0gLTIxOworICAgIHN1YlswXS55ID0gMDsKKyAgICBzdWJbMV0ueCA9IDA7CisgICAgc3ViWzFdLnkgPSAwOworICAgIHN1YlsyXS54ID0gMjE7CisgICAgc3ViWzJdLnkgPSAwOworCisgICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfcmVzZXQoIHJlbmRlci0+cmFzdGVyLCBOVUxMLCAwICk7CisKKyAgICByZXR1cm4gMDsKKyAgfQorCisKKyAgLyogVGhpcyBmdW5jdGlvbiB3cml0ZXMgZXZlcnkgdGhpcmQgYnl0ZSBpbiBkaXJlY3QgcmVuZGVyaW5nIG1vZGUgKi8KKyAgc3RhdGljIHZvaWQKKyAgZnRfc21vb3RoX2xjZF9zcGFucyggaW50ICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3BhbiogIHNwYW5zLAorICAgICAgICAgICAgICAgICAgICAgICBUT3JpZ2luKiAgICAgICAgdGFyZ2V0ICkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIqICBkc3RfbGluZSA9IHRhcmdldC0+b3JpZ2luIC0geSAqIHRhcmdldC0+cGl0Y2g7CisgICAgdW5zaWduZWQgY2hhciogIGRzdDsKKyAgICB1bnNpZ25lZCBzaG9ydCAgdzsKKworCisgICAgZm9yICggOyBjb3VudC0tOyBzcGFucysrICkKKyAgICAgIGZvciAoIGRzdCA9IGRzdF9saW5lICsgc3BhbnMtPnggKiAzLCB3ID0gc3BhbnMtPmxlbjsgdy0tOyBkc3QgKz0gMyApCisgICAgICAgICpkc3QgPSBzcGFucy0+Y292ZXJhZ2U7CisgIH0KKworCisgIHN0YXRpYyBGVF9FcnJvcgorICBmdF9zbW9vdGhfcmFzdGVyX2xjZCggRlRfUmVuZGVyZXIgIHJlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgIGJpdG1hcCApCisgIHsKKyAgICBGVF9FcnJvciAgICAgIGVycm9yID0gRlRfRXJyX09rOworICAgIEZUX1ZlY3RvciogICAgc3ViICAgPSByZW5kZXItPnJvb3QubGlicmFyeS0+bGNkX2dlb21ldHJ5OworICAgIEZUX1BvcyAgICAgICAgeCwgeTsKKworICAgIEZUX1Jhc3Rlcl9QYXJhbXMgICBwYXJhbXM7CisgICAgVE9yaWdpbiAgICAgICAgICAgIHRhcmdldDsKKworCisgICAgLyogUmVuZGVyIDMgc2VwYXJhdGUgY292ZXJhZ2UgYml0bWFwcywgc2hpZnRpbmcgdGhlIG91dGxpbmUuICAqLworICAgIC8qIFNldCB1cCBkaXJlY3QgcmVuZGVyaW5nIHRvIHJlY29yZCB0aGVtIG9uIGVhY2ggdGhpcmQgYnl0ZS4gKi8KKyAgICBwYXJhbXMuc291cmNlICAgICA9IG91dGxpbmU7CisgICAgcGFyYW1zLmZsYWdzICAgICAgPSBGVF9SQVNURVJfRkxBR19BQSB8IEZUX1JBU1RFUl9GTEFHX0RJUkVDVDsKKyAgICBwYXJhbXMuZ3JheV9zcGFucyA9IChGVF9TcGFuRnVuYylmdF9zbW9vdGhfbGNkX3NwYW5zOworICAgIHBhcmFtcy51c2VyICAgICAgID0gJnRhcmdldDsKKworICAgIHBhcmFtcy5jbGlwX2JveC54TWluID0gMDsKKyAgICBwYXJhbXMuY2xpcF9ib3gueU1pbiA9IDA7CisgICAgcGFyYW1zLmNsaXBfYm94LnhNYXggPSBiaXRtYXAtPndpZHRoOworICAgIHBhcmFtcy5jbGlwX2JveC55TWF4ID0gYml0bWFwLT5yb3dzOworCisgICAgaWYgKCBiaXRtYXAtPnBpdGNoIDwgMCApCisgICAgICB0YXJnZXQub3JpZ2luID0gYml0bWFwLT5idWZmZXI7CisgICAgZWxzZQorICAgICAgdGFyZ2V0Lm9yaWdpbiA9IGJpdG1hcC0+YnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgKyAoIGJpdG1hcC0+cm93cyAtIDEgKSAqICh1bnNpZ25lZCBpbnQpYml0bWFwLT5waXRjaDsKKworICAgIHRhcmdldC5waXRjaCA9IGJpdG1hcC0+cGl0Y2g7CisKKyAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLXN1YlswXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAtc3ViWzBdLnkgKTsKKyAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKKyAgICB4ID0gc3ViWzBdLng7CisgICAgeSA9IHN1YlswXS55OworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgdGFyZ2V0Lm9yaWdpbisrOworICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJbMF0ueCAtIHN1YlsxXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJbMF0ueSAtIHN1YlsxXS55ICk7CisgICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7CisgICAgeCA9IHN1YlsxXS54OworICAgIHkgPSBzdWJbMV0ueTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIHRhcmdldC5vcmlnaW4rKzsKKyAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViWzFdLnggLSBzdWJbMl0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViWzFdLnkgLSBzdWJbMl0ueSApOworICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOworICAgIHggPSBzdWJbMl0ueDsKKyAgICB5ID0gc3ViWzJdLnk7CisKKyAgRXhpdDoKKyAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgeCwgeSApOworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKworICBzdGF0aWMgRlRfRXJyb3IKKyAgZnRfc21vb3RoX3Jhc3Rlcl9sY2R2KCBGVF9SZW5kZXJlciAgcmVuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICBiaXRtYXAgKQorICB7CisgICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOworICAgIGludCAgICAgICAgICBwaXRjaCA9IGJpdG1hcC0+cGl0Y2g7CisgICAgRlRfVmVjdG9yKiAgIHN1YiAgID0gcmVuZGVyLT5yb290LmxpYnJhcnktPmxjZF9nZW9tZXRyeTsKKyAgICBGVF9Qb3MgICAgICAgeCwgeTsKKworICAgIEZUX1Jhc3Rlcl9QYXJhbXMgIHBhcmFtczsKKworCisgICAgcGFyYW1zLnRhcmdldCA9IGJpdG1hcDsKKyAgICBwYXJhbXMuc291cmNlID0gb3V0bGluZTsKKyAgICBwYXJhbXMuZmxhZ3MgID0gRlRfUkFTVEVSX0ZMQUdfQUE7CisKKyAgICAvKiBSZW5kZXIgMyBzZXBhcmF0ZSBjb3ZlcmFnZSBiaXRtYXBzLCBzaGlmdGluZyB0aGUgb3V0bGluZS4gKi8KKyAgICAvKiBOb3RpY2UgdGhhdCB0aGUgc3VicGl4ZWwgZ2VvbWV0cnkgdmVjdG9ycyBhcmUgcm90YXRlZC4gICAgKi8KKyAgICAvKiBUcmlwbGUgdGhlIHBpdGNoIHRvIHJlbmRlciBvbiBlYWNoIHRoaXJkIHJvdy4gICAgICAgICAgICAqLworICAgIGJpdG1hcC0+cGl0Y2ggKj0gMzsKKyAgICBiaXRtYXAtPnJvd3MgIC89IDM7CisKKyAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLXN1YlswXS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJbMF0ueCApOworICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOworICAgIHggPSBzdWJbMF0ueTsKKyAgICB5ID0gLXN1YlswXS54OworICAgIGlmICggZXJyb3IgKQorICAgICAgZ290byBFeGl0OworCisgICAgYml0bWFwLT5idWZmZXIgKz0gcGl0Y2g7CisgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlswXS55IC0gc3ViWzFdLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlsxXS54IC0gc3ViWzBdLnggKTsKKyAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKKyAgICB4ID0gc3ViWzFdLnk7CisgICAgeSA9IC1zdWJbMV0ueDsKKyAgICBiaXRtYXAtPmJ1ZmZlciAtPSBwaXRjaDsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRXhpdDsKKworICAgIGJpdG1hcC0+YnVmZmVyICs9IDIgKiBwaXRjaDsKKyAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViWzFdLnkgLSBzdWJbMl0ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViWzJdLnggLSBzdWJbMV0ueCApOworICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOworICAgIHggPSBzdWJbMl0ueTsKKyAgICB5ID0gLXN1YlsyXS54OworICAgIGJpdG1hcC0+YnVmZmVyIC09IDIgKiBwaXRjaDsKKworICBFeGl0OgorICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCB4LCB5ICk7CisKKyAgICBiaXRtYXAtPnBpdGNoIC89IDM7CisgICAgYml0bWFwLT5yb3dzICAqPSAzOworCisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyNlbHNlICAgLyogRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KKworICAvKiBpbml0aWFsaXplIHJlbmRlcmVyIC0tIGluaXQgaXRzIHJhc3RlciAqLworICBzdGF0aWMgRlRfRXJyb3IKKyAgZnRfc21vb3RoX2luaXQoIEZUX1JlbmRlcmVyICByZW5kZXIgKQorICB7CisgICAgLyogc2V0IHVwIGRlZmF1bHQgTENEIGZpbHRlcmluZyAqLworICAgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKCByZW5kZXItPnJvb3QubGlicmFyeSwgRlRfTENEX0ZJTFRFUl9ERUZBVUxUICk7CisKKyAgICByZW5kZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9yZXNldCggcmVuZGVyLT5yYXN0ZXIsIE5VTEwsIDAgKTsKKworICAgIHJldHVybiAwOworICB9CisKKworICBzdGF0aWMgRlRfRXJyb3IKKyAgZnRfc21vb3RoX3Jhc3Rlcl9sY2QoIEZUX1JlbmRlcmVyICByZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogICBiaXRtYXAgKQorICB7CisgICAgRlRfRXJyb3IgICAgZXJyb3IgICAgICA9IEZUX0Vycl9PazsKKyAgICBGVF9WZWN0b3IqICBwb2ludHMgICAgID0gb3V0bGluZS0+cG9pbnRzOworICAgIEZUX1ZlY3RvciogIHBvaW50c19lbmQgPSBGVF9PRkZTRVQoIHBvaW50cywgb3V0bGluZS0+bl9wb2ludHMgKTsKKyAgICBGVF9WZWN0b3IqICB2ZWM7CisKKyAgICBGVF9SYXN0ZXJfUGFyYW1zICBwYXJhbXM7CisKKworICAgIHBhcmFtcy50YXJnZXQgPSBiaXRtYXA7CisgICAgcGFyYW1zLnNvdXJjZSA9IG91dGxpbmU7CisgICAgcGFyYW1zLmZsYWdzICA9IEZUX1JBU1RFUl9GTEFHX0FBOworCisgICAgLyogaW1wbG9kZSBvdXRsaW5lICovCisgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCisgICAgICB2ZWMtPnggKj0gMzsKKworICAgIC8qIHJlbmRlciBvdXRsaW5lIGludG8gdGhlIGJpdG1hcCAqLworICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOworCisgICAgLyogZGVmbGF0ZSBvdXRsaW5lICovCisgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCisgICAgICB2ZWMtPnggLz0gMzsKKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIGZ0X3Ntb290aF9yYXN0ZXJfbGNkdiggRlRfUmVuZGVyZXIgIHJlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICAgYml0bWFwICkKKyAgeworICAgIEZUX0Vycm9yICAgIGVycm9yICAgICAgPSBGVF9FcnJfT2s7CisgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKKyAgICBGVF9WZWN0b3IqICBwb2ludHNfZW5kID0gRlRfT0ZGU0VUKCBwb2ludHMsIG91dGxpbmUtPm5fcG9pbnRzICk7CisgICAgRlRfVmVjdG9yKiAgdmVjOworCisgICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOworCisKKyAgICBwYXJhbXMudGFyZ2V0ID0gYml0bWFwOworICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOworICAgIHBhcmFtcy5mbGFncyAgPSBGVF9SQVNURVJfRkxBR19BQTsKKworICAgIC8qIGltcGxvZGUgb3V0bGluZSAqLworICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQorICAgICAgdmVjLT55ICo9IDM7CisKKyAgICAvKiByZW5kZXIgb3V0bGluZSBpbnRvIHRoZSBiaXRtYXAgKi8KKyAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKKworICAgIC8qIGRlZmxhdGUgb3V0bGluZSAqLworICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQorICAgICAgdmVjLT55IC89IDM7CisKKyAgICByZXR1cm4gZXJyb3I7CisgIH0KKworI2VuZGlmICAvKiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLworCisvKiBPdmVyc2FtcGxpbmcgc2NhbGUgdG8gYmUgdXNlZCBpbiByZW5kZXJpbmcgb3ZlcmxhcHMgKi8KKyNkZWZpbmUgU0NBTEUgICggMSA8PCAyICkKKworICAvKiBUaGlzIGZ1bmN0aW9uIGF2ZXJhZ2VzIGluZmxhdGVkIHNwYW5zIGluIGRpcmVjdCByZW5kZXJpbmcgbW9kZSAqLworICBzdGF0aWMgdm9pZAorICBmdF9zbW9vdGhfb3ZlcmxhcF9zcGFucyggaW50ICAgICAgICAgICAgIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TcGFuKiAgc3BhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUT3JpZ2luKiAgICAgICAgdGFyZ2V0ICkKKyAgeworICAgIHVuc2lnbmVkIGNoYXIqICBkc3QgPSB0YXJnZXQtPm9yaWdpbiAtICggeSAvIFNDQUxFICkgKiB0YXJnZXQtPnBpdGNoOworICAgIHVuc2lnbmVkIHNob3J0ICB4OworICAgIHVuc2lnbmVkIGludCAgICBjb3Zlciwgc3VtOworCisKKyAgICAvKiBXaGVuIGFjY3VtdWxhdGluZyB0aGUgb3ZlcnNhbXBsZWQgc3BhbnMgd2UgbmVlZCB0byBhc3N1cmUgdGhhdCAgKi8KKyAgICAvKiBmdWxseSBjb3ZlcmVkIHBpeGVscyBhcmUgZXF1YWwgdG8gMjU1IGFuZCBkbyBub3Qgb3ZlcmZsb3cuICAgICAgKi8KKyAgICAvKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgU0NBTEUgaXMgYSBwb3dlciBvZiAyLCBlYWNoIHN1YnBpeGVsICAgKi8KKyAgICAvKiBjb3ZlciBjYW4gYWxzbyByZWFjaCBhIHBvd2VyIG9mIDIgYWZ0ZXIgcm91bmRpbmcsIGFuZCB0aGUgdG90YWwgKi8KKyAgICAvKiBpcyBjbGFtcGVkIHRvIDI1NSB3aGVuIGl0IGFkZHMgdXAgdG8gMjU2LiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmb3IgKCA7IGNvdW50LS07IHNwYW5zKysgKQorICAgIHsKKyAgICAgIGNvdmVyID0gKCBzcGFucy0+Y292ZXJhZ2UgKyBTQ0FMRSAqIFNDQUxFIC8gMiApIC8gKCBTQ0FMRSAqIFNDQUxFICk7CisgICAgICBmb3IgKCB4ID0gMDsgeCA8IHNwYW5zLT5sZW47IHgrKyApCisgICAgICB7CisgICAgICAgIHN1bSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZHN0Wyggc3BhbnMtPnggKyB4ICkgLyBTQ0FMRV0gKyBjb3ZlcjsKKyAgICAgICAgZHN0Wyggc3BhbnMtPnggKyB4ICkgLyBTQ0FMRV0gPSAodW5zaWduZWQgY2hhcikoIHN1bSAtICggc3VtID4+IDggKSApOworICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgc3RhdGljIEZUX0Vycm9yCisgIGZ0X3Ntb290aF9yYXN0ZXJfb3ZlcmxhcCggRlRfUmVuZGVyZXIgIHJlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICAgYml0bWFwICkKKyAgeworICAgIEZUX0Vycm9yICAgIGVycm9yICAgICAgPSBGVF9FcnJfT2s7CisgICAgRlRfVmVjdG9yKiAgcG9pbnRzICAgICA9IG91dGxpbmUtPnBvaW50czsKKyAgICBGVF9WZWN0b3IqICBwb2ludHNfZW5kID0gRlRfT0ZGU0VUKCBwb2ludHMsIG91dGxpbmUtPm5fcG9pbnRzICk7CisgICAgRlRfVmVjdG9yKiAgdmVjOworCisgICAgRlRfUmFzdGVyX1BhcmFtcyAgIHBhcmFtczsKKyAgICBUT3JpZ2luICAgICAgICAgICAgdGFyZ2V0OworCisKKyAgICAvKiBSZWplY3Qgb3V0bGluZXMgdGhhdCBhcmUgdG9vIHdpZGUgZm9yIDE2LWJpdCBGVF9TcGFuLiAgICAgICAqLworICAgIC8qIE90aGVyIGxpbWl0cyBhcmUgYXBwbGllZCB1cHN0cmVhbSB3aXRoIHRoZSBzYW1lIGVycm9yIGNvZGUuICovCisgICAgaWYgKCBiaXRtYXAtPndpZHRoICogU0NBTEUgPiAweDdGRkYgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBSYXN0ZXJfT3ZlcmZsb3cgKTsKKworICAgIC8qIFNldCB1cCBkaXJlY3QgcmVuZGVyaW5nIHRvIGF2ZXJhZ2Ugb3ZlcnNhbXBsZWQgc3BhbnMuICovCisgICAgcGFyYW1zLnNvdXJjZSAgICAgPSBvdXRsaW5lOworICAgIHBhcmFtcy5mbGFncyAgICAgID0gRlRfUkFTVEVSX0ZMQUdfQUEgfCBGVF9SQVNURVJfRkxBR19ESVJFQ1Q7CisgICAgcGFyYW1zLmdyYXlfc3BhbnMgPSAoRlRfU3BhbkZ1bmMpZnRfc21vb3RoX292ZXJsYXBfc3BhbnM7CisgICAgcGFyYW1zLnVzZXIgICAgICAgPSAmdGFyZ2V0OworCisgICAgcGFyYW1zLmNsaXBfYm94LnhNaW4gPSAwOworICAgIHBhcmFtcy5jbGlwX2JveC55TWluID0gMDsKKyAgICBwYXJhbXMuY2xpcF9ib3gueE1heCA9IGJpdG1hcC0+d2lkdGggKiBTQ0FMRTsKKyAgICBwYXJhbXMuY2xpcF9ib3gueU1heCA9IGJpdG1hcC0+cm93cyAgKiBTQ0FMRTsKKworICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQorICAgICAgdGFyZ2V0Lm9yaWdpbiA9IGJpdG1hcC0+YnVmZmVyOworICAgIGVsc2UKKyAgICAgIHRhcmdldC5vcmlnaW4gPSBiaXRtYXAtPmJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICsgKCBiaXRtYXAtPnJvd3MgLSAxICkgKiAodW5zaWduZWQgaW50KWJpdG1hcC0+cGl0Y2g7CisKKyAgICB0YXJnZXQucGl0Y2ggPSBiaXRtYXAtPnBpdGNoOworCisgICAgLyogaW5mbGF0ZSBvdXRsaW5lICovCisgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCisgICAgeworICAgICAgdmVjLT54ICo9IFNDQUxFOworICAgICAgdmVjLT55ICo9IFNDQUxFOworICAgIH0KKworICAgIC8qIHJlbmRlciBvdXRsaW5lIGludG8gdGhlIGJpdG1hcCAqLworICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOworCisgICAgLyogZGVmbGF0ZSBvdXRsaW5lICovCisgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCisgICAgeworICAgICAgdmVjLT54IC89IFNDQUxFOworICAgICAgdmVjLT55IC89IFNDQUxFOworICAgIH0KKworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisjdW5kZWYgU0NBTEUKKworICBzdGF0aWMgRlRfRXJyb3IKKyAgZnRfc21vb3RoX3JlbmRlciggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAorICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQogICB7CiAgICAgRlRfRXJyb3IgICAgIGVycm9yICAgPSBGVF9FcnJfT2s7CiAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSAmc2xvdC0+b3V0bGluZTsKQEAgLTEwMywxMCArNDM2LDYgQEAKICAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IHJlbmRlci0+cm9vdC5tZW1vcnk7CiAgICAgRlRfUG9zICAgICAgIHhfc2hpZnQgPSAwOwogICAgIEZUX1BvcyAgICAgICB5X3NoaWZ0ID0gMDsKLSAgICBGVF9JbnQgICAgICAgaG11bCAgICA9ICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgKTsKLSAgICBGVF9JbnQgICAgICAgdm11bCAgICA9ICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0RfViApOwotCi0gICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOwogCiAKICAgICAvKiBjaGVjayBnbHlwaCBpbWFnZSBmb3JtYXQgKi8KQEAgLTExNyw3ICs0NDYsMTAgQEAKICAgICB9CiAKICAgICAvKiBjaGVjayBtb2RlICovCi0gICAgaWYgKCBtb2RlICE9IHJlcXVpcmVkX21vZGUgKQorICAgIGlmICggbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgJiYKKyAgICAgICAgIG1vZGUgIT0gRlRfUkVOREVSX01PREVfTElHSFQgICYmCisgICAgICAgICBtb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xDRCAgICAmJgorICAgICAgICAgbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9MQ0RfViAgKQogICAgIHsKICAgICAgIGVycm9yID0gRlRfVEhST1coIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKICAgICAgIGdvdG8gRXhpdDsKQEAgLTEzMCw3ICs0NjIsMTQgQEAKICAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKICAgICB9CiAKLSAgICBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCggc2xvdCwgbW9kZSwgb3JpZ2luICk7CisgICAgaWYgKCBmdF9nbHlwaHNsb3RfcHJlc2V0X2JpdG1hcCggc2xvdCwgbW9kZSwgb3JpZ2luICkgKQorICAgIHsKKyAgICAgIGVycm9yID0gRlRfVEhST1coIFJhc3Rlcl9PdmVyZmxvdyApOworICAgICAgZ290byBFeGl0OworICAgIH0KKworICAgIGlmICggIWJpdG1hcC0+cm93cyB8fCAhYml0bWFwLT5waXRjaCApCisgICAgICBnb3RvIEV4aXQ7CiAKICAgICAvKiBhbGxvY2F0ZSBuZXcgb25lICovCiAgICAgaWYgKCBGVF9BTExPQ19NVUxUKCBiaXRtYXAtPmJ1ZmZlciwgYml0bWFwLT5yb3dzLCBiaXRtYXAtPnBpdGNoICkgKQpAQCAtMTU1LDE3MiArNDk0LDU3IEBACiAgICAgaWYgKCB4X3NoaWZ0IHx8IHlfc2hpZnQgKQogICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIHhfc2hpZnQsIHlfc2hpZnQgKTsKIAotICAgIC8qIHNldCB1cCBwYXJhbWV0ZXJzICovCi0gICAgcGFyYW1zLnRhcmdldCA9IGJpdG1hcDsKLSAgICBwYXJhbXMuc291cmNlID0gb3V0bGluZTsKLSAgICBwYXJhbXMuZmxhZ3MgID0gRlRfUkFTVEVSX0ZMQUdfQUE7CisgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX05PUk1BTCB8fAorICAgICAgICAgbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MSUdIVCAgKQorICAgIHsKKyAgICAgIGlmICggb3V0bGluZS0+ZmxhZ3MgJiBGVF9PVVRMSU5FX09WRVJMQVAgKQorICAgICAgICBlcnJvciA9IGZ0X3Ntb290aF9yYXN0ZXJfb3ZlcmxhcCggcmVuZGVyLCBvdXRsaW5lLCBiaXRtYXAgKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOworCisKKyAgICAgICAgcGFyYW1zLnRhcmdldCA9IGJpdG1hcDsKKyAgICAgICAgcGFyYW1zLnNvdXJjZSA9IG91dGxpbmU7CisgICAgICAgIHBhcmFtcy5mbGFncyAgPSBGVF9SQVNURVJfRkxBR19BQTsKKworICAgICAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKKyAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0QgKQorICAgICAgICBlcnJvciA9IGZ0X3Ntb290aF9yYXN0ZXJfbGNkICggcmVuZGVyLCBvdXRsaW5lLCBiaXRtYXAgKTsKKyAgICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICkKKyAgICAgICAgZXJyb3IgPSBmdF9zbW9vdGhfcmFzdGVyX2xjZHYoIHJlbmRlciwgb3V0bGluZSwgYml0bWFwICk7CiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwogCi0gICAgLyogaW1wbG9kZSBvdXRsaW5lIGlmIG5lZWRlZCAqLwotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50cyAgICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludHNfZW5kID0gcG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWM7Ci0KLQotICAgICAgaWYgKCBobXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT54ICo9IDM7Ci0KLSAgICAgIGlmICggdm11bCApCi0gICAgICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQotICAgICAgICAgIHZlYy0+eSAqPSAzOwotICAgIH0KLQotICAgIC8qIHJlbmRlciBvdXRsaW5lIGludG8gdGhlIGJpdG1hcCAqLwotICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwotCi0gICAgLyogZGVmbGF0ZSBvdXRsaW5lIGlmIG5lZWRlZCAqLwotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50cyAgICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludHNfZW5kID0gcG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWM7Ci0KLQotICAgICAgaWYgKCBobXVsICkKLSAgICAgICAgZm9yICggdmVjID0gcG9pbnRzOyB2ZWMgPCBwb2ludHNfZW5kOyB2ZWMrKyApCi0gICAgICAgICAgdmVjLT54IC89IDM7Ci0KLSAgICAgIGlmICggdm11bCApCi0gICAgICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQotICAgICAgICAgIHZlYy0+eSAvPSAzOwotICAgIH0KLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogZmluYWxseSBhcHBseSBmaWx0ZXJpbmcgKi8KLSAgICBpZiAoIGhtdWwgfHwgdm11bCApCi0gICAgewotICAgICAgRlRfQnl0ZSogICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzOwotICAgICAgRlRfQml0bWFwX0xjZEZpbHRlckZ1bmMgIGxjZF9maWx0ZXJfZnVuYzsKLQotCi0gICAgICAvKiBQZXItZmFjZSBMQ0QgZmlsdGVyaW5nIHRha2VzIHByaW9yaXR5IGlmIHNldCB1cC4gKi8KLSAgICAgIGlmICggc2xvdC0+ZmFjZSAmJiBzbG90LT5mYWNlLT5pbnRlcm5hbC0+bGNkX2ZpbHRlcl9mdW5jICkKKyAgICAgIC8qIGZpbmFsbHkgYXBwbHkgZmlsdGVyaW5nICovCiAgICAgICB7Ci0gICAgICAgIGxjZF93ZWlnaHRzICAgICA9IHNsb3QtPmZhY2UtPmludGVybmFsLT5sY2Rfd2VpZ2h0czsKLSAgICAgICAgbGNkX2ZpbHRlcl9mdW5jID0gc2xvdC0+ZmFjZS0+aW50ZXJuYWwtPmxjZF9maWx0ZXJfZnVuYzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbGNkX3dlaWdodHMgICAgID0gc2xvdC0+bGlicmFyeS0+bGNkX3dlaWdodHM7Ci0gICAgICAgIGxjZF9maWx0ZXJfZnVuYyA9IHNsb3QtPmxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYzsKLSAgICAgIH0KLQotICAgICAgaWYgKCBsY2RfZmlsdGVyX2Z1bmMgKQotICAgICAgICBsY2RfZmlsdGVyX2Z1bmMoIGJpdG1hcCwgbW9kZSwgbGNkX3dlaWdodHMgKTsKLSAgICB9Ci0KLSNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwotCi0gICAgaWYgKCBobXVsICkgIC8qIGxjZCAqLwotICAgIHsKLSAgICAgIEZUX0J5dGUqICBsaW5lOwotICAgICAgRlRfQnl0ZSogIHRlbXAgPSBOVUxMOwotICAgICAgRlRfVUludCAgIGksIGo7Ci0KLSAgICAgIHVuc2lnbmVkIGludCAgaGVpZ2h0ID0gYml0bWFwLT5yb3dzOwotICAgICAgdW5zaWduZWQgaW50ICB3aWR0aCAgPSBiaXRtYXAtPndpZHRoOwotICAgICAgaW50ICAgICAgICAgICBwaXRjaCAgPSBiaXRtYXAtPnBpdGNoOworICAgICAgICBGVF9CeXRlKiAgICAgICAgICAgICAgICAgbGNkX3dlaWdodHM7CisgICAgICAgIEZUX0JpdG1hcF9MY2RGaWx0ZXJGdW5jICBsY2RfZmlsdGVyX2Z1bmM7CiAKIAotICAgICAgLyogUmVuZGVyIDMgc2VwYXJhdGUgbW9ub2Nocm9tZSBiaXRtYXBzLCBzaGlmdGluZyB0aGUgb3V0bGluZSAgKi8KLSAgICAgIC8qIGJ5IDEvMyBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB3aWR0aCAvPSAzOwotCi0gICAgICBiaXRtYXAtPmJ1ZmZlciArPSB3aWR0aDsKLQotICAgICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgLTIxLCAwICk7Ci0gICAgICB4X3NoaWZ0ICAgICAgICAtPSAyMTsKLSAgICAgIGJpdG1hcC0+YnVmZmVyICs9IHdpZHRoOwotCi0gICAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCBvdXRsaW5lLCAgNDIsIDAgKTsKLSAgICAgIHhfc2hpZnQgICAgICAgICs9IDQyOwotICAgICAgYml0bWFwLT5idWZmZXIgLT0gMiAqIHdpZHRoOwotCi0gICAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIFhYWDogUmVhcnJhbmdlIHRoZSBieXRlcyBhY2NvcmRpbmcgdG8gRlRfUElYRUxfTU9ERV9MQ0QuICAgICovCi0gICAgICAvKiBYWFg6IEl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIHJlbmRlciBldmVyeSB0aGlyZCBieXRlIGFib3ZlLiAqLwotCi0gICAgICBpZiAoIEZUX0FMTE9DKCB0ZW1wLCAoRlRfVUxvbmcpcGl0Y2ggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGxpbmUgPSBiaXRtYXAtPmJ1ZmZlciArIGkgKiAoRlRfVUxvbmcpcGl0Y2g7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgd2lkdGg7IGorKyApCisgICAgICAgIC8qIFBlci1mYWNlIExDRCBmaWx0ZXJpbmcgdGFrZXMgcHJpb3JpdHkgaWYgc2V0IHVwLiAqLworICAgICAgICBpZiAoIHNsb3QtPmZhY2UgJiYgc2xvdC0+ZmFjZS0+aW50ZXJuYWwtPmxjZF9maWx0ZXJfZnVuYyApCiAgICAgICAgIHsKLSAgICAgICAgICB0ZW1wWzMgKiBqICAgIF0gPSBsaW5lW2pdOwotICAgICAgICAgIHRlbXBbMyAqIGogKyAxXSA9IGxpbmVbaiArIHdpZHRoXTsKLSAgICAgICAgICB0ZW1wWzMgKiBqICsgMl0gPSBsaW5lW2ogKyB3aWR0aCArIHdpZHRoXTsKKyAgICAgICAgICBsY2Rfd2VpZ2h0cyAgICAgPSBzbG90LT5mYWNlLT5pbnRlcm5hbC0+bGNkX3dlaWdodHM7CisgICAgICAgICAgbGNkX2ZpbHRlcl9mdW5jID0gc2xvdC0+ZmFjZS0+aW50ZXJuYWwtPmxjZF9maWx0ZXJfZnVuYzsKICAgICAgICAgfQotICAgICAgICBGVF9NRU1fQ09QWSggbGluZSwgdGVtcCwgcGl0Y2ggKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgbGNkX3dlaWdodHMgICAgID0gc2xvdC0+bGlicmFyeS0+bGNkX3dlaWdodHM7CisgICAgICAgICAgbGNkX2ZpbHRlcl9mdW5jID0gc2xvdC0+bGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBsY2RfZmlsdGVyX2Z1bmMgKQorICAgICAgICAgIGxjZF9maWx0ZXJfZnVuYyggYml0bWFwLCBsY2Rfd2VpZ2h0cyApOwogICAgICAgfQogCi0gICAgICBGVF9GUkVFKCB0ZW1wICk7CisjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KKwogICAgIH0KLSAgICBlbHNlIGlmICggdm11bCApICAvKiBsY2RfdiAqLwotICAgIHsKLSAgICAgIGludCAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLQotCi0gICAgICAvKiBSZW5kZXIgMyBzZXBhcmF0ZSBtb25vY2hyb21lIGJpdG1hcHMsIHNoaWZ0aW5nIHRoZSBvdXRsaW5lICAqLwotICAgICAgLyogYnkgMS8zIHBpeGVsLiBUcmlwbGUgdGhlIHBpdGNoIHRvIHJlbmRlciBvbiBlYWNoIHRoaXJkIHJvdy4gKi8KLSAgICAgIGJpdG1hcC0+cGl0Y2ggKj0gMzsKLSAgICAgIGJpdG1hcC0+cm93cyAgLz0gMzsKLQotICAgICAgYml0bWFwLT5idWZmZXIgKz0gcGl0Y2g7Ci0KLSAgICAgIGVycm9yID0gcmVuZGVyLT5yYXN0ZXJfcmVuZGVyKCByZW5kZXItPnJhc3RlciwgJnBhcmFtcyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIDAsICAyMSApOwotICAgICAgeV9zaGlmdCAgICAgICAgKz0gMjE7Ci0gICAgICBiaXRtYXAtPmJ1ZmZlciArPSBwaXRjaDsKLQotICAgICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgMCwgLTQyICk7Ci0gICAgICB5X3NoaWZ0ICAgICAgICAtPSA0MjsKLSAgICAgIGJpdG1hcC0+YnVmZmVyIC09IDIgKiBwaXRjaDsKLQotICAgICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBiaXRtYXAtPnBpdGNoIC89IDM7Ci0gICAgICBiaXRtYXAtPnJvd3MgICo9IDM7Ci0gICAgfQotICAgIGVsc2UgIC8qIGdyYXlzY2FsZSAqLwotICAgICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgKi8KIAogICBFeGl0OgogICAgIGlmICggIWVycm9yICkKQEAgLTM0MSw0NSArNTY1LDYgQEAKICAgfQogCiAKLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApCi0gIHsKLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTElHSFQgKQotICAgICAgbW9kZSA9IEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKLQotICAgIHJldHVybiBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIHJlbmRlciwgc2xvdCwgbW9kZSwgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCApOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IGEgc2xvdCdzIGdseXBoIGltYWdlIGludG8gYSBob3Jpem9udGFsIExDRCBiaXRtYXAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9yZW5kZXJfbGNkKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApCi0gIHsKLSAgICByZXR1cm4gZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKCByZW5kZXIsIHNsb3QsIG1vZGUsIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9MQ0QgKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgdmVydGljYWwgTENEIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcl9sY2RfdiggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyggcmVuZGVyLCBzbG90LCBtb2RlLCBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkVOREVSX01PREVfTENEX1YgKTsKLSAgfQotCi0KICAgRlRfREVGSU5FX1JFTkRFUkVSKAogICAgIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzcywKIApAQCAtNDAzLDYxICs1ODgsNyBAQAogICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Ntb290aF9nZXRfY2JveCwgICAvKiBnZXRfZ2x5cGhfY2JveCAgKi8KICAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9zbW9vdGhfc2V0X21vZGUsICAgLyogc2V0X21vZGUgICAgICAgICovCiAKLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikmRlRfR1JBWVNfUkFTVEVSX0dFVCAgICAgICAgICAgLyogcmFzdGVyX2NsYXNzICAgICovCi0gICkKLQotCi0gIEZUX0RFRklORV9SRU5ERVJFUigKLSAgICBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzLAotCi0gICAgICBGVF9NT0RVTEVfUkVOREVSRVIsCi0gICAgICBzaXplb2YgKCBGVF9SZW5kZXJlclJlYyApLAotCi0gICAgICAic21vb3RoLWxjZCIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICBOVUxMLCAgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpZnRfc21vb3RoX2luaXQsICAvKiBtb2R1bGVfaW5pdCAgICovCi0gICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIE5VTEwsICAgICAgICAgICAgLyogbW9kdWxlX2RvbmUgICAqLwotICAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICBOVUxMLCAgICAgICAgICAgIC8qIGdldF9pbnRlcmZhY2UgKi8KLQotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotCi0gICAgKEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMpICAgZnRfc21vb3RoX3JlbmRlcl9sY2QsICAvKiByZW5kZXJfZ2x5cGggICAgKi8KLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9zbW9vdGhfdHJhbnNmb3JtLCAgIC8qIHRyYW5zZm9ybV9nbHlwaCAqLwotICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Ntb290aF9nZXRfY2JveCwgICAgLyogZ2V0X2dseXBoX2Nib3ggICovCi0gICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfc21vb3RoX3NldF9tb2RlLCAgICAvKiBzZXRfbW9kZSAgICAgICAgKi8KLQotICAgIChGVF9SYXN0ZXJfRnVuY3MqKSZGVF9HUkFZU19SQVNURVJfR0VUICAgICAgICAgICAgLyogcmFzdGVyX2NsYXNzICAgICovCi0gICkKLQotCi0gIEZUX0RFRklORV9SRU5ERVJFUigKLSAgICBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mICggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInNtb290aC1sY2R2IiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIE5VTEwsICAgIC8qIG1vZHVsZSBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilmdF9zbW9vdGhfaW5pdCwgIC8qIG1vZHVsZV9pbml0ICAgKi8KLSAgICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwgICAgICAgICAgICAvKiBtb2R1bGVfZG9uZSAgICovCi0gICAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIE5VTEwsICAgICAgICAgICAgLyogZ2V0X2ludGVyZmFjZSAqLwotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykgICBmdF9zbW9vdGhfcmVuZGVyX2xjZF92LCAgLyogcmVuZGVyX2dseXBoICAgICovCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfc21vb3RoX3RyYW5zZm9ybSwgICAgIC8qIHRyYW5zZm9ybV9nbHlwaCAqLwotICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Ntb290aF9nZXRfY2JveCwgICAgICAvKiBnZXRfZ2x5cGhfY2JveCAgKi8KLSAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9zbW9vdGhfc2V0X21vZGUsICAgICAgLyogc2V0X21vZGUgICAgICAgICovCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikmRlRfR1JBWVNfUkFTVEVSX0dFVCAgICAgICAgICAgICAgLyogcmFzdGVyX2NsYXNzICAgICovCisgICAgKEZUX1Jhc3Rlcl9GdW5jcyopJmZ0X2dyYXlzX3Jhc3RlciAgICAgICAgICAgICAgIC8qIHJhc3Rlcl9jbGFzcyAgICAqLwogICApCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9mdHNtb290aC5oIGIvc3JjL3Ntb290aC9mdHNtb290aC5oCmluZGV4IGM3NmZmYzUuLjIyYTg4ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9zbW9vdGgvZnRzbW9vdGguaAorKysgYi9zcmMvc21vb3RoL2Z0c21vb3RoLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c21vb3RoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBbnRpLWFsaWFzaW5nIHJlbmRlcmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGZ0c21vb3RoLmgKKyAqCisgKiAgIEFudGktYWxpYXNpbmcgcmVuZGVyZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgRlRTTU9PVEhfSF8KICNkZWZpbmUgRlRTTU9PVEhfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1JFTkRFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTI5LDEwICsyOCw2IEBACiAKICAgRlRfREVDTEFSRV9SRU5ERVJFUiggZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICkKIAotICBGVF9ERUNMQVJFX1JFTkRFUkVSKCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKLQotICBGVF9ERUNMQVJFX1JFTkRFUkVSKCBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyApCi0KIAogRlRfRU5EX0hFQURFUgogCmRpZmYgLS1naXQgYS9zcmMvc21vb3RoL2Z0c3BpYy5jIGIvc3JjL3Ntb290aC9mdHNwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBmMDRjZi4uMDAwMDAwMAotLS0gYS9zcmMvc21vb3RoL2Z0c3BpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3BpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc21vb3RoIG1vZHVsZS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJmdHNwaWMuaCIKLSNpbmNsdWRlICJmdHNtZXJycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRncmF5cy5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoIEZUX1Jhc3Rlcl9GdW5jcyogIGZ1bmNzICk7Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnNtb290aCApCi0gICAgewotICAgICAgU21vb3RoUElDKiAgY29udGFpbmVyID0gKFNtb290aFBJQyopcGljX2NvbnRhaW5lci0+c21vb3RoOwotCi0KLSAgICAgIGlmICggLS1jb250YWluZXItPnJlZl9jb3VudCApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5zbW9vdGggPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgU21vb3RoUElDKiAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gc2VydmUgc21vb3RoX2xjZCBhbmQgc21vb3RoX2xjZHYgcmVuZGVyZXJzLAotICAgICAgIGl0IGltcGxlbWVudHMgcmVmZXJlbmNlIGNvdW50aW5nICovCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5zbW9vdGggKQotICAgIHsKLSAgICAgICgoU21vb3RoUElDKilwaWNfY29udGFpbmVyLT5zbW9vdGgpLT5yZWZfY291bnQrKzsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+c21vb3RoID0gY29udGFpbmVyOwotCi0gICAgY29udGFpbmVyLT5yZWZfY291bnQgPSAxOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoICZjb250YWluZXItPmZ0X2dyYXlzX3Jhc3RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiByZS1yb3V0ZSB0aGVzZSBpbml0IGFuZCBmcmVlIGZ1bmN0aW9ucyB0byB0aGUgYWJvdmUgZnVuY3Rpb25zICovCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggbGlicmFyeSApOwotICB9Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIHJldHVybiBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIGxpYnJhcnkgKTsKLSAgfQotCi0KLSAgdm9pZAotICBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRzcGljLmggYi9zcmMvc21vb3RoL2Z0c3BpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGZiNjRjLi4wMDAwMDAwCi0tLSBhL3NyYy9zbW9vdGgvZnRzcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHNtb290aCBtb2R1bGUuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgRlRTUElDX0hfCi0jZGVmaW5lIEZUU1BJQ19IXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9HUkFZU19SQVNURVJfR0VUICBmdF9ncmF5c19yYXN0ZXIKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgU21vb3RoUElDXwotICB7Ci0gICAgaW50ICAgICAgICAgICAgICByZWZfY291bnQ7Ci0gICAgRlRfUmFzdGVyX0Z1bmNzICBmdF9ncmF5c19yYXN0ZXI7Ci0KLSAgfSBTbW9vdGhQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSBcCi0gICAgICAgICAgKCAoU21vb3RoUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnNtb290aCApICkKLSNkZWZpbmUgRlRfR1JBWVNfUkFTVEVSX0dFVCAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X2dyYXlzX3Jhc3RlciApCi0KLQotICAvKiBzZWUgZnRzcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVFNQSUNfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvbW9kdWxlLm1rIGIvc3JjL3Ntb290aC9tb2R1bGUubWsKaW5kZXggNWI4YmMzYi4uOWIxNTA3ZiAxMDA2NDQKLS0tIGEvc3JjL3Ntb290aC9tb2R1bGUubWsKKysrIGIvc3JjL3Ntb290aC9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTE4LDEwICsxOCw2IEBACiBkZWZpbmUgU01PT1RIX1JFTkRFUkVSCiAkKE9QRU5fRFJJVkVSKSBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQogJChFQ0hPX0RSSVZFUilzbW9vdGggICAgJChFQ0hPX0RSSVZFUl9ERVNDKWFudGktYWxpYXNlZCBiaXRtYXAgcmVuZGVyZXIkKEVDSE9fRFJJVkVSX0RPTkUpCi0kKE9QRU5fRFJJVkVSKSBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcyAkKENMT1NFX0RSSVZFUikKLSQoRUNIT19EUklWRVIpc21vb3RoICAgICQoRUNIT19EUklWRVJfREVTQylhbnRpLWFsaWFzZWQgYml0bWFwIHJlbmRlcmVyIGZvciBMQ0RzJChFQ0hPX0RSSVZFUl9ET05FKQotJChPUEVOX0RSSVZFUikgRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzICQoQ0xPU0VfRFJJVkVSKQotJChFQ0hPX0RSSVZFUilzbW9vdGggICAgJChFQ0hPX0RSSVZFUl9ERVNDKWFudGktYWxpYXNlZCBiaXRtYXAgcmVuZGVyZXIgZm9yIHZlcnRpY2FsIExDRHMkKEVDSE9fRFJJVkVSX0RPTkUpCiBlbmRlZgogCiAjIEVPRgpkaWZmIC0tZ2l0IGEvc3JjL3Ntb290aC9ydWxlcy5tayBiL3NyYy9zbW9vdGgvcnVsZXMubWsKaW5kZXggZjMwODI0YS4uYjA4MDU2ZiAxMDA2NDQKLS0tIGEvc3JjL3Ntb290aC9ydWxlcy5taworKysgYi9zcmMvc21vb3RoL3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0yOSw4ICsyOSw3IEBACiAjIHNtb290aCBkcml2ZXIgc291cmNlcyAoaS5lLiwgQyBmaWxlcykKICMKIFNNT09USF9EUlZfU1JDIDo9ICQoU01PT1RIX0RJUikvZnRncmF5cy5jICBcCi0gICAgICAgICAgICAgICAgICAkKFNNT09USF9ESVIpL2Z0c21vb3RoLmMgXAotICAgICAgICAgICAgICAgICAgJChTTU9PVEhfRElSKS9mdHNwaWMuYworICAgICAgICAgICAgICAgICAgJChTTU9PVEhfRElSKS9mdHNtb290aC5jCiAKIAogIyBzbW9vdGggZHJpdmVyIGhlYWRlcnMKZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvc21vb3RoLmMgYi9zcmMvc21vb3RoL3Ntb290aC5jCmluZGV4IDUyNDlhODkuLjA0YjUzMWMgMTAwNjQ0Ci0tLSBhL3NyYy9zbW9vdGgvc21vb3RoLmMKKysrIGIvc3JjL3Ntb290aC9zbW9vdGguYwpAQCAtMSwyNyArMSwyNSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc21vb3RoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGFudGktYWxpYXNpbmcgcmFzdGVyZXIgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogc21vb3RoLmMKKyAqCisgKiAgIEZyZWVUeXBlIGFudGktYWxpYXNpbmcgcmFzdGVyZXIgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAKICNpbmNsdWRlICJmdGdyYXlzLmMiCiAjaW5jbHVkZSAiZnRzbW9vdGguYyIKLSNpbmNsdWRlICJmdHNwaWMuYyIKIAogCiAvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90b29scy9KYW1maWxlIGIvc3JjL3Rvb2xzL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NTE2MWUuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgSmFtZmlsZSBmb3Igc3JjL3Rvb2xzCi0jCi1TdWJEaXIgRlQyX1RPUCBzcmMgdG9vbHMgOwotCi1NYWluICBhcGluYW1lcyA6IGFwaW5hbWVzLmMgOwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2FmYmx1ZS5wbCBiL3NyYy90b29scy9hZmJsdWUucGwKaW5kZXggN2M2ZjFhNy4uYmJjNGY0NyAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL2FmYmx1ZS5wbAorKysgYi9zcmMvdG9vbHMvYWZibHVlLnBsCkBAIC01LDcgKzUsNyBAQAogIwogIyBQcm9jZXNzIGEgYmx1ZSB6b25lIGNoYXJhY3RlciBkYXRhIGZpbGUuCiAjCi0jIENvcHlyaWdodCAyMDEzLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDEzLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvYXBpbmFtZXMuYyBiL3NyYy90b29scy9hcGluYW1lcy5jCmluZGV4IDA2YzMyNjAuLmFlZWNmODggMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9hcGluYW1lcy5jCisrKyBiL3NyYy90b29scy9hcGluYW1lcy5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKiBhY2NlcHRlZCBpZiB5b3UgYXJlIHVzaW5nIEdDQyBmb3IgY29tcGlsYXRpb24gKGFuZCBwcm9iYWJseSBieQogICogb3RoZXIgY29tcGlsZXJzIHRvbykuCiAgKgotICogQXV0aG9yOiBEYXZpZCBUdXJuZXIsIDIwMDUsIDIwMDYsIDIwMDgtMjAxMywgMjAxNQorICogQXV0aG9yOiBGcmVlVHlwZSB0ZWFtLCAyMDA1LTIwMTkKICAqCiAgKiBUaGlzIGNvZGUgaXMgZXhwbGljaXRseSBwbGFjZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KICAqCkBAIC0yNiw2ICsyNiw3IEBACiAKICNkZWZpbmUgIExJTkVCVUZGX1NJWkUgIDEwMjQKIAorCiB0eXBlZGVmIGVudW0gIE91dHB1dEZvcm1hdF8KIHsKICAgT1VUUFVUX0xJU1QgPSAwLCAgICAgIC8qIG91dHB1dCB0aGUgbGlzdCBvZiBuYW1lcywgb25lIHBlciBsaW5lICAgICAgICAgICAgICovCkBAIC01MywxMCArNTQsMTIgQEAKIAogfSBOYW1lUmVjLCAqTmFtZTsKIAorCiBzdGF0aWMgTmFtZSAgdGhlX25hbWVzOwogc3RhdGljIGludCAgIG51bV9uYW1lczsKIHN0YXRpYyBpbnQgICBtYXhfbmFtZXM7CiAKKwogc3RhdGljIHZvaWQKIG5hbWVzX2FkZCggY29uc3QgY2hhciogIG5hbWUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIqICBlbmQgKQpAQCAtNjUsMTQgKzY4LDE2IEBACiAgIGludCAgICAgICAgICAgbm4sIGxlbjsKICAgTmFtZSAgICAgICAgICBubTsKIAorCiAgIGlmICggZW5kIDw9IG5hbWUgKQogICAgIHJldHVybjsKIAogICAvKiBjb21wdXRlIGhhc2ggdmFsdWUgKi8KLSAgbGVuID0gKGludCkoZW5kIC0gbmFtZSk7CisgIGxlbiA9IChpbnQpKCBlbmQgLSBuYW1lICk7CiAgIGggICA9IDA7CisKICAgZm9yICggbm4gPSAwOyBubiA8IGxlbjsgbm4rKyApCi0gICAgaCA9IGgqMzMgKyBuYW1lW25uXTsKKyAgICBoID0gaCAqIDMzICsgbmFtZVtubl07CiAKICAgLyogY2hlY2sgZm9yIGFuIHByZS1leGlzdGluZyBuYW1lICovCiAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXM7IG5uKysgKQpAQCAtODgsNyArOTMsNyBAQAogICAvKiBhZGQgbmV3IG5hbWUgKi8KICAgaWYgKCBudW1fbmFtZXMgPj0gbWF4X25hbWVzICkKICAgewotICAgIG1heF9uYW1lcyArPSAobWF4X25hbWVzID4+IDEpICsgNDsKKyAgICBtYXhfbmFtZXMgKz0gKCBtYXhfbmFtZXMgPj4gMSApICsgNDsKICAgICB0aGVfbmFtZXMgID0gKE5hbWVSZWMqKXJlYWxsb2MoIHRoZV9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIHRoZV9uYW1lc1swXSApICogbWF4X25hbWVzICk7CiAgICAgaWYgKCAhdGhlX25hbWVzICkKQEAgLTk3LDcgKzEwMiw3IEBACiAgIG5tID0gJnRoZV9uYW1lc1tudW1fbmFtZXMrK107CiAKICAgbm0tPmhhc2ggPSBoOwotICBubS0+bmFtZSA9IChjaGFyKiltYWxsb2MoIGxlbisxICk7CisgIG5tLT5uYW1lID0gKGNoYXIqKW1hbGxvYyggbGVuICsgMSApOwogICBpZiAoICFubS0+bmFtZSApCiAgICAgcGFuaWMoICJub3QgZW5vdWdoIG1lbW9yeSIgKTsKIApAQCAtMTE2LDYgKzEyMSw3IEBACiAgIHJldHVybiBzdHJjbXAoIG4xLT5uYW1lLCBuMi0+bmFtZSApOwogfQogCisKIHN0YXRpYyB2b2lkCiBuYW1lc19zb3J0KCB2b2lkICkKIHsKQEAgLTEzNCw4OSArMTQwLDk1IEBACiAKICAgc3dpdGNoICggZm9ybWF0ICkKICAgewotICAgIGNhc2UgT1VUUFVUX1dJTkRPV1NfREVGOgotICAgICAgaWYgKCBkbGxfbmFtZSApCi0gICAgICAgIGZwcmludGYoIG91dCwgIkxJQlJBUlkgJXNcbiIsIGRsbF9uYW1lICk7CisgIGNhc2UgT1VUUFVUX1dJTkRPV1NfREVGOgorICAgIGlmICggZGxsX25hbWUgKQorICAgICAgZnByaW50Ziggb3V0LCAiTElCUkFSWSAlc1xuIiwgZGxsX25hbWUgKTsKIAotICAgICAgZnByaW50Ziggb3V0LCAiREVTQ1JJUFRJT04gIEZyZWVUeXBlIDIgRExMXG4iICk7Ci0gICAgICBmcHJpbnRmKCBvdXQsICJFWFBPUlRTXG4iICk7Ci0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzOyBubisrICkKLSAgICAgICAgZnByaW50Ziggb3V0LCAiICAlc1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7Ci0gICAgICBicmVhazsKKyAgICBmcHJpbnRmKCBvdXQsICJERVNDUklQVElPTiAgRnJlZVR5cGUgMiBETExcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXQsICJFWFBPUlRTXG4iICk7CiAKLSAgICBjYXNlIE9VVFBVVF9CT1JMQU5EX0RFRjoKLSAgICAgIGlmICggZGxsX25hbWUgKQotICAgICAgICBmcHJpbnRmKCBvdXQsICJMSUJSQVJZICVzXG4iLCBkbGxfbmFtZSApOworICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXM7IG5uKysgKQorICAgICAgZnByaW50Ziggb3V0LCAiICAlc1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7CiAKLSAgICAgIGZwcmludGYoIG91dCwgIkRFU0NSSVBUSU9OICBGcmVlVHlwZSAyIERMTFxuIiApOwotICAgICAgZnByaW50Ziggb3V0LCAiRVhQT1JUU1xuIiApOwotICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9uYW1lczsgbm4rKyApCi0gICAgICAgIGZwcmludGYoIG91dCwgIiAgXyVzXG4iLCB0aGVfbmFtZXNbbm5dLm5hbWUgKTsKLSAgICAgIGJyZWFrOworICAgIGJyZWFrOwogCi0gICAgY2FzZSBPVVRQVVRfV0FUQ09NX0xCQzoKKyAgY2FzZSBPVVRQVVRfQk9STEFORF9ERUY6CisgICAgaWYgKCBkbGxfbmFtZSApCisgICAgICBmcHJpbnRmKCBvdXQsICJMSUJSQVJZICVzXG4iLCBkbGxfbmFtZSApOworCisgICAgZnByaW50Ziggb3V0LCAiREVTQ1JJUFRJT04gIEZyZWVUeXBlIDIgRExMXG4iICk7CisgICAgZnByaW50Ziggb3V0LCAiRVhQT1JUU1xuIiApOworCisgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9uYW1lczsgbm4rKyApCisgICAgICBmcHJpbnRmKCBvdXQsICIgIF8lc1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7CisKKyAgICBicmVhazsKKworICBjYXNlIE9VVFBVVF9XQVRDT01fTEJDOgorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIqICBkb3Q7CisgICAgICBjaGFyICAgICAgICAgdGVtcFs1MTJdOworCisKKyAgICAgIGlmICggIWRsbF9uYW1lICkKICAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIGRvdDsKLSAgICAgICAgY2hhciAgICAgICAgIHRlbXBbNTEyXTsKLQotCi0gICAgICAgIGlmICggIWRsbF9uYW1lICkKLSAgICAgICAgewotICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwKLSAgICAgICAgICAgICAgICAgICAieW91IG11c3QgcHJvdmlkZSBhIERMTCBuYW1lIHdpdGggdGhlIC1kIG9wdGlvbiFcbiIgKTsKLSAgICAgICAgICBleGl0KCA0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB3ZSBtdXN0IG9taXQgdGhlIC5kbGwgc3VmZml4IGZyb20gdGhlIGxpYnJhcnkgbmFtZSAqLwotICAgICAgICBkb3QgPSBzdHJjaHIoIGRsbF9uYW1lLCAnLicgKTsKLSAgICAgICAgaWYgKCBkb3QgKQotICAgICAgICB7Ci0gICAgICAgICAgaW50ICBsZW4gPSBkb3QgLSBkbGxfbmFtZTsKLQotCi0gICAgICAgICAgaWYgKCBsZW4gPiAoaW50KSggc2l6ZW9mICggdGVtcCApIC0gMSApICkKLSAgICAgICAgICAgIGxlbiA9IHNpemVvZiAoIHRlbXAgKSAtIDE7Ci0KLSAgICAgICAgICBtZW1jcHkoIHRlbXAsIGRsbF9uYW1lLCBsZW4gKTsKLSAgICAgICAgICB0ZW1wW2xlbl0gPSAwOwotCi0gICAgICAgICAgZGxsX25hbWUgPSAoY29uc3QgY2hhciopdGVtcDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXM7IG5uKysgKQotICAgICAgICAgIGZwcmludGYoIG91dCwgIisrXyVzLiVzLiVzXG4iLCB0aGVfbmFtZXNbbm5dLm5hbWUsIGRsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlX25hbWVzW25uXS5uYW1lICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgInlvdSBtdXN0IHByb3ZpZGUgYSBETEwgbmFtZSB3aXRoIHRoZSAtZCBvcHRpb24hXG4iICk7CisgICAgICAgIGV4aXQoIDQgKTsKICAgICAgIH0KLSAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBPVVRQVVRfTkVUV0FSRV9JTVA6CisgICAgICAvKiB3ZSBtdXN0IG9taXQgdGhlIGAuZGxsJyBzdWZmaXggZnJvbSB0aGUgbGlicmFyeSBuYW1lICovCisgICAgICBkb3QgPSBzdHJjaHIoIGRsbF9uYW1lLCAnLicgKTsKKyAgICAgIGlmICggZG90ICkKICAgICAgIHsKLSAgICAgICAgaWYgKCBkbGxfbmFtZSApCi0gICAgICAgICAgZnByaW50Ziggb3V0LCAiICAoJXMpXG4iLCBkbGxfbmFtZSApOwotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzIC0gMTsgbm4rKyApCi0gICAgICAgICAgZnByaW50Ziggb3V0LCAiICAlcyxcbiIsIHRoZV9uYW1lc1tubl0ubmFtZSApOwotICAgICAgICBmcHJpbnRmKCBvdXQsICIgICVzXG4iLCB0aGVfbmFtZXNbbnVtX25hbWVzIC0gMV0ubmFtZSApOwotICAgICAgfQotICAgICAgYnJlYWs7CisgICAgICAgIGludCAgbGVuID0gZG90IC0gZGxsX25hbWU7CiAKLSAgICBjYXNlIE9VVFBVVF9HTlVfVkVSTUFQOgotICAgICAgewotICAgICAgICBmcHJpbnRmKCBvdXQsICJ7XG5cdGdsb2JhbDpcbiIgKTsKLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9uYW1lczsgbm4rKyApCi0gICAgICAgICAgZnByaW50Ziggb3V0LCAiXHRcdCVzO1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7Ci0gICAgICAgIGZwcmludGYoIG91dCwgIlx0bG9jYWw6XG5cdFx0Kjtcbn07XG4iICk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6ICAvKiBMSVNUICovCisgICAgICAgIGlmICggbGVuID4gKGludCkoIHNpemVvZiAoIHRlbXAgKSAtIDEgKSApCisgICAgICAgICAgbGVuID0gc2l6ZW9mICggdGVtcCApIC0gMTsKKworICAgICAgICBtZW1jcHkoIHRlbXAsIGRsbF9uYW1lLCBsZW4gKTsKKyAgICAgICAgdGVtcFtsZW5dID0gMDsKKworICAgICAgICBkbGxfbmFtZSA9IChjb25zdCBjaGFyKil0ZW1wOworICAgICAgfQorCiAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzOyBubisrICkKLSAgICAgICAgZnByaW50Ziggb3V0LCAiJXNcbiIsIHRoZV9uYW1lc1tubl0ubmFtZSApOworICAgICAgICBmcHJpbnRmKCBvdXQsICIrK18lcy4lcy4lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aGVfbmFtZXNbbm5dLm5hbWUsIGRsbF9uYW1lLCB0aGVfbmFtZXNbbm5dLm5hbWUgKTsKKyAgICB9CisKKyAgICBicmVhazsKKworICBjYXNlIE9VVFBVVF9ORVRXQVJFX0lNUDoKKyAgICBpZiAoIGRsbF9uYW1lICkKKyAgICAgIGZwcmludGYoIG91dCwgIiAgKCVzKVxuIiwgZGxsX25hbWUgKTsKKworICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXMgLSAxOyBubisrICkKKyAgICAgIGZwcmludGYoIG91dCwgIiAgJXMsXG4iLCB0aGVfbmFtZXNbbm5dLm5hbWUgKTsKKyAgICBmcHJpbnRmKCBvdXQsICIgICVzXG4iLCB0aGVfbmFtZXNbbnVtX25hbWVzIC0gMV0ubmFtZSApOworCisgICAgYnJlYWs7CisKKyAgY2FzZSBPVVRQVVRfR05VX1ZFUk1BUDoKKyAgICBmcHJpbnRmKCBvdXQsICJ7XG5cdGdsb2JhbDpcbiIgKTsKKworICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fbmFtZXM7IG5uKysgKQorICAgICAgZnByaW50Ziggb3V0LCAiXHRcdCVzO1xuIiwgdGhlX25hbWVzW25uXS5uYW1lICk7CisKKyAgICBmcHJpbnRmKCBvdXQsICJcdGxvY2FsOlxuXHRcdCo7XG59O1xuIiApOworCisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDogIC8qIExJU1QgKi8KKyAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX25hbWVzOyBubisrICkKKyAgICAgIGZwcmludGYoIG91dCwgIiVzXG4iLCB0aGVfbmFtZXNbbm5dLm5hbWUgKTsKKworICAgIGJyZWFrOwogICB9CiB9CiAKIAotCi0KIC8qIHN0YXRlcyBvZiB0aGUgbGluZSBwYXJzZXIgKi8KIAogdHlwZWRlZiBlbnVtICBTdGF0ZV8KQEAgLTIyNiw4OSArMjM4LDk2IEBACiAKIH0gU3RhdGU7CiAKKwogc3RhdGljIGludAotcmVhZF9oZWFkZXJfZmlsZSggRklMRSogIGZpbGUsIGludCAgdmVyYm9zZSApCityZWFkX2hlYWRlcl9maWxlKCBGSUxFKiAgZmlsZSwKKyAgICAgICAgICAgICAgICAgIGludCAgICB2ZXJib3NlICkKIHsKICAgc3RhdGljIGNoYXIgIGJ1ZmZbTElORUJVRkZfU0laRSArIDFdOwogICBTdGF0ZSAgICAgICAgc3RhdGUgPSBTVEFURV9TVEFSVDsKIAorCiAgIHdoaWxlICggIWZlb2YoIGZpbGUgKSApCiAgIHsKICAgICBjaGFyKiAgcDsKIAorCiAgICAgaWYgKCAhZmdldHMoIGJ1ZmYsIExJTkVCVUZGX1NJWkUsIGZpbGUgKSApCiAgICAgICBicmVhazsKIAogICAgIHAgPSBidWZmOwogCi0gICAgd2hpbGUgKCAqcCAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcXCcpICkgIC8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKyAgICB3aGlsZSAoICpwICYmICggKnAgPT0gJyAnIHx8ICpwID09ICdcXCcgKSApCiAgICAgICBwKys7CiAKLSAgICBpZiAoICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyApICAvKiBza2lwIGVtcHR5IGxpbmVzICovCisgICAgLyogc2tpcCBlbXB0eSBsaW5lcyAqLworICAgIGlmICggKnAgPT0gJ1xuJyB8fCAqcCA9PSAnXHInICkKICAgICAgIGNvbnRpbnVlOwogCiAgICAgc3dpdGNoICggc3RhdGUgKQogICAgIHsKLSAgICAgIGNhc2UgU1RBVEVfU1RBUlQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG1lbWNtcCggcCwgIkZUX0VYUE9SVCgiLCAxMCApICE9IDAgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBwICs9IDEwOwotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAqcCA9PSAwIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyApCi0gICAgICAgICAgICAgIGdvdG8gTmV4dExpbmU7Ci0KLSAgICAgICAgICAgIGlmICggKnAgPT0gJyknICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcCsrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHN0YXRlID0gU1RBVEVfVFlQRTsKLQotICAgICAgICAgLyogc29tZXRpbWVzLCB0aGUgbmFtZSBpcyBqdXN0IGFmdGVyIHRoZSBGVF9FWFBPUlQoLi4uKSwgc28KLSAgICAgICAgICAqIHNraXAgd2hpdGVzcGFjZSwgYW5kIGZhbGwtdGhyb3VnaCBpZiB3ZSBmaW5kIGFuIGFscGhhbnVtZXJpYwotICAgICAgICAgICogY2hhcmFjdGVyCi0gICAgICAgICAgKi8KLSAgICAgICAgICB3aGlsZSAoICpwID09ICcgJyB8fCAqcCA9PSAnXHQnICkKLSAgICAgICAgICAgIHArKzsKLQotICAgICAgICAgIGlmICggIWlzYWxwaGEoKnApICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgICBjYXNlIFNUQVRFX1RZUEU6Ci0gICAgICAgIHsKLSAgICAgICAgICBjaGFyKiAgIG5hbWUgPSBwOwotCi0gICAgICAgICAgd2hpbGUgKCBpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycgKQotICAgICAgICAgICAgcCsrOwotCi0gICAgICAgICAgaWYgKCBwID4gbmFtZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCB2ZXJib3NlICkKLSAgICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiPj4+ICUuKnNcbiIsIChpbnQpKHAgLSBuYW1lKSwgbmFtZSApOwotCi0gICAgICAgICAgICBuYW1lc19hZGQoIG5hbWUsIHAgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUQVJUOwotICAgICAgICB9CisgICAgY2FzZSBTVEFURV9TVEFSVDoKKyAgICAgIGlmICggbWVtY21wKCBwLCAiRlRfRVhQT1JUKCIsIDEwICkgIT0gMCApCiAgICAgICAgIGJyZWFrOwogCi0gICAgICBkZWZhdWx0OgotICAgICAgICA7CisgICAgICBwICs9IDEwOworICAgICAgZm9yICg7OykKKyAgICAgIHsKKyAgICAgICAgaWYgKCAqcCA9PSAwIHx8ICpwID09ICdcbicgfHwgKnAgPT0gJ1xyJyApCisgICAgICAgICAgZ290byBOZXh0TGluZTsKKworICAgICAgICBpZiAoICpwID09ICcpJyApCisgICAgICAgIHsKKyAgICAgICAgICBwKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwKys7CisgICAgICB9CisKKyAgICAgIHN0YXRlID0gU1RBVEVfVFlQRTsKKworICAgICAgLyoKKyAgICAgICAqIFNvbWV0aW1lcywgdGhlIG5hbWUgaXMganVzdCBhZnRlciBgRlRfRVhQT1JUKC4uLiknLCBzbyBza2lwCisgICAgICAgKiB3aGl0ZXNwYWNlIGFuZCBmYWxsLXRocm91Z2ggaWYgd2UgZmluZCBhbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVyLgorICAgICAgICovCisgICAgICB3aGlsZSAoICpwID09ICcgJyB8fCAqcCA9PSAnXHQnICkKKyAgICAgICAgcCsrOworCisgICAgICBpZiAoICFpc2FscGhhKCAqcCApICkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLworCisgICAgY2FzZSBTVEFURV9UWVBFOgorICAgICAgeworICAgICAgICBjaGFyKiAgIG5hbWUgPSBwOworCisKKyAgICAgICAgd2hpbGUgKCBpc2FsbnVtKCAqcCApIHx8ICpwID09ICdfJyApCisgICAgICAgICAgcCsrOworCisgICAgICAgIGlmICggcCA+IG5hbWUgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCB2ZXJib3NlICkKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIj4+PiAlLipzXG4iLCAoaW50KSggcCAtIG5hbWUgKSwgbmFtZSApOworCisgICAgICAgICAgbmFtZXNfYWRkKCBuYW1lLCBwICk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9IFNUQVRFX1NUQVJUOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICA7CiAgICAgfQogCi0gIE5leHRMaW5lOgorTmV4dExpbmU6CiAgICAgOwotICB9CisgIH0gLyogZW5kIG9mIHdoaWxlIGxvb3AgKi8KIAogICByZXR1cm4gMDsKIH0KQEAgLTMxOCwxNDMgKzMzNywxNTQgQEAKIHVzYWdlKCB2b2lkICkKIHsKICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0ICBmb3JtYXQgPQotICAgIiVzICVzOiBleHRyYWN0IEZyZWVUeXBlIEFQSSBuYW1lcyBmcm9tIGhlYWRlciBmaWxlc1xuXG4iCi0gICAidGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgbGlzdCBvZiBwdWJsaWMgRnJlZVR5cGUgQVBJXG4iCi0gICAiZnVuY3Rpb25zLiBJdCByZWNlaXZlcyB0aGUgbGlzdCBvZiBoZWFkZXIgZmlsZXMgYXMgYXJndW1lbnQgYW5kXG4iCi0gICAiZ2VuZXJhdGVzIGEgc29ydGVkIGxpc3Qgb2YgdW5pcXVlIGlkZW50aWZpZXJzXG5cbiIKLQotICAgInVzYWdlOiAlcyBoZWFkZXIxIFtvcHRpb25zXSBbaGVhZGVyMiAuLi5dXG5cbiIKLQotICAgIm9wdGlvbnM6ICAgLSAgICAgIDogcGFyc2UgdGhlIGNvbnRlbnQgb2Ygc3RkaW4sIGlnbm9yZSBhcmd1bWVudHNcbiIKLSAgICIgICAgICAgICAgIC12ICAgICA6IHZlcmJvc2UgbW9kZSwgb3V0cHV0IHNlbnQgdG8gc3RhbmRhcmQgZXJyb3JcbiIKLSAgICIgICAgICAgICAgIC1vRklMRSA6IHdyaXRlIG91dHB1dCB0byBGSUxFIGluc3RlYWQgb2Ygc3RhbmRhcmQgb3V0cHV0XG4iCi0gICAiICAgICAgICAgICAtZE5BTUUgOiBpbmRpY2F0ZSBETEwgZmlsZSBuYW1lLCAnZnJlZXR5cGUuZGxsJyBieSBkZWZhdWx0XG4iCi0gICAiICAgICAgICAgICAtdyAgICAgOiBvdXRwdXQgLkRFRiBmaWxlIGZvciBWaXN1YWwgQysrIGFuZCBNaW5nd1xuIgotICAgIiAgICAgICAgICAgLXdCICAgIDogb3V0cHV0IC5ERUYgZmlsZSBmb3IgQm9ybGFuZCBDKytcbiIKLSAgICIgICAgICAgICAgIC13VyAgICA6IG91dHB1dCBXYXRjb20gTGlua2VyIFJlc3BvbnNlIEZpbGVcbiIKLSAgICIgICAgICAgICAgIC13TiAgICA6IG91dHB1dCBOZXRXYXJlIEltcG9ydCBGaWxlXG4iCi0gICAiICAgICAgICAgICAtd0wgICAgOiBvdXRwdXQgdmVyc2lvbiBtYXAgZm9yIEdOVSBvciBTb2xhcmlzIGxpbmtlclxuIgotICAgIlxuIjsKKyAgICAiJXMgJXM6IGV4dHJhY3QgRnJlZVR5cGUgQVBJIG5hbWVzIGZyb20gaGVhZGVyIGZpbGVzXG4iCisgICAgIlxuIgorICAgICJUaGlzIHByb2dyYW0gZXh0cmFjdHMgdGhlIGxpc3Qgb2YgcHVibGljIEZyZWVUeXBlIEFQSSBmdW5jdGlvbnMuXG4iCisgICAgIkl0IHJlY2VpdmVzIGEgbGlzdCBvZiBoZWFkZXIgZmlsZXMgYXMgYW4gYXJndW1lbnQgYW5kXG4iCisgICAgImdlbmVyYXRlcyBhIHNvcnRlZCBsaXN0IG9mIHVuaXF1ZSBpZGVudGlmaWVycyBpbiB2YXJpb3VzIGZvcm1hdHMuXG4iCisgICAgIlxuIgorICAgICJ1c2FnZTogJXMgaGVhZGVyMSBbb3B0aW9uc10gW2hlYWRlcjIgLi4uXVxuIgorICAgICJcbiIKKyAgICAib3B0aW9uczogICAtICAgICAgIHBhcnNlIHRoZSBjb250ZW50cyBvZiBzdGRpbiwgaWdub3JlIGFyZ3VtZW50c1xuIgorICAgICIgICAgICAgICAgIC12ICAgICAgdmVyYm9zZSBtb2RlLCBvdXRwdXQgc2VudCB0byBzdGFuZGFyZCBlcnJvclxuIgorICAgICIgICAgICAgICAgIC1vRklMRSAgd3JpdGUgb3V0cHV0IHRvIEZJTEUgaW5zdGVhZCBvZiBzdGFuZGFyZCBvdXRwdXRcbiIKKyAgICAiICAgICAgICAgICAtZE5BTUUgIGluZGljYXRlIERMTCBmaWxlIG5hbWUsICdmcmVldHlwZS5kbGwnIGJ5IGRlZmF1bHRcbiIKKyAgICAiICAgICAgICAgICAtdyAgICAgIG91dHB1dCAuREVGIGZpbGUgZm9yIFZpc3VhbCBDKysgYW5kIE1pbmd3XG4iCisgICAgIiAgICAgICAgICAgLXdCICAgICBvdXRwdXQgLkRFRiBmaWxlIGZvciBCb3JsYW5kIEMrK1xuIgorICAgICIgICAgICAgICAgIC13VyAgICAgb3V0cHV0IFdhdGNvbSBMaW5rZXIgUmVzcG9uc2UgRmlsZVxuIgorICAgICIgICAgICAgICAgIC13TiAgICAgb3V0cHV0IE5ldFdhcmUgSW1wb3J0IEZpbGVcbiIKKyAgICAiICAgICAgICAgICAtd0wgICAgIG91dHB1dCB2ZXJzaW9uIG1hcCBmb3IgR05VIG9yIFNvbGFyaXMgbGlua2VyXG4iCisgICAgIlxuIjsKIAogICBmcHJpbnRmKCBzdGRlcnIsCiAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgUFJPR1JBTV9OQU1FLAogICAgICAgICAgICBQUk9HUkFNX1ZFUlNJT04sCi0gICAgICAgICAgIFBST0dSQU1fTkFNRQotICAgICAgICAgICApOwotICBleGl0KDEpOworICAgICAgICAgICBQUk9HUkFNX05BTUUgKTsKKworICBleGl0KCAxICk7CiB9CiAKIAotaW50ICBtYWluKCBpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QqICBhcmd2ICkKK2ludAorbWFpbiggaW50ICAgICAgICAgICAgICAgICBhcmdjLAorICAgICAgY29uc3QgY2hhciogY29uc3QqICBhcmd2ICkKIHsKLSAgaW50ICAgICAgICAgICBmcm9tX3N0ZGluID0gMDsKLSAgaW50ICAgICAgICAgICB2ZXJib3NlID0gMDsKLSAgT3V0cHV0Rm9ybWF0ICBmb3JtYXQgPSBPVVRQVVRfTElTVDsgIC8qIHRoZSBkZWZhdWx0ICovCi0gIEZJTEUqICAgICAgICAgb3V0ICAgID0gc3Rkb3V0OworICBpbnQgICAgICAgICAgIGZyb21fc3RkaW4gICA9IDA7CisgIGludCAgICAgICAgICAgdmVyYm9zZSAgICAgID0gMDsKKyAgT3V0cHV0Rm9ybWF0ICBmb3JtYXQgICAgICAgPSBPVVRQVVRfTElTVDsgIC8qIHRoZSBkZWZhdWx0ICovCisgIEZJTEUqICAgICAgICAgb3V0ICAgICAgICAgID0gc3Rkb3V0OwogICBjb25zdCBjaGFyKiAgIGxpYnJhcnlfbmFtZSA9IE5VTEw7CiAKKwogICBpZiAoIGFyZ2MgPCAyICkKICAgICB1c2FnZSgpOwogCi0gIC8qICctJyB1c2VkIGFzIGEgc2luZ2xlIGFyZ3VtZW50IG1lYW5zIHJlYWQgc291cmNlIGZpbGUgZnJvbSBzdGRpbiAqLworICAvKiBgLScgdXNlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCBtZWFucyByZWFkIHNvdXJjZSBmaWxlIGZyb20gc3RkaW4gKi8KICAgd2hpbGUgKCBhcmdjID4gMSAmJiBhcmd2WzFdWzBdID09ICctJyApCiAgIHsKICAgICBjb25zdCBjaGFyKiAgYXJnID0gYXJndlsxXTsKIAorCiAgICAgc3dpdGNoICggYXJnWzFdICkKICAgICB7Ci0gICAgICBjYXNlICd2JzoKLSAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgY2FzZSAndic6CisgICAgICB2ZXJib3NlID0gMTsKKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdvJzoKKyAgICAgIGlmICggYXJnWzJdID09IDAgKQorICAgICAgeworICAgICAgICBpZiAoIGFyZ2MgPCAyICkKKyAgICAgICAgICB1c2FnZSgpOworCisgICAgICAgIGFyZyA9IGFyZ3ZbMl07CisgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgYXJnYy0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBhcmcgKz0gMjsKKworICAgICAgb3V0ID0gZm9wZW4oIGFyZywgInd0IiApOworICAgICAgaWYgKCAhb3V0ICkKKyAgICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJyVzJyBmb3Igd3JpdGluZ1xuIiwgYXJnICk7CisgICAgICAgIGV4aXQoIDMgKTsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBjYXNlICdkJzoKKyAgICAgIGlmICggYXJnWzJdID09IDAgKQorICAgICAgeworICAgICAgICBpZiAoIGFyZ2MgPCAyICkKKyAgICAgICAgICB1c2FnZSgpOworCisgICAgICAgIGFyZyA9IGFyZ3ZbMl07CisgICAgICAgIGFyZ3YrKzsKKyAgICAgICAgYXJnYy0tOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgICBhcmcgKz0gMjsKKworICAgICAgbGlicmFyeV9uYW1lID0gYXJnOworCisgICAgICBicmVhazsKKworICAgIGNhc2UgJ3cnOgorICAgICAgZm9ybWF0ID0gT1VUUFVUX1dJTkRPV1NfREVGOworCisgICAgICBzd2l0Y2ggKCBhcmdbMl0gKQorICAgICAgeworICAgICAgY2FzZSAnQic6CisgICAgICAgIGZvcm1hdCA9IE9VVFBVVF9CT1JMQU5EX0RFRjsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgJ28nOgotICAgICAgICBpZiAoIGFyZ1syXSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggYXJnYyA8IDIgKQotICAgICAgICAgICAgdXNhZ2UoKTsKLQotICAgICAgICAgIGFyZyA9IGFyZ3ZbMl07Ci0gICAgICAgICAgYXJndisrOwotICAgICAgICAgIGFyZ2MtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYXJnICs9IDI7Ci0KLSAgICAgICAgb3V0ID0gZm9wZW4oIGFyZywgInd0IiApOwotICAgICAgICBpZiAoICFvdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiY291bGQgbm90IG9wZW4gJyVzJyBmb3Igd3JpdGluZ1xuIiwgYXJndlsyXSApOwotICAgICAgICAgIGV4aXQoMyk7Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgJ1cnOgorICAgICAgICBmb3JtYXQgPSBPVVRQVVRfV0FUQ09NX0xCQzsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgICBpZiAoIGFyZ1syXSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggYXJnYyA8IDIgKQotICAgICAgICAgICAgdXNhZ2UoKTsKLQotICAgICAgICAgIGFyZyA9IGFyZ3ZbMl07Ci0gICAgICAgICAgYXJndisrOwotICAgICAgICAgIGFyZ2MtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYXJnICs9IDI7Ci0KLSAgICAgICAgbGlicmFyeV9uYW1lID0gYXJnOworICAgICAgY2FzZSAnTic6CisgICAgICAgIGZvcm1hdCA9IE9VVFBVVF9ORVRXQVJFX0lNUDsKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgJ3cnOgotICAgICAgICBmb3JtYXQgPSBPVVRQVVRfV0lORE9XU19ERUY7Ci0gICAgICAgIHN3aXRjaCAoIGFyZ1syXSApCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgIGZvcm1hdCA9IE9VVFBVVF9CT1JMQU5EX0RFRjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnVyc6Ci0gICAgICAgICAgICBmb3JtYXQgPSBPVVRQVVRfV0FUQ09NX0xCQzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICBmb3JtYXQgPSBPVVRQVVRfTkVUV0FSRV9JTVA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgZm9ybWF0ID0gT1VUUFVUX0dOVV9WRVJNQVA7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KKyAgICAgIGNhc2UgJ0wnOgorICAgICAgICBmb3JtYXQgPSBPVVRQVVRfR05VX1ZFUk1BUDsKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgMDoKLSAgICAgICAgZnJvbV9zdGRpbiA9IDE7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBkZWZhdWx0OgogICAgICAgICB1c2FnZSgpOworICAgICAgfQorCisgICAgICBicmVhazsKKworICAgIGNhc2UgMDoKKyAgICAgIGZyb21fc3RkaW4gPSAxOworCisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICB1c2FnZSgpOwogICAgIH0KIAogICAgIGFyZ2MtLTsKICAgICBhcmd2Kys7Ci0gIH0KKworICB9IC8qIGVuZCBvZiB3aGlsZSBsb29wICovCiAKICAgaWYgKCBmcm9tX3N0ZGluICkKLSAgewogICAgIHJlYWRfaGVhZGVyX2ZpbGUoIHN0ZGluLCB2ZXJib3NlICk7Ci0gIH0KICAgZWxzZQogICB7CiAgICAgZm9yICggLS1hcmdjLCBhcmd2Kys7IGFyZ2MgPiAwOyBhcmdjLS0sIGFyZ3YrKyApCiAgICAgewogICAgICAgRklMRSogIGZpbGUgPSBmb3BlbiggYXJndlswXSwgInJiIiApOwogCisKICAgICAgIGlmICggIWZpbGUgKQogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJ1bmFibGUgdG8gb3BlbiAnJXMnXG4iLCBhcmd2WzBdICk7CiAgICAgICBlbHNlCkBAIC00NjksNyArNDk5LDcgQEAKICAgfQogCiAgIGlmICggbnVtX25hbWVzID09IDAgKQotICAgIHBhbmljKCAiY291bGQgbm90IGZpbmQgZXhwb3J0ZWQgZnVuY3Rpb25zICEhXG4iICk7CisgICAgcGFuaWMoICJjb3VsZCBub3QgZmluZCBleHBvcnRlZCBmdW5jdGlvbnNcbiIgKTsKIAogICBuYW1lc19zb3J0KCk7CiAgIG5hbWVzX2R1bXAoIG91dCwgZm9ybWF0LCBsaWJyYXJ5X25hbWUgKTsKQEAgLTQ3OSwzICs1MDksNiBAQAogCiAgIHJldHVybiAwOwogfQorCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyLy5naXRpZ25vcmUgYi9zcmMvdG9vbHMvZG9jbWFrZXIvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyMGI2NC4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSoucHljCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZG9jbWFrZXIvY29udGVudC5weSBiL3NyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg3ODBhLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci9jb250ZW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLSMKLSMgIGNvbnRlbnQucHkKLSMKLSMgICAgUGFyc2UgY29tbWVudCBibG9ja3MgdG8gYnVpbGQgY29udGVudCBibG9ja3MgKGxpYnJhcnkgZmlsZSkuCi0jCi0jICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5Ci0jICBEYXZpZCBUdXJuZXIuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0jICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotIyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotIwotIyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gcGFyc2UgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2NrcywKLSMgYnVpbGRpbmcgbW9yZSBzdHJ1Y3R1cmVkIG9iamVjdHMgb3V0IG9mIHRoZW0uCi0jCi0KLQotZnJvbSBzb3VyY2VzIGltcG9ydCAqCi1mcm9tIHV0aWxzICAgaW1wb3J0ICoKLQotaW1wb3J0IHN0cmluZywgcmUKLQotCi0jCi0jIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZWN0IGNvZGUgc2VxdWVuY2VzLiAgYENvZGUgc2VxdWVuY2VzJyBhcmUgc2ltcGx5Ci0jIGNvZGUgZnJhZ21lbnRzIGVtYmVkZGVkIGluICd7JyBhbmQgJ30nLCBhcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZwotIyBleGFtcGxlLgotIwotIyAgIHsKLSMgICAgIHggPSB5ICsgejsKLSMgICAgIGlmICggem9va29vID09IDIgKQotIyAgICAgewotIyAgICAgICBmb29iYXIoKTsKLSMgICAgIH0KLSMgICB9Ci0jCi0jIE5vdGUgdGhhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IG9wZW5pbmcgYnJhY2UgYW5kIHRoZSBsYXN0IGNsb3NpbmcKLSMgYnJhY2UgbXVzdCBiZSBleGFjdGx5IHRoZSBzYW1lLiAgVGhlIGNvZGUgc2VxdWVuY2UgaXRzZWxmIHNob3VsZCBoYXZlIGEKLSMgbGFyZ2VyIGluZGVudGF0aW9uIHRoYW4gdGhlIHN1cnJvdW5kaW5nIGJyYWNlcy4KLSMKLXJlX2NvZGVfc3RhcnQgPSByZS5jb21waWxlKCByIihccyope1xzKiQiICkKLXJlX2NvZGVfZW5kICAgPSByZS5jb21waWxlKCByIihccyopfVxzKiQiICkKLQotCi0jCi0jIEEgcmVndWxhciBleHByZXNzaW9uIHRvIGlzb2xhdGUgaWRlbnRpZmllcnMgZnJvbSBvdGhlciB0ZXh0LiAgVHdvIHN5bnRheAotIyBmb3JtcyBhcmUgc3VwcG9ydGVkOgotIwotIyAgIDxuYW1lPgotIyAgIDxuYW1lPls8aWQ+XQotIwotIyB3aGVyZSBib3RoIGA8bmFtZT4nIGFuZCBgPGlkPicgY29uc2lzdCBvZiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgYF8nLAotIyBhbmQgYC0nLiAgVXNlIGA8aWQ+JyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUsIHZhbGlkIGA8bmFtZT4nIGVudHJpZXM7IGluIHRoZQotIyBpbmRleCwgYDxpZD4nIHdpbGwgYmUgYXBwZW5kZWQgaW4gcGFyZW50aGVzZXMuCi0jCi0jIEZvciBleGFtcGxlLAotIwotIyAgIHN0ZW1fZGFya2VuaW5nW2F1dG9maXRdCi0jCi0jIGJlY29tZXMgYHN0ZW1fZGFya2VuaW5nIChhdXRvZml0KScgaW4gdGhlIGluZGV4LgotIwotcmVfaWRlbnRpZmllciA9IHJlLmNvbXBpbGUoIHIiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoPzpcd3wtKSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPzpcWyg/Olx3fC0pK1xdKT8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFICkKLQotCi0jCi0jIFdlIGNvbGxlY3QgbWFjcm8gbmFtZXMgZW5kaW5nIGluIGBfSCcgKGdyb3VwIDEpLCBhcyBkZWZpbmVkIGluCi0jIGBmcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCcuICBXaGlsZSBvdXRwdXR0aW5nIHRoZSBvYmplY3QgZGF0YSwgd2UgdXNlCi0jIHRoaXMgaW5mbyB0b2dldGhlciB3aXRoIHRoZSBvYmplY3QncyBmaWxlIGxvY2F0aW9uIChncm91cCAyKSB0byBlbWl0IHRoZQotIyBhcHByb3ByaWF0ZSBoZWFkZXIgZmlsZSBtYWNybyBhbmQgaXRzIGFzc29jaWF0ZWQgZmlsZSBuYW1lIGJlZm9yZSB0aGUKLSMgb2JqZWN0IGl0c2VsZi4KLSMKLSMgRXhhbXBsZToKLSMKLSMgICAjZGVmaW5lIEZUX0ZSRUVUWVBFX0ggPGZyZWV0eXBlLmg+Ci0jCi1yZV9oZWFkZXJfbWFjcm8gPSByZS5jb21waWxlKCByJ14jZGVmaW5lXHN7MSx9KFx3ezEsfV9IKVxzezEsfTwoLiopPicgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIENPREUgQ0xBU1MKLSMjCi0jIyAgVGhlIGBEb2NDb2RlJyBjbGFzcyBpcyB1c2VkIHRvIHN0b3JlIHNvdXJjZSBjb2RlIGxpbmVzLgotIyMKLSMjICBgc2VsZi5saW5lcycgY29udGFpbnMgYSBzZXQgb2Ygc291cmNlIGNvZGUgbGluZXMgdGhhdCB3aWxsIGJlIGR1bXBlZCBhcwotIyMgIEhUTUwgaW4gYSA8UFJFPiB0YWcuCi0jIwotIyMgIFRoZSBvYmplY3QgaXMgZmlsbGVkIGxpbmUgYnkgbGluZSBieSB0aGUgcGFyc2VyOyBpdCBzdHJpcHMgdGhlIGxlYWRpbmcKLSMjICBgbWFyZ2luJyBzcGFjZSBmcm9tIGVhY2ggaW5wdXQgbGluZSBiZWZvcmUgc3RvcmluZyBpdCBpbiBgc2VsZi5saW5lcycuCi0jIwotY2xhc3MgIERvY0NvZGU6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBtYXJnaW4sIGxpbmVzICk6Ci0gICAgICAgIHNlbGYubGluZXMgPSBbXQotICAgICAgICBzZWxmLndvcmRzID0gTm9uZQotCi0gICAgICAgICMgcmVtb3ZlIG1hcmdpbiBzcGFjZXMKLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICBpZiBzdHJpbmcuc3RyaXAoIGxbOm1hcmdpbl0gKSA9PSAiIjoKLSAgICAgICAgICAgICAgICBsID0gbFttYXJnaW46XQotICAgICAgICAgICAgc2VsZi5saW5lcy5hcHBlbmQoIGwgKQotCi0gICAgZGVmICBkdW1wKCBzZWxmLCBwcmVmaXggPSAiIiwgd2lkdGggPSA2MCApOgotICAgICAgICBsaW5lcyA9IHNlbGYuZHVtcF9saW5lcyggMCwgd2lkdGggKQotICAgICAgICBmb3IgbCBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50KCBwcmVmaXggKyBsICkKLQotICAgIGRlZiAgZHVtcF9saW5lcyggc2VsZiwgbWFyZ2luID0gMCwgd2lkdGggPSA2MCApOgotICAgICAgICByZXN1bHQgPSBbXQotICAgICAgICBmb3IgbCBpbiBzZWxmLmxpbmVzOgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiAiICogbWFyZ2luICsgbCApCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIFBBUkEgQ0xBU1MKLSMjCi0jIyAgYE5vcm1hbCcgdGV4dCBwYXJhZ3JhcGhzIGFyZSBzdG9yZWQgaW4gdGhlIGBEb2NQYXJhJyBjbGFzcy4KLSMjCi0jIyAgYHNlbGYud29yZHMnIGNvbnRhaW5zIHRoZSBsaXN0IG9mIHdvcmRzIHRoYXQgbWFrZSB1cCB0aGUgcGFyYWdyYXBoLgotIyMKLWNsYXNzICBEb2NQYXJhOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgbGluZXMgKToKLSAgICAgICAgc2VsZi5saW5lcyA9IE5vbmUKLSAgICAgICAgc2VsZi53b3JkcyA9IFtdCi0gICAgICAgIGZvciBsIGluIGxpbmVzOgotICAgICAgICAgICAgbCA9IHN0cmluZy5zdHJpcCggbCApCi0gICAgICAgICAgICBzZWxmLndvcmRzLmV4dGVuZCggc3RyaW5nLnNwbGl0KCBsICkgKQotCi0gICAgZGVmICBkdW1wKCBzZWxmLCBwcmVmaXggPSAiIiwgd2lkdGggPSA2MCApOgotICAgICAgICBsaW5lcyA9IHNlbGYuZHVtcF9saW5lcyggMCwgd2lkdGggKQotICAgICAgICBmb3IgbCBpbiBsaW5lczoKLSAgICAgICAgICAgIHByaW50KCBwcmVmaXggKyBsICkKLQotICAgIGRlZiAgZHVtcF9saW5lcyggc2VsZiwgbWFyZ2luID0gMCwgd2lkdGggPSA2MCApOgotICAgICAgICBjdXIgICAgPSAiIiAgIyBjdXJyZW50IGxpbmUKLSAgICAgICAgY29sICAgID0gMCAgICMgY3VycmVudCB3aWR0aAotICAgICAgICByZXN1bHQgPSBbXQotCi0gICAgICAgIGZvciB3b3JkIGluIHNlbGYud29yZHM6Ci0gICAgICAgICAgICBsbiA9IGxlbiggd29yZCApCi0gICAgICAgICAgICBpZiBjb2wgPiAwOgotICAgICAgICAgICAgICAgIGxuID0gbG4gKyAxCi0KLSAgICAgICAgICAgIGlmIGNvbCArIGxuID4gd2lkdGg6Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiAiICogbWFyZ2luICsgY3VyICkKLSAgICAgICAgICAgICAgICBjdXIgPSB3b3JkCi0gICAgICAgICAgICAgICAgY29sID0gbGVuKCB3b3JkICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgY29sID4gMDoKLSAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyICsgIiAiCi0gICAgICAgICAgICAgICAgY3VyID0gY3VyICsgd29yZAotICAgICAgICAgICAgICAgIGNvbCA9IGNvbCArIGxuCi0KLSAgICAgICAgaWYgY29sID4gMDoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoICIgIiAqIG1hcmdpbiArIGN1ciApCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIEZJRUxEIENMQVNTCi0jIwotIyMgIFRoZSBgRG9jRmllbGQnIGNsYXNzIHN0b3JlcyBhIGxpc3QgY29udGFpbmluZyBlaXRoZXIgYERvY1BhcmEnIG9yCi0jIyAgYERvY0NvZGUnIG9iamVjdHMuICBFYWNoIERvY0ZpZWxkIG9iamVjdCBhbHNvIGhhcyBhbiBvcHRpb25hbCBgbmFtZScKLSMjICB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIGEgZmllbGQgb3IgdmFsdWUgZGVmaW5pdGlvbi4KLSMjCi1jbGFzcyAgRG9jRmllbGQ6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBuYW1lLCBsaW5lcyApOgotICAgICAgICBzZWxmLm5hbWUgID0gbmFtZSAgIyBjYW4gYmUgYE5vbmUnIGZvciBub3JtYWwgcGFyYWdyYXBocy9zb3VyY2VzCi0gICAgICAgIHNlbGYuaXRlbXMgPSBbXSAgICAjIGxpc3Qgb2YgaXRlbXMKLQotICAgICAgICBtb2RlX25vbmUgID0gMCAgICAgIyBzdGFydCBwYXJzaW5nIG1vZGUKLSAgICAgICAgbW9kZV9jb2RlICA9IDEgICAgICMgcGFyc2luZyBjb2RlIHNlcXVlbmNlcwotICAgICAgICBtb2RlX3BhcmEgID0gMyAgICAgIyBwYXJzaW5nIG5vcm1hbCBwYXJhZ3JhcGgKLQotICAgICAgICBtYXJnaW4gICAgID0gLTEgICAgIyBjdXJyZW50IGNvZGUgc2VxdWVuY2UgaW5kZW50YXRpb24KLSAgICAgICAgY3VyX2xpbmVzICA9IFtdCi0KLSAgICAgICAgIyBhbmFseXplIHRoZSBtYXJrdXAgbGluZXMgdG8gY2hlY2sgd2hldGhlciB0aGV5IGNvbnRhaW4gcGFyYWdyYXBocywKLSAgICAgICAgIyBjb2RlIHNlcXVlbmNlcywgb3IgZmllbGRzIGRlZmluaXRpb25zCi0gICAgICAgICMKLSAgICAgICAgc3RhcnQgPSAwCi0gICAgICAgIG1vZGUgID0gbW9kZV9ub25lCi0KLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICAjIGFyZSB3ZSBwYXJzaW5nIGEgY29kZSBzZXF1ZW5jZT8KLSAgICAgICAgICAgIGlmIG1vZGUgPT0gbW9kZV9jb2RlOgotICAgICAgICAgICAgICAgIG0gPSByZV9jb2RlX2VuZC5tYXRjaCggbCApCi0gICAgICAgICAgICAgICAgaWYgbSBhbmQgbGVuKCBtLmdyb3VwKCAxICkgKSA8PSBtYXJnaW46Ci0gICAgICAgICAgICAgICAgICAgICMgdGhhdCdzIGl0LCB3ZSBmaW5pc2hlZCB0aGUgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBjb2RlID0gRG9jQ29kZSggMCwgY3VyX2xpbmVzICkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoIGNvZGUgKQotICAgICAgICAgICAgICAgICAgICBtYXJnaW4gICAgPSAtMQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBtb2RlICAgICAgPSBtb2RlX25vbmUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSBjb250aW51ZSB0aGUgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMuYXBwZW5kKCBsW21hcmdpbjpdICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgIyBzdGFydCBvZiBjb2RlIHNlcXVlbmNlPwotICAgICAgICAgICAgICAgIG0gPSByZV9jb2RlX3N0YXJ0Lm1hdGNoKCBsICkKLSAgICAgICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgICAgICAjIHNhdmUgY3VycmVudCBsaW5lcwotICAgICAgICAgICAgICAgICAgICBpZiBjdXJfbGluZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhID0gRG9jUGFyYSggY3VyX2xpbmVzICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBwYXJhICkKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lcyA9IFtdCi0KLSAgICAgICAgICAgICAgICAgICAgIyBzd2l0Y2ggdG8gY29kZSBleHRyYWN0aW9uIG1vZGUKLSAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbGVuKCBtLmdyb3VwKCAxICkgKQotICAgICAgICAgICAgICAgICAgICBtb2RlICAgPSBtb2RlX2NvZGUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyaW5nLnNwbGl0KCBsICkgYW5kIGN1cl9saW5lczoKLSAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGxpbmUgaXMgZW1wdHksIHdlIGVuZCB0aGUgY3VycmVudCBwYXJhZ3JhcGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYSA9IERvY1BhcmEoIGN1cl9saW5lcyApCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCggcGFyYSApCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UsIHNpbXBseSBhZGQgdGhlIGxpbmUgdG8gdGhlIGN1cnJlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICMgcGFyYWdyYXBoCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMuYXBwZW5kKCBsICkKLQotICAgICAgICBpZiBtb2RlID09IG1vZGVfY29kZToKLSAgICAgICAgICAgICMgdW5leHBlY3RlZCBlbmQgb2YgY29kZSBzZXF1ZW5jZQotICAgICAgICAgICAgY29kZSA9IERvY0NvZGUoIG1hcmdpbiwgY3VyX2xpbmVzICkKLSAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBjb2RlICkKLSAgICAgICAgZWxpZiBjdXJfbGluZXM6Ci0gICAgICAgICAgICBwYXJhID0gRG9jUGFyYSggY3VyX2xpbmVzICkKLSAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKCBwYXJhICkKLQotICAgIGRlZiAgZHVtcCggc2VsZiwgcHJlZml4ID0gIiIgKToKLSAgICAgICAgaWYgc2VsZi5maWVsZDoKLSAgICAgICAgICAgIHByaW50KCBwcmVmaXggKyBzZWxmLmZpZWxkICsgIiA6OiIgKQotICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgIi0tLS0iCi0KLSAgICAgICAgZmlyc3QgPSAxCi0gICAgICAgIGZvciBwIGluIHNlbGYuaXRlbXM6Ci0gICAgICAgICAgICBpZiBub3QgZmlyc3Q6Ci0gICAgICAgICAgICAgICAgcHJpbnQoICIiICkKLSAgICAgICAgICAgIHAuZHVtcCggcHJlZml4ICkKLSAgICAgICAgICAgIGZpcnN0ID0gMAotCi0gICAgZGVmICBkdW1wX2xpbmVzKCBzZWxmLCBtYXJnaW4gPSAwLCB3aWR0aCA9IDYwICk6Ci0gICAgICAgIHJlc3VsdCA9IFtdCi0gICAgICAgIG5sICAgICA9IE5vbmUKLQotICAgICAgICBmb3IgcCBpbiBzZWxmLml0ZW1zOgotICAgICAgICAgICAgaWYgbmw6Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggIiIgKQotCi0gICAgICAgICAgICByZXN1bHQuZXh0ZW5kKCBwLmR1bXBfbGluZXMoIG1hcmdpbiwgd2lkdGggKSApCi0gICAgICAgICAgICBubCA9IDEKLQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLQotIwotIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlY3QgZmllbGQgZGVmaW5pdGlvbnMuCi0jCi0jIEV4YW1wbGVzOgotIwotIyAgIGZvbyAgICAgOjoKLSMgICBmb28uYmFyIDo6Ci0jCi1yZV9maWVsZCA9IHJlLmNvbXBpbGUoIHIiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBccyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHcqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx3IChcdyB8IFwuKSogXHcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICBccyogOjoKLSAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFICkKLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIwotIyMgIERPQyBNQVJLVVAgQ0xBU1MKLSMjCi1jbGFzcyAgRG9jTWFya3VwOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgdGFnLCBsaW5lcyApOgotICAgICAgICBzZWxmLnRhZyAgICA9IHN0cmluZy5sb3dlciggdGFnICkKLSAgICAgICAgc2VsZi5maWVsZHMgPSBbXQotCi0gICAgICAgIGN1cl9saW5lcyA9IFtdCi0gICAgICAgIGZpZWxkICAgICA9IE5vbmUKLSAgICAgICAgbW9kZSAgICAgID0gMAotCi0gICAgICAgIGZvciBsIGluIGxpbmVzOgotICAgICAgICAgICAgbSA9IHJlX2ZpZWxkLm1hdGNoKCBsICkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgIyBXZSBkZXRlY3RlZCB0aGUgc3RhcnQgb2YgYSBuZXcgZmllbGQgZGVmaW5pdGlvbi4KLQotICAgICAgICAgICAgICAgICMgZmlyc3QsIHNhdmUgdGhlIGN1cnJlbnQgb25lCi0gICAgICAgICAgICAgICAgaWYgY3VyX2xpbmVzOgotICAgICAgICAgICAgICAgICAgICBmID0gRG9jRmllbGQoIGZpZWxkLCBjdXJfbGluZXMgKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZpZWxkcy5hcHBlbmQoIGYgKQotICAgICAgICAgICAgICAgICAgICBjdXJfbGluZXMgPSBbXQotICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPSBOb25lCi0KLSAgICAgICAgICAgICAgICBmaWVsZCAgICAgPSBtLmdyb3VwKCAxICkgICAjIHJlY29yZCBmaWVsZCBuYW1lCi0gICAgICAgICAgICAgICAgbG4gICAgICAgID0gbGVuKCBtLmdyb3VwKCAwICkgKQotICAgICAgICAgICAgICAgIGwgICAgICAgICA9ICIgIiAqIGxuICsgbFtsbjpdCi0gICAgICAgICAgICAgICAgY3VyX2xpbmVzID0gW2xdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGN1cl9saW5lcy5hcHBlbmQoIGwgKQotCi0gICAgICAgIGlmIGZpZWxkIG9yIGN1cl9saW5lczoKLSAgICAgICAgICAgIGYgPSBEb2NGaWVsZCggZmllbGQsIGN1cl9saW5lcyApCi0gICAgICAgICAgICBzZWxmLmZpZWxkcy5hcHBlbmQoIGYgKQotCi0gICAgZGVmICBnZXRfbmFtZSggc2VsZiApOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5maWVsZHNbMF0uaXRlbXNbMF0ud29yZHNbMF0KLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiAgZHVtcCggc2VsZiwgbWFyZ2luICk6Ci0gICAgICAgIHByaW50KCAiICIgKiBtYXJnaW4gKyAiPCIgKyBzZWxmLnRhZyArICI+IiApCi0gICAgICAgIGZvciBmIGluIHNlbGYuZmllbGRzOgotICAgICAgICAgICAgZi5kdW1wKCAiICAiICkKLSAgICAgICAgcHJpbnQoICIgIiAqIG1hcmdpbiArICI8LyIgKyBzZWxmLnRhZyArICI+IiApCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSMjICBET0MgQ0hBUFRFUiBDTEFTUwotIyMKLWNsYXNzICBEb2NDaGFwdGVyOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgc2VsZi5ibG9jayAgICA9IGJsb2NrCi0gICAgICAgIHNlbGYuc2VjdGlvbnMgPSBbXQotICAgICAgICBpZiBibG9jazoKLSAgICAgICAgICAgIHNlbGYubmFtZSAgPSBibG9jay5uYW1lCi0gICAgICAgICAgICBzZWxmLnRpdGxlID0gYmxvY2suZ2V0X21hcmt1cF93b3JkcyggInRpdGxlIiApCi0gICAgICAgICAgICBzZWxmLm9yZGVyID0gYmxvY2suZ2V0X21hcmt1cF93b3JkcyggInNlY3Rpb25zIiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLm5hbWUgID0gIk90aGVyIgotICAgICAgICAgICAgc2VsZi50aXRsZSA9IHN0cmluZy5zcGxpdCggIk1pc2NlbGxhbmVvdXMiICkKLSAgICAgICAgICAgIHNlbGYub3JkZXIgPSBbXQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIFNFQ1RJT04gQ0xBU1MKLSMjCi1jbGFzcyAgRG9jU2VjdGlvbjoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYsIG5hbWUgPSAiT3RoZXIiICk6Ci0gICAgICAgIHNlbGYubmFtZSAgICAgICAgPSBuYW1lCi0gICAgICAgIHNlbGYuYmxvY2tzICAgICAgPSB7fQotICAgICAgICBzZWxmLmJsb2NrX25hbWVzID0gW10gICMgb3JkZXJlZCBibG9jayBuYW1lcyBpbiBzZWN0aW9uCi0gICAgICAgIHNlbGYuZGVmcyAgICAgICAgPSBbXQotICAgICAgICBzZWxmLmFic3RyYWN0ICAgID0gIiIKLSAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9ICIiCi0gICAgICAgIHNlbGYub3JkZXIgICAgICAgPSBbXQotICAgICAgICBzZWxmLnRpdGxlICAgICAgID0gIkVSUk9SIgotICAgICAgICBzZWxmLmNoYXB0ZXIgICAgID0gTm9uZQotCi0gICAgZGVmICBhZGRfZGVmKCBzZWxmLCBibG9jayApOgotICAgICAgICBzZWxmLmRlZnMuYXBwZW5kKCBibG9jayApCi0KLSAgICBkZWYgIGFkZF9ibG9jayggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgc2VsZi5ibG9ja19uYW1lcy5hcHBlbmQoIGJsb2NrLm5hbWUgKQotICAgICAgICBzZWxmLmJsb2Nrc1tibG9jay5uYW1lXSA9IGJsb2NrCi0KLSAgICBkZWYgIHByb2Nlc3MoIHNlbGYgKToKLSAgICAgICAgIyBsb29rIHVwIG9uZSBibG9jayB0aGF0IGNvbnRhaW5zIGEgdmFsaWQgc2VjdGlvbiBkZXNjcmlwdGlvbgotICAgICAgICBmb3IgYmxvY2sgaW4gc2VsZi5kZWZzOgotICAgICAgICAgICAgdGl0bGUgPSBibG9jay5nZXRfbWFya3VwX3RleHQoICJ0aXRsZSIgKQotICAgICAgICAgICAgaWYgdGl0bGU6Ci0gICAgICAgICAgICAgICAgc2VsZi50aXRsZSAgICAgICA9IHRpdGxlCi0gICAgICAgICAgICAgICAgc2VsZi5hYnN0cmFjdCAgICA9IGJsb2NrLmdldF9tYXJrdXBfd29yZHMoICJhYnN0cmFjdCIgKQotICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBibG9jay5nZXRfbWFya3VwX2l0ZW1zKCAiZGVzY3JpcHRpb24iICkKLSAgICAgICAgICAgICAgICBzZWxmLm9yZGVyICAgICAgID0gYmxvY2suZ2V0X21hcmt1cF93b3Jkc19hbGwoICJvcmRlciIgKQotICAgICAgICAgICAgICAgIHJldHVybgotCi0gICAgZGVmICByZW9yZGVyKCBzZWxmICk6Ci0gICAgICAgIHNlbGYuYmxvY2tfbmFtZXMgPSBzb3J0X29yZGVyX2xpc3QoIHNlbGYuYmxvY2tfbmFtZXMsIHNlbGYub3JkZXIgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgQ09OVEVOVCBQUk9DRVNTT1IgQ0xBU1MKLSMjCi1jbGFzcyAgQ29udGVudFByb2Nlc3NvcjoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYgKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIGJsb2NrIGNvbnRlbnQgcHJvY2Vzc29yLiIiIgotICAgICAgICBzZWxmLnJlc2V0KCkKLQotICAgICAgICBzZWxmLnNlY3Rpb25zID0ge30gICAgIyBkaWN0aW9uYXJ5IG9mIGRvY3VtZW50YXRpb24gc2VjdGlvbnMKLSAgICAgICAgc2VsZi5zZWN0aW9uICA9IE5vbmUgICMgY3VycmVudCBkb2N1bWVudGF0aW9uIHNlY3Rpb24KLQotICAgICAgICBzZWxmLmNoYXB0ZXJzID0gW10gICAgIyBsaXN0IG9mIGNoYXB0ZXJzCi0KLSAgICAgICAgc2VsZi5oZWFkZXJzICA9IHt9ICAgICMgZGljdGlvbmFyeSBvZiBoZWFkZXIgbWFjcm9zCi0KLSAgICBkZWYgIHNldF9zZWN0aW9uKCBzZWxmLCBzZWN0aW9uX25hbWUgKToKLSAgICAgICAgIiIiU2V0IGN1cnJlbnQgc2VjdGlvbiBkdXJpbmcgcGFyc2luZy4iIiIKLSAgICAgICAgaWYgbm90IHNlY3Rpb25fbmFtZSBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgc2VjdGlvbiA9IERvY1NlY3Rpb24oIHNlY3Rpb25fbmFtZSApCi0gICAgICAgICAgICBzZWxmLnNlY3Rpb25zW3NlY3Rpb25fbmFtZV0gPSBzZWN0aW9uCi0gICAgICAgICAgICBzZWxmLnNlY3Rpb24gICAgICAgICAgICAgICAgPSBzZWN0aW9uCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWxmLnNlY3Rpb25zW3NlY3Rpb25fbmFtZV0KLQotICAgIGRlZiAgYWRkX2NoYXB0ZXIoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIGNoYXB0ZXIgPSBEb2NDaGFwdGVyKCBibG9jayApCi0gICAgICAgIHNlbGYuY2hhcHRlcnMuYXBwZW5kKCBjaGFwdGVyICkKLQotICAgIGRlZiAgcmVzZXQoIHNlbGYgKToKLSAgICAgICAgIiIiUmVzZXQgdGhlIGNvbnRlbnQgcHJvY2Vzc29yIGZvciBhIG5ldyBibG9jay4iIiIKLSAgICAgICAgc2VsZi5tYXJrdXBzICAgICAgPSBbXQotICAgICAgICBzZWxmLm1hcmt1cCAgICAgICA9IE5vbmUKLSAgICAgICAgc2VsZi5tYXJrdXBfbGluZXMgPSBbXQotCi0gICAgZGVmICBhZGRfbWFya3VwKCBzZWxmICk6Ci0gICAgICAgICIiIkFkZCBhIG5ldyBtYXJrdXAgc2VjdGlvbi4iIiIKLSAgICAgICAgaWYgc2VsZi5tYXJrdXAgYW5kIHNlbGYubWFya3VwX2xpbmVzOgotCi0gICAgICAgICAgICAjIGdldCByaWQgb2YgbGFzdCBsaW5lIG9mIG1hcmt1cCBpZiBpdCdzIGVtcHR5Ci0gICAgICAgICAgICBtYXJrcyA9IHNlbGYubWFya3VwX2xpbmVzCi0gICAgICAgICAgICBpZiBsZW4oIG1hcmtzICkgPiAwIGFuZCBub3Qgc3RyaW5nLnN0cmlwKCBtYXJrc1stMV0gKToKLSAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cF9saW5lcyA9IG1hcmtzWzotMV0KLQotICAgICAgICAgICAgbSA9IERvY01hcmt1cCggc2VsZi5tYXJrdXAsIHNlbGYubWFya3VwX2xpbmVzICkKLQotICAgICAgICAgICAgc2VsZi5tYXJrdXBzLmFwcGVuZCggbSApCi0KLSAgICAgICAgICAgIHNlbGYubWFya3VwICAgICAgID0gTm9uZQotICAgICAgICAgICAgc2VsZi5tYXJrdXBfbGluZXMgPSBbXQotCi0gICAgZGVmICBwcm9jZXNzX2NvbnRlbnQoIHNlbGYsIGNvbnRlbnQgKToKLSAgICAgICAgIiIiUHJvY2VzcyBhIGJsb2NrIGNvbnRlbnQgYW5kIHJldHVybiBhIGxpc3Qgb2YgRG9jTWFya3VwIG9iamVjdHMKLSAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byBpdC4iIiIKLSAgICAgICAgbWFya3VwICAgICAgID0gTm9uZQotICAgICAgICBtYXJrdXBfbGluZXMgPSBbXQotICAgICAgICBmaXJzdCAgICAgICAgPSAxCi0KLSAgICAgICAgbWFyZ2luICA9IC0xCi0gICAgICAgIGluX2NvZGUgPSAwCi0KLSAgICAgICAgZm9yIGxpbmUgaW4gY29udGVudDoKLSAgICAgICAgICAgIGlmIGluX2NvZGU6Ci0gICAgICAgICAgICAgICAgbSA9IHJlX2NvZGVfZW5kLm1hdGNoKCBsaW5lICkKLSAgICAgICAgICAgICAgICBpZiBtIGFuZCBsZW4oIG0uZ3JvdXAoIDEgKSApIDw9IG1hcmdpbjoKLSAgICAgICAgICAgICAgICAgICAgaW5fY29kZSA9IDAKLSAgICAgICAgICAgICAgICAgICAgbWFyZ2luICA9IC0xCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG0gPSByZV9jb2RlX3N0YXJ0Lm1hdGNoKCBsaW5lICkKLSAgICAgICAgICAgICAgICBpZiBtOgotICAgICAgICAgICAgICAgICAgICBpbl9jb2RlID0gMQotICAgICAgICAgICAgICAgICAgICBtYXJnaW4gID0gbGVuKCBtLmdyb3VwKCAxICkgKQotCi0gICAgICAgICAgICBmb3VuZCA9IE5vbmUKLQotICAgICAgICAgICAgaWYgbm90IGluX2NvZGU6Ci0gICAgICAgICAgICAgICAgZm9yIHQgaW4gcmVfbWFya3VwX3RhZ3M6Ci0gICAgICAgICAgICAgICAgICAgIG0gPSB0Lm1hdGNoKCBsaW5lICkKLSAgICAgICAgICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kICA9IHN0cmluZy5sb3dlciggbS5ncm91cCggMSApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGxlbiggbS5ncm91cCggMCApICkKLSAgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIG1hcmt1cCBmcm9tIGxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgICA9ICIgIiAqIHByZWZpeCArIGxpbmVbcHJlZml4Ol0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgICAgICMgaXMgaXQgdGhlIHN0YXJ0IG9mIGEgbmV3IG1hcmt1cCBzZWN0aW9uID8KLSAgICAgICAgICAgIGlmIGZvdW5kOgotICAgICAgICAgICAgICAgIGZpcnN0ID0gMAotICAgICAgICAgICAgICAgIHNlbGYuYWRkX21hcmt1cCgpICAjIGFkZCBjdXJyZW50IG1hcmt1cCBjb250ZW50Ci0gICAgICAgICAgICAgICAgc2VsZi5tYXJrdXAgPSBmb3VuZAotICAgICAgICAgICAgICAgIGlmIGxlbiggc3RyaW5nLnN0cmlwKCBsaW5lICkgKSA+IDA6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubWFya3VwX2xpbmVzLmFwcGVuZCggbGluZSApCi0gICAgICAgICAgICBlbGlmIGZpcnN0ID09IDA6Ci0gICAgICAgICAgICAgICAgc2VsZi5tYXJrdXBfbGluZXMuYXBwZW5kKCBsaW5lICkKLQotICAgICAgICBzZWxmLmFkZF9tYXJrdXAoKQotCi0gICAgICAgIHJldHVybiBzZWxmLm1hcmt1cHMKLQotICAgIGRlZiAgcGFyc2Vfc291cmNlcyggc2VsZiwgc291cmNlX3Byb2Nlc3NvciApOgotICAgICAgICBibG9ja3MgPSBzb3VyY2VfcHJvY2Vzc29yLmJsb2NrcwotICAgICAgICBjb3VudCAgPSBsZW4oIGJsb2NrcyApCi0KLSAgICAgICAgZm9yIG4gaW4gcmFuZ2UoIGNvdW50ICk6Ci0gICAgICAgICAgICBzb3VyY2UgPSBibG9ja3Nbbl0KLSAgICAgICAgICAgIGlmIHNvdXJjZS5jb250ZW50OgotICAgICAgICAgICAgICAgICMgdGhpcyBpcyBhIGRvY3VtZW50YXRpb24gY29tbWVudCwgd2UgbmVlZCB0byBjYXRjaAotICAgICAgICAgICAgICAgICMgYWxsIGZvbGxvd2luZyBub3JtYWwgYmxvY2tzIGluIHRoZSAiZm9sbG93IiBsaXN0Ci0gICAgICAgICAgICAgICAgIwotICAgICAgICAgICAgICAgIGZvbGxvdyA9IFtdCi0gICAgICAgICAgICAgICAgbSA9IG4gKyAxCi0gICAgICAgICAgICAgICAgd2hpbGUgbSA8IGNvdW50IGFuZCBub3QgYmxvY2tzW21dLmNvbnRlbnQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvbGxvdy5hcHBlbmQoIGJsb2Nrc1ttXSApCi0gICAgICAgICAgICAgICAgICAgIG0gPSBtICsgMQotCi0gICAgICAgICAgICAgICAgZG9jX2Jsb2NrID0gRG9jQmxvY2soIHNvdXJjZSwgZm9sbG93LCBzZWxmICkKLQotICAgIGRlZiAgZmluaXNoKCBzZWxmICk6Ci0gICAgICAgICMgcHJvY2VzcyBhbGwgc2VjdGlvbnMgdG8gZXh0cmFjdCB0aGVpciBhYnN0cmFjdCwgZGVzY3JpcHRpb24KLSAgICAgICAgIyBhbmQgb3JkZXJlZCBsaXN0IG9mIGl0ZW1zCi0gICAgICAgICMKLSAgICAgICAgZm9yIHNlYyBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgotICAgICAgICAgICAgc2VjLnByb2Nlc3MoKQotCi0gICAgICAgICMgcHJvY2VzcyBjaGFwdGVycyB0byBjaGVjayB0aGF0IGFsbCBzZWN0aW9ucyBhcmUgY29ycmVjdGx5Ci0gICAgICAgICMgbGlzdGVkIHRoZXJlCi0gICAgICAgIGZvciBjaGFwIGluIHNlbGYuY2hhcHRlcnM6Ci0gICAgICAgICAgICBmb3Igc2VjIGluIGNoYXAub3JkZXI6Ci0gICAgICAgICAgICAgICAgaWYgc2VjIGluIHNlbGYuc2VjdGlvbnM6Ci0gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNlY3Rpb25zW3NlY10KLSAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5jaGFwdGVyID0gY2hhcAotICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLnJlb3JkZXIoKQotICAgICAgICAgICAgICAgICAgICBjaGFwLnNlY3Rpb25zLmFwcGVuZCggc2VjdGlvbiApCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIldBUk5JTkc6IGNoYXB0ZXIgJyIgKyAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFwLm5hbWUgKyAiJyBpbiAiICsgY2hhcC5ibG9jay5sb2NhdGlvbigpICsgXAotICAgICAgICAgICAgICAgICAgICAgICAgIiBsaXN0cyB1bmtub3duIHNlY3Rpb24gJyIgKyBzZWMgKyAiJ1xuIiApCi0KLSAgICAgICAgIyBjaGVjayB0aGF0IGFsbCBzZWN0aW9ucyBhcmUgaW4gYSBjaGFwdGVyCi0gICAgICAgICMKLSAgICAgICAgb3RoZXJzID0gW10KLSAgICAgICAgZm9yIHNlYyBpbiBzZWxmLnNlY3Rpb25zLnZhbHVlcygpOgotICAgICAgICAgICAgaWYgbm90IHNlYy5jaGFwdGVyOgotICAgICAgICAgICAgICAgIHNlYy5yZW9yZGVyKCkKLSAgICAgICAgICAgICAgICBvdGhlcnMuYXBwZW5kKCBzZWMgKQotCi0gICAgICAgICMgY3JlYXRlIGEgbmV3IHNwZWNpYWwgY2hhcHRlciBmb3IgYWxsIHJlbWFpbmluZyBzZWN0aW9ucwotICAgICAgICAjIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICAgICMKLSAgICAgICAgaWYgb3RoZXJzOgotICAgICAgICAgICAgY2hhcCA9IERvY0NoYXB0ZXIoIE5vbmUgKQotICAgICAgICAgICAgY2hhcC5zZWN0aW9ucyA9IG90aGVycwotICAgICAgICAgICAgc2VsZi5jaGFwdGVycy5hcHBlbmQoIGNoYXAgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgRE9DIEJMT0NLIENMQVNTCi0jIwotY2xhc3MgIERvY0Jsb2NrOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgc291cmNlLCBmb2xsb3csIHByb2Nlc3NvciApOgotICAgICAgICBwcm9jZXNzb3IucmVzZXQoKQotCi0gICAgICAgIHNlbGYuc291cmNlICA9IHNvdXJjZQotICAgICAgICBzZWxmLmNvZGUgICAgPSBbXQotICAgICAgICBzZWxmLnR5cGUgICAgPSAiRVJSVFlQRSIKLSAgICAgICAgc2VsZi5uYW1lICAgID0gIkVSUk5BTUUiCi0gICAgICAgIHNlbGYuc2VjdGlvbiA9IHByb2Nlc3Nvci5zZWN0aW9uCi0gICAgICAgIHNlbGYubWFya3VwcyA9IHByb2Nlc3Nvci5wcm9jZXNzX2NvbnRlbnQoIHNvdXJjZS5jb250ZW50ICkKLQotICAgICAgICAjIGNvbXB1dGUgYmxvY2sgdHlwZSBmcm9tIGZpcnN0IG1hcmt1cCB0YWcKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi50eXBlID0gc2VsZi5tYXJrdXBzWzBdLnRhZwotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgIyBjb21wdXRlIGJsb2NrIG5hbWUgZnJvbSBmaXJzdCBtYXJrdXAgcGFyYWdyYXBoCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG1hcmt1cCA9IHNlbGYubWFya3Vwc1swXQotICAgICAgICAgICAgcGFyYSAgID0gbWFya3VwLmZpZWxkc1swXS5pdGVtc1swXQotICAgICAgICAgICAgbmFtZSAgID0gcGFyYS53b3Jkc1swXQotICAgICAgICAgICAgbSA9IHJlX2lkZW50aWZpZXIubWF0Y2goIG5hbWUgKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCggMSApCi0gICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHBhc3MKLQotICAgICAgICBpZiBzZWxmLnR5cGUgPT0gInNlY3Rpb24iOgotICAgICAgICAgICAgIyBkZXRlY3QgbmV3IHNlY3Rpb24gc3RhcnRzCi0gICAgICAgICAgICBwcm9jZXNzb3Iuc2V0X3NlY3Rpb24oIHNlbGYubmFtZSApCi0gICAgICAgICAgICBwcm9jZXNzb3Iuc2VjdGlvbi5hZGRfZGVmKCBzZWxmICkKLSAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gImNoYXB0ZXIiOgotICAgICAgICAgICAgIyBkZXRlY3QgbmV3IGNoYXB0ZXIKLSAgICAgICAgICAgIHByb2Nlc3Nvci5hZGRfY2hhcHRlciggc2VsZiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcm9jZXNzb3Iuc2VjdGlvbi5hZGRfYmxvY2soIHNlbGYgKQotCi0gICAgICAgICMgbm93LCBjb21wdXRlIHRoZSBzb3VyY2UgbGluZXMgcmVsZXZhbnQgdG8gdGhpcyBkb2N1bWVudGF0aW9uCi0gICAgICAgICMgYmxvY2suIFdlIGtlZXAgbm9ybWFsIGNvbW1lbnRzIGluIGZvciBvYnZpb3VzIHJlYXNvbnMgKD8/KQotICAgICAgICBzb3VyY2UgPSBbXQotICAgICAgICBmb3IgYiBpbiBmb2xsb3c6Ci0gICAgICAgICAgICBpZiBiLmZvcm1hdDoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZm9yIGwgaW4gYi5saW5lczoKLSAgICAgICAgICAgICAgICAjIGNvbGxlY3QgaGVhZGVyIG1hY3JvIGRlZmluaXRpb25zCi0gICAgICAgICAgICAgICAgbSA9IHJlX2hlYWRlcl9tYWNyby5tYXRjaCggbCApCi0gICAgICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yLmhlYWRlcnNbbS5ncm91cCggMiApXSA9IG0uZ3JvdXAoIDEgKTsKLQotICAgICAgICAgICAgICAgICMgd2UgdXNlICIvKiAqLyIgYXMgYSBzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICBpZiByZV9zb3VyY2Vfc2VwLm1hdGNoKCBsICk6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgc291cmNlLmFwcGVuZCggbCApCi0KLSAgICAgICAgIyBub3cgc3RyaXAgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IGxpbmVzIGZyb20gdGhlIHNvdXJjZXMKLSAgICAgICAgc3RhcnQgPSAwCi0gICAgICAgIGVuZCAgID0gbGVuKCBzb3VyY2UgKSAtIDEKLQotICAgICAgICB3aGlsZSBzdGFydCA8IGVuZCBhbmQgbm90IHN0cmluZy5zdHJpcCggc291cmNlW3N0YXJ0XSApOgotICAgICAgICAgICAgc3RhcnQgPSBzdGFydCArIDEKLQotICAgICAgICB3aGlsZSBzdGFydCA8IGVuZCBhbmQgbm90IHN0cmluZy5zdHJpcCggc291cmNlW2VuZF0gKToKLSAgICAgICAgICAgIGVuZCA9IGVuZCAtIDEKLQotICAgICAgICBpZiBzdGFydCA9PSBlbmQgYW5kIG5vdCBzdHJpbmcuc3RyaXAoIHNvdXJjZVtzdGFydF0gKToKLSAgICAgICAgICAgIHNlbGYuY29kZSA9IFtdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmNvZGUgPSBzb3VyY2Vbc3RhcnQ6ZW5kICsgMV0KLQotICAgIGRlZiAgbG9jYXRpb24oIHNlbGYgKToKLSAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlLmxvY2F0aW9uKCkKLQotICAgIGRlZiAgZ2V0X21hcmt1cCggc2VsZiwgdGFnX25hbWUgKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBEb2NNYXJrdXAgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHRhZyBpbiBhIGJsb2NrLiIiIgotICAgICAgICBmb3IgbSBpbiBzZWxmLm1hcmt1cHM6Ci0gICAgICAgICAgICBpZiBtLnRhZyA9PSBzdHJpbmcubG93ZXIoIHRhZ19uYW1lICk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG0KLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiAgZ2V0X21hcmt1cF93b3Jkcyggc2VsZiwgdGFnX25hbWUgKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0X21hcmt1cCggdGFnX25hbWUgKQotICAgICAgICAgICAgcmV0dXJuIG0uZmllbGRzWzBdLml0ZW1zWzBdLndvcmRzCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHJldHVybiBbXQotCi0gICAgZGVmICBnZXRfbWFya3VwX3dvcmRzX2FsbCggc2VsZiwgdGFnX25hbWUgKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0X21hcmt1cCggdGFnX25hbWUgKQotICAgICAgICAgICAgd29yZHMgPSBbXQotICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbS5maWVsZHNbMF0uaXRlbXM6Ci0gICAgICAgICAgICAgICAgIyBXZSBob25vdXIgZW1wdHkgbGluZXMgaW4gYW4gYDxPcmRlcj4nIHNlY3Rpb24gZWxlbWVudCBieQotICAgICAgICAgICAgICAgICMgYWRkaW5nIHRoZSBzZW50aW5lbCBgL2VtcHR5LycuICBUaGUgZm9ybWF0dGVyIHNob3VsZCB0aGVuCi0gICAgICAgICAgICAgICAgIyBjb252ZXJ0IGl0IHRvIGFuIGFwcHJvcHJpYXRlIHJlcHJlc2VudGF0aW9uIGluIHRoZQotICAgICAgICAgICAgICAgICMgYHNlY3Rpb25fZW50ZXInIGZ1bmN0aW9uLgotICAgICAgICAgICAgICAgIHdvcmRzICs9IGl0ZW0ud29yZHMKLSAgICAgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoICIvZW1wdHkvIiApCi0gICAgICAgICAgICByZXR1cm4gd29yZHMKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgcmV0dXJuIFtdCi0KLSAgICBkZWYgIGdldF9tYXJrdXBfdGV4dCggc2VsZiwgdGFnX25hbWUgKToKLSAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRfbWFya3VwX3dvcmRzKCB0YWdfbmFtZSApCi0gICAgICAgIHJldHVybiBzdHJpbmcuam9pbiggcmVzdWx0ICkKLQotICAgIGRlZiAgZ2V0X21hcmt1cF9pdGVtcyggc2VsZiwgdGFnX25hbWUgKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0X21hcmt1cCggdGFnX25hbWUgKQotICAgICAgICAgICAgcmV0dXJuIG0uZmllbGRzWzBdLml0ZW1zCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0KLSMgZW9mCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZG9jbWFrZXIvZG9jYmVhdXR5LnB5IGIvc3JjL3Rvb2xzL2RvY21ha2VyL2RvY2JlYXV0eS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwMjFmYS4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvZG9jYmVhdXR5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyAgRG9jQmVhdXR5IChjKSAyMDAzLCAyMDA0LCAyMDA4IERhdmlkIFR1cm5lciA8ZGF2aWRAZnJlZXR5cGUub3JnPgotIwotIyBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byBiZWF1dGlmeSB0aGUgZG9jdW1lbnRhdGlvbiBjb21tZW50cyB1c2VkCi0jIGluIHRoZSBGcmVlVHlwZSAyIHB1YmxpYyBoZWFkZXJzLgotIwotCi1mcm9tIHNvdXJjZXMgaW1wb3J0ICoKLWZyb20gY29udGVudCBpbXBvcnQgKgotZnJvbSB1dGlscyAgIGltcG9ydCAqCi0KLWltcG9ydCBzeXMsIG9zLCBzdHJpbmcsIGdldG9wdAotCi0KLWNvbnRlbnRfcHJvY2Vzc29yID0gQ29udGVudFByb2Nlc3NvcigpCi0KLQotZGVmICBiZWF1dGlmeV9ibG9jayggYmxvY2sgKToKLSAgICBpZiBibG9jay5jb250ZW50OgotICAgICAgICBjb250ZW50X3Byb2Nlc3Nvci5yZXNldCgpCi0KLSAgICAgICAgbWFya3VwcyA9IGNvbnRlbnRfcHJvY2Vzc29yLnByb2Nlc3NfY29udGVudCggYmxvY2suY29udGVudCApCi0gICAgICAgIHRleHQgICAgPSBbXQotICAgICAgICBmaXJzdCAgID0gMQotCi0gICAgICAgIGZvciBtYXJrdXAgaW4gbWFya3VwczoKLSAgICAgICAgICAgIHRleHQuZXh0ZW5kKCBtYXJrdXAuYmVhdXRpZnkoIGZpcnN0ICkgKQotICAgICAgICAgICAgZmlyc3QgPSAwCi0KLSAgICAgICAgIyBub3cgYmVhdXRpZnkgdGhlIGRvY3VtZW50YXRpb24gImJvcmRlcnMiIHRoZW1zZWx2ZXMKLSAgICAgICAgbGluZXMgPSBbIiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiJdCi0gICAgICAgIGZvciBsIGluIHRleHQ6Ci0gICAgICAgICAgICBsaW5lcy5hcHBlbmQoICIgICoiICsgbCApCi0gICAgICAgIGxpbmVzLmFwcGVuZCggIiAgKi8iICkKLQotICAgICAgICBibG9jay5saW5lcyA9IGxpbmVzCi0KLQotZGVmICB1c2FnZSgpOgotICAgIHByaW50KCAiXG5Eb2NCZWF1dHkgMC4xIFVzYWdlIGluZm9ybWF0aW9uXG4iICkKLSAgICBwcmludCggIiAgZG9jYmVhdXR5IFtvcHRpb25zXSBmaWxlMSBbZmlsZTIgLi4uXVxuIiApCi0gICAgcHJpbnQoICJ1c2luZyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4iICkKLSAgICBwcmludCggIiAgLWggOiBwcmludCB0aGlzIHBhZ2UiICkKLSAgICBwcmludCggIiAgLWIgOiBiYWNrdXAgb3JpZ2luYWwgZmlsZXMgd2l0aCB0aGUgJ29yaWcnIGV4dGVuc2lvbiIgKQotICAgIHByaW50KCAiIiApCi0gICAgcHJpbnQoICIgIC0tYmFja3VwIDogc2FtZSBhcyAtYiIgKQotCi0KLWRlZiAgbWFpbiggYXJndiApOgotICAgICIiIm1haW4gcHJvZ3JhbSBsb29wIiIiCi0KLSAgICBnbG9iYWwgb3V0cHV0X2RpcgotCi0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdCggc3lzLmFyZ3ZbMTpdLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGIiLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiaGVscCIsICJiYWNrdXAiXSApCi0gICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKLSAgICAgICAgdXNhZ2UoKQotICAgICAgICBzeXMuZXhpdCggMiApCi0KLSAgICBpZiBhcmdzID09IFtdOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KCAxICkKLQotICAgICMgcHJvY2VzcyBvcHRpb25zCi0gICAgIwotICAgIG91dHB1dF9kaXIgPSBOb25lCi0gICAgZG9fYmFja3VwICA9IE5vbmUKLQotICAgIGZvciBvcHQgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0WzBdIGluICggIi1oIiwgIi0taGVscCIgKToKLSAgICAgICAgICAgIHVzYWdlKCkKLSAgICAgICAgICAgIHN5cy5leGl0KCAwICkKLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLWIiLCAiLS1iYWNrdXAiICk6Ci0gICAgICAgICAgICBkb19iYWNrdXAgPSAxCi0KLSAgICAjIGNyZWF0ZSBjb250ZXh0IGFuZCBwcm9jZXNzb3IKLSAgICBzb3VyY2VfcHJvY2Vzc29yID0gU291cmNlUHJvY2Vzc29yKCkKLQotICAgICMgcmV0cmlldmUgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2VzcwotICAgIGZpbGVfbGlzdCA9IG1ha2VfZmlsZV9saXN0KCBhcmdzICkKLSAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZV9saXN0OgotICAgICAgICBzb3VyY2VfcHJvY2Vzc29yLnBhcnNlX2ZpbGUoIGZpbGVuYW1lICkKLQotICAgICAgICBmb3IgYmxvY2sgaW4gc291cmNlX3Byb2Nlc3Nvci5ibG9ja3M6Ci0gICAgICAgICAgICBiZWF1dGlmeV9ibG9jayggYmxvY2sgKQotCi0gICAgICAgIG5ld19uYW1lID0gZmlsZW5hbWUgKyAiLm5ldyIKLSAgICAgICAgb2sgICAgICAgPSBOb25lCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZmlsZSA9IG9wZW4oIG5ld19uYW1lLCAid3QiICkKLSAgICAgICAgICAgIGZvciBibG9jayBpbiBzb3VyY2VfcHJvY2Vzc29yLmJsb2NrczoKLSAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBibG9jay5saW5lczoKLSAgICAgICAgICAgICAgICAgICAgZmlsZS53cml0ZSggbGluZSApCi0gICAgICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoICJcbiIgKQotICAgICAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIG9rID0gMAotCi0KLSMgaWYgY2FsbGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZQotIwotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKCBzeXMuYXJndiApCi0KLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weSBiL3NyYy90b29scy9kb2NtYWtlci9kb2NtYWtlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0OWFmYi4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvZG9jbWFrZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jICBkb2NtYWtlci5weQotIwotIyAgICBDb252ZXJ0IHNvdXJjZSBjb2RlIG1hcmt1cCB0byBIVE1MIGRvY3VtZW50YXRpb24uCi0jCi0jICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5Ci0jICBEYXZpZCBUdXJuZXIuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0jICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotIyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotIwotIyBUaGlzIHByb2dyYW0gaXMgYSByZS13cml0ZSBvZiB0aGUgb3JpZ2luYWwgRG9jTWFrZXIgdG9vbCB1c2VkIHRvIGdlbmVyYXRlCi0jIHRoZSBBUEkgUmVmZXJlbmNlIG9mIHRoZSBGcmVlVHlwZSBmb250IHJlbmRlcmluZyBlbmdpbmUgYnkgY29udmVydGluZwotIyBpbi1zb3VyY2UgY29tbWVudHMgaW50byBzdHJ1Y3R1cmVkIEhUTUwuCi0jCi0jIFRoaXMgbmV3IHZlcnNpb24gaXMgY2FwYWJsZSBvZiBvdXRwdXR0aW5nIFhNTCBkYXRhIGFzIHdlbGwgYXMgYWNjZXB0aW5nCi0jIG1vcmUgbGliZXJhbCBmb3JtYXR0aW5nIG9wdGlvbnMuICBJdCBhbHNvIHVzZXMgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nCi0jIGFuZCBzdWJzdGl0dXRpb24gdG8gc3BlZWQgdXAgb3BlcmF0aW9uIHNpZ25pZmljYW50bHkuCi0jCi0KLWZyb20gc291cmNlcyAgIGltcG9ydCAqCi1mcm9tIGNvbnRlbnQgICBpbXBvcnQgKgotZnJvbSB1dGlscyAgICAgaW1wb3J0ICoKLWZyb20gZm9ybWF0dGVyIGltcG9ydCAqCi1mcm9tIHRvaHRtbCAgICBpbXBvcnQgKgotCi1pbXBvcnQgdXRpbHMKLQotaW1wb3J0IHN5cywgZ2xvYiwgZ2V0b3B0Ci0KLQotZGVmICB1c2FnZSgpOgotICAgIHByaW50KCAiXG5Eb2NNYWtlciBVc2FnZSBpbmZvcm1hdGlvblxuIiApCi0gICAgcHJpbnQoICIgIGRvY21ha2VyIFtvcHRpb25zXSBmaWxlMSBbZmlsZTIgLi4uXVxuIiApCi0gICAgcHJpbnQoICJ1c2luZyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6XG4iICkKLSAgICBwcmludCggIiAgLWggOiBwcmludCB0aGlzIHBhZ2UiICkKLSAgICBwcmludCggIiAgLXQgOiBzZXQgcHJvamVjdCB0aXRsZSwgYXMgaW4gJy10IFwiTXkgUHJvamVjdFwiJyIgKQotICAgIHByaW50KCAiICAtbyA6IHNldCBvdXRwdXQgZGlyZWN0b3J5LCBhcyBpbiAnLW8gbXlkaXInIiApCi0gICAgcHJpbnQoICIgIC1wIDogc2V0IGRvY3VtZW50YXRpb24gcHJlZml4LCBhcyBpbiAnLXAgZnQyJyIgKQotICAgIHByaW50KCAiIiApCi0gICAgcHJpbnQoICIgIC0tdGl0bGUgIDogc2FtZSBhcyAtdCwgYXMgaW4gJy0tdGl0bGU9XCJNeSBQcm9qZWN0XCInIiApCi0gICAgcHJpbnQoICIgIC0tb3V0cHV0IDogc2FtZSBhcyAtbywgYXMgaW4gJy0tb3V0cHV0PW15ZGlyJyIgKQotICAgIHByaW50KCAiICAtLXByZWZpeCA6IHNhbWUgYXMgLXAsIGFzIGluICctLXByZWZpeD1mdDInIiApCi0KLQotZGVmICBtYWluKCBhcmd2ICk6Ci0gICAgIiIiTWFpbiBwcm9ncmFtIGxvb3AuIiIiCi0KLSAgICBnbG9iYWwgb3V0cHV0X2RpcgotCi0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdCggc3lzLmFyZ3ZbMTpdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0Om86cDoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxwIiwgInRpdGxlPSIsICJvdXRwdXQ9IiwgInByZWZpeD0iXSApCi0gICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKLSAgICAgICAgdXNhZ2UoKQotICAgICAgICBzeXMuZXhpdCggMiApCi0KLSAgICBpZiBhcmdzID09IFtdOgotICAgICAgICB1c2FnZSgpCi0gICAgICAgIHN5cy5leGl0KCAxICkKLQotICAgICMgcHJvY2VzcyBvcHRpb25zCi0gICAgcHJvamVjdF90aXRsZSAgPSAiUHJvamVjdCIKLSAgICBwcm9qZWN0X3ByZWZpeCA9IE5vbmUKLSAgICBvdXRwdXRfZGlyICAgICA9IE5vbmUKLQotICAgIGZvciBvcHQgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0WzBdIGluICggIi1oIiwgIi0taGVscCIgKToKLSAgICAgICAgICAgIHVzYWdlKCkKLSAgICAgICAgICAgIHN5cy5leGl0KCAwICkKLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLXQiLCAiLS10aXRsZSIgKToKLSAgICAgICAgICAgIHByb2plY3RfdGl0bGUgPSBvcHRbMV0KLQotICAgICAgICBpZiBvcHRbMF0gaW4gKCAiLW8iLCAiLS1vdXRwdXQiICk6Ci0gICAgICAgICAgICB1dGlscy5vdXRwdXRfZGlyID0gb3B0WzFdCi0KLSAgICAgICAgaWYgb3B0WzBdIGluICggIi1wIiwgIi0tcHJlZml4IiApOgotICAgICAgICAgICAgcHJvamVjdF9wcmVmaXggPSBvcHRbMV0KLQotICAgIGNoZWNrX291dHB1dCgpCi0KLSAgICAjIGNyZWF0ZSBjb250ZXh0IGFuZCBwcm9jZXNzb3IKLSAgICBzb3VyY2VfcHJvY2Vzc29yICA9IFNvdXJjZVByb2Nlc3NvcigpCi0gICAgY29udGVudF9wcm9jZXNzb3IgPSBDb250ZW50UHJvY2Vzc29yKCkKLQotICAgICMgcmV0cmlldmUgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2VzcwotICAgIGZpbGVfbGlzdCA9IG1ha2VfZmlsZV9saXN0KCBhcmdzICkKLSAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZV9saXN0OgotICAgICAgICBzb3VyY2VfcHJvY2Vzc29yLnBhcnNlX2ZpbGUoIGZpbGVuYW1lICkKLSAgICAgICAgY29udGVudF9wcm9jZXNzb3IucGFyc2Vfc291cmNlcyggc291cmNlX3Byb2Nlc3NvciApCi0KLSAgICAjIHByb2Nlc3Mgc2VjdGlvbnMKLSAgICBjb250ZW50X3Byb2Nlc3Nvci5maW5pc2goKQotCi0gICAgZm9ybWF0dGVyID0gSHRtbEZvcm1hdHRlciggY29udGVudF9wcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF90aXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X3ByZWZpeCApCi0KLSAgICBmb3JtYXR0ZXIudG9jX2R1bXAoKQotICAgIGZvcm1hdHRlci5pbmRleF9kdW1wKCkKLSAgICBmb3JtYXR0ZXIuc2VjdGlvbl9kdW1wX2FsbCgpCi0KLQotIyBpZiBjYWxsZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oIHN5cy5hcmd2ICkKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci9mb3JtYXR0ZXIucHkgYi9zcmMvdG9vbHMvZG9jbWFrZXIvZm9ybWF0dGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzA4ZmQ0Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9kb2NtYWtlci9mb3JtYXR0ZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotIwotIyAgZm9ybWF0dGVyLnB5Ci0jCi0jICAgIENvbnZlcnQgcGFyc2VkIGNvbnRlbnQgYmxvY2tzIHRvIGEgc3RydWN0dXJlZCBkb2N1bWVudCAobGlicmFyeSBmaWxlKS4KLSMKLSMgIENvcHlyaWdodCAyMDAyLTIwMTggYnkKLSMgIERhdmlkIFR1cm5lci4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0jICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLSMgIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0jCi0jIFRoaXMgaXMgdGhlIGJhc2UgRm9ybWF0dGVyIGNsYXNzLiAgSXRzIHB1cnBvc2UgaXMgdG8gY29udmVydCBhIGNvbnRlbnQKLSMgcHJvY2Vzc29yJ3MgZGF0YSBpbnRvIHNwZWNpZmljIGRvY3VtZW50cyAoaS5lLiwgdGFibGUgb2YgY29udGVudHMsIGdsb2JhbAotIyBpbmRleCwgYW5kIGluZGl2aWR1YWwgQVBJIHJlZmVyZW5jZSBpbmRpY2VzKS4KLSMKLSMgWW91IG5lZWQgdG8gc3ViLWNsYXNzIGl0IHRvIG91dHB1dCBhbnl0aGluZyBzZW5zaWJsZS4gIEZvciBleGFtcGxlLCB0aGUKLSMgZmlsZSBgdG9odG1sLnB5JyBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYEh0bWxGb3JtYXR0ZXInIHN1Yi1jbGFzcwotIyB0byBvdXRwdXQgSFRNTC4KLSMKLQotCi1mcm9tIHNvdXJjZXMgaW1wb3J0ICoKLWZyb20gY29udGVudCBpbXBvcnQgKgotZnJvbSB1dGlscyAgIGltcG9ydCAqCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSMjICBGT1JNQVRURVIgQ0xBU1MKLSMjCi1jbGFzcyAgRm9ybWF0dGVyOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgcHJvY2Vzc29yICk6Ci0gICAgICAgIHNlbGYucHJvY2Vzc29yICAgPSBwcm9jZXNzb3IKLSAgICAgICAgc2VsZi5pZGVudGlmaWVycyA9IHt9Ci0gICAgICAgIHNlbGYuY2hhcHRlcnMgICAgPSBwcm9jZXNzb3IuY2hhcHRlcnMKLSAgICAgICAgc2VsZi5zZWN0aW9ucyAgICA9IHByb2Nlc3Nvci5zZWN0aW9ucy52YWx1ZXMoKQotICAgICAgICBzZWxmLmJsb2NrX2luZGV4ID0gW10KLQotICAgICAgICAjIHN0b3JlIGFsbCBibG9ja3MgaW4gYSBkaWN0aW9uYXJ5Ci0gICAgICAgIHNlbGYuYmxvY2tzID0gW10KLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9uczoKLSAgICAgICAgICAgIGZvciBibG9jayBpbiBzZWN0aW9uLmJsb2Nrcy52YWx1ZXMoKToKLSAgICAgICAgICAgICAgICBzZWxmLmFkZF9pZGVudGlmaWVyKCBibG9jay5uYW1lLCBibG9jayApCi0KLSAgICAgICAgICAgICAgICAjIGFkZCBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gdGhlIGluZGV4LCBzaW5jZSB0aGlzIGlzIHVzZWZ1bAotICAgICAgICAgICAgICAgIGZvciBtYXJrdXAgaW4gYmxvY2subWFya3VwczoKLSAgICAgICAgICAgICAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAndmFsdWVzJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWVsZCBpbiBtYXJrdXAuZmllbGRzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX2lkZW50aWZpZXIoIGZpZWxkLm5hbWUsIGJsb2NrICkKLQotICAgICAgICBzZWxmLmJsb2NrX2luZGV4ID0gc2VsZi5pZGVudGlmaWVycy5rZXlzKCkKLSAgICAgICAgc2VsZi5ibG9ja19pbmRleC5zb3J0KCBrZXkgPSBpbmRleF9rZXkgKQotCi0gICAgICAgICMgYWxzbyBhZGQgc2VjdGlvbiBuYW1lcyB0byBkaWN0aW9uYXJ5ICh3aXRob3V0IG1ha2luZyB0aGVtIGFwcGVhcgotICAgICAgICAjIGluIHRoZSBpbmRleCkKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9uczoKLSAgICAgICAgICAgIHNlbGYuYWRkX2lkZW50aWZpZXIoIHNlY3Rpb24ubmFtZSwgc2VjdGlvbiApCi0KLSAgICBkZWYgIGFkZF9pZGVudGlmaWVyKCBzZWxmLCBuYW1lLCBibG9jayApOgotICAgICAgICBpZiBuYW1lIGluIHNlbGYuaWRlbnRpZmllcnM6Ci0gICAgICAgICAgICAjIGR1cGxpY2F0ZSBuYW1lIQotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIldBUk5JTkc6IGR1cGxpY2F0ZSBkZWZpbml0aW9uIGZvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnIiArIG5hbWUgKyAiJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbiAiICsgYmxvY2subG9jYXRpb24oKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInByZXZpb3VzIGRlZmluaXRpb24gaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWxmLmlkZW50aWZpZXJzW25hbWVdLmxvY2F0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuIiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmlkZW50aWZpZXJzW25hbWVdID0gYmxvY2sKLQotICAgICMKLSAgICAjIGZvcm1hdHRpbmcgdGhlIHRhYmxlIG9mIGNvbnRlbnRzCi0gICAgIwotICAgIGRlZiAgdG9jX2VudGVyKCBzZWxmICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgdG9jX2NoYXB0ZXJfZW50ZXIoIHNlbGYsIGNoYXB0ZXIgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICB0b2Nfc2VjdGlvbl9lbnRlciggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHRvY19zZWN0aW9uX2V4aXQoIHNlbGYsIHNlY3Rpb24gKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICB0b2NfY2hhcHRlcl9leGl0KCBzZWxmLCBjaGFwdGVyICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgdG9jX2luZGV4KCBzZWxmLCBpbmRleF9maWxlbmFtZSApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHRvY19leGl0KCBzZWxmICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgdG9jX2R1bXAoIHNlbGYsIHRvY19maWxlbmFtZSA9IE5vbmUsIGluZGV4X2ZpbGVuYW1lID0gTm9uZSApOgotICAgICAgICBvdXRwdXQgPSBOb25lCi0gICAgICAgIGlmIHRvY19maWxlbmFtZToKLSAgICAgICAgICAgIG91dHB1dCA9IG9wZW5fb3V0cHV0KCB0b2NfZmlsZW5hbWUgKQotCi0gICAgICAgIHNlbGYudG9jX2VudGVyKCkKLQotICAgICAgICBmb3IgY2hhcCBpbiBzZWxmLnByb2Nlc3Nvci5jaGFwdGVyczoKLQotICAgICAgICAgICAgc2VsZi50b2NfY2hhcHRlcl9lbnRlciggY2hhcCApCi0KLSAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIGNoYXAuc2VjdGlvbnM6Ci0gICAgICAgICAgICAgICAgc2VsZi50b2Nfc2VjdGlvbl9lbnRlciggc2VjdGlvbiApCi0gICAgICAgICAgICAgICAgc2VsZi50b2Nfc2VjdGlvbl9leGl0KCBzZWN0aW9uICkKLQotICAgICAgICAgICAgc2VsZi50b2NfY2hhcHRlcl9leGl0KCBjaGFwICkKLQotICAgICAgICBzZWxmLnRvY19pbmRleCggaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgICAgIHNlbGYudG9jX2V4aXQoKQotCi0gICAgICAgIGlmIG91dHB1dDoKLSAgICAgICAgICAgIGNsb3NlX291dHB1dCggb3V0cHV0ICkKLQotICAgICMKLSAgICAjIGZvcm1hdHRpbmcgdGhlIGluZGV4Ci0gICAgIwotICAgIGRlZiAgaW5kZXhfZW50ZXIoIHNlbGYgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBpbmRleF9uYW1lX2VudGVyKCBzZWxmLCBuYW1lICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgaW5kZXhfbmFtZV9leGl0KCBzZWxmLCBuYW1lICk6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiAgaW5kZXhfZXhpdCggc2VsZiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGluZGV4X2R1bXAoIHNlbGYsIGluZGV4X2ZpbGVuYW1lID0gTm9uZSApOgotICAgICAgICBvdXRwdXQgPSBOb25lCi0gICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lOgotICAgICAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIGluZGV4X2ZpbGVuYW1lICkKLQotICAgICAgICBzZWxmLmluZGV4X2VudGVyKCkKLQotICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmJsb2NrX2luZGV4OgotICAgICAgICAgICAgc2VsZi5pbmRleF9uYW1lX2VudGVyKCBuYW1lICkKLSAgICAgICAgICAgIHNlbGYuaW5kZXhfbmFtZV9leGl0KCBuYW1lICkKLQotICAgICAgICBzZWxmLmluZGV4X2V4aXQoKQotCi0gICAgICAgIGlmIG91dHB1dDoKLSAgICAgICAgICAgIGNsb3NlX291dHB1dCggb3V0cHV0ICkKLQotICAgICMKLSAgICAjIGZvcm1hdHRpbmcgYSBzZWN0aW9uCi0gICAgIwotICAgIGRlZiAgc2VjdGlvbl9lbnRlciggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGJsb2NrX2VudGVyKCBzZWxmLCBibG9jayApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIG1hcmt1cF9lbnRlciggc2VsZiwgbWFya3VwLCBibG9jayA9IE5vbmUgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBmaWVsZF9lbnRlciggc2VsZiwgZmllbGQsIG1hcmt1cCA9IE5vbmUsIGJsb2NrID0gTm9uZSApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIGZpZWxkX2V4aXQoIHNlbGYsIGZpZWxkLCBtYXJrdXAgPSBOb25lLCBibG9jayA9IE5vbmUgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBtYXJrdXBfZXhpdCggc2VsZiwgbWFya3VwLCBibG9jayA9IE5vbmUgKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmICBibG9ja19leGl0KCBzZWxmLCBibG9jayApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHNlY3Rpb25fZXhpdCggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgIHNlY3Rpb25fZHVtcCggc2VsZiwgc2VjdGlvbiwgc2VjdGlvbl9maWxlbmFtZSA9IE5vbmUgKToKLSAgICAgICAgb3V0cHV0ID0gTm9uZQotICAgICAgICBpZiBzZWN0aW9uX2ZpbGVuYW1lOgotICAgICAgICAgICAgb3V0cHV0ID0gb3Blbl9vdXRwdXQoIHNlY3Rpb25fZmlsZW5hbWUgKQotCi0gICAgICAgIHNlbGYuc2VjdGlvbl9lbnRlciggc2VjdGlvbiApCi0KLSAgICAgICAgZm9yIG5hbWUgaW4gc2VjdGlvbi5ibG9ja19uYW1lczoKLSAgICAgICAgICAgIHNraXBfZW50cnkgPSAwCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgYmxvY2sgPSBzZWxmLmlkZW50aWZpZXJzW25hbWVdCi0gICAgICAgICAgICAgICAgIyBgYmxvY2tfbmFtZXMnIGNhbiBjb250YWluIGZpZWxkIG5hbWVzIGFsc28sCi0gICAgICAgICAgICAgICAgIyB3aGljaCB3ZSBmaWx0ZXIgb3V0Ci0gICAgICAgICAgICAgICAgZm9yIG1hcmt1cCBpbiBibG9jay5tYXJrdXBzOgotICAgICAgICAgICAgICAgICAgICBpZiBtYXJrdXAudGFnID09ICd2YWx1ZXMnOgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpZWxkIGluIG1hcmt1cC5maWVsZHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmllbGQubmFtZSA9PSBuYW1lOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2VudHJ5ID0gMQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHNraXBfZW50cnkgPSAxICAgIyB0aGlzIGhhcHBlbnMgZS5nLiBmb3IgYC9lbXB0eS8nIGVudHJpZXMKLQotICAgICAgICAgICAgaWYgc2tpcF9lbnRyeToKLSAgICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICAgICAgc2VsZi5ibG9ja19lbnRlciggYmxvY2sgKQotCi0gICAgICAgICAgICBmb3IgbWFya3VwIGluIGJsb2NrLm1hcmt1cHNbMTpdOiAgICMgYWx3YXlzIGlnbm9yZSBmaXJzdCBtYXJrdXAhCi0gICAgICAgICAgICAgICAgc2VsZi5tYXJrdXBfZW50ZXIoIG1hcmt1cCwgYmxvY2sgKQotCi0gICAgICAgICAgICAgICAgZm9yIGZpZWxkIGluIG1hcmt1cC5maWVsZHM6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmllbGRfZW50ZXIoIGZpZWxkLCBtYXJrdXAsIGJsb2NrICkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5maWVsZF9leGl0KCBmaWVsZCwgbWFya3VwLCBibG9jayApCi0KLSAgICAgICAgICAgICAgICBzZWxmLm1hcmt1cF9leGl0KCBtYXJrdXAsIGJsb2NrICkKLQotICAgICAgICAgICAgc2VsZi5ibG9ja19leGl0KCBibG9jayApCi0KLSAgICAgICAgc2VsZi5zZWN0aW9uX2V4aXQoIHNlY3Rpb24gKQotCi0gICAgICAgIGlmIG91dHB1dDoKLSAgICAgICAgICAgIGNsb3NlX291dHB1dCggb3V0cHV0ICkKLQotICAgIGRlZiAgc2VjdGlvbl9kdW1wX2FsbCggc2VsZiApOgotICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLnNlY3Rpb25zOgotICAgICAgICAgICAgc2VsZi5zZWN0aW9uX2R1bXAoIHNlY3Rpb24gKQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyL3NvdXJjZXMucHkgYi9zcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiOTVlMC4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvc291cmNlcy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQxMCArMCwwIEBACi0jCi0jICBzb3VyY2VzLnB5Ci0jCi0jICAgIENvbnZlcnQgc291cmNlIGNvZGUgY29tbWVudHMgdG8gbXVsdGktbGluZSBibG9ja3MgKGxpYnJhcnkgZmlsZSkuCi0jCi0jICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5Ci0jICBEYXZpZCBUdXJuZXIuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0jICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotIyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotIwotIyBUaGlzIGxpYnJhcnkgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBjbGFzc2VzIG5lZWRlZCB0byBkZWNvbXBvc2UgQwotIyBzb3VyY2UgY29kZSBmaWxlcyBpbnRvIGEgc2VyaWVzIG9mIG11bHRpLWxpbmUgYGJsb2NrcycuICBUaGVyZSBhcmUgdHdvCi0jIGtpbmRzIG9mIGJsb2Nrcy4KLSMKLSMgICAtIE5vcm1hbCBibG9ja3MsIHdoaWNoIGNvbnRhaW4gc291cmNlIGNvZGUgb3Igb3JkaW5hcnkgY29tbWVudHMuCi0jCi0jICAgLSBEb2N1bWVudGF0aW9uIGJsb2Nrcywgd2hpY2ggaGF2ZSByZXN0cmljdGVkIGZvcm1hdHRpbmcsIGFuZCB3aG9zZSB0ZXh0Ci0jICAgICBhbHdheXMgc3RhcnQgd2l0aCBhIGRvY3VtZW50YXRpb24gbWFya3VwIHRhZyBsaWtlIGA8RnVuY3Rpb24+JywKLSMgICAgIGA8VHlwZT4nLCBldGMuCi0jCi0jIFRoZSByb3V0aW5lcyB0byBwcm9jZXNzIHRoZSBjb250ZW50IG9mIGRvY3VtZW50YXRpb24gYmxvY2tzIGFyZSBjb250YWluZWQKLSMgaW4gZmlsZSBgY29udGVudC5weSc7IHRoZSBjbGFzc2VzIGFuZCBtZXRob2RzIGZvdW5kIGhlcmUgb25seSBkZWFsIHdpdGgKLSMgdGV4dCBwYXJzaW5nIGFuZCBiYXNpYyBkb2N1bWVudGF0aW9uIGJsb2NrIGV4dHJhY3Rpb24uCi0jCi0KLQotaW1wb3J0IGZpbGVpbnB1dCwgcmUsIHN0cmluZwotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgU09VUkNFIEJMT0NLIEZPUk1BVCBDTEFTUwotIyMKLSMjICBBIHNpbXBsZSBjbGFzcyBjb250YWluaW5nIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZWN0Ci0jIyAgcG90ZW50aWFsIGRvY3VtZW50YXRpb24gZm9ybWF0IGJsb2NrIGNvbW1lbnRzIHdpdGhpbiBDIHNvdXJjZSBjb2RlLgotIyMKLSMjICBUaGUgYGNvbHVtbicgcGF0dGVybiBtdXN0IGNvbnRhaW4gYSBncm91cCB0byBgdW5ib3gnIHRoZSBjb250ZW50IG9mCi0jIyAgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2Nrcy4KLSMjCi0jIyAgTGF0ZXIgb24sIHBhcmFncmFwaHMgYXJlIGNvbnZlcnRlZCB0byBsb25nIGxpbmVzLCB3aGljaCBzaW1wbGlmaWVzIHRoZQotIyMgIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBhY3QgdXBvbiB0aGUgdGV4dC4KLSMjCi1jbGFzcyAgU291cmNlQmxvY2tGb3JtYXQ6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBpZCwgc3RhcnQsIGNvbHVtbiwgZW5kICk6Ci0gICAgICAgICIiIkNyZWF0ZSBhIGJsb2NrIHBhdHRlcm4sIHVzZWQgdG8gcmVjb2duaXplIHNwZWNpYWwgZG9jdW1lbnRhdGlvbgotICAgICAgICAgICBibG9ja3MuIiIiCi0gICAgICAgIHNlbGYuaWQgICAgID0gaWQKLSAgICAgICAgc2VsZi5zdGFydCAgPSByZS5jb21waWxlKCBzdGFydCwgcmUuVkVSQk9TRSApCi0gICAgICAgIHNlbGYuY29sdW1uID0gcmUuY29tcGlsZSggY29sdW1uLCByZS5WRVJCT1NFICkKLSAgICAgICAgc2VsZi5lbmQgICAgPSByZS5jb21waWxlKCBlbmQsIHJlLlZFUkJPU0UgKQotCi0KLSMKLSMgRm9ybWF0IDEgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2Nrcy4KLSMKLSMgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gKGF0IGxlYXN0IDIgYXN0ZXJpc2tzKQotIyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotIyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAoYXQgbGVhc3QgMiBhc3Rlcmlza3MpCi0jCi1zdGFydCA9IHInJycKLSAgXHMqICAgICAgIyBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UKLSAgL1wqezIsfS8gIyBmb2xsb3dlZCBieSAnLycgYW5kIGF0IGxlYXN0IHR3byBhc3Rlcmlza3MgdGhlbiAnLycKLSAgXHMqJCAgICAgIyBwcm9iYWJseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlCi0nJycKLQotY29sdW1uID0gcicnJwotICBccyogICAgICAjIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZQotICAvXCp7MX0gICAjIGZvbGxvd2VkIGJ5ICcvJyBhbmQgcHJlY2lzZWx5IG9uZSBhc3RlcmlzawotICAoW14qXS4qKSAjIGZvbGxvd2VkIGJ5IGFueXRoaW5nIChncm91cCAxKQotICBcKnsxfS8gICAjIGZvbGxvd2VkIGJ5IG9uZSBhc3RlcmlzayBhbmQgYSAnLycKLSAgXHMqJCAgICAgIyBwcm9iYWJseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlCi0nJycKLQotcmVfc291cmNlX2Jsb2NrX2Zvcm1hdDEgPSBTb3VyY2VCbG9ja0Zvcm1hdCggMSwgc3RhcnQsIGNvbHVtbiwgc3RhcnQgKQotCi0KLSMKLSMgRm9ybWF0IDIgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2Nrcy4KLSMKLSMgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAoYXQgbGVhc3QgMiBhc3Rlcmlza3MpCi0jICAgICAqCi0jICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgYXN0ZXJpc2spCi0jICAgICAqCi0jICAgICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgb3IgbW9yZSBhc3Rlcmlza3MpCi0jCi1zdGFydCA9IHInJycKLSAgXHMqICAgICAjIGFueSBudW1iZXIgb2Ygd2hpdGVzcGFjZQotICAvXCp7Mix9ICMgZm9sbG93ZWQgYnkgJy8nIGFuZCBhdCBsZWFzdCB0d28gYXN0ZXJpc2tzCi0gIFxzKiQgICAgIyBwcm9iYWJseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlCi0nJycKLQotY29sdW1uID0gcicnJwotICBccyogICAgICAgICAgICMgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlCi0gIFwqezF9KD8hWyovXSkgIyBmb2xsb3dlZCBieSBwcmVjaXNlbHkgb25lIGFzdGVyaXNrIG5vdCBmb2xsb3dlZCBieSBgLycKLSAgKC4qKSAgICAgICAgICAjIHRoZW4gYW55dGhpbmcgKGdyb3VwMSkKLScnJwotCi1lbmQgPSByJycnCi0gIFxzKiAgIyBhbnkgbnVtYmVyIG9mIHdoaXRlc3BhY2UKLSAgXCorLyAjIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBhc3RlcmlzaywgdGhlbiAnLycKLScnJwotCi1yZV9zb3VyY2VfYmxvY2tfZm9ybWF0MiA9IFNvdXJjZUJsb2NrRm9ybWF0KCAyLCBzdGFydCwgY29sdW1uLCBlbmQgKQotCi0KLSMKLSMgVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGRvY3VtZW50YXRpb24gYmxvY2sgZm9ybWF0cy4gIFdlIGNvdWxkIGFkZCBuZXcgb25lcwotIyBxdWl0ZSBlYXNpbHkuCi0jCi1yZV9zb3VyY2VfYmxvY2tfZm9ybWF0cyA9IFtyZV9zb3VyY2VfYmxvY2tfZm9ybWF0MSwgcmVfc291cmNlX2Jsb2NrX2Zvcm1hdDJdCi0KLQotIwotIyBUaGUgZm9sbG93aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMgY29ycmVzcG9uZCB0byBtYXJrdXAgdGFncyB3aXRoaW4gdGhlCi0jIGRvY3VtZW50YXRpb24gY29tbWVudCBibG9ja3MuICBUaGV5IGFyZSBlcXVpdmFsZW50IGRlc3BpdGUgdGhlaXIgZGlmZmVyZW50Ci0jIHN5bnRheC4KLSMKLSMgQSBtYXJrdXAgdGFnIGNvbnNpc3RzIG9mIGxldHRlcnMgb3IgY2hhcmFjdGVyIGAtJywgdG8gYmUgZm91bmQgaW4gZ3JvdXAgMS4KLSMKLSMgTm90aWNlIHRoYXQgYSBtYXJrdXAgdGFnIF9tdXN0XyBiZWdpbiBhIG5ldyBwYXJhZ3JhcGguCi0jCi1yZV9tYXJrdXBfdGFnMSA9IHJlLmNvbXBpbGUoIHInJydccyo8KCg/Olx3fC0pKik+JycnICkgICMgPHh4eHg+IGZvcm1hdAotcmVfbWFya3VwX3RhZzIgPSByZS5jb21waWxlKCByJycnXHMqQCgoPzpcd3wtKSopOicnJyApICAjIEB4eHh4OiBmb3JtYXQKLQotIwotIyBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgbWFya3VwIHRhZ3MuICBXZSBjb3VsZCBhZGQgbmV3IG9uZXMgcXVpdGUgZWFzaWx5LgotIwotcmVfbWFya3VwX3RhZ3MgPSBbcmVfbWFya3VwX3RhZzEsIHJlX21hcmt1cF90YWcyXQotCi0KLSMKLSMgQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZGV0ZWN0IGEgY3Jvc3MgcmVmZXJlbmNlLCBhZnRlciBtYXJrdXAgdGFncyBoYXZlCi0jIGJlZW4gc3RyaXBwZWQgb2ZmLgotIwotIyBUd28gc3ludGF4IGZvcm1zIGFyZSBzdXBwb3J0ZWQ6Ci0jCi0jICAgQDxuYW1lPgotIyAgIEA8bmFtZT5bPGlkPl0KLSMKLSMgd2hlcmUgYm90aCBgPG5hbWU+JyBhbmQgYDxpZD4nIGNvbnNpc3Qgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGBfJywKLSMgYW5kIGAtJy4gIFVzZSBgPGlkPicgaWYgdGhlcmUgYXJlIG11bHRpcGxlLCB2YWxpZCBgPG5hbWU+JyBlbnRyaWVzLgotIwotIyBFeGFtcGxlOiBAZm9vW2Jhcl0KLSMKLXJlX2Nyb3NzcmVmID0gcmUuY29tcGlsZSggciIiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoP1A8bmFtZT4oPzpcd3wtKSsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPzpcWyg/Olx3fC0pK1xdKT8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKD9QPHJlc3Q+LiopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIiIiwgcmUuVkVSQk9TRSApCi0KLSMKLSMgVHdvIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZWN0IGl0YWxpYyBhbmQgYm9sZCBtYXJrdXAsIHJlc3BlY3RpdmVseS4KLSMgR3JvdXAgMSBpcyB0aGUgbWFya3VwLCBncm91cCAyIHRoZSByZXN0IG9mIHRoZSBsaW5lLgotIwotIyBOb3RlIHRoYXQgdGhlIG1hcmt1cCBpcyBsaW1pdGVkIHRvIHdvcmRzIGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLAotIyB0aGUgY2hhcmFjdGVycyBgXycgYW5kIGAtJywgb3IgYW4gYXBvc3Ryb3BoZSAoYnV0IG5vdCBhcyB0aGUgZmlyc3QKLSMgY2hhcmFjdGVyKS4KLSMKLXJlX2l0YWxpYyA9IHJlLmNvbXBpbGUoIHIiXygoPzpcd3wtKSg/Olx3fCd8LSkqKV8oLiopIiApICAgICAjICBfaXRhbGljXwotcmVfYm9sZCAgID0gcmUuY29tcGlsZSggciJcKigoPzpcd3wtKSg/Olx3fCd8LSkqKVwqKC4qKSIgKSAgICMgICpib2xkKgotCi0jCi0jIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGNvZGUgdG8gaWRlbnRpZnkgYW4gVVJMIGhhcyBiZWVuIHRha2VuIGZyb20KLSMKLSMgICBodHRwczovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvdHV0b3IvMjAwMi1TZXB0ZW1iZXIvMDE3MjI4Lmh0bWwKLSMKLSMgKHdpdGggc2xpZ2h0IG1vZGlmaWNhdGlvbnMpLgotIwotdXJscyA9IHInKD86aHR0cHM/fHRlbG5ldHxnb3BoZXJ8ZmlsZXx3YWlzfGZ0cCknCi1sdHJzID0gcidcdycKLWd1bmsgPSByJy8jfjouPys9JiVAIVwtJwotcHVuYyA9IHInLjo/XC0nCi1hbnkgID0gIiUobHRycylzJShndW5rKXMlKHB1bmMpcyIgJSB7ICdsdHJzJyA6IGx0cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdndW5rJyA6IGd1bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdW5jJyA6IHB1bmMgfQotdXJsICA9IHIiIiIKLSAgICAgICAgICgKLSAgICAgICAgICAgXGIgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgYXQgd29yZCBib3VuZGFyeQotICAgICAgICAgICAlKHVybHMpcyA6ICAgICAgICAgICAgIyBuZWVkIHJlc291cmNlIGFuZCBhIGNvbG9uCi0gICAgICAgICAgIFslKGFueSlzXSArPyAgICAgICAgICAjIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIG9mIGFueSB2YWxpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIsIGJ1dCBiZSBjb25zZXJ2YXRpdmUgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRha2Ugb25seSB3aGF0IHlvdSBuZWVkIHRvLi4uCi0gICAgICAgICAgICg/PSAgICAgICAgICAgICAgICAgICAjIFtsb29rLWFoZWFkIG5vbi1jb25zdW1wdGl2ZSBhc3NlcnRpb25dCi0gICAgICAgICAgICAgWyUocHVuYylzXSogICAgICAgICAjIGVpdGhlciAwIG9yIG1vcmUgcHVuY3R1YXRpb24KLSAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICMgW25vbi1ncm91cGluZyBwYXJlbnRoZXNlc10KLSAgICAgICAgICAgICAgIFteJShhbnkpc10gfCAkICAgICMgZm9sbG93ZWQgYnkgYSBub24tdXJsIGNoYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IgZW5kIG9mIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICApCi0gICAgICAgICAgICkKLSAgICAgICAgICkKLSAgICAgICAgIiIiICUgeyd1cmxzJyA6IHVybHMsCi0gICAgICAgICAgICAgICAnYW55JyAgOiBhbnksCi0gICAgICAgICAgICAgICAncHVuYycgOiBwdW5jIH0KLQotcmVfdXJsID0gcmUuY29tcGlsZSggdXJsLCByZS5WRVJCT1NFIHwgcmUuTVVMVElMSU5FICkKLQotIwotIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHN0b3BzIGNvbGxlY3Rpb24gb2YgY29tbWVudHMgZm9yIHRoZSBjdXJyZW50Ci0jIGJsb2NrLgotIwotcmVfc291cmNlX3NlcCA9IHJlLmNvbXBpbGUoIHInXHMqL1wqXHMqXCovJyApICAgIyAgLyogKi8KLQotIwotIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBmaW5kIHBvc3NpYmxlIEMgaWRlbnRpZmllcnMgd2hpbGUgb3V0cHV0dGluZwotIyBzb3VyY2UgY29kZSB2ZXJiYXRpbSwgY292ZXJpbmcgdGhpbmdzIGxpa2UgYCpmb28nIG9yIGAoYmFyJy4gIEdyb3VwIDEgaXMKLSMgdGhlIHByZWZpeCwgZ3JvdXAgMiB0aGUgaWRlbnRpZmllciAtLSBzaW5jZSB3ZSBzY2FuIGxpbmVzIGZyb20gbGVmdCB0bwotIyByaWdodCwgc2VxdWVudGlhbGx5IHNwbGl0dGluZyB0aGUgc291cmNlIGNvZGUgaW50byBwcmVmaXggYW5kIGlkZW50aWZpZXIKLSMgaXMgZnVsbHkgc3VmZmljaWVudCBmb3Igb3VyIHB1cnBvc2VzLgotIwotcmVfc291cmNlX2Nyb3NzcmVmID0gcmUuY29tcGlsZSggcicoXFcqKShcdyopJyApCi0KLSMKLSMgQSByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGEgbGlzdCBvZiByZXNlcnZlZCBDIHNvdXJjZSBrZXl3b3Jkcy4KLSMKLXJlX3NvdXJjZV9rZXl3b3JkcyA9IHJlLmNvbXBpbGUoICcnJ1xcYiAoIHR5cGVkZWYgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwjaW5jbHVkZSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2RlZmluZSAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCN1bmRlZiAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwjaWYgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2lmZGVmICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCNpZm5kZWYgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwjZWxzZSAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcI2VuZGlmICAgKSBcXGInJycsIHJlLlZFUkJPU0UgKQotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgU09VUkNFIEJMT0NLIENMQVNTCi0jIwotIyMgIFRoZXJlIGFyZSB0d28gaW1wb3J0YW50IGZpZWxkcyBpbiBhIGBTb3VyY2VCbG9jaycgb2JqZWN0LgotIyMKLSMjICAgIHNlbGYubGluZXMKLSMjICAgICAgQSBsaXN0IG9mIHRleHQgbGluZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrLgotIyMKLSMjICAgIHNlbGYuY29udGVudAotIyMgICAgICBGb3IgZG9jdW1lbnRhdGlvbiBjb21tZW50IGJsb2NrcyBvbmx5LCB0aGlzIGlzIHRoZSBibG9jayBjb250ZW50Ci0jIyAgICAgIHRoYXQgaGFzIGJlZW4gYHVuYm94ZWQnIGZyb20gaXRzIGRlY29yYXRpb24uICBUaGlzIGlzIGBOb25lJyBmb3IgYWxsCi0jIyAgICAgIG90aGVyIGJsb2NrcyAoaS5lLiwgc291cmNlcyBvciBvcmRpbmFyeSBjb21tZW50cyB3aXRoIG5vIHN0YXJ0aW5nCi0jIyAgICAgIG1hcmt1cCB0YWcpCi0jIwotY2xhc3MgIFNvdXJjZUJsb2NrOgotCi0gICAgZGVmICBfX2luaXRfXyggc2VsZiwgcHJvY2Vzc29yLCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lcyApOgotICAgICAgICBzZWxmLnByb2Nlc3NvciA9IHByb2Nlc3NvcgotICAgICAgICBzZWxmLmZpbGVuYW1lICA9IGZpbGVuYW1lCi0gICAgICAgIHNlbGYubGluZW5vICAgID0gbGluZW5vCi0gICAgICAgIHNlbGYubGluZXMgICAgID0gbGluZXNbOl0KLSAgICAgICAgc2VsZi5mb3JtYXQgICAgPSBwcm9jZXNzb3IuZm9ybWF0Ci0gICAgICAgIHNlbGYuY29udGVudCAgID0gW10KLQotICAgICAgICBpZiBzZWxmLmZvcm1hdCA9PSBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgd29yZHMgPSBbXQotCi0gICAgICAgICMgZXh0cmFjdCBjb21tZW50IGxpbmVzCi0gICAgICAgIGxpbmVzID0gW10KLQotICAgICAgICBmb3IgbGluZTAgaW4gc2VsZi5saW5lczoKLSAgICAgICAgICAgIG0gPSBzZWxmLmZvcm1hdC5jb2x1bW4ubWF0Y2goIGxpbmUwICkKLSAgICAgICAgICAgIGlmIG06Ci0gICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCBtLmdyb3VwKCAxICkgKQotCi0gICAgICAgICMgbm93LCBsb29rIGZvciBhIG1hcmt1cCB0YWcKLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICBsID0gc3RyaW5nLnN0cmlwKCBsICkKLSAgICAgICAgICAgIGlmIGxlbiggbCApID4gMDoKLSAgICAgICAgICAgICAgICBmb3IgdGFnIGluIHJlX21hcmt1cF90YWdzOgotICAgICAgICAgICAgICAgICAgICBpZiB0YWcubWF0Y2goIGwgKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGVudCA9IGxpbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLQotICAgIGRlZiAgbG9jYXRpb24oIHNlbGYgKToKLSAgICAgICAgcmV0dXJuICIoIiArIHNlbGYuZmlsZW5hbWUgKyAiOiIgKyByZXByKCBzZWxmLmxpbmVubyApICsgIikiCi0KLSAgICAjIGRlYnVnZ2luZyBvbmx5IC0tIG5vdCB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb25zCi0gICAgZGVmICBkdW1wKCBzZWxmICk6Ci0gICAgICAgIGlmIHNlbGYuY29udGVudDoKLSAgICAgICAgICAgIHByaW50KCAie3t7Y29udGVudCBzdGFydC0tLSIgKQotICAgICAgICAgICAgZm9yIGwgaW4gc2VsZi5jb250ZW50OgotICAgICAgICAgICAgICAgIHByaW50KCBsICkKLSAgICAgICAgICAgIHByaW50KCAiLS0tY29udGVudCBlbmR9fX0iICkKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGZtdCA9ICIiCi0gICAgICAgIGlmIHNlbGYuZm9ybWF0OgotICAgICAgICAgICAgZm10ID0gcmVwciggc2VsZi5mb3JtYXQuaWQgKSArICIgIgotCi0gICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZXM6Ci0gICAgICAgICAgICBwcmludCggbGluZSApCi0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMKLSMjICBTT1VSQ0UgUFJPQ0VTU09SIENMQVNTCi0jIwotIyMgIFRoZSBgU291cmNlUHJvY2Vzc29yJyBpcyBpbiBjaGFyZ2Ugb2YgcmVhZGluZyBhIEMgc291cmNlIGZpbGUgYW5kCi0jIyAgZGVjb21wb3NpbmcgaXQgaW50byBhIHNlcmllcyBvZiBkaWZmZXJlbnQgYFNvdXJjZUJsb2NrJyBvYmplY3RzLgotIyMKLSMjICBBIFNvdXJjZUJsb2NrIG9iamVjdCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGRhdGEuCi0jIwotIyMgICAgLSBBIGRvY3VtZW50YXRpb24gY29tbWVudCBibG9jayB1c2luZyBvbmUgb2YgdGhlIGxheW91dHMgYWJvdmUuICBJdHMKLSMjICAgICAgZXhhY3QgZm9ybWF0IHdpbGwgYmUgZGlzY3Vzc2VkIGxhdGVyLgotIyMKLSMjICAgIC0gTm9ybWFsIHNvdXJjZXMgbGluZXMsIGluY2x1ZGluZyBjb21tZW50cy4KLSMjCi0jIwotY2xhc3MgIFNvdXJjZVByb2Nlc3NvcjoKLQotICAgIGRlZiAgX19pbml0X18oIHNlbGYgKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIHNvdXJjZSBwcm9jZXNzb3IuIiIiCi0gICAgICAgIHNlbGYuYmxvY2tzICAgPSBbXQotICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQotICAgICAgICBzZWxmLmZvcm1hdCAgID0gTm9uZQotICAgICAgICBzZWxmLmxpbmVzICAgID0gW10KLQotICAgIGRlZiAgcmVzZXQoIHNlbGYgKToKLSAgICAgICAgIiIiUmVzZXQgYSBibG9jayBwcm9jZXNzb3IgYW5kIGNsZWFuIHVwIGFsbCBpdHMgYmxvY2tzLiIiIgotICAgICAgICBzZWxmLmJsb2NrcyA9IFtdCi0gICAgICAgIHNlbGYuZm9ybWF0ID0gTm9uZQotCi0gICAgZGVmICBwYXJzZV9maWxlKCBzZWxmLCBmaWxlbmFtZSApOgotICAgICAgICAiIiJQYXJzZSBhIEMgc291cmNlIGZpbGUgYW5kIGFkZCBpdHMgYmxvY2tzIHRvIHRoZSBwcm9jZXNzb3IncwotICAgICAgICAgICBsaXN0LiIiIgotICAgICAgICBzZWxmLnJlc2V0KCkKLQotICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKLQotICAgICAgICBmaWxlaW5wdXQuY2xvc2UoKQotICAgICAgICBzZWxmLmZvcm1hdCA9IE5vbmUKLSAgICAgICAgc2VsZi5saW5lbm8gPSAwCi0gICAgICAgIHNlbGYubGluZXMgID0gW10KLQotICAgICAgICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoIGZpbGVuYW1lICk6Ci0gICAgICAgICAgICAjIHN0cmlwIHRyYWlsaW5nIG5ld2xpbmVzLCBpbXBvcnRhbnQgb24gV2luZG93cyBtYWNoaW5lcyEKLSAgICAgICAgICAgIGlmIGxpbmVbLTFdID09ICdcMDEyJzoKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVswOi0xXQotCi0gICAgICAgICAgICBpZiBzZWxmLmZvcm1hdCA9PSBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19ub3JtYWxfbGluZSggbGluZSApCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZm9ybWF0LmVuZC5tYXRjaCggbGluZSApOgotICAgICAgICAgICAgICAgICAgICAjIEEgbm9ybWFsIGJsb2NrIGVuZC4gIEFkZCBpdCB0byBgbGluZXMnIGFuZCBjcmVhdGUgYQotICAgICAgICAgICAgICAgICAgICAjIG5ldyBibG9jawotICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVzLmFwcGVuZCggbGluZSApCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkX2Jsb2NrX2xpbmVzKCkKLSAgICAgICAgICAgICAgICBlbGlmIHNlbGYuZm9ybWF0LmNvbHVtbi5tYXRjaCggbGluZSApOgotICAgICAgICAgICAgICAgICAgICAjIEEgbm9ybWFsIGNvbHVtbiBsaW5lLiAgQWRkIGl0IHRvIGBsaW5lcycuCi0gICAgICAgICAgICAgICAgICAgIHNlbGYubGluZXMuYXBwZW5kKCBsaW5lICkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAjIEFuIHVuZXhwZWN0ZWQgYmxvY2sgZW5kLiAgQ3JlYXRlIGEgbmV3IGJsb2NrLCBidXQKLSAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBwcm9jZXNzIHRoZSBsaW5lLgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZF9ibG9ja19saW5lcygpCi0KLSAgICAgICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGxpbmUgYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX25vcm1hbF9saW5lKCBsaW5lICkKLQotICAgICAgICAjIHJlY29yZCB0aGUgbGFzdCBsaW5lcwotICAgICAgICBzZWxmLmFkZF9ibG9ja19saW5lcygpCi0KLSAgICBkZWYgIHByb2Nlc3Nfbm9ybWFsX2xpbmUoIHNlbGYsIGxpbmUgKToKLSAgICAgICAgIiIiUHJvY2VzcyBhIG5vcm1hbCBsaW5lIGFuZCBjaGVjayB3aGV0aGVyIGl0IGlzIHRoZSBzdGFydCBvZiBhIG5ldwotICAgICAgICAgICBibG9jay4iIiIKLSAgICAgICAgZm9yIGYgaW4gcmVfc291cmNlX2Jsb2NrX2Zvcm1hdHM6Ci0gICAgICAgICAgICBpZiBmLnN0YXJ0Lm1hdGNoKCBsaW5lICk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hZGRfYmxvY2tfbGluZXMoKQotICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZgotICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gZmlsZWlucHV0LmZpbGVsaW5lbm8oKQotCi0gICAgICAgIHNlbGYubGluZXMuYXBwZW5kKCBsaW5lICkKLQotICAgIGRlZiAgYWRkX2Jsb2NrX2xpbmVzKCBzZWxmICk6Ci0gICAgICAgICIiIkFkZCB0aGUgY3VycmVudCBhY2N1bXVsYXRlZCBsaW5lcyBhbmQgY3JlYXRlIGEgbmV3IGJsb2NrLiIiIgotICAgICAgICBpZiBzZWxmLmxpbmVzICE9IFtdOgotICAgICAgICAgICAgYmxvY2sgPSBTb3VyY2VCbG9jayggc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZXMgKQotCi0gICAgICAgICAgICBzZWxmLmJsb2Nrcy5hcHBlbmQoIGJsb2NrICkKLSAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gTm9uZQotICAgICAgICAgICAgc2VsZi5saW5lcyAgPSBbXQotCi0gICAgIyBkZWJ1Z2dpbmcgb25seSwgbm90IHVzZWQgaW4gbm9ybWFsIG9wZXJhdGlvbnMKLSAgICBkZWYgIGR1bXAoIHNlbGYgKToKLSAgICAgICAgIiIiUHJpbnQgYWxsIGJsb2NrcyBpbiBhIHByb2Nlc3Nvci4iIiIKLSAgICAgICAgZm9yIGIgaW4gc2VsZi5ibG9ja3M6Ci0gICAgICAgICAgICBiLmR1bXAoKQotCi0jIGVvZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weSBiL3NyYy90b29scy9kb2NtYWtlci90b2h0bWwucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMzE4YTIuLjAwMDAwMDAKLS0tIGEvc3JjL3Rvb2xzL2RvY21ha2VyL3RvaHRtbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0jCi0jICB0b2h0bWwucHkKLSMKLSMgICAgQSBzdWItY2xhc3MgY29udGFpbmVyIG9mIHRoZSBgRm9ybWF0dGVyJyBjbGFzcyB0byBwcm9kdWNlIEhUTUwuCi0jCi0jICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5Ci0jICBEYXZpZCBUdXJuZXIuCi0jCi0jICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0jICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotIyAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0jICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotIyBUaGUgcGFyZW50IGNsYXNzIGlzIGNvbnRhaW5lZCBpbiBmaWxlIGBmb3JtYXR0ZXIucHknLgotCi0KLWZyb20gc291cmNlcyBpbXBvcnQgKgotZnJvbSBjb250ZW50IGltcG9ydCAqCi1mcm9tIGZvcm1hdHRlciBpbXBvcnQgKgotCi1pbXBvcnQgdGltZQotCi0KLSMgVGhlIGZvbGxvd2luZyBzdHJpbmdzIGRlZmluZSB0aGUgSFRNTCBoZWFkZXIgdXNlZCBieSBhbGwgZ2VuZXJhdGVkIHBhZ2VzLgotaHRtbF9oZWFkZXJfMSA9ICIiIlwKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgotPHRpdGxlPlwKLSIiIgotCi1odG1sX2hlYWRlcl8yID0gIiIiXAotIEFQSSBSZWZlcmVuY2U8L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgYTpsaW5rIHsgY29sb3I6ICMwMDAwRUY7IH0KLSAgYTp2aXNpdGVkIHsgY29sb3I6ICM1MTE4OEU7IH0KLSAgYTpob3ZlciB7IGNvbG9yOiAjRkYwMDAwOyB9Ci0KLSAgYm9keSB7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNlcmlmOwotICAgICAgICAgY29sb3I6ICMwMDAwMDA7Ci0gICAgICAgICBiYWNrZ3JvdW5kOiAjRkZGRkZGOwotICAgICAgICAgd2lkdGg6IDg3JTsKLSAgICAgICAgIG1hcmdpbjogYXV0bzsgfQotCi0gIGRpdi5zZWN0aW9uIHsgd2lkdGg6IDc1JTsKLSAgICAgICAgICAgICAgICBtYXJnaW46IGF1dG87IH0KLSAgZGl2LnNlY3Rpb24gaHIgeyBtYXJnaW46IDRleCAwIDFleCAwOyB9Ci0gIGRpdi5zZWN0aW9uIGg0IHsgYmFja2dyb3VuZC1jb2xvcjogI0VFRUVGRjsKLSAgICAgICAgICAgICAgICAgICBmb250LXNpemU6IG1lZGl1bTsKLSAgICAgICAgICAgICAgICAgICBmb250LXN0eWxlOiBvYmxpcXVlOwotICAgICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwotICAgICAgICAgICAgICAgICAgIG1hcmdpbjogM2V4IDAgMS41ZXggOSU7Ci0gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMC4zZXggMCAwLjNleCAxJTsgfQotICBkaXYuc2VjdGlvbiBwIHsgbWFyZ2luOiAxLjVleCAwIDEuNWV4IDEwJTsgfQotICBkaXYuc2VjdGlvbiBwcmUgeyBtYXJnaW46IDNleCAwIDNleCA5JTsKLSAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0Q2RThGRjsKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMmV4IDAgMmV4IDElOyB9Ci0gIGRpdi5zZWN0aW9uIHRhYmxlLmZpZWxkcyB7IHdpZHRoOiA5MCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMS41ZXggMCAxLjVleCAxMCU7IH0KLSAgZGl2LnNlY3Rpb24gdGFibGUudG9jIHsgd2lkdGg6IDk1JTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiAxLjVleCAwIDEuNWV4IDUlOyB9Ci0gIGRpdi50aW1lc3RhbXAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgICAgICAgICAgICAgICBmb250LXNpemU6IDY5JTsKLSAgICAgICAgICAgICAgICAgIG1hcmdpbjogMS41ZXggMCAxLjVleCAwOyB9Ci0KLSAgaDEgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgaDMgeyBmb250LXNpemU6IG1lZGl1bTsKLSAgICAgICBtYXJnaW46IDRleCAwIDEuNWV4IDA7IH0KLQotICBwIHsgdGV4dC1hbGlnbjoganVzdGlmeTsgfQotCi0gIHByZS5jb2xvcmVkIHsgY29sb3I6IGJsdWU7IH0KLQotICBzcGFuLmtleXdvcmQgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOwotICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgICAgICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOwotICAgICAgICAgICAgICAgICBjb2xvcjogZGFya2JsdWU7IH0KLQotICB0YWJsZS5maWVsZHMgdGQudmFsIHsgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAzMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAxZXggMWVtIDFleCAwOyB9Ci0gIHRhYmxlLmZpZWxkcyB0ZC5kZXNjIHsgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFleCAwIDFleCAxZW07IH0KLSAgdGFibGUuZmllbGRzIHRkLmRlc2MgcDpmaXJzdC1jaGlsZCB7IG1hcmdpbjogMDsgfQotICB0YWJsZS5maWVsZHMgdGQuZGVzYyBwIHsgbWFyZ2luOiAxLjVleCAwIDAgMDsgfQotICB0YWJsZS5pbmRleCB7IG1hcmdpbjogNmV4IGF1dG8gNmV4IGF1dG87Ci0gICAgICAgICAgICAgICAgYm9yZGVyOiAwOwotICAgICAgICAgICAgICAgIGJvcmRlci1jb2xsYXBzZTogc2VwYXJhdGU7Ci0gICAgICAgICAgICAgICAgYm9yZGVyLXNwYWNpbmc6IDFlbSAwLjNleDsgfQotICB0YWJsZS5pbmRleCB0ciB7IHBhZGRpbmc6IDA7IH0KLSAgdGFibGUuaW5kZXggdGQgeyBwYWRkaW5nOiAwOyB9Ci0gIHRhYmxlLmluZGV4LXRvYy1saW5rIHsgd2lkdGg6IDEwMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMWV4IDAgMWV4IDA7IH0KLSAgdGFibGUuaW5kZXgtdG9jLWxpbmsgdGQubGVmdCB7IHBhZGRpbmc6IDAgMC41ZW0gMCAwLjVlbTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogODMlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsgfQotICB0YWJsZS5pbmRleC10b2MtbGluayB0ZC5taWRkbGUgeyBwYWRkaW5nOiAwIDAuNWVtIDAgMC41ZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc2l6ZTogODMlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KLSAgdGFibGUuaW5kZXgtdG9jLWxpbmsgdGQucmlnaHQgeyBwYWRkaW5nOiAwIDAuNWVtIDAgMC41ZW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOiA4MyU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7IH0KLSAgdGFibGUuc3lub3BzaXMgeyBtYXJnaW46IDZleCBhdXRvIDZleCBhdXRvOwotICAgICAgICAgICAgICAgICAgIGJvcmRlcjogMDsKLSAgICAgICAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IHNlcGFyYXRlOwotICAgICAgICAgICAgICAgICAgIGJvcmRlci1zcGFjaW5nOiAyZW0gMC42ZXg7IH0KLSAgdGFibGUuc3lub3BzaXMgdHIgeyBwYWRkaW5nOiAwOyB9Ci0gIHRhYmxlLnN5bm9wc2lzIHRkIHsgcGFkZGluZzogMDsgfQotICB0YWJsZS50b2MgdGQubGluayB7IHdpZHRoOiAzMCU7Ci0gICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDFleCAxZW0gMWV4IDA7IH0KLSAgdGFibGUudG9jIHRkLmRlc2MgeyB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Ci0gICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogMWV4IDAgMWV4IDFlbTsKLSAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OyB9Ci0gIHRhYmxlLnRvYyB0ZC5kZXNjIHA6Zmlyc3QtY2hpbGQgeyBtYXJnaW46IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OyB9Ci0gIHRhYmxlLnRvYyB0ZC5kZXNjIHAgeyBtYXJnaW46IDEuNWV4IDAgMCAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsgfQotCi08L3N0eWxlPgotPC9oZWFkPgotPGJvZHk+Ci0iIiIKLQotaHRtbF9oZWFkZXJfM2wgPSAiIiIKLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9ImxlZnQiPls8YSBocmVmPSJcCi0iIiIKLQotaHRtbF9oZWFkZXJfM3IgPSAiIiIKLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9InJpZ2h0Ij5bPGEgaHJlZj0iXAotIiIiCi0KLWh0bWxfaGVhZGVyXzQgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPjx0ZCBjbGFzcz0icmlnaHQiPls8YSBocmVmPSJcCi0iIiIKLQotaHRtbF9oZWFkZXJfNXQgPSAiIiJcCi0iPlRPQzwvYT5dPC90ZD48L3RyPjwvdGFibGU+Ci08aDE+XAotIiIiCi0KLWh0bWxfaGVhZGVyXzVpID0gIiIiXAotIj5JbmRleDwvYT5dPC90ZD48L3RyPjwvdGFibGU+Ci08aDE+XAotIiIiCi0KLWh0bWxfaGVhZGVyXzYgPSAiIiJcCi0gQVBJIFJlZmVyZW5jZTwvaDE+Ci0iIiIKLQotCi0jIFRoZSBIVE1MIGZvb3RlciB1c2VkIGJ5IGFsbCBnZW5lcmF0ZWQgcGFnZXMuCi1odG1sX2Zvb3RlciA9ICIiIlwKLTwvYm9keT4KLTwvaHRtbD5cCi0iIiIKLQotIyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgdXNlZCBmb3IgZWFjaCBzZWN0aW9uLgotc2VjdGlvbl90aXRsZV9oZWFkZXIxID0gJzxoMSBpZD0iJwotc2VjdGlvbl90aXRsZV9oZWFkZXIyID0gJyI+Jwotc2VjdGlvbl90aXRsZV9mb290ZXIgPSAiPC9oMT4iCi0KLSMgVGhlIGhlYWRlciBhbmQgZm9vdGVyIHVzZWQgZm9yIGNvZGUgc2VnbWVudHMuCi1jb2RlX2hlYWRlciA9ICc8cHJlIGNsYXNzPSJjb2xvcmVkIj4nCi1jb2RlX2Zvb3RlciA9ICc8L3ByZT4nCi0KLSMgUGFyYWdyYXBoIGhlYWRlciBhbmQgZm9vdGVyLgotcGFyYV9oZWFkZXIgPSAiPHA+IgotcGFyYV9mb290ZXIgPSAiPC9wPiIKLQotIyBCbG9jayBoZWFkZXIgYW5kIGZvb3Rlci4KLWJsb2NrX2hlYWRlciAgICAgICAgPSAnPGRpdiBjbGFzcz0ic2VjdGlvbiI+JwotYmxvY2tfZm9vdGVyX3N0YXJ0ICA9ICIiIlwKLTxocj4KLTx0YWJsZSBjbGFzcz0iaW5kZXgtdG9jLWxpbmsiPjx0cj48dGQgY2xhc3M9ImxlZnQiPls8YSBocmVmPSJcCi0iIiIKLWJsb2NrX2Zvb3Rlcl9taWRkbGUgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPlwKLTx0ZCBjbGFzcz0ibWlkZGxlIj5bPGEgaHJlZj0iIyI+VG9wPC9hPl08L3RkPlwKLTx0ZCBjbGFzcz0icmlnaHQiPls8YSBocmVmPSJcCi0iIiIKLWJsb2NrX2Zvb3Rlcl9lbmQgICAgPSAiIiJcCi0iPlRPQzwvYT5dPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+Ci0iIiIKLQotIyBEZXNjcmlwdGlvbiBoZWFkZXIvZm9vdGVyLgotZGVzY3JpcHRpb25faGVhZGVyID0gIiIKLWRlc2NyaXB0aW9uX2Zvb3RlciA9ICIiCi0KLSMgTWFya2VyIGhlYWRlci9pbnRlci9mb290ZXIgY29tYmluYXRpb24uCi1tYXJrZXJfaGVhZGVyID0gIjxoND4iCi1tYXJrZXJfaW50ZXIgID0gIjwvaDQ+IgotbWFya2VyX2Zvb3RlciA9ICIiCi0KLSMgSGVhZGVyIGxvY2F0aW9uIGhlYWRlci9mb290ZXIuCi1oZWFkZXJfbG9jYXRpb25faGVhZGVyID0gIjxwPiIKLWhlYWRlcl9sb2NhdGlvbl9mb290ZXIgPSAiPC9wPiIKLQotIyBTb3VyY2UgY29kZSBleHRyYWN0cyBoZWFkZXIvZm9vdGVyLgotc291cmNlX2hlYWRlciA9ICI8cHJlPiIKLXNvdXJjZV9mb290ZXIgPSAiPC9wcmU+IgotCi0jIENoYXB0ZXIgaGVhZGVyL2ludGVyL2Zvb3Rlci4KLWNoYXB0ZXJfaGVhZGVyID0gIiIiXAotPGRpdiBjbGFzcz0ic2VjdGlvbiI+Ci08aDI+XAotIiIiCi1jaGFwdGVyX2ludGVyICA9ICc8L2gyPicKLWNoYXB0ZXJfZm9vdGVyID0gJzwvZGl2PicKLQotIyBJbmRleCBmb290ZXIuCi1pbmRleF9mb290ZXJfc3RhcnQgPSAiIiJcCi08aHI+Ci08dGFibGUgY2xhc3M9ImluZGV4LXRvYy1saW5rIj48dHI+PHRkIGNsYXNzPSJyaWdodCI+WzxhIGhyZWY9IlwKLSIiIgotaW5kZXhfZm9vdGVyX2VuZCA9ICIiIlwKLSI+VE9DPC9hPl08L3RkPjwvdHI+PC90YWJsZT4KLSIiIgotCi0jIFRPQyBmb290ZXIuCi10b2NfZm9vdGVyX3N0YXJ0ID0gIiIiXAotPGhyPgotPHRhYmxlIGNsYXNzPSJpbmRleC10b2MtbGluayI+PHRyPjx0ZCBjbGFzcz0ibGVmdCI+WzxhIGhyZWY9IlwKLSIiIgotdG9jX2Zvb3Rlcl9lbmQgPSAiIiJcCi0iPkluZGV4PC9hPl08L3RkPjwvdHI+PC90YWJsZT4KLSIiIgotCi0KLSMgU291cmNlIGxhbmd1YWdlIGtleXdvcmQgY29sb3JhdGlvbiBhbmQgc3R5bGluZy4KLWtleXdvcmRfcHJlZml4ID0gJzxzcGFuIGNsYXNzPSJrZXl3b3JkIj4nCi1rZXl3b3JkX3N1ZmZpeCA9ICc8L3NwYW4+JwotCi1zZWN0aW9uX3N5bm9wc2lzX2hlYWRlciA9ICc8aDI+U3lub3BzaXM8L2gyPicKLXNlY3Rpb25fc3lub3BzaXNfZm9vdGVyID0gJycKLQotCi0jIFRyYW5zbGF0ZSBhIHNpbmdsZSBsaW5lIG9mIHNvdXJjZSB0byBIVE1MLiAgVGhpcyBjb252ZXJ0cyBgPCcsIGA+JywgYW5kCi0jIGAmJyBpbnRvIGAmbHQ7JyxgJmd0OycsIGFuZCBgJmFtcDsnLgotIwotZGVmICBodG1sX3F1b3RlKCBsaW5lICk6Ci0gICAgcmVzdWx0ID0gc3RyaW5nLnJlcGxhY2UoIGxpbmUsICAgIiYiLCAiJmFtcDsiICkKLSAgICByZXN1bHQgPSBzdHJpbmcucmVwbGFjZSggcmVzdWx0LCAiPCIsICImbHQ7IiAgKQotICAgIHJlc3VsdCA9IHN0cmluZy5yZXBsYWNlKCByZXN1bHQsICI+IiwgIiZndDsiICApCi0gICAgcmV0dXJuIHJlc3VsdAotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjCi0jIyAgSFRNTCBGT1JNQVRURVIgQ0xBU1MKLSMjCi1jbGFzcyAgSHRtbEZvcm1hdHRlciggRm9ybWF0dGVyICk6Ci0KLSAgICBkZWYgIF9faW5pdF9fKCBzZWxmLCBwcm9jZXNzb3IsIHByb2plY3RfdGl0bGUsIGZpbGVfcHJlZml4ICk6Ci0gICAgICAgIEZvcm1hdHRlci5fX2luaXRfXyggc2VsZiwgcHJvY2Vzc29yICkKLQotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfMQotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfMgotICAgICAgICBnbG9iYWwgaHRtbF9oZWFkZXJfM2wsIGh0bWxfaGVhZGVyXzNyCi0gICAgICAgIGdsb2JhbCBodG1sX2hlYWRlcl80Ci0gICAgICAgIGdsb2JhbCBodG1sX2hlYWRlcl81dCwgaHRtbF9oZWFkZXJfNWkKLSAgICAgICAgZ2xvYmFsIGh0bWxfaGVhZGVyXzYKLSAgICAgICAgZ2xvYmFsIGh0bWxfZm9vdGVyCi0KLSAgICAgICAgaWYgZmlsZV9wcmVmaXg6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9IGZpbGVfcHJlZml4ICsgIi0iCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmaWxlX3ByZWZpeCA9ICIiCi0KLSAgICAgICAgc2VsZi5oZWFkZXJzICAgICAgID0gcHJvY2Vzc29yLmhlYWRlcnMKLSAgICAgICAgc2VsZi5wcm9qZWN0X3RpdGxlID0gcHJvamVjdF90aXRsZQotICAgICAgICBzZWxmLmZpbGVfcHJlZml4ICAgPSBmaWxlX3ByZWZpeAotICAgICAgICBzZWxmLmh0bWxfaGVhZGVyICAgPSAoCi0gICAgICAgICAgaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzNsICsgZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzQgKyBmaWxlX3ByZWZpeCArICJ0b2MuaHRtbCIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzV0ICsgcHJvamVjdF90aXRsZQotICAgICAgICAgICsgaHRtbF9oZWFkZXJfNiApCi0gICAgICAgIHNlbGYuaHRtbF9pbmRleF9oZWFkZXIgPSAoCi0gICAgICAgICAgaHRtbF9oZWFkZXJfMSArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzIKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzNyICsgZmlsZV9wcmVmaXggKyAidG9jLmh0bWwiCi0gICAgICAgICAgKyBodG1sX2hlYWRlcl81dCArIHByb2plY3RfdGl0bGUKLSAgICAgICAgICArIGh0bWxfaGVhZGVyXzYgKQotICAgICAgICBzZWxmLmh0bWxfdG9jX2hlYWRlciA9ICgKLSAgICAgICAgICBodG1sX2hlYWRlcl8xICsgcHJvamVjdF90aXRsZQotICAgICAgICAgICsgaHRtbF9oZWFkZXJfMgotICAgICAgICAgICsgaHRtbF9oZWFkZXJfM2wgKyBmaWxlX3ByZWZpeCArICJpbmRleC5odG1sIgotICAgICAgICAgICsgaHRtbF9oZWFkZXJfNWkgKyBwcm9qZWN0X3RpdGxlCi0gICAgICAgICAgKyBodG1sX2hlYWRlcl82ICkKLSAgICAgICAgc2VsZi5odG1sX2Zvb3RlciA9ICgKLSAgICAgICAgICAnPGRpdiBjbGFzcz0idGltZXN0YW1wIj5nZW5lcmF0ZWQgb24gJwotICAgICAgICAgICsgdGltZS5hc2N0aW1lKCB0aW1lLmxvY2FsdGltZSggdGltZS50aW1lKCkgKSApCi0gICAgICAgICAgKyAiPC9kaXY+IiArIGh0bWxfZm9vdGVyICkKLQotICAgICAgICBzZWxmLmNvbHVtbnMgPSAzCi0KLSAgICBkZWYgIG1ha2Vfc2VjdGlvbl91cmwoIHNlbGYsIHNlY3Rpb24gKToKLSAgICAgICAgcmV0dXJuIHNlbGYuZmlsZV9wcmVmaXggKyBzZWN0aW9uLm5hbWUgKyAiLmh0bWwiCi0KLSAgICBkZWYgIG1ha2VfYmxvY2tfdXJsKCBzZWxmLCBibG9jaywgbmFtZSA9IE5vbmUgKToKLSAgICAgICAgaWYgbmFtZSA9PSBOb25lOgotICAgICAgICAgICAgbmFtZSA9IGJsb2NrLm5hbWUKLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWN0aW9uX3VybCA9IHNlbGYubWFrZV9zZWN0aW9uX3VybCggYmxvY2suc2VjdGlvbiApCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICMgd2UgYWxyZWFkeSBoYXZlIGEgc2VjdGlvbgotICAgICAgICAgICAgc2VjdGlvbl91cmwgPSBzZWxmLm1ha2Vfc2VjdGlvbl91cmwoIGJsb2NrICkKLQotICAgICAgICByZXR1cm4gc2VjdGlvbl91cmwgKyAiIyIgKyBuYW1lCi0KLSAgICBkZWYgIG1ha2VfaHRtbF93b3JkKCBzZWxmLCB3b3JkICk6Ci0gICAgICAgICIiIkFuYWx5emUgYSBzaW1wbGUgd29yZCB0byBkZXRlY3QgY3Jvc3MtcmVmZXJlbmNlcyBhbmQgbWFya3VwLiIiIgotICAgICAgICAjIGhhbmRsZSBjcm9zcy1yZWZlcmVuY2VzCi0gICAgICAgIG0gPSByZV9jcm9zc3JlZi5tYXRjaCggd29yZCApCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoICduYW1lJyApCi0gICAgICAgICAgICAgICAgcmVzdCA9IG0uZ3JvdXAoICdyZXN0JyApCi0gICAgICAgICAgICAgICAgYmxvY2sgPSBzZWxmLmlkZW50aWZpZXJzW25hbWVdCi0gICAgICAgICAgICAgICAgdXJsICAgPSBzZWxmLm1ha2VfYmxvY2tfdXJsKCBibG9jayApCi0gICAgICAgICAgICAgICAgIyBkaXNwbGF5IGBmb29bYmFyXScgYXMgYGZvbycKLSAgICAgICAgICAgICAgICBuYW1lID0gcmUuc3ViKCByJ1xbLipcXScsICcnLCBuYW1lICkKLSAgICAgICAgICAgICAgICAjIG5vcm1hbGl6ZSB1cmwsIGZvbGxvd2luZyBSRkMgMzk4NgotICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJbIiwgIigiICkKLSAgICAgICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiXSIsICIpIiApCi0KLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICMgZm9yIHNlY3Rpb25zLCBkaXNwbGF5IHRpdGxlCi0gICAgICAgICAgICAgICAgICAgIHVybCA9ICggJyZsc3F1bzs8YSBocmVmPSInICsgdXJsICsgJyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYmxvY2sudGl0bGUgKyAnPC9hPiZyc3F1bzsnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXN0ICkKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9ICggJzxhIGhyZWY9IicgKyB1cmwgKyAnIj4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgJzwvYT4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXN0ICkKLQotICAgICAgICAgICAgICAgIHJldHVybiB1cmwKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAjIHdlIGRldGVjdGVkIGEgY3Jvc3MtcmVmZXJlbmNlIHRvIGFuIHVua25vd24gaXRlbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICJXQVJOSU5HOiB1bmRlZmluZWQgY3Jvc3MgcmVmZXJlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnIiArIG5hbWUgKyAiJy5cbiIgKQotICAgICAgICAgICAgICAgIHJldHVybiAnPycgKyBuYW1lICsgJz8nICsgcmVzdAotCi0gICAgICAgICMgaGFuZGxlIG1hcmt1cCBmb3IgaXRhbGljIGFuZCBib2xkCi0gICAgICAgIG0gPSByZV9pdGFsaWMubWF0Y2goIHdvcmQgKQotICAgICAgICBpZiBtOgotICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoIDEgKQotICAgICAgICAgICAgcmVzdCA9IG0uZ3JvdXAoIDIgKQotICAgICAgICAgICAgcmV0dXJuICc8aT4nICsgbmFtZSArICc8L2k+JyArIHJlc3QKLQotICAgICAgICBtID0gcmVfYm9sZC5tYXRjaCggd29yZCApCi0gICAgICAgIGlmIG06Ci0gICAgICAgICAgICBuYW1lID0gbS5ncm91cCggMSApCi0gICAgICAgICAgICByZXN0ID0gbS5ncm91cCggMiApCi0gICAgICAgICAgICByZXR1cm4gJzxiPicgKyBuYW1lICsgJzwvYj4nICsgcmVzdAotCi0gICAgICAgIHJldHVybiBodG1sX3F1b3RlKCB3b3JkICkKLQotICAgIGRlZiAgbWFrZV9odG1sX3BhcmEoIHNlbGYsIHdvcmRzICk6Ci0gICAgICAgICIiIkNvbnZlcnQgd29yZHMgb2YgYSBwYXJhZ3JhcGggaW50byB0YWdnZWQgSFRNTCB0ZXh0LiAgQWxzbyBoYW5kbGUKLSAgICAgICAgICAgY3Jvc3MgcmVmZXJlbmNlcy4iIiIKLSAgICAgICAgbGluZSA9ICIiCi0gICAgICAgIGlmIHdvcmRzOgotICAgICAgICAgICAgbGluZSA9IHNlbGYubWFrZV9odG1sX3dvcmQoIHdvcmRzWzBdICkKLSAgICAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzWzE6XToKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICIgIiArIHNlbGYubWFrZV9odG1sX3dvcmQoIHdvcmQgKQotICAgICAgICAgICAgIyBoYW5kbGUgaHlwZXJsaW5rcwotICAgICAgICAgICAgbGluZSA9IHJlX3VybC5zdWIoIHInPGEgaHJlZj0iXDEiPlwxPC9hPicsIGxpbmUgKQotICAgICAgICAgICAgIyBjb252ZXJ0IGAuLi4nIHF1b3RhdGlvbnMgaW50byByZWFsIGxlZnQgYW5kIHJpZ2h0IHNpbmdsZSBxdW90ZXMKLSAgICAgICAgICAgIGxpbmUgPSByZS5zdWIoIHIiKF58XFcpYCguKj8pJyhcV3wkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByJ1wxJmxzcXVvO1wyJnJzcXVvO1wzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKQotICAgICAgICAgICAgIyBjb252ZXJ0IHRpbGRlIGludG8gbm9uLWJyZWFrYWJsZSBzcGFjZQotICAgICAgICAgICAgbGluZSA9IHN0cmluZy5yZXBsYWNlKCBsaW5lLCAifiIsICImbmJzcDsiICkKLQotICAgICAgICByZXR1cm4gcGFyYV9oZWFkZXIgKyBsaW5lICsgcGFyYV9mb290ZXIKLQotICAgIGRlZiAgbWFrZV9odG1sX2NvZGUoIHNlbGYsIGxpbmVzICk6Ci0gICAgICAgICIiIkNvbnZlcnQgYSBjb2RlIHNlcXVlbmNlIHRvIEhUTUwuIiIiCi0gICAgICAgIGxpbmUgPSBjb2RlX2hlYWRlciArICdcbicKLSAgICAgICAgZm9yIGwgaW4gbGluZXM6Ci0gICAgICAgICAgICBsaW5lID0gbGluZSArIGh0bWxfcXVvdGUoIGwgKS5yc3RyaXAoKSArICdcbicKLQotICAgICAgICByZXR1cm4gbGluZSArIGNvZGVfZm9vdGVyCi0KLSAgICBkZWYgIG1ha2VfaHRtbF9pdGVtcyggc2VsZiwgaXRlbXMgKToKLSAgICAgICAgIiIiQ29udmVydCBhIGZpZWxkJ3MgY29udGVudCBpbnRvIEhUTUwuIiIiCi0gICAgICAgIGxpbmVzID0gW10KLSAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6Ci0gICAgICAgICAgICBpZiBpdGVtLmxpbmVzOgotICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCggc2VsZi5tYWtlX2h0bWxfY29kZSggaXRlbS5saW5lcyApICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCBzZWxmLm1ha2VfaHRtbF9wYXJhKCBpdGVtLndvcmRzICkgKQotCi0gICAgICAgIHJldHVybiBzdHJpbmcuam9pbiggbGluZXMsICdcbicgKQotCi0gICAgZGVmICBwcmludF9odG1sX2l0ZW1zKCBzZWxmLCBpdGVtcyApOgotICAgICAgICBwcmludCggc2VsZi5tYWtlX2h0bWxfaXRlbXMoIGl0ZW1zICkgKQotCi0gICAgZGVmICBwcmludF9odG1sX2ZpZWxkKCBzZWxmLCBmaWVsZCApOgotICAgICAgICBpZiBmaWVsZC5uYW1lOgotICAgICAgICAgICAgcHJpbnQoICc8dGFibGU+PHRyIHZhbGlnbj0idG9wIj48dGQ+PGI+JwotICAgICAgICAgICAgICAgICAgICsgZmllbGQubmFtZQotICAgICAgICAgICAgICAgICAgICsgIjwvYj48L3RkPjx0ZD4iICkKLQotICAgICAgICBwcmludCggc2VsZi5tYWtlX2h0bWxfaXRlbXMoIGZpZWxkLml0ZW1zICkgKQotCi0gICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICBwcmludCggIjwvdGQ+PC90cj48L3RhYmxlPiIgKQotCi0gICAgZGVmICBodG1sX3NvdXJjZV9xdW90ZSggc2VsZiwgbGluZSwgYmxvY2tfbmFtZSA9IE5vbmUgKToKLSAgICAgICAgcmVzdWx0ID0gIiIKLSAgICAgICAgd2hpbGUgbGluZToKLSAgICAgICAgICAgIG0gPSByZV9zb3VyY2VfY3Jvc3NyZWYubWF0Y2goIGxpbmUgKQotICAgICAgICAgICAgaWYgbToKLSAgICAgICAgICAgICAgICBuYW1lICAgPSBtLmdyb3VwKCAyICkKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBodG1sX3F1b3RlKCBtLmdyb3VwKCAxICkgKQotICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbiggbS5ncm91cCggMCApICkKLQotICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gYmxvY2tfbmFtZToKLSAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSBjdXJyZW50IGJsb2NrIG5hbWUsIGlmIGFueQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBwcmVmaXggKyAnPGI+JyArIG5hbWUgKyAnPC9iPicKLSAgICAgICAgICAgICAgICBlbGlmIHJlX3NvdXJjZV9rZXl3b3Jkcy5tYXRjaCggbmFtZSApOgotICAgICAgICAgICAgICAgICAgICAjIHRoaXMgaXMgYSBDIGtleXdvcmQKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgKyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtleXdvcmRfcHJlZml4ICsgbmFtZSArIGtleXdvcmRfc3VmZml4ICkKLSAgICAgICAgICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi5pZGVudGlmaWVyczoKLSAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGEga25vd24gaWRlbnRpZmllcgotICAgICAgICAgICAgICAgICAgICBibG9jayA9IHNlbGYuaWRlbnRpZmllcnNbbmFtZV0KLSAgICAgICAgICAgICAgICAgICAgaWQgPSBibG9jay5uYW1lCi0KLSAgICAgICAgICAgICAgICAgICAgIyBsaW5rIHRvIGEgZmllbGQgSUQgaWYgcG9zc2libGUKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgIGZvciBtYXJrdXAgaW4gYmxvY2subWFya3VwczoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAndmFsdWVzJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWVsZCBpbiBtYXJrdXAuZmllbGRzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbmFtZQotCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgKyBwcmVmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VsZi5tYWtlX2Jsb2NrX3VybCggYmxvY2ssIGlkICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJyI+JyArIG5hbWUgKyAnPC9hPicgKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgIyBzZWN0aW9ucyBkb24ndCBoYXZlIGBtYXJrdXBzJzsgaG93ZXZlciwgd2UgZG9uJ3QKLSAgICAgICAgICAgICAgICAgICAgICAjIHdhbnQgcmVmZXJlbmNlcyB0byBzZWN0aW9ucyBoZXJlIGFueXdheQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGh0bWxfcXVvdGUoIGxpbmVbOmxlbmd0aF0gKQotCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgaHRtbF9xdW90ZSggbGluZVs6bGVuZ3RoXSApCi0KLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtsZW5ndGg6XQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBodG1sX3F1b3RlKCBsaW5lICkKLSAgICAgICAgICAgICAgICBsaW5lICAgPSBbXQotCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIGRlZiAgcHJpbnRfaHRtbF9maWVsZF9saXN0KCBzZWxmLCBmaWVsZHMgKToKLSAgICAgICAgcHJpbnQoICc8dGFibGUgY2xhc3M9ImZpZWxkcyI+JyApCi0gICAgICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6Ci0gICAgICAgICAgICBwcmludCggJzx0cj48dGQgY2xhc3M9InZhbCIgaWQ9IicgKyBmaWVsZC5uYW1lICsgJyI+JwotICAgICAgICAgICAgICAgICAgICsgZmllbGQubmFtZQotICAgICAgICAgICAgICAgICAgICsgJzwvdGQ+PHRkIGNsYXNzPSJkZXNjIj4nICkKLSAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotICAgICAgICAgICAgcHJpbnQoICI8L3RkPjwvdHI+IiApCi0gICAgICAgIHByaW50KCAiPC90YWJsZT4iICkKLQotICAgIGRlZiAgcHJpbnRfaHRtbF9tYXJrdXAoIHNlbGYsIG1hcmt1cCApOgotICAgICAgICB0YWJsZV9maWVsZHMgPSBbXQotICAgICAgICBmb3IgZmllbGQgaW4gbWFya3VwLmZpZWxkczoKLSAgICAgICAgICAgIGlmIGZpZWxkLm5hbWU6Ci0gICAgICAgICAgICAgICAgIyBXZSBiZWdpbiBhIG5ldyBzZXJpZXMgb2YgZmllbGQgb3IgdmFsdWUgZGVmaW5pdGlvbnMuICBXZQotICAgICAgICAgICAgICAgICMgcmVjb3JkIHRoZW0gaW4gdGhlIGB0YWJsZV9maWVsZHMnIGxpc3QgYmVmb3JlIG91dHB1dHRpbmcKLSAgICAgICAgICAgICAgICAjIGFsbCBvZiB0aGVtIGFzIGEgc2luZ2xlIHRhYmxlLgotICAgICAgICAgICAgICAgIHRhYmxlX2ZpZWxkcy5hcHBlbmQoIGZpZWxkICkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgdGFibGVfZmllbGRzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2h0bWxfZmllbGRfbGlzdCggdGFibGVfZmllbGRzICkKLSAgICAgICAgICAgICAgICAgICAgdGFibGVfZmllbGRzID0gW10KLQotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9pdGVtcyggZmllbGQuaXRlbXMgKQotCi0gICAgICAgIGlmIHRhYmxlX2ZpZWxkczoKLSAgICAgICAgICAgIHNlbGYucHJpbnRfaHRtbF9maWVsZF9saXN0KCB0YWJsZV9maWVsZHMgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgaW5kZXgKLSAgICAjCi0gICAgZGVmICBpbmRleF9lbnRlciggc2VsZiApOgotICAgICAgICBwcmludCggc2VsZi5odG1sX2luZGV4X2hlYWRlciApCi0gICAgICAgIHNlbGYuaW5kZXhfaXRlbXMgPSB7fQotCi0gICAgZGVmICBpbmRleF9uYW1lX2VudGVyKCBzZWxmLCBuYW1lICk6Ci0gICAgICAgIGJsb2NrID0gc2VsZi5pZGVudGlmaWVyc1tuYW1lXQotICAgICAgICB1cmwgICA9IHNlbGYubWFrZV9ibG9ja191cmwoIGJsb2NrICkKLSAgICAgICAgc2VsZi5pbmRleF9pdGVtc1tuYW1lXSA9IHVybAotCi0gICAgZGVmICBpbmRleF9leGl0KCBzZWxmICk6Ci0gICAgICAgICMgYGJsb2NrX2luZGV4JyBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzb3J0ZWQgbGlzdCBvZiBpbmRleCBuYW1lcwotICAgICAgICBjb3VudCA9IGxlbiggc2VsZi5ibG9ja19pbmRleCApCi0gICAgICAgIHJvd3MgID0gKCBjb3VudCArIHNlbGYuY29sdW1ucyAtIDEgKSAvLyBzZWxmLmNvbHVtbnMKLQotICAgICAgICBwcmludCggJzx0YWJsZSBjbGFzcz0iaW5kZXgiPicgKQotICAgICAgICBmb3IgciBpbiByYW5nZSggcm93cyApOgotICAgICAgICAgICAgbGluZSA9ICI8dHI+IgotICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoIHNlbGYuY29sdW1ucyApOgotICAgICAgICAgICAgICAgIGkgPSByICsgYyAqIHJvd3MKLSAgICAgICAgICAgICAgICBpZiBpIDwgY291bnQ6Ci0gICAgICAgICAgICAgICAgICAgIGJuYW1lID0gc2VsZi5ibG9ja19pbmRleFtyICsgYyAqIHJvd3NdCi0gICAgICAgICAgICAgICAgICAgIHVybCAgID0gc2VsZi5pbmRleF9pdGVtc1tibmFtZV0KLSAgICAgICAgICAgICAgICAgICAgIyBkaXNwbGF5IGBmb29bYmFyXScgYXMgYGZvbyAoYmFyKScKLSAgICAgICAgICAgICAgICAgICAgYm5hbWUgPSBzdHJpbmcucmVwbGFjZSggYm5hbWUsICJbIiwgIiAoIiApCi0gICAgICAgICAgICAgICAgICAgIGJuYW1lID0gc3RyaW5nLnJlcGxhY2UoIGJuYW1lLCAiXSIsICIpIiAgKQotICAgICAgICAgICAgICAgICAgICAjIG5vcm1hbGl6ZSB1cmwsIGZvbGxvd2luZyBSRkMgMzk4NgotICAgICAgICAgICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiWyIsICIoIiApCi0gICAgICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJdIiwgIikiICkKLSAgICAgICAgICAgICAgICAgICAgbGluZSAgPSAoIGxpbmUgKyAnPHRkPjxhIGhyZWY9IicgKyB1cmwgKyAnIj4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJuYW1lICsgJzwvYT48L3RkPicgKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJzx0ZD48L3RkPicKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgIjwvdHI+IgotICAgICAgICAgICAgcHJpbnQoIGxpbmUgKQotCi0gICAgICAgIHByaW50KCAiPC90YWJsZT4iICkKLQotICAgICAgICBwcmludCggaW5kZXhfZm9vdGVyX3N0YXJ0Ci0gICAgICAgICAgICAgICArIHNlbGYuZmlsZV9wcmVmaXggKyAidG9jLmh0bWwiCi0gICAgICAgICAgICAgICArIGluZGV4X2Zvb3Rlcl9lbmQgKQotCi0gICAgICAgIHByaW50KCBzZWxmLmh0bWxfZm9vdGVyICkKLQotICAgICAgICBzZWxmLmluZGV4X2l0ZW1zID0ge30KLQotICAgIGRlZiAgaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgPSBOb25lICk6Ci0gICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICBpbmRleF9maWxlbmFtZSA9IHNlbGYuZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLQotICAgICAgICBGb3JtYXR0ZXIuaW5kZXhfZHVtcCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyB0aGUgdGFibGUgb2YgY29udGVudHMKLSAgICAjCi0gICAgZGVmICB0b2NfZW50ZXIoIHNlbGYgKToKLSAgICAgICAgcHJpbnQoIHNlbGYuaHRtbF90b2NfaGVhZGVyICkKLSAgICAgICAgcHJpbnQoICI8aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPiIgKQotCi0gICAgZGVmICB0b2NfY2hhcHRlcl9lbnRlciggc2VsZiwgY2hhcHRlciApOgotICAgICAgICBwcmludCggY2hhcHRlcl9oZWFkZXIgKyBzdHJpbmcuam9pbiggY2hhcHRlci50aXRsZSApICsgY2hhcHRlcl9pbnRlciApCi0gICAgICAgIHByaW50KCAnPHRhYmxlIGNsYXNzPSJ0b2MiPicgKQotCi0gICAgZGVmICB0b2Nfc2VjdGlvbl9lbnRlciggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwcmludCggJzx0cj48dGQgY2xhc3M9ImxpbmsiPicKLSAgICAgICAgICAgICAgICsgJzxhIGhyZWY9IicgKyBzZWxmLm1ha2Vfc2VjdGlvbl91cmwoIHNlY3Rpb24gKSArICciPicKLSAgICAgICAgICAgICAgICsgc2VjdGlvbi50aXRsZSArICc8L2E+PC90ZD48dGQgY2xhc3M9ImRlc2MiPicgKQotICAgICAgICBwcmludCggc2VsZi5tYWtlX2h0bWxfcGFyYSggc2VjdGlvbi5hYnN0cmFjdCApICkKLQotICAgIGRlZiAgdG9jX3NlY3Rpb25fZXhpdCggc2VsZiwgc2VjdGlvbiApOgotICAgICAgICBwcmludCggIjwvdGQ+PC90cj4iICkKLQotICAgIGRlZiAgdG9jX2NoYXB0ZXJfZXhpdCggc2VsZiwgY2hhcHRlciApOgotICAgICAgICBwcmludCggIjwvdGFibGU+IiApCi0gICAgICAgIHByaW50KCBjaGFwdGVyX2Zvb3RlciApCi0KLSAgICBkZWYgIHRvY19pbmRleCggc2VsZiwgaW5kZXhfZmlsZW5hbWUgKToKLSAgICAgICAgcHJpbnQoIGNoYXB0ZXJfaGVhZGVyCi0gICAgICAgICAgICAgICArICc8YSBocmVmPSInICsgaW5kZXhfZmlsZW5hbWUgKyAnIj5HbG9iYWwgSW5kZXg8L2E+JwotICAgICAgICAgICAgICAgKyBjaGFwdGVyX2ludGVyICsgY2hhcHRlcl9mb290ZXIgKQotCi0gICAgZGVmICB0b2NfZXhpdCggc2VsZiApOgotICAgICAgICBwcmludCggdG9jX2Zvb3Rlcl9zdGFydAotICAgICAgICAgICAgICAgKyBzZWxmLmZpbGVfcHJlZml4ICsgImluZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICArIHRvY19mb290ZXJfZW5kICkKLQotICAgICAgICBwcmludCggc2VsZi5odG1sX2Zvb3RlciApCi0KLSAgICBkZWYgIHRvY19kdW1wKCBzZWxmLCB0b2NfZmlsZW5hbWUgPSBOb25lLCBpbmRleF9maWxlbmFtZSA9IE5vbmUgKToKLSAgICAgICAgaWYgdG9jX2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICB0b2NfZmlsZW5hbWUgPSBzZWxmLmZpbGVfcHJlZml4ICsgInRvYy5odG1sIgotCi0gICAgICAgIGlmIGluZGV4X2ZpbGVuYW1lID09IE5vbmU6Ci0gICAgICAgICAgICBpbmRleF9maWxlbmFtZSA9IHNlbGYuZmlsZV9wcmVmaXggKyAiaW5kZXguaHRtbCIKLQotICAgICAgICBGb3JtYXR0ZXIudG9jX2R1bXAoIHNlbGYsIHRvY19maWxlbmFtZSwgaW5kZXhfZmlsZW5hbWUgKQotCi0gICAgIwotICAgICMgZm9ybWF0dGluZyBzZWN0aW9ucwotICAgICMKLSAgICBkZWYgIHNlY3Rpb25fZW50ZXIoIHNlbGYsIHNlY3Rpb24gKToKLSAgICAgICAgcHJpbnQoIHNlbGYuaHRtbF9oZWFkZXIgKQotCi0gICAgICAgIHByaW50KCBzZWN0aW9uX3RpdGxlX2hlYWRlcjEgKyBzZWN0aW9uLm5hbWUgKyBzZWN0aW9uX3RpdGxlX2hlYWRlcjIKLSAgICAgICAgICAgICAgICsgc2VjdGlvbi50aXRsZQotICAgICAgICAgICAgICAgKyBzZWN0aW9uX3RpdGxlX2Zvb3RlciApCi0KLSAgICAgICAgbWF4d2lkdGggPSAwCi0gICAgICAgIGZvciBiIGluIHNlY3Rpb24uYmxvY2tzLnZhbHVlcygpOgotICAgICAgICAgICAgaWYgbGVuKCBiLm5hbWUgKSA+IG1heHdpZHRoOgotICAgICAgICAgICAgICAgIG1heHdpZHRoID0gbGVuKCBiLm5hbWUgKQotCi0gICAgICAgIHdpZHRoID0gNzAgICMgWFhYIG1hZ2ljIG51bWJlcgotICAgICAgICBpZiBtYXh3aWR0aCA+IDA6Ci0gICAgICAgICAgICAjIHByaW50IHNlY3Rpb24gc3lub3BzaXMKLSAgICAgICAgICAgIHByaW50KCBzZWN0aW9uX3N5bm9wc2lzX2hlYWRlciApCi0gICAgICAgICAgICBwcmludCggJzx0YWJsZSBjbGFzcz0ic3lub3BzaXMiPicgKQotCi0gICAgICAgICAgICBjb2x1bW5zID0gd2lkdGggLy8gbWF4d2lkdGgKLSAgICAgICAgICAgIGlmIGNvbHVtbnMgPCAxOgotICAgICAgICAgICAgICAgIGNvbHVtbnMgPSAxCi0KLSAgICAgICAgICAgIGNvdW50ID0gbGVuKCBzZWN0aW9uLmJsb2NrX25hbWVzICkKLSAgICAgICAgICAgICMgZG9uJ3QgaGFuZGxlIGxhc3QgZW50cnkgaWYgaXQgaXMgZW1wdHkKLSAgICAgICAgICAgIGlmIHNlY3Rpb24uYmxvY2tfbmFtZXNbLTFdID09ICIvZW1wdHkvIjoKLSAgICAgICAgICAgICAgICBjb3VudCAtPSAxCi0gICAgICAgICAgICByb3dzICA9ICggY291bnQgKyBjb2x1bW5zIC0gMSApIC8vIGNvbHVtbnMKLQotICAgICAgICAgICAgZm9yIHIgaW4gcmFuZ2UoIHJvd3MgKToKLSAgICAgICAgICAgICAgICBsaW5lID0gIjx0cj4iCi0gICAgICAgICAgICAgICAgZm9yIGMgaW4gcmFuZ2UoIGNvbHVtbnMgKToKLSAgICAgICAgICAgICAgICAgICAgaSA9IHIgKyBjICogcm93cwotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICc8dGQ+JwotICAgICAgICAgICAgICAgICAgICBpZiBpIDwgY291bnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VjdGlvbi5ibG9ja19uYW1lc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAiL2VtcHR5LyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCBjYW4gaGFwcGVuIHRoYXQgYSBjb21wbGV0ZSByb3cgaXMgZW1wdHksIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2l0aG91dCBhIHByb3BlciBgZmlsbGVyJyB0aGUgYnJvd3NlciBtaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29sbGFwc2UgdGhlIHJvdyB0byBhIG11Y2ggc21hbGxlciBoZWlnaHQgKG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBldmVuIG9taXQgaXQgY29tcGxldGVseSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICImbmJzcDsiCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc3BsYXkgYGZvb1tiYXJdJyBhcyBgZm9vJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSByZS5zdWIoIHInXFsuKlxdJywgJycsIG5hbWUgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9ybWFsaXplIHVybCwgZm9sbG93aW5nIFJGQyAzOTg2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gc3RyaW5nLnJlcGxhY2UoIHVybCwgIlsiLCAiKCIgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHN0cmluZy5yZXBsYWNlKCB1cmwsICJdIiwgIikiICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gKCBsaW5lICsgJzxhIGhyZWY9IiMnICsgdXJsICsgJyI+JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICc8L2E+JyApCi0KLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnPC90ZD4nCi0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAiPC90cj4iCi0gICAgICAgICAgICAgICAgcHJpbnQoIGxpbmUgKQotCi0gICAgICAgICAgICBwcmludCggIjwvdGFibGU+IiApCi0gICAgICAgICAgICBwcmludCggc2VjdGlvbl9zeW5vcHNpc19mb290ZXIgKQotCi0gICAgICAgIHByaW50KCBkZXNjcmlwdGlvbl9oZWFkZXIgKQotICAgICAgICBwcmludCggc2VsZi5tYWtlX2h0bWxfaXRlbXMoIHNlY3Rpb24uZGVzY3JpcHRpb24gKSApCi0gICAgICAgIHByaW50KCBkZXNjcmlwdGlvbl9mb290ZXIgKQotCi0gICAgZGVmICBibG9ja19lbnRlciggc2VsZiwgYmxvY2sgKToKLSAgICAgICAgcHJpbnQoIGJsb2NrX2hlYWRlciApCi0KLSAgICAgICAgIyBwbGFjZSBodG1sIGFuY2hvciBpZiBuZWVkZWQKLSAgICAgICAgaWYgYmxvY2submFtZToKLSAgICAgICAgICAgIHVybCA9IGJsb2NrLm5hbWUKLSAgICAgICAgICAgICMgZGlzcGxheSBgZm9vW2Jhcl0nIGFzIGBmb28nCi0gICAgICAgICAgICBuYW1lID0gcmUuc3ViKCByJ1xbLipcXScsICcnLCBibG9jay5uYW1lICkKLSAgICAgICAgICAgICMgbm9ybWFsaXplIHVybCwgZm9sbG93aW5nIFJGQyAzOTg2Ci0gICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiWyIsICIoIiApCi0gICAgICAgICAgICB1cmwgPSBzdHJpbmcucmVwbGFjZSggdXJsLCAiXSIsICIpIiApCi0gICAgICAgICAgICBwcmludCggJzxoMyBpZD0iJyArIHVybCArICciPicgKyBuYW1lICsgJzwvaDM+JyApCi0KLSAgICAgICAgIyBkdW1wIHRoZSBibG9jayBDIHNvdXJjZSBsaW5lcyBub3cKLSAgICAgICAgaWYgYmxvY2suY29kZToKLSAgICAgICAgICAgIGhlYWRlciA9ICcnCi0gICAgICAgICAgICBmb3IgZiBpbiBzZWxmLmhlYWRlcnMua2V5cygpOgotICAgICAgICAgICAgICAgIGlmIGJsb2NrLnNvdXJjZS5maWxlbmFtZS5maW5kKCBmICkgPj0gMDoKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gc2VsZi5oZWFkZXJzW2ZdICsgJyAoJyArIGYgKyAnKScKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLQotIyAgICAgICAgICAgaWYgbm90IGhlYWRlcjoKLSMgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAotIyAgICAgICAgICAgICAgICAgIldBUk5JTkc6IE5vIGhlYWRlciBtYWNybyBmb3IiCi0jICAgICAgICAgICAgICAgICArICIgJyIgKyBibG9jay5zb3VyY2UuZmlsZW5hbWUgKyAiJy5cbiIgKQotCi0gICAgICAgICAgICBpZiBoZWFkZXI6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIGhlYWRlcl9sb2NhdGlvbl9oZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgKyAnRGVmaW5lZCBpbiAnICsgaGVhZGVyICsgJy4nCi0gICAgICAgICAgICAgICAgICAgICAgICsgaGVhZGVyX2xvY2F0aW9uX2Zvb3RlciApCi0KLSAgICAgICAgICAgIHByaW50KCBzb3VyY2VfaGVhZGVyICkKLSAgICAgICAgICAgIGZvciBsIGluIGJsb2NrLmNvZGU6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIHNlbGYuaHRtbF9zb3VyY2VfcXVvdGUoIGwsIGJsb2NrLm5hbWUgKSApCi0gICAgICAgICAgICBwcmludCggc291cmNlX2Zvb3RlciApCi0KLSAgICBkZWYgIG1hcmt1cF9lbnRlciggc2VsZiwgbWFya3VwLCBibG9jayApOgotICAgICAgICBpZiBtYXJrdXAudGFnID09ICJkZXNjcmlwdGlvbiI6Ci0gICAgICAgICAgICBwcmludCggZGVzY3JpcHRpb25faGVhZGVyICkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCBtYXJrZXJfaGVhZGVyICsgbWFya3VwLnRhZyArIG1hcmtlcl9pbnRlciApCi0KLSAgICAgICAgc2VsZi5wcmludF9odG1sX21hcmt1cCggbWFya3VwICkKLQotICAgIGRlZiAgbWFya3VwX2V4aXQoIHNlbGYsIG1hcmt1cCwgYmxvY2sgKToKLSAgICAgICAgaWYgbWFya3VwLnRhZyA9PSAiZGVzY3JpcHRpb24iOgotICAgICAgICAgICAgcHJpbnQoIGRlc2NyaXB0aW9uX2Zvb3RlciApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCggbWFya2VyX2Zvb3RlciApCi0KLSAgICBkZWYgIGJsb2NrX2V4aXQoIHNlbGYsIGJsb2NrICk6Ci0gICAgICAgIHByaW50KCBibG9ja19mb290ZXJfc3RhcnQgKyBzZWxmLmZpbGVfcHJlZml4ICsgImluZGV4Lmh0bWwiCi0gICAgICAgICAgICAgICArIGJsb2NrX2Zvb3Rlcl9taWRkbGUgKyBzZWxmLmZpbGVfcHJlZml4ICsgInRvYy5odG1sIgotICAgICAgICAgICAgICAgKyBibG9ja19mb290ZXJfZW5kICkKLQotICAgIGRlZiAgc2VjdGlvbl9leGl0KCBzZWxmLCBzZWN0aW9uICk6Ci0gICAgICAgIHByaW50KCBodG1sX2Zvb3RlciApCi0KLSAgICBkZWYgIHNlY3Rpb25fZHVtcF9hbGwoIHNlbGYgKToKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9uczoKLSAgICAgICAgICAgIHNlbGYuc2VjdGlvbl9kdW1wKCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZV9wcmVmaXggKyBzZWN0aW9uLm5hbWUgKyAnLmh0bWwnICkKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9kb2NtYWtlci91dGlscy5weSBiL3NyYy90b29scy9kb2NtYWtlci91dGlscy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwZjE2Ny4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZG9jbWFrZXIvdXRpbHMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIwotIyAgdXRpbHMucHkKLSMKLSMgICAgQXV4aWxpYXJ5IGZ1bmN0aW9ucyBmb3IgdGhlIGBkb2NtYWtlcicgdG9vbCAobGlicmFyeSBmaWxlKS4KLSMKLSMgIENvcHlyaWdodCAyMDAyLTIwMTggYnkKLSMgIERhdmlkIFR1cm5lci4KLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLSMgIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0jICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLSMgIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotIyAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLWltcG9ydCBzdHJpbmcsIHN5cywgb3MsIGdsb2IsIGl0ZXJ0b29scwotCi0KLSMgY3VycmVudCBvdXRwdXQgZGlyZWN0b3J5Ci0jCi1vdXRwdXRfZGlyID0gTm9uZQotCi0KLSMgQSBmdW5jdGlvbiB0aGF0IGdlbmVyYXRlcyBhIHNvcnRpbmcga2V5LiAgV2Ugd2FudCBsZXhpY29ncmFwaGljYWwgb3JkZXIKLSMgKHByaW1hcnkga2V5KSBleGNlcHQgdGhhdCBjYXBpdGFsIGxldHRlcnMgYXJlIHNvcnRlZCBiZWZvcmUgbG93ZXJjYXNlCi0jIG9uZXMgKHNlY29uZGFyeSBrZXkpLgotIwotIyBUaGUgcHJpbWFyeSBrZXkgaXMgaW1wbGVtZW50ZWQgYnkgbG93ZXJjYXNpbmcgdGhlIGlucHV0LiAgVGhlIHNlY29uZGFyeQotIyBrZXkgaXMgc2ltcGx5IHRoZSBvcmlnaW5hbCBkYXRhIGFwcGVuZGVkLCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgRm9yCi0jIGV4YW1wbGUsIHRoZSBzb3J0IGtleSBmb3IgYEZUX3gnIGlzIGBmRnRUX194eCcsIHdoaWxlIHRoZSBzb3J0IGtleSBmb3IKLSMgYGZ0X1gnIGlzIGBmZnR0X194WCcuICBTaW5jZSBBU0NJSSBjb2RlcyBvZiB1cHBlcmNhc2UgbGV0dGVycyBhcmUKLSMgbnVtZXJpY2FsbHkgc21hbGxlciB0aGFuIHRoZSBjb2RlcyBvZiBsb3dlcmNhc2UgbGV0dGVycywgYGZGdFRfX3h4JyBnZXRzCi0jIHNvcnRlZCBiZWZvcmUgYGZmdHRfX3hYJy4KLSMKLWRlZiAgaW5kZXhfa2V5KCBzICk6Ci0gICAgcmV0dXJuIHN0cmluZy5qb2luKCBpdGVydG9vbHMuY2hhaW4oICp6aXAoIHMubG93ZXIoKSwgcyApICkgKQotCi0KLSMgU29ydCBgaW5wdXRfbGlzdCcsIHBsYWNpbmcgdGhlIGVsZW1lbnRzIG9mIGBvcmRlcl9saXN0JyBpbiBmcm9udC4KLSMKLWRlZiAgc29ydF9vcmRlcl9saXN0KCBpbnB1dF9saXN0LCBvcmRlcl9saXN0ICk6Ci0gICAgbmV3X2xpc3QgPSBvcmRlcl9saXN0WzpdCi0gICAgZm9yIGlkIGluIGlucHV0X2xpc3Q6Ci0gICAgICAgIGlmIG5vdCBpZCBpbiBvcmRlcl9saXN0OgotICAgICAgICAgICAgbmV3X2xpc3QuYXBwZW5kKCBpZCApCi0gICAgcmV0dXJuIG5ld19saXN0Ci0KLQotIyBEaXZlcnQgc3RhbmRhcmQgb3V0cHV0IHRvIGEgZ2l2ZW4gcHJvamVjdCBkb2N1bWVudGF0aW9uIGZpbGUuICBVc2UKLSMgYG91dHB1dF9kaXInIHRvIGRldGVybWluZSB0aGUgZmlsZW5hbWUgbG9jYXRpb24gaWYgbmVjZXNzYXJ5IGFuZCBzYXZlIHRoZQotIyBvbGQgc3Rkb3V0IGhhbmRsZSBpbiBhIHR1cGxlIHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbi4KLSMKLWRlZiAgb3Blbl9vdXRwdXQoIGZpbGVuYW1lICk6Ci0gICAgZ2xvYmFsIG91dHB1dF9kaXIKLQotICAgIGlmIG91dHB1dF9kaXIgYW5kIG91dHB1dF9kaXIgIT0gIiI6Ci0gICAgICAgIGZpbGVuYW1lID0gb3V0cHV0X2RpciArIG9zLnNlcCArIGZpbGVuYW1lCi0KLSAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIG5ld19maWxlICAgPSBvcGVuKCBmaWxlbmFtZSwgInciICkKLSAgICBzeXMuc3Rkb3V0ID0gbmV3X2ZpbGUKLQotICAgIHJldHVybiAoIG5ld19maWxlLCBvbGRfc3Rkb3V0ICkKLQotCi0jIENsb3NlIHRoZSBvdXRwdXQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYG9wZW5fb3V0cHV0Jy4KLSMKLWRlZiAgY2xvc2Vfb3V0cHV0KCBvdXRwdXQgKToKLSAgICBvdXRwdXRbMF0uY2xvc2UoKQotICAgIHN5cy5zdGRvdXQgPSBvdXRwdXRbMV0KLQotCi0jIENoZWNrIG91dHB1dCBkaXJlY3RvcnkuCi0jCi1kZWYgIGNoZWNrX291dHB1dCgpOgotICAgIGdsb2JhbCBvdXRwdXRfZGlyCi0gICAgaWYgb3V0cHV0X2RpcjoKLSAgICAgICAgaWYgb3V0cHV0X2RpciAhPSAiIjoKLSAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKCBvdXRwdXRfZGlyICk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggImFyZ3VtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnIiArIG91dHB1dF9kaXIgKyAiJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5XG4iICkKLSAgICAgICAgICAgICAgICBzeXMuZXhpdCggMiApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBvdXRwdXRfZGlyID0gTm9uZQotCi0KLWRlZiAgZmlsZV9leGlzdHMoIHBhdGhuYW1lICk6Ci0gICAgIiIiQ2hlY2sgdGhhdCBhIGdpdmVuIGZpbGUgZXhpc3RzLiIiIgotICAgIHJlc3VsdCA9IDEKLSAgICB0cnk6Ci0gICAgICAgIGZpbGUgPSBvcGVuKCBwYXRobmFtZSwgInIiICkKLSAgICAgICAgZmlsZS5jbG9zZSgpCi0gICAgZXhjZXB0OgotICAgICAgICByZXN1bHQgPSBOb25lCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIHBhdGhuYW1lICsgIiBjb3VsZG4ndCBiZSBhY2Nlc3NlZFxuIiApCi0KLSAgICByZXR1cm4gcmVzdWx0Ci0KLQotZGVmICBtYWtlX2ZpbGVfbGlzdCggYXJncyA9IE5vbmUgKToKLSAgICAiIiJCdWlsZCBhIGxpc3Qgb2YgaW5wdXQgZmlsZXMgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiIiIgotICAgIGZpbGVfbGlzdCA9IFtdCi0gICAgIyBzeXMuc3RkZXJyLndyaXRlKCByZXByKCBzeXMuYXJndlsxIDpdICkgKyAnXG4nICkKLQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCi0KLSAgICBmb3IgcGF0aG5hbWUgaW4gYXJnczoKLSAgICAgICAgaWYgc3RyaW5nLmZpbmQoIHBhdGhuYW1lLCAnKicgKSA+PSAwOgotICAgICAgICAgICAgbmV3cGF0aCA9IGdsb2IuZ2xvYiggcGF0aG5hbWUgKQotICAgICAgICAgICAgbmV3cGF0aC5zb3J0KCkgICMgc29ydCBmaWxlcyAtLSB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiB0aGUgb3JkZXIgb2YgZmlsZXMKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5ld3BhdGggPSBbcGF0aG5hbWVdCi0KLSAgICAgICAgZmlsZV9saXN0LmV4dGVuZCggbmV3cGF0aCApCi0KLSAgICBpZiBsZW4oIGZpbGVfbGlzdCApID09IDA6Ci0gICAgICAgIGZpbGVfbGlzdCA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICAjIG5vdyBmaWx0ZXIgdGhlIGZpbGUgbGlzdCB0byByZW1vdmUgbm9uLWV4aXN0aW5nIG9uZXMKLSAgICAgICAgZmlsZV9saXN0ID0gZmlsdGVyKCBmaWxlX2V4aXN0cywgZmlsZV9saXN0ICkKLQotICAgIHJldHVybiBmaWxlX2xpc3QKLQotIyBlb2YKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9SRUFETUUgYi9zcmMvdG9vbHMvZnRmdXp6ZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ4ZTlmLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdGZ1enplci9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1mdGZ1enplcgotPT09PT09PT0KLQotCi1mdGZ1enplci5jYwotLS0tLS0tLS0tLS0KLQotVGhpcyBmaWxlIGNvbnRhaW5zIGEgdGFyZ2V0IGZ1bmN0aW9uICBmb3IgRnJlZVR5cGUgZnV6emluZy4gIEl0IGNhbiBiZQotdXNlZCAgIHdpdGggICAgbGliRnV6emVyICAgKGh0dHBzOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbCkgICBvcgotcG90ZW50aWFsbHkgYW55IG90aGVyIHNpbWlsYXIgZnV6emVyLgotCi1Vc2FnZToKLQotICAxLiBCdWlsZCAgYGxpYmZyZWV0eXBlLmEnIGFuZCAgYGZ0ZnV6emVyLmNjJyB1c2luZyAgdGhlIG1vc3QgIHJlY2VudAotICAgICBjbGFuZyBjb21waWxlciB3aXRoIHRoZXNlIGZsYWdzOgotCi0gICAgICAgIyBmb3IgZnV6emVyIGNvdmVyYWdlIGZlZWRiYWNrCi0gICAgICAgLWZzYW5pdGl6ZS1jb3ZlcmFnZT1lZGdlLDhiaXQtY291bnRlcnMKLSAgICAgICAjIGZvciBidWcgY2hlY2tpbmcKLSAgICAgICAtZnNhbml0aXplPWFkZHJlc3Msc2lnbmVkLWludGVnZXItb3ZlcmZsb3csc2hpZnQKLQotICAgICBZb3UgIGFsc28gbmVlZCAgdGhlIGhlYWRlciAgZmlsZXMgZnJvbSAgdGhlIGBsaWJhcmNoaXZlJyAgbGlicmFyeQotICAgICAoaHR0cHM6Ly93d3cubGliYXJjaGl2ZS5vcmcvKSAgZm9yIGhhbmRsaW5nICB0YXIgZmlsZXMgIChzZWUgZmlsZQotICAgICBgZnRtdXRhdG9yLmNjJyBiZWxvdyBmb3IgbW9yZSkuCi0KLSAgMi4gTGluayB3aXRoIGBsaWJGdXp6ZXInIChpdCBjb250YWlucyBgbWFpbicpIGFuZCBgbGliYXJjaGl2ZScuCi0KLSAgMy4gUnVuIHRoZSBmdXp6ZXIgb24gc29tZSB0ZXN0IGNvcnB1cy4KLQotVGhlIGV4YWN0IGZsYWdzIGFuZCBjb21tYW5kcyBtYXkgdmFyeS4KLQotICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6L3RyZWUvbWFzdGVyL3Byb2plY3RzL2ZyZWV0eXBlMgotCi1UaGVyZSBpcyBhIGNvbnRpbnVvdXMgZnV6emluZyBib3QgdGhhdCBydW5zIGZ0ZnV6emVyLgotCi0gIGh0dHBzOi8vb3NzLWZ1enouY29tCi0KLShZb3UgbmVlZCBhbiBhY2NvdW50ICB0byBiZSBhYmxlIHRvIHNlZSBjb3ZlcmFnZSAgcmVwb3J0cyBhbmQgdGhlIGxpa2UKLW9uIG9zcy1mdXp6LmNvbS4pCi0KLUNoZWNrIHRoZSBib3QgY29uZmlndXJhdGlvbiBmb3IgdGhlIG1vc3QgY3VycmVudCBzZXR0aW5ncy4KLQotCi1mdG11dGF0b3IuY2MKLS0tLS0tLS0tLS0tLQotCi1GcmVlVHlwZSBoYXMgdGhlICBhYmlsaXR5IHRvIGBhdHRhY2gnIGF1eGlsaWFyeSBmaWxlcyB0byAgYSBmb250IGZpbGUsCi1wcm92aWRpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gIFRoZSBtYWluIHVzYWdlIGlzIHRvIGxvYWQgQUZNIGZpbGVzCi1mb3IgUG9zdFNjcmlwdCBUeXBlIDEgZm9udHMuCi0KLUhvd2V2ZXIsIGxpYkZ1enplciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAgbXV0YXRpb24gb2YgYSBzaW5nbGUgaW5wdXQKLWZpbGUuICAgRm9yICB0aGlzICByZWFzb24sICBgZnRtdXRhdG9yLmNjJyBjb250YWlucyAgYSAgY3VzdG9tICBmdXp6ZXIKLW11dGF0b3IgdGhhdCB1c2VzIGFuIHVuY29tcHJlc3NlZCB0YXIgIGZpbGUgYXJjaGl2ZSBhcyB0aGUgaW5wdXQuICBUaGUKLWZpcnN0IGZpbGUgaW4gIHN1Y2ggYSB0YXJiYWxsIGdldHMgIG9wZW5lZCBieSBGcmVlVHlwZSBhcyAgYSBmb250LCBhbGwKLW90aGVyIGZpbGVzIGFyZSB0cmVhdGVkIGFzIGlucHV0IGZvciBgRlRfQXR0YWNoX1N0cmVhbScuCi0KLUNvbXBpbGF0aW9uIGlzIHNpbWlsYXIgdG8gYGZ0ZnV6emVyLmMnLgotCi0KLXJ1bmlucHV0LmNjCi0tLS0tLS0tLS0tLQotCi1UbyBydW4gdGhlIHRhcmdldCBmdW5jdGlvbiBvbiBhIHNldCBvZiBpbnB1dCBmaWxlcywgdGhpcyBmaWxlIGNvbnRhaW5zCi1hICAgY29udmVuaWVuY2UgIGBtYWluJyAgIGZ1bmN0aW9uLiAgIExpbmsgICBpdCAgd2l0aCAgIGBmdGZ1enplci5jYycsCi1gbGliZnJlZXR5cGUuYScsIGFuZCBgbGliYXJjaGl2ZScgYW5kIHJ1biBsaWtlCi0KLSAgLi9hLm91dCBteV90ZXN0c19pbnB1dHMvKgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNvcHlyaWdodCAyMDE1LTIwMTggYnkKLURhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLQotVGhpcyAgZmlsZSBpcyAgcGFydCBvZiAgdGhlIEZyZWVUeXBlICBwcm9qZWN0LCBhbmQgIG1heSBvbmx5ICBiZSB1c2VkLAotbW9kaWZpZWQsICBhbmQgZGlzdHJpYnV0ZWQgIHVuZGVyIHRoZSAgdGVybXMgb2YgIHRoZSAgRnJlZVR5cGUgcHJvamVjdAotbGljZW5zZSwgIExJQ0VOU0UuVFhULiAgQnkgIGNvbnRpbnVpbmcgdG8gIHVzZSwgbW9kaWZ5LCAgb3IgZGlzdHJpYnV0ZQotdGhpcyBmaWxlIHlvdSAgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkICB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZAotYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0tLS0gZW5kIG9mIFJFQURNRSAtLS0KZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYyBiL3NyYy90b29scy9mdGZ1enplci9mdGZ1enplci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMmJjOS4uMDAwMDAwMAotLS0gYS9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRmdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotLy8gZnRmdXp6ZXIuY2MKLS8vCi0vLyAgIEEgZnV6emluZyBmdW5jdGlvbiB0byB0ZXN0IEZyZWVUeXBlIHdpdGggbGliRnV6emVyLgotLy8KLS8vIENvcHlyaWdodCAyMDE1LTIwMTggYnkKLS8vIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0vLyBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotLy8gbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0vLyB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLS8vIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0vLyB3ZSB1c2UgYHVuaXF1ZV9wdHInLCBgZGVjbHR5cGUnLCBhbmQgb3RoZXIgZ2ltbWlja3MgZGVmaW5lZCBzaW5jZSBDKysxMQotI2lmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTAotIyAgZXJyb3IgImEgQysrMTEgY29tcGlsZXIgaXMgbmVlZGVkIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcmNoaXZlLmg+Ci0jaW5jbHVkZSA8YXJjaGl2ZV9lbnRyeS5oPgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0KLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfQ0FDSEVfSAotI2luY2x1ZGUgRlRfQ0FDSEVfQ0hBUk1BUF9ICi0jaW5jbHVkZSBGVF9DQUNIRV9JTUFHRV9ICi0jaW5jbHVkZSBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0gKLSNpbmNsdWRlIEZUX1NZTlRIRVNJU19ICi0jaW5jbHVkZSBGVF9BRFZBTkNFU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0JCT1hfSAotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLQotCi0gIHN0YXRpYyBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICBzdGF0aWMgaW50ICAgICAgICAgSW5pdFJlc3VsdDsKLQotCi0gIHN0cnVjdCBGVF9HbG9iYWwKLSAgewotICAgIEZUX0dsb2JhbCgpCi0gICAgewotICAgICAgSW5pdFJlc3VsdCA9IEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAgICBpZiAoIEluaXRSZXN1bHQgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIC8vIHRyeSB0byBhY3RpdmF0ZSBBZG9iZSdzIENGRiBlbmdpbmU7IGl0IG1pZ2h0IG5vdCBiZSB0aGUgZGVmYXVsdAotICAgICAgdW5zaWduZWQgaW50ICBjZmZfaGludGluZ19lbmdpbmUgPSBGVF9ISU5USU5HX0FET0JFOwotICAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAiY2ZmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImhpbnRpbmctZW5naW5lIiwgJmNmZl9oaW50aW5nX2VuZ2luZSApOwotICAgIH0KLQotICAgIH5GVF9HbG9iYWwoKQotICAgIHsKLSAgICAgIEZUX0RvbmVfRnJlZVR5cGUoIGxpYnJhcnkgKTsKLSAgICB9Ci0gIH07Ci0KLSAgRlRfR2xvYmFsICBnbG9iYWxfZnQ7Ci0KLQotICAvLyBXZSB3YW50IHRvIHNlbGVjdCBuIHZhbHVlcyBhdCByYW5kb20gKHdpdGhvdXQgcmVwZXRpdGlvbiksCi0gIC8vIHdpdGggMCA8IG4gPD0gTi4gIFRoZSBhbGdvcml0aG0gaXMgdGFrZW4gZnJvbSBUQW9DUCwgVm9sLiAyCi0gIC8vIChBbGdvcml0aG0gUywgc2VsZWN0aW9uIHNhbXBsaW5nIHRlY2huaXF1ZSkKLSAgc3RydWN0IFJhbmRvbQotICB7Ci0gICAgaW50ICBuOwotICAgIGludCAgTjsKLQotICAgIGludCAgdDsgLy8gdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBzbyBmYXIKLSAgICBpbnQgIG07IC8vIG51bWJlciBvZiBzZWxlY3RlZCB2YWx1ZXMgc28gZmFyCi0KLSAgICB1aW50MzJfdCAgcjsgLy8gdGhlIGN1cnJlbnQgcHNldWRvLXJhbmRvbSBudW1iZXIKLQotICAgIFJhbmRvbSggaW50IG5fLAotICAgICAgICAgICAgaW50IE5fICkKLSAgICA6IG4oIG5fICksCi0gICAgICBOKCBOXyApCi0gICAgewotICAgICAgdCA9IDA7Ci0gICAgICBtID0gMDsKLQotICAgICAgLy8gSWRlYWxseSwgdGhpcyBzaG91bGQgZGVwZW5kIG9uIHRoZSBpbnB1dCBmaWxlLAotICAgICAgLy8gZm9yIGV4YW1wbGUsIHRha2luZyB0aGUgc2hhMjU2IGFzIGlucHV0OwotICAgICAgLy8gaG93ZXZlciwgdGhpcyBpcyBvdmVya2lsbCBmb3IgZnV6enlpbmcgdGVzdHMuCi0gICAgICByID0gMTIzNDU7Ci0gICAgfQotCi0gICAgaW50IGdldCgpCi0gICAgewotICAgICAgaWYgKCBtID49IG4gKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBSZWRvOgotICAgICAgLy8gV2UgY2FuJ3QgdXNlIGByYW5kJzogZGlmZmVyZW50IEMgbGlicmFyaWVzIG1pZ2h0IHByb3ZpZGUKLSAgICAgIC8vIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBmdW5jdGlvbi4gIEFzIGEgcmVwbGFjZW1lbnQsCi0gICAgICAvLyB3ZSB1c2UgYSAzMmJpdCB2ZXJzaW9uIG9mIHRoZSBgeG9yc2hpZnQnIGFsZ29yaXRobS4KLSAgICAgIHIgXj0gciA8PCAxMzsKLSAgICAgIHIgXj0gciA+PiAxNzsKLSAgICAgIHIgXj0gciA8PCA1OwotCi0gICAgICBkb3VibGUgIFUgPSBkb3VibGUoIHIgKSAvIFVJTlQzMl9NQVg7Ci0KLSAgICAgIGlmICggKCBOIC0gdCApICogVSA+PSAoIG4gLSBtICkgKQotICAgICAgewotICAgICAgICB0Kys7Ci0gICAgICAgIGdvdG8gUmVkbzsKLSAgICAgIH0KLQotICAgICAgdCsrOwotICAgICAgbSsrOwotCi0gICAgICByZXR1cm4gdDsKLSAgICB9Ci0gIH07Ci0KLQotICBzdGF0aWMgaW50Ci0gIGFyY2hpdmVfcmVhZF9lbnRyeV9kYXRhKCBzdHJ1Y3QgYXJjaGl2ZSAgICphciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxGVF9CeXRlPiAgKnZ3ICkKLSAgewotICAgIGludCAgICAgICAgICAgICByOwotICAgIGNvbnN0IEZUX0J5dGUqICBidWZmOwotICAgIHNpemVfdCAgICAgICAgICBzaXplOwotICAgIGludDY0X3QgICAgICAgICBvZmZzZXQ7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHIgPSBhcmNoaXZlX3JlYWRfZGF0YV9ibG9jayggYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCoqPiggJmJ1ZmYgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQgKTsKLSAgICAgIGlmICggciA9PSBBUkNISVZFX0VPRiApCi0gICAgICAgIHJldHVybiBBUkNISVZFX09LOwotICAgICAgaWYgKCByICE9IEFSQ0hJVkVfT0sgKQotICAgICAgICByZXR1cm4gcjsKLQotICAgICAgdnctPmluc2VydCggdnctPmVuZCgpLCBidWZmLCBidWZmICsgc2l6ZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZlY3Rvcjx2ZWN0b3I8RlRfQnl0ZT4+Ci0gIHBhcnNlX2RhdGEoIGNvbnN0IHVpbnQ4X3QqICBkYXRhLAotICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSApCi0gIHsKLSAgICBzdHJ1Y3QgYXJjaGl2ZV9lbnRyeSogICAgZW50cnk7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHI7Ci0gICAgdmVjdG9yPHZlY3RvcjxGVF9CeXRlPj4gIGZpbGVzOwotCi0gICAgdW5pcXVlX3B0cjxzdHJ1Y3QgIGFyY2hpdmUsCi0gICAgICAgICAgICAgICBkZWNsdHlwZSAoIGFyY2hpdmVfcmVhZF9mcmVlICkqPiAgYSggYXJjaGl2ZV9yZWFkX25ldygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfcmVhZF9mcmVlICk7Ci0KLSAgICAvLyBhY3RpdmF0ZSByZWFkaW5nIG9mIHVuY29tcHJlc3NlZCB0YXIgYXJjaGl2ZXMKLSAgICBhcmNoaXZlX3JlYWRfc3VwcG9ydF9mb3JtYXRfdGFyKCBhLmdldCgpICk7Ci0KLSAgICAvLyB0aGUgbmVlZCBmb3IgYGNvbnN0X2Nhc3QnIHdhcyByZW1vdmVkIHdpdGggbGliYXJjaGl2ZSBjb21taXQgYmU0ZDRkZAotICAgIGlmICggISggciA9IGFyY2hpdmVfcmVhZF9vcGVuX21lbW9yeSgKLSAgICAgICAgICAgICAgICAgIGEuZ2V0KCksCi0gICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oIGRhdGEgKSApLAotICAgICAgICAgICAgICAgICAgc2l6ZSApICkgKQotICAgIHsKLSAgICAgIHVuaXF1ZV9wdHI8c3RydWN0ICBhcmNoaXZlLAotICAgICAgICAgICAgICAgICBkZWNsdHlwZSAoIGFyY2hpdmVfcmVhZF9jbG9zZSApKj4gIGFfb3BlbiggYS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfcmVhZF9jbG9zZSApOwotCi0gICAgICAvLyByZWFkIGZpbGVzIGNvbnRhaW5lZCBpbiBhcmNoaXZlCi0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICByID0gYXJjaGl2ZV9yZWFkX25leHRfaGVhZGVyKCBhX29wZW4uZ2V0KCksICZlbnRyeSApOwotICAgICAgICBpZiAoIHIgPT0gQVJDSElWRV9FT0YgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoIHIgIT0gQVJDSElWRV9PSyApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdmVjdG9yPEZUX0J5dGU+ICBlbnRyeV9kYXRhOwotICAgICAgICByID0gYXJjaGl2ZV9yZWFkX2VudHJ5X2RhdGEoIGEuZ2V0KCksICZlbnRyeV9kYXRhICk7Ci0gICAgICAgIGlmICggciAhPSBBUkNISVZFX09LICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBmaWxlcy5wdXNoX2JhY2soIG1vdmUoIGVudHJ5X2RhdGEgKSApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggZmlsZXMuc2l6ZSgpID09IDAgKQotICAgICAgZmlsZXMuZW1wbGFjZV9iYWNrKCBkYXRhLCBkYXRhICsgc2l6ZSApOwotCi0gICAgcmV0dXJuIGZpbGVzOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBzZXRJbnRlcm1lZGlhdGVBeGlzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIC8vIG9ubHkgaGFuZGxlIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhcmlhdGlvbiBmb250cwotICAgIGlmICggIUZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgLy8gZ2V0IHZhcmlhdGlvbiBkYXRhIGZvciBjdXJyZW50IGluc3RhbmNlCi0gICAgRlRfTU1fVmFyKiAgdmFyaWF0aW9uc19wdHIgPSBudWxscHRyOwotICAgIGlmICggRlRfR2V0X01NX1ZhciggZmFjZSwgJnZhcmlhdGlvbnNfcHRyICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgdW5pcXVlX3B0cjxGVF9NTV9WYXIsCi0gICAgICAgICAgICAgICBkZWNsdHlwZSAoIGZyZWUgKSo+ICB2YXJpYXRpb25zKCB2YXJpYXRpb25zX3B0ciwgZnJlZSApOwotICAgIHZlY3RvcjxGVF9GaXhlZD4gICAgICAgICAgICAgICAgY29vcmRzKCB2YXJpYXRpb25zLT5udW1fYXhpcyApOwotCi0gICAgLy8gc2VsZWN0IGFuIGFyYml0cmFyeSBpbnN0YW5jZQotICAgIGZvciAoIHVuc2lnbmVkIGludCAgaSA9IDA7IGkgPCB2YXJpYXRpb25zLT5udW1fYXhpczsgaSsrICkKLSAgICAgIGNvb3Jkc1tpXSA9ICggdmFyaWF0aW9ucy0+YXhpc1tpXS5taW5pbXVtICsKLSAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9ucy0+YXhpc1tpXS5kZWYgICAgICkgLyAyOwotCi0gICAgaWYgKCBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50KCBjb29yZHMuc2l6ZSgpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzLmRhdGEoKSApICkKLSAgICAgIHJldHVybjsKLSAgfQotCi0KLSAgLy8gdGhlIGludGVyZmFjZSBmdW5jdGlvbiB0byB0aGUgbGliRnV6emVyIGxpYnJhcnkKLSAgZXh0ZXJuICJDIiBpbnQKLSAgTExWTUZ1enplclRlc3RPbmVJbnB1dCggY29uc3QgdWludDhfdCogIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplXyApCi0gIHsKLSAgICBhc3NlcnQoICFJbml0UmVzdWx0ICk7Ci0KLSAgICBpZiAoIHNpemVfIDwgMSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGNvbnN0IHZlY3Rvcjx2ZWN0b3I8RlRfQnl0ZT4+JiAgZmlsZXMgPSBwYXJzZV9kYXRhKCBkYXRhLCBzaXplXyApOwotCi0gICAgRlRfRmFjZSAgICAgICAgIGZhY2U7Ci0gICAgRlRfSW50MzIgICAgICAgIGxvYWRfZmxhZ3MgID0gRlRfTE9BRF9ERUZBVUxUOwotI2lmIDAKLSAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUw7Ci0jZW5kaWYKLQotICAgIC8vIFdlIHVzZSBhIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCBoZXJlLCBhdCB0aGUgY29zdCBvZiBjYWxsaW5nCi0gICAgLy8gYEZUX05ld19GYWNlJyBxdWl0ZSBvZnRlbi4gIFRoZSBpZGVhIGlzIHRoYXQgdGhlIGZ1enplciBzaG91bGQgYmUKLSAgICAvLyBhYmxlIHRvIHRyeSBhbGwgZmFjZXMgYW5kIG5hbWVkIGluc3RhbmNlcyBvZiBhIGZvbnQsIGV4cGVjdGluZyB0aGF0Ci0gICAgLy8gc29tZSBmYWNlcyBkb24ndCB3b3JrIGZvciB2YXJpb3VzIHJlYXNvbnMsIGUuZy4sIGEgYnJva2VuIHN1YmZvbnQsIG9yCi0gICAgLy8gYW4gdW5zdXBwb3J0ZWQgTkZOVCBiaXRtYXAgZm9udCBpbiBhIE1hYyBkZm9udCByZXNvdXJjZSB0aGF0IGhvbGRzCi0gICAgLy8gbW9yZSB0aGFuIGEgc2luZ2xlIGZvbnQuCi0KLSAgICAvLyBnZXQgbnVtYmVyIG9mIGZhY2VzCi0gICAgaWYgKCBGVF9OZXdfTWVtb3J5X0ZhY2UoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzWzBdLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpZmlsZXNbMF0uc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UgKSApCi0gICAgICByZXR1cm4gMDsKLSAgICBsb25nICBudW1fZmFjZXMgPSBmYWNlLT5udW1fZmFjZXM7Ci0gICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7Ci0KLSAgICAvLyBsb29wIG92ZXIgdXAgdG8gMjAgYXJiaXRyYXJpbHkgc2VsZWN0ZWQgZmFjZXMKLSAgICAvLyBmcm9tIGluZGV4IHJhbmdlIFswO251bS1mYWNlcy0xXQotICAgIGxvbmcgIG1heF9mYWNlX2NudCA9IG51bV9mYWNlcyA8IDIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bV9mYWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyMDsKLQotICAgIFJhbmRvbSAgZmFjZXNfcG9vbCggKGludCltYXhfZmFjZV9jbnQsIChpbnQpbnVtX2ZhY2VzICk7Ci0KLSAgICBmb3IgKCBsb25nICBmYWNlX2NudCA9IDA7Ci0gICAgICAgICAgZmFjZV9jbnQgPCBtYXhfZmFjZV9jbnQ7Ci0gICAgICAgICAgZmFjZV9jbnQrKyApCi0gICAgewotICAgICAgbG9uZyAgZmFjZV9pbmRleCA9IGZhY2VzX3Bvb2wuZ2V0KCkgLSAxOwotCi0gICAgICAvLyBnZXQgbnVtYmVyIG9mIGluc3RhbmNlcwotICAgICAgaWYgKCBGVF9OZXdfTWVtb3J5X0ZhY2UoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNbMF0uZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZpbGVzWzBdLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKCBmYWNlX2luZGV4ICsgMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWNlICkgKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGxvbmcgIG51bV9pbnN0YW5jZXMgPSBmYWNlLT5zdHlsZV9mbGFncyA+PiAxNjsKLSAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOwotCi0gICAgICAvLyBsb29wIG92ZXIgdGhlIGZhY2Ugd2l0aG91dCBpbnN0YW5jZSAoaW5kZXggMCkKLSAgICAgIC8vIGFuZCB1cCB0byAyMCBhcmJpdHJhcmlseSBzZWxlY3RlZCBpbnN0YW5jZXMKLSAgICAgIC8vIGZyb20gaW5kZXggcmFuZ2UgWzE7bnVtX2luc3RhbmNlc10KLSAgICAgIGxvbmcgIG1heF9pbnN0YW5jZV9jbnQgPSBudW1faW5zdGFuY2VzIDwgMjAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVtX2luc3RhbmNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyMDsKLQotICAgICAgUmFuZG9tICBpbnN0YW5jZXNfcG9vbCggKGludCltYXhfaW5zdGFuY2VfY250LCAoaW50KW51bV9pbnN0YW5jZXMgKTsKLQotICAgICAgZm9yICggbG9uZyAgaW5zdGFuY2VfY250ID0gMDsKLSAgICAgICAgICAgIGluc3RhbmNlX2NudCA8PSBtYXhfaW5zdGFuY2VfY250OwotICAgICAgICAgICAgaW5zdGFuY2VfY250KysgKQotICAgICAgewotICAgICAgICBsb25nICBpbnN0YW5jZV9pbmRleCA9IDA7Ci0KLSAgICAgICAgaWYgKCAhaW5zdGFuY2VfY250ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfTmV3X01lbW9yeV9GYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc1swXS5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWZpbGVzWzBdLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UgKSApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0YW5jZV9pbmRleCA9IGluc3RhbmNlc19wb29sLmdldCgpOwotCi0gICAgICAgICAgaWYgKCBGVF9OZXdfTWVtb3J5X0ZhY2UoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzWzBdLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpZmlsZXNbMF0uc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGluc3RhbmNlX2luZGV4IDw8IDE2ICkgKyBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmFjZSApICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBtb3JlIHRoYW4gYSBzaW5nbGUgaW5wdXQgZmlsZSBjb21pbmcgZnJvbSBhbiBhcmNoaXZlLAotICAgICAgICAvLyBhdHRhY2ggdGhlbSAoc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kIGZpbGUpIHVzaW5nIHRoZSBvcmRlciBnaXZlbgotICAgICAgICAvLyBpbiB0aGUgYXJjaGl2ZQotICAgICAgICBmb3IgKCBzaXplX3QgIGZpbGVzX2luZGV4ID0gMTsKLSAgICAgICAgICAgICAgZmlsZXNfaW5kZXggPCBmaWxlcy5zaXplKCk7Ci0gICAgICAgICAgICAgIGZpbGVzX2luZGV4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfT3Blbl9BcmdzICBvcGVuX2FyZ3MgPSB7fTsKLSAgICAgICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICAgICA9IEZUX09QRU5fTUVNT1JZOwotICAgICAgICAgIG9wZW5fYXJncy5tZW1vcnlfYmFzZSAgID0gZmlsZXNbZmlsZXNfaW5kZXhdLmRhdGEoKTsKLSAgICAgICAgICBvcGVuX2FyZ3MubWVtb3J5X3NpemUgICA9IChGVF9Mb25nKWZpbGVzW2ZpbGVzX2luZGV4XS5zaXplKCk7Ci0KLSAgICAgICAgICAvLyB0aGUgbGFzdCBhcmNoaXZlIGVsZW1lbnQgd2lsbCBiZSBldmVudHVhbGx5IHVzZWQgYXMgdGhlCi0gICAgICAgICAgLy8gYXR0YWNobWVudAotICAgICAgICAgIEZUX0F0dGFjaF9TdHJlYW0oIGZhY2UsICZvcGVuX2FyZ3MgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGxvb3Agb3ZlciBhbiBhcmJpdHJhcnkgc2l6ZSBmb3Igb3V0bGluZXMKLSAgICAgICAgLy8gYW5kIHVwIHRvIHRlbiBhcmJpdHJhcmlseSBzZWxlY3RlZCBiaXRtYXAgc3RyaWtlIHNpemVzCi0gICAgICAgIC8vIGZyb20gdGhlIHJhbmdlIFswO251bV9maXhlZF9zaXplcyAtIDFdCi0gICAgICAgIGludCAgbWF4X3NpemVfY250ID0gZmFjZS0+bnVtX2ZpeGVkX3NpemVzIDwgMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmFjZS0+bnVtX2ZpeGVkX3NpemVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEwOwotCi0gICAgICAgIFJhbmRvbSBzaXplc19wb29sKCBtYXhfc2l6ZV9jbnQsIGZhY2UtPm51bV9maXhlZF9zaXplcyApOwotCi0gICAgICAgIGZvciAoIGludCAgc2l6ZV9jbnQgPSAwOwotICAgICAgICAgICAgICBzaXplX2NudCA8PSBtYXhfc2l6ZV9jbnQ7Ci0gICAgICAgICAgICAgIHNpemVfY250KysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50MzIgIGZsYWdzID0gbG9hZF9mbGFnczsKLQotICAgICAgICAgIGludCAgc2l6ZV9pbmRleCA9IDA7Ci0KLSAgICAgICAgICBpZiAoICFzaXplX2NudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gc2V0IHVwIDIwcHQgYXQgNzJkcGkgYXMgYW4gYXJiaXRyYXJ5IHNpemUKLSAgICAgICAgICAgIGlmICggRlRfU2V0X0NoYXJfU2l6ZSggZmFjZSwgMjAgKiA2NCwgMjAgKiA2NCwgNzIsIDcyICkgKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZsYWdzIHw9IEZUX0xPQURfTk9fQklUTUFQOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLy8gYml0bWFwIHN0cmlrZXMgYXJlIG5vdCBhY3RpdmUgZm9yIGZvbnQgdmFyaWF0aW9ucwotICAgICAgICAgICAgaWYgKCBpbnN0YW5jZV9pbmRleCApCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBzaXplX2luZGV4ID0gc2l6ZXNfcG9vbC5nZXQoKSAtIDE7Ci0KLSAgICAgICAgICAgIGlmICggRlRfU2VsZWN0X1NpemUoIGZhY2UsIHNpemVfaW5kZXggKSApCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZmxhZ3MgfD0gRlRfTE9BRF9DT0xPUjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyB0ZXN0IE1NIGludGVyZmFjZSBvbmx5IGZvciBhIGZhY2Ugd2l0aG91dCBhIHNlbGVjdGVkIGluc3RhbmNlCi0gICAgICAgICAgLy8gYW5kIHdpdGhvdXQgYSBzZWxlY3RlZCBiaXRtYXAgc3RyaWtlCi0gICAgICAgICAgaWYgKCAhaW5zdGFuY2VfaW5kZXggJiYgIXNpemVfY250ICkKLSAgICAgICAgICAgIHNldEludGVybWVkaWF0ZUF4aXMoIGZhY2UgKTsKLQotICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgZ2x5cGhzCi0gICAgICAgICAgZm9yICggdW5zaWduZWQgaW50ICBnbHlwaF9pbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXggPCAodW5zaWduZWQgaW50KWZhY2UtPm51bV9nbHlwaHM7Ci0gICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgZmxhZ3MgKSApCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBSZW5kZXJpbmcgaXMgdGhlIG1vc3QgZXhwZW5zaXZlIGFuZCB0aGUgbGVhc3QgaW50ZXJlc3RpbmcgcGFydC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBpZiAoIEZUX1JlbmRlcl9HbHlwaCggZmFjZS0+Z2x5cGgsIHJlbmRlcl9tb2RlKSApCi0gICAgICAgICAgICAvLyAgIGNvbnRpbnVlOwotICAgICAgICAgICAgLy8gRlRfR2x5cGhTbG90X0VtYm9sZGVuKCBmYWNlLT5nbHlwaCApOwotCi0jaWYgMAotICAgICAgICAgICAgRlRfR2x5cGggIGdseXBoOwotICAgICAgICAgICAgaWYgKCAhRlRfR2V0X0dseXBoKCBmYWNlLT5nbHlwaCwgJmdseXBoICkgKQotICAgICAgICAgICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaCApOwotCi0gICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9ICZmYWNlLT5nbHlwaC0+b3V0bGluZTsKLSAgICAgICAgICAgIEZUX01hdHJpeCAgICByb3QzMCAgID0geyAweEREQjQsIC0weDgwMDAsIDB4ODAwMCwgMHhEREI0IH07Ci0KLSAgICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCBvdXRsaW5lLCAmcm90MzAgKTsKLQotICAgICAgICAgICAgRlRfQkJveCAgYmJveDsKLSAgICAgICAgICAgIEZUX091dGxpbmVfR2V0X0JCb3goIG91dGxpbmUsICZiYm94ICk7Ci0jZW5kaWYKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vLyBFTkQKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9mdG11dGF0b3IuY2MgYi9zcmMvdG9vbHMvZnRmdXp6ZXIvZnRtdXRhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRiMTQwLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdGZ1enplci9mdG11dGF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLy8gZnRtdXRhdG9yLmNjCi0vLwotLy8gICBBIGN1c3RvbSBmdXp6ZXIgbXV0YXRvciB0byB0ZXN0IGZvciBGcmVlVHlwZSB3aXRoIGxpYkZ1enplci4KLS8vCi0vLyBDb3B5cmlnaHQgMjAxNS0yMDE4IGJ5Ci0vLyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0vLwotLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAotLy8gbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKLS8vIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotLy8gdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCi0vLyB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCi0KLQotLy8gU2luY2UgYHRhcicgaXMgbm90IGEgdmFsaWQgZm9ybWF0IGZvciBpbnB1dCB0byBGcmVlVHlwZSwgdHJlYXQgYW55IGlucHV0Ci0vLyB0aGF0IGxvb2tzIGxpa2UgYHRhcicgYXMgbXVsdGlwbGUgZmlsZXMgYW5kIG11dGF0ZSB0aGVtIHNlcGFyYXRlbHkuCi0vLwotLy8gSW4gdGhlIGZ1dHVyZSwgYSB2YXJpYXRpb24gb2YgdGhpcyBtYXkgYmUgdXNlZCB0byBndWlkZSBtdXRhdGlvbiBvbiBhCi0vLyBsb2dpY2FsbHkgaGlnaGVyIGxldmVsLgotCi0KLS8vIHdlIHVzZSBgdW5pcXVlX3B0cicsIGBkZWNsdHlwZScsIGFuZCBvdGhlciBnaW1taWNrcyBkZWZpbmVkIHNpbmNlIEMrKzExCi0jaWYgX19jcGx1c3BsdXMgPCAyMDExMDNMCi0jICBlcnJvciAiYSBDKysxMSBjb21waWxlciBpcyBuZWVkZWQiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8Y2Fzc2VydD4KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVkZSA8Y3N0ZGxpYj4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8YXJjaGl2ZS5oPgotI2luY2x1ZGUgPGFyY2hpdmVfZW50cnkuaD4KLQotI2luY2x1ZGUgIkZ1enplckludGVyZmFjZS5oIgotCi0KLSAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQotCi0gIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGRlZmluZWQgYnkgYGZ0ZnV6emVyLmNjJy4KLSAgZXh0ZXJuICJDIiBpbnQKLSAgTExWTUZ1enplclRlc3RPbmVJbnB1dCggY29uc3QgdWludDhfdCogIERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBTaXplICk7Ci0KLQotICBzdGF0aWMgdm9pZAotICBjaGVja19yZXN1bHQoIHN0cnVjdCBhcmNoaXZlKiAgYSwKLSAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIHIgKQotICB7Ci0gICAgaWYgKCByID09IEFSQ0hJVkVfT0sgKQotICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgY2hhciogIG0gPSBhcmNoaXZlX2Vycm9yX3N0cmluZyggYSApOwotICAgIHdyaXRlKCAxLCBtLCBzdHJsZW4oIG0gKSApOwotICAgIGV4aXQoIDEgKTsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBhcmNoaXZlX3JlYWRfZW50cnlfZGF0YSggc3RydWN0IGFyY2hpdmUgICAqYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8dWludDhfdD4gICp2dyApCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgcjsKLSAgICBjb25zdCB1aW50OF90KiAgYnVmZjsKLSAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKLSAgICBpbnQ2NF90ICAgICAgICAgb2Zmc2V0OwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICByID0gYXJjaGl2ZV9yZWFkX2RhdGFfYmxvY2soIGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQqKj4oICZidWZmICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0ICk7Ci0gICAgICBpZiAoIHIgPT0gQVJDSElWRV9FT0YgKQotICAgICAgICByZXR1cm4gQVJDSElWRV9PSzsKLSAgICAgIGlmICggciAhPSBBUkNISVZFX09LICkKLSAgICAgICAgcmV0dXJuIHI7Ci0KLSAgICAgIHZ3LT5pbnNlcnQoIHZ3LT5lbmQoKSwgYnVmZiwgYnVmZiArIHNpemUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2ZWN0b3I8dmVjdG9yPHVpbnQ4X3Q+PgotICBwYXJzZV9kYXRhKCBjb25zdCB1aW50OF90KiAgZGF0YSwKLSAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUgKQotICB7Ci0gICAgc3RydWN0IGFyY2hpdmVfZW50cnkqICAgIGVudHJ5OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICByOwotICAgIHZlY3Rvcjx2ZWN0b3I8dWludDhfdD4+ICBmaWxlczsKLQotICAgIHVuaXF1ZV9wdHI8c3RydWN0ICBhcmNoaXZlLAotICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3JlYWRfZnJlZSApKj4gIGEoIGFyY2hpdmVfcmVhZF9uZXcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3JlYWRfZnJlZSApOwotCi0gICAgLy8gYWN0aXZhdGUgcmVhZGluZyBvZiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmVzCi0gICAgYXJjaGl2ZV9yZWFkX3N1cHBvcnRfZm9ybWF0X3RhciggYS5nZXQoKSApOwotCi0gICAgLy8gdGhlIG5lZWQgZm9yIGBjb25zdF9jYXN0JyB3YXMgcmVtb3ZlZCB3aXRoIGxpYmFyY2hpdmUgY29tbWl0IGJlNGQ0ZGQKLSAgICBpZiAoICEoIHIgPSBhcmNoaXZlX3JlYWRfb3Blbl9tZW1vcnkoCi0gICAgICAgICAgICAgICAgICBhLmdldCgpLAotICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCBkYXRhICkgKSwKLSAgICAgICAgICAgICAgICAgIHNpemUgKSApICkKLSAgICB7Ci0gICAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3JlYWRfY2xvc2UgKSo+ICBhX29wZW4oIGEuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3JlYWRfY2xvc2UgKTsKLQotICAgICAgLy8gcmVhZCBmaWxlcyBjb250YWluZWQgaW4gYXJjaGl2ZQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgciA9IGFyY2hpdmVfcmVhZF9uZXh0X2hlYWRlciggYV9vcGVuLmdldCgpLCAmZW50cnkgKTsKLSAgICAgICAgaWYgKCByID09IEFSQ0hJVkVfRU9GICkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCByICE9IEFSQ0hJVkVfT0sgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHZlY3Rvcjx1aW50OF90PiAgZW50cnlfZGF0YTsKLSAgICAgICAgciA9IGFyY2hpdmVfcmVhZF9lbnRyeV9kYXRhKCBhLmdldCgpLCAmZW50cnlfZGF0YSApOwotICAgICAgICBpZiAoIGVudHJ5X2RhdGEuc2l6ZSgpID09IDAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZpbGVzLnB1c2hfYmFjayggbW92ZSggZW50cnlfZGF0YSApICk7Ci0gICAgICAgIGlmICggciAhPSBBUkNISVZFX09LICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmlsZXM7Ci0gIH0KLQotCi0gIGNsYXNzIEZURnV6emVyCi0gIDogcHVibGljIGZ1enplcjo6VXNlclN1cHBsaWVkRnV6emVyCi0gIHsKLQotICBwdWJsaWM6Ci0gICAgRlRGdXp6ZXIoIGZ1enplcjo6RnV6emVyUmFuZG9tQmFzZSogIFJhbmQgKQotICAgIDogZnV6emVyOjpVc2VyU3VwcGxpZWRGdXp6ZXIoIFJhbmQgKSB7fQotCi0KLSAgICBpbnQKLSAgICBUYXJnZXRGdW5jdGlvbiggY29uc3QgdWludDhfdCogIERhdGEsCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBTaXplICkKLSAgICB7Ci0gICAgICByZXR1cm4gTExWTUZ1enplclRlc3RPbmVJbnB1dCggRGF0YSwgU2l6ZSApOwotICAgIH0KLQotCi0gICAgLy8gQ3VzdG9tIG11dGF0b3IuCi0gICAgdmlydHVhbCBzaXplX3QKLSAgICBNdXRhdGUoIHVpbnQ4X3QqICBEYXRhLAotICAgICAgICAgICAgc2l6ZV90ICAgIFNpemUsCi0gICAgICAgICAgICBzaXplX3QgICAgTWF4U2l6ZSApCi0gICAgewotICAgICAgdmVjdG9yPHZlY3Rvcjx1aW50OF90Pj4gIGZpbGVzID0gcGFyc2VfZGF0YSggRGF0YSwgU2l6ZSApOwotCi0gICAgICAvLyBJZiB0aGUgZmlsZSB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSB0YXIgZmlsZSwgdHJlYXQgaXQgYXMgbm9uLXRhci4KLSAgICAgIGlmICggZmlsZXMuc2l6ZSgpID09IDAgKQotICAgICAgICByZXR1cm4gZnV6emVyOjpVc2VyU3VwcGxpZWRGdXp6ZXI6Ok11dGF0ZSggRGF0YSwgU2l6ZSwgTWF4U2l6ZSApOwotCi0gICAgICAvLyBUaGlzIGlzIHNvbWV3aGF0IGB3aGl0ZSBib3gnIG9uIHRhci4gIFRoZSB0YXIgZm9ybWF0IHVzZXMgNTEyIGJ5dGUKLSAgICAgIC8vIGJsb2Nrcy4gIE9uZSBibG9jayBhcyBoZWFkZXIgZm9yIGVhY2ggZmlsZSwgdHdvIGVtcHR5IGJsb2NrcyBvZiAwJ3MKLSAgICAgIC8vIGF0IHRoZSBlbmQuICBGaWxlIGRhdGEgaXMgcGFkZGVkIHRvIGZpbGwgaXRzIGxhc3QgYmxvY2suCi0gICAgICBzaXplX3QgIHVzZWRfYmxvY2tzID0gZmlsZXMuc2l6ZSgpICsgMjsKLSAgICAgIGZvciAoIGNvbnN0IGF1dG8mICBmaWxlIDogZmlsZXMgKQotICAgICAgICB1c2VkX2Jsb2NrcyArPSAoIGZpbGUuc2l6ZSgpICsgNTExICkgLyA1MTI7Ci0KLSAgICAgIHNpemVfdCAgbWF4X2Jsb2NrcyA9IE1heFNpemUgLyA1MTI7Ci0KLSAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBiaWcsIGl0IHdpbGwgbmVlZCB0byBiZSBkb3duc2l6ZWQuICBJZiB0aGUgb3JpZ2luYWwKLSAgICAgIC8vIHRhciBmaWxlIHdhcyB0b28gYmlnLCBpdCBtYXkgaGF2ZSBiZWVuIGNsaXBwZWQgdG8gZml0LiAgSW4gdGhpcwotICAgICAgLy8gY2FzZSBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHByb3Blcmx5IHdyaXRlIG91dCB0aGUgZGF0YSwgYXMKLSAgICAgIC8vIHRoZXJlIG1heSBub3QgYmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgdHdvIGJsb2Nrcy4gIFN0YXJ0Ci0gICAgICAvLyBkcm9wcGluZyBmaWxlIGRhdGEgb3IgZmlsZXMgZnJvbSB0aGUgZW5kLgotICAgICAgZm9yICggc2l6ZV90ICBpID0gZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgaS0tID4gMSAmJiB1c2VkX2Jsb2NrcyA+IG1heF9ibG9ja3M7ICkKLSAgICAgIHsKLSAgICAgICAgc2l6ZV90ICBibG9ja3NfdG9fZnJlZSA9IHVzZWRfYmxvY2tzIC0gbWF4X2Jsb2NrczsKLSAgICAgICAgc2l6ZV90ICBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZV9kYXRhID0KLSAgICAgICAgICAgICAgICAgICggZmlsZXNbaV0uc2l6ZSgpICsgNTExICkgLyA1MTI7Ci0KLSAgICAgICAgaWYgKCBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZV9kYXRhID49IGJsb2Nrc190b19mcmVlICkKLSAgICAgICAgewotICAgICAgICAgIGZpbGVzW2ldLnJlc2l6ZSggKCBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NfdG9fZnJlZSApICogNTEyICk7Ci0gICAgICAgICAgdXNlZF9ibG9ja3MgLT0gYmxvY2tzX3RvX2ZyZWU7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaWxlcy5wb3BfYmFjaygpOwotICAgICAgICB1c2VkX2Jsb2NrcyAtPSBibG9ja3NfY3VycmVudGx5X3VzZWRfYnlfZmlsZV9kYXRhICsgMTsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgd2UgZ2V0IGRvd24gdG8gb25lIGZpbGUsIGRvbid0IHVzZSB0YXIuCi0gICAgICBpZiAoIGZpbGVzLnNpemUoKSA9PSAxICkKLSAgICAgIHsKLSAgICAgICAgbWVtY3B5KCBEYXRhLCBmaWxlc1swXS5kYXRhKCksIGZpbGVzWzBdLnNpemUoKSApOwotICAgICAgICByZXR1cm4gZnV6emVyOjpVc2VyU3VwcGxpZWRGdXp6ZXI6Ok11dGF0ZSggRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzWzBdLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFNpemUgKTsKLSAgICAgIH0KLQotICAgICAgc2l6ZV90ICBmcmVlX2Jsb2NrcyA9IG1heF9ibG9ja3MgLSB1c2VkX2Jsb2NrczsKLQotICAgICAgLy8gQWxsb3cgZWFjaCBmaWxlIHRvIHVzZSB1cCBhcyBtdWNoIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIHNwYWNlCi0gICAgICAvLyBpdCBjYW4uICBJZiBpdCB1c2VzIG9yIGdpdmVzIHVwIGJsb2NrcywgYWRkIHRoZW0gb3IgcmVtb3ZlIHRoZW0KLSAgICAgIC8vIGZyb20gdGhlIHBvb2wuCi0gICAgICBmb3IgKCBhdXRvJiYgIGZpbGUgOiBmaWxlcyApCi0gICAgICB7Ci0gICAgICAgIHNpemVfdCAgYmxvY2tzX2N1cnJlbnRseV91c2VkX2J5X2ZpbGUgPSAoIGZpbGUuc2l6ZSgpICsgNTExICkgLyA1MTI7Ci0gICAgICAgIHNpemVfdCAgYmxvY2tzX2F2YWlsYWJsZSA9IGJsb2Nrc19jdXJyZW50bHlfdXNlZF9ieV9maWxlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX2Jsb2NrczsKLSAgICAgICAgc2l6ZV90ICBtYXhfc2l6ZSA9IGJsb2Nrc19hdmFpbGFibGUgKiA1MTI7Ci0gICAgICAgIHNpemVfdCAgZGF0YV9zaXplID0gZmlsZS5zaXplKCk7Ci0KLSAgICAgICAgZmlsZS5yZXNpemUoIG1heF9zaXplICk7Ci0gICAgICAgIGZpbGUucmVzaXplKCBmdXp6ZXI6OlVzZXJTdXBwbGllZEZ1enplcjo6TXV0YXRlKCBmaWxlLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplICkgKTsKLQotICAgICAgICBzaXplX3QgIGJsb2Nrc19ub3dfdXNlZF9ieV9maWxlID0gKCBmaWxlLnNpemUoKSArIDUxMSApIC8gNTEyOwotICAgICAgICBmcmVlX2Jsb2NrcyA9IGZyZWVfYmxvY2tzICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc19jdXJyZW50bHlfdXNlZF9ieV9maWxlIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc19ub3dfdXNlZF9ieV9maWxlOwotICAgICAgfQotCi0gICAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgZGVjbHR5cGUgKCBhcmNoaXZlX3dyaXRlX2ZyZWUgKSo+ICBhKCBhcmNoaXZlX3dyaXRlX25ldygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfd3JpdGVfZnJlZSApOwotCi0gICAgICBjaGVja19yZXN1bHQoIGEuZ2V0KCksIGFyY2hpdmVfd3JpdGVfYWRkX2ZpbHRlcl9ub25lKCBhLmdldCgpICkgKTsKLSAgICAgIGNoZWNrX3Jlc3VsdCggYS5nZXQoKSwgYXJjaGl2ZV93cml0ZV9zZXRfZm9ybWF0X3VzdGFyKCBhLmdldCgpICkgKTsKLQotICAgICAgLy8gYHVzZWQnIG1heSBub3QgYmUgY29ycmVjdCB1bnRpbCBhZnRlciB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0gICAgICBzaXplX3QgIHVzZWQgPSAweGJhZGJlZWY7Ci0gICAgICBjaGVja19yZXN1bHQoIGEuZ2V0KCksIGFyY2hpdmVfd3JpdGVfb3Blbl9tZW1vcnkoIGEuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VkICkgKTsKLQotICAgICAgewotICAgICAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZSwKLSAgICAgICAgICAgICAgICAgICBkZWNsdHlwZSAoIGFyY2hpdmVfd3JpdGVfY2xvc2UgKSo+ICBhX29wZW4oIGEuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3dyaXRlX2Nsb3NlICk7Ci0KLSAgICAgICAgaW50ICBmaWxlX2luZGV4ID0gMDsKLSAgICAgICAgZm9yICggY29uc3QgYXV0byYgIGZpbGUgOiBmaWxlcyApCi0gICAgICAgIHsKLSAgICAgICAgICB1bmlxdWVfcHRyPHN0cnVjdCAgYXJjaGl2ZV9lbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlICggYXJjaGl2ZV9lbnRyeV9mcmVlICkqPgotICAgICAgICAgICAgZSggYXJjaGl2ZV9lbnRyeV9uZXcyKCBhX29wZW4uZ2V0KCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9lbnRyeV9mcmVlICk7Ci0KLSAgICAgICAgICBjaGFyICBuYW1lX2J1ZmZlclsxMDBdOwotICAgICAgICAgIHNucHJpbnRmKCBuYW1lX2J1ZmZlciwgMTAwLCAiZmlsZSVkIiwgZmlsZV9pbmRleCsrICk7Ci0KLSAgICAgICAgICBhcmNoaXZlX2VudHJ5X3NldF9wYXRobmFtZSggZS5nZXQoKSwgbmFtZV9idWZmZXIgKTsKLSAgICAgICAgICBhcmNoaXZlX2VudHJ5X3NldF9zaXplKCBlLmdldCgpLCBmaWxlLnNpemUoKSApOwotICAgICAgICAgIGFyY2hpdmVfZW50cnlfc2V0X2ZpbGV0eXBlKCBlLmdldCgpLCBBRV9JRlJFRyApOwotICAgICAgICAgIGFyY2hpdmVfZW50cnlfc2V0X3Blcm0oIGUuZ2V0KCksIDA2NDQgKTsKLQotICAgICAgICAgIGNoZWNrX3Jlc3VsdCggYV9vcGVuLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV93cml0ZV9oZWFkZXIoIGFfb3Blbi5nZXQoKSwgZS5nZXQoKSApICk7Ci0gICAgICAgICAgYXJjaGl2ZV93cml0ZV9kYXRhKCBhX29wZW4uZ2V0KCksIGZpbGUuZGF0YSgpLCBmaWxlLnNpemUoKSApOwotICAgICAgICAgIGNoZWNrX3Jlc3VsdCggYV9vcGVuLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV93cml0ZV9maW5pc2hfZW50cnkoIGFfb3Blbi5nZXQoKSApICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHVzZWQ7Ci0gICAgfQotCi0KLSAgICAvLyBDcm9zcyBgRGF0YTEnIGFuZCBgRGF0YTInLCB3cml0ZSB1cCB0byBgTWF4T3V0U2l6ZScgYnl0ZXMgaW50byBgT3V0JywKLSAgICAvLyByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCB3aGljaCBzaG91bGQgYmUgcG9zaXRpdmUuCi0gICAgdmlydHVhbCBzaXplX3QKLSAgICBDcm9zc092ZXIoIGNvbnN0IHVpbnQ4X3QqICBEYXRhMSwKLSAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBTaXplMSwKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqICBEYXRhMiwKLSAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBTaXplMiwKLSAgICAgICAgICAgICAgIHVpbnQ4X3QqICAgICAgICBPdXQsCi0gICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgTWF4T3V0U2l6ZSApCi0gICAgewotICAgICAgcmV0dXJuIGZ1enplcjo6VXNlclN1cHBsaWVkRnV6emVyOjpDcm9zc092ZXIoIERhdGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhPdXRTaXplICk7Ci0gICAgfQotCi0gIH07IC8vIGVuZCBvZiBGVEZ1enplciBjbGFzcwotCi0KLSAgaW50Ci0gIG1haW4oIGludCAgICAgYXJnYywKLSAgICAgICAgY2hhciogICphcmd2ICkKLSAgewotICAgIGZ1enplcjo6RnV6emVyUmFuZG9tTGliYyAgUmFuZCggMCApOwotICAgIEZURnV6emVyICAgICAgICAgICAgICAgICAgRiggJlJhbmQgKTsKLQotICAgIGZ1enplcjo6RnV6emVyRHJpdmVyKCBhcmdjLCBhcmd2LCBGICk7Ci0gIH0KLQotCi0vLyBFTkQKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdGZ1enplci9yYXN0ZXJmdXp6ZXIuY2MgYi9zcmMvdG9vbHMvZnRmdXp6ZXIvcmFzdGVyZnV6emVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjliOTVlLi4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdGZ1enplci9yYXN0ZXJmdXp6ZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLy8gcmFzdGVyZnV6emVyLmNjCi0vLwotLy8gICBBIGZ1enppbmcgZnVuY3Rpb24gdG8gdGVzdCBGcmVlVHlwZSdzIHJhc3Rlcml6ZXJzIHdpdGggbGliRnV6emVyLgotLy8KLS8vIENvcHlyaWdodCAyMDE2LTIwMTggYnkKLS8vIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCi0vLyBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAotLy8gbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCi0vLyB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLS8vIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KLQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLQotICB1c2luZyBuYW1lc3BhY2Ugc3RkOwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLQotCi0gIHN0YXRpYyBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICBzdGF0aWMgaW50ICAgICAgICAgSW5pdFJlc3VsdDsKLQotCi0gIHN0cnVjdCBGVF9HbG9iYWwgewotICAgIEZUX0dsb2JhbCgpIHsKLSAgICAgIEluaXRSZXN1bHQgPSBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgIH0KLSAgICB+RlRfR2xvYmFsKCkgewotICAgICAgRlRfRG9uZV9GcmVlVHlwZSggbGlicmFyeSApOwotICAgIH0KLSAgfTsKLQotICBGVF9HbG9iYWwgIGdsb2JhbF9mdDsKLQotCi0gIGV4dGVybiAiQyIgaW50Ci0gIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoIGNvbnN0IHVpbnQ4X3QqICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZV8gKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAgcGl4ZWxzWzRdOwotCi0gICAgRlRfQml0bWFwICBiaXRtYXBfbW9ubyA9IHsKLSAgICAgIDEsICAgICAgICAgICAgICAgICAgLy8gcm93cwotICAgICAgMSwgICAgICAgICAgICAgICAgICAvLyB3aWR0aAotICAgICAgNCwgICAgICAgICAgICAgICAgICAvLyBwaXRjaAotICAgICAgcGl4ZWxzLCAgICAgICAgICAgICAvLyBidWZmZXIKLSAgICAgIDIsICAgICAgICAgICAgICAgICAgLy8gbnVtX2dyYXlzCi0gICAgICBGVF9QSVhFTF9NT0RFX01PTk8sIC8vIHBpeGVsX21vZGUKLSAgICAgIDAsICAgICAgICAgICAgICAgICAgLy8gcGFsZXR0ZV9tb2RlCi0gICAgICBOVUxMICAgICAgICAgICAgICAgIC8vIHBhbGV0dGUKLSAgICB9OwotCi0gICAgRlRfQml0bWFwICBiaXRtYXBfZ3JheSA9IHsKLSAgICAgIDEsICAgICAgICAgICAgICAgICAgLy8gcm93cwotICAgICAgMSwgICAgICAgICAgICAgICAgICAvLyB3aWR0aAotICAgICAgNCwgICAgICAgICAgICAgICAgICAvLyBwaXRjaAotICAgICAgcGl4ZWxzLCAgICAgICAgICAgICAvLyBidWZmZXIKLSAgICAgIDI1NiwgICAgICAgICAgICAgICAgLy8gbnVtX2dyYXlzCi0gICAgICBGVF9QSVhFTF9NT0RFX0dSQVksIC8vIHBpeGVsX21vZGUKLSAgICAgIDAsICAgICAgICAgICAgICAgICAgLy8gcGFsZXR0ZV9tb2RlCi0gICAgICBOVUxMICAgICAgICAgICAgICAgIC8vIHBhbGV0dGUKLSAgICB9OwotCi0gICAgY29uc3Qgc2l6ZV90IHZzaXplID0gc2l6ZW9mICggRlRfVmVjdG9yICk7Ci0gICAgY29uc3Qgc2l6ZV90IHRzaXplID0gc2l6ZW9mICggY2hhciApOwotCi0gICAgLy8gd2UgdXNlIHRoZSBpbnB1dCBkYXRhIGZvciBib3RoIHBvaW50cyBhbmQgdGFncwotICAgIHNob3J0ICBuX3BvaW50cyA9IHNob3J0KCBzaXplXyAvICggdnNpemUgKyB0c2l6ZSApICk7Ci0gICAgaWYgKCBuX3BvaW50cyA8PSAyICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnRzID0gcmVpbnRlcnByZXRfY2FzdDxGVF9WZWN0b3IqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICkgKTsKLSAgICBjaGFyKiAgICAgICB0YWdzICAgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2l6ZV90KCBuX3BvaW50cyApICogdnNpemUgKSApOwotCi0gICAgLy8gdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaW52YWxpZCBvdXRsaW5lcyB0aGF0IGFyZSBpbW1lZGlhdGVseQotICAgIC8vIHJlamVjdGVkIGluIGBGVF9PdXRsaW5lX1JlbmRlcicsIGxpbWl0IHZhbHVlcyB0byAyXjE4IHBpeGVscwotICAgIC8vIChpLmUuLCAyXjI0IGJpdHMpCi0gICAgZm9yICggc2hvcnQgIGkgPSAwOyBpIDwgbl9wb2ludHM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBwb2ludHNbaV0ueCA9PSBMT05HX01JTiApCi0gICAgICAgIHBvaW50c1tpXS54ID0gMDsKLSAgICAgIGVsc2UgaWYgKCBwb2ludHNbaV0ueCA8IDAgKQotICAgICAgICBwb2ludHNbaV0ueCA9IC0oIC1wb2ludHNbaV0ueCAmIDB4RkZGRkZGICkgLSAxOwotICAgICAgZWxzZQotICAgICAgICBwb2ludHNbaV0ueCA9ICggcG9pbnRzW2ldLnggJiAweEZGRkZGRiApICsgMTsKLQotICAgICAgaWYgKCBwb2ludHNbaV0ueSA9PSBMT05HX01JTiApCi0gICAgICAgIHBvaW50c1tpXS55ID0gMDsKLSAgICAgIGVsc2UgaWYgKCBwb2ludHNbaV0ueSA8IDAgKQotICAgICAgICBwb2ludHNbaV0ueSA9IC0oIC1wb2ludHNbaV0ueSAmIDB4RkZGRkZGICkgLSAxOwotICAgICAgZWxzZQotICAgICAgICBwb2ludHNbaV0ueSA9ICggcG9pbnRzW2ldLnkgJiAweEZGRkZGRiApICsgMTsKLSAgICB9Ci0KLSAgICBzaG9ydCAgY29udG91cnNbMV07Ci0gICAgY29udG91cnNbMF0gPSBuX3BvaW50cyAtIDE7Ci0KLSAgICBGVF9PdXRsaW5lICBvdXRsaW5lID0KLSAgICB7Ci0gICAgICAxLCAgICAgICAgICAgICAgIC8vIG5fY29udG91cnMKLSAgICAgIG5fcG9pbnRzLCAgICAgICAgLy8gbl9wb2ludHMKLSAgICAgIHBvaW50cywgICAgICAgICAgLy8gcG9pbnRzCi0gICAgICB0YWdzLCAgICAgICAgICAgIC8vIHRhZ3MKLSAgICAgIGNvbnRvdXJzLCAgICAgICAgLy8gY29udG91cnMKLSAgICAgIEZUX09VVExJTkVfTk9ORSAgLy8gZmxhZ3MKLSAgICB9OwotCi0gICAgRlRfT3V0bGluZV9HZXRfQml0bWFwKCBsaWJyYXJ5LCAmb3V0bGluZSwgJmJpdG1hcF9tb25vICk7Ci0gICAgRlRfT3V0bGluZV9HZXRfQml0bWFwKCBsaWJyYXJ5LCAmb3V0bGluZSwgJmJpdG1hcF9ncmF5ICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLS8vIEVORApkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL2Z0ZnV6emVyL3J1bmlucHV0LmNjIGIvc3JjL3Rvb2xzL2Z0ZnV6emVyL3J1bmlucHV0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAyZjU3Li4wMDAwMDAwCi0tLSBhL3NyYy90b29scy9mdGZ1enplci9ydW5pbnB1dC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIHJ1bmlucHV0LmNjCi0vLwotLy8gICBBIGBtYWluJyBmdW5jdGlvbiBmb3IgZnV6emVycyBsaWtlIGBmdGZ1enplci5jYycuCi0vLwotLy8gQ29weXJpZ2h0IDIwMTUtMjAxOCBieQotLy8gRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotLy8KLS8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKLS8vIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0Ci0vLyBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKLS8vIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAotLy8gdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0KLSAgZXh0ZXJuICJDIiB2b2lkCi0gIExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoIGNvbnN0IHVpbnQ4X3QqICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSApOwotCi0KLSAgdW5zaWduZWQgY2hhciBhWzEgPDwgMjRdOwotCi0KLSAgaW50Ci0gIG1haW4oIGludCAgICAgYXJnYywKLSAgICAgICAgY2hhciogICphcmd2ICkKLSAgewotICAgIGFzc2VydCggYXJnYyA+PSAyICk7Ci0KLSAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKysgKQotICAgIHsKLSAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBhcmd2W2ldICk7Ci0KLSAgICAgIEZJTEUqICBmID0gZm9wZW4oIGFyZ3ZbaV0sICJyIiApOwotICAgICAgYXNzZXJ0KCBmICk7Ci0KLSAgICAgIHNpemVfdCAgbiA9IGZyZWFkKCBhLCAxLCBzaXplb2YgKCBhICksIGYgKTsKLSAgICAgIGZjbG9zZSggZiApOwotICAgICAgaWYgKCAhbiApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICB1bnNpZ25lZCBjaGFyKiAgYiA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoIG4gKTsKLSAgICAgIG1lbWNweSggYiwgYSwgbiApOwotCi0gICAgICBMTFZNRnV6emVyVGVzdE9uZUlucHV0KCBiLCBuICk7Ci0KLSAgICAgIGZyZWUoIGIgKTsKLSAgICB9Ci0gIH0KLQotCi0vLyBFTkQKZGlmZiAtLWdpdCBhL3NyYy90b29scy9mdHJhbmRvbS9mdHJhbmRvbS5jIGIvc3JjL3Rvb2xzL2Z0cmFuZG9tL2Z0cmFuZG9tLmMKaW5kZXggYWI1Y2ZjOS4uYWI2MjQyOSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL2Z0cmFuZG9tL2Z0cmFuZG9tLmMKKysrIGIvc3JjL3Rvb2xzL2Z0cmFuZG9tL2Z0cmFuZG9tLmMKQEAgLTQ1LDggKzQ1LDggQEAKICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnJlZXR5cGUuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CiAKICNkZWZpbmUgdHJ1ZSAgICAgMQogI2RlZmluZSBmYWxzZSAgICAwCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvZ2xuYW1lcy5weSBiL3NyYy90b29scy9nbG5hbWVzLnB5CmluZGV4IGIwNDhkMjkuLmExOWNlMTcgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9nbG5hbWVzLnB5CisrKyBiL3NyYy90b29scy9nbG5hbWVzLnB5CkBAIC02LDcgKzYsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC01MzEwLDI0ICs1MzEwLDI0IEBACiAgIG1hY19leHRyYXNfY291bnQgPSBsZW4oIG1hY19leHRyYXMgKQogICBiYXNlX2xpc3QgICAgICAgID0gbWFjX2V4dHJhcyArIHNpZF9zdGFuZGFyZF9uYW1lcwogCi0gIHdyaXRlKCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiIgKQotICB3cml0ZSggIi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKKyAgd3JpdGUoICIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIiApCisgIHdyaXRlKCAiICpcbiIgKQogCi0gIHdyaXRlKCAiLyogICUtNzFzKi9cbiIgJSBvcy5wYXRoLmJhc2VuYW1lKCBzeXMuYXJndlsxXSApICkKKyAgd3JpdGUoICIgKiAlLTcxc1xuIiAlIG9zLnBhdGguYmFzZW5hbWUoIHN5cy5hcmd2WzFdICkgKQogCi0gIHdyaXRlKCAiLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIENvcHlyaWdodCAyMDA1LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi9cbiIgKQotICB3cml0ZSggIi8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4iICkKLSAgd3JpdGUoICIvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuIiApCi0gIHdyaXRlKCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiIgKQorICB3cml0ZSggIiAqXG4iICkKKyAgd3JpdGUoICIgKiAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuXG4iICkKKyAgd3JpdGUoICIgKlxuIiApCisgIHdyaXRlKCAiICogQ29weXJpZ2h0IDIwMDUtMjAxOSBieVxuIiApCisgIHdyaXRlKCAiICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLlxuIiApCisgIHdyaXRlKCAiICpcbiIgKQorICB3cml0ZSggIiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCxcbiIgKQorICB3cml0ZSggIiAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0XG4iICkKKyAgd3JpdGUoICIgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGVcbiIgKQorICB3cml0ZSggIiAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZFxuIiApCisgIHdyaXRlKCAiICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LlxuIiApCisgIHdyaXRlKCAiICpcbiIgKQorICB3cml0ZSggIiAqL1xuIiApCiAgIHdyaXRlKCAiXG4iICkKICAgd3JpdGUoICJcbiIgKQogICB3cml0ZSggIiAgLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IC0tIGRvIG5vdCBlZGl0ISAqL1xuIiApCkBAIC01MzYxLDEyICs1MzYxLDEyIEBACiAKICAgd3JpdGUoICIiIlwKICAgLyoKLSAgICogIFRoaXMgdGFibGUgaXMgYSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIEFkb2JlIEdseXBoIExpc3QgKEFHTCksCi0gICAqICBvcHRpbWl6ZWQgZm9yIGVmZmljaWVudCBzZWFyY2hpbmcuICBJdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlCi0gICAqICBgZ2xuYW1lcy5weScgcHl0aG9uIHNjcmlwdCBsb2NhdGVkIGluIHRoZSBgc3JjL3Rvb2xzJyBkaXJlY3RvcnkuCisgICAqIFRoaXMgdGFibGUgaXMgYSBjb21wcmVzc2VkIHZlcnNpb24gb2YgdGhlIEFkb2JlIEdseXBoIExpc3QgKEFHTCksCisgICAqIG9wdGltaXplZCBmb3IgZWZmaWNpZW50IHNlYXJjaGluZy4gIEl0IGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUKKyAgICogYGdsbmFtZXMucHknIHB5dGhvbiBzY3JpcHQgbG9jYXRlZCBpbiB0aGUgYHNyYy90b29scycgZGlyZWN0b3J5LgogICAgKgotICAgKiAgVGhlIGxvb2t1cCBmdW5jdGlvbiB0byBnZXQgdGhlIFVuaWNvZGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3RyaW5nCi0gICAqICBpcyBkZWZpbmVkIGJlbG93IHRoZSB0YWJsZS4KKyAgICogVGhlIGxvb2t1cCBmdW5jdGlvbiB0byBnZXQgdGhlIFVuaWNvZGUgdmFsdWUgZm9yIGEgZ2l2ZW4gc3RyaW5nCisgICAqIGlzIGRlZmluZWQgYmVsb3cgdGhlIHRhYmxlLgogICAgKi8KIAogI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVApAQCAtNTM4MCw3ICs1MzgwLDcgQEAKICAgd3JpdGUoICIiIlwKICNpZmRlZiAgREVGSU5FX1BTX1RBQkxFUwogICAvKgotICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY29tcHJlc3NlZCB0YWJsZSBlZmZpY2llbnRseS4KKyAgICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY29tcHJlc3NlZCB0YWJsZSBlZmZpY2llbnRseS4KICAgICovCiAgIHN0YXRpYyB1bnNpZ25lZCBsb25nCiAgIGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggY29uc3QgY2hhciogIG5hbWUsCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvbWFrZV9kaXN0cmlidXRpb25fYXJjaGl2ZXMucHkgYi9zcmMvdG9vbHMvbWFrZV9kaXN0cmlidXRpb25fYXJjaGl2ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjI5ZWIxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90b29scy9tYWtlX2Rpc3RyaWJ1dGlvbl9hcmNoaXZlcy5weQpAQCAtMCwwICsxLDIwOCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworIiIiR2VuZXJhdGUgZGlzdHJpYnV0aW9uIGFyY2hpdmVzIGZvciBhIGdpdmVuIEZyZWVUeXBlIDIgcmVsZWFzZS4iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorCitfVE9QX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4oX19maWxlX18sICIuLiIsICIuLiIsICIuLiIpKQorX1NDUklQVF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5qb2luKF9UT1BfRElSLCAiYnVpbGRzIiwgIm1lc29uIiwgIiIpKQorCisKK2RlZiBnZXRfY21kX291dHB1dChjbWQsIGN3ZD1Ob25lKToKKyAgICAiIiJSdW4gYSBjb21tYW5kIGFuZCByZXR1cm4gaXRzIG91dHB1dCBhcyBhIHN0cmluZy4iIiIKKyAgICBpZiBjd2QgaXMgbm90IE5vbmU6CisgICAgICAgIG91dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KGNtZCwgY3dkPWN3ZCkKKyAgICBlbHNlOgorICAgICAgICBvdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChjbWQpCisgICAgcmV0dXJuIG91dC5kZWNvZGUoInV0Zi04IikucnN0cmlwKCkKKworCitkZWYgaXNfZ2l0X2Rpcl9jbGVhbihnaXRfZGlyKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZmYgfGdpdF9kaXJ8IGlzIGEgZ2l0IGRpcmVjdG9yeSBpbiBjbGVhbiBzdGF0ZS4iIiIKKyAgICBvdXQgPSBnZXRfY21kX291dHB1dChbImdpdCIsICJzdGF0dXMiLCAiLS1wb3JjZWxhaW4iXSwgY3dkPWdpdF9kaXIpCisgICAgcmV0dXJuIGxlbihvdXQpID09IDAKKworCitkZWYgbWFpbigpOgorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1zb3VyY2VfZGlyIiwgZGVmYXVsdD1fVE9QX0RJUiwgaGVscD0iU291cmNlIGRpcmVjdG9yeSBwYXRoLiIKKyAgICApCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS12ZXJzaW9uIiwKKyAgICAgICAgaGVscD0oCisgICAgICAgICAgICAiU3BlY2lmeSBhbHRlcm5hdGUgRnJlZVR5cGUgdmVyc2lvbiAoaXQgaXMgb3RoZXJ3aXNlIGV4dHJhY3RlZCIKKyAgICAgICAgICAgICIgZnJvbSBjdXJyZW50IHNvdXJjZXMgYnkgZGVmYXVsdCkuIgorICAgICAgICApLAorICAgICkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICItLWdudS1jb25maWctZGlyIiwKKyAgICAgICAgaGVscD0oCisgICAgICAgICAgICAiUGF0aCBvZiBpbnB1dCBkaXJlY3RvcnkgY29udGFpbmluZyByZWNlbnQgYGNvbmZpZy5ndWVzc2AgYW5kIgorICAgICAgICAgICAgIiBgY29uZmlnLnN1YmAgZmlsZXMgZnJvbSBHTlUgY29uZmlnLiIKKyAgICAgICAgKSwKKyAgICApCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1idWlsZC1kaXIiLAorICAgICAgICBoZWxwPSJTcGVjaWZ5IGJ1aWxkIGRpcmVjdG9yeS4gT25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgdGhpcyBzY3JpcHQuIiwKKyAgICApCisKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAiLS1pZ25vcmUtY2xlYW4tY2hlY2siLAorICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICBoZWxwPSgKKyAgICAgICAgICAgICJEbyBub3QgY2hlY2sgZm9yIGEgY2xlYW4gc291cmNlIGdpdCByZXBvc2l0b3J5LiBPbmx5IHVzZWQgZm9yIgorICAgICAgICAgICAgIiBkZWJ1Z2dpbmcgdGhpcyBzY3JpcHQuIgorICAgICAgICApLAorICAgICkKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICJvdXRwdXRfZGlyIiwgaGVscD0iT3V0cHV0IGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIGFyY2hpdmVzLiIKKyAgICApCisKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgZ2l0X2RpciA9IGFyZ3Muc291cmNlX2RpciBpZiBhcmdzLnNvdXJjZV9kaXIgZWxzZSBfVE9QX0RJUgorICAgIGlmIG5vdCBhcmdzLmlnbm9yZV9jbGVhbl9jaGVjayBhbmQgbm90IGlzX2dpdF9kaXJfY2xlYW4oZ2l0X2Rpcik6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCisgICAgICAgICAgICAiRVJST1I6IFlvdXIgZ2l0IHJlcG9zaXRvcnkgaXMgbm90IGluIGEgY2xlYW4gc3RhdGU6ICVzXG4iCisgICAgICAgICAgICAlIGdpdF9kaXIKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gMQorCisgICAgaWYgYXJncy52ZXJzaW9uOgorICAgICAgICB2ZXJzaW9uID0gYXJncy52ZXJzaW9uCisgICAgZWxzZToKKyAgICAgICAgIyBFeHRyYWN0IEZyZWVUeXBlIHZlcnNpb24gZnJvbSBzb3VyY2VzLgorICAgICAgICB2ZXJzaW9uID0gZ2V0X2NtZF9vdXRwdXQoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKF9TQ1JJUFRfRElSLCAiZXh0cmFjdF9mcmVldHlwZV92ZXJzaW9uLnB5IiksCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKF9UT1BfRElSLCAiaW5jbHVkZSIsICJmcmVldHlwZSIsICJmcmVldHlwZS5oIiksCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgICMgRGV0ZXJtaW5lIHRoZSBidWlsZCBkaXJlY3RvcnkuIFRoaXMgd2lsbCBiZSBhIHRlbXBvcmFyeSBmaWxlIHRoYXQgaXMKKyAgICAjIGNsZWFuZWQgdXAgb24gc2NyaXB0IGV4aXQgYnkgZGVmYXVsdCwgdW5sZXNzIC0tYnVpbGQtZGlyPURJUiBpcyB1c2VkLAorICAgICMgaW4gd2hpY2ggY2FzZSB3ZSBvbmx5IGNyZWF0ZSBhbmQgZW1wdHkgdGhlIGRpcmVjdG9yeSwgYnV0IG5ldmVyIHJlbW92ZQorICAgICMgaXRzIGNvbnRlbnQgb24gZXhpdC4KKyAgICBpZiBhcmdzLmJ1aWxkX2RpcjoKKyAgICAgICAgYnVpbGRfZGlyID0gYXJncy5idWlsZF9kaXIKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJ1aWxkX2Rpcik6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJlbW92ZSBhbnl0aGluZyBmcm9tIHRoZSBidWlsZCBkaXJlY3RvcnksIGlmIGFueS4KKyAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIoYnVpbGRfZGlyKToKKyAgICAgICAgICAgICAgICBmaWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBpdGVtKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZV9wYXRoKToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmaWxlX3BhdGgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVfcGF0aCkKKyAgICBlbHNlOgorICAgICAgICAjIENyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBlbnN1cmUgaXQgaXMgcmVtb3ZlZCBvbiBleGl0LgorICAgICAgICBidWlsZF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iZnJlZXR5cGUtZGlzdC0iKQorCisgICAgICAgIGRlZiBjbGVhbl9idWlsZF9kaXIoKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoYnVpbGRfZGlyKQorCisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihjbGVhbl9idWlsZF9kaXIpCisKKyAgICAjIENvcHkgYWxsIHNvdXJjZSBmaWxlcyBrbm93biB0byBnaXQgaW50byAkQlVJTERfRElSL2ZyZWV0eXBlLSRWRVJTSU9OCisgICAgIyB3aXRoIHRoZSBleGNlcHRpb24gb2YgLmdpdGlnbm9yZSBhbmQgLm1haWxtYXAgZmlsZXMuCisgICAgc291cmNlX2ZpbGVzID0gWworICAgICAgICBmCisgICAgICAgIGZvciBmIGluIGdldF9jbWRfb3V0cHV0KFsiZ2l0IiwgImxzLWZpbGVzIl0sIGN3ZD1naXRfZGlyKS5zcGxpdCgiXG4iKQorICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKGYpIG5vdCBpbiAoIi5naXRpZ25vcmUiLCAiLm1haWxtYXAiKQorICAgIF0KKworICAgIGZyZWV0eXBlX2RpciA9ICJmcmVldHlwZS0iICsgdmVyc2lvbgorICAgIHRtcF9zcmNfZGlyID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZnJlZXR5cGVfZGlyKQorICAgIG9zLm1ha2VkaXJzKHRtcF9zcmNfZGlyKQorCisgICAgZm9yIHNyYyBpbiBzb3VyY2VfZmlsZXM6CisgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbih0bXBfc3JjX2Rpciwgc3JjKQorICAgICAgICBkc3RfZGlyID0gb3MucGF0aC5kaXJuYW1lKGRzdCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgorICAgICAgICAgICAgb3MubWFrZWRpcnMoZHN0X2RpcikKKyAgICAgICAgc2h1dGlsLmNvcHkob3MucGF0aC5qb2luKGdpdF9kaXIsIHNyYyksIGRzdCkKKworICAgICMgUnVuIGF1dG9nZW4uc2ggaW4gZGlyZWN0b3J5LgorICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbIi9iaW4vc2giLCAiYXV0b2dlbi5zaCJdLCBjd2Q9dG1wX3NyY19kaXIpCisgICAgc2h1dGlsLnJtdHJlZSgKKyAgICAgICAgb3MucGF0aC5qb2luKHRtcF9zcmNfZGlyLCAiYnVpbGRzIiwgInVuaXgiLCAiYXV0b200dGUuY2FjaGUiKQorICAgICkKKworICAgICMgQ29weSBjb25maWcuZ3Vlc3MgYW5kIGNvbmZpZy5zdWIgaWYgcG9zc2libGUhCisgICAgaWYgYXJncy5nbnVfY29uZmlnX2RpcjoKKyAgICAgICAgZm9yIGYgaW4gKCJjb25maWcuZ3Vlc3MiLCAiY29uZmlnLnN1YiIpOgorICAgICAgICAgICAgc2h1dGlsLmNvcHkoCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGFyZ3MuZ251X2NvbmZpZ19kaXIsIGYpLAorICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbih0bXBfc3JjX2RpciwgImJ1aWxkcyIsICJ1bml4IiwgZiksCisgICAgICAgICAgICApCisKKyAgICAjIEdlbmVyYXRlIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uIHVuZGVyIGRvY3MvCisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgICBbCisgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihfU0NSSVBUX0RJUiwgImdlbmVyYXRlX3JlZmVyZW5jZV9kb2NzLnB5IiksCisgICAgICAgICAgICAiLS1pbnB1dC1kaXIiLAorICAgICAgICAgICAgdG1wX3NyY19kaXIsCisgICAgICAgICAgICAiLS12ZXJzaW9uIiwKKyAgICAgICAgICAgIHZlcnNpb24sCisgICAgICAgICAgICAiLS1vdXRwdXQtZGlyIiwKKyAgICAgICAgICAgIG9zLnBhdGguam9pbih0bXBfc3JjX2RpciwgImRvY3MiKSwKKyAgICAgICAgXQorICAgICkKKworICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5qb2luKHRtcF9zcmNfZGlyLCAiZG9jcyIsICJtYXJrZG93biIpKQorICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4odG1wX3NyY19kaXIsICJkb2NzIiwgIm1rZG9jcy55bWwiKSkKKworICAgICMgR2VuZXJhdGUgb3VyIGFyY2hpdmVzCisgICAgZnJlZXR5cGVfdGFyID0gZnJlZXR5cGVfZGlyICsgIi50YXIiCisKKyAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoCisgICAgICAgIFsidGFyIiwgIi1IIiwgInVzdGFyIiwgIi1jaGYiLCBmcmVldHlwZV90YXIsIGZyZWV0eXBlX2Rpcl0sCisgICAgICAgIGN3ZD1idWlsZF9kaXIsCisgICAgKQorCisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgICBbImd6aXAiLCAiLTkiLCAiLS1rZWVwIiwgZnJlZXR5cGVfdGFyXSwgY3dkPWJ1aWxkX2RpcgorICAgICkKKworICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbInh6IiwgIi0ta2VlcCIsIGZyZWV0eXBlX3Rhcl0sIGN3ZD1idWlsZF9kaXIpCisKKyAgICBmdHdpbnZlcnNpb24gPSAiZnQiICsgIiIuam9pbih2ZXJzaW9uLnNwbGl0KCIuIikpCisgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAorICAgICAgICBbInppcCIsICItcWxyOSIsIGZ0d2ludmVyc2lvbiArICIuemlwIiwgZnJlZXR5cGVfZGlyXSwgY3dkPWJ1aWxkX2RpcgorICAgICkKKworICAgICMgQ29weSBmaWxlIHRvIG91dHB1dCBkaXJlY3Rvcnkgbm93LgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmdzLm91dHB1dF9kaXIpOgorICAgICAgICBvcy5tYWtlZGlycyhhcmdzLm91dHB1dF9kaXIpCisKKyAgICBmb3IgZiBpbiAoCisgICAgICAgIGZyZWV0eXBlX3RhciArICIuZ3oiLAorICAgICAgICBmcmVldHlwZV90YXIgKyAiLnh6IiwKKyAgICAgICAgZnR3aW52ZXJzaW9uICsgIi56aXAiLAorICAgICk6CisgICAgICAgIHNodXRpbC5jb3B5KAorICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZiksIG9zLnBhdGguam9pbihhcmdzLm91dHB1dF9kaXIsIGYpCisgICAgICAgICkKKworICAgICMgRG9uZSEKKyAgICByZXR1cm4gMAorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3Rlc3RfYWZtLmMgYi9zcmMvdG9vbHMvdGVzdF9hZm0uYwppbmRleCA4ZGU2MTliLi5hNGIyMjY4IDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvdGVzdF9hZm0uYworKysgYi9zcmMvdG9vbHMvdGVzdF9hZm0uYwpAQCAtMiwxMCArMiw5IEBACiAgKiBnY2MgLURGVDJfQlVJTERfTElCUkFSWSAtSS4uLy4uL2luY2x1ZGUgLW8gdGVzdF9hZm0gdGVzdF9hZm0uYyBcCiAgKiAgICAgLUwuLi8uLi9vYmpzLy5saWJzIC1sZnJlZXR5cGUgLWx6IC1zdGF0aWMKICAqLwotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgogCiAgIHZvaWQgZHVtcF9mb250aW5mbyggQUZNX0ZvbnRJbmZvICBmaSApCiAgIHsKZGlmZiAtLWdpdCBhL3NyYy90b29scy90ZXN0X2Jib3guYyBiL3NyYy90b29scy90ZXN0X2Jib3guYwppbmRleCA2NGI4MmMzLi5kOWZkOTMyIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvdGVzdF9iYm94LmMKKysrIGIvc3JjL3Rvb2xzL3Rlc3RfYmJveC5jCkBAIC0xLDYgKzEsNSBAQAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9CQk9YX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0YmJveC5oPgogCiAKICNpbmNsdWRlIDx0aW1lLmg+ICAgIC8qIGZvciBjbG9jaygpICovCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvdGVzdF90cmlnLmMgYi9zcmMvdG9vbHMvdGVzdF90cmlnLmMKaW5kZXggOTlhYzFjZi4uNGYzNDEwYSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3Rlc3RfdHJpZy5jCisrKyBiL3NyYy90b29scy90ZXN0X3RyaWcuYwpAQCAtMSw2ICsxLDUgQEAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mcmVldHlwZS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+CiAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KZGlmZiAtLWdpdCBhL3NyYy90b29scy91cGRhdGUtY29weXJpZ2h0LXllYXIgYi9zcmMvdG9vbHMvdXBkYXRlLWNvcHlyaWdodC15ZWFyCmluZGV4IDkzNGYxMWMuLmM2NTliYmEgMTAwNzU1Ci0tLSBhL3NyYy90b29scy91cGRhdGUtY29weXJpZ2h0LXllYXIKKysrIGIvc3JjL3Rvb2xzL3VwZGF0ZS1jb3B5cmlnaHQteWVhcgpAQCAtMiw3ICsyLDcgQEAKICAgJiBldmFsICdleGVjIHBlcmwgLXdTIC1pICIkMCIgJGFyZ3Y6cScKICAgICBpZiAwOwogCi0jIENvcHlyaWdodCAyMDE1LTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDE1LTIwMjAgYnkKICMgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC02Nyw3ICs2Nyw4IEBACiAgICAgcyB7CiAgICAgICAgICg/PGJlZ2luPi4qKQogICAgICAgICBDb3B5cmlnaHQKLSAgICAgICAgKD88c3BhY2UxPlwgKykKKyAgICAgICAgKD88c3BhY2UxPihcICsKKyAgICAgICAgICAgICAgICAgICB8IFwgK1woQ1wpXCArKSkKICAgICAgICAgKD88Zmlyc3Q+WzEyXVswLTldWzAtOV1bMC05XSkKICAgICAgICAgKD88bWlkZGxlPi4rKQogICAgICAgICAoPzxsYXN0PlsxMl1bMC05XVswLTldWzAtOV0pCkBAIC03OCwxNCArNzksMTUgQEAKICAgICAgIH0KICAgICAgIHsKICAgICAgICAgIyBGaWxsIGxpbmUgdG8gdGhlIHNhbWUgbGVuZ3RoIChpZiBhcHByb3ByaWF0ZSk7IHdlIHNraXAgdGhlIG1pZGRsZQotICAgICAgICAjIHBhcnQgYnV0IGluc2VydCB0d28gc3BhY2VzIGFuZCBgLScuCisgICAgICAgICMgcGFydCBidXQgaW5zZXJ0IGAoQyknLCB0aHJlZSBzcGFjZXMsIGFuZCBgLScuCiAgICAgICAgIG15ICRzcGFjZSA9IGxlbmd0aCgkK3tzcGFjZTF9KSAtIDEKICAgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJCt7bWlkZGxlfSkgLSAxCiAgICAgICAgICAgICAgICAgICAgICsgbGVuZ3RoKCQre3NwYWNlMn0pIC0gMQotICAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkK3tzcGFjZTN9KTsKKyAgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJCt7c3BhY2UzfSkKKyAgICAgICAgICAgICAgICAgICAgLSAobGVuZ3RoKCIoQykiKSArIDEpOwogCiAgICAgICAgIHByaW50ICIkK3tiZWdpbn0iOwotICAgICAgICBwcmludCAiQ29weXJpZ2h0XCAkK3tmaXJzdH0tJHllYXJcIGJ5IjsKKyAgICAgICAgcHJpbnQgIkNvcHlyaWdodFwgKEMpXCAkK3tmaXJzdH0tJHllYXJcIGJ5IjsKICAgICAgICAgcHJpbnQgJyAnIHggJHNwYWNlIGlmIGxlbmd0aCgkK3tlbmR9KTsKICAgICAgICAgcHJpbnQgIiQre2VuZH1cbiI7CiAgICAgICAgICRyZXBsYWNlZCA9IDE7CkBAIC05NSw3ICs5Nyw4IEBACiAgICAgcyB7CiAgICAgICAgICg/PGJlZ2luPi4qKQogICAgICAgICBDb3B5cmlnaHQKLSAgICAgICAgKD88c3BhY2UxPlwgKykKKyAgICAgICAgKD88c3BhY2UxPihcICsKKyAgICAgICAgICAgICAgICAgICB8IFwgK1woQ1wpXCArKSkKICAgICAgICAgKD88Zmlyc3Q+WzEyXVswLTldWzAtOV1bMC05XSkKICAgICAgICAgKD88c3BhY2UyPlwgKykKICAgICAgICAgYnkKQEAgLTEwMyw3ICsxMDYsNyBAQAogICAgICAgICAoPzxlbmQ+LiopCiAgICAgICB9CiAgICAgICB7Ci0gICAgICAgICMgRmlsbCBsaW5lIHRvIHRoZSBzYW1lIGxlbmd0aCAoaWYgYXBwcm9wcmlhdGUpOyB3ZSBpbnNlcnQgdHdvCisgICAgICAgICMgRmlsbCBsaW5lIHRvIHRoZSBzYW1lIGxlbmd0aCAoaWYgYXBwcm9wcmlhdGUpOyB3ZSBpbnNlcnQgdGhyZWUKICAgICAgICAgIyBzcGFjZXMsIGEgYC0nLCBhbmQgdGhlIGN1cnJlbnQgeWVhci4KICAgICAgICAgbXkgJHNwYWNlID0gbGVuZ3RoKCQre3NwYWNlMX0pIC0gMQogICAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkK3tzcGFjZTJ9KSAtIDEKQEAgLTExMSw3ICsxMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAtIChsZW5ndGgoJHllYXIpICsgMSk7CiAKICAgICAgICAgcHJpbnQgIiQre2JlZ2lufSI7Ci0gICAgICAgIHByaW50ICJDb3B5cmlnaHQgJCt7Zmlyc3R9LSR5ZWFyIGJ5IjsKKyAgICAgICAgcHJpbnQgIkNvcHlyaWdodFwgKEMpXCAkK3tmaXJzdH0tJHllYXJcIGJ5IjsKICAgICAgICAgIyBJZiAkc3BhY2UgaXMgbmVnYXRpdmUgdGhpcyBpbnNlcnRzIG5vdGhpbmcuCiAgICAgICAgIHByaW50ICcgJyB4ICRzcGFjZSBpZiBsZW5ndGgoJCt7ZW5kfSk7CiAgICAgICAgIHByaW50ICIkK3tlbmR9XG4iOwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL0phbWZpbGUgYi9zcmMvdHJ1ZXR5cGUvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMWZiYS4uMDAwMDAwMAotLS0gYS9zcmMvdHJ1ZXR5cGUvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvdHJ1ZXR5cGUgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHRydWV0eXBlIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSB0dGRyaXZlcgotICAgICAgICAgICAgICAgdHRnbG9hZAotICAgICAgICAgICAgICAgdHRneHZhcgotICAgICAgICAgICAgICAgdHRpbnRlcnAKLSAgICAgICAgICAgICAgIHR0b2JqcwotICAgICAgICAgICAgICAgdHRwaWMKLSAgICAgICAgICAgICAgIHR0cGxvYWQKLSAgICAgICAgICAgICAgIHR0c3VicGl4Ci0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSB0cnVldHlwZSA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy90cnVldHlwZSBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvbW9kdWxlLm1rIGIvc3JjL3RydWV0eXBlL21vZHVsZS5tawppbmRleCAxNmJjOWM4Li4yZDhkMzlkIDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvbW9kdWxlLm1rCisrKyBiL3NyYy90cnVldHlwZS9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS9ydWxlcy5tayBiL3NyYy90cnVldHlwZS9ydWxlcy5tawppbmRleCBlMTYxMTNmLi4yZjZmZWNmIDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvcnVsZXMubWsKKysrIGIvc3JjL3RydWV0eXBlL3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0zMyw3ICszMyw2IEBACiAgICAgICAgICAgICAgICQoVFRfRElSKS90dGd4dmFyLmMgIFwKICAgICAgICAgICAgICAgJChUVF9ESVIpL3R0aW50ZXJwLmMgXAogICAgICAgICAgICAgICAkKFRUX0RJUikvdHRvYmpzLmMgICBcCi0gICAgICAgICAgICAgICQoVFRfRElSKS90dHBpYy5jICAgIFwKICAgICAgICAgICAgICAgJChUVF9ESVIpL3R0cGxvYWQuYyAgXAogICAgICAgICAgICAgICAkKFRUX0RJUikvdHRzdWJwaXguYwogCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyBiL3NyYy90cnVldHlwZS90cnVldHlwZS5jCmluZGV4IDQ4NDM3MDkuLjQxYjY4MDggMTAwNjQ0Ci0tLSBhL3NyYy90cnVldHlwZS90cnVldHlwZS5jCisrKyBiL3NyYy90cnVldHlwZS90cnVldHlwZS5jCkBAIC0xLDMwICsxLDI4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0cnVldHlwZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgVHJ1ZVR5cGUgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0cnVldHlwZS5jCisgKgorICogICBGcmVlVHlwZSBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInR0ZHJpdmVyLmMiICAgLyogZHJpdmVyIGludGVyZmFjZSAgICAqLwogI2luY2x1ZGUgInR0Z2xvYWQuYyIgICAgLyogZ2x5cGggbG9hZGVyICAgICAgICAqLwogI2luY2x1ZGUgInR0Z3h2YXIuYyIgICAgLyogZ3ggZGlzdG9ydGFibGUgZm9udCAqLwogI2luY2x1ZGUgInR0aW50ZXJwLmMiCiAjaW5jbHVkZSAidHRvYmpzLmMiICAgICAvKiBvYmplY3QgbWFuYWdlciAgICAgICovCi0jaW5jbHVkZSAidHRwaWMuYyIKICNpbmNsdWRlICJ0dHBsb2FkLmMiICAgIC8qIHRhYmxlcyBsb2FkZXIgICAgICAgKi8KICNpbmNsdWRlICJ0dHN1YnBpeC5jIgogCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYyBiL3NyYy90cnVldHlwZS90dGRyaXZlci5jCmluZGV4IDgyMGNhZmIuLmJmODMwYjEgMTAwNjQ0Ci0tLSBhL3NyYy90cnVldHlwZS90dGRyaXZlci5jCisrKyBiL3NyYy90cnVldHlwZS90dGRyaXZlci5jCkBAIC0xLDM3ICsxLDM2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgZm9udCBkcml2ZXIgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGRyaXZlci5jCisgKgorICogICBUcnVlVHlwZSBmb250IGRyaXZlciBpbXBsZW1lbnRhdGlvbiAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oPgogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtZXRyaWMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0VOR0lORV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KIAogI2luY2x1ZGUgInR0ZHJpdmVyLmgiCiAjaW5jbHVkZSAidHRnbG9hZC5oIgpAQCAtNDMsMjAgKzQyLDE5IEBACiAKICNpbmNsdWRlICJ0dGVycm9ycy5oIgogCi0jaW5jbHVkZSAidHRwaWMuaCIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRkcml2ZXIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0dGRyaXZlcgogCiAKICAgLyoKLSAgICogIFBST1BFUlRZIFNFUlZJQ0UKKyAgICogUFJPUEVSVFkgU0VSVklDRQogICAgKgogICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCkBAIC0xNjQsMzggKzE2Miw0MiBAQAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dldF9rZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9nZXRfa2VybmluZworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gcmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3bworICAgKiAgIGdseXBocyBvZiB0aGUgc2FtZSBmYWNlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBsZWZ0X2dseXBoIDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4KKyAgICoKKyAgICogICByaWdodF9nbHlwaCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIGtlcm5pbmcgOjoKKyAgICogICAgIFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgaW4gZm9udCB1bml0cyBmb3IKKyAgICogICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzCisgICAqICAgICBmb3JtYXRzLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBOb3RlOgorICAgKiAgIE9ubHkgaG9yaXpvbnRhbCBsYXlvdXRzIChsZWZ0LXRvLXJpZ2h0ICYgcmlnaHQtdG8tbGVmdCkgYXJlCisgICAqICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQKKyAgICogICBrZXJuaW5ncywgYXJlIG91dCBvZiBzY29wZSBvZiB0aGlzIG1ldGhvZCAodGhlIGJhc2ljIGRyaXZlcgorICAgKiAgIGludGVyZmFjZSBpcyBtZWFudCB0byBiZSBzaW1wbGUpLgorICAgKgorICAgKiAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIHR0X2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICB0dGZhY2UsICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCkBAIC0zODQsMzIgKzM4NiwzNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaF9sb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZ2x5cGhfbG9hZAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gbG9hZCBhIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBzbG90IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaAorICAgKiAgICAgd2lsbCBiZSBsb2FkZWQuCisgICAqCisgICAqICAgc2l6ZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIHNpemUgYXQgd2hpY2ggdGhlIGdseXBoCisgICAqICAgICBtdXN0IGJlIHNjYWxlZCwgbG9hZGVkLCBldGMuCisgICAqCisgICAqICAgZ2x5cGhfaW5kZXggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICogICBsb2FkX2ZsYWdzIDo6CisgICAqICAgICBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUKKyAgICogICAgIEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQorICAgKiAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lCisgICAqICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsCisgICAqICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICB0dF9nbHlwaF9sb2FkKCBGVF9HbHlwaFNsb3QgIHR0c2xvdCwgICAgICAvKiBUVF9HbHlwaFNsb3QgKi8KICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICB0dHNpemUsICAgICAgLyogVFRfU2l6ZSAgICAgICovCkBAIC00NjQsNyArNDcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICA/ICZ0dHNpemUtPm1ldHJpY3MKICAgICAgICAgICAgICAgICAgICAgICA6ICZzaXplLT5oaW50ZWRfbWV0cmljczsKIAotICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLworICAgIC8qIG5vdyBmaWxsIGluIHRoZSBnbHlwaCBzbG90IHdpdGggb3V0bGluZS9iaXRtYXAvbGF5ZXJlZCAqLwogICAgIGVycm9yID0gVFRfTG9hZF9HbHlwaCggc2l6ZSwgc2xvdCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKIAogICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAtIGlycmVsZXZhbnQgbm93ICovCkBAIC00OTEsMTcgKzQ5NywxOSBAQAogICBGVF9ERUZJTkVfU0VSVklDRV9NVUxUSU1BU1RFUlNSRUMoCiAgICAgdHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzLAogCi0gICAgKEZUX0dldF9NTV9GdW5jKSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogZ2V0X21tICAgICAgICAgKi8KLSAgICAoRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgICAvKiBzZXRfbW1fZGVzaWduICAqLwotICAgIChGVF9TZXRfTU1fQmxlbmRfRnVuYykgIFRUX1NldF9NTV9CbGVuZCwgICAgICAgIC8qIHNldF9tbV9ibGVuZCAgICovCi0gICAgKEZUX0dldF9NTV9CbGVuZF9GdW5jKSAgVFRfR2V0X01NX0JsZW5kLCAgICAgICAgLyogZ2V0X21tX2JsZW5kICAgKi8KLSAgICAoRlRfR2V0X01NX1Zhcl9GdW5jKSAgICBUVF9HZXRfTU1fVmFyLCAgICAgICAgICAvKiBnZXRfbW1fdmFyICAgICAqLwotICAgIChGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKVRUX1NldF9WYXJfRGVzaWduLCAgICAgIC8qIHNldF92YXJfZGVzaWduICovCi0gICAgKEZUX0dldF9WYXJfRGVzaWduX0Z1bmMpVFRfR2V0X1Zhcl9EZXNpZ24sICAgICAgLyogZ2V0X3Zhcl9kZXNpZ24gKi8KLSAgICAoRlRfU2V0X0luc3RhbmNlX0Z1bmMpICBUVF9TZXRfTmFtZWRfSW5zdGFuY2UsICAvKiBzZXRfaW5zdGFuY2UgICAqLworICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBnZXRfbW0gICAgICAgICAgICAgICovCisgICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNldF9tbV9kZXNpZ24gICAgICAgKi8KKyAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICAgICAgIFRUX1NldF9NTV9CbGVuZCwgICAgICAgLyogc2V0X21tX2JsZW5kICAgICAgICAqLworICAgIChGVF9HZXRfTU1fQmxlbmRfRnVuYykgICAgICAgVFRfR2V0X01NX0JsZW5kLCAgICAgICAvKiBnZXRfbW1fYmxlbmQgICAgICAgICovCisgICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgICAgICBUVF9HZXRfTU1fVmFyLCAgICAgICAgIC8qIGdldF9tbV92YXIgICAgICAgICAgKi8KKyAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYykgICAgIFRUX1NldF9WYXJfRGVzaWduLCAgICAgLyogc2V0X3Zhcl9kZXNpZ24gICAgICAqLworICAgIChGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKSAgICAgVFRfR2V0X1Zhcl9EZXNpZ24sICAgICAvKiBnZXRfdmFyX2Rlc2lnbiAgICAgICovCisgICAgKEZUX1NldF9JbnN0YW5jZV9GdW5jKSAgICAgICBUVF9TZXRfTmFtZWRfSW5zdGFuY2UsIC8qIHNldF9pbnN0YW5jZSAgICAgICAgKi8KKyAgICAoRlRfU2V0X01NX1dlaWdodFZlY3Rvcl9GdW5jKU5VTEwsICAgICAgICAgICAgICAgICAgLyogc2V0X21tX3dlaWdodHZlY3RvciAqLworICAgIChGVF9HZXRfTU1fV2VpZ2h0VmVjdG9yX0Z1bmMpTlVMTCwgICAgICAgICAgICAgICAgICAvKiBnZXRfbW1fd2VpZ2h0dmVjdG9yICovCiAKLSAgICAoRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKSB0dF9nZXRfdmFyX2JsZW5kLCAgICAgICAvKiBnZXRfdmFyX2JsZW5kICAqLwotICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgIHR0X2RvbmVfYmxlbmQgICAgICAgICAgIC8qIGRvbmVfYmxlbmQgICAgICovCisgICAgKEZUX0dldF9WYXJfQmxlbmRfRnVuYykgICAgICB0dF9nZXRfdmFyX2JsZW5kLCAgICAgIC8qIGdldF92YXJfYmxlbmQgICAgICAgKi8KKyAgICAoRlRfRG9uZV9CbGVuZF9GdW5jKSAgICAgICAgIHR0X2RvbmVfYmxlbmQgICAgICAgICAgLyogZG9uZV9ibGVuZCAgICAgICAgICAqLwogICApCiAKICAgRlRfREVGSU5FX1NFUlZJQ0VfTUVUUklDU1ZBUklBVElPTlNSRUMoCkBAIC01NDgsMTkgKzU1NiwxOSBAQAogICAgIHR0X3NlcnZpY2VzLAogCiAgICAgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgICAgIEZUX0ZPTlRfRk9STUFUX1RSVUVUWVBFLAotICAgIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAgICAmVFRfU0VSVklDRV9HWF9NVUxUSV9NQVNURVJTX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX01FVFJJQ1NfVkFSSUFUSU9OUywgJlRUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0dFVCwKKyAgICBGVF9TRVJWSUNFX0lEX01VTFRJX01BU1RFUlMsICAgICAgJnR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycywKKyAgICBGVF9TRVJWSUNFX0lEX01FVFJJQ1NfVkFSSUFUSU9OUywgJnR0X3NlcnZpY2VfbWV0cmljc192YXJpYXRpb25zLAogICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FLCAgICAmdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICAgICZUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAmVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCisgICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICAgICZ0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYsCisgICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICZ0dF9zZXJ2aWNlX3Byb3BlcnRpZXMgKQogI2Vsc2UKICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCgKICAgICB0dF9zZXJ2aWNlcywKIAogICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICBGVF9GT05UX0ZPUk1BVF9UUlVFVFlQRSwKICAgICBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSwgJnR0X3NlcnZpY2VfdHJ1ZXR5cGVfZW5naW5lLAotICAgIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiwgICAgICAgICAmVFRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMsICAgICAgJlRUX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgKQorICAgIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiwgICAgICAgICAmdHRfc2VydmljZV90cnVldHlwZV9nbHlmLAorICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAmdHRfc2VydmljZV9wcm9wZXJ0aWVzICkKICNlbmRpZgogCiAKQEAgLTU3NCwyNiArNTgyLDE1IEBACiAgICAgU0ZOVF9TZXJ2aWNlICAgICAgICAgc2ZudDsKIAogCi0gICAgLyogVFRfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIGlmICggIWRyaXZlciApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotICAgIHJlc3VsdCA9IGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIFRUX1NFUlZJQ0VTX0dFVCwgdHRfaW50ZXJmYWNlICk7CisgICAgcmVzdWx0ID0gZnRfc2VydmljZV9saXN0X2xvb2t1cCggdHRfc2VydmljZXMsIHR0X2ludGVyZmFjZSApOwogICAgIGlmICggcmVzdWx0ICkKICAgICAgIHJldHVybiByZXN1bHQ7CiAKLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKICAgICBpZiAoICFkcml2ZXIgKQogICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKICAgICBpZiAoICFsaWJyYXJ5ICkKICAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCiAKICAgICAvKiBvbmx5IHJldHVybiB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgZnJvbSB0aGUgU0ZOVCBtb2R1bGUgKi8KICAgICBzZm50ZCA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmggYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaAppbmRleCA3MDdhYTY4Li5lZTE0MzhlIDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaApAQCAtMSwzNSArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHJ1ZVR5cGUgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHRkcml2ZXIuaAorICoKKyAqICAgSGlnaC1sZXZlbCBUcnVlVHlwZSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVFREUklWRVJfSF8KICNkZWZpbmUgVFREUklWRVJfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotCiAgIEZUX0RFQ0xBUkVfRFJJVkVSKCB0dF9kcml2ZXJfY2xhc3MgKQogCi0KIEZUX0VORF9IRUFERVIKIAogI2VuZGlmIC8qIFRURFJJVkVSX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaCBiL3NyYy90cnVldHlwZS90dGVycm9ycy5oCmluZGV4IDg4YmNhM2EuLmVmZWFmZDMgMTAwNjQ0Ci0tLSBhL3NyYy90cnVldHlwZS90dGVycm9ycy5oCisrKyBiL3NyYy90cnVldHlwZS90dGVycm9ycy5oCkBAIC0xLDMyICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGVycm9ycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGVycm9ycy5oCisgKgorICogICBUcnVlVHlwZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFRydWVUeXBlIGVycm9yIGVudW1lcmF0aW9uICAgICAgICAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgVHJ1ZVR5cGUgZXJyb3IgZW51bWVyYXRpb24KKyAgICogY29uc3RhbnRzLgorICAgKgorICAgKi8KIAogI2lmbmRlZiBUVEVSUk9SU19IXwogI2RlZmluZSBUVEVSUk9SU19IXwogCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1vZGVyci5oPgogCiAjdW5kZWYgRlRFUlJPUlNfSF8KIApAQCAtMzQsNyArMzQsNyBAQAogI2RlZmluZSBGVF9FUlJfUFJFRklYICBUVF9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfVHJ1ZVR5cGUKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAjZW5kaWYgLyogVFRFUlJPUlNfSF8gKi8KIApkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0Z2xvYWQuYyBiL3NyYy90cnVldHlwZS90dGdsb2FkLmMKaW5kZXggMzlkOWMzZi4uMWRkMzE5ZCAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0Z2xvYWQuYworKysgYi9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCkBAIC0xLDMxICsxLDMxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGdsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGdsb2FkLmMKKyAqCisgKiAgIFRydWVUeXBlIEdseXBoIExvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAjaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9MSVNUX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGxpc3QuaD4KIAogI2luY2x1ZGUgInR0Z2xvYWQuaCIKICNpbmNsdWRlICJ0dHBsb2FkLmgiCkBAIC0zOCwyMCArMzgsMzUgQEAKICNpbmNsdWRlICJ0dHN1YnBpeC5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Z2xvYWQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0dGdsb2FkCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBvc2l0ZSBnbHlwaCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNpbXBsZSBnbHlwaCBmbGFncy4KKyAgICovCisjZGVmaW5lIE9OX0NVUlZFX1BPSU5UICAweDAxICAvKiBzYW1lIHZhbHVlIGFzIEZUX0NVUlZFX1RBR19PTiAgICAgICAgICAgICovCisjZGVmaW5lIFhfU0hPUlRfVkVDVE9SICAweDAyCisjZGVmaW5lIFlfU0hPUlRfVkVDVE9SICAweDA0CisjZGVmaW5lIFJFUEVBVF9GTEFHICAgICAweDA4CisjZGVmaW5lIFhfUE9TSVRJVkUgICAgICAweDEwICAvKiB0d28gbWVhbmluZ3MgZGVwZW5kaW5nIG9uIFhfU0hPUlRfVkVDVE9SICovCisjZGVmaW5lIFNBTUVfWCAgICAgICAgICAweDEwCisjZGVmaW5lIFlfUE9TSVRJVkUgICAgICAweDIwICAvKiB0d28gbWVhbmluZ3MgZGVwZW5kaW5nIG9uIFlfU0hPUlRfVkVDVE9SICovCisjZGVmaW5lIFNBTUVfWSAgICAgICAgICAweDIwCisjZGVmaW5lIE9WRVJMQVBfU0lNUExFICAweDQwICAvKiByZXRhaW5lZCBhcyBGVF9PVVRMSU5FX09WRVJMQVAgICAgICAgICAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ29tcG9zaXRlIGdseXBoIGZsYWdzLgorICAgKi8KICNkZWZpbmUgQVJHU19BUkVfV09SRFMgICAgICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEFSR1NfQVJFX1hZX1ZBTFVFUyAgICAgICAgIDB4MDAwMgogI2RlZmluZSBST1VORF9YWV9UT19HUklEICAgICAgICAgICAweDAwMDQKQEAgLTYyLDE1ICs3NywyNCBAQAogI2RlZmluZSBXRV9IQVZFX0FfMlgyICAgICAgICAgICAgICAweDAwODAKICNkZWZpbmUgV0VfSEFWRV9JTlNUUiAgICAgICAgICAgICAgMHgwMTAwCiAjZGVmaW5lIFVTRV9NWV9NRVRSSUNTICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBPVkVSTEFQX0NPTVBPVU5EICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgT1ZFUkxBUF9DT01QT1VORCAgICAgICAgICAgMHgwNDAwICAvKiByZXRhaW5lZCBhcyBGVF9PVVRMSU5FX09WRVJMQVAgKi8KICNkZWZpbmUgU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgICAgMHgwODAwCiAjZGVmaW5lIFVOU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgIDB4MTAwMAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSZXR1cm4gdGhlIGhvcml6b250YWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhIGdpdmVuIGdseXBoLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorI2RlZmluZSBJU19ERUZBVUxUX0lOU1RBTkNFKCBfZmFjZSApICAgICAgICAgICAgIFwKKyAgICAgICAgICAoICEoIEZUX0lTX05BTUVEX0lOU1RBTkNFKCBfZmFjZSApIHx8ICBcCisgICAgICAgICAgICAgICBGVF9JU19WQVJJQVRJT04oIF9mYWNlICkgICAgICApICkKKyNlbHNlCisjZGVmaW5lIElTX0RFRkFVTFRfSU5TVEFOQ0UoIF9mYWNlICkgIDEKKyNlbmRpZgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJldHVybiB0aGUgaG9yaXpvbnRhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgZ2l2ZW4gZ2x5cGguCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBUVF9HZXRfSE1ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaWR4LApAQCAtODQsMTEgKzEwOCwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJldHVybiB0aGUgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhIGdpdmVuIGdseXBoLiAgICAgICAgICAqLwotICAvKiBTZWUgZnVuY3Rpb24gYHR0X2xvYWRlcl9zZXRfcHAnIGJlbG93IGZvciBleHBsYW5hdGlvbnMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBSZXR1cm4gdGhlIHZlcnRpY2FsIG1ldHJpY3MgaW4gZm9udCB1bml0cyBmb3IgYSBnaXZlbiBnbHlwaC4KKyAgICogU2VlIGZ1bmN0aW9uIGB0dF9sb2FkZXJfc2V0X3BwJyBiZWxvdyBmb3IgZXhwbGFuYXRpb25zLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVFRfR2V0X1ZNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKQEAgLTExMyw2ICsxMzcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXIgKTsKICAgICB9CiAKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgIGlmICggIWZhY2UtPnZlcnRpY2FsX2luZm8gKQorICAgICAgRlRfVFJBQ0U1KCggIiAgW3ZlcnRpY2FsIG1ldHJpY3MgbWlzc2luZywgY29tcHV0aW5nIHZhbHVlc11cbiIgKSk7CisjZW5kaWYKKwogICAgIEZUX1RSQUNFNSgoICIgIGFkdmFuY2UgaGVpZ2h0IChmb250IHVuaXRzKTogJWRcbiIsICphaCApKTsKICAgICBGVF9UUkFDRTUoKCAiICB0b3Agc2lkZSBiZWFyaW5nIChmb250IHVuaXRzKTogJWRcbiIsICp0c2IgKSk7CiAgIH0KQEAgLTI1MCwxMyArMjc5LDEzIEBACiAjZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSBkZWZhdWx0IHdpdGggVHJ1ZVR5cGUgZm9udHMuICAgICAgKi8KLSAgLyogSG93ZXZlciwgdGhleSBjYW4gYmUgcmVwbGFjZWQgYnkgYWx0ZXJuYXRpdmVzIGlmIHdlIG5lZWQgdG8gc3VwcG9ydCAgICovCi0gIC8qIFRydWVUeXBlLWNvbXByZXNzZWQgZm9ybWF0cyAobGlrZSBNaWNyb1R5cGUpIGluIHRoZSBmdXR1cmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBieSBkZWZhdWx0IHdpdGggVHJ1ZVR5cGUgZm9udHMuCisgICAqIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIHJlcGxhY2VkIGJ5IGFsdGVybmF0aXZlcyBpZiB3ZSBuZWVkIHRvIHN1cHBvcnQKKyAgICogVHJ1ZVR5cGUtY29tcHJlc3NlZCBmb3JtYXRzIChsaWtlIE1pY3JvVHlwZSkgaW4gdGhlIGZ1dHVyZS4KKyAgICoKKyAgICovCiAKICAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCiAgIFRUX0FjY2Vzc19HbHlwaF9GcmFtZSggVFRfTG9hZGVyICBsb2FkZXIsCkBAIC0yNjcsMTIgKzI5Niw5IEBACiAgICAgRlRfRXJyb3IgICBlcnJvcjsKICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwogCi0gICAgLyogZm9yIG5vbi1kZWJ1ZyBtb2RlICovCiAgICAgRlRfVU5VU0VEKCBnbHlwaF9pbmRleCApOwogCiAKLSAgICBGVF9UUkFDRTQoKCAiR2x5cGggJWxkXG4iLCBnbHlwaF9pbmRleCApKTsKLQogICAgIC8qIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIHRoZSBgZXJyb3InIHZhcmlhYmxlIHRocm91Z2ggbWFjcm9zISAqLwogICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApIHx8IEZUX0ZSQU1FX0VOVEVSKCBieXRlX2NvdW50ICkgKQogICAgICAgcmV0dXJuIGVycm9yOwpAQCAtMzEyLDkgKzMzOCw5IEBACiAgICAgbG9hZGVyLT5iYm94LnlNYXggPSBGVF9ORVhUX1NIT1JUKCBwICk7CiAKICAgICBGVF9UUkFDRTUoKCAiICAjIG9mIGNvbnRvdXJzOiAlZFxuIiwgbG9hZGVyLT5uX2NvbnRvdXJzICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHhNaW46ICU0ZCAgeE1heDogJTRkXG4iLCBsb2FkZXItPmJib3gueE1pbiwKKyAgICBGVF9UUkFDRTUoKCAiICB4TWluOiAlNGxkICB4TWF4OiAlNGxkXG4iLCBsb2FkZXItPmJib3gueE1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5iYm94LnhNYXggKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeU1pbjogJTRkICB5TWF4OiAlNGRcbiIsIGxvYWRlci0+YmJveC55TWluLAorICAgIEZUX1RSQUNFNSgoICIgIHlNaW46ICU0bGQgIHlNYXg6ICU0bGRcbiIsIGxvYWRlci0+YmJveC55TWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmJib3gueU1heCApKTsKICAgICBsb2FkZXItPmN1cnNvciA9IHA7CiAKQEAgLTMzNyw3ICszNjMsNyBAQAogICAgIEZUX0J5dGUgICAgICAgICAqZmxhZywgKmZsYWdfbGltaXQ7CiAgICAgRlRfQnl0ZSAgICAgICAgIGMsIGNvdW50OwogICAgIEZUX1ZlY3RvciAgICAgICAqdmVjLCAqdmVjX2xpbWl0OwotICAgIEZUX1BvcyAgICAgICAgICB4OworICAgIEZUX1BvcyAgICAgICAgICB4LCB5OwogICAgIEZUX1Nob3J0ICAgICAgICAqY29udCwgKmNvbnRfbGltaXQsIHByZXZfY29udDsKICAgICBGVF9JbnQgICAgICAgICAgeHlfc2l6ZSA9IDA7CiAKQEAgLTM4Miw2ICs0MDgsOCBAQAogICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKICAgICB9CiAKKyAgICBGVF9UUkFDRTUoKCAiICAjIG9mIHBvaW50czogJWRcbiIsIG5fcG9pbnRzICkpOworCiAgICAgLyogbm90ZSB0aGF0IHdlIHdpbGwgYWRkIGZvdXIgcGhhbnRvbSBwb2ludHMgbGF0ZXIgKi8KICAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggZ2xvYWRlciwgbl9wb2ludHMgKyA0LCAwICk7CiAgICAgaWYgKCBlcnJvciApCkBAIC00NTIsNyArNDgwLDcgQEAKICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7CiAKICAgICAgICpmbGFnKysgPSBjID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICBpZiAoIGMgJiA4ICkKKyAgICAgIGlmICggYyAmIFJFUEVBVF9GTEFHICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKQEAgLTQ2Niw2ICs0OTQsMTAgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICAvKiByZXRhaW4gdGhlIG92ZXJsYXAgZmxhZyAqLworICAgIGlmICggbl9wb2ludHMgJiYgb3V0bGluZS0+dGFnc1swXSAmIE9WRVJMQVBfU0lNUExFICkKKyAgICAgIGdsb2FkZXItPmJhc2Uub3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX09WRVJMQVA7CisKICAgICAvKiByZWFkaW5nIHRoZSBYIGNvb3JkaW5hdGVzICovCiAKICAgICB2ZWMgICAgICAgPSBvdXRsaW5lLT5wb2ludHM7CkBAIC00NzgsMzEgKzUxMCwyOSBAQAogCiAgICAgZm9yICggOyB2ZWMgPCB2ZWNfbGltaXQ7IHZlYysrLCBmbGFnKysgKQogICAgIHsKLSAgICAgIEZUX1BvcyAgIHkgPSAwOwotICAgICAgRlRfQnl0ZSAgZiA9ICpmbGFnOworICAgICAgRlRfUG9zICAgZGVsdGEgPSAwOworICAgICAgRlRfQnl0ZSAgZiAgICAgPSAqZmxhZzsKIAogCi0gICAgICBpZiAoIGYgJiAyICkKKyAgICAgIGlmICggZiAmIFhfU0hPUlRfVkVDVE9SICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKIAotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgaWYgKCAoIGYgJiAxNiApID09IDAgKQotICAgICAgICAgIHkgPSAteTsKKyAgICAgICAgZGVsdGEgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOworICAgICAgICBpZiAoICEoIGYgJiBYX1BPU0lUSVZFICkgKQorICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwogICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDE2ICkgPT0gMCApCisgICAgICBlbHNlIGlmICggISggZiAmIFNBTUVfWCApICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKIAotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX1NIT1JUKCBwICk7CisgICAgICAgIGRlbHRhID0gKEZUX1BvcylGVF9ORVhUX1NIT1JUKCBwICk7CiAgICAgICB9CiAKLSAgICAgIHggICAgICs9IHk7CisgICAgICB4ICAgICArPSBkZWx0YTsKICAgICAgIHZlYy0+eCA9IHg7Ci0gICAgICAvKiB0aGUgY2FzdCBpcyBmb3Igc3R1cGlkIGNvbXBpbGVycyAqLwotICAgICAgKmZsYWcgID0gKEZUX0J5dGUpKCBmICYgfiggMiB8IDE2ICkgKTsKICAgICB9CiAKICAgICAvKiByZWFkaW5nIHRoZSBZIGNvb3JkaW5hdGVzICovCkBAIC01MTAsMzUgKzU0MCwzNiBAQAogICAgIHZlYyAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5wb2ludHM7CiAgICAgdmVjX2xpbWl0ID0gdmVjICsgbl9wb2ludHM7CiAgICAgZmxhZyAgICAgID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3M7Ci0gICAgeCAgICAgICAgID0gMDsKKyAgICB5ICAgICAgICAgPSAwOwogCiAgICAgZm9yICggOyB2ZWMgPCB2ZWNfbGltaXQ7IHZlYysrLCBmbGFnKysgKQogICAgIHsKLSAgICAgIEZUX1BvcyAgIHkgPSAwOwotICAgICAgRlRfQnl0ZSAgZiA9ICpmbGFnOworICAgICAgRlRfUG9zICAgZGVsdGEgPSAwOworICAgICAgRlRfQnl0ZSAgZiAgICAgPSAqZmxhZzsKIAogCi0gICAgICBpZiAoIGYgJiA0ICkKKyAgICAgIGlmICggZiAmIFlfU0hPUlRfVkVDVE9SICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKIAotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgaWYgKCAoIGYgJiAzMiApID09IDAgKQotICAgICAgICAgIHkgPSAteTsKKyAgICAgICAgZGVsdGEgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOworICAgICAgICBpZiAoICEoIGYgJiBZX1BPU0lUSVZFICkgKQorICAgICAgICAgIGRlbHRhID0gLWRlbHRhOwogICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDMyICkgPT0gMCApCisgICAgICBlbHNlIGlmICggISggZiAmIFNBTUVfWSApICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKIAotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX1NIT1JUKCBwICk7CisgICAgICAgIGRlbHRhID0gKEZUX1BvcylGVF9ORVhUX1NIT1JUKCBwICk7CiAgICAgICB9CiAKLSAgICAgIHggICAgICs9IHk7Ci0gICAgICB2ZWMtPnkgPSB4OworICAgICAgeSAgICAgKz0gZGVsdGE7CisgICAgICB2ZWMtPnkgPSB5OworCiAgICAgICAvKiB0aGUgY2FzdCBpcyBmb3Igc3R1cGlkIGNvbXBpbGVycyAqLwotICAgICAgKmZsYWcgID0gKEZUX0J5dGUpKCBmICYgRlRfQ1VSVkVfVEFHX09OICk7CisgICAgICAqZmxhZyAgPSAoRlRfQnl0ZSkoIGYgJiBPTl9DVVJWRV9QT0lOVCApOwogICAgIH0KIAogICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAoRlRfU2hvcnQpbl9wb2ludHM7CkBAIC01NTksOSArNTkwLDEwIEBACiAgIFRUX0xvYWRfQ29tcG9zaXRlX0dseXBoKCBUVF9Mb2FkZXIgIGxvYWRlciApCiAgIHsKICAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIHAgICAgICAgPSBsb2FkZXItPmN1cnNvcjsKLSAgICBGVF9CeXRlKiAgICAgICAgbGltaXQgICA9IGxvYWRlci0+bGltaXQ7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgPSBsb2FkZXItPmdsb2FkZXI7CisgICAgRlRfQnl0ZSogICAgICAgIHAgICAgICAgICAgPSBsb2FkZXItPmN1cnNvcjsKKyAgICBGVF9CeXRlKiAgICAgICAgbGltaXQgICAgICA9IGxvYWRlci0+bGltaXQ7CisgICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgPSBsb2FkZXItPmdsb2FkZXI7CisgICAgRlRfTG9uZyAgICAgICAgIG51bV9nbHlwaHMgPSBsb2FkZXItPmZhY2UtPnJvb3QubnVtX2dseXBoczsKICAgICBGVF9TdWJHbHlwaCAgICAgc3ViZ2x5cGg7CiAgICAgRlRfVUludCAgICAgICAgIG51bV9zdWJnbHlwaHM7CiAKQEAgLTU5MCw2ICs2MjIsMTEgQEAKICAgICAgIHN1YmdseXBoLT5mbGFncyA9IEZUX05FWFRfVVNIT1JUKCBwICk7CiAgICAgICBzdWJnbHlwaC0+aW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwogCisgICAgICAvKiB3ZSByZWplY3QgY29tcG9zaXRlcyB0aGF0IGhhdmUgY29tcG9uZW50cyAqLworICAgICAgLyogd2l0aCBpbnZhbGlkIGdseXBoIGluZGljZXMgICAgICAgICAgICAgICAgKi8KKyAgICAgIGlmICggc3ViZ2x5cGgtPmluZGV4ID49IG51bV9nbHlwaHMgKQorICAgICAgICBnb3RvIEludmFsaWRfQ29tcG9zaXRlOworCiAgICAgICAvKiBjaGVjayBzcGFjZSAqLwogICAgICAgY291bnQgPSAyOwogICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBBUkdTX0FSRV9XT1JEUyApCkBAIC03NjgsMTUgKzgwNSwxNSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IaW50X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIaW50IHRoZSBnbHlwaCB1c2luZyB0aGUgem9uZSBwcmVwYXJlZCBieSB0aGUgY2FsbGVyLiAgTm90ZSB0aGF0ICAgKi8KLSAgLyogICAgdGhlIHpvbmUgaXMgc3VwcG9zZWQgdG8gaW5jbHVkZSBmb3VyIHBoYW50b20gcG9pbnRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX0hpbnRfR2x5cGgKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEhpbnQgdGhlIGdseXBoIHVzaW5nIHRoZSB6b25lIHByZXBhcmVkIGJ5IHRoZSBjYWxsZXIuICBOb3RlIHRoYXQKKyAgICogICB0aGUgem9uZSBpcyBzdXBwb3NlZCB0byBpbmNsdWRlIGZvdXIgcGhhbnRvbSBwb2ludHMuCisgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgVFRfSGludF9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIsCiAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaXNfY29tcG9zaXRlICkKQEAgLTc5NywxNSArODM0LDkgQEAKIAogCiAjaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgaWYgKCBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiA+IDB4RkZGRkwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJUVF9IaW50X0dseXBoOiB0b28gbG9uZyBpbnN0cnVjdGlvbnMiICkpOwotICAgICAgRlRfVFJBQ0UxKCggIiAoMHglbHggYnl0ZSkgaXMgdHJ1bmNhdGVkXG4iLAotICAgICAgICAgICAgICAgICAgbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW4gKSk7Ci0gICAgfQogICAgIG5faW5zID0gbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9sZW47CiAKLSAgICAvKiBzYXZlIG9yaWdpbmFsIHBvaW50IHBvc2l0aW9uIGluIG9yZyAqLworICAgIC8qIHNhdmUgb3JpZ2luYWwgcG9pbnQgcG9zaXRpb25zIGluIGBvcmcnIGFycmF5ICovCiAgICAgaWYgKCBuX2lucyA+IDAgKQogICAgICAgRlRfQVJSQVlfQ09QWSggem9uZS0+b3JnLCB6b25lLT5jdXIsIHpvbmUtPm5fcG9pbnRzICk7CiAKQEAgLTg5NiwxNiArOTI3LDE2IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9uY2UgYSBzaW1wbGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkLCBpdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQuICAgICAqLwotICAvKiAgICBVc3VhbGx5LCB0aGlzIG1lYW5zIHNjYWxpbmcgYW5kIGhpbnRpbmcgdGhyb3VnaCBieXRlY29kZSAgICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJwcmV0YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBPbmNlIGEgc2ltcGxlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCwgaXQgbmVlZHMgdG8gYmUgcHJvY2Vzc2VkLgorICAgKiAgIFVzdWFsbHksIHRoaXMgbWVhbnMgc2NhbGluZyBhbmQgaGludGluZyB0aHJvdWdoIGJ5dGVjb2RlCisgICAqICAgaW50ZXJwcmV0YXRpb24uCisgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyICkKICAgewpAQCAtOTE0LDYgKzk0NSwxMSBAQAogICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lOwogICAgIEZUX0ludCAgICAgICAgICBuX3BvaW50czsKIAorI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKKyAgICBGVF9NZW1vcnkgICBtZW1vcnkgICAgPSBsb2FkZXItPmZhY2UtPnJvb3QubWVtb3J5OworICAgIEZUX1ZlY3RvciogIHVucm91bmRlZCA9IE5VTEw7CisjZW5kaWYKKwogCiAgICAgb3V0bGluZSAgPSAmZ2xvYWRlci0+Y3VycmVudC5vdXRsaW5lOwogICAgIG5fcG9pbnRzID0gb3V0bGluZS0+bl9wb2ludHM7CkBAIC05MzQsMjYgKzk3MCwzMiBAQAogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAogCi0gICAgaWYgKCBGVF9JU19OQU1FRF9JTlNUQU5DRSggRlRfRkFDRSggbG9hZGVyLT5mYWNlICkgKSB8fAotICAgICAgICAgRlRfSVNfVkFSSUFUSU9OKCBGVF9GQUNFKCBsb2FkZXItPmZhY2UgKSApICAgICAgKQorICAgIGlmICggIUlTX0RFRkFVTFRfSU5TVEFOQ0UoIEZUX0ZBQ0UoIGxvYWRlci0+ZmFjZSApICkgKQogICAgIHsKKyAgICAgIGlmICggRlRfTkVXX0FSUkFZKCB1bnJvdW5kZWQsIG5fcG9pbnRzICkgKQorICAgICAgICBnb3RvIEV4aXQ7CisKICAgICAgIC8qIERlbHRhcyBhcHBseSB0byB0aGUgdW5zY2FsZWQgZGF0YS4gKi8KICAgICAgIGVycm9yID0gVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIGxvYWRlci0+ZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Z2x5cGhfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yb3VuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbl9wb2ludHMgKTsKIAogICAgICAgLyogcmVjYWxjdWxhdGUgbGluZWFyIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2VzICovCiAgICAgICAvKiBpZiB3ZSBkb24ndCBoYXZlIEhWQVIgYW5kIFZWQVIsIHJlc3BlY3RpdmVseSAgICAgICAgKi8KKworICAgICAgLyogWFhYOiBjaGFuZ2UgYWxsIEZyZWVUeXBlIG1vZHVsZXMgdG8gc3RvcmUgYGxpbmVhcicgYW5kIGB2YWR2YW5jZScgKi8KKyAgICAgIC8qICAgICAgaW4gMjYuNiBmb3JtYXQgYmVmb3JlIHRoZSBgYmFzZScgbW9kdWxlIHNjYWxlcyB0aGVtIHRvIDE2LjE2ICovCiAgICAgICBpZiAoICEoIGxvYWRlci0+ZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJiBUVF9GQUNFX0ZMQUdfVkFSX0hBRFZBTkNFICkgKQotICAgICAgICBsb2FkZXItPmxpbmVhciA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDNdLnggLQotICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDRdLng7CisgICAgICAgIGxvYWRlci0+bGluZWFyID0gRlRfUElYX1JPVU5EKCB1bnJvdW5kZWRbbl9wb2ludHMgLSAzXS54IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucm91bmRlZFtuX3BvaW50cyAtIDRdLnggKSAvIDY0OwogICAgICAgaWYgKCAhKCBsb2FkZXItPmZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApICkKLSAgICAgICAgbG9hZGVyLT52YWR2YW5jZSA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDFdLnggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzIC0gMl0ueDsKKyAgICAgICAgbG9hZGVyLT52YWR2YW5jZSA9IEZUX1BJWF9ST1VORCggdW5yb3VuZGVkW25fcG9pbnRzIC0gMV0ueCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucm91bmRlZFtuX3BvaW50cyAtIDJdLnggKSAvIDY0OwogCiAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCiAjZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwpAQCAtMTAwOCwxMCArMTA1MCwyMyBAQAogICAgICAgICAgIC8qIGNvbXBlbnNhdGUgZm9yIGFueSBzY2FsaW5nIGJ5IGRlL2VtYm9sZGVuaW5nOyAqLwogICAgICAgICAgIC8qIHRoZSBhbW91bnQgd2FzIGRldGVybWluZWQgdmlhIGV4cGVyaW1lbnRhdGlvbiAqLwogICAgICAgICAgIGlmICggeF9zY2FsZV9mYWN0b3IgIT0gMTAwMCAmJiBwcGVtID4gMTEgKQorICAgICAgICAgIHsKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCisgICAgICAgICAgICBGVF9WZWN0b3IqICBvcmlnX3BvaW50cyA9IG91dGxpbmUtPnBvaW50czsKKworCisgICAgICAgICAgICBpZiAoICFJU19ERUZBVUxUX0lOU1RBTkNFKCBGVF9GQUNFKCBsb2FkZXItPmZhY2UgKSApICkKKyAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzID0gdW5yb3VuZGVkOworI2VuZGlmCiAgICAgICAgICAgICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkoIG91dGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggMTI4MCAqIHBwZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAtIHhfc2NhbGVfZmFjdG9yICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKKyNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCisgICAgICAgICAgICBpZiAoICFJU19ERUZBVUxUX0lOU1RBTkNFKCBGVF9GQUNFKCBsb2FkZXItPmZhY2UgKSApICkKKyAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzID0gb3JpZ19wb2ludHM7CisjZW5kaWYKKyAgICAgICAgICB9CiAgICAgICAgICAgZG9fc2NhbGUgPSBUUlVFOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xMDMyLDE3ICsxMDg3LDQwIEBACiAKICAgICAgIGlmICggZG9fc2NhbGUgKQogICAgICAgewotICAgICAgICBmb3IgKCA7IHZlYyA8IGxpbWl0OyB2ZWMrKyApCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorICAgICAgICBpZiAoICFJU19ERUZBVUxUX0lOU1RBTkNFKCBGVF9GQUNFKCBsb2FkZXItPmZhY2UgKSApICkKICAgICAgICAgewotICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICk7Ci0gICAgICAgICAgdmVjLT55ID0gRlRfTXVsRml4KCB2ZWMtPnksIHlfc2NhbGUgKTsKKyAgICAgICAgICBGVF9WZWN0b3IqICB1ID0gdW5yb3VuZGVkOworCisKKyAgICAgICAgICBmb3IgKCA7IHZlYyA8IGxpbWl0OyB2ZWMrKywgdSsrICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB2ZWMtPnggPSAoIEZUX011bEZpeCggdS0+eCwgeF9zY2FsZSApICsgMzIgKSA+PiA2OworICAgICAgICAgICAgdmVjLT55ID0gKCBGVF9NdWxGaXgoIHUtPnksIHlfc2NhbGUgKSArIDMyICkgPj4gNjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KKyAgICAgICAgeworICAgICAgICAgIGZvciAoIDsgdmVjIDwgbGltaXQ7IHZlYysrICkKKyAgICAgICAgICB7CisgICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOworICAgICAgICAgICAgdmVjLT55ID0gRlRfTXVsRml4KCB2ZWMtPnksIHlfc2NhbGUgKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAgIC8qIGlmIHdlIGhhdmUgYSBIVkFSIHRhYmxlLCBgcHAxJyBhbmQvb3IgYHBwMicgYXJlIGFscmVhZHkgYWRqdXN0ZWQgKi8KLSAgICAgIGlmICggISggbG9hZGVyLT5mYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSB8fAotICAgICAgICAgICAhSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIC8qIGlmIHdlIGhhdmUgYSBIVkFSIHRhYmxlLCBgcHAxJyBhbmQvb3IgYHBwMicgKi8KKyAgICAgIC8qIGFyZSBhbHJlYWR5IGFkanVzdGVkIGJ1dCB1bnNjYWxlZCAgICAgICAgICAgKi8KKyAgICAgIGlmICggKCBsb2FkZXItPmZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRSApICYmCisgICAgICAgICAgIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICB7CisgICAgICAgIGxvYWRlci0+cHAxLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAxLngsIHhfc2NhbGUgKTsKKyAgICAgICAgbG9hZGVyLT5wcDIueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDIueCwgeF9zY2FsZSApOworICAgICAgICAvKiBwcDEueSBhbmQgcHAyLnkgYXJlIGFsd2F5cyB6ZXJvICovCisgICAgICB9CisgICAgICBlbHNlCiAjZW5kaWYKICAgICAgIHsKICAgICAgICAgbG9hZGVyLT5wcDEgPSBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgLSA0XTsKQEAgLTEwNTAsOSArMTEyOCwxNyBAQAogICAgICAgfQogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgICAgLyogaWYgd2UgaGF2ZSBhIFZWQVIgdGFibGUsIGBwcDMnIGFuZC9vciBgcHA0JyBhcmUgYWxyZWFkeSBhZGp1c3RlZCAqLwotICAgICAgaWYgKCAhKCBsb2FkZXItPmZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApIHx8Ci0gICAgICAgICAgICFJU19ISU5URUQoIGxvYWRlci0+bG9hZF9mbGFncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgLyogaWYgd2UgaGF2ZSBhIFZWQVIgdGFibGUsIGBwcDMnIGFuZC9vciBgcHA0JyAqLworICAgICAgLyogYXJlIGFscmVhZHkgYWRqdXN0ZWQgYnV0IHVuc2NhbGVkICAgICAgICAgICAqLworICAgICAgaWYgKCAoIGxvYWRlci0+ZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJiBUVF9GQUNFX0ZMQUdfVkFSX1ZBRFZBTkNFICkgJiYKKyAgICAgICAgICAgSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgbG9hZGVyLT5wcDMueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDMueCwgeF9zY2FsZSApOworICAgICAgICBsb2FkZXItPnBwMy55ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMy55LCB5X3NjYWxlICk7CisgICAgICAgIGxvYWRlci0+cHA0LnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LngsIHhfc2NhbGUgKTsKKyAgICAgICAgbG9hZGVyLT5wcDQueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDQueSwgeV9zY2FsZSApOworICAgICAgfQorICAgICAgZWxzZQogI2VuZGlmCiAgICAgICB7CiAgICAgICAgIGxvYWRlci0+cHAzID0gb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzIC0gMl07CkBAIC0xMDY3LDE5ICsxMTUzLDI0IEBACiAgICAgICBlcnJvciA9IFRUX0hpbnRfR2x5cGgoIGxvYWRlciwgMCApOwogICAgIH0KIAorI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKKyAgRXhpdDoKKyAgICBGVF9GUkVFKCB1bnJvdW5kZWQgKTsKKyNlbmRpZgorCiAgICAgcmV0dXJuIGVycm9yOwogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmNlIGEgY29tcG9zaXRlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQsIGl0IG5lZWRzIHRvIGJlICAgICAgICAgKi8KLSAgLyogICAgcHJvY2Vzc2VkLiAgVXN1YWxseSwgdGhpcyBtZWFucyB0cmFuc2Zvcm1pbmcgYW5kIHRyYW5zbGF0aW5nLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0NvbXBvbmVudAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgT25jZSBhIGNvbXBvc2l0ZSBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkLCBpdCBuZWVkcyB0byBiZQorICAgKiAgIHByb2Nlc3NlZC4gIFVzdWFsbHksIHRoaXMgbWVhbnMgdHJhbnNmb3JtaW5nIGFuZCB0cmFuc2xhdGluZy4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQoIFRUX0xvYWRlciAgICBsb2FkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3ViR2x5cGggIHN1YmdseXBoLApAQCAtMTE1MywxMCArMTI0NCwxMCBAQAogCiAjaWYgMAogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogVGhpcyBhbGdvcml0aG0gaXMgd2hhdCBBcHBsZSBkb2N1bWVudHMuICBCdXQgaXQgZG9lc24ndCB3b3JrLiAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBhbGdvcml0aG0gaXMgd2hhdCBBcHBsZSBkb2N1bWVudHMuICBCdXQgaXQgZG9lc24ndCB3b3JrLgorICAgICAgICAgKi8KICAgICAgICAgaW50ICBhID0gc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCA+IDAgPyAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1zdWJnbHlwaC0+dHJhbnNmb3JtLnh4OwogICAgICAgICBpbnQgIGIgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4ID4gMCA/ICBzdWJnbHlwaC0+dHJhbnNmb3JtLnl4CkBAIC0xMTc4LDEwICsxMjY5LDEwIEBACiAKICNlbHNlIC8qIDEgKi8KIAotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFRoaXMgYWxnb3JpdGhtIGlzIGEgZ3Vlc3MgYW5kIHdvcmtzIG11Y2ggYmV0dGVyIHRoYW4gdGhlIGFib3ZlLiAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgYWxnb3JpdGhtIGlzIGEgZ3Vlc3MgYW5kIHdvcmtzIG11Y2ggYmV0dGVyIHRoYW4gdGhlIGFib3ZlLgorICAgICAgICAgKi8KICAgICAgICAgRlRfRml4ZWQgIG1hY194c2NhbGUgPSBGVF9IeXBvdCggc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSApOwogICAgICAgICBGVF9GaXhlZCAgbWFjX3lzY2FsZSA9IEZUX0h5cG90KCBzdWJnbHlwaC0+dHJhbnNmb3JtLnl5LApAQCAtMTIzOSwxNiArMTMzMCwxNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoLCBpbiB0aGF0ICAgKi8KLSAgLyogICAgaXRzIHNvbGUgcHVycG9zZSBpcyB0byBoaW50IHRoZSBnbHlwaC4gIFRodXMgdGhpcyBmdW5jdGlvbiBpcyAgICAgICovCi0gIC8qICAgIG9ubHkgYXZhaWxhYmxlIHdoZW4gYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaXMgZW5hYmxlZC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBUVF9Qcm9jZXNzX1NpbXBsZV9HbHlwaCwgaW4gdGhhdAorICAgKiAgIGl0cyBzb2xlIHB1cnBvc2UgaXMgdG8gaGludCB0aGUgZ2x5cGguICBUaHVzIHRoaXMgZnVuY3Rpb24gaXMKKyAgICogICBvbmx5IGF2YWlsYWJsZSB3aGVuIGJ5dGVjb2RlIGludGVycHJldGVyIGlzIGVuYWJsZWQuCisgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgVFRfUHJvY2Vzc19Db21wb3NpdGVfR2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydF9wb2ludCwKQEAgLTE0NjAsNyArMTU1MSw3IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICB1c2VfYXdfMiA9IChGVF9Cb29sKSggc3VicGl4ZWxfaGludGluZyAmJiBncmF5c2NhbGUgKTsKKyAgICB1c2VfYXdfMiA9IEZUX0JPT0woIHN1YnBpeGVsX2hpbnRpbmcgJiYgZ3JheXNjYWxlICk7CiAKICAgICBsb2FkZXItPnBwMS54ID0gbG9hZGVyLT5iYm94LnhNaW4gLSBsb2FkZXItPmxlZnRfYmVhcmluZzsKICAgICBsb2FkZXItPnBwMS55ID0gMDsKQEAgLTE0OTcsMjcgKzE1ODgsMjggQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF90cnVldHlwZV9nbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgYSBnaXZlbiB0cnVldHlwZSBnbHlwaC4gIEhhbmRsZXMgY29tcG9zaXRlcyBhbmQgdXNlcyBhICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBsb2FkX3RydWV0eXBlX2dseXBoCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkcyBhIGdpdmVuIHRydWV0eXBlIGdseXBoLiAgSGFuZGxlcyBjb21wb3NpdGVzIGFuZCB1c2VzIGEKKyAgICogICBUVF9Mb2FkZXIgb2JqZWN0LgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIGxvYWRfdHJ1ZXR5cGVfZ2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHJlY3Vyc2VfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaGVhZGVyX29ubHkgKQogICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICAgICAgICA9IEZUX0Vycl9PazsKKyAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKICAgICBGVF9GaXhlZCAgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKICAgICBGVF9VTG9uZyAgICAgICAgb2Zmc2V0OwotICAgIFRUX0ZhY2UgICAgICAgICBmYWNlICAgICAgICAgPSBsb2FkZXItPmZhY2U7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgICAgICA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgb3BlbmVkX2ZyYW1lID0gMDsKKyAgICBUVF9GYWNlICAgICAgICAgZmFjZSAgICA9IGxvYWRlci0+ZmFjZTsKKyAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciA9IGxvYWRlci0+Z2xvYWRlcjsKKworICAgIEZUX0Jvb2wgIG9wZW5lZF9mcmFtZSA9IDA7CiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCiAgICAgRlRfU3RyZWFtUmVjICAgIGluY19zdHJlYW07CkBAIC0xNTUwLDE2ICsxNjQyLDE2IEBACiAKICAgICBsb2FkZXItPmdseXBoX2luZGV4ID0gZ2x5cGhfaW5kZXg7CiAKLSAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgIHsKLSAgICAgIHhfc2NhbGUgPSBsb2FkZXItPnNpemUtPm1ldHJpY3MtPnhfc2NhbGU7Ci0gICAgICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLT55X3NjYWxlOwotICAgIH0KLSAgICBlbHNlCisgICAgaWYgKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkKICAgICB7CiAgICAgICB4X3NjYWxlID0gMHgxMDAwMEw7CiAgICAgICB5X3NjYWxlID0gMHgxMDAwMEw7CiAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB4X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLT54X3NjYWxlOworICAgICAgeV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy0+eV9zY2FsZTsKKyAgICB9CiAKICAgICAvKiBTZXQgYG9mZnNldCcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbHlwaCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgKi8KICAgICAvKiB0aGUgYGdseWYnIHRhYmxlLCBhbmQgYGJ5dGVfbGVuJyB0byB0aGUgbGVuZ3RoIG9mIHRoZSBnbHlwaCBpbiAgKi8KQEAgLTE2MTcsMzggKzE3MDksMzYgQEAKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIG9wZW5lZF9mcmFtZSA9IDE7Ci0KICAgICAgIC8qIHJlYWQgZ2x5cGggaGVhZGVyIGZpcnN0ICovCiAgICAgICBlcnJvciA9IGZhY2UtPnJlYWRfZ2x5cGhfaGVhZGVyKCBsb2FkZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIC8qIHRoZSBtZXRyaWNzIG11c3QgYmUgY29tcHV0ZWQgYWZ0ZXIgbG9hZGluZyB0aGUgZ2x5cGggaGVhZGVyICovCi0gICAgICAvKiBzaW5jZSB3ZSBuZWVkIHRoZSBnbHlwaCdzIGB5TWF4JyB2YWx1ZSBpbiBjYXNlIHRoZSB2ZXJ0aWNhbCAqLwotICAgICAgLyogbWV0cmljcyBtdXN0IGJlIGVtdWxhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gdHRfZ2V0X21ldHJpY3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7CisgICAgICBmYWNlLT5mb3JnZXRfZ2x5cGhfZnJhbWUoIGxvYWRlciApOwogCi0gICAgICBpZiAoIGhlYWRlcl9vbmx5ICkKKyAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgLyogYSBzcGFjZSBnbHlwaCAqLwogICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA9PSAwIHx8IGxvYWRlci0+bl9jb250b3VycyA9PSAwICkKICAgICB7CiAgICAgICBsb2FkZXItPmJib3gueE1pbiA9IDA7CiAgICAgICBsb2FkZXItPmJib3gueE1heCA9IDA7CiAgICAgICBsb2FkZXItPmJib3gueU1pbiA9IDA7CiAgICAgICBsb2FkZXItPmJib3gueU1heCA9IDA7CisgICAgfQogCi0gICAgICBlcnJvciA9IHR0X2dldF9tZXRyaWNzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OworICAgIC8qIHRoZSBtZXRyaWNzIG11c3QgYmUgY29tcHV0ZWQgYWZ0ZXIgbG9hZGluZyB0aGUgZ2x5cGggaGVhZGVyICovCisgICAgLyogc2luY2Ugd2UgbmVlZCB0aGUgZ2x5cGgncyBgeU1heCcgdmFsdWUgaW4gY2FzZSB0aGUgdmVydGljYWwgKi8KKyAgICAvKiBtZXRyaWNzIG11c3QgYmUgZW11bGF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGVycm9yID0gdHRfZ2V0X21ldHJpY3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKKyAgICBpZiAoIGVycm9yICkKKyAgICAgIGdvdG8gRXhpdDsKIAotICAgICAgaWYgKCBoZWFkZXJfb25seSApCi0gICAgICAgIGdvdG8gRXhpdDsKKyAgICBpZiAoIGhlYWRlcl9vbmx5ICkKKyAgICAgIGdvdG8gRXhpdDsKIAorICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA9PSAwIHx8IGxvYWRlci0+bl9jb250b3VycyA9PSAwICkKKyAgICB7CiAgICAgICAvKiBtdXN0IGluaXRpYWxpemUgcG9pbnRzIGJlZm9yZSAocG9zc2libHkpIG92ZXJyaWRpbmcgKi8KICAgICAgIC8qIGdseXBoIG1ldHJpY3MgZnJvbSB0aGUgaW5jcmVtZW50YWwgaW50ZXJmYWNlICAgICAgICAqLwogICAgICAgdHRfbG9hZGVyX3NldF9wcCggbG9hZGVyICk7CkBAIC0xNjY5LDYgKzE3NTksOSBAQAogICAgICAgICBzaG9ydCAgICAgICBjb250b3Vyc1s0XSA9IHsgMCwgMSwgMiwgMyB9OwogICAgICAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwogCisgICAgICAgIC8qIHVucm91bmRlZCB2YWx1ZXMgKi8KKyAgICAgICAgRlRfVmVjdG9yICB1bnJvdW5kZWRbNF0gPSB7IHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSB9OworCiAKICAgICAgICAgcG9pbnRzWzBdLnggPSBsb2FkZXItPnBwMS54OwogICAgICAgICBwb2ludHNbMF0ueSA9IGxvYWRlci0+cHAxLnk7CkBAIC0xNjkwLDYgKzE3ODMsNyBAQAogICAgICAgICBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBsb2FkZXItPmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yb3VuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClvdXRsaW5lLm5fcG9pbnRzICk7CiAgICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTE3MDQsMTMgKzE3OTgsMTQgQEAKICAgICAgICAgbG9hZGVyLT5wcDQueCA9IHBvaW50c1szXS54OwogICAgICAgICBsb2FkZXItPnBwNC55ID0gcG9pbnRzWzNdLnk7CiAKLQogICAgICAgICAvKiByZWNhbGN1bGF0ZSBsaW5lYXIgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZXMgKi8KICAgICAgICAgLyogaWYgd2UgZG9uJ3QgaGF2ZSBIVkFSIGFuZCBWVkFSLCByZXNwZWN0aXZlbHkgICAgICAgICovCiAgICAgICAgIGlmICggISggbG9hZGVyLT5mYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSApCi0gICAgICAgICAgbG9hZGVyLT5saW5lYXIgPSBsb2FkZXItPnBwMi54IC0gbG9hZGVyLT5wcDEueDsKKyAgICAgICAgICBsb2FkZXItPmxpbmVhciA9IEZUX1BJWF9ST1VORCggdW5yb3VuZGVkWzFdLnggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJvdW5kZWRbMF0ueCApIC8gNjQ7CiAgICAgICAgIGlmICggISggbG9hZGVyLT5mYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0UgKSApCi0gICAgICAgICAgbG9hZGVyLT52YWR2YW5jZSA9IGxvYWRlci0+cHA0LnggLSBsb2FkZXItPnBwMy54OworICAgICAgICAgIGxvYWRlci0+dmFkdmFuY2UgPSBGVF9QSVhfUk9VTkQoIHVucm91bmRlZFszXS54IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJvdW5kZWRbMl0ueCApIC8gNjQ7CiAgICAgICB9CiAKICNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUICovCkBAIC0xNzQ1LDYgKzE4NDAsMTYgQEAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisgICAgLyogd2Ugbm93IG9wZW4gYSBmcmFtZSBhZ2FpbiwgcmlnaHQgYWZ0ZXIgdGhlIGdseXBoIGhlYWRlciAqLworICAgIC8qICh3aGljaCBjb25zaXN0cyBvZiAxMCBieXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBlcnJvciA9IGZhY2UtPmFjY2Vzc19nbHlwaF9mcmFtZSggbG9hZGVyLCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Z2x5Zl9vZmZzZXQgKyBvZmZzZXQgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbG9hZGVyLT5ieXRlX2xlbiAtIDEwICk7CisgICAgaWYgKCBlcnJvciApCisgICAgICBnb3RvIEV4aXQ7CisKKyAgICBvcGVuZWRfZnJhbWUgPSAxOworCiAgICAgLyogaWYgaXQgaXMgYSBzaW1wbGUgZ2x5cGgsIGxvYWQgaXQgKi8KIAogICAgIGlmICggbG9hZGVyLT5uX2NvbnRvdXJzID4gMCApCkBAIC0xNzkwLDcgKzE4OTUsNiBAQAogICAgICAgICogcG9pbnRlcnMgd2l0aCBhIHdpZHRoIG9mIGF0IGxlYXN0IDMyIGJpdHMuCiAgICAgICAgKi8KIAotCiAgICAgICAvKiBjbGVhciB0aGUgbm9kZXMgZmlsbGVkIGJ5IHNpYmxpbmcgY2hhaW5zICovCiAgICAgICBub2RlID0gZnRfbGlzdF9nZXRfbm9kZV9hdCggJmxvYWRlci0+Y29tcG9zaXRlcywgcmVjdXJzZV9jb3VudCApOwogICAgICAgZm9yICggbm9kZTIgPSBub2RlOyBub2RlMjsgbm9kZTIgPSBub2RlMi0+bmV4dCApCkBAIC0xODQxLDkgKzE5NDUsMTAgQEAKICAgICAgICAgRlRfU3ViR2x5cGggIHN1YmdseXBoOwogCiAgICAgICAgIEZUX091dGxpbmUgIG91dGxpbmU7Ci0gICAgICAgIEZUX1ZlY3RvciogIHBvaW50cyAgID0gTlVMTDsKLSAgICAgICAgY2hhciogICAgICAgdGFncyAgICAgPSBOVUxMOwotICAgICAgICBzaG9ydCogICAgICBjb250b3VycyA9IE5VTEw7CisgICAgICAgIEZUX1ZlY3RvciogIHBvaW50cyAgICA9IE5VTEw7CisgICAgICAgIGNoYXIqICAgICAgIHRhZ3MgICAgICA9IE5VTEw7CisgICAgICAgIHNob3J0KiAgICAgIGNvbnRvdXJzICA9IE5VTEw7CisgICAgICAgIEZUX1ZlY3RvciogIHVucm91bmRlZCA9IE5VTEw7CiAKIAogICAgICAgICBsaW1pdCA9IChzaG9ydClnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHM7CkBAIC0xODU3LDkgKzE5NjIsMTAgQEAKICAgICAgICAgb3V0bGluZS50YWdzICAgICA9IE5VTEw7CiAgICAgICAgIG91dGxpbmUuY29udG91cnMgPSBOVUxMOwogCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHMsIG91dGxpbmUubl9wb2ludHMgKSAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWdzLCBvdXRsaW5lLm5fcG9pbnRzICkgICAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCBjb250b3Vycywgb3V0bGluZS5uX3BvaW50cyApICkKKyAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBvaW50cywgb3V0bGluZS5uX3BvaW50cyApICAgIHx8CisgICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWdzLCBvdXRsaW5lLm5fcG9pbnRzICkgICAgICB8fAorICAgICAgICAgICAgIEZUX05FV19BUlJBWSggY29udG91cnMsIG91dGxpbmUubl9wb2ludHMgKSAgfHwKKyAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIHVucm91bmRlZCwgb3V0bGluZS5uX3BvaW50cyApICkKICAgICAgICAgICBnb3RvIEV4aXQxOwogCiAgICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7CkBAIC0xOTA4LDYgKzIwMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucm91bmRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpb3V0bGluZS5uX3BvaW50cyApICkgKQogICAgICAgICAgIGdvdG8gRXhpdDE7CiAKQEAgLTE5MzUsMTQgKzIwNDIsMTkgQEAKICAgICAgICAgLyogcmVjYWxjdWxhdGUgbGluZWFyIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2VzICovCiAgICAgICAgIC8qIGlmIHdlIGRvbid0IGhhdmUgSFZBUiBhbmQgVlZBUiwgcmVzcGVjdGl2ZWx5ICAgICAgICAqLwogICAgICAgICBpZiAoICEoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYgVFRfRkFDRV9GTEFHX1ZBUl9IQURWQU5DRSApICkKLSAgICAgICAgICBsb2FkZXItPmxpbmVhciA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OworICAgICAgICAgIGxvYWRlci0+bGluZWFyID0KKyAgICAgICAgICAgIEZUX1BJWF9ST1VORCggdW5yb3VuZGVkW291dGxpbmUubl9wb2ludHMgLSAzXS54IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yb3VuZGVkW291dGxpbmUubl9wb2ludHMgLSA0XS54ICkgLyA2NDsKICAgICAgICAgaWYgKCAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfVkFEVkFOQ0UgKSApCi0gICAgICAgICAgbG9hZGVyLT52YWR2YW5jZSA9IGxvYWRlci0+cHA0LnggLSBsb2FkZXItPnBwMy54OworICAgICAgICAgIGxvYWRlci0+dmFkdmFuY2UgPQorICAgICAgICAgICAgRlRfUElYX1JPVU5EKCB1bnJvdW5kZWRbb3V0bGluZS5uX3BvaW50cyAtIDFdLnggLQorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJvdW5kZWRbb3V0bGluZS5uX3BvaW50cyAtIDJdLnggKSAvIDY0OwogCiAgICAgICBFeGl0MToKICAgICAgICAgRlRfRlJFRSggb3V0bGluZS5wb2ludHMgKTsKICAgICAgICAgRlRfRlJFRSggb3V0bGluZS50YWdzICk7CiAgICAgICAgIEZUX0ZSRUUoIG91dGxpbmUuY29udG91cnMgKTsKKyAgICAgICAgRlRfRlJFRSggdW5yb3VuZGVkICk7CiAKICAgICAgICAgaWYgKCBlcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwpAQCAtMjAwMiw3ICsyMTE0LDcgQEAKICAgICAgICAgICBGVF9JbnQgIGxpbmVhcl92YWR2YW5jZTsKIAogCi0gICAgICAgICAgLyogRWFjaCB0aW1lIHdlIGNhbGwgbG9hZF90cnVldHlwZV9nbHlwaCBpbiB0aGlzIGxvb3AsIHRoZSAgICovCisgICAgICAgICAgLyogRWFjaCB0aW1lIHdlIGNhbGwgYGxvYWRfdHJ1ZXR5cGVfZ2x5cGgnIGluIHRoaXMgbG9vcCwgdGhlICovCiAgICAgICAgICAgLyogdmFsdWUgb2YgYGdsb2FkZXIuYmFzZS5zdWJnbHlwaHMnIGNhbiBjaGFuZ2UgZHVlIHRvIHRhYmxlICovCiAgICAgICAgICAgLyogcmVhbGxvY2F0aW9ucy4gIFdlIHRodXMgbmVlZCB0byByZWNvbXB1dGUgdGhlIHN1YmdseXBoICAgICovCiAgICAgICAgICAgLyogcG9pbnRlciBvbiBlYWNoIGl0ZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDQ1LDEyICsyMTU3LDE0IEBACiAgICAgICAgICAgaWYgKCBudW1fcG9pbnRzID09IG51bV9iYXNlX3BvaW50cyApCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIC8qIGdsb2FkZXItPmJhc2Uub3V0bGluZSBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czogICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIDAgLSgxKS0+IHN0YXJ0X3BvaW50IC0oMiktPiBudW1fYmFzZV9wb2ludHMgLSgzKS0+IG5fcG9pbnRzLiAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgxKTogZXhpc3RzIGZyb20gdGhlIGJlZ2lubmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgyKTogY29tcG9uZW50cyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc28gZmFyICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgzKTogdGhlIG5ld2x5IGxvYWRlZCBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qIGdsb2FkZXItPmJhc2Uub3V0bGluZSBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czogICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAwIC0tLS0+IHN0YXJ0X3BvaW50IC0tLS0+IG51bV9iYXNlX3BvaW50cyAtLS0tPiBuX3BvaW50cyAqLworICAgICAgICAgIC8qICAgICgxKSAgICAgICAgICAgICAgICgyKSAgICAgICAgICAgICAgICAgICAoMykgICAgICAgICAgICovCisgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAvKiAoMSkgcG9pbnRzIHRoYXQgZXhpc3QgZnJvbSB0aGUgYmVnaW5uaW5nICAgICAgICAgICAgICAgICAqLworICAgICAgICAgIC8qICgyKSBjb21wb25lbnQgcG9pbnRzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzbyBmYXIgICAgICAgICovCisgICAgICAgICAgLyogKDMpIHBvaW50cyBvZiB0aGUgbmV3bHkgbG9hZGVkIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICBlcnJvciA9IFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0NvbXBvbmVudCggbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJnbHlwaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfcG9pbnQsCkBAIC0yMDY2LDYgKzIxODAsNyBAQAogICAgICAgICBsb2FkZXItPmluc19wb3MgPSBpbnNfcG9zOwogICAgICAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgJiYKICNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKKyAgICAgICAgICAgICBzdWJnbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9JTlNUUiAmJgogI2VuZGlmCiAgICAgICAgICAgICAgbnVtX3BvaW50cyA+IHN0YXJ0X3BvaW50ICkKQEAgLTIwNzcsNiArMjE5MiwxMSBAQAogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIC8qIHJldGFpbiB0aGUgb3ZlcmxhcCBmbGFnICovCisgICAgICBpZiAoIGdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBocyAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBnbG9hZGVyLT5iYXNlLnN1YmdseXBoc1swXS5mbGFncyAmIE9WRVJMQVBfQ09NUE9VTkQgKQorICAgICAgICBnbG9hZGVyLT5iYXNlLm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9PVkVSTEFQOwogICAgIH0KIAogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxMzIsNyArMjI1Miw3IEBACiAKICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggPSBiYm94LnhNaW47CiAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gYmJveC55TWF4OwotICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IGxvYWRlci0+cHAyLnggLSBsb2FkZXItPnBwMS54OworICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IFNVQl9MT05HKGxvYWRlci0+cHAyLngsIGxvYWRlci0+cHAxLngpOwogCiAgICAgLyogQWRqdXN0IGFkdmFuY2Ugd2lkdGggdG8gdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgaGRteCB0YWJsZSAgICovCiAgICAgLyogdW5sZXNzIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTIGlzIHNldCBvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCkBAIC0yMTk2LDEzICsyMzE2LDE0IEBACiAgICAgICBpZiAoIGZhY2UtPnZlcnRpY2FsX2luZm8gICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApCiAgICAgICB7Ci0gICAgICAgIHRvcCA9IChGVF9TaG9ydClGVF9EaXZGaXgoIGxvYWRlci0+cHAzLnkgLSBiYm94LnlNYXgsCisgICAgICAgIHRvcCA9IChGVF9TaG9ydClGVF9EaXZGaXgoIFNVQl9MT05HKCBsb2FkZXItPnBwMy55LCBiYm94LnlNYXggKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSApOwogCiAgICAgICAgIGlmICggbG9hZGVyLT5wcDMueSA8PSBsb2FkZXItPnBwNC55ICkKICAgICAgICAgICBhZHZhbmNlID0gMDsKICAgICAgICAgZWxzZQotICAgICAgICAgIGFkdmFuY2UgPSAoRlRfVVNob3J0KUZUX0RpdkZpeCggbG9hZGVyLT5wcDMueSAtIGxvYWRlci0+cHA0LnksCisgICAgICAgICAgYWR2YW5jZSA9IChGVF9VU2hvcnQpRlRfRGl2Rml4KCBTVUJfTE9ORyggbG9hZGVyLT5wcDMueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPnBwNC55ICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlICk7CiAgICAgICB9CiAgICAgICBlbHNlCkBAIC0yMjc2LDEzICsyMzk3LDEzIEBACiAgICAgICAvKiBYWFg6IGZvciBub3csIHdlIGhhdmUgbm8gYmV0dGVyIGFsZ29yaXRobSBmb3IgdGhlIGxzYiwgYnV0IGl0ICovCiAgICAgICAvKiAgICAgIHNob3VsZCB3b3JrIGZpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1ggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSAvIDI7CisgICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSBTVUJfTE9ORyggZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlIC8gMiApOwogICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEJlYXJpbmdZID0gdG9wOwogICAgICAgZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgID0gYWR2YW5jZTsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gRlRfRXJyX09rOwogICB9CiAKIApAQCAtMjU4OSwxMSArMjcxMCw2IEBACiAKICAgICAgIGlmICggcmVleGVjdXRlICkKICAgICAgIHsKLSAgICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZS0+Y3Z0X3NpemU7IGkrKyApCi0gICAgICAgICAgc2l6ZS0+Y3Z0W2ldID0gRlRfTXVsRml4KCBmYWNlLT5jdnRbaV0sIHNpemUtPnR0bWV0cmljcy5zY2FsZSApOwogICAgICAgICBlcnJvciA9IHR0X3NpemVfcnVuX3ByZXAoIHNpemUsIHBlZGFudGljICk7CiAgICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICAgIHJldHVybiBlcnJvcjsKQEAgLTI2NTYsMzMgKzI3NzIsMzcgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGxvYWQgYSBzaW5nbGUgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdCwgICovCi0gIC8qICAgIGZvciBhIGdpdmVuIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBzaXplIGF0IHdoaWNoIHRoZSBnbHlwaCAqLwotICAvKiAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHNjYWxlZC9sb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9Mb2FkX0dseXBoCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBnbHlwaCB3aXRoaW4gYSBnaXZlbiBnbHlwaCBzbG90LAorICAgKiAgIGZvciBhIGdpdmVuIHNpemUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBnbHlwaCA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2xvdCBvYmplY3Qgd2hlcmUgdGhlIGdseXBoCisgICAqICAgICB3aWxsIGJlIGxvYWRlZC4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGgKKyAgICogICAgIG11c3QgYmUgc2NhbGVkL2xvYWRlZC4KKyAgICoKKyAgICogICBnbHlwaF9pbmRleCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBnbHlwaCBpbiB0aGUgZm9udCBmaWxlLgorICAgKgorICAgKiAgIGxvYWRfZmxhZ3MgOjoKKyAgICogICAgIEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZQorICAgKiAgICAgRlRfTE9BRF9YWFggY29uc3RhbnRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlCisgICAqICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUKKyAgICogICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwKKyAgICogICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX0xvYWRfR2x5cGgoIFRUX1NpemUgICAgICAgc2l6ZSwKICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKQEAgLTI2OTIsMTMgKzI4MTIsNiBAQAogICAgIEZUX0Vycm9yICAgICAgZXJyb3I7CiAgICAgVFRfTG9hZGVyUmVjICBsb2FkZXI7CiAKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jZGVmaW5lIElTX0RFRkFVTFRfSU5TVEFOQ0UgICggISggRlRfSVNfTkFNRURfSU5TVEFOQ0UoIGdseXBoLT5mYWNlICkgfHwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JU19WQVJJQVRJT04oIGdseXBoLT5mYWNlICkgICAgICApICkKLSNlbHNlCi0jZGVmaW5lIElTX0RFRkFVTFRfSU5TVEFOQ0UgIDEKLSNlbmRpZgotCiAKICAgICBGVF9UUkFDRTEoKCAiVFRfTG9hZF9HbHlwaDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwogCkBAIC0yNzA3LDcgKzI4MjAsNyBAQAogICAgIC8qIHRyeSB0byBsb2FkIGVtYmVkZGVkIGJpdG1hcCAoaWYgYW55KSAqLwogICAgIGlmICggc2l6ZS0+c3RyaWtlX2luZGV4ICE9IDB4RkZGRkZGRkZVTCAgICAgICYmCiAgICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0JJVE1BUCApID09IDAgJiYKLSAgICAgICAgIElTX0RFRkFVTFRfSU5TVEFOQ0UgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICBJU19ERUZBVUxUX0lOU1RBTkNFKCBnbHlwaC0+ZmFjZSApICAgICAgKQogICAgIHsKICAgICAgIEZUX0ZpeGVkICB4X3NjYWxlID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnhfc2NhbGU7CiAgICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9IHNpemUtPnJvb3QubWV0cmljcy55X3NjYWxlOwpAQCAtMjg4Miw4ICsyOTk1LDYgQEAKICAgICAgIGVycm9yID0gY29tcHV0ZV9nbHlwaF9tZXRyaWNzKCAmbG9hZGVyLCBnbHlwaF9pbmRleCApOwogICAgIH0KIAotICAgIHR0X2xvYWRlcl9kb25lKCAmbG9hZGVyICk7Ci0KICAgICAvKiBTZXQgdGhlIGBoaWdoIHByZWNpc2lvbicgYml0IGZsYWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAvKiBUaGlzIGlzIF9jcml0aWNhbF8gdG8gZ2V0IGNvcnJlY3Qgb3V0cHV0IGZvciBtb25vY2hyb21lICAgICAgKi8KICAgICAvKiBUcnVlVHlwZSBnbHlwaHMgYXQgYWxsIHNpemVzIHVzaW5nIHRoZSBieXRlY29kZSBpbnRlcnByZXRlci4gKi8KQEAgLTI4OTIsNiArMzAwMywxNSBAQAogICAgICAgICAgc2l6ZS0+bWV0cmljcy0+eV9wcGVtIDwgMjQgICAgICAgICApCiAgICAgICBnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OOwogCisgICAgRlRfVFJBQ0UxKCggIiAgc3ViZ2x5cGhzID0gJXUsIGNvbnRvdXJzID0gJWhkLCBwb2ludHMgPSAlaGQsIgorICAgICAgICAgICAgICAgICIgZmxhZ3MgPSAweCUuM3hcbiIsCisgICAgICAgICAgICAgICAgbG9hZGVyLmdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBocywKKyAgICAgICAgICAgICAgICBnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzLAorICAgICAgICAgICAgICAgIGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzLAorICAgICAgICAgICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzICkpOworCisgICAgdHRfbG9hZGVyX2RvbmUoICZsb2FkZXIgKTsKKwogICBFeGl0OgogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCiAgICAgaWYgKCBlcnJvciApCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oIGIvc3JjL3RydWV0eXBlL3R0Z2xvYWQuaAppbmRleCBkMjM3Y2ZkLi44ZjcyY2Q1IDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oCisrKyBiL3NyYy90cnVldHlwZS90dGdsb2FkLmgKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0Z2xvYWQuaAorICoKKyAqICAgVHJ1ZVR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVFRHTE9BRF9IXwogI2RlZmluZSBUVEdMT0FEX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAidHRvYmpzLmgiCiAKICNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGd4dmFyLmMgYi9zcmMvdHJ1ZXR5cGUvdHRneHZhci5jCmluZGV4IDI5YWIyYTQuLmI0NjIyNjMgMTAwNjQ0Ci0tLSBhL3NyYy90cnVldHlwZS90dGd4dmFyLmMKKysrIGIvc3JjL3RydWV0eXBlL3R0Z3h2YXIuYwpAQCAtMSw1MyArMSw1MyBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRneHZhci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZywgYW5kIEdlb3JnZSBXaWxsaWFtcy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdHRneHZhci5jCisgKgorICogICBUcnVlVHlwZSBHWCBGb250IFZhcmlhdGlvbiBsb2FkZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBHZW9yZ2UgV2lsbGlhbXMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlIGRvY3VtZW50cyB0aGUgYGZ2YXInLCBgZ3ZhcicsIGBjdmFyJywgYW5kIGBhdmFyJyB0YWJsZXMgYXQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2W2ZnY2FddmFyLmh0bWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBkb2N1bWVudGF0aW9uIGZvciBgZ3ZhcicgaXMgbm90IGludGVsbGlnaWJsZTsgYGN2YXInIHJlZmVycyB5b3UgICAqLwotICAvKiB0byBgZ3ZhcicgYW5kIGlzIHRodXMgYWxzbyBpbmNvbXByZWhlbnNpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBkb2N1bWVudGF0aW9uIGZvciBgYXZhcicgYXBwZWFycyBjb3JyZWN0LCBidXQgQXBwbGUgaGFzIG5vIGZvbnRzICAqLwotICAvKiB3aXRoIGFuIGBhdmFyJyB0YWJsZSwgc28gaXQgaXMgaGFyZCB0byB0ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1hbnkgdGhhbmtzIHRvIEpvaG4gSmVua2lucyAoYXQgQXBwbGUpIGluIGZpZ3VyaW5nIHRoaXMgb3V0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlJ3MgYGtlcm4nIHRhYmxlIGhhcyBzb21lIHJlZmVyZW5jZXMgdG8gdHVwbGUgaW5kaWNlcywgYnV0IGFzICAgICAqLwotICAvKiB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIHdoZXJlIHRoZXNlIGluZGljZXMgYXJlIGRlZmluZWQsIG5vciBob3cgdG8gICAgKi8KLSAgLyogaW50ZXJwb2xhdGUgdGhlIGtlcm5pbmcgdmFsdWVzIChkaWZmZXJlbnQgdHVwbGVzIGhhdmUgZGlmZmVyZW50ICAgICAgICovCi0gIC8qIGNsYXNzZXMpIHRoaXMgaXNzdWUgaXMgaWdub3JlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBcHBsZSBkb2N1bWVudHMgdGhlIGBmdmFyJywgYGd2YXInLCBgY3ZhcicsIGFuZCBgYXZhcicgdGFibGVzIGF0CisgICAqCisgICAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNltmZ2NhXXZhci5odG1sCisgICAqCisgICAqIFRoZSBkb2N1bWVudGF0aW9uIGZvciBgZ3ZhcicgaXMgbm90IGludGVsbGlnaWJsZTsgYGN2YXInIHJlZmVycyB5b3UKKyAgICogdG8gYGd2YXInIGFuZCBpcyB0aHVzIGFsc28gaW5jb21wcmVoZW5zaWJsZS4KKyAgICoKKyAgICogVGhlIGRvY3VtZW50YXRpb24gZm9yIGBhdmFyJyBhcHBlYXJzIGNvcnJlY3QsIGJ1dCBBcHBsZSBoYXMgbm8gZm9udHMKKyAgICogd2l0aCBhbiBgYXZhcicgdGFibGUsIHNvIGl0IGlzIGhhcmQgdG8gdGVzdC4KKyAgICoKKyAgICogTWFueSB0aGFua3MgdG8gSm9obiBKZW5raW5zIChhdCBBcHBsZSkgaW4gZmlndXJpbmcgdGhpcyBvdXQuCisgICAqCisgICAqCisgICAqIEFwcGxlJ3MgYGtlcm4nIHRhYmxlIGhhcyBzb21lIHJlZmVyZW5jZXMgdG8gdHVwbGUgaW5kaWNlcywgYnV0IGFzCisgICAqIHRoZXJlIGlzIG5vIGluZGljYXRpb24gd2hlcmUgdGhlc2UgaW5kaWNlcyBhcmUgZGVmaW5lZCwgbm9yIGhvdyB0bworICAgKiBpbnRlcnBvbGF0ZSB0aGUga2VybmluZyB2YWx1ZXMgKGRpZmZlcmVudCB0dXBsZXMgaGF2ZSBkaWZmZXJlbnQKKyAgICogY2xhc3NlcykgdGhpcyBpc3N1ZSBpcyBpZ25vcmVkLgorICAgKgorICAgKi8KIAogCiAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAjaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfTElTVF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHR0YWdzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG1tLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRsaXN0Lmg+CiAKICNpbmNsdWRlICJ0dHBsb2FkLmgiCiAjaW5jbHVkZSAidHRneHZhci5oIgpAQCAtNjcsMTQgKzY3LDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICA6IChzdHJlYW0pLT5saW1pdAogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogc29tZSBtYWNyb3Mgd2UgbmVlZCAqLworI2RlZmluZSBGVF9mZG90MTRUb0ZpeGVkKCB4ICkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAoRlRfRml4ZWQpKCAoRlRfVUxvbmcpKHgpIDw8IDIgKSApCisjZGVmaW5lIEZUX2ludFRvRml4ZWQoIGkgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAoRlRfRml4ZWQpKCAoRlRfVUxvbmcpKGkpIDw8IDE2ICkgKQorI2RlZmluZSBGVF9mZG90NlRvRml4ZWQoIGkgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICggKEZUX0ZpeGVkKSggKEZUX1VMb25nKShpKSA8PCAxMCApICkKKyNkZWZpbmUgRlRfZml4ZWRUb0ludCggeCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAoRlRfU2hvcnQpKCAoICh4KSArIDB4ODAwMFUgKSA+PiAxNiApICkKKyNkZWZpbmUgRlRfZml4ZWRUb0Zkb3Q2KCB4ICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoIChGVF9Qb3MpKCAoICh4KSArIDB4MjAwICkgPj4gMTAgKSApCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRneHZhcgorI2RlZmluZSBGVF9DT01QT05FTlQgIHR0Z3h2YXIKIAogCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODYsMTIgKzk5LDEyIEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gQUxMX1BPSU5UUyBpcyB1c2VkIGluIGBmdF92YXJfcmVhZHBhY2tlZHBvaW50cycuICBJdCAgICAgICAgKi8KLSAgLyogaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYSBkZWx0YSBmb3IgZXZlcnkgcG9pbnQgd2l0aG91dCBuZWVkaW5nIHRvICAgICovCi0gIC8qIGVudW1lcmF0ZSBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBBTExfUE9JTlRTIGlzIHVzZWQgaW4gYGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzJy4gIEl0CisgICAqIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEgZGVsdGEgZm9yIGV2ZXJ5IHBvaW50IHdpdGhvdXQgbmVlZGluZyB0bworICAgKiBlbnVtZXJhdGUgYWxsIG9mIHRoZW0uCisgICAqLwogCiAgIC8qIGVuc3VyZSB0aGF0IHZhbHVlIGAwJyBoYXMgdGhlIHNhbWUgd2lkdGggYXMgYSBwb2ludGVyICovCiAjZGVmaW5lIEFMTF9QT0lOVFMgIChGVF9VU2hvcnQqKX4oRlRfUHRyRGlzdCkwCkBAIC0xMDEsMjkgKzExNCwzMiBAQAogI2RlZmluZSBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSyAgMHg3RlUKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQgYSBzZXQgb2YgcG9pbnRzIHRvIHdoaWNoIHRoZSBmb2xsb3dpbmcgZGVsdGFzIHdpbGwgYXBwbHkuICAgICAqLwotICAvKiAgICBQb2ludHMgYXJlIHBhY2tlZCB3aXRoIGEgcnVuIGxlbmd0aCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGRhdGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICA6OiBUaGUgc2l6ZSBvZiB0aGUgdGFibGUgaG9sZGluZyB0aGUgZGF0YS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50X2NudCA6OiBUaGUgbnVtYmVyIG9mIHBvaW50cyByZWFkLiAgQSB6ZXJvIHZhbHVlIG1lYW5zIHRoYXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgYWxsIHBvaW50cyBpbiB0aGUgZ2x5cGggd2lsbCBiZSBhZmZlY3RlZCwgd2l0aG91dCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGVudW1lcmF0aW5nIHRoZW0gaW5kaXZpZHVhbGx5LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gYXJyYXkgb2YgRlRfVVNob3J0IGNvbnRhaW5pbmcgdGhlIGFmZmVjdGVkIHBvaW50cyBvciB0aGUgICAgICAgICovCi0gIC8qICAgIHNwZWNpYWwgdmFsdWUgQUxMX1BPSU5UUy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF92YXJfcmVhZHBhY2tlZHBvaW50cworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUmVhZCBhIHNldCBvZiBwb2ludHMgdG8gd2hpY2ggdGhlIGZvbGxvd2luZyBkZWx0YXMgd2lsbCBhcHBseS4KKyAgICogICBQb2ludHMgYXJlIHBhY2tlZCB3aXRoIGEgcnVuIGxlbmd0aCBlbmNvZGluZy4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIGRhdGEgc3RyZWFtLgorICAgKgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIFRoZSBzaXplIG9mIHRoZSB0YWJsZSBob2xkaW5nIHRoZSBkYXRhLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIHBvaW50X2NudCA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBwb2ludHMgcmVhZC4gIEEgemVybyB2YWx1ZSBtZWFucyB0aGF0CisgICAqICAgICBhbGwgcG9pbnRzIGluIHRoZSBnbHlwaCB3aWxsIGJlIGFmZmVjdGVkLCB3aXRob3V0CisgICAqICAgICBlbnVtZXJhdGluZyB0aGVtIGluZGl2aWR1YWxseS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBBbiBhcnJheSBvZiBGVF9VU2hvcnQgY29udGFpbmluZyB0aGUgYWZmZWN0ZWQgcG9pbnRzIG9yIHRoZQorICAgKiAgIHNwZWNpYWwgdmFsdWUgQUxMX1BPSU5UUy4KKyAgICovCiAgIHN0YXRpYyBGVF9VU2hvcnQqCiAgIGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBGVF9TdHJlYW0gIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgc2l6ZSwKQEAgLTIxMSwzNCArMjI3LDQxIEBACiAjZGVmaW5lIEdYX0RUX0RFTFRBX1JVTl9DT1VOVF9NQVNLICAweDNGVQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhZCBhIHNldCBvZiBkZWx0YXMuICBUaGVzZSBhcmUgcGFja2VkIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4gICovCi0gIC8qICAgIHBvaW50cy4gIEluIHBhcnRpY3VsYXIgdGhlcmUgaXMgbm8gb3ZlcmFsbCBjb3VudC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICA6OiBUaGUgZGF0YSBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgIDo6IFRoZSBzaXplIG9mIHRoZSB0YWJsZSBob2xkaW5nIHRoZSBkYXRhLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWx0YV9jbnQgOjogVGhlIG51bWJlciBvZiBkZWx0YXMgdG8gYmUgcmVhZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBhcnJheSBvZiBGVF9TaG9ydCBjb250YWluaW5nIHRoZSBkZWx0YXMgZm9yIHRoZSBhZmZlY3RlZCAgICAgICAgKi8KLSAgLyogICAgcG9pbnRzLiAgKFRoaXMgb25seSBnZXRzIHRoZSBkZWx0YXMgZm9yIG9uZSBkaW1lbnNpb24uICBJdCB3aWxsICAgICovCi0gIC8qICAgIGdlbmVyYWxseSBiZSBjYWxsZWQgdHdpY2UsIG9uY2UgZm9yIHgsIG9uY2UgZm9yIHkuICBXaGVuIHVzZWQgaW4gICAqLwotICAvKiAgICBjdnQgdGFibGUsIGl0IHdpbGwgb25seSBiZSBjYWxsZWQgb25jZS4pICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9TaG9ydCoKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUmVhZCBhIHNldCBvZiBkZWx0YXMuICBUaGVzZSBhcmUgcGFja2VkIHNsaWdodGx5IGRpZmZlcmVudGx5IHRoYW4KKyAgICogICBwb2ludHMuICBJbiBwYXJ0aWN1bGFyIHRoZXJlIGlzIG5vIG92ZXJhbGwgY291bnQuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBkYXRhIHN0cmVhbS4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgc2l6ZSBvZiB0aGUgdGFibGUgaG9sZGluZyB0aGUgZGF0YS4KKyAgICoKKyAgICogICBkZWx0YV9jbnQgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZGVsdGFzIHRvIGJlIHJlYWQuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgQW4gYXJyYXkgb2YgRlRfRml4ZWQgY29udGFpbmluZyB0aGUgZGVsdGFzIGZvciB0aGUgYWZmZWN0ZWQKKyAgICogICBwb2ludHMuICAoVGhpcyBvbmx5IGdldHMgdGhlIGRlbHRhcyBmb3Igb25lIGRpbWVuc2lvbi4gIEl0IHdpbGwKKyAgICogICBnZW5lcmFsbHkgYmUgY2FsbGVkIHR3aWNlLCBvbmNlIGZvciB4LCBvbmNlIGZvciB5LiAgV2hlbiB1c2VkIGluCisgICAqICAgY3Z0IHRhYmxlLCBpdCB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uY2UuKQorICAgKgorICAgKiAgIFdlIHVzZSBGVF9GaXhlZCB0byBhdm9pZCBhY2N1bXVsYXRpb24gZXJyb3JzIHdoaWxlIHN1bW1pbmcgdXAgYWxsCisgICAqICAgZGVsdGFzICh0aGUgcm91bmRpbmcgdG8gaW50ZWdlciB2YWx1ZXMgaGFwcGVucyBhcyB0aGUgdmVyeSBsYXN0CisgICAqICAgc3RlcCkuCisgICAqLworICBzdGF0aWMgRlRfRml4ZWQqCiAgIGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKCBGVF9TdHJlYW0gIHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGVsdGFfY250ICkKICAgewotICAgIEZUX1Nob3J0ICAqZGVsdGFzID0gTlVMTDsKKyAgICBGVF9GaXhlZCAgKmRlbHRhcyA9IE5VTEw7CiAgICAgRlRfVUludCAgICBydW5jbnQsIGNudDsKICAgICBGVF9VSW50ICAgIGksIGo7CiAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKQEAgLTI3MiwxMyArMjk1LDEzIEBACiAgICAgICB7CiAgICAgICAgIC8qIGBydW5jbnQnIHNob3J0cyBmcm9tIHRoZSBzdGFjayAqLwogICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSBjbnQgJiYgaSA8IGRlbHRhX2NudDsgaisrICkKLSAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX0dFVF9TSE9SVCgpOworICAgICAgICAgIGRlbHRhc1tpKytdID0gRlRfaW50VG9GaXhlZCggRlRfR0VUX1NIT1JUKCkgKTsKICAgICAgIH0KICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgLyogYHJ1bmNudCcgc2lnbmVkIGJ5dGVzIGZyb20gdGhlIHN0YWNrICovCiAgICAgICAgIGZvciAoIGogPSAwOyBqIDw9IGNudCAmJiBpIDwgZGVsdGFfY250OyBqKysgKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gRlRfR0VUX0NIQVIoKTsKKyAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX2ludFRvRml4ZWQoIEZUX0dFVF9DSEFSKCkgKTsKICAgICAgIH0KIAogICAgICAgaWYgKCBqIDw9IGNudCApCkBAIC0yOTMsMTggKzMxNiwxOSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfbG9hZF9hdmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSB0aGUgYGF2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJdCBuZWVkIG5vdCBiZSwgc28gd2UgcmV0dXJuICAgKi8KLSAgLyogICAgbm90aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGZ0X3Zhcl9sb2FkX2F2YXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFBhcnNlIHRoZSBgYXZhcicgdGFibGUgaWYgcHJlc2VudC4gIEl0IG5lZWQgbm90IGJlLCBzbyB3ZSByZXR1cm4KKyAgICogICBub3RoaW5nLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGZvbnQgZmFjZS4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIGZ0X3Zhcl9sb2FkX2F2YXIoIFRUX0ZhY2UgIGZhY2UgKQogICB7CkBAIC0zNzcsOSArNDAxLDEwIEBACiAKICAgICAgIGZvciAoIGogPSAwOyBqIDwgc2VnbWVudC0+cGFpckNvdW50OyBqKysgKQogICAgICAgewotICAgICAgICAvKiBjb252ZXJ0IHRvIEZpeGVkICovCi0gICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCA9IEZUX0dFVF9TSE9SVCgpICogNDsKLSAgICAgICAgc2VnbWVudC0+Y29ycmVzcG9uZGVuY2Vbal0udG9Db29yZCAgID0gRlRfR0VUX1NIT1JUKCkgKiA0OworICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS5mcm9tQ29vcmQgPQorICAgICAgICAgIEZUX2Zkb3QxNFRvRml4ZWQoIEZUX0dFVF9TSE9SVCgpICk7CisgICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgPQorICAgICAgICAgIEZUX2Zkb3QxNFRvRml4ZWQoIEZUX0dFVF9TSE9SVCgpICk7CiAKICAgICAgICAgRlRfVFJBQ0U1KCggIiAgICBtYXBwaW5nICUuNWYgdG8gJS41ZlxuIiwKICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC0+Y29ycmVzcG9uZGVuY2Vbal0uZnJvbUNvb3JkIC8gNjU1MzYuMCwKQEAgLTM5NCwxNyArNDE5LDYgQEAKICAgfQogCiAKLSAgLyogc29tZSBtYWNyb3Mgd2UgbmVlZCAqLwotI2RlZmluZSBGVF9GSVhFRF9PTkUgICggKEZUX0ZpeGVkKTB4MTAwMDAgKQotCi0jZGVmaW5lIEZUX2Zkb3QxNFRvRml4ZWQoIHggKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICggKEZUX0ZpeGVkKSggKEZUX1VMb25nKSh4KSA8PCAyICkgKQotI2RlZmluZSBGVF9pbnRUb0ZpeGVkKCBpICkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCAoRlRfRml4ZWQpKCAoRlRfVUxvbmcpKGkpIDw8IDE2ICkgKQotI2RlZmluZSBGVF9maXhlZFRvSW50KCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCAoRlRfU2hvcnQpKCAoIChGVF9VSW50MzIpKHgpICsgMHg4MDAwVSApID4+IDE2ICkgKQotCi0KICAgc3RhdGljIEZUX0Vycm9yCiAgIGZ0X3Zhcl9sb2FkX2l0ZW1fdmFyaWF0aW9uX3N0b3JlKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgIG9mZnNldCwKQEAgLTcwMiwyOSArNzE2LDMwIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9sb2FkX2h2dmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB2ZXJ0aWNhbCcgaXMgemVybywgcGFyc2UgdGhlIGBIVkFSJyB0YWJsZSBhbmQgc2V0ICAgICAgICAgICAgICAqLwotICAvKiAgICBgYmxlbmQtPmh2YXJfbG9hZGVkJyB0byBUUlVFLiAgT24gc3VjY2VzcywgYGJsZW5kLT5odmFyX2NoZWNrZWQnICAgKi8KLSAgLyogICAgaXMgc2V0IHRvIFRSVUUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgdmVydGljYWwnIGlzIG5vdCB6ZXJvLCBwYXJzZSB0aGUgYFZWQVInIHRhYmxlIGFuZCBzZXQgICAgICAgICAgKi8KLSAgLyogICAgYGJsZW5kLT52dmFyX2xvYWRlZCcgdG8gVFJVRS4gIE9uIHN1Y2Nlc3MsIGBibGVuZC0+dnZhcl9jaGVja2VkJyAgICovCi0gIC8qICAgIGlzIHNldCB0byBUUlVFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29tZSBtZW1vcnkgbWF5IHJlbWFpbiBhbGxvY2F0ZWQgb24gZXJyb3I7IGl0IGlzIGFsd2F5cyBmcmVlZCBpbiAgICovCi0gIC8qICAgIGB0dF9kb25lX2JsZW5kJywgaG93ZXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogVGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF92YXJfbG9hZF9odnZhcgorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgSWYgYHZlcnRpY2FsJyBpcyB6ZXJvLCBwYXJzZSB0aGUgYEhWQVInIHRhYmxlIGFuZCBzZXQKKyAgICogICBgYmxlbmQtPmh2YXJfbG9hZGVkJyB0byBUUlVFLiAgT24gc3VjY2VzcywgYGJsZW5kLT5odmFyX2NoZWNrZWQnCisgICAqICAgaXMgc2V0IHRvIFRSVUUuCisgICAqCisgICAqICAgSWYgYHZlcnRpY2FsJyBpcyBub3QgemVybywgcGFyc2UgdGhlIGBWVkFSJyB0YWJsZSBhbmQgc2V0CisgICAqICAgYGJsZW5kLT52dmFyX2xvYWRlZCcgdG8gVFJVRS4gIE9uIHN1Y2Nlc3MsIGBibGVuZC0+dnZhcl9jaGVja2VkJworICAgKiAgIGlzIHNldCB0byBUUlVFLgorICAgKgorICAgKiAgIFNvbWUgbWVtb3J5IG1heSByZW1haW4gYWxsb2NhdGVkIG9uIGVycm9yOyBpdCBpcyBhbHdheXMgZnJlZWQgaW4KKyAgICogICBgdHRfZG9uZV9ibGVuZCcsIGhvd2V2ZXIuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgZm9udCBmYWNlLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgZnRfdmFyX2xvYWRfaHZ2YXIoIFRUX0ZhY2UgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2ZXJ0aWNhbCApCkBAIC04NzIsNyArODg3LDcgQEAKICAgICAvKiBvdXRlciBsb29wIHN0ZXBzIHRocm91Z2ggbWFzdGVyIGRlc2lnbnMgdG8gYmUgYmxlbmRlZCAqLwogICAgIGZvciAoIG1hc3RlciA9IDA7IG1hc3RlciA8IHZhckRhdGEtPnJlZ2lvbklkeENvdW50OyBtYXN0ZXIrKyApCiAgICAgewotICAgICAgRlRfRml4ZWQgIHNjYWxhciAgICAgID0gRlRfRklYRURfT05FOworICAgICAgRlRfRml4ZWQgIHNjYWxhciAgICAgID0gMHgxMDAwMEw7CiAgICAgICBGVF9VSW50ICAgcmVnaW9uSW5kZXggPSB2YXJEYXRhLT5yZWdpb25JbmRpY2VzW21hc3Rlcl07CiAKICAgICAgIEdYX0F4aXNDb29yZHMgIGF4aXMgPSBpdGVtU3RvcmUtPnZhclJlZ2lvbkxpc3RbcmVnaW9uSW5kZXhdLmF4aXNMaXN0OwpAQCAtODgxLDQ3ICs4OTYsNDMgQEAKICAgICAgIC8qIGlubmVyIGxvb3Agc3RlcHMgdGhyb3VnaCBheGVzIGluIHRoaXMgcmVnaW9uICovCiAgICAgICBmb3IgKCBqID0gMDsgaiA8IGl0ZW1TdG9yZS0+YXhpc0NvdW50OyBqKyssIGF4aXMrKyApCiAgICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICBheGlzU2NhbGFyOwotCi0KICAgICAgICAgLyogY29tcHV0ZSB0aGUgc2NhbGFyIGNvbnRyaWJ1dGlvbiBvZiB0aGlzIGF4aXM7ICovCiAgICAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIHJhbmdlcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICBpZiAoIGF4aXMtPnN0YXJ0Q29vcmQgPiBheGlzLT5wZWFrQ29vcmQgfHwKICAgICAgICAgICAgICBheGlzLT5wZWFrQ29vcmQgPiBheGlzLT5lbmRDb29yZCAgICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOworICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIGVsc2UgaWYgKCBheGlzLT5zdGFydENvb3JkIDwgMCAmJgogICAgICAgICAgICAgICAgICAgYXhpcy0+ZW5kQ29vcmQgPiAwICAgJiYKICAgICAgICAgICAgICAgICAgIGF4aXMtPnBlYWtDb29yZCAhPSAwICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gRlRfRklYRURfT05FOworICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIC8qIHBlYWsgb2YgMCBtZWFucyBpZ25vcmUgdGhpcyBheGlzICovCiAgICAgICAgIGVsc2UgaWYgKCBheGlzLT5wZWFrQ29vcmQgPT0gMCApCi0gICAgICAgICAgYXhpc1NjYWxhciA9IEZUX0ZJWEVEX09ORTsKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBlbHNlIGlmICggZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPT0gYXhpcy0+cGVha0Nvb3JkICkKKyAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAvKiBpZ25vcmUgdGhpcyByZWdpb24gaWYgY29vcmRzIGFyZSBvdXQgb2YgcmFuZ2UgKi8KLSAgICAgICAgZWxzZSBpZiAoIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdIDwgYXhpcy0+c3RhcnRDb29yZCB8fAotICAgICAgICAgICAgICAgICAgZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPiBheGlzLT5lbmRDb29yZCAgICkKLSAgICAgICAgICBheGlzU2NhbGFyID0gMDsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgYSBwcm9wb3J0aW9uYWwgZmFjdG9yICovCi0gICAgICAgIGVsc2UKKyAgICAgICAgZWxzZSBpZiAoIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdIDw9IGF4aXMtPnN0YXJ0Q29vcmQgfHwKKyAgICAgICAgICAgICAgICAgIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdID49IGF4aXMtPmVuZENvb3JkICAgKQogICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBmYWNlLT5ibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tqXSA9PSBheGlzLT5wZWFrQ29vcmQgKQotICAgICAgICAgICAgYXhpc1NjYWxhciA9IEZUX0ZJWEVEX09ORTsKLSAgICAgICAgICBlbHNlIGlmICggZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPCBheGlzLT5wZWFrQ29vcmQgKQotICAgICAgICAgICAgYXhpc1NjYWxhciA9Ci0gICAgICAgICAgICAgIEZUX0RpdkZpeCggZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gLSBheGlzLT5zdGFydENvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPnBlYWtDb29yZCAtIGF4aXMtPnN0YXJ0Q29vcmQgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBheGlzU2NhbGFyID0KLSAgICAgICAgICAgICAgRlRfRGl2Rml4KCBheGlzLT5lbmRDb29yZCAtIGZhY2UtPmJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPmVuZENvb3JkIC0gYXhpcy0+cGVha0Nvb3JkICk7CisgICAgICAgICAgc2NhbGFyID0gMDsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIC8qIHRha2UgcHJvZHVjdCBvZiBhbGwgdGhlIGF4aXMgc2NhbGFycyAqLwotICAgICAgICBzY2FsYXIgPSBGVF9NdWxGaXgoIHNjYWxhciwgYXhpc1NjYWxhciApOwotCisgICAgICAgIC8qIGN1bXVsYXRpdmUgcHJvZHVjdCBvZiBhbGwgdGhlIGF4aXMgc2NhbGFycyAqLworICAgICAgICBlbHNlIGlmICggZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gPCBheGlzLT5wZWFrQ29vcmQgKQorICAgICAgICAgIHNjYWxhciA9CisgICAgICAgICAgICBGVF9NdWxEaXYoIHNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0gLSBheGlzLT5zdGFydENvb3JkLAorICAgICAgICAgICAgICAgICAgICAgICBheGlzLT5wZWFrQ29vcmQgLSBheGlzLT5zdGFydENvb3JkICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBzY2FsYXIgPQorICAgICAgICAgICAgRlRfTXVsRGl2KCBzY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPmVuZENvb3JkIC0gZmFjZS0+YmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgIGF4aXMtPmVuZENvb3JkIC0gYXhpcy0+cGVha0Nvb3JkICk7CiAgICAgICB9IC8qIHBlci1heGlzIGxvb3AgKi8KIAogICAgICAgLyogZ2V0IHRoZSBzY2FsZWQgZGVsdGEgZm9yIHRoaXMgcmVnaW9uICovCkBAIC05MzcsMjUgKzk0OCwyOSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9odmFkdmFuY2VfYWRqdXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBseSBgSFZBUicgYWR2YW5jZSB3aWR0aCBvciBgVlZBUicgYWR2YW5jZSBoZWlnaHQgYWRqdXN0bWVudCBvZiAgKi8KLSAgLyogICAgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCA6OiBJZiBzZXQsIGhhbmRsZSBgVlZBUicgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkZWx0YSAgIDo6IFBvaW50cyB0byB3aWR0aCBvciBoZWlnaHQgdmFsdWUgdGhhdCBnZXRzIG1vZGlmaWVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9odmFkdmFuY2VfYWRqdXN0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBBcHBseSBgSFZBUicgYWR2YW5jZSB3aWR0aCBvciBgVlZBUicgYWR2YW5jZSBoZWlnaHQgYWRqdXN0bWVudCBvZgorICAgKiAgIGEgZ2l2ZW4gZ2x5cGguCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBnaW5kZXggOjoKKyAgICogICAgIFRoZSBnbHlwaCBpbmRleC4KKyAgICoKKyAgICogICB2ZXJ0aWNhbCA6OgorICAgKiAgICAgSWYgc2V0LCBoYW5kbGUgYFZWQVInIHRhYmxlLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGZvbnQgZmFjZS4KKyAgICoKKyAgICogICBhZGVsdGEgOjoKKyAgICogICAgIFBvaW50cyB0byB3aWR0aCBvciBoZWlnaHQgdmFsdWUgdGhhdCBnZXRzIG1vZGlmaWVkLgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIHR0X2h2YWR2YW5jZV9hZGp1c3QoIFRUX0ZhY2UgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCwKQEAgLTExNTEsMjAgKzExNjYsMjEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2xvYWRfbXZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2UgdGhlIGBNVkFSJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIG1lbW9yeSBtYXkgcmVtYWluIGFsbG9jYXRlZCBvbiBlcnJvcjsgaXQgaXMgYWx3YXlzIGZyZWVkIGluICAgKi8KLSAgLyogICAgYHR0X2RvbmVfYmxlbmQnLCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIGZ0X3Zhcl9sb2FkX212YXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFBhcnNlIHRoZSBgTVZBUicgdGFibGUuCisgICAqCisgICAqICAgU29tZSBtZW1vcnkgbWF5IHJlbWFpbiBhbGxvY2F0ZWQgb24gZXJyb3I7IGl0IGlzIGFsd2F5cyBmcmVlZCBpbgorICAgKiAgIGB0dF9kb25lX2JsZW5kJywgaG93ZXZlci4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBmb250IGZhY2UuCisgICAqLwogICBzdGF0aWMgdm9pZAogICBmdF92YXJfbG9hZF9tdmFyKCBUVF9GYWNlICBmYWNlICkKICAgewpAQCAtMTI5NywyMiArMTMxMywyNiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9hcHBseV9tdmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcHBseSBgTVZBUicgdGFibGUgYWRqdXN0bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfYXBwbHlfbXZhcgorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQXBwbHkgYE1WQVInIHRhYmxlIGFkanVzdG1lbnRzLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGZvbnQgZmFjZS4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHR0X2FwcGx5X212YXIoIFRUX0ZhY2UgIGZhY2UgKQogICB7CiAgICAgR1hfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CiAgICAgR1hfVmFsdWUgIHZhbHVlLCBsaW1pdDsKKyAgICBGVF9TaG9ydCAgbXZhcl9oYXNjX2RlbHRhID0gMDsKKyAgICBGVF9TaG9ydCAgbXZhcl9oZHNjX2RlbHRhID0gMDsKKyAgICBGVF9TaG9ydCAgbXZhcl9obGdwX2RlbHRhID0gMDsKIAogCiAgICAgaWYgKCAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmIFRUX0ZBQ0VfRkxBR19WQVJfTVZBUiApICkKQEAgLTEzNDcsNiArMTM2NywxNCBAQAogICAgICAgICAvKiBzaW5jZSB3ZSBoYW5kbGUgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIHZhbHVlcyBhcyBGVF9TaG9ydCwgKi8KICAgICAgICAgLyogZW5zdXJlIHByb3BlciBvdmVyZmxvdyBhcml0aG1ldGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICpwID0gKEZUX1Nob3J0KSggdmFsdWUtPnVubW9kaWZpZWQgKyAoRlRfU2hvcnQpZGVsdGEgKTsKKworICAgICAgICAvKiBUcmVhdCBoYXNjLCBoZHNjIGFuZCBobGdwIHNwZWNpYWxseSwgc2VlIGJlbG93LiAqLworICAgICAgICBpZiAoIHZhbHVlLT50YWcgPT0gTVZBUl9UQUdfSEFTQyApCisgICAgICAgICAgbXZhcl9oYXNjX2RlbHRhID0gKEZUX1Nob3J0KWRlbHRhOworICAgICAgICBlbHNlIGlmICggdmFsdWUtPnRhZyA9PSBNVkFSX1RBR19IRFNDICkKKyAgICAgICAgICBtdmFyX2hkc2NfZGVsdGEgPSAoRlRfU2hvcnQpZGVsdGE7CisgICAgICAgIGVsc2UgaWYgKCB2YWx1ZS0+dGFnID09IE1WQVJfVEFHX0hMR1AgKQorICAgICAgICAgIG12YXJfaGxncF9kZWx0YSA9IChGVF9TaG9ydClkZWx0YTsKICAgICAgIH0KICAgICB9CiAKQEAgLTEzNTQsMjUgKzEzODIsNDAgQEAKICAgICB7CiAgICAgICBGVF9GYWNlICByb290ID0gJmZhY2UtPnJvb3Q7CiAKKyAgICAgIC8qCisgICAgICAgKiBBcHBseSB0aGUgZGVsdGFzIG9mIGhhc2MsIGhkc2MgYW5kIGhsZ3AgdG8gdGhlIEZUX0ZhY2UncyBhc2NlbmRlciwKKyAgICAgICAqIGRlc2NlbmRlciBhbmQgaGVpZ2h0IGF0dHJpYnV0ZXMsIG5vIG1hdHRlciBob3cgdGhleSB3ZXJlIG9yaWdpbmFsbHkKKyAgICAgICAqIGNvbXB1dGVkLgorICAgICAgICoKKyAgICAgICAqIChDb2RlIHRoYXQgaWdub3JlcyB0aG9zZSBhbmQgYWNjZXNzZXMgdGhlIGZvbnQncyBtZXRyaWNzIHZhbHVlcworICAgICAgICogZGlyZWN0bHkgaXMgYWxyZWFkeSBzZXJ2ZWQgYnkgdGhlIGRlbHRhIGFwcGxpY2F0aW9uIGNvZGUgYWJvdmUuKQorICAgICAgICoKKyAgICAgICAqIFRoZSBNVkFSIHRhYmxlIHN1cHBvcnRzIHZhcmlhdGlvbnMgZm9yIGJvdGggdHlwbyBhbmQgd2luIG1ldHJpY3MuCisgICAgICAgKiBBY2NvcmRpbmcgdG8gQmVoZGFkIEVzZmFoYm9kLCB0aGUgdGhpbmtpbmcgb2YgdGhlIHdvcmtpbmcgZ3JvdXAgd2FzCisgICAgICAgKiB0aGF0IG5vIG9uZSB1c2VzIHdpbiBtZXRyaWNzIGFueW1vcmUgZm9yIHNldHRpbmcgbGluZSBtZXRyaWNzICh0aGUKKyAgICAgICAqIHNwZWNpZmljYXRpb24gZXZlbiBjYWxscyB0aGVzZSBtZXRyaWNzICJob3Jpem9udGFsIGNsaXBwaW5nCisgICAgICAgKiBhc2NlbnQvZGVzY2VudCIsIHByb2JhYmx5IGZvciB0aGVpciByb2xlIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtIGluCisgICAgICAgKiBjb21wdXRpbmcgY2xpcHBpbmcgYm94ZXMpLCBhbmQgbmV3IGZvbnRzIHNob3VsZCB1c2UgdHlwbyBtZXRyaWNzLCBzbworICAgICAgICogdHlwbyBkZWx0YXMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gd2hhdGV2ZXIgc2ZudF9sb2FkX2ZhY2UgZGVjaWRlZCB0aGUKKyAgICAgICAqIGxpbmUgbWV0cmljcyBzaG91bGQgYmUuCisgICAgICAgKgorICAgICAgICogQmVmb3JlLCB0aGUgZm9sbG93aW5nIGxlZCB0byBkaWZmZXJlbnQgbGluZSBtZXRyaWNzIGJldHdlZW4gZGVmYXVsdAorICAgICAgICogb3V0bGluZSBhbmQgaW5zdGFuY2VzLCB2aXNpYmxlIHdoZW4gZS5nLiB0aGUgZGVmYXVsdCBvdXRsaW5lcyB3ZXJlCisgICAgICAgKiB1c2VkIGFzIHRoZSByZWd1bGFyIGZhY2UgYW5kIGluc3RhbmNlcyBmb3IgZXZlcnl0aGluZyBlbHNlOgorICAgICAgICoKKyAgICAgICAqIDEuIHNmbnRfbG9hZF9mYWNlIGFwcGxpZWQgdGhlIGhoZWEgbWV0cmljcyBieSBkZWZhdWx0LgorICAgICAgICogMi4gVGhpcyBjb2RlIGxhdGVyIGFwcGxpZWQgdGhlIHR5cG8gbWV0cmljcyBieSBkZWZhdWx0LCByZWdhcmRsZXNzIG9mCisgICAgICAgKiAgICB3aGV0aGVyIHRoZXkgd2VyZSBhY3R1YWxseSBjaGFuZ2VkIG9yIHRoZSBmb250IGhhZCB0aGUgT1MvMiB0YWJsZSdzCisgICAgICAgKiAgICBmc1NlbGVjdGlvbidzIGJpdCA3IChVU0VfVFlQT19NRVRSSUNTKSBzZXQuCisgICAgICAgKi8KKyAgICAgIEZUX1Nob3J0ICBjdXJyZW50X2xpbmVfZ2FwID0gcm9vdC0+aGVpZ2h0IC0gcm9vdC0+YXNjZW5kZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5kZXNjZW5kZXI7CiAKLSAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgfHwgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICkKLSAgICAgICAgewotICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyOwotICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlcjsKIAotICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5vczIuc1R5cG9MaW5lR2FwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJvb3QtPmFzY2VuZGVyICA9ICAoRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luQXNjZW50OwotICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IC0oRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luRGVzY2VudDsKLQotICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyOwotICAgICAgICB9Ci0gICAgICB9CisgICAgICByb290LT5hc2NlbmRlciAgPSByb290LT5hc2NlbmRlciArIG12YXJfaGFzY19kZWx0YTsKKyAgICAgIHJvb3QtPmRlc2NlbmRlciA9IHJvb3QtPmRlc2NlbmRlciArIG12YXJfaGRzY19kZWx0YTsKKyAgICAgIHJvb3QtPmhlaWdodCAgICA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbGluZV9nYXAgKyBtdmFyX2hsZ3BfZGVsdGE7CiAKICAgICAgIHJvb3QtPnVuZGVybGluZV9wb3NpdGlvbiAgPSBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVBvc2l0aW9uIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5wb3N0c2NyaXB0LnVuZGVybGluZVRoaWNrbmVzcyAvIDI7CkBAIC0xNDAwLDIxICsxNDQzLDIyIEBACiAgIH0gR1hfR1Zhcl9IZWFkOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2xvYWRfZ3ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2UgdGhlIGBndmFyJyB0YWJsZSBpZiBwcmVzZW50LiAgSWYgYGZ2YXInIGlzIHRoZXJlLCBgZ3ZhcicgaGFkICovCi0gIC8qICAgIGJldHRlciBiZSB0aGVyZSB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogVGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF92YXJfbG9hZF9ndmFyCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBQYXJzZSB0aGUgYGd2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJZiBgZnZhcicgaXMgdGhlcmUsIGBndmFyJyBoYWQKKyAgICogICBiZXR0ZXIgYmUgdGhlcmUgdG9vLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGZvbnQgZmFjZS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgc3RhdGljIEZUX0Vycm9yCiAgIGZ0X3Zhcl9sb2FkX2d2YXIoIFRUX0ZhY2UgIGZhY2UgKQogICB7CkBAIC0xNDI2LDYgKzE0NzAsNyBAQAogICAgIEZUX1VMb25nICAgICAgdGFibGVfbGVuOwogICAgIEZUX1VMb25nICAgICAgZ3Zhcl9zdGFydDsKICAgICBGVF9VTG9uZyAgICAgIG9mZnNldFRvRGF0YTsKKyAgICBGVF9VTG9uZyAgICAgIG9mZnNldHNfbGVuOwogICAgIEdYX0dWYXJfSGVhZCAgZ3Zhcl9oZWFkOwogCiAgICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBndmFyX2ZpZWxkc1tdID0KQEAgLTE0ODYsOSArMTUzMSwxMyBAQAogICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8qIHJvdWdoIHNhbml0eSBjaGVjazogb2Zmc2V0cyBjYW4gYmUgZWl0aGVyIDIgb3IgNCBieXRlcyAqLwotICAgIGlmICggKEZUX1VMb25nKWd2YXJfaGVhZC5nbHlwaENvdW50ICoKLSAgICAgICAgICAgKCAoIGd2YXJfaGVhZC5mbGFncyAmIDEgKSA/IDQgOiAyICkgPiB0YWJsZV9sZW4gKQorICAgIC8qIG9mZnNldHMgY2FuIGJlIGVpdGhlciAyIG9yIDQgYnl0ZXMgICAgICAgICAgICAgICAgICAqLworICAgIC8qIChvbmUgbW9yZSBvZmZzZXQgdGhhbiBnbHlwaHMsIHRvIG1hcmsgc2l6ZSBvZiBsYXN0KSAqLworICAgIG9mZnNldHNfbGVuID0gKCBndmFyX2hlYWQuZ2x5cGhDb3VudCArIDEgKSAqCisgICAgICAgICAgICAgICAgICAoICggZ3Zhcl9oZWFkLmZsYWdzICYgMSApID8gNEwgOiAyTCApOworCisgICAgLyogcm91Z2ggc2FuaXR5IGNoZWNrICovCisgICAgaWYgKG9mZnNldHNfbGVuID4gdGFibGVfbGVuICkKICAgICB7CiAgICAgICBGVF9UUkFDRTEoKCAiZnRfdmFyX2xvYWRfZ3ZhcjogaW52YWxpZCBudW1iZXIgb2YgZ2x5cGhzXG4iICkpOwogICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwpAQCAtMTQ5Nyw2NiArMTU0NiwxMTYgQEAKIAogICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7CiAKLSAgICBibGVuZC0+Z3Zhcl9zaXplICAgPSB0YWJsZV9sZW47Ci0gICAgYmxlbmQtPnR1cGxlY291bnQgID0gZ3Zhcl9oZWFkLmdsb2JhbENvb3JkQ291bnQ7Ci0gICAgYmxlbmQtPmd2X2dseXBoY250ID0gZ3Zhcl9oZWFkLmdseXBoQ291bnQ7Ci0gICAgb2Zmc2V0VG9EYXRhICAgICAgID0gZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0RhdGE7CisgICAgYmxlbmQtPmd2YXJfc2l6ZSA9IHRhYmxlX2xlbjsKKyAgICBvZmZzZXRUb0RhdGEgICAgID0gZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0RhdGE7CiAKICAgICBGVF9UUkFDRTUoKCAiZ3ZhcjogdGhlcmUgJXMgJWQgc2hhcmVkIGNvb3JkaW5hdGUlczpcbiIsCi0gICAgICAgICAgICAgICAgYmxlbmQtPnR1cGxlY291bnQgPT0gMSA/ICJpcyIgOiAiYXJlIiwKLSAgICAgICAgICAgICAgICBibGVuZC0+dHVwbGVjb3VudCwKLSAgICAgICAgICAgICAgICBibGVuZC0+dHVwbGVjb3VudCA9PSAxID8gIiIgOiAicyIgKSk7CisgICAgICAgICAgICAgICAgZ3Zhcl9oZWFkLmdsb2JhbENvb3JkQ291bnQgPT0gMSA/ICJpcyIgOiAiYXJlIiwKKyAgICAgICAgICAgICAgICBndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudCwKKyAgICAgICAgICAgICAgICBndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudCA9PSAxID8gIiIgOiAicyIgKSk7CiAKLSAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmdseXBob2Zmc2V0cywgYmxlbmQtPmd2X2dseXBoY250ICsgMSApICkKKyAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCBvZmZzZXRzX2xlbiApICkKICAgICAgIGdvdG8gRXhpdDsKIAorICAgIC8qIG9mZnNldHMgKG9uZSBtb3JlIG9mZnNldCB0aGFuIGdseXBocywgdG8gbWFyayBzaXplIG9mIGxhc3QpICovCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGJsZW5kLT5nbHlwaG9mZnNldHMsIGd2YXJfaGVhZC5nbHlwaENvdW50ICsgMSApICkKKyAgICAgIGdvdG8gRmFpbDI7CisKICAgICBpZiAoIGd2YXJfaGVhZC5mbGFncyAmIDEgKQogICAgIHsKLSAgICAgIC8qIGxvbmcgb2Zmc2V0cyAob25lIG1vcmUgb2Zmc2V0IHRoYW4gZ2x5cGhzLCB0byBtYXJrIHNpemUgb2YgbGFzdCkgKi8KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoICggYmxlbmQtPmd2X2dseXBoY250ICsgMSApICogNEwgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKKyAgICAgIEZUX1VMb25nICBsaW1pdCAgICAgID0gZ3Zhcl9zdGFydCArIHRhYmxlX2xlbjsKKyAgICAgIEZUX1VMb25nICBtYXhfb2Zmc2V0ID0gMDsKIAotICAgICAgZm9yICggaSA9IDA7IGkgPD0gYmxlbmQtPmd2X2dseXBoY250OyBpKysgKQorCisgICAgICBmb3IgKCBpID0gMDsgaSA8PSBndmFyX2hlYWQuZ2x5cGhDb3VudDsgaSsrICkKKyAgICAgIHsKICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG9mZnNldFRvRGF0YSArIEZUX0dFVF9VTE9ORygpOwogCi0gICAgICBGVF9GUkFNRV9FWElUKCk7CisgICAgICAgIGlmICggbWF4X29mZnNldCA8PSBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldICkKKyAgICAgICAgICBtYXhfb2Zmc2V0ID0gYmxlbmQtPmdseXBob2Zmc2V0c1tpXTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgRlRfVFJBQ0UyKCggImZ0X3Zhcl9sb2FkX2d2YXI6IgorICAgICAgICAgICAgICAgICAgICAgICIgZ2x5cGggdmFyaWF0aW9uIGRhdGEgb2Zmc2V0ICVkIG5vdCBtb25vdG9uaWNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaSApKTsKKyAgICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldID0gbWF4X29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHVzZSBgPCcsIG5vdCBgPD0nICovCisgICAgICAgIGlmICggbGltaXQgPCBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldICkKKyAgICAgICAgeworICAgICAgICAgIEZUX1RSQUNFMigoICJmdF92YXJfbG9hZF9ndmFyOiIKKyAgICAgICAgICAgICAgICAgICAgICAiIGdseXBoIHZhcmlhdGlvbiBkYXRhIG9mZnNldCAlZCBvdXQgb2YgcmFuZ2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgaSApKTsKKyAgICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldID0gbGltaXQ7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgIC8qIHNob3J0IG9mZnNldHMgKG9uZSBtb3JlIG9mZnNldCB0aGFuIGdseXBocywgdG8gbWFyayBzaXplIG9mIGxhc3QpICovCi0gICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCAoIGJsZW5kLT5ndl9nbHlwaGNudCArIDEgKSAqIDJMICkgKQotICAgICAgICBnb3RvIEV4aXQ7CisgICAgICBGVF9VTG9uZyAgbGltaXQgICAgICA9IGd2YXJfc3RhcnQgKyB0YWJsZV9sZW47CisgICAgICBGVF9VTG9uZyAgbWF4X29mZnNldCA9IDA7CiAKLSAgICAgIGZvciAoIGkgPSAwOyBpIDw9IGJsZW5kLT5ndl9nbHlwaGNudDsgaSsrICkKKworICAgICAgZm9yICggaSA9IDA7IGkgPD0gZ3Zhcl9oZWFkLmdseXBoQ291bnQ7IGkrKyApCisgICAgICB7CiAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbaV0gPSBvZmZzZXRUb0RhdGEgKyBGVF9HRVRfVVNIT1JUKCkgKiAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IFVuZG9jdW1lbnRlZDogYCoyJyEgKi8KIAotICAgICAgRlRfRlJBTUVfRVhJVCgpOworICAgICAgICBpZiAoIG1heF9vZmZzZXQgPD0gYmxlbmQtPmdseXBob2Zmc2V0c1tpXSApCisgICAgICAgICAgbWF4X29mZnNldCA9IGJsZW5kLT5nbHlwaG9mZnNldHNbaV07CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIEZUX1RSQUNFMigoICJmdF92YXJfbG9hZF9ndmFyOiIKKyAgICAgICAgICAgICAgICAgICAgICAiIGdseXBoIHZhcmlhdGlvbiBkYXRhIG9mZnNldCAlZCBub3QgbW9ub3RvbmljXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGkgKSk7CisgICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IG1heF9vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiB1c2UgYDwnLCBub3QgYDw9JyAqLworICAgICAgICBpZiAoIGxpbWl0IDwgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9UUkFDRTIoKCAiZnRfdmFyX2xvYWRfZ3ZhcjoiCisgICAgICAgICAgICAgICAgICAgICAgIiBnbHlwaCB2YXJpYXRpb24gZGF0YSBvZmZzZXQgJWQgb3V0IG9mIHJhbmdlXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGkgKSk7CisgICAgICAgICAgYmxlbmQtPmdseXBob2Zmc2V0c1tpXSA9IGxpbWl0OworICAgICAgICB9CisgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCBibGVuZC0+dHVwbGVjb3VudCAhPSAwICkKKyAgICBibGVuZC0+Z3ZfZ2x5cGhjbnQgPSBndmFyX2hlYWQuZ2x5cGhDb3VudDsKKworICAgIEZUX0ZSQU1FX0VYSVQoKTsKKworICAgIGlmICggZ3Zhcl9oZWFkLmdsb2JhbENvb3JkQ291bnQgIT0gMCApCiAgICAgeworICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZ3Zhcl9zdGFydCArIGd2YXJfaGVhZC5vZmZzZXRUb0Nvb3JkICkgfHwKKyAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGd2YXJfaGVhZC5nbG9iYWxDb29yZENvdW50ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2YXJfaGVhZC5heGlzQ291bnQgKiAyTCApICAgICAgICAgICAgICkKKyAgICAgIHsKKyAgICAgICAgRlRfVFJBQ0UyKCggImZ0X3Zhcl9sb2FkX2d2YXI6IgorICAgICAgICAgICAgICAgICAgICAiIGdseXBoIHZhcmlhdGlvbiBzaGFyZWQgdHVwbGVzIG1pc3NpbmdcbiIgKSk7CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgIH0KKwogICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGJsZW5kLT50dXBsZWNvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBndmFyX2hlYWQuYXhpc0NvdW50ICogYmxlbmQtPnR1cGxlY291bnQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBndmFyX2hlYWQuYXhpc0NvdW50ICogZ3Zhcl9oZWFkLmdsb2JhbENvb3JkQ291bnQgKSApCisgICAgICAgIGdvdG8gRmFpbDI7CiAKLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGd2YXJfc3RhcnQgKyBndmFyX2hlYWQub2Zmc2V0VG9Db29yZCApICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT50dXBsZWNvdW50ICogZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIDJMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxlbmQtPnR1cGxlY291bnQ7IGkrKyApCisgICAgICBmb3IgKCBpID0gMDsgaSA8IGd2YXJfaGVhZC5nbG9iYWxDb29yZENvdW50OyBpKysgKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTUoKCAiICBbICIgKSk7CiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgKEZUX1VJbnQpZ3Zhcl9oZWFkLmF4aXNDb3VudDsgaisrICkKICAgICAgICAgewogICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3Jkc1tpICogZ3Zhcl9oZWFkLmF4aXNDb3VudCArIGpdID0KLSAgICAgICAgICAgIEZUX0dFVF9TSE9SVCgpICogNDsgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gRlRfRml4ZWQgKi8KKyAgICAgICAgICAgIEZUX2Zkb3QxNFRvRml4ZWQoIEZUX0dFVF9TSE9SVCgpICk7CiAgICAgICAgICAgRlRfVFJBQ0U1KCggIiUuNWYgIiwKICAgICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3Jkc1tpICogZ3Zhcl9oZWFkLmF4aXNDb3VudCArIGpdIC8gNjU1MzYuMCApKTsKICAgICAgICAgfQogICAgICAgICBGVF9UUkFDRTUoKCAiXVxuIiApKTsKICAgICAgIH0KIAorICAgICAgYmxlbmQtPnR1cGxlY291bnQgPSBndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudDsKKwogICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKIAogICAgICAgRlRfRlJBTUVfRVhJVCgpOwpAQCAtMTU2NCwzNiArMTY2Myw0OSBAQAogCiAgIEV4aXQ6CiAgICAgcmV0dXJuIGVycm9yOworCisgIEZhaWwyOgorICAgIEZUX0ZSQU1FX0VYSVQoKTsKKworICBGYWlsOgorICAgIEZUX0ZSRUUoIGJsZW5kLT5nbHlwaG9mZnNldHMgKTsKKyAgICBibGVuZC0+Z3ZfZ2x5cGhjbnQgPSAwOworICAgIGdvdG8gRXhpdDsKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfdmFyX2FwcGx5X3R1cGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmlndXJlIG91dCB3aGV0aGVyIGEgZ2l2ZW4gdHVwbGUgKGRlc2lnbikgYXBwbGllcyB0byB0aGUgY3VycmVudCAgICovCi0gIC8qICAgIGJsZW5kLCBhbmQgaWYgc28sIHdoYXQgaXMgdGhlIHNjYWxpbmcgZmFjdG9yLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsZW5kICAgICAgICAgICA6OiBUaGUgY3VycmVudCBibGVuZCBvZiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHVwbGVJbmRleCAgICAgIDo6IEEgZmxhZyBzYXlpbmcgd2hldGhlciB0aGlzIGlzIGFuIGludGVybWVkaWF0ZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB0dXBsZSBvciBub3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHVwbGVfY29vcmRzICAgIDo6IFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdHVwbGUgaW4gbm9ybWFsaXplZCBheGlzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1fc3RhcnRfY29vcmRzIDo6IFRoZSBpbml0aWFsIGNvb3JkaW5hdGVzIHdoZXJlIHRoaXMgdHVwbGUgc3RhcnRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB0byBhcHBseSAoZm9yIGludGVybWVkaWF0ZSBjb29yZGluYXRlcykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1fZW5kX2Nvb3JkcyAgIDo6IFRoZSBmaW5hbCBjb29yZGluYXRlcyBhZnRlciB3aGljaCB0aGlzIHR1cGxlIG5vICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBsb25nZXIgYXBwbGllcyAoZm9yIGludGVybWVkaWF0ZSBjb29yZGluYXRlcykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEZUX0ZpeGVkIHZhbHVlIGNvbnRhaW5pbmcgdGhlIHNjYWxpbmcgZmFjdG9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBmdF92YXJfYXBwbHlfdHVwbGUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZpZ3VyZSBvdXQgd2hldGhlciBhIGdpdmVuIHR1cGxlIChkZXNpZ24pIGFwcGxpZXMgdG8gdGhlIGN1cnJlbnQKKyAgICogICBibGVuZCwgYW5kIGlmIHNvLCB3aGF0IGlzIHRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGJsZW5kIDo6CisgICAqICAgICBUaGUgY3VycmVudCBibGVuZCBvZiB0aGUgZm9udC4KKyAgICoKKyAgICogICB0dXBsZUluZGV4IDo6CisgICAqICAgICBBIGZsYWcgc2F5aW5nIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcm1lZGlhdGUKKyAgICogICAgIHR1cGxlIG9yIG5vdC4KKyAgICoKKyAgICogICB0dXBsZV9jb29yZHMgOjoKKyAgICogICAgIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdHVwbGUgaW4gbm9ybWFsaXplZCBheGlzCisgICAqICAgICB1bml0cy4KKyAgICoKKyAgICogICBpbV9zdGFydF9jb29yZHMgOjoKKyAgICogICAgIFRoZSBpbml0aWFsIGNvb3JkaW5hdGVzIHdoZXJlIHRoaXMgdHVwbGUgc3RhcnRzCisgICAqICAgICB0byBhcHBseSAoZm9yIGludGVybWVkaWF0ZSBjb29yZGluYXRlcykuCisgICAqCisgICAqICAgaW1fZW5kX2Nvb3JkcyA6OgorICAgKiAgICAgVGhlIGZpbmFsIGNvb3JkaW5hdGVzIGFmdGVyIHdoaWNoIHRoaXMgdHVwbGUgbm8KKyAgICogICAgIGxvbmdlciBhcHBsaWVzIChmb3IgaW50ZXJtZWRpYXRlIGNvb3JkaW5hdGVzKS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBBbiBGVF9GaXhlZCB2YWx1ZSBjb250YWluaW5nIHRoZSBzY2FsaW5nIGZhY3Rvci4KKyAgICovCiAgIHN0YXRpYyBGVF9GaXhlZAogICBmdF92YXJfYXBwbHlfdHVwbGUoIEdYX0JsZW5kICAgYmxlbmQsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICB0dXBsZUluZGV4LApAQCAtMTYwNywxMyArMTcxOSw4IEBACiAKICAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT5udW1fYXhpczsgaSsrICkKICAgICB7Ci0gICAgICBGVF9UUkFDRTYoKCAiICAgIGF4aXMgY29vcmRpbmF0ZSAlZCAoJS41Zik6XG4iLAorICAgICAgRlRfVFJBQ0U2KCggIiAgICBheGlzICVkIGNvb3JkaW5hdGUgJS41ZjpcbiIsCiAgICAgICAgICAgICAgICAgICBpLCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICBpZiAoICEoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKSApCi0gICAgICAgIEZUX1RSQUNFNigoICIgICAgICBpbnRlcm1lZGlhdGUgY29vcmRpbmF0ZXMgJWQgKCUuNWYsICUuNWYpOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAKICAgICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoeSAoZm9yIGludGVybWVkaWF0ZSB0dXBsZXMpIHdlIGRvbid0IG5lZWQgICAgICovCiAgICAgICAvKiB0byBjaGVjayBhZ2FpbnN0IHN0YXJ0L2VuZCAtLSB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIGRvbid0LiAqLwpAQCAtMTYyMiw3ICsxNzI5LDcgQEAKIAogICAgICAgaWYgKCB0dXBsZV9jb29yZHNbaV0gPT0gMCApCiAgICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIGlzIHplcm8sIGlnbm9yZWRcbiIsIGkgKSk7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIGlzIHplcm8sIGlnbm9yZVxuIiApKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKQEAgLTE2MzUsNyArMTc0Miw3IEBACiAKICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPT0gdHVwbGVfY29vcmRzW2ldICkKICAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgdmFsdWUgJS41ZiBmaXRzIHBlcmZlY3RseVxuIiwKKyAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgJS41ZiBmaXRzIHBlcmZlY3RseVxuIiwKICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKICAgICAgICAgLyogYGFwcGx5JyBkb2VzIG5vdCBjaGFuZ2UgKi8KICAgICAgICAgY29udGludWU7CkBAIC0xNjQ4LDEzICsxNzU1LDEzIEBACiAgICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCBGVF9NSU4oIDAsIHR1cGxlX2Nvb3Jkc1tpXSApIHx8CiAgICAgICAgICAgICAgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPiBGVF9NQVgoIDAsIHR1cGxlX2Nvb3Jkc1tpXSApICkKICAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIHZhbHVlICUuNWYgaXMgZXhjZWVkZWQsIHN0b3BcbiIsCisgICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgJS41ZiBpcyBleGNlZWRlZCwgc3RvcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICB0dXBsZV9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwogICAgICAgICAgIGFwcGx5ID0gMDsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIEZUX1RSQUNFNigoICIgICAgICB0dXBsZSBjb29yZGluYXRlIHZhbHVlICUuNWYgZml0c1xuIiwKKyAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgJS41ZiBmaXRzXG4iLAogICAgICAgICAgICAgICAgICAgICB0dXBsZV9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwogICAgICAgICBhcHBseSA9IEZUX011bERpdiggYXBwbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSwKQEAgLTE2NjQsMTAgKzE3NzEsMTAgQEAKICAgICAgIHsKICAgICAgICAgLyogaW50ZXJtZWRpYXRlIHR1cGxlICovCiAKLSAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA8IGltX3N0YXJ0X2Nvb3Jkc1tpXSB8fAotICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID4gaW1fZW5kX2Nvb3Jkc1tpXSAgICkKKyAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA8PSBpbV9zdGFydF9jb29yZHNbaV0gfHwKKyAgICAgICAgICAgICBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA+PSBpbV9lbmRfY29vcmRzW2ldICAgKQogICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS41ZjslLjVmXSBpcyBleGNlZWRlZCwiCisgICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBdJS41ZjslLjVmWyBpcyBleGNlZWRlZCwiCiAgICAgICAgICAgICAgICAgICAgICAgIiBzdG9wXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCiAgICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CkBAIC0xNjc1LDI1ICsxNzgyLDE3IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBlbHNlIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCB0dXBsZV9jb29yZHNbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS41ZjslLjVmXSBmaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CisgICAgICAgIEZUX1RSQUNFNigoICIgICAgICBpbnRlcm1lZGlhdGUgdHVwbGUgcmFuZ2UgXSUuNWY7JS41ZlsgZml0c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CisgICAgICAgIGlmICggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gPCB0dXBsZV9jb29yZHNbaV0gKQogICAgICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0gLSBpbV9zdGFydF9jb29yZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tpXSAtIGltX3N0YXJ0X2Nvb3Jkc1tpXSApOwotICAgICAgICB9Ci0KICAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS41ZjslLjVmXSBmaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tpXSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7CiAgICAgICAgICAgYXBwbHkgPSBGVF9NdWxEaXYoIGFwcGx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC0gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX2VuZF9jb29yZHNbaV0gLSB0dXBsZV9jb29yZHNbaV0gKTsKLSAgICAgICAgfQogICAgICAgfQogICAgIH0KIApAQCAtMTc1NiwxMSArMTg1NSwxMSBAQAogICAgICAgfQogCiAgICAgICBpZiAoIGNvb3JkIDwgYS0+ZGVmICkKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IC1GVF9EaXZGaXgoIGNvb3JkIC0gYS0+ZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS0+bWluaW11bSAtIGEtPmRlZiApOworICAgICAgICBub3JtYWxpemVkW2ldID0gLUZUX0RpdkZpeCggU1VCX0xPTkcoIGNvb3JkLCBhLT5kZWYgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCBhLT5taW5pbXVtLCBhLT5kZWYgKSApOwogICAgICAgZWxzZSBpZiAoIGNvb3JkID4gYS0+ZGVmICkKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IEZUX0RpdkZpeCggY29vcmQgLSBhLT5kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEtPm1heGltdW0gLSBhLT5kZWYgKTsKKyAgICAgICAgbm9ybWFsaXplZFtpXSA9IEZUX0RpdkZpeCggU1VCX0xPTkcoIGNvb3JkLCBhLT5kZWYgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCX0xPTkcoIGEtPm1heGltdW0sIGEtPmRlZiApICk7CiAgICAgICBlbHNlCiAgICAgICAgIG5vcm1hbGl6ZWRbaV0gPSAwOwogICAgIH0KQEAgLTE5MTAsMjcgKzIwMDksMjkgQEAKICAgfSBHWF9GVmFyX0F4aXM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTU1fVmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGF0IHRoZSBmb250J3MgYGZ2YXInIHRhYmxlIGlzIHZhbGlkLCBwYXJzZSBpdCwgYW5kIHJldHVybiAgKi8KLSAgLyogICAgdGhvc2UgZGF0YS4gIEl0IGFsc28gbG9hZHMgKGFuZCBwYXJzZXMpIHRoZSBgTVZBUicgdGFibGUsIGlmICAgICAgICovCi0gIC8qICAgIHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgVFRfR2V0X01NX1ZhciBpbml0aWFsaXplcyB0aGUgYmxlbmQgc3RydWN0dXJlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXN0ZXIgOjogVGhlIGBmdmFyJyBkYXRhIChtdXN0IGJlIGZyZWVkIGJ5IGNhbGxlcikuICBDYW4gYmUgTlVMTCwgKi8KLSAgLyogICAgICAgICAgICAgIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvYWQgTU0gc3VwcG9ydC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX0dldF9NTV9WYXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENoZWNrIHRoYXQgdGhlIGZvbnQncyBgZnZhcicgdGFibGUgaXMgdmFsaWQsIHBhcnNlIGl0LCBhbmQgcmV0dXJuCisgICAqICAgdGhvc2UgZGF0YS4gIEl0IGFsc28gbG9hZHMgKGFuZCBwYXJzZXMpIHRoZSBgTVZBUicgdGFibGUsIGlmCisgICAqICAgcG9zc2libGUuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgZm9udCBmYWNlLgorICAgKiAgICAgVFRfR2V0X01NX1ZhciBpbml0aWFsaXplcyB0aGUgYmxlbmQgc3RydWN0dXJlLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIG1hc3RlciA6OgorICAgKiAgICAgVGhlIGBmdmFyJyBkYXRhIChtdXN0IGJlIGZyZWVkIGJ5IGNhbGxlcikuICBDYW4gYmUgTlVMTCwKKyAgICogICAgIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvYWQgTU0gc3VwcG9ydC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX0dldF9NTV9WYXIoIFRUX0ZhY2UgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICkKQEAgLTIwNjIsNyArMjE2Myw3IEBACiAgICAgLyogYGZ2YXInIHRhYmxlIHZhbGlkaXR5IGNoZWNrIGluIGBzZm50X2luaXRfZmFjZScgICAgICAgICAgKi8KIAogICAgIC8qIHRoZSB2YXJpb3VzIGAqX3NpemUnIHZhcmlhYmxlcywgd2hpY2ggd2UgYWxzbyB1c2UgYXMgICAgICovCi0gICAgLyogb2Zmc2V0cyBpbnRvIHRoZSBgbW1sZW4nIGFycmF5LCBtdXN0IGJlIG11bHRpcGxlcyBvZiB0aGUgKi8KKyAgICAvKiBvZmZzZXRzIGludG8gdGhlIGBtbXZhcicgYXJyYXksIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZSAqLwogICAgIC8qIHBvaW50ZXIgc2l6ZSAoZXhjZXB0IHRoZSBsYXN0IG9uZSk7IHdpdGhvdXQgc3VjaCBhbiAgICAgICovCiAgICAgLyogYWxpZ25tZW50IHRoZXJlIG1pZ2h0IGJlIHJ1bnRpbWUgZXJyb3JzIGR1ZSB0byAgICAgICAgICAgKi8KICAgICAvKiBtaXNhbGlnbmVkIGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjUwNywxMSArMjYwOCwxNCBAQAogCiAgICAgICBpZiAoIEZUX0lTX05BTUVEX0lOU1RBTkNFKCBGVF9GQUNFKCBmYWNlICkgKSApCiAgICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGlkeCA9IChGVF9VSW50KWZhY2UtPnJvb3QuZmFjZV9pbmRleCA+PiAxNjsKKyAgICAgICAgRlRfVUludCAgaW5zdGFuY2VfaW5kZXggPSAoRlRfVUludClmYWNlLT5yb290LmZhY2VfaW5kZXggPj4gMTY7CiAKIAogICAgICAgICBjID0gYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMgKyBpOwotICAgICAgICBuID0gYmxlbmQtPm5vcm1hbGl6ZWRfc3R5bGVjb29yZHMgKyBpZHggKiBtbXZhci0+bnVtX2F4aXMgKyBpOworICAgICAgICBuID0gYmxlbmQtPm5vcm1hbGl6ZWRfc3R5bGVjb29yZHMgICAgICAgICAgICArCisgICAgICAgICAgICAoIGluc3RhbmNlX2luZGV4IC0gMSApICogbW12YXItPm51bV9heGlzICsKKyAgICAgICAgICAgIGk7CisKICAgICAgICAgZm9yICggaiA9IGk7IGogPCBtbXZhci0+bnVtX2F4aXM7IGorKywgbisrLCBjKysgKQogICAgICAgICAgIGlmICggKmMgIT0gKm4gKQogICAgICAgICAgICAgaGF2ZV9kaWZmID0gMTsKQEAgLTI1MjYsNyArMjYzMCwxMSBAQAogCiAgICAgICAvKiByZXR1cm4gdmFsdWUgLTEgaW5kaWNhdGVzIGBubyBjaGFuZ2UnICovCiAgICAgICBpZiAoICFoYXZlX2RpZmYgKQorICAgICAgeworICAgICAgICBmYWNlLT5kb2JsZW5kID0gVFJVRTsKKwogICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CiAKICAgICAgIGZvciAoIDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrICkKICAgICAgIHsKQEAgLTI1OTAsMzEgKzI2OTgsMzQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X01NX0JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBibGVuZCAobm9ybWFsaXplZCkgY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlICAgICovCi0gIC8qICAgIGZvbnQuICBDaGVjayB0aGF0IHRoZSBgZ3ZhcicgdGFibGUgaXMgcmVhc29uYWJsZSBhbmQgZG9lcyBzb21lICAgICAqLwotICAvKiAgICBpbml0aWFsIHByZXBhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3R1cmUgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKDApIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIGBudW1fY29vcmRzJywgZWFjaCBiZXR3ZWVuIFstMSwxXS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVFRfU2V0X01NX0JsZW5kCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBTZXQgdGhlIGJsZW5kIChub3JtYWxpemVkKSBjb29yZGluYXRlcyBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUKKyAgICogICBmb250LiAgQ2hlY2sgdGhhdCB0aGUgYGd2YXInIHRhYmxlIGlzIHJlYXNvbmFibGUgYW5kIGRvZXMgc29tZQorICAgKiAgIGluaXRpYWwgcHJlcGFyYXRpb24uCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBUaGUgZm9udC4KKyAgICogICAgIEluaXRpYWxpemUgdGhlIGJsZW5kIHN0cnVjdHVyZSB3aXRoIGBndmFyJyBkYXRhLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgbnVtX2Nvb3JkcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29vcmRpbmF0ZXMuICBJZiBpdCBpcworICAgKiAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcworICAgKiAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywKKyAgICogICAgIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSAoMCkgZm9yIHRoZSByZW1haW5pbmcgYXhlcy4KKyAgICoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGBudW1fY29vcmRzJywgZWFjaCBiZXR3ZWVuIFstMSwxXS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX1NldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKQEAgLTI2MzYsMjkgKzI3NDcsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X01NX0JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBibGVuZCAobm9ybWFsaXplZCkgY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlICAgICovCi0gIC8qICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIGJsZW5kIHN0cnVjdHVyZSB3aXRoIGBndmFyJyBkYXRhLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvb3JkaW5hdGVzLiAgSWYgaXQgaXMgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIHNldCB0aGUgZXhjZXNzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIHRvIDAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBgbnVtX2Nvb3JkcycsIGVhY2ggYmV0d2VlbiBbLTEsMV0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX0dldF9NTV9CbGVuZAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgR2V0IHRoZSBibGVuZCAobm9ybWFsaXplZCkgY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlCisgICAqICAgZm9udC4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBmb250LgorICAgKiAgICAgSW5pdGlhbGl6ZSB0aGUgYmxlbmQgc3RydWN0dXJlIHdpdGggYGd2YXInIGRhdGEuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBudW1fY29vcmRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzCisgICAqICAgICBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIHNldCB0aGUgZXhjZXNzCisgICAqICAgICB2YWx1ZXMgdG8gMC4KKyAgICoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGBudW1fY29vcmRzJywgZWFjaCBiZXR3ZWVuIFstMSwxXS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX0dldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKQEAgLTI3MTIsMzEgKzI4MjYsMzQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X1Zhcl9EZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIGluc3RhbmNlLCBtZWFzdXJlZCBpbiB0aGUgdXNlciAgICAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGUgc3lzdGVtLiAgUGFyc2UgdGhlIGBhdmFyJyB0YWJsZSAoaWYgcHJlc2VudCkgdG8gY29udmVydCAqLwotICAvKiAgICBmcm9tIHVzZXIgdG8gbm9ybWFsaXplZCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3Qgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEEgY29vcmRpbmF0ZSBhcnJheSB3aXRoIGBudW1fY29vcmRzJyBlbGVtZW50cy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVFRfU2V0X1Zhcl9EZXNpZ24KKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFNldCB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBpbnN0YW5jZSwgbWVhc3VyZWQgaW4gdGhlIHVzZXIKKyAgICogICBjb29yZGluYXRlIHN5c3RlbS4gIFBhcnNlIHRoZSBgYXZhcicgdGFibGUgKGlmIHByZXNlbnQpIHRvIGNvbnZlcnQKKyAgICogICBmcm9tIHVzZXIgdG8gbm9ybWFsaXplZCBjb29yZGluYXRlcy4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIFRoZSBmb250IGZhY2UuCisgICAqICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3Qgd2l0aCBgZ3ZhcicgZGF0YS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIG51bV9jb29yZHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvb3JkaW5hdGVzLiAgSWYgaXQgaXMKKyAgICogICAgIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MKKyAgICogICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsCisgICAqICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuCisgICAqCisgICAqICAgY29vcmRzIDo6CisgICAqICAgICBBIGNvb3JkaW5hdGUgYXJyYXkgd2l0aCBgbnVtX2Nvb3JkcycgZWxlbWVudHMuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBUVF9TZXRfVmFyX0Rlc2lnbiggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLApAQCAtMjg1NCwyOCArMjk3MSwzMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfVmFyX0Rlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIGRlc2lnbiBjb29yZGluYXRlcyBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGludGVycG9sYXRlZCAgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgZGVzaWduIGNvb3JkaW5hdGVzIHRvIHJldHJpZXZlLiAgSWYgaXQgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIHNldCB0aGUgZXhjZXNzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIHRvfjAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9HZXRfVmFyX0Rlc2lnbgorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgR2V0IHRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpbnRlcnBvbGF0ZWQKKyAgICogICBmb250LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLgorICAgKgorICAgKiAgIG51bV9jb29yZHMgOjoKKyAgICogICAgIFRoZSBudW1iZXIgb2YgZGVzaWduIGNvb3JkaW5hdGVzIHRvIHJldHJpZXZlLiAgSWYgaXQKKyAgICogICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgc2V0IHRoZSBleGNlc3MKKyAgICogICAgIHZhbHVlcyB0b34wLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIGNvb3JkcyA6OgorICAgKiAgICAgVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX0dldF9WYXJfRGVzaWduKCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCkBAIC0yOTI5LDI5ICszMDQ5LDMxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9OYW1lZF9JbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgZ2l2ZW4gbmFtZWQgaW5zdGFuY2UsIGFsc28gcmVzZXR0aW5nIGFueSBmdXJ0aGVyICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluc3RhbmNlX2luZGV4IDo6IFRoZSBpbnN0YW5jZSBpbmRleCwgc3RhcnRpbmcgd2l0aCB2YWx1ZSAxLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAwIGluZGljYXRlcyB0byBub3QgdXNlIGFuIGluc3RhbmNlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVFRfU2V0X05hbWVkX0luc3RhbmNlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBTZXQgdGhlIGdpdmVuIG5hbWVkIGluc3RhbmNlLCBhbHNvIHJlc2V0dGluZyBhbnkgZnVydGhlcgorICAgKiAgIHZhcmlhdGlvbi4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KKyAgICoKKyAgICogICBpbnN0YW5jZV9pbmRleCA6OgorICAgKiAgICAgVGhlIGluc3RhbmNlIGluZGV4LCBzdGFydGluZyB3aXRoIHZhbHVlIDEuCisgICAqICAgICBWYWx1ZSAwIGluZGljYXRlcyB0byBub3QgdXNlIGFuIGluc3RhbmNlLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVFRfU2V0X05hbWVkX0luc3RhbmNlKCBUVF9GYWNlICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGluc3RhbmNlX2luZGV4ICkKICAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisgICAgRlRfRXJyb3IgICAgZXJyb3I7CiAgICAgR1hfQmxlbmQgICAgYmxlbmQ7CiAgICAgRlRfTU1fVmFyKiAgbW12YXI7CiAKQEAgLTI5NzEsOSArMzA5MywxMiBAQAogCiAgICAgLyogYGluc3RhbmNlX2luZGV4JyBzdGFydHMgd2l0aCB2YWx1ZSAxLCB0aHVzIGA+JyAqLwogICAgIGlmICggaW5zdGFuY2VfaW5kZXggPiBudW1faW5zdGFuY2VzICkKKyAgICB7CisgICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwogICAgICAgZ290byBFeGl0OworICAgIH0KIAotICAgIGlmICggaW5zdGFuY2VfaW5kZXggPiAwICYmIG1tdmFyLT5uYW1lZHN0eWxlICkKKyAgICBpZiAoIGluc3RhbmNlX2luZGV4ID4gMCApCiAgICAgewogICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKICAgICAgIFNGTlRfU2VydmljZSAgc2ZudCAgID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwpAQCAtMjk5OSw3ICszMTI0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZF9zdHlsZS0+Y29vcmRzICk7CiAgICAgICBpZiAoIGVycm9yICkKKyAgICAgIHsKKyAgICAgICAgLyogaW50ZXJuYWwgZXJyb3IgY29kZSAtMSBtZWFucyBgbm8gY2hhbmdlJyAqLworICAgICAgICBpZiAoIGVycm9yID09IC0xICkKKyAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKICAgICAgICAgZ290byBFeGl0OworICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgICBlcnJvciA9IFRUX1NldF9WYXJfRGVzaWduKCBmYWNlLCAwLCBOVUxMICk7CkBAIC0zMDIyLDQ4ICszMTUyLDc3IEBACiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV92YXJ5X2N2dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW9kaWZ5IHRoZSBsb2FkZWQgY3Z0IHRhYmxlIGFjY29yZGluZyB0byB0aGUgYGN2YXInIHRhYmxlIGFuZCB0aGUgICovCi0gIC8qICAgIGZvbnQncyBibGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW9zdCBlcnJvcnMgYXJlIGlnbm9yZWQuICBJdCBpcyBwZXJmZWN0bHkgdmFsaWQgbm90IHRvIGhhdmUgYSAgICAgICovCi0gIC8qICAgIGBjdmFyJyB0YWJsZSBldmVuIGlmIHRoZXJlIGlzIGEgYGd2YXInIGFuZCBgZnZhcicgdGFibGUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgc3RhdGljIEZUX0Vycm9yCisgIHR0X2N2dF9yZWFkeV9pdGVyYXRvciggRlRfTGlzdE5vZGUgIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXIgKQorICB7CisgICAgVFRfU2l6ZSAgc2l6ZSA9IChUVF9TaXplKW5vZGUtPmRhdGE7CisKKyAgICBGVF9VTlVTRUQoIHVzZXIgKTsKKworCisgICAgc2l6ZS0+Y3Z0X3JlYWR5ID0gLTE7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfdmFyeV9jdnQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIE1vZGlmeSB0aGUgbG9hZGVkIGN2dCB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGBjdmFyJyB0YWJsZSBhbmQgdGhlCisgICAqICAgZm9udCdzIGJsZW5kLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiAgIE1vc3QgZXJyb3JzIGFyZSBpZ25vcmVkLiAgSXQgaXMgcGVyZmVjdGx5IHZhbGlkIG5vdCB0byBoYXZlIGEKKyAgICogICBgY3ZhcicgdGFibGUgZXZlbiBpZiB0aGVyZSBpcyBhIGBndmFyJyBhbmQgYGZ2YXInIHRhYmxlLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2ZhY2VfdmFyeV9jdnQoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQogICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgdGFibGVfc3RhcnQ7Ci0gICAgRlRfVUxvbmcgICAgdGFibGVfbGVuOwotICAgIEZUX1VJbnQgICAgIHR1cGxlQ291bnQ7Ci0gICAgRlRfVUxvbmcgICAgb2Zmc2V0VG9EYXRhOwotICAgIEZUX1VMb25nICAgIGhlcmU7Ci0gICAgRlRfVUludCAgICAgaSwgajsKLSAgICBGVF9GaXhlZCogICB0dXBsZV9jb29yZHMgICAgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgIGltX3N0YXJ0X2Nvb3JkcyA9IE5VTEw7Ci0gICAgRlRfRml4ZWQqICAgaW1fZW5kX2Nvb3JkcyAgID0gTlVMTDsKLSAgICBHWF9CbGVuZCAgICBibGVuZCAgICAgICAgICAgPSBmYWNlLT5ibGVuZDsKLSAgICBGVF9VSW50ICAgICBwb2ludF9jb3VudCwgc3BvaW50X2NvdW50ID0gMDsKKyAgICBGVF9FcnJvciAgIGVycm9yOworICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7CisKKyAgICBGVF9GYWNlICByb290ID0gJmZhY2UtPnJvb3Q7CisKKyAgICBGVF9VTG9uZyAgdGFibGVfc3RhcnQ7CisgICAgRlRfVUxvbmcgIHRhYmxlX2xlbjsKKworICAgIEZUX1VJbnQgICB0dXBsZUNvdW50OworICAgIEZUX1VMb25nICBvZmZzZXRUb0RhdGE7CisKKyAgICBGVF9VTG9uZyAgaGVyZTsKKyAgICBGVF9VSW50ICAgaSwgajsKKworICAgIEZUX0ZpeGVkKiAgdHVwbGVfY29vcmRzICAgID0gTlVMTDsKKyAgICBGVF9GaXhlZCogIGltX3N0YXJ0X2Nvb3JkcyA9IE5VTEw7CisgICAgRlRfRml4ZWQqICBpbV9lbmRfY29vcmRzICAgPSBOVUxMOworCisgICAgR1hfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7CisKKyAgICBGVF9VSW50ICBwb2ludF9jb3VudDsKKyAgICBGVF9VSW50ICBzcG9pbnRfY291bnQgPSAwOworCiAgICAgRlRfVVNob3J0KiAgc2hhcmVkcG9pbnRzID0gTlVMTDsKICAgICBGVF9VU2hvcnQqICBsb2NhbHBvaW50cyAgPSBOVUxMOwogICAgIEZUX1VTaG9ydCogIHBvaW50czsKLSAgICBGVF9TaG9ydCogICBkZWx0YXM7CisKKyAgICBGVF9GaXhlZCogIGRlbHRhcyAgICAgPSBOVUxMOworICAgIEZUX0ZpeGVkKiAgY3Z0X2RlbHRhcyA9IE5VTEw7CiAKIAogICAgIEZUX1RSQUNFMigoICJDVkFSICIgKSk7CkBAIC0zMTQ2LDExICszMzA1LDE0IEBACiAgICAgfQogCiAgICAgRlRfVFJBQ0U1KCggImN2YXI6IHRoZXJlICVzICVkIHR1cGxlJXM6XG4iLAotICAgICAgICAgICAgICAgICggdHVwbGVDb3VudCAmIDB4RkZGICkgPT0gMSA/ICJpcyIgOiAiYXJlIiwKLSAgICAgICAgICAgICAgICB0dXBsZUNvdW50ICYgMHhGRkYsCi0gICAgICAgICAgICAgICAgKCB0dXBsZUNvdW50ICYgMHhGRkYgKSA9PSAxID8gIiIgOiAicyIgKSk7CisgICAgICAgICAgICAgICAgKCB0dXBsZUNvdW50ICYgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyApID09IDEgPyAiaXMiIDogImFyZSIsCisgICAgICAgICAgICAgICAgdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0ssCisgICAgICAgICAgICAgICAgKCB0dXBsZUNvdW50ICYgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyApID09IDEgPyAiIiA6ICJzIiApKTsKIAotICAgIGZvciAoIGkgPSAwOyBpIDwgKCB0dXBsZUNvdW50ICYgMHhGRkYgKTsgaSsrICkKKyAgICBpZiAoIEZUX05FV19BUlJBWSggY3Z0X2RlbHRhcywgZmFjZS0+Y3Z0X3NpemUgKSApCisgICAgICBnb3RvIEZFeGl0OworCisgICAgZm9yICggaSA9IDA7IGkgPCAoIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRV9DT1VOVF9NQVNLICk7IGkrKyApCiAgICAgewogICAgICAgRlRfVUludCAgIHR1cGxlRGF0YVNpemU7CiAgICAgICBGVF9VSW50ICAgdHVwbGVJbmRleDsKQEAgLTMxNjUsOCArMzMyNyw3IEBACiAgICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9FTUJFRERFRF9UVVBMRV9DT09SRCApCiAgICAgICB7CiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgIHR1cGxlX2Nvb3Jkc1tqXSA9IEZUX0dFVF9TSE9SVCgpICogNDsgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydCBmcmFjIHRvIGZpeGVkICovCisgICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfZmRvdDE0VG9GaXhlZCggRlRfR0VUX1NIT1JUKCkgKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKCAoIHR1cGxlSW5kZXggJiBHWF9USV9UVVBMRV9JTkRFWF9NQVNLICkgPj0gYmxlbmQtPnR1cGxlY291bnQgKQogICAgICAgewpAQCAtMzE3NCwyMCArMzMzNSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgdHVwbGUgaW5kZXhcbiIgKSk7CiAKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIGdvdG8gRkV4aXQ7CiAgICAgICB9CiAgICAgICBlbHNlCisgICAgICB7CisgICAgICAgIGlmICggIWJsZW5kLT50dXBsZWNvb3JkcyApCisgICAgICAgIHsKKyAgICAgICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV92YXJ5X2N2dDoiCisgICAgICAgICAgICAgICAgICAgICAgIiBubyB2YWxpZCB0dXBsZSBjb29yZGluYXRlcyBhdmFpbGFibGVcbiIgKSk7CisKKyAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7CisgICAgICAgICAgZ290byBGRXhpdDsKKyAgICAgICAgfQorCiAgICAgICAgIEZUX01FTV9DT1BZKAogICAgICAgICAgIHR1cGxlX2Nvb3JkcywKLSAgICAgICAgICAmYmxlbmQtPnR1cGxlY29vcmRzWyggdHVwbGVJbmRleCAmIDB4RkZGICkgKiBibGVuZC0+bnVtX2F4aXNdLAorICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3JkcyArCisgICAgICAgICAgICAoIHR1cGxlSW5kZXggJiBHWF9USV9UVVBMRV9JTkRFWF9NQVNLICkgKiBibGVuZC0+bnVtX2F4aXMsCiAgICAgICAgICAgYmxlbmQtPm51bV9heGlzICogc2l6ZW9mICggRlRfRml4ZWQgKSApOworICAgICAgfQogCiAgICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQogICAgICAgewogICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7CisgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2pdID0gRlRfZmRvdDE0VG9GaXhlZCggRlRfR0VUX1NIT1JUKCkgKTsKICAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tqXSA9IEZUX0dFVF9TSE9SVCgpICogNDsKKyAgICAgICAgICBpbV9lbmRfY29vcmRzW2pdID0gRlRfZmRvdDE0VG9GaXhlZCggRlRfR0VUX1NIT1JUKCkgKTsKICAgICAgIH0KIAogICAgICAgYXBwbHkgPSBmdF92YXJfYXBwbHlfdHVwbGUoIGJsZW5kLApAQCAtMzI0MSwxNyArMzQxNCwyMSBAQAogICAgICAgICAvKiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIGRlbHRhcyBmb3IgZXZlcnkgZW50cnkgaW4gY3Z0ICovCiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgZmFjZS0+Y3Z0X3NpemU7IGorKyApCiAgICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICBvcmlnX2N2dCA9IGZhY2UtPmN2dFtqXTsKKyAgICAgICAgICBGVF9GaXhlZCAgb2xkX2N2dF9kZWx0YTsKIAogCi0gICAgICAgICAgZmFjZS0+Y3Z0W2pdID0gKEZUX1Nob3J0KSggb3JpZ19jdnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGFzW2pdLCBhcHBseSApICk7CisgICAgICAgICAgb2xkX2N2dF9kZWx0YSA9IGN2dF9kZWx0YXNbal07CisgICAgICAgICAgY3Z0X2RlbHRhc1tqXSA9IG9sZF9jdnRfZGVsdGEgKyBGVF9NdWxGaXgoIGRlbHRhc1tqXSwgYXBwbHkgKTsKIAogI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCBvcmlnX2N2dCAhPSBmYWNlLT5jdnRbal0gKQorICAgICAgICAgIGlmICggb2xkX2N2dF9kZWx0YSAhPSBjdnRfZGVsdGFzW2pdICkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICVkIC0+ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaiwgb3JpZ19jdnQsIGZhY2UtPmN2dFtqXSApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogJWYgLT4gJWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBqLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBGVF9mZG90NlRvRml4ZWQoIGZhY2UtPmN2dFtqXSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2N2dF9kZWx0YSApIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICggRlRfZmRvdDZUb0ZpeGVkKCBmYWNlLT5jdnRbal0gKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN2dF9kZWx0YXNbal0gKSAvIDY1NTM2LjAgKSk7CiAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgIH0KICNlbmRpZgpAQCAtMzI3NCwyMyArMzQ1MSwyNiBAQAogCiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgcG9pbnRfY291bnQ7IGorKyApCiAgICAgICAgIHsKLSAgICAgICAgICBpbnQgICAgICBwaW5kZXg7Ci0gICAgICAgICAgRlRfTG9uZyAgb3JpZ19jdnQ7CisgICAgICAgICAgaW50ICAgICAgIHBpbmRleDsKKyAgICAgICAgICBGVF9GaXhlZCAgb2xkX2N2dF9kZWx0YTsKIAogCiAgICAgICAgICAgcGluZGV4ID0gcG9pbnRzW2pdOwogICAgICAgICAgIGlmICggKEZUX1VMb25nKXBpbmRleCA+PSBmYWNlLT5jdnRfc2l6ZSApCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIG9yaWdfY3Z0ICAgICAgICAgID0gZmFjZS0+Y3Z0W3BpbmRleF07Ci0gICAgICAgICAgZmFjZS0+Y3Z0W3BpbmRleF0gPSAoRlRfU2hvcnQpKCBvcmlnX2N2dCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGRlbHRhc1tqXSwgYXBwbHkgKSApOworICAgICAgICAgIG9sZF9jdnRfZGVsdGEgICAgICA9IGN2dF9kZWx0YXNbcGluZGV4XTsKKyAgICAgICAgICBjdnRfZGVsdGFzW3BpbmRleF0gPSBvbGRfY3Z0X2RlbHRhICsgRlRfTXVsRml4KCBkZWx0YXNbal0sIGFwcGx5ICk7CiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggb3JpZ19jdnQgIT0gZmFjZS0+Y3Z0W3BpbmRleF0gKQorICAgICAgICAgIGlmICggb2xkX2N2dF9kZWx0YSAhPSBjdnRfZGVsdGFzW3BpbmRleF0gKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogJWQgLT4gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwaW5kZXgsIG9yaWdfY3Z0LCBmYWNlLT5jdnRbcGluZGV4XSApKTsKKyAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogJWYgLT4gJWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX2Zkb3Q2VG9GaXhlZCggZmFjZS0+Y3Z0W3BpbmRleF0gKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9jdnRfZGVsdGEgKSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX2Zkb3Q2VG9GaXhlZCggZmFjZS0+Y3Z0W3BpbmRleF0gKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN2dF9kZWx0YXNbcGluZGV4XSApIC8gNjU1MzYuMCApKTsKICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgfQogI2VuZGlmCkBAIC0zMzEzLDYgKzM0OTMsOSBAQAogCiAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKIAorICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+Y3Z0X3NpemU7IGkrKyApCisgICAgICBmYWNlLT5jdnRbaV0gKz0gRlRfZml4ZWRUb0Zkb3Q2KCBjdnRfZGVsdGFzW2ldICk7CisKICAgRkV4aXQ6CiAgICAgRlRfRlJBTUVfRVhJVCgpOwogCkBAIC0zMzIyLDYgKzM1MDUsMTMgQEAKICAgICBGVF9GUkVFKCB0dXBsZV9jb29yZHMgKTsKICAgICBGVF9GUkVFKCBpbV9zdGFydF9jb29yZHMgKTsKICAgICBGVF9GUkVFKCBpbV9lbmRfY29vcmRzICk7CisgICAgRlRfRlJFRSggY3Z0X2RlbHRhcyApOworCisgICAgLyogaXRlcmF0ZSBvdmVyIGFsbCBGVF9TaXplIG9iamVjdHMgYW5kIHNldCBgY3Z0X3JlYWR5JyB0byAtMSAqLworICAgIC8qIHRvIHRyaWdnZXIgcmVzY2FsaW5nIG9mIGFsbCBDVlQgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBGVF9MaXN0X0l0ZXJhdGUoICZyb290LT5zaXplc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgdHRfY3Z0X3JlYWR5X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwogCiAgICAgcmV0dXJuIGVycm9yOwogICB9CkBAIC0zMzY3LDkgKzM1NTcsOCBAQAogICAvKiBiZXR3ZWVuIGBwMScgYW5kIGBwMicsIHVzaW5nIGByZWYxJyBhbmQgYHJlZjInIGFzIHRoZSByZWZlcmVuY2UgKi8KICAgLyogcG9pbnQgaW5kaWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKLSAgLyogbW9kZWxlZCBhZnRlciBgYWZfaXVwX2ludGVycCcsIGBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZScsIGFuZCAqLwotICAvKiBgSW5zX0lVUCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KKyAgLyogbW9kZWxlZCBhZnRlciBgYWZfaXVwX2ludGVycCcsIGBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZScsIGFuZCAgICovCisgIC8qIGBJbnNfSVVQJyB3aXRoIHNwZWMgZGlmZmVyZW5jZXMgaW4gaGFuZGxpbmcgaWxsLWRlZmluZWQgY2FzZXMuICAqLwogICBzdGF0aWMgdm9pZAogICB0dF9kZWx0YV9pbnRlcnBvbGF0ZSggaW50ICAgICAgICAgcDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBwMiwKQEAgLTM1MjgsNjcgKzM3MTcsOTUgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwbHkgdGhlIGFwcHJvcHJpYXRlIGRlbHRhcyB0byB0aGUgY3VycmVudCBnbHlwaC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGJlaW5nIG1vZGlmaWVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fcG9pbnRzICAgIDo6IFRoZSBudW1iZXIgb2YgdGhlIHBvaW50cyBpbiB0aGUgZ2x5cGgsIGluY2x1ZGluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBwaGFudG9tIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICA6OiBUaGUgb3V0bGluZSB0byBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEFwcGx5IHRoZSBhcHByb3ByaWF0ZSBkZWx0YXMgdG8gdGhlIGN1cnJlbnQgZ2x5cGguCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIGdseXBoX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGJlaW5nIG1vZGlmaWVkLgorICAgKgorICAgKiAgIG5fcG9pbnRzIDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGdseXBoLCBpbmNsdWRpbmcKKyAgICogICAgIHBoYW50b20gcG9pbnRzLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgb3V0bGluZSA6OgorICAgKiAgICAgVGhlIG91dGxpbmUgdG8gY2hhbmdlLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIHVucm91bmRlZCA6OgorICAgKiAgICAgQW4gYXJyYXkgd2l0aCBgbl9wb2ludHMnIGVsZW1lbnRzIHRoYXQgaXMgZmlsbGVkIHdpdGggdW5yb3VuZGVkCisgICAqICAgICBwb2ludCBjb29yZGluYXRlcyAoaW4gMjYuNiBmb3JtYXQpLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdseXBoX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgdW5yb3VuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG5fcG9pbnRzICkKICAgewotICAgIEZUX1N0cmVhbSAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEdYX0JsZW5kICAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOworICAgIEZUX0Vycm9yICAgZXJyb3I7CisgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKKyAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwogCi0gICAgRlRfVmVjdG9yKiAgcG9pbnRzX29yZyA9IE5VTEw7Ci0gICAgRlRfVmVjdG9yKiAgcG9pbnRzX291dCA9IE5VTEw7CisgICAgRlRfVmVjdG9yKiAgcG9pbnRzX29yZyA9IE5VTEw7ICAvKiBjb29yZGluYXRlcyBpbiAxNi4xNiBmb3JtYXQgKi8KKyAgICBGVF9WZWN0b3IqICBwb2ludHNfb3V0ID0gTlVMTDsgIC8qIGNvb3JkaW5hdGVzIGluIDE2LjE2IGZvcm1hdCAqLwogICAgIEZUX0Jvb2wqICAgIGhhc19kZWx0YSAgPSBOVUxMOwogCi0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICAgZ2x5cGhfc3RhcnQ7Ci0gICAgRlRfVUludCAgICAgdHVwbGVDb3VudDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXRUb0RhdGE7Ci0gICAgRlRfVUxvbmcgICAgaGVyZTsKLSAgICBGVF9VSW50ICAgICBpLCBqOwotICAgIEZUX0ZpeGVkKiAgIHR1cGxlX2Nvb3JkcyAgICA9IE5VTEw7Ci0gICAgRlRfRml4ZWQqICAgaW1fc3RhcnRfY29vcmRzID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9lbmRfY29vcmRzICAgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgIHBvaW50X2NvdW50LCBzcG9pbnRfY291bnQgPSAwOworICAgIEZUX1VMb25nICBnbHlwaF9zdGFydDsKKworICAgIEZUX1VJbnQgICB0dXBsZUNvdW50OworICAgIEZUX1VMb25nICBvZmZzZXRUb0RhdGE7CisgICAgRlRfVUxvbmcgIGRhdGFTaXplOworCisgICAgRlRfVUxvbmcgIGhlcmU7CisgICAgRlRfVUludCAgIGksIGo7CisKKyAgICBGVF9GaXhlZCogIHR1cGxlX2Nvb3JkcyAgICA9IE5VTEw7CisgICAgRlRfRml4ZWQqICBpbV9zdGFydF9jb29yZHMgPSBOVUxMOworICAgIEZUX0ZpeGVkKiAgaW1fZW5kX2Nvb3JkcyAgID0gTlVMTDsKKworICAgIEdYX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOworCisgICAgRlRfVUludCAgcG9pbnRfY291bnQ7CisgICAgRlRfVUludCAgc3BvaW50X2NvdW50ID0gMDsKKwogICAgIEZUX1VTaG9ydCogIHNoYXJlZHBvaW50cyA9IE5VTEw7CiAgICAgRlRfVVNob3J0KiAgbG9jYWxwb2ludHMgID0gTlVMTDsKICAgICBGVF9VU2hvcnQqICBwb2ludHM7Ci0gICAgRlRfU2hvcnQgICAgKmRlbHRhc194LCAqZGVsdGFzX3k7CisKKyAgICBGVF9GaXhlZCogIGRlbHRhc194ICAgICAgID0gTlVMTDsKKyAgICBGVF9GaXhlZCogIGRlbHRhc195ICAgICAgID0gTlVMTDsKKyAgICBGVF9GaXhlZCogIHBvaW50X2RlbHRhc194ID0gTlVMTDsKKyAgICBGVF9GaXhlZCogIHBvaW50X2RlbHRhc195ID0gTlVMTDsKIAogCiAgICAgaWYgKCAhZmFjZS0+ZG9ibGVuZCB8fCAhYmxlbmQgKQogICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CiAKKyAgICBmb3IgKCBpID0gMDsgaSA8IG5fcG9pbnRzOyBpKysgKQorICAgIHsKKyAgICAgIHVucm91bmRlZFtpXS54ID0gSU5UX1RPX0YyNkRPVDYoIG91dGxpbmUtPnBvaW50c1tpXS54ICk7CisgICAgICB1bnJvdW5kZWRbaV0ueSA9IElOVF9UT19GMjZET1Q2KCBvdXRsaW5lLT5wb2ludHNbaV0ueSApOworICAgIH0KKwogICAgIGlmICggZ2x5cGhfaW5kZXggPj0gYmxlbmQtPmd2X2dseXBoY250ICAgICAgfHwKICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdID09CiAgICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSApCiAgICAgewogICAgICAgRlRfVFJBQ0UyKCggIlRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzOiIKLSAgICAgICAgICAgICAgICAgICIgbm8gdmFyaWF0aW9uIGRhdGEgZm9yIHRoaXMgZ2x5cGhcbiIgKSk7CisgICAgICAgICAgICAgICAgICAiIG5vIHZhcmlhdGlvbiBkYXRhIGZvciBnbHlwaCAlZFxuIiwgZ2x5cGhfaW5kZXggKSk7CiAgICAgICByZXR1cm4gRlRfRXJyX09rOwogICAgIH0KIApAQCAtMzU5Nyw5ICszODE0LDExIEBACiAgICAgICAgICBGVF9ORVdfQVJSQVkoIGhhc19kZWx0YSwgbl9wb2ludHMgKSAgKQogICAgICAgZ290byBGYWlsMTsKIAotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdICkgICB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2dseXBoX2luZGV4XSApICkKKyAgICBkYXRhU2l6ZSA9IGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSAtCisgICAgICAgICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdOworCisgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmxlbmQtPmdseXBob2Zmc2V0c1tnbHlwaF9pbmRleF0gKSB8fAorICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGRhdGFTaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgZ290byBGYWlsMTsKIAogICAgIGdseXBoX3N0YXJ0ID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKQEAgLTM2MTUsOCArMzgzNCw4IEBACiAgICAgb2Zmc2V0VG9EYXRhID0gRlRfR0VUX1VTSE9SVCgpOwogCiAgICAgLyogcm91Z2ggc2FuaXR5IHRlc3QgKi8KLSAgICBpZiAoIG9mZnNldFRvRGF0YSArICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKSAqIDQgPgotICAgICAgICAgICBibGVuZC0+Z3Zhcl9zaXplICkKKyAgICBpZiAoIG9mZnNldFRvRGF0YSA+IGRhdGFTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgKCB0dXBsZUNvdW50ICYgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyApICogNCA+IGRhdGFTaXplICkKICAgICB7CiAgICAgICBGVF9UUkFDRTIoKCAiVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXM6IgogICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGdseXBoIHZhcmlhdGlvbiBhcnJheSBoZWFkZXJcbiIgKSk7CkBAIC0zNjQ2LDggKzM4NjUsMTUgQEAKICAgICAgICAgICAgICAgICB0dXBsZUNvdW50ICYgR1hfVENfVFVQTEVfQ09VTlRfTUFTSywKICAgICAgICAgICAgICAgICAoIHR1cGxlQ291bnQgJiBHWF9UQ19UVVBMRV9DT1VOVF9NQVNLICkgPT0gMSA/ICIiIDogInMiICkpOwogCisgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHBvaW50X2RlbHRhc194LCBuX3BvaW50cyApIHx8CisgICAgICAgICBGVF9ORVdfQVJSQVkoIHBvaW50X2RlbHRhc195LCBuX3BvaW50cyApICkKKyAgICAgIGdvdG8gRmFpbDM7CisKICAgICBmb3IgKCBqID0gMDsgaiA8IG5fcG9pbnRzOyBqKysgKQotICAgICAgcG9pbnRzX29yZ1tqXSA9IG91dGxpbmUtPnBvaW50c1tqXTsKKyAgICB7CisgICAgICBwb2ludHNfb3JnW2pdLnggPSBGVF9pbnRUb0ZpeGVkKCBvdXRsaW5lLT5wb2ludHNbal0ueCApOworICAgICAgcG9pbnRzX29yZ1tqXS55ID0gRlRfaW50VG9GaXhlZCggb3V0bGluZS0+cG9pbnRzW2pdLnkgKTsKKyAgICB9CiAKICAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKTsgaSsrICkKICAgICB7CkBAIC0zNjY0LDggKzM4OTAsNyBAQAogICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgKQogICAgICAgewogICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICB0dXBsZV9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7ICAgLyogY29udmVydCBmcm9tICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaG9ydCBmcmFjIHRvIGZpeGVkICovCisgICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfZmRvdDE0VG9GaXhlZCggRlRfR0VUX1NIT1JUKCkgKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKCAoIHR1cGxlSW5kZXggJiBHWF9USV9UVVBMRV9JTkRFWF9NQVNLICkgPj0gYmxlbmQtPnR1cGxlY291bnQgKQogICAgICAgewpAQCAtMzY3MywyMCArMzg5OCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgdHVwbGUgaW5kZXhcbiIgKSk7CiAKICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEZhaWwyOworICAgICAgICBnb3RvIEZhaWwzOwogICAgICAgfQogICAgICAgZWxzZQogICAgICAgICBGVF9NRU1fQ09QWSgKICAgICAgICAgICB0dXBsZV9jb29yZHMsCi0gICAgICAgICAgJmJsZW5kLT50dXBsZWNvb3Jkc1soIHR1cGxlSW5kZXggJiAweEZGRiApICogYmxlbmQtPm51bV9heGlzXSwKKyAgICAgICAgICBibGVuZC0+dHVwbGVjb29yZHMgKworICAgICAgICAgICAgKCB0dXBsZUluZGV4ICYgR1hfVElfVFVQTEVfSU5ERVhfTUFTSyApICogYmxlbmQtPm51bV9heGlzLAogICAgICAgICAgIGJsZW5kLT5udW1fYXhpcyAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKTsKIAogICAgICAgaWYgKCB0dXBsZUluZGV4ICYgR1hfVElfSU5URVJNRURJQVRFX1RVUExFICkKICAgICAgIHsKICAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OworICAgICAgICAgIGltX3N0YXJ0X2Nvb3Jkc1tqXSA9IEZUX2Zkb3QxNFRvRml4ZWQoIEZUX0dFVF9TSE9SVCgpICk7CiAgICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7CisgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tqXSA9IEZUX2Zkb3QxNFRvRml4ZWQoIEZUX0dFVF9TSE9SVCgpICk7CiAgICAgICB9CiAKICAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKQEAgLTM3NDIsMTQgKzM5NjgsMTcgQEAKICAgICAgICAgLyogdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBkZWx0YXMgZm9yIGV2ZXJ5IHBvaW50IGluIHRoZSBnbHlwaCAqLwogICAgICAgICBmb3IgKCBqID0gMDsgaiA8IG5fcG9pbnRzOyBqKysgKQogICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBkZWx0YV94ID0gRlRfTXVsRml4KCBkZWx0YXNfeFtqXSwgYXBwbHkgKTsKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhX3kgPSBGVF9NdWxGaXgoIGRlbHRhc195W2pdLCBhcHBseSApOworICAgICAgICAgIEZUX0ZpeGVkICBvbGRfcG9pbnRfZGVsdGFfeCA9IHBvaW50X2RlbHRhc194W2pdOworICAgICAgICAgIEZUX0ZpeGVkICBvbGRfcG9pbnRfZGVsdGFfeSA9IHBvaW50X2RlbHRhc195W2pdOworCisgICAgICAgICAgRlRfRml4ZWQgIHBvaW50X2RlbHRhX3ggPSBGVF9NdWxGaXgoIGRlbHRhc194W2pdLCBhcHBseSApOworICAgICAgICAgIEZUX0ZpeGVkICBwb2ludF9kZWx0YV95ID0gRlRfTXVsRml4KCBkZWx0YXNfeVtqXSwgYXBwbHkgKTsKIAogCiAgICAgICAgICAgaWYgKCBqIDwgbl9wb2ludHMgLSA0ICkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCArPSBkZWx0YV94OwotICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gZGVsdGFfeTsKKyAgICAgICAgICAgIHBvaW50X2RlbHRhc194W2pdID0gb2xkX3BvaW50X2RlbHRhX3ggKyBwb2ludF9kZWx0YV94OworICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3lbal0gPSBvbGRfcG9pbnRfZGVsdGFfeSArIHBvaW50X2RlbHRhX3k7CiAgICAgICAgICAgfQogICAgICAgICAgIGVsc2UKICAgICAgICAgICB7CkBAIC0zNzU5LDMzICszOTg4LDM3IEBACiAgICAgICAgICAgICBpZiAoIGogPT0gKCBuX3BvaW50cyAtIDQgKSAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgJgogICAgICAgICAgICAgICAgICAgICBUVF9GQUNFX0ZMQUdfVkFSX0xTQiAgICApICkKLSAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnggKz0gZGVsdGFfeDsKKyAgICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3hbal0gPSBvbGRfcG9pbnRfZGVsdGFfeCArIHBvaW50X2RlbHRhX3g7CiAKICAgICAgICAgICAgIGVsc2UgaWYgKCBqID09ICggbl9wb2ludHMgLSAzICkgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAgICYKICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GQUNFX0ZMQUdfVkFSX0hBRFZBTkNFICkgKQotICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCArPSBkZWx0YV94OworICAgICAgICAgICAgICBwb2ludF9kZWx0YXNfeFtqXSA9IG9sZF9wb2ludF9kZWx0YV94ICsgcG9pbnRfZGVsdGFfeDsKIAogICAgICAgICAgICAgZWxzZSBpZiAoIGogPT0gKCBuX3BvaW50cyAtIDIgKSAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRkFDRV9GTEFHX1ZBUl9UU0IgICAgKSApCi0gICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS55ICs9IGRlbHRhX3k7CisgICAgICAgICAgICAgIHBvaW50X2RlbHRhc195W2pdID0gb2xkX3BvaW50X2RlbHRhX3kgKyBwb2ludF9kZWx0YV95OwogCiAgICAgICAgICAgICBlbHNlIGlmICggaiA9PSAoIG5fcG9pbnRzIC0gMSApICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgISggZmFjZS0+dmFyaWF0aW9uX3N1cHBvcnQgICAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfRkFDRV9GTEFHX1ZBUl9WQURWQU5DRSApICkKLSAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gZGVsdGFfeTsKKyAgICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3lbal0gPSBvbGRfcG9pbnRfZGVsdGFfeSArIHBvaW50X2RlbHRhX3k7CiAgICAgICAgICAgfQogCiAjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIGRlbHRhX3ggfHwgZGVsdGFfeSApCisgICAgICAgICAgaWYgKCBwb2ludF9kZWx0YV94IHx8IHBvaW50X2RlbHRhX3kgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogKCVkLCAlZCkgLT4gKCVkLCAlZClcbiIsCisgICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICglZiwgJWYpIC0+ICglZiwgJWYpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54IC0gZGVsdGFfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS55IC0gZGVsdGFfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX2ludFRvRml4ZWQoIG91dGxpbmUtPnBvaW50c1tqXS54ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfcG9pbnRfZGVsdGFfeCApIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICggRlRfaW50VG9GaXhlZCggb3V0bGluZS0+cG9pbnRzW2pdLnkgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wb2ludF9kZWx0YV95ICkgLyA2NTUzNi4wLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBGVF9pbnRUb0ZpeGVkKCBvdXRsaW5lLT5wb2ludHNbal0ueCApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3hbal0gKSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX2ludFRvRml4ZWQoIG91dGxpbmUtPnBvaW50c1tqXS55ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9kZWx0YXNfeVtqXSApIC8gNjU1MzYuMCApKTsKICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgfQogI2VuZGlmCkBAIC0zODM3LDE0ICs0MDcwLDE3IEBACiAKICAgICAgICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgaisrICkKICAgICAgICAgewotICAgICAgICAgIEZUX1BvcyAgZGVsdGFfeCA9IHBvaW50c19vdXRbal0ueCAtIHBvaW50c19vcmdbal0ueDsKLSAgICAgICAgICBGVF9Qb3MgIGRlbHRhX3kgPSBwb2ludHNfb3V0W2pdLnkgLSBwb2ludHNfb3JnW2pdLnk7CisgICAgICAgICAgRlRfRml4ZWQgIG9sZF9wb2ludF9kZWx0YV94ID0gcG9pbnRfZGVsdGFzX3hbal07CisgICAgICAgICAgRlRfRml4ZWQgIG9sZF9wb2ludF9kZWx0YV95ID0gcG9pbnRfZGVsdGFzX3lbal07CisKKyAgICAgICAgICBGVF9Qb3MgIHBvaW50X2RlbHRhX3ggPSBwb2ludHNfb3V0W2pdLnggLSBwb2ludHNfb3JnW2pdLng7CisgICAgICAgICAgRlRfUG9zICBwb2ludF9kZWx0YV95ID0gcG9pbnRzX291dFtqXS55IC0gcG9pbnRzX29yZ1tqXS55OwogCiAKICAgICAgICAgICBpZiAoIGogPCBuX3BvaW50cyAtIDQgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IGRlbHRhX3g7Ci0gICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSArPSBkZWx0YV95OworICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3hbal0gPSBvbGRfcG9pbnRfZGVsdGFfeCArIHBvaW50X2RlbHRhX3g7CisgICAgICAgICAgICBwb2ludF9kZWx0YXNfeVtqXSA9IG9sZF9wb2ludF9kZWx0YV95ICsgcG9pbnRfZGVsdGFfeTsKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKQEAgLTM4NTQsMzMgKzQwOTAsMzcgQEAKICAgICAgICAgICAgIGlmICggaiA9PSAoIG5fcG9pbnRzIC0gNCApICAgICAgICAmJgogICAgICAgICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAmCiAgICAgICAgICAgICAgICAgICAgIFRUX0ZBQ0VfRkxBR19WQVJfTFNCICAgICkgKQotICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueCArPSBkZWx0YV94OworICAgICAgICAgICAgICBwb2ludF9kZWx0YXNfeFtqXSA9IG9sZF9wb2ludF9kZWx0YV94ICsgcG9pbnRfZGVsdGFfeDsKIAogICAgICAgICAgICAgZWxzZSBpZiAoIGogPT0gKCBuX3BvaW50cyAtIDMgKSAgICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICAgICEoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICAgJgogICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0ZBQ0VfRkxBR19WQVJfSEFEVkFOQ0UgKSApCi0gICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IGRlbHRhX3g7CisgICAgICAgICAgICAgIHBvaW50X2RlbHRhc194W2pdID0gb2xkX3BvaW50X2RlbHRhX3ggKyBwb2ludF9kZWx0YV94OwogCiAgICAgICAgICAgICBlbHNlIGlmICggaiA9PSAoIG5fcG9pbnRzIC0gMiApICAgICAgICAmJgogICAgICAgICAgICAgICAgICAgICAgICEoIGZhY2UtPnZhcmlhdGlvbl9zdXBwb3J0ICYKICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GQUNFX0ZMQUdfVkFSX1RTQiAgICApICkKLSAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gZGVsdGFfeTsKKyAgICAgICAgICAgICAgcG9pbnRfZGVsdGFzX3lbal0gPSBvbGRfcG9pbnRfZGVsdGFfeSArIHBvaW50X2RlbHRhX3k7CiAKICAgICAgICAgICAgIGVsc2UgaWYgKCBqID09ICggbl9wb2ludHMgLSAxICkgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICAgICAgICAhKCBmYWNlLT52YXJpYXRpb25fc3VwcG9ydCAgICYKICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9GQUNFX0ZMQUdfVkFSX1ZBRFZBTkNFICkgKQotICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSArPSBkZWx0YV95OworICAgICAgICAgICAgICBwb2ludF9kZWx0YXNfeVtqXSA9IG9sZF9wb2ludF9kZWx0YV95ICsgcG9pbnRfZGVsdGFfeTsKICAgICAgICAgICB9CiAKICNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggZGVsdGFfeCB8fCBkZWx0YV95ICkKKyAgICAgICAgICBpZiAoIHBvaW50X2RlbHRhX3ggfHwgcG9pbnRfZGVsdGFfeSApCiAgICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgIEZUX1RSQUNFNygoICIgICAgICAlZDogKCVmLCAlZikgLT4gKCVmLCAlZilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBqLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnggLSBkZWx0YV94LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgLSBkZWx0YV95LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICggRlRfaW50VG9GaXhlZCggb3V0bGluZS0+cG9pbnRzW2pdLnggKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9wb2ludF9kZWx0YV94ICkgLyA2NTUzNi4wLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBGVF9pbnRUb0ZpeGVkKCBvdXRsaW5lLT5wb2ludHNbal0ueSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3BvaW50X2RlbHRhX3kgKSAvIDY1NTM2LjAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIEZUX2ludFRvRml4ZWQoIG91dGxpbmUtPnBvaW50c1tqXS54ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9kZWx0YXNfeFtqXSApIC8gNjU1MzYuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICggRlRfaW50VG9GaXhlZCggb3V0bGluZS0+cG9pbnRzW2pdLnkgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2RlbHRhc195W2pdICkgLyA2NTUzNi4wICkpOwogICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTM5MDQsNiArNDE0NCwxOSBAQAogCiAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKIAorICAgIGZvciAoIGkgPSAwOyBpIDwgbl9wb2ludHM7IGkrKyApCisgICAgeworICAgICAgdW5yb3VuZGVkW2ldLnggKz0gRlRfZml4ZWRUb0Zkb3Q2KCBwb2ludF9kZWx0YXNfeFtpXSApOworICAgICAgdW5yb3VuZGVkW2ldLnkgKz0gRlRfZml4ZWRUb0Zkb3Q2KCBwb2ludF9kZWx0YXNfeVtpXSApOworCisgICAgICBvdXRsaW5lLT5wb2ludHNbaV0ueCArPSBGVF9maXhlZFRvSW50KCBwb2ludF9kZWx0YXNfeFtpXSApOworICAgICAgb3V0bGluZS0+cG9pbnRzW2ldLnkgKz0gRlRfZml4ZWRUb0ludCggcG9pbnRfZGVsdGFzX3lbaV0gKTsKKyAgICB9CisKKyAgRmFpbDM6CisgICAgRlRfRlJFRSggcG9pbnRfZGVsdGFzX3ggKTsKKyAgICBGVF9GUkVFKCBwb2ludF9kZWx0YXNfeSApOworCiAgIEZhaWwyOgogICAgIGlmICggc2hhcmVkcG9pbnRzICE9IEFMTF9QT0lOVFMgKQogICAgICAgRlRfRlJFRSggc2hhcmVkcG9pbnRzICk7CkBAIC0zOTIyLDE2ICs0MTc1LDE2IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dldF92YXJfYmxlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGV4dGVuZGVkIGludGVybmFsIHZlcnNpb24gb2YgYFRUX0dldF9NTV9CbGVuZCcgdGhhdCByZXR1cm5zICAgICAqLwotICAvKiAgICBwb2ludGVycyBpbnN0ZWFkIG9mIGNvcHlpbmcgZGF0YSwgd2l0aG91dCBhbnkgaW5pdGlhbGl6YXRpb24gb2YgICAgKi8KLSAgLyogICAgdGhlIE1NIG1hY2hpbmVyeSBpbiBjYXNlIGl0IGlzbid0IGxvYWRlZCB5ZXQuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2dldF92YXJfYmxlbmQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEFuIGV4dGVuZGVkIGludGVybmFsIHZlcnNpb24gb2YgYFRUX0dldF9NTV9CbGVuZCcgdGhhdCByZXR1cm5zCisgICAqICAgcG9pbnRlcnMgaW5zdGVhZCBvZiBjb3B5aW5nIGRhdGEsIHdpdGhvdXQgYW55IGluaXRpYWxpemF0aW9uIG9mCisgICAqICAgdGhlIE1NIG1hY2hpbmVyeSBpbiBjYXNlIGl0IGlzbid0IGxvYWRlZCB5ZXQuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZ2V0X3Zhcl9ibGVuZCggVFRfRmFjZSAgICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICpudW1fY29vcmRzLApAQCAtMzk5MywxNCArNDI0NiwxNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kb25lX2JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlIHRoZSBibGVuZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZG9uZV9ibGVuZAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRnJlZSB0aGUgYmxlbmQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICB0dF9kb25lX2JsZW5kKCBUVF9GYWNlICBmYWNlICkKICAgewpkaWZmIC0tZ2l0IGEvc3JjL3RydWV0eXBlL3R0Z3h2YXIuaCBiL3NyYy90cnVldHlwZS90dGd4dmFyLmgKaW5kZXggYTM3YmI5MC4uMjZlODliYyAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0Z3h2YXIuaAorKysgYi9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGd4dmFyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgR1ggRm9udCBWYXJpYXRpb24gbG9hZGVyIChzcGVjaWZpY2F0aW9uKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnIGFuZCBHZW9yZ2UgV2lsbGlhbXMuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dGd4dmFyLmgKKyAqCisgKiAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAoc3BlY2lmaWNhdGlvbikKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcgYW5kIEdlb3JnZSBXaWxsaWFtcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFRUR1hWQVJfSF8KICNkZWZpbmUgVFRHWFZBUl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgInR0b2Jqcy5oIgogCiAKQEAgLTI5LDE1ICsyOCwxNSBAQAogCiAjaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGBzaG9ydEZyYWNDb3JyZXNwb25kZW5jZScgaW4gYGF2YXInICAqLwotICAvKiAgICB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb25zIGZyb20gQXBwbGUuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAU3RydWN0OgorICAgKiAgIEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlYworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYHNob3J0RnJhY0NvcnJlc3BvbmRlbmNlJyBpbiBgYXZhcicKKyAgICogICB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb25zIGZyb20gQXBwbGUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgR1hfQVZhckNvcnJlc3BvbmRlbmNlUmVjXwogICB7CiAgICAgRlRfRml4ZWQgIGZyb21Db29yZDsKQEAgLTQ2LDE1ICs0NSwxNSBAQAogICB9IEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlY18sICpHWF9BVmFyQ29ycmVzcG9uZGVuY2U7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9BVmFyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEYXRhIGZyb20gdGhlIHNlZ21lbnQgZmllbGQgb2YgYGF2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlcmUgaXMgb25lIG9mIHRoZXNlIGZvciBlYWNoIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFN0cnVjdDoKKyAgICogICBHWF9BVmFyUmVjCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBEYXRhIGZyb20gdGhlIHNlZ21lbnQgZmllbGQgb2YgYGF2YXInIHRhYmxlLgorICAgKiAgIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBheGlzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJTZWdtZW50UmVjXwogICB7CiAgICAgRlRfVVNob3J0ICAgICAgICAgICAgICBwYWlyQ291bnQ7CkBAIC0xMTQsMTQgKzExMywxNCBAQAogICB9IEdYX0RlbHRhU2V0SWR4TWFwUmVjLCAqR1hfRGVsdGFTZXRJZHhNYXA7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9IVlZhclRhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEYXRhIGZyb20gZWl0aGVyIHRoZSBgSFZBUicgb3IgYFZWQVInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAU3RydWN0OgorICAgKiAgIEdYX0hWVmFyVGFibGVSZWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIERhdGEgZnJvbSBlaXRoZXIgdGhlIGBIVkFSJyBvciBgVlZBUicgdGFibGUuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgR1hfSFZWYXJUYWJsZVJlY18KICAgewogICAgIEdYX0l0ZW1WYXJTdG9yZVJlYyAgICBpdGVtU3RvcmU7ICAgICAgICAvKiBJdGVtIFZhcmlhdGlvbiBTdG9yZSAgKi8KQEAgLTE5MSwxNCArMTkwLDE0IEBACiAgIH0gR1hfVmFsdWVSZWMsICpHWF9WYWx1ZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX01WYXJUYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERhdGEgZnJvbSB0aGUgYE1WQVInIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBTdHJ1Y3Q6CisgICAqICAgR1hfTVZhclRhYmxlUmVjCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBEYXRhIGZyb20gdGhlIGBNVkFSJyB0YWJsZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBHWF9NVmFyVGFibGVSZWNfCiAgIHsKICAgICBGVF9VU2hvcnQgIHZhbHVlQ291bnQ7CkBAIC0yMDksOTUgKzIwOCw5NSBAQAogICB9IEdYX01WYXJUYWJsZVJlYywgKkdYX01WYXJUYWJsZTsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX0JsZW5kUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERhdGEgZm9yIGludGVycG9sYXRpbmcgYSBmb250IGZyb20gYSBkaXN0b3J0YWJsZSBmb250IHNwZWNpZmllZCAgICAqLwotICAvKiAgICBieSB0aGUgR1ggKnZhciB0YWJsZXMgKFtmZ2NhaHZtXXZhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbnVtYmVyIG9mIGF4ZXMgYWxvbmcgd2hpY2ggaW50ZXJwb2xhdGlvbiBtYXkgaGFwcGVuLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMgKGluIHVzZXIgc3BhY2UpIGluZGljYXRpbmcgdGhlICAgICovCi0gIC8qICAgICAgY29udHJpYnV0aW9uIGFsb25nIGVhY2ggYXhpcyB0byB0aGUgZmluYWwgaW50ZXJwb2xhdGVkIGZvbnQuICAgICAqLwotICAvKiAgICAgIGBub3JtYWxpemVkY29vcmRzJyBob2xkcyB0aGUgc2FtZSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vcm1hbGl6ZWRjb29yZHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIG5vcm1hbGl6ZWQgdmFsdWVzIChiZXR3ZWVuIFstMSwxXSkgaW5kaWNhdGluZyB0aGUgICAgKi8KLSAgLyogICAgICBjb250cmlidXRpb24gYWxvbmcgZWFjaCBheGlzIHRvIHRoZSBmaW5hbCBpbnRlcnBvbGF0ZWQgZm9udC4gICAgICovCi0gIC8qICAgICAgYGNvb3JkcycgaG9sZHMgdGhlIHNhbWUgdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW12YXIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRGF0YSBmcm9tIHRoZSBgZnZhcicgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW12YXJfbGVuIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgYG1tdmFyJyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9ybWFsaXplZF9zdHlsZWNvb3JkcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGhhdCBob2xkcyB0aGUgbmFtZWQgaW5zdGFuY2UgZGF0YSBmcm9tICAqLwotICAvKiAgICAgIGBtbXZhcicgYXMgbm9ybWFsaXplZCB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF2YXJfbG9hZGVkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSB0cmllZCB0byBsb2FkIChhbmQgcGFyc2UpIHRoZSBgYXZhcicgKi8KLSAgLyogICAgICB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhdmFyX3NlZ21lbnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEYXRhIGZyb20gdGhlIGBhdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodmFyX2xvYWRlZCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEJvb2xlYW47IGlmIHNldCwgRnJlZVR5cGUgdHJpZWQgdG8gbG9hZCAoYW5kIHBhcnNlKSB0aGUgYGh2YXInICovCi0gIC8qICAgICAgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaHZhcl9jaGVja2VkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBCb29sZWFuOyBpZiBzZXQsIEZyZWVUeXBlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIHBhcnNlZCB0aGUgICAqLwotICAvKiAgICAgIGBodmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGh2YXJfZXJyb3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIGxvYWRpbmcgYW5kIHBhcnNpbmcgb2YgdGhlIGBodmFyJyB0YWJsZSBmYWlsZWQsIHRoaXMgZmllbGQgICAgKi8KLSAgLyogICAgICBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodmFyX3RhYmxlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEYXRhIGZyb20gdGhlIGBodmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2dmFyX2xvYWRlZCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEJvb2xlYW47IGlmIHNldCwgRnJlZVR5cGUgdHJpZWQgdG8gbG9hZCAoYW5kIHBhcnNlKSB0aGUgYHZ2YXInICovCi0gIC8qICAgICAgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdnZhcl9jaGVja2VkIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBCb29sZWFuOyBpZiBzZXQsIEZyZWVUeXBlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIHBhcnNlZCB0aGUgICAqLwotICAvKiAgICAgIGB2dmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZ2YXJfZXJyb3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIGxvYWRpbmcgYW5kIHBhcnNpbmcgb2YgdGhlIGB2dmFyJyB0YWJsZSBmYWlsZWQsIHRoaXMgZmllbGQgICAgKi8KLSAgLyogICAgICBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2dmFyX3RhYmxlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEYXRhIGZyb20gdGhlIGB2dmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtdmFyX3RhYmxlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBEYXRhIGZyb20gdGhlIGBtdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dXBsZWNvdW50IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgbnVtYmVyIG9mIHNoYXJlZCB0dXBsZXMgaW4gdGhlIGBndmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dXBsZWNvb3JkcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIHR3by1kaW1lbnNpb25hbCBhcnJheSB0aGF0IGhvbGRzIHRoZSBzaGFyZWQgdHVwbGUgY29vcmRpbmF0ZXMgICovCi0gIC8qICAgICAgaW4gdGhlIGBndmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ3ZfZ2x5cGhjbnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG51bWJlciBvZiBnbHlwaHMgaGFuZGxlZCBpbiB0aGUgYGd2YXInIHRhYmxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhvZmZzZXRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgT2Zmc2V0cyBpbnRvIHRoZSBnbHlwaCB2YXJpYXRpb24gZGF0YSBhcnJheS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ3Zhcl9zaXplIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIHNpemUgb2YgdGhlIGBndmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBTdHJ1Y3Q6CisgICAqICAgR1hfQmxlbmRSZWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIERhdGEgZm9yIGludGVycG9sYXRpbmcgYSBmb250IGZyb20gYSBkaXN0b3J0YWJsZSBmb250IHNwZWNpZmllZAorICAgKiAgIGJ5IHRoZSBHWCAqdmFyIHRhYmxlcyAoW2ZnY2Fodm1ddmFyKS4KKyAgICoKKyAgICogQEZpZWxkczoKKyAgICogICBudW1fYXhpcyA6OgorICAgKiAgICAgVGhlIG51bWJlciBvZiBheGVzIGFsb25nIHdoaWNoIGludGVycG9sYXRpb24gbWF5IGhhcHBlbi4KKyAgICoKKyAgICogICBjb29yZHMgOjoKKyAgICogICAgIEFuIGFycmF5IG9mIGRlc2lnbiBjb29yZGluYXRlcyAoaW4gdXNlciBzcGFjZSkgaW5kaWNhdGluZyB0aGUKKyAgICogICAgIGNvbnRyaWJ1dGlvbiBhbG9uZyBlYWNoIGF4aXMgdG8gdGhlIGZpbmFsIGludGVycG9sYXRlZCBmb250LgorICAgKiAgICAgYG5vcm1hbGl6ZWRjb29yZHMnIGhvbGRzIHRoZSBzYW1lIHZhbHVlcy4KKyAgICoKKyAgICogICBub3JtYWxpemVkY29vcmRzIDo6CisgICAqICAgICBBbiBhcnJheSBvZiBub3JtYWxpemVkIHZhbHVlcyAoYmV0d2VlbiBbLTEsMV0pIGluZGljYXRpbmcgdGhlCisgICAqICAgICBjb250cmlidXRpb24gYWxvbmcgZWFjaCBheGlzIHRvIHRoZSBmaW5hbCBpbnRlcnBvbGF0ZWQgZm9udC4KKyAgICogICAgIGBjb29yZHMnIGhvbGRzIHRoZSBzYW1lIHZhbHVlcy4KKyAgICoKKyAgICogICBtbXZhciA6OgorICAgKiAgICAgRGF0YSBmcm9tIHRoZSBgZnZhcicgdGFibGUuCisgICAqCisgICAqICAgbW12YXJfbGVuIDo6CisgICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBgbW12YXInIHN0cnVjdHVyZS4KKyAgICoKKyAgICogICBub3JtYWxpemVkX3N0eWxlY29vcmRzIDo6CisgICAqICAgICBBIHR3by1kaW1lbnNpb25hbCBhcnJheSB0aGF0IGhvbGRzIHRoZSBuYW1lZCBpbnN0YW5jZSBkYXRhIGZyb20KKyAgICogICAgIGBtbXZhcicgYXMgbm9ybWFsaXplZCB2YWx1ZXMuCisgICAqCisgICAqICAgYXZhcl9sb2FkZWQgOjoKKyAgICogICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSB0cmllZCB0byBsb2FkIChhbmQgcGFyc2UpIHRoZSBgYXZhcicKKyAgICogICAgIHRhYmxlLgorICAgKgorICAgKiAgIGF2YXJfc2VnbWVudCA6OgorICAgKiAgICAgRGF0YSBmcm9tIHRoZSBgYXZhcicgdGFibGUuCisgICAqCisgICAqICAgaHZhcl9sb2FkZWQgOjoKKyAgICogICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSB0cmllZCB0byBsb2FkIChhbmQgcGFyc2UpIHRoZSBgaHZhcicKKyAgICogICAgIHRhYmxlLgorICAgKgorICAgKiAgIGh2YXJfY2hlY2tlZCA6OgorICAgKiAgICAgQSBCb29sZWFuOyBpZiBzZXQsIEZyZWVUeXBlIHN1Y2Nlc3NmdWxseSBsb2FkZWQgYW5kIHBhcnNlZCB0aGUKKyAgICogICAgIGBodmFyJyB0YWJsZS4KKyAgICoKKyAgICogICBodmFyX2Vycm9yIDo6CisgICAqICAgICBJZiBsb2FkaW5nIGFuZCBwYXJzaW5nIG9mIHRoZSBgaHZhcicgdGFibGUgZmFpbGVkLCB0aGlzIGZpZWxkCisgICAqICAgICBob2xkcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBjb2RlLgorICAgKgorICAgKiAgIGh2YXJfdGFibGUgOjoKKyAgICogICAgIERhdGEgZnJvbSB0aGUgYGh2YXInIHRhYmxlLgorICAgKgorICAgKiAgIHZ2YXJfbG9hZGVkIDo6CisgICAqICAgICBBIEJvb2xlYW47IGlmIHNldCwgRnJlZVR5cGUgdHJpZWQgdG8gbG9hZCAoYW5kIHBhcnNlKSB0aGUgYHZ2YXInCisgICAqICAgICB0YWJsZS4KKyAgICoKKyAgICogICB2dmFyX2NoZWNrZWQgOjoKKyAgICogICAgIEEgQm9vbGVhbjsgaWYgc2V0LCBGcmVlVHlwZSBzdWNjZXNzZnVsbHkgbG9hZGVkIGFuZCBwYXJzZWQgdGhlCisgICAqICAgICBgdnZhcicgdGFibGUuCisgICAqCisgICAqICAgdnZhcl9lcnJvciA6OgorICAgKiAgICAgSWYgbG9hZGluZyBhbmQgcGFyc2luZyBvZiB0aGUgYHZ2YXInIHRhYmxlIGZhaWxlZCwgdGhpcyBmaWVsZAorICAgKiAgICAgaG9sZHMgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3IgY29kZS4KKyAgICoKKyAgICogICB2dmFyX3RhYmxlIDo6CisgICAqICAgICBEYXRhIGZyb20gdGhlIGB2dmFyJyB0YWJsZS4KKyAgICoKKyAgICogICBtdmFyX3RhYmxlIDo6CisgICAqICAgICBEYXRhIGZyb20gdGhlIGBtdmFyJyB0YWJsZS4KKyAgICoKKyAgICogICB0dXBsZWNvdW50IDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIHNoYXJlZCB0dXBsZXMgaW4gdGhlIGBndmFyJyB0YWJsZS4KKyAgICoKKyAgICogICB0dXBsZWNvb3JkcyA6OgorICAgKiAgICAgQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgdGhhdCBob2xkcyB0aGUgc2hhcmVkIHR1cGxlIGNvb3JkaW5hdGVzCisgICAqICAgICBpbiB0aGUgYGd2YXInIHRhYmxlLgorICAgKgorICAgKiAgIGd2X2dseXBoY250IDo6CisgICAqICAgICBUaGUgbnVtYmVyIG9mIGdseXBocyBoYW5kbGVkIGluIHRoZSBgZ3ZhcicgdGFibGUuCisgICAqCisgICAqICAgZ2x5cGhvZmZzZXRzIDo6CisgICAqICAgICBPZmZzZXRzIGludG8gdGhlIGdseXBoIHZhcmlhdGlvbiBkYXRhIGFycmF5LgorICAgKgorICAgKiAgIGd2YXJfc2l6ZSA6OgorICAgKiAgICAgVGhlIHNpemUgb2YgdGhlIGBndmFyJyB0YWJsZS4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBHWF9CbGVuZFJlY18KICAgewogICAgIEZUX1VJbnQgICAgICAgICBudW1fYXhpczsKQEAgLTMzNiwxNCArMzM1LDE0IEBACiAgIH0gR1hfQmxlbmRSZWM7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxlbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9UdXBsZUNvdW50RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGbGFncyB1c2VkIHdpdGhpbiB0aGUgYFR1cGxlQ291bnQnIGZpZWxkIG9mIHRoZSBgZ3ZhcicgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBHWF9UdXBsZUNvdW50RmxhZ3MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVDb3VudCcgZmllbGQgb2YgdGhlIGBndmFyJyB0YWJsZS4KKyAgICovCiAgIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVDb3VudEZsYWdzXwogICB7CiAgICAgR1hfVENfVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMgPSAweDgwMDAsCkBAIC0zNTMsMTUgKzM1MiwxNSBAQAogICB9IEdYX1R1cGxlQ291bnRGbGFnczsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPGVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX1R1cGxlSW5kZXhGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVJbmRleCcgZmllbGQgb2YgdGhlIGBndmFyJyBhbmQgYGN2YXInICAqLwotICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAZW51bToKKyAgICogICBHWF9UdXBsZUluZGV4RmxhZ3MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVJbmRleCcgZmllbGQgb2YgdGhlIGBndmFyJyBhbmQgYGN2YXInCisgICAqICAgdGFibGVzLgorICAgKi8KICAgdHlwZWRlZiBlbnVtICBHWF9UdXBsZUluZGV4RmxhZ3NfCiAgIHsKICAgICBHWF9USV9FTUJFRERFRF9UVVBMRV9DT09SRCAgPSAweDgwMDAsCkBAIC00MTYsNiArNDE1LDcgQEAKICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMoIFRUX0ZhY2UgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGdseXBoX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgdW5yb3VuZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG5fcG9pbnRzICk7CiAKICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGludGVycC5jIGIvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMKaW5kZXggZGE5YjU5NS4uMGMzY2IxMCAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMKKysrIGIvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMKQEAgLTEsMzIgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0aW50ZXJwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0aW50ZXJwLmMKKyAqCisgKiAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKIC8qIEdyZWcgSGl0Y2hjb2NrIGZyb20gTWljcm9zb2Z0IGhhcyBoZWxwZWQgYSBsb3QgaW4gcmVzb2x2aW5nIHVuY2xlYXIgKi8KIC8qIGlzc3VlczsgbWFueSB0aGFua3MhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0dHJpZ29uLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KIAogI2luY2x1ZGUgInR0aW50ZXJwLmgiCiAjaW5jbHVkZSAidHRlcnJvcnMuaCIKQEAgLTM5LDE0ICszOCwxNCBAQAogI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0aW50ZXJwCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHRpbnRlcnAKIAogCiAjZGVmaW5lIE5PX1NVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTgyLDEwICs4MSwxMCBAQAogICAgICAgICAgIGV4Yy0+ZnVuY19kdWFscHJvaiggZXhjLCAodiktPngsICh2KS0+eSApCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFR3byBzaW1wbGUgYm91bmRzLWNoZWNraW5nIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFR3byBzaW1wbGUgYm91bmRzLWNoZWNraW5nIG1hY3Jvcy4KKyAgICovCiAjZGVmaW5lIEJPVU5EUyggeCwgbiApICAgKCAoRlRfVUludCkoeCkgID49IChGVF9VSW50KShuKSAgKQogI2RlZmluZSBCT1VORFNMKCB4LCBuICkgICggKEZUX1VMb25nKSh4KSA+PSAoRlRfVUxvbmcpKG4pICkKIApAQCAtOTcsMzAgKzk2LDMzIEBACiAjZGVmaW5lIEZBSUxVUkUgIDEKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBDT0RFUkFOR0UgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICBDT0RFUkFOR0UgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR290b19Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3dpdGNoZXMgdG8gYSBuZXcgY29kZSByYW5nZSAodXBkYXRlcyB0aGUgY29kZSByZWxhdGVkIGVsZW1lbnRzIGluICovCi0gIC8qICAgIGBleGVjJywgYW5kIGBJUCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlIDo6IFRoZSBuZXcgZXhlY3V0aW9uIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSVAgICAgOjogVGhlIG5ldyBJUCBpbiB0aGUgbmV3IGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX0dvdG9fQ29kZVJhbmdlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBTd2l0Y2hlcyB0byBhIG5ldyBjb2RlIHJhbmdlICh1cGRhdGVzIHRoZSBjb2RlIHJlbGF0ZWQgZWxlbWVudHMgaW4KKyAgICogICBgZXhlYycsIGFuZCBgSVAnKS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHJhbmdlIDo6CisgICAqICAgICBUaGUgbmV3IGV4ZWN1dGlvbiBjb2RlIHJhbmdlLgorICAgKgorICAgKiAgIElQIDo6CisgICAqICAgICBUaGUgbmV3IElQIGluIHRoZSBuZXcgY29kZSByYW5nZS4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGV4ZWMgOjoKKyAgICogICAgIFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICBUVF9Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCiAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCkBAIC0xNDgsMjQgKzE1MCwyOCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TZXRfQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIGEgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSAgOjogVGhlIGNvZGUgcmFuZ2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2UgICA6OiBUaGUgbmV3IGNvZGUgYmFzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSByYW5nZSBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX1NldF9Db2RlUmFuZ2UKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFNldHMgYSBjb2RlIHJhbmdlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgcmFuZ2UgOjoKKyAgICogICAgIFRoZSBjb2RlIHJhbmdlIGluZGV4LgorICAgKgorICAgKiAgIGJhc2UgOjoKKyAgICogICAgIFRoZSBuZXcgY29kZSBiYXNlLgorICAgKgorICAgKiAgIGxlbmd0aCA6OgorICAgKiAgICAgVGhlIHJhbmdlIHNpemUgaW4gYnl0ZXMuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBleGVjIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVFRfU2V0X0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCiAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSwKQEAgLTE3OSwyMCArMTg1LDIyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0NsZWFyX0NvZGVSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsZWFycyBhIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlIDo6IFRoZSBjb2RlIHJhbmdlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9DbGVhcl9Db2RlUmFuZ2UKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENsZWFycyBhIGNvZGUgcmFuZ2UuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICByYW5nZSA6OgorICAgKiAgICAgVGhlIGNvZGUgcmFuZ2UgaW5kZXguCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBleGVjIDo6CisgICAqICAgICBUaGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UgKQpAQCAtMjA0LDI5ICsyMTIsMzEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBFWEVDVVRJT04gQ09OVEVYVCBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICBFWEVDVVRJT04gQ09OVEVYVCBST1VUSU5FUworICAgKgorICAgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0RvbmVfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3lzIGEgZ2l2ZW4gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX0RvbmVfQ29udGV4dAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRGVzdHJveXMgYSBnaXZlbiBjb250ZXh0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZXhlYyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4KKyAgICoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVFRfRG9uZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApCiAgIHsKQEAgLTI1NywyMyArMjY3LDI1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBJbml0X0NvbnRleHQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBtZW1vcnkgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBwYXJlbnQgbWVtb3J5IG9iamVjdC4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGV4ZWMgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIHN0YXRpYyBGVF9FcnJvcgogICBJbml0X0NvbnRleHQoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAogICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgKQpAQCAtMjgxLDcgKzI5Myw3IEBACiAgICAgRlRfRXJyb3IgIGVycm9yOwogCiAKLSAgICBGVF9UUkFDRTEoKCAiSW5pdF9Db250ZXh0OiBuZXcgb2JqZWN0IGF0IDB4JTA4cFxuIiwgZXhlYyApKTsKKyAgICBGVF9UUkFDRTEoKCAiSW5pdF9Db250ZXh0OiBuZXcgb2JqZWN0IGF0ICVwXG4iLCAodm9pZCAqKWV4ZWMgKSk7CiAKICAgICBleGVjLT5tZW1vcnkgICA9IG1lbW9yeTsKICAgICBleGVjLT5jYWxsU2l6ZSA9IDMyOwpAQCAtMzA2LDM3ICszMTgsNDIgQEAKICAgICByZXR1cm4gRlRfRXJyX09rOwogCiAgIEZhaWxfTWVtb3J5OgotICAgIEZUX0VSUk9SKCggIkluaXRfQ29udGV4dDogbm90IGVub3VnaCBtZW1vcnkgZm9yICVwXG4iLCBleGVjICkpOworICAgIEZUX0VSUk9SKCggIkluaXRfQ29udGV4dDogbm90IGVub3VnaCBtZW1vcnkgZm9yICVwXG4iLCAodm9pZCAqKWV4ZWMgKSk7CiAgICAgVFRfRG9uZV9Db250ZXh0KCBleGVjICk7CiAKICAgICByZXR1cm4gZXJyb3I7CiAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXBkYXRlX01heCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2tzIHRoZSBzaXplIG9mIGEgYnVmZmVyIGFuZCByZWFsbG9jYXRlcyBpdCBpZiBuZWNlc3NhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtdWx0aXBsaWVyIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYnVmZmVyLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19tYXggICAgOjogVGhlIG5ldyBjYXBhY2l0eSAoc2l6ZSkgb2YgdGhlIGJ1ZmZlci4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcidzIGN1cnJlbnQgc2l6ZSBleHByZXNzZWQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmYgICAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBiYXNlIHBvaW50ZXIuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBVcGRhdGVfTWF4CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDaGVja3MgdGhlIHNpemUgb2YgYSBidWZmZXIgYW5kIHJlYWxsb2NhdGVzIGl0IGlmIG5lY2Vzc2FyeS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIG1lbW9yeSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBtZW1vcnkgb2JqZWN0LgorICAgKgorICAgKiAgIG11bHRpcGxpZXIgOjoKKyAgICogICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYnVmZmVyLgorICAgKgorICAgKiAgIG5ld19tYXggOjoKKyAgICogICAgIFRoZSBuZXcgY2FwYWNpdHkgKHNpemUpIG9mIHRoZSBidWZmZXIuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBzaXplIDo6CisgICAqICAgICBUaGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyJ3MgY3VycmVudCBzaXplIGV4cHJlc3NlZAorICAgKiAgICAgaW4gZWxlbWVudHMuCisgICAqCisgICAqICAgYnVmZiA6OgorICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBiYXNlIHBvaW50ZXIuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLApAQCAtMzU5LDI4ICszNzYsMzEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJlcGFyZSBhbiBleGVjdXRpb24gY29udGV4dCBmb3IgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVFRfTG9hZF9Db250ZXh0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBQcmVwYXJlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBnbHlwaCBoaW50aW5nLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBzaXplIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNpemUgb2JqZWN0LgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZXhlYyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVFRfTG9hZF9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgZmFjZSwKQEAgLTQ2NywyMyArNDg3LDI1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NhdmVfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNhdmVzIHRoZSBjb2RlIHJhbmdlcyBpbiBhIGBzaXplJyBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9TYXZlX0NvbnRleHQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFNhdmVzIHRoZSBjb2RlIHJhbmdlcyBpbiBhIGBzaXplJyBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBleGVjIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGV4ZWN1dGlvbiBjb250ZXh0LgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgc2l6ZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVFRfU2F2ZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKICAgICAgICAgICAgICAgICAgICBUVF9TaXplICAgICAgICAgc2l6ZSApCkBAIC01MDUsMjcgKzUyNywyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9SdW5fQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFeGVjdXRlcyBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWJ1ZyA6OiBBIEJvb2xlYW4gZmxhZy4gIElmIHNldCwgdGhlIGZ1bmN0aW9uIHNldHMgc29tZSBpbnRlcm5hbCAgKi8KLSAgLyogICAgICAgICAgICAgdmFyaWFibGVzIGFuZCByZXR1cm5zIGltbWVkaWF0ZWx5LCBvdGhlcndpc2UgVFRfUnVuSW5zKCkgICovCi0gIC8qICAgICAgICAgICAgIGlzIGNhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgVGhpcyBpcyBjb21tZW50ZWQgb3V0IGN1cnJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFRUX1J1bl9Db250ZXh0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBFeGVjdXRlcyBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZXhlYyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBUcnVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApCiAgIHsKQEAgLTYwOSwyMiArNjI1LDIyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQmVmb3JlIGFuIG9wY29kZSBpcyBleGVjdXRlZCwgdGhlIGludGVycHJldGVyIHZlcmlmaWVzIHRoYXQgdGhlcmUgYXJlICovCi0gIC8qIGVub3VnaCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBgUG9wX1B1c2hfQ291bnQnICAqLwotICAvKiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciBlYWNoIG9wY29kZSwgdGhlIGZpcnN0IGNvbHVtbiBnaXZlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0ICAqLwotICAvKiBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrOyB0aGUgc2Vjb25kIG9uZSBnaXZlcyB0aGUgbnVtYmVyIG9mIHRob3NlICAgKi8KLSAgLyogdGhhdCBhcmUgcHVzaGVkIGluIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGVzIHdoaWNoIGhhdmUgYSB2YXJ5aW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhIHN0cmVhbSAgKi8KLSAgLyogKE5QVVNIQiwgTlBVU0hXKSBhcmUgaGFuZGxlZCBzcGVjaWFsbHk7IHRoZXkgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlIGluICovCi0gIC8qIHRoZSBgb3Bjb2RlX2xlbmd0aCcgdGFibGUsIGFuZCB0aGUgdmFsdWUgaW4gYFBvcF9QdXNoX0NvdW50JyBpcyBzZXQgICAqLwotICAvKiB0byB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQmVmb3JlIGFuIG9wY29kZSBpcyBleGVjdXRlZCwgdGhlIGludGVycHJldGVyIHZlcmlmaWVzIHRoYXQgdGhlcmUgYXJlCisgICAqIGVub3VnaCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBgUG9wX1B1c2hfQ291bnQnCisgICAqIHRhYmxlLgorICAgKgorICAgKiBGb3IgZWFjaCBvcGNvZGUsIHRoZSBmaXJzdCBjb2x1bW4gZ2l2ZXMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdAorICAgKiBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrOyB0aGUgc2Vjb25kIG9uZSBnaXZlcyB0aGUgbnVtYmVyIG9mIHRob3NlCisgICAqIHRoYXQgYXJlIHB1c2hlZCBpbiByZXN1bHQuCisgICAqCisgICAqIE9wY29kZXMgd2hpY2ggaGF2ZSBhIHZhcnlpbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIGRhdGEgc3RyZWFtCisgICAqIChOUFVTSEIsIE5QVVNIVykgYXJlIGhhbmRsZWQgc3BlY2lhbGx5OyB0aGV5IGhhdmUgYSBuZWdhdGl2ZSB2YWx1ZSBpbgorICAgKiB0aGUgYG9wY29kZV9sZW5ndGgnIHRhYmxlLCBhbmQgdGhlIHZhbHVlIGluIGBQb3BfUHVzaF9Db3VudCcgaXMgc2V0CisgICAqIHRvIHplcm8uCisgICAqCisgICAqLwogCiAKICN1bmRlZiAgUEFDSwpAQCAtNjM3LDIzICs2NTMsMjUgQEAKICAgICAvKiBvcGNvZGVzIGFyZSBnYXRoZXJlZCBpbiBncm91cHMgb2YgMTYgKi8KICAgICAvKiBwbGVhc2Uga2VlcCB0aGUgc3BhY2VzIGFzIHRoZXkgYXJlICAgKi8KIAotICAgIC8qICBTVlRDQSAgeSAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1ZUQ0EgIHggICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNQdlRDQSB5ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTUHZUQ0EgeCAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0Z2VENBIHkgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNGdlRDQSB4ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTUHZUTCAvLyAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU1B2VEwgKyAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNGdlRMIC8vICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTRnZUTCArICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU1B2RlMgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNGdkZTICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBHUHYgICAgICAgKi8gIFBBQ0soIDAsIDIgKSwKLSAgICAvKiAgR0Z2ICAgICAgICovICBQQUNLKCAwLCAyICksCi0gICAgLyogIFNGdlRQdiAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qIDB4MDAgKi8KKyAgICAvKiAgU1ZUQ0FbMF0gICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNWVENBWzFdICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTUFZUQ0FbMF0gKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1BWVENBWzFdICovICBQQUNLKCAwLCAwICksCisgICAgLyogIFNGVlRDQVswXSAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBTRlZUQ0FbMV0gKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgU1BWVExbMF0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNQVlRMWzFdICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRlZUTFswXSAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgU0ZWVExbMV0gICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNQVkZTICAgICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRlZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgR1BWICAgICAgICovICBQQUNLKCAwLCAyICksCisgICAgLyogIEdGViAgICAgICAqLyAgUEFDSyggMCwgMiApLAorICAgIC8qICBTRlZUUFYgICAgKi8gIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgSVNFQ1QgICAgICovICBQQUNLKCA1LCAwICksCiAKKyAgICAvKiAweDEwICovCiAgICAgLyogIFNSUDAgICAgICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBTUlAxICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgU1JQMiAgICAgICovICBQQUNLKCAxLCAwICksCkBAIC02NjcsMTAgKzY4NSwxMSBAQAogICAgIC8qICBTTUQgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgRUxTRSAgICAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIEpNUFIgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTQ3ZUQ2kgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1N3Q2kgICAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNDVlRDSSAgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTU1dDSSAgICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgU1NXICAgICAgICovICBQQUNLKCAxLCAwICksCiAKKyAgICAvKiAweDIwICovCiAgICAgLyogIERVUCAgICAgICAqLyAgUEFDSyggMSwgMiApLAogICAgIC8qICBQT1AgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgQ0xFQVIgICAgICovICBQQUNLKCAwLCAwICksCkBAIC02NzgsNyArNjk3LDcgQEAKICAgICAvKiAgREVQVEggICAgICovICBQQUNLKCAwLCAxICksCiAgICAgLyogIENJTkRFWCAgICAqLyAgUEFDSyggMSwgMSApLAogICAgIC8qICBNSU5ERVggICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgQWxpZ25QVFMgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIEFMSUdOUFRTICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBJTlNfJDI4ICAgKi8gIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgVVRQICAgICAgICovICBQQUNLKCAxLCAwICksCiAgICAgLyogIExPT1BDQUxMICAqLyAgUEFDSyggMiwgMCApLApAQCAtNjg4LDYgKzcwNyw3IEBACiAgICAgLyogIE1EQVBbMF0gICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBNREFQWzFdICAgKi8gIFBBQ0soIDEsIDAgKSwKIAorICAgIC8qIDB4MzAgKi8KICAgICAvKiAgSVVQWzBdICAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIElVUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLAogICAgIC8qICBTSFBbMF0gICAgKi8gIFBBQ0soIDAsIDAgKSwgLyogbG9vcHMgKi8KQEAgLTcwMCwxNyArNzIwLDE4IEBACiAgICAgLyogIElQICAgICAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLwogICAgIC8qICBNU0lSUFswXSAgKi8gIFBBQ0soIDIsIDAgKSwKICAgICAvKiAgTVNJUlBbMV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEFsaWduUlAgICAqLyAgUEFDSyggMCwgMCApLCAvKiBsb29wcyAqLworICAgIC8qICBBTElHTlJQICAgKi8gIFBBQ0soIDAsIDAgKSwgLyogbG9vcHMgKi8KICAgICAvKiAgUlRERyAgICAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIE1JQVBbMF0gICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBNSUFQWzFdICAgKi8gIFBBQ0soIDIsIDAgKSwKIAotICAgIC8qICBOUHVzaEIgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgTlB1c2hXICAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogMHg0MCAqLworICAgIC8qICBOUFVTSEIgICAgKi8gIFBBQ0soIDAsIDAgKSwKKyAgICAvKiAgTlBVU0hXICAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIFdTICAgICAgICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBSUyAgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgV0N2dFAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFJDdnQgICAgICAqLyAgUEFDSyggMSwgMSApLAorICAgIC8qICBXQ1ZUUCAgICAgKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgUkNWVCAgICAgICovICBQQUNLKCAxLCAxICksCiAgICAgLyogIEdDWzBdICAgICAqLyAgUEFDSyggMSwgMSApLAogICAgIC8qICBHQ1sxXSAgICAgKi8gIFBBQ0soIDEsIDEgKSwKICAgICAvKiAgU0NGUyAgICAgICovICBQQUNLKCAyLCAwICksCkBAIC03MTgsMTAgKzczOSwxMSBAQAogICAgIC8qICBNRFsxXSAgICAgKi8gIFBBQ0soIDIsIDEgKSwKICAgICAvKiAgTVBQRU0gICAgICovICBQQUNLKCAwLCAxICksCiAgICAgLyogIE1QUyAgICAgICAqLyAgUEFDSyggMCwgMSApLAotICAgIC8qICBGbGlwT04gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgRmxpcE9GRiAgICovICBQQUNLKCAwLCAwICksCisgICAgLyogIEZMSVBPTiAgICAqLyAgUEFDSyggMCwgMCApLAorICAgIC8qICBGTElQT0ZGICAgKi8gIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgREVCVUcgICAgICovICBQQUNLKCAxLCAwICksCiAKKyAgICAvKiAweDUwICovCiAgICAgLyogIExUICAgICAgICAqLyAgUEFDSyggMiwgMSApLAogICAgIC8qICBMVEVRICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKICAgICAvKiAgR1QgICAgICAgICovICBQQUNLKCAyLCAxICksCkBAIC03MzUsMTAgKzc1NywxMSBAQAogICAgIC8qICBBTkQgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKICAgICAvKiAgT1IgICAgICAgICovICBQQUNLKCAyLCAxICksCiAgICAgLyogIE5PVCAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBEZWx0YVAxICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgREVMVEFQMSAgICovICBQQUNLKCAxLCAwICksCiAgICAgLyogIFNEQiAgICAgICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBTRFMgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKIAorICAgIC8qIDB4NjAgKi8KICAgICAvKiAgQUREICAgICAgICovICBQQUNLKCAyLCAxICksCiAgICAgLyogIFNVQiAgICAgICAqLyAgUEFDSyggMiwgMSApLAogICAgIC8qICBESVYgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKQEAgLTc1NiwxNCArNzc5LDE1IEBACiAgICAgLyogIE5ST1VORFsyXSAqLyAgUEFDSyggMSwgMSApLAogICAgIC8qICBOUk9VTkRbM10gKi8gIFBBQ0soIDEsIDEgKSwKIAotICAgIC8qICBXQ3Z0RiAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgRGVsdGFQMiAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIERlbHRhUDMgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBEZWx0YUNuWzBdICovIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFDblsxXSAqLyBQQUNLKCAxLCAwICksCi0gICAgLyogIERlbHRhQ25bMl0gKi8gUEFDSyggMSwgMCApLAorICAgIC8qIDB4NzAgKi8KKyAgICAvKiAgV0NWVEYgICAgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIERFTFRBUDIgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBERUxUQVAzICAgKi8gIFBBQ0soIDEsIDAgKSwKKyAgICAvKiAgREVMVEFDMSAgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIERFTFRBQzIgICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBERUxUQUMzICAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgU1JPVU5EICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFM0NVJvdW5kICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBTNDVST1VORCAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgSlJPVCAgICAgICovICBQQUNLKCAyLCAwICksCiAgICAgLyogIEpST0YgICAgICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBST0ZGICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKQEAgLTc3MywyMyArNzk3LDI1IEBACiAgICAgLyogIFNBTkdXICAgICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBBQSAgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKIAotICAgIC8qICBGbGlwUFQgICAgKi8gIFBBQ0soIDAsIDAgKSwgLyogbG9vcHMgKi8KLSAgICAvKiAgRmxpcFJnT04gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIEZsaXBSZ09GRiAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qIDB4ODAgKi8KKyAgICAvKiAgRkxJUFBUICAgICovICBQQUNLKCAwLCAwICksIC8qIGxvb3BzICovCisgICAgLyogIEZMSVBSR09OICAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBGTElQUkdPRkYgKi8gIFBBQ0soIDIsIDAgKSwKICAgICAvKiAgSU5TXyQ4MyAgICovICBQQUNLKCAwLCAwICksCiAgICAgLyogIElOU18kODQgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTY2FuQ1RSTCAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RQdlRMWzBdICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNEUHZUTFsxXSAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBHZXRJTkZPICAgKi8gIFBBQ0soIDEsIDEgKSwKKyAgICAvKiAgU0NBTkNUUkwgICovICBQQUNLKCAxLCAwICksCisgICAgLyogIFNEUFZUTFswXSAqLyAgUEFDSyggMiwgMCApLAorICAgIC8qICBTRFBWVExbMV0gKi8gIFBBQ0soIDIsIDAgKSwKKyAgICAvKiAgR0VUSU5GTyAgICovICBQQUNLKCAxLCAxICksCiAgICAgLyogIElERUYgICAgICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBST0xMICAgICAgKi8gIFBBQ0soIDMsIDMgKSwKICAgICAvKiAgTUFYICAgICAgICovICBQQUNLKCAyLCAxICksCiAgICAgLyogIE1JTiAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBTY2FuVFlQRSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSW5zdENUUkwgICovICBQQUNLKCAyLCAwICksCisgICAgLyogIFNDQU5UWVBFICAqLyAgUEFDSyggMSwgMCApLAorICAgIC8qICBJTlNUQ1RSTCAgKi8gIFBBQ0soIDIsIDAgKSwKICAgICAvKiAgSU5TXyQ4RiAgICovICBQQUNLKCAwLCAwICksCiAKKyAgICAvKiAweDkwICovCiAgICAgLyogIElOU18kOTAgICovICAgUEFDSyggMCwgMCApLAogICAgIC8qICBHRVRWQVIgICAqLyAgIFBBQ0soIDAsIDAgKSwgLyogd2lsbCBiZSBoYW5kbGVkIHNwZWNpYWxseSAqLwogICAgIC8qICBHRVREQVRBICAqLyAgIFBBQ0soIDAsIDEgKSwKQEAgLTgwNyw2ICs4MzMsNyBAQAogICAgIC8qICBJTlNfJDlFICAqLyAgIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgSU5TXyQ5RiAgKi8gICBQQUNLKCAwLCAwICksCiAKKyAgICAvKiAweEEwICovCiAgICAgLyogIElOU18kQTAgICovICAgUEFDSyggMCwgMCApLAogICAgIC8qICBJTlNfJEExICAqLyAgIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgSU5TXyRBMiAgKi8gICBQQUNLKCAwLCAwICksCkBAIC04MjQsMjMgKzg1MSwyNSBAQAogICAgIC8qICBJTlNfJEFFICAqLyAgIFBBQ0soIDAsIDAgKSwKICAgICAvKiAgSU5TXyRBRiAgKi8gICBQQUNLKCAwLCAwICksCiAKLSAgICAvKiAgUHVzaEJbMF0gICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIFB1c2hCWzFdICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBQdXNoQlsyXSAgKi8gIFBBQ0soIDAsIDMgKSwKLSAgICAvKiAgUHVzaEJbM10gICovICBQQUNLKCAwLCA0ICksCi0gICAgLyogIFB1c2hCWzRdICAqLyAgUEFDSyggMCwgNSApLAotICAgIC8qICBQdXNoQls1XSAgKi8gIFBBQ0soIDAsIDYgKSwKLSAgICAvKiAgUHVzaEJbNl0gICovICBQQUNLKCAwLCA3ICksCi0gICAgLyogIFB1c2hCWzddICAqLyAgUEFDSyggMCwgOCApLAotICAgIC8qICBQdXNoV1swXSAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgUHVzaFdbMV0gICovICBQQUNLKCAwLCAyICksCi0gICAgLyogIFB1c2hXWzJdICAqLyAgUEFDSyggMCwgMyApLAotICAgIC8qICBQdXNoV1szXSAgKi8gIFBBQ0soIDAsIDQgKSwKLSAgICAvKiAgUHVzaFdbNF0gICovICBQQUNLKCAwLCA1ICksCi0gICAgLyogIFB1c2hXWzVdICAqLyAgUEFDSyggMCwgNiApLAotICAgIC8qICBQdXNoV1s2XSAgKi8gIFBBQ0soIDAsIDcgKSwKLSAgICAvKiAgUHVzaFdbN10gICovICBQQUNLKCAwLCA4ICksCisgICAgLyogMHhCMCAqLworICAgIC8qICBQVVNIQlswXSAgKi8gIFBBQ0soIDAsIDEgKSwKKyAgICAvKiAgUFVTSEJbMV0gICovICBQQUNLKCAwLCAyICksCisgICAgLyogIFBVU0hCWzJdICAqLyAgUEFDSyggMCwgMyApLAorICAgIC8qICBQVVNIQlszXSAgKi8gIFBBQ0soIDAsIDQgKSwKKyAgICAvKiAgUFVTSEJbNF0gICovICBQQUNLKCAwLCA1ICksCisgICAgLyogIFBVU0hCWzVdICAqLyAgUEFDSyggMCwgNiApLAorICAgIC8qICBQVVNIQls2XSAgKi8gIFBBQ0soIDAsIDcgKSwKKyAgICAvKiAgUFVTSEJbN10gICovICBQQUNLKCAwLCA4ICksCisgICAgLyogIFBVU0hXWzBdICAqLyAgUEFDSyggMCwgMSApLAorICAgIC8qICBQVVNIV1sxXSAgKi8gIFBBQ0soIDAsIDIgKSwKKyAgICAvKiAgUFVTSFdbMl0gICovICBQQUNLKCAwLCAzICksCisgICAgLyogIFBVU0hXWzNdICAqLyAgUEFDSyggMCwgNCApLAorICAgIC8qICBQVVNIV1s0XSAgKi8gIFBBQ0soIDAsIDUgKSwKKyAgICAvKiAgUFVTSFdbNV0gICovICBQQUNLKCAwLCA2ICksCisgICAgLyogIFBVU0hXWzZdICAqLyAgUEFDSyggMCwgNyApLAorICAgIC8qICBQVVNIV1s3XSAgKi8gIFBBQ0soIDAsIDggKSwKIAorICAgIC8qIDB4QzAgKi8KICAgICAvKiAgTURSUFswMF0gICovICBQQUNLKCAxLCAwICksCiAgICAgLyogIE1EUlBbMDFdICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBNRFJQWzAyXSAgKi8gIFBBQ0soIDEsIDAgKSwKQEAgLTg1OCw2ICs4ODcsNyBAQAogICAgIC8qICBNRFJQWzE0XSAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgTURSUFsxNV0gICovICBQQUNLKCAxLCAwICksCiAKKyAgICAvKiAweEQwICovCiAgICAgLyogIE1EUlBbMTZdICAqLyAgUEFDSyggMSwgMCApLAogICAgIC8qICBNRFJQWzE3XSAgKi8gIFBBQ0soIDEsIDAgKSwKICAgICAvKiAgTURSUFsxOF0gICovICBQQUNLKCAxLCAwICksCkBAIC04NzUsNiArOTA1LDcgQEAKICAgICAvKiAgTURSUFszMF0gICovICBQQUNLKCAxLCAwICksCiAgICAgLyogIE1EUlBbMzFdICAqLyAgUEFDSyggMSwgMCApLAogCisgICAgLyogMHhFMCAqLwogICAgIC8qICBNSVJQWzAwXSAgKi8gIFBBQ0soIDIsIDAgKSwKICAgICAvKiAgTUlSUFswMV0gICovICBQQUNLKCAyLCAwICksCiAgICAgLyogIE1JUlBbMDJdICAqLyAgUEFDSyggMiwgMCApLApAQCAtODkyLDYgKzkyMyw3IEBACiAgICAgLyogIE1JUlBbMTRdICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBNSVJQWzE1XSAgKi8gIFBBQ0soIDIsIDAgKSwKIAorICAgIC8qIDB4RjAgKi8KICAgICAvKiAgTUlSUFsxNl0gICovICBQQUNLKCAyLCAwICksCiAgICAgLyogIE1JUlBbMTddICAqLyAgUEFDSyggMiwgMCApLAogICAgIC8qICBNSVJQWzE4XSAgKi8gIFBBQ0soIDIsIDAgKSwKQEAgLTkyMCwyMyArOTUyLDI1IEBACiAgIHN0YXRpYwogICBjb25zdCBjaGFyKiAgY29uc3Qgb3Bjb2RlX25hbWVbMjU2XSA9CiAgIHsKLSAgICAiNyBTVlRDQSB5IiwKLSAgICAiNyBTVlRDQSB4IiwKLSAgICAiOCBTUHZUQ0EgeSIsCi0gICAgIjggU1B2VENBIHgiLAotICAgICI4IFNGdlRDQSB5IiwKLSAgICAiOCBTRnZUQ0EgeCIsCi0gICAgIjggU1B2VEwgfHwiLAotICAgICI3IFNQdlRMICsiLAotICAgICI4IFNGdlRMIHx8IiwKLSAgICAiNyBTRnZUTCArIiwKLSAgICAiNSBTUHZGUyIsCi0gICAgIjUgU0Z2RlMiLAotICAgICIzIEdQdiIsCi0gICAgIjMgR0Z2IiwKLSAgICAiNiBTRnZUUHYiLAorICAgIC8qIDB4MDAgKi8KKyAgICAiOCBTVlRDQVt5XSIsCisgICAgIjggU1ZUQ0FbeF0iLAorICAgICI5IFNQVlRDQVt5XSIsCisgICAgIjkgU1BWVENBW3hdIiwKKyAgICAiOSBTRlZUQ0FbeV0iLAorICAgICI5IFNGVlRDQVt4XSIsCisgICAgIjkgU1BWVExbfHxdIiwKKyAgICAiOCBTUFZUTFsrXSIsCisgICAgIjkgU0ZWVExbfHxdIiwKKyAgICAiOCBTRlZUTFsrXSIsCisgICAgIjUgU1BWRlMiLAorICAgICI1IFNGVkZTIiwKKyAgICAiMyBHUFYiLAorICAgICIzIEdGViIsCisgICAgIjYgU0ZWVFBWIiwKICAgICAiNSBJU0VDVCIsCiAKKyAgICAvKiAweDEwICovCiAgICAgIjQgU1JQMCIsCiAgICAgIjQgU1JQMSIsCiAgICAgIjQgU1JQMiIsCkBAIC05NTAsMTAgKzk4NCwxMSBAQAogICAgICIzIFNNRCIsCiAgICAgIjQgRUxTRSIsCiAgICAgIjQgSk1QUiIsCi0gICAgIjYgU0N2VENpIiwKLSAgICAiNSBTU3dDaSIsCisgICAgIjYgU0NWVENJIiwKKyAgICAiNSBTU1dDSSIsCiAgICAgIjMgU1NXIiwKIAorICAgIC8qIDB4MjAgKi8KICAgICAiMyBEVVAiLAogICAgICIzIFBPUCIsCiAgICAgIjUgQ0xFQVIiLApAQCAtOTYxLDUwICs5OTYsNTMgQEAKICAgICAiNSBERVBUSCIsCiAgICAgIjYgQ0lOREVYIiwKICAgICAiNiBNSU5ERVgiLAotICAgICI4IEFsaWduUFRTIiwKKyAgICAiOCBBTElHTlBUUyIsCiAgICAgIjcgSU5TXyQyOCIsCiAgICAgIjMgVVRQIiwKICAgICAiOCBMT09QQ0FMTCIsCiAgICAgIjQgQ0FMTCIsCiAgICAgIjQgRkRFRiIsCiAgICAgIjQgRU5ERiIsCi0gICAgIjcgTURBUFswXSIsCi0gICAgIjcgTURBUFsxXSIsCisgICAgIjYgTURBUFtdIiwKKyAgICAiOSBNREFQW3JuZF0iLAogCi0gICAgIjYgSVVQWzBdIiwKLSAgICAiNiBJVVBbMV0iLAotICAgICI2IFNIUFswXSIsCi0gICAgIjYgU0hQWzFdIiwKLSAgICAiNiBTSENbMF0iLAotICAgICI2IFNIQ1sxXSIsCi0gICAgIjYgU0haWzBdIiwKLSAgICAiNiBTSFpbMV0iLAorICAgIC8qIDB4MzAgKi8KKyAgICAiNiBJVVBbeV0iLAorICAgICI2IElVUFt4XSIsCisgICAgIjggU0hQW3JwMl0iLAorICAgICI4IFNIUFtycDFdIiwKKyAgICAiOCBTSENbcnAyXSIsCisgICAgIjggU0hDW3JwMV0iLAorICAgICI4IFNIWltycDJdIiwKKyAgICAiOCBTSFpbcnAxXSIsCiAgICAgIjUgU0hQSVgiLAogICAgICIyIElQIiwKLSAgICAiOCBNU0lSUFswXSIsCi0gICAgIjggTVNJUlBbMV0iLAotICAgICI3IEFsaWduUlAiLAorICAgICI3IE1TSVJQW10iLAorICAgICJBIE1TSVJQW3JwMF0iLAorICAgICI3IEFMSUdOUlAiLAogICAgICI0IFJUREciLAotICAgICI3IE1JQVBbMF0iLAotICAgICI3IE1JQVBbMV0iLAorICAgICI2IE1JQVBbXSIsCisgICAgIjkgTUlBUFtybmRdIiwKIAotICAgICI2IE5QdXNoQiIsCi0gICAgIjYgTlB1c2hXIiwKKyAgICAvKiAweDQwICovCisgICAgIjYgTlBVU0hCIiwKKyAgICAiNiBOUFVTSFciLAogICAgICIyIFdTIiwKICAgICAiMiBSUyIsCi0gICAgIjUgV0N2dFAiLAotICAgICI0IFJDdnQiLAotICAgICI1IEdDWzBdIiwKLSAgICAiNSBHQ1sxXSIsCisgICAgIjUgV0NWVFAiLAorICAgICI0IFJDVlQiLAorICAgICI4IEdDW2N1cnJdIiwKKyAgICAiOCBHQ1tvcmlnXSIsCiAgICAgIjQgU0NGUyIsCi0gICAgIjUgTURbMF0iLAotICAgICI1IE1EWzFdIiwKKyAgICAiOCBNRFtjdXJyXSIsCisgICAgIjggTURbb3JpZ10iLAogICAgICI1IE1QUEVNIiwKICAgICAiMyBNUFMiLAotICAgICI2IEZsaXBPTiIsCi0gICAgIjcgRmxpcE9GRiIsCisgICAgIjYgRkxJUE9OIiwKKyAgICAiNyBGTElQT0ZGIiwKICAgICAiNSBERUJVRyIsCiAKKyAgICAvKiAweDUwICovCiAgICAgIjIgTFQiLAogICAgICI0IExURVEiLAogICAgICIyIEdUIiwKQEAgLTEwMTgsMTAgKzEwNTYsMTEgQEAKICAgICAiMyBBTkQiLAogICAgICIyIE9SIiwKICAgICAiMyBOT1QiLAotICAgICI3IERlbHRhUDEiLAorICAgICI3IERFTFRBUDEiLAogICAgICIzIFNEQiIsCiAgICAgIjMgU0RTIiwKIAorICAgIC8qIDB4NjAgKi8KICAgICAiMyBBREQiLAogICAgICIzIFNVQiIsCiAgICAgIjMgRElWIiwKQEAgLTEwMzAsMjMgKzEwNjksMjQgQEAKICAgICAiMyBORUciLAogICAgICI1IEZMT09SIiwKICAgICAiNyBDRUlMSU5HIiwKLSAgICAiOCBST1VORFswXSIsCi0gICAgIjggUk9VTkRbMV0iLAotICAgICI4IFJPVU5EWzJdIiwKLSAgICAiOCBST1VORFszXSIsCi0gICAgIjkgTlJPVU5EWzBdIiwKLSAgICAiOSBOUk9VTkRbMV0iLAotICAgICI5IE5ST1VORFsyXSIsCi0gICAgIjkgTlJPVU5EWzNdIiwKKyAgICAiOCBST1VORFtHXSIsCisgICAgIjggUk9VTkRbQl0iLAorICAgICI4IFJPVU5EW1ddIiwKKyAgICAiNyBST1VORFtdIiwKKyAgICAiOSBOUk9VTkRbR10iLAorICAgICI5IE5ST1VORFtCXSIsCisgICAgIjkgTlJPVU5EW1ddIiwKKyAgICAiOCBOUk9VTkRbXSIsCiAKLSAgICAiNSBXQ3Z0RiIsCi0gICAgIjcgRGVsdGFQMiIsCi0gICAgIjcgRGVsdGFQMyIsCi0gICAgIkEgRGVsdGFDblswXSIsCi0gICAgIkEgRGVsdGFDblsxXSIsCi0gICAgIkEgRGVsdGFDblsyXSIsCisgICAgLyogMHg3MCAqLworICAgICI1IFdDVlRGIiwKKyAgICAiNyBERUxUQVAyIiwKKyAgICAiNyBERUxUQVAzIiwKKyAgICAiNyBERUxUQUMxIiwKKyAgICAiNyBERUxUQUMyIiwKKyAgICAiNyBERUxUQUMzIiwKICAgICAiNiBTUk9VTkQiLAotICAgICI4IFM0NVJvdW5kIiwKKyAgICAiOCBTNDVST1VORCIsCiAgICAgIjQgSlJPVCIsCiAgICAgIjQgSlJPRiIsCiAgICAgIjQgUk9GRiIsCkBAIC0xMDU2LDI2ICsxMDk2LDI4IEBACiAgICAgIjUgU0FOR1ciLAogICAgICIyIEFBIiwKIAotICAgICI2IEZsaXBQVCIsCi0gICAgIjggRmxpcFJnT04iLAotICAgICI5IEZsaXBSZ09GRiIsCisgICAgLyogMHg4MCAqLworICAgICI2IEZMSVBQVCIsCisgICAgIjggRkxJUFJHT04iLAorICAgICI5IEZMSVBSR09GRiIsCiAgICAgIjcgSU5TXyQ4MyIsCiAgICAgIjcgSU5TXyQ4NCIsCi0gICAgIjggU2NhbkNUUkwiLAotICAgICI5IFNEUHZUTFswXSIsCi0gICAgIjkgU0RQdlRMWzFdIiwKLSAgICAiNyBHZXRJTkZPIiwKKyAgICAiOCBTQ0FOQ1RSTCIsCisgICAgIkEgU0RQVlRMW3x8XSIsCisgICAgIjkgU0RQVlRMWytdIiwKKyAgICAiNyBHRVRJTkZPIiwKICAgICAiNCBJREVGIiwKICAgICAiNCBST0xMIiwKICAgICAiMyBNQVgiLAogICAgICIzIE1JTiIsCi0gICAgIjggU2NhblRZUEUiLAotICAgICI4IEluc3RDVFJMIiwKKyAgICAiOCBTQ0FOVFlQRSIsCisgICAgIjggSU5TVENUUkwiLAogICAgICI3IElOU18kOEYiLAogCisgICAgLyogMHg5MCAqLwogICAgICI3IElOU18kOTAiLAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAiNiBHRVRWQVIiLAorICAgICJDIEdFVFZBUklBVElPTiIsCiAgICAgIjcgR0VUREFUQSIsCiAjZWxzZQogICAgICI3IElOU18kOTEiLApAQCAtMTA5NSw2ICsxMTM3LDcgQEAKICAgICAiNyBJTlNfJDlFIiwKICAgICAiNyBJTlNfJDlGIiwKIAorICAgIC8qIDB4QTAgKi8KICAgICAiNyBJTlNfJEEwIiwKICAgICAiNyBJTlNfJEExIiwKICAgICAiNyBJTlNfJEEyIiwKQEAgLTExMTIsOTAgKzExNTUsOTUgQEAKICAgICAiNyBJTlNfJEFFIiwKICAgICAiNyBJTlNfJEFGIiwKIAotICAgICI4IFB1c2hCWzBdIiwKLSAgICAiOCBQdXNoQlsxXSIsCi0gICAgIjggUHVzaEJbMl0iLAotICAgICI4IFB1c2hCWzNdIiwKLSAgICAiOCBQdXNoQls0XSIsCi0gICAgIjggUHVzaEJbNV0iLAotICAgICI4IFB1c2hCWzZdIiwKLSAgICAiOCBQdXNoQls3XSIsCi0gICAgIjggUHVzaFdbMF0iLAotICAgICI4IFB1c2hXWzFdIiwKLSAgICAiOCBQdXNoV1syXSIsCi0gICAgIjggUHVzaFdbM10iLAotICAgICI4IFB1c2hXWzRdIiwKLSAgICAiOCBQdXNoV1s1XSIsCi0gICAgIjggUHVzaFdbNl0iLAotICAgICI4IFB1c2hXWzddIiwKKyAgICAvKiAweEIwICovCisgICAgIjggUFVTSEJbMF0iLAorICAgICI4IFBVU0hCWzFdIiwKKyAgICAiOCBQVVNIQlsyXSIsCisgICAgIjggUFVTSEJbM10iLAorICAgICI4IFBVU0hCWzRdIiwKKyAgICAiOCBQVVNIQls1XSIsCisgICAgIjggUFVTSEJbNl0iLAorICAgICI4IFBVU0hCWzddIiwKKyAgICAiOCBQVVNIV1swXSIsCisgICAgIjggUFVTSFdbMV0iLAorICAgICI4IFBVU0hXWzJdIiwKKyAgICAiOCBQVVNIV1szXSIsCisgICAgIjggUFVTSFdbNF0iLAorICAgICI4IFBVU0hXWzVdIiwKKyAgICAiOCBQVVNIV1s2XSIsCisgICAgIjggUFVTSFdbN10iLAogCi0gICAgIjggTURSUFswMF0iLAotICAgICI4IE1EUlBbMDFdIiwKLSAgICAiOCBNRFJQWzAyXSIsCi0gICAgIjggTURSUFswM10iLAotICAgICI4IE1EUlBbMDRdIiwKLSAgICAiOCBNRFJQWzA1XSIsCi0gICAgIjggTURSUFswNl0iLAotICAgICI4IE1EUlBbMDddIiwKLSAgICAiOCBNRFJQWzA4XSIsCi0gICAgIjggTURSUFswOV0iLAotICAgICI4IE1EUlBbMTBdIiwKLSAgICAiOCBNRFJQWzExXSIsCi0gICAgIjggTURSUFsxMl0iLAotICAgICI4IE1EUlBbMTNdIiwKLSAgICAiOCBNRFJQWzE0XSIsCi0gICAgIjggTURSUFsxNV0iLAorICAgIC8qIDB4QzAgKi8KKyAgICAiNyBNRFJQW0ddIiwKKyAgICAiNyBNRFJQW0JdIiwKKyAgICAiNyBNRFJQW1ddIiwKKyAgICAiNiBNRFJQW10iLAorICAgICI4IE1EUlBbckddIiwKKyAgICAiOCBNRFJQW3JCXSIsCisgICAgIjggTURSUFtyV10iLAorICAgICI3IE1EUlBbcl0iLAorICAgICI4IE1EUlBbbUddIiwKKyAgICAiOCBNRFJQW21CXSIsCisgICAgIjggTURSUFttV10iLAorICAgICI3IE1EUlBbbV0iLAorICAgICI5IE1EUlBbbXJHXSIsCisgICAgIjkgTURSUFttckJdIiwKKyAgICAiOSBNRFJQW21yV10iLAorICAgICI4IE1EUlBbbXJdIiwKIAotICAgICI4IE1EUlBbMTZdIiwKLSAgICAiOCBNRFJQWzE3XSIsCi0gICAgIjggTURSUFsxOF0iLAotICAgICI4IE1EUlBbMTldIiwKLSAgICAiOCBNRFJQWzIwXSIsCi0gICAgIjggTURSUFsyMV0iLAotICAgICI4IE1EUlBbMjJdIiwKLSAgICAiOCBNRFJQWzIzXSIsCi0gICAgIjggTURSUFsyNF0iLAotICAgICI4IE1EUlBbMjVdIiwKLSAgICAiOCBNRFJQWzI2XSIsCi0gICAgIjggTURSUFsyN10iLAotICAgICI4IE1EUlBbMjhdIiwKLSAgICAiOCBNRFJQWzI5XSIsCi0gICAgIjggTURSUFszMF0iLAotICAgICI4IE1EUlBbMzFdIiwKKyAgICAvKiAweEQwICovCisgICAgIjggTURSUFtwR10iLAorICAgICI4IE1EUlBbcEJdIiwKKyAgICAiOCBNRFJQW3BXXSIsCisgICAgIjcgTURSUFtwXSIsCisgICAgIjkgTURSUFtwckddIiwKKyAgICAiOSBNRFJQW3ByQl0iLAorICAgICI5IE1EUlBbcHJXXSIsCisgICAgIjggTURSUFtwcl0iLAorICAgICI5IE1EUlBbcG1HXSIsCisgICAgIjkgTURSUFtwbUJdIiwKKyAgICAiOSBNRFJQW3BtV10iLAorICAgICI4IE1EUlBbcG1dIiwKKyAgICAiQSBNRFJQW3BtckddIiwKKyAgICAiQSBNRFJQW3BtckJdIiwKKyAgICAiQSBNRFJQW3BtclddIiwKKyAgICAiOSBNRFJQW3Btcl0iLAogCi0gICAgIjggTUlSUFswMF0iLAotICAgICI4IE1JUlBbMDFdIiwKLSAgICAiOCBNSVJQWzAyXSIsCi0gICAgIjggTUlSUFswM10iLAotICAgICI4IE1JUlBbMDRdIiwKLSAgICAiOCBNSVJQWzA1XSIsCi0gICAgIjggTUlSUFswNl0iLAotICAgICI4IE1JUlBbMDddIiwKLSAgICAiOCBNSVJQWzA4XSIsCi0gICAgIjggTUlSUFswOV0iLAotICAgICI4IE1JUlBbMTBdIiwKLSAgICAiOCBNSVJQWzExXSIsCi0gICAgIjggTUlSUFsxMl0iLAotICAgICI4IE1JUlBbMTNdIiwKLSAgICAiOCBNSVJQWzE0XSIsCi0gICAgIjggTUlSUFsxNV0iLAorICAgIC8qIDB4RTAgKi8KKyAgICAiNyBNSVJQW0ddIiwKKyAgICAiNyBNSVJQW0JdIiwKKyAgICAiNyBNSVJQW1ddIiwKKyAgICAiNiBNSVJQW10iLAorICAgICI4IE1JUlBbckddIiwKKyAgICAiOCBNSVJQW3JCXSIsCisgICAgIjggTUlSUFtyV10iLAorICAgICI3IE1JUlBbcl0iLAorICAgICI4IE1JUlBbbUddIiwKKyAgICAiOCBNSVJQW21CXSIsCisgICAgIjggTUlSUFttV10iLAorICAgICI3IE1JUlBbbV0iLAorICAgICI5IE1JUlBbbXJHXSIsCisgICAgIjkgTUlSUFttckJdIiwKKyAgICAiOSBNSVJQW21yV10iLAorICAgICI4IE1JUlBbbXJdIiwKIAotICAgICI4IE1JUlBbMTZdIiwKLSAgICAiOCBNSVJQWzE3XSIsCi0gICAgIjggTUlSUFsxOF0iLAotICAgICI4IE1JUlBbMTldIiwKLSAgICAiOCBNSVJQWzIwXSIsCi0gICAgIjggTUlSUFsyMV0iLAotICAgICI4IE1JUlBbMjJdIiwKLSAgICAiOCBNSVJQWzIzXSIsCi0gICAgIjggTUlSUFsyNF0iLAotICAgICI4IE1JUlBbMjVdIiwKLSAgICAiOCBNSVJQWzI2XSIsCi0gICAgIjggTUlSUFsyN10iLAotICAgICI4IE1JUlBbMjhdIiwKLSAgICAiOCBNSVJQWzI5XSIsCi0gICAgIjggTUlSUFszMF0iLAotICAgICI4IE1JUlBbMzFdIgorICAgIC8qIDB4RjAgKi8KKyAgICAiOCBNSVJQW3BHXSIsCisgICAgIjggTUlSUFtwQl0iLAorICAgICI4IE1JUlBbcFddIiwKKyAgICAiNyBNSVJQW3BdIiwKKyAgICAiOSBNSVJQW3ByR10iLAorICAgICI5IE1JUlBbcHJCXSIsCisgICAgIjkgTUlSUFtwclddIiwKKyAgICAiOCBNSVJQW3ByXSIsCisgICAgIjkgTUlSUFtwbUddIiwKKyAgICAiOSBNSVJQW3BtQl0iLAorICAgICI5IE1JUlBbcG1XXSIsCisgICAgIjggTUlSUFtwbV0iLAorICAgICJBIE1JUlBbcG1yR10iLAorICAgICJBIE1JUlBbcG1yQl0iLAorICAgICJBIE1JUlBbcG1yV10iLAorICAgICI5IE1JUlBbcG1yXSIKICAgfTsKIAogI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCkBAIC0xNDQ4LDE4ICsxNDk2LDE4IEBACiAjZW5kaWYgLyogVFRfRG90Rml4MTQgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRfUmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybnMgdGhlIGN1cnJlbnQgYXNwZWN0IHJhdGlvIHNjYWxpbmcgZmFjdG9yIGRlcGVuZGluZyBvbiB0aGUgICAqLwotICAvKiAgICBwcm9qZWN0aW9uIHZlY3RvcidzIHN0YXRlIGFuZCBkZXZpY2UgcmVzb2x1dGlvbnMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYXNwZWN0IHJhdGlvIGluIDE2LjE2IGZvcm1hdCwgYWx3YXlzIDw9IDEuMCAuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgQ3VycmVudF9SYXRpbworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUmV0dXJucyB0aGUgY3VycmVudCBhc3BlY3QgcmF0aW8gc2NhbGluZyBmYWN0b3IgZGVwZW5kaW5nIG9uIHRoZQorICAgKiAgIHByb2plY3Rpb24gdmVjdG9yJ3Mgc3RhdGUgYW5kIGRldmljZSByZXNvbHV0aW9ucy4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBUaGUgYXNwZWN0IHJhdGlvIGluIDE2LjE2IGZvcm1hdCwgYWx3YXlzIDw9IDEuMCAuCisgICAqLwogICBzdGF0aWMgRlRfTG9uZwogICBDdXJyZW50X1JhdGlvKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtMTUwMSwxMSArMTU0OSwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIChDVlQpLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoQ1ZUKS4KKyAgICoKKyAgICovCiAKIAogICBGVF9DQUxMQkFDS19ERUYoIEZUX0YyNkRvdDYgKQpAQCAtMTU0Nyw3ICsxNTk1LDcgQEAKICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHgsCiAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQogICB7Ci0gICAgZXhjLT5jdnRbaWR4XSArPSB2YWx1ZTsKKyAgICBleGMtPmN2dFtpZHhdID0gQUREX0xPTkcoIGV4Yy0+Y3Z0W2lkeF0sIHZhbHVlICk7CiAgIH0KIAogCkBAIC0xNTU2LDI1ICsxNjA0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQogICB7Ci0gICAgZXhjLT5jdnRbaWR4XSArPSBGVF9EaXZGaXgoIHZhbHVlLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOworICAgIGV4Yy0+Y3Z0W2lkeF0gPSBBRERfTE9ORyggZXhjLT5jdnRbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggdmFsdWUsIEN1cnJlbnRfUmF0aW8oIGV4YyApICkgKTsKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0U2hvcnRJbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJucyBhIHNob3J0IGludGVnZXIgdGFrZW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0ICAgICAgICovCi0gIC8qICAgIGFkZHJlc3MgSVAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNob3J0IHJlYWQgYXQgY29kZVtJUF0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgb25lIGNvdWxkIGJlY29tZSBhIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBHZXRTaG9ydElucworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUmV0dXJucyBhIHNob3J0IGludGVnZXIgdGFrZW4gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0CisgICAqICAgYWRkcmVzcyBJUC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBTaG9ydCByZWFkIGF0IGNvZGVbSVBdLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGlzIG9uZSBjb3VsZCBiZWNvbWUgYSBtYWNyby4KKyAgICovCiAgIHN0YXRpYyBGVF9TaG9ydAogICBHZXRTaG9ydElucyggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTE1ODUsMjIgKzE2MzQsMjQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR29lcyB0byBhIGNlcnRhaW4gY29kZSByYW5nZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYVJhbmdlIDo6IFRoZSBpbmRleCBvZiB0aGUgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhSVAgICAgOjogVGhlIG5ldyBJUCBhZGRyZXNzIGluIHRoZSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgSW5zX0dvdG9fQ29kZVJhbmdlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBHb2VzIHRvIGEgY2VydGFpbiBjb2RlIHJhbmdlIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBhUmFuZ2UgOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgY29kZSByYW5nZS4KKyAgICoKKyAgICogICBhSVAgOjoKKyAgICogICAgIFRoZSBuZXcgSVAgYWRkcmVzcyBpbiB0aGUgY29kZSByYW5nZS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBTVUNDRVNTIG9yIEZBSUxVUkUuCisgICAqLwogICBzdGF0aWMgRlRfQm9vbAogICBJbnNfR290b19Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGFSYW5nZSwKQEAgLTE2NDIsMjcgKzE2OTMsNTYgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlyZWN0X01vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW92ZXMgYSBwb2ludCBieSBhIGdpdmVuIGRpc3RhbmNlIGFsb25nIHRoZSBmcmVlZG9tIHZlY3Rvci4gIFRoZSAgICovCi0gIC8qICAgIHBvaW50IHdpbGwgYmUgYHRvdWNoZWQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50ICAgIDo6IFRoZSBpbmRleCBvZiB0aGUgcG9pbnQgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgOjogVGhlIGRpc3RhbmNlIHRvIGFwcGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgem9uZSAgICAgOjogVGhlIGFmZmVjdGVkIGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIGB0dGludGVycC5oJyBmb3IgZGV0YWlscyBvbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuICAgICAgICovCi0gIC8qICAgIGBUb3VjaGVzJyB0aGUgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoKKyAgICoKKyAgICogQXBwbGUncyBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGF0CisgICAqCisgICAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wMi9DaGFwMi5odG1sI29yZGVyCisgICAqCisgICAqIGdpdmVzIHRoZSBmb2xsb3dpbmcgb3JkZXIgb2Ygb3BlcmF0aW9ucyBpbiBpbnN0cnVjdGlvbnMgdGhhdCBtb3ZlCisgICAqIHBvaW50cy4KKyAgICoKKyAgICogICAtIGNoZWNrIHNpbmdsZSB3aWR0aCBjdXQtaW4gKE1JUlAsIE1EUlApCisgICAqCisgICAqICAgLSBjaGVjayBjb250cm9sIHZhbHVlIGN1dC1pbiAoTUlSUCwgTUlBUCkKKyAgICoKKyAgICogICAtIGFwcGx5IGVuZ2luZSBjb21wZW5zYXRpb24gKE1JUlAsIE1EUlApCisgICAqCisgICAqICAgLSByb3VuZCBkaXN0YW5jZSAoTUlSUCwgTURSUCkgb3IgdmFsdWUgKE1JQVAsIE1EQVApCisgICAqCisgICAqICAgLSBjaGVjayBtaW5pbXVtIGRpc3RhbmNlIChNSVJQLE1EUlApCisgICAqCisgICAqICAgLSBtb3ZlIHBvaW50IChNSVJQLCBNRFJQLCBNSUFQLCBNU0lSUCwgTURBUCkKKyAgICoKKyAgICogRm9yIHJvdW5kaW5nIGluc3RydWN0aW9ucywgZW5naW5lIGNvbXBlbnNhdGlvbiBoYXBwZW5zIGJlZm9yZSByb3VuZGluZy4KKyAgICoKKyAgICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIERpcmVjdF9Nb3ZlCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBNb3ZlcyBhIHBvaW50IGJ5IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgdGhlIGZyZWVkb20gdmVjdG9yLiAgVGhlCisgICAqICAgcG9pbnQgd2lsbCBiZSBgdG91Y2hlZCcuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBwb2ludCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBwb2ludCB0byBtb3ZlLgorICAgKgorICAgKiAgIGRpc3RhbmNlIDo6CisgICAqICAgICBUaGUgZGlzdGFuY2UgdG8gYXBwbHkuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB6b25lIDo6CisgICAqICAgICBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgU2VlIGB0dGludGVycC5oJyBmb3IgZGV0YWlscyBvbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAqICAgYFRvdWNoZXMnIHRoZSBwb2ludC4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIERpcmVjdF9Nb3ZlKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCkBAIC0xNzI4LDIzICsxODA4LDI2IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERpcmVjdF9Nb3ZlX09yaWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vdmVzIHRoZSAqb3JpZ2luYWwqIHBvc2l0aW9uIG9mIGEgcG9pbnQgYnkgYSBnaXZlbiBkaXN0YW5jZSBhbG9uZyAqLwotICAvKiAgICB0aGUgZnJlZWRvbSB2ZWN0b3IuICBPYnZpb3VzbHksIHRoZSBwb2ludCB3aWxsIG5vdCBiZSBgdG91Y2hlZCcuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIHBvaW50IHRvIG1vdmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlIDo6IFRoZSBkaXN0YW5jZSB0byBhcHBseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHpvbmUgICAgIDo6IFRoZSBhZmZlY3RlZCBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBEaXJlY3RfTW92ZV9PcmlnCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBNb3ZlcyB0aGUgKm9yaWdpbmFsKiBwb3NpdGlvbiBvZiBhIHBvaW50IGJ5IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcKKyAgICogICB0aGUgZnJlZWRvbSB2ZWN0b3IuICBPYnZpb3VzbHksIHRoZSBwb2ludCB3aWxsIG5vdCBiZSBgdG91Y2hlZCcuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBwb2ludCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBwb2ludCB0byBtb3ZlLgorICAgKgorICAgKiAgIGRpc3RhbmNlIDo6CisgICAqICAgICBUaGUgZGlzdGFuY2UgdG8gYXBwbHkuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICB6b25lIDo6CisgICAqICAgICBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIERpcmVjdF9Nb3ZlX09yaWcoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLApAQCAtMTc3MiwxNSArMTg1NSwxNSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNwZWNpYWwgdmVyc2lvbnMgb2YgRGlyZWN0X01vdmUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgZm9sbG93aW5nIHZlcnNpb25zIGFyZSB1c2VkIHdoZW5ldmVyIGJvdGggdmVjdG9ycyBhcmUgYm90aCAgICAgICovCi0gIC8qICAgYWxvbmcgb25lIG9mIHRoZSBjb29yZGluYXRlIHVuaXQgdmVjdG9ycywgaS5lLiBpbiA5MCUgb2YgdGhlIGNhc2VzLiAqLwotICAvKiAgIFNlZSBgdHRpbnRlcnAuaCcgZm9yIGRldGFpbHMgb24gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBtb2RlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU3BlY2lhbCB2ZXJzaW9ucyBvZiBEaXJlY3RfTW92ZSgpCisgICAqCisgICAqICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGgKKyAgICogICBhbG9uZyBvbmUgb2YgdGhlIGNvb3JkaW5hdGUgdW5pdCB2ZWN0b3JzLCBpLmUuIGluIDkwJSBvZiB0aGUgY2FzZXMuCisgICAqICAgU2VlIGB0dGludGVycC5oJyBmb3IgZGV0YWlscyBvbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAqCisgICAqLwogCiAKICAgc3RhdGljIHZvaWQKQEAgLTE4MjcsMTQgKzE5MTAsMTQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTcGVjaWFsIHZlcnNpb25zIG9mIERpcmVjdF9Nb3ZlX09yaWcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGZvbGxvd2luZyB2ZXJzaW9ucyBhcmUgdXNlZCB3aGVuZXZlciBib3RoIHZlY3RvcnMgYXJlIGJvdGggICAgICAqLwotICAvKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU3BlY2lhbCB2ZXJzaW9ucyBvZiBEaXJlY3RfTW92ZV9PcmlnKCkKKyAgICoKKyAgICogICBUaGUgZm9sbG93aW5nIHZlcnNpb25zIGFyZSB1c2VkIHdoZW5ldmVyIGJvdGggdmVjdG9ycyBhcmUgYm90aAorICAgKiAgIGFsb25nIG9uZSBvZiB0aGUgY29vcmRpbmF0ZSB1bml0IHZlY3RvcnMsIGkuZS4gaW4gOTAlIG9mIHRoZSBjYXNlcy4KKyAgICoKKyAgICovCiAKIAogICBzdGF0aWMgdm9pZApAQCAtMTg2MCwzOCArMTk0MywzMiBAQAogICAgIHpvbmUtPm9yZ1twb2ludF0ueSA9IEFERF9MT05HKCB6b25lLT5vcmdbcG9pbnRdLnksIGRpc3RhbmNlICk7CiAgIH0KIAotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX05vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERvZXMgbm90IHJvdW5kLCBidXQgYWRkcyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgKG5vdCkgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvbXBlbnNhdGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gc2F5cyB2ZXJ5IGZldyBhYm91dCB0aGUgcmVsYXRpb25zaGlwICAgICovCi0gIC8qICAgIGJldHdlZW4gcm91bmRpbmcgYW5kIGVuZ2luZSBjb21wZW5zYXRpb24uICBIb3dldmVyLCBpdCBzZWVtcyBmcm9tICAqLwotICAvKiAgICB0aGUgZGVzY3JpcHRpb24gb2Ygc3VwZXIgcm91bmQgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjb21wZW5zYXRpb24gKi8KLSAgLyogICAgYmVmb3JlIHJvdW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFJvdW5kX05vbmUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIERvZXMgbm90IHJvdW5kLCBidXQgYWRkcyBlbmdpbmUgY29tcGVuc2F0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGlzdGFuY2UgOjoKKyAgICogICAgIFRoZSBkaXN0YW5jZSAobm90KSB0byByb3VuZC4KKyAgICoKKyAgICogICBjb2xvciA6OgorICAgKiAgICAgVGhlIGVuZ2luZSBjb21wZW5zYXRpb24gY29sb3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgVGhlIGNvbXBlbnNhdGVkIGRpc3RhbmNlLgorICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKICAgUm91bmRfTm9uZSggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKKyAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTE5MDksMzEgKzE5ODYsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVG9fR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfVG9fR3JpZAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBkaXN0YW5jZSA6OgorICAgKiAgICAgVGhlIGRpc3RhbmNlIHRvIHJvdW5kLgorICAgKgorICAgKiAgIGNvbG9yIDo6CisgICAqICAgICBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbiBjb2xvci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBSb3VuZGVkIGRpc3RhbmNlLgorICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKICAgUm91bmRfVG9fR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKKyAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTE5NTMsMzEgKzIwMzEsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVG9fSGFsZl9HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHRvIGhhbGYgZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfVG9fSGFsZl9HcmlkCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBSb3VuZHMgdmFsdWUgdG8gaGFsZiBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGlzdGFuY2UgOjoKKyAgICogICAgIFRoZSBkaXN0YW5jZSB0byByb3VuZC4KKyAgICoKKyAgICogICBjb2xvciA6OgorICAgKiAgICAgVGhlIGVuZ2luZSBjb21wZW5zYXRpb24gY29sb3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgUm91bmRlZCBkaXN0YW5jZS4KKyAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2CiAgIFJvdW5kX1RvX0hhbGZfR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCisgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTE5OTksMzEgKzIwNzgsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfRG93bl9Ub19HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIGRvd24gdG8gZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfRG93bl9Ub19HcmlkCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBSb3VuZHMgdmFsdWUgZG93biB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGlzdGFuY2UgOjoKKyAgICogICAgIFRoZSBkaXN0YW5jZSB0byByb3VuZC4KKyAgICoKKyAgICogICBjb2xvciA6OgorICAgKiAgICAgVGhlIGVuZ2luZSBjb21wZW5zYXRpb24gY29sb3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgUm91bmRlZCBkaXN0YW5jZS4KKyAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2CiAgIFJvdW5kX0Rvd25fVG9fR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGNvbXBlbnNhdGlvbiApCisgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTIwNDIsMzEgKzIxMjIsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVXBfVG9fR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHVwIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfVXBfVG9fR3JpZAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUm91bmRzIHZhbHVlIHVwIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBkaXN0YW5jZSA6OgorICAgKiAgICAgVGhlIGRpc3RhbmNlIHRvIHJvdW5kLgorICAgKgorICAgKiAgIGNvbG9yIDo6CisgICAqICAgICBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbiBjb2xvci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBSb3VuZGVkIGRpc3RhbmNlLgorICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKICAgUm91bmRfVXBfVG9fR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKKyAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTIwODYsMzEgKzIxNjcsMzIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfVG9fRG91YmxlX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRzIHZhbHVlIHRvIGRvdWJsZSBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfVG9fRG91YmxlX0dyaWQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFJvdW5kcyB2YWx1ZSB0byBkb3VibGUgZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRpc3RhbmNlIDo6CisgICAqICAgICBUaGUgZGlzdGFuY2UgdG8gcm91bmQuCisgICAqCisgICAqICAgY29sb3IgOjoKKyAgICogICAgIFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uIGNvbG9yLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFJvdW5kZWQgZGlzdGFuY2UuCisgICAqLwogICBzdGF0aWMgRlRfRjI2RG90NgogICBSb3VuZF9Ub19Eb3VibGVfR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCiAKICAgICBpZiAoIGRpc3RhbmNlID49IDAgKQogICAgIHsKQEAgLTIxMzAsMzMgKzIyMTIsMzYgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfU3VwZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3VwZXItcm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBzYXlzIHZlcnkgbGl0dGxlIGFib3V0IHRoZSByZWxhdGlvbnNoaXAgKi8KLSAgLyogICAgYmV0d2VlbiByb3VuZGluZyBhbmQgZW5naW5lIGNvbXBlbnNhdGlvbi4gIEhvd2V2ZXIsIGl0IHNlZW1zIGZyb20gICovCi0gIC8qICAgIHRoZSBkZXNjcmlwdGlvbiBvZiBzdXBlciByb3VuZCB0aGF0IHdlIHNob3VsZCBhZGQgdGhlIGNvbXBlbnNhdGlvbiAqLwotICAvKiAgICBiZWZvcmUgcm91bmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfU3VwZXIKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGlzdGFuY2UgOjoKKyAgICogICAgIFRoZSBkaXN0YW5jZSB0byByb3VuZC4KKyAgICoKKyAgICogICBjb2xvciA6OgorICAgKiAgICAgVGhlIGVuZ2luZSBjb21wZW5zYXRpb24gY29sb3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgUm91bmRlZCBkaXN0YW5jZS4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgVGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gc2F5cyB2ZXJ5IGxpdHRsZSBhYm91dCB0aGUgcmVsYXRpb25zaGlwCisgICAqICAgYmV0d2VlbiByb3VuZGluZyBhbmQgZW5naW5lIGNvbXBlbnNhdGlvbi4gIEhvd2V2ZXIsIGl0IHNlZW1zIGZyb20KKyAgICogICB0aGUgZGVzY3JpcHRpb24gb2Ygc3VwZXIgcm91bmQgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjb21wZW5zYXRpb24KKyAgICogICBiZWZvcmUgcm91bmRpbmcuCisgICAqLwogICBzdGF0aWMgRlRfRjI2RG90NgogICBSb3VuZF9TdXBlciggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQorICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICkKICAgeworICAgIEZUX0YyNkRvdDYgIGNvbXBlbnNhdGlvbiA9IGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2NvbG9yXTsKICAgICBGVF9GMjZEb3Q2ICB2YWw7CiAKIApAQCAtMjE4MywzMSArMjI2OCwzNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9TdXBlcl80NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdXBlci1yb3VuZHMgdmFsdWUgdG8gZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gZm9yIFJvdW5kX1N1cGVyXzQ1KCkgYXMgd2UgbWF5IG5lZWQgICAqLwotICAvKiAgICBncmVhdGVyIHByZWNpc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUm91bmRfU3VwZXJfNDUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZGlzdGFuY2UgOjoKKyAgICogICAgIFRoZSBkaXN0YW5jZSB0byByb3VuZC4KKyAgICoKKyAgICogICBjb2xvciA6OgorICAgKiAgICAgVGhlIGVuZ2luZSBjb21wZW5zYXRpb24gY29sb3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgUm91bmRlZCBkaXN0YW5jZS4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgVGhlcmUgaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiBmb3IgUm91bmRfU3VwZXJfNDUoKSBhcyB3ZSBtYXkgbmVlZAorICAgKiAgIGdyZWF0ZXIgcHJlY2lzaW9uLgorICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKICAgUm91bmRfU3VwZXJfNDUoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKKyAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBjb2xvciApCiAgIHsKKyAgICBGVF9GMjZEb3Q2ICBjb21wZW5zYXRpb24gPSBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tjb2xvcl07CiAgICAgRlRfRjI2RG90NiAgdmFsOwogCiAKQEAgLTIyMzQsMTcgKzIzMjIsMTggQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZV9Sb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0cyB0aGUgcm91bmRpbmcgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm91bmRfbW9kZSA6OiBUaGUgcm91bmRpbmcgbW9kZSB0byBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIENvbXB1dGVfUm91bmQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFNldHMgdGhlIHJvdW5kaW5nIG1vZGUuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICByb3VuZF9tb2RlIDo6CisgICAqICAgICBUaGUgcm91bmRpbmcgbW9kZSB0byBiZSB1c2VkLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgQ29tcHV0ZV9Sb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICAgIHJvdW5kX21vZGUgKQpAQCAtMjI4NiwxOSArMjM3NSwyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRTdXBlclJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIFN1cGVyIFJvdW5kIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHcmlkUGVyaW9kIDo6IFRoZSBncmlkIHBlcmlvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlbGVjdG9yICAgOjogVGhlIFNST1VORCBvcGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBTZXRTdXBlclJvdW5kCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBTZXRzIFN1cGVyIFJvdW5kIHBhcmFtZXRlcnMuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBHcmlkUGVyaW9kIDo6CisgICAqICAgICBUaGUgZ3JpZCBwZXJpb2QuCisgICAqCisgICAqICAgc2VsZWN0b3IgOjoKKyAgICogICAgIFRoZSBTUk9VTkQgb3Bjb2RlLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgU2V0U3VwZXJSb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICAgRlRfRjJEb3QxNCAgICAgIEdyaWRQZXJpb2QsCkBAIC0yMzU1LDIyICsyNDQ2LDI0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICAgICAqLwotICAvKiAgICBjdXJyZW50IHByb2plY3Rpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MSA6OiBGaXJzdCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjIgOjogU2Vjb25kIGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRpc3RhbmNlIGluIEYyNmRvdDYgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIFByb2plY3QKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZQorICAgKiAgIGN1cnJlbnQgcHJvamVjdGlvbiB2ZWN0b3IuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICB2MSA6OgorICAgKiAgICAgRmlyc3QgaW5wdXQgdmVjdG9yLgorICAgKiAgIHYyIDo6CisgICAqICAgICBTZWNvbmQgaW5wdXQgdmVjdG9yLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4KKyAgICovCiAgIHN0YXRpYyBGVF9GMjZEb3Q2CiAgIFByb2plY3QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKQEAgLTIzODIsMjIgKzI0NzUsMjQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRHVhbF9Qcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIGN1cnJlbnQgZHVhbCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgRHVhbF9Qcm9qZWN0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlCisgICAqICAgY3VycmVudCBkdWFsIHZlY3Rvci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHYxIDo6CisgICAqICAgICBGaXJzdCBpbnB1dCB2ZWN0b3IuCisgICAqICAgdjIgOjoKKyAgICogICAgIFNlY29uZCBpbnB1dCB2ZWN0b3IuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgVGhlIGRpc3RhbmNlIGluIEYyNmRvdDYgZm9ybWF0LgorICAgKi8KICAgc3RhdGljIEZUX0YyNkRvdDYKICAgRHVhbF9Qcm9qZWN0KCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKQEAgLTI0MDksMjIgKzI1MDQsMjQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdF94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIGhvcml6b250YWwgYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgUHJvamVjdF94CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlCisgICAqICAgaG9yaXpvbnRhbCBheGlzLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgdjEgOjoKKyAgICogICAgIEZpcnN0IGlucHV0IHZlY3Rvci4KKyAgICogICB2MiA6OgorICAgKiAgICAgU2Vjb25kIGlucHV0IHZlY3Rvci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuCisgICAqLwogICBzdGF0aWMgRlRfRjI2RG90NgogICBQcm9qZWN0X3goIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LApAQCAtMjQzNywyMiArMjUzNCwyNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQcm9qZWN0X3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KLSAgLyogICAgdmVydGljYWwgYXhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBQcm9qZWN0X3kKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSB2ZWN0b3IgZ2l2ZW4gYnkgKHYyLXYxKSBhbG9uZyB0aGUKKyAgICogICB2ZXJ0aWNhbCBheGlzLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgdjEgOjoKKyAgICogICAgIEZpcnN0IGlucHV0IHZlY3Rvci4KKyAgICogICB2MiA6OgorICAgKiAgICAgU2Vjb25kIGlucHV0IHZlY3Rvci4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuCisgICAqLwogICBzdGF0aWMgRlRfRjI2RG90NgogICBQcm9qZWN0X3koIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LApAQCAtMjQ2NSwxNSArMjU2NCwxNSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBhbmQgbW92ZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgYWNjb3JkaW5nICAgKi8KLSAgLyogICAgdG8gdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIENvbXB1dGVfRnVuY3MKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIGFuZCBtb3ZlbWVudCBmdW5jdGlvbiBwb2ludGVycyBhY2NvcmRpbmcKKyAgICogICB0byB0aGUgY3VycmVudCBncmFwaGljcyBzdGF0ZS4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIENvbXB1dGVfRnVuY3MoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC0yNTI4LDI4ICsyNjI3LDMxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1zIGEgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZ4IDo6IFRoZSBob3Jpem9udGFsIGlucHV0IHZlY3RvciBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWeSA6OiBUaGUgdmVydGljYWwgaW5wdXQgdmVjdG9yIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSICA6OiBUaGUgbm9ybWVkIHVuaXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm5zIEZBSUxVUkUgaWYgYSB2ZWN0b3IgcGFyYW1ldGVyIGlzIHplcm8uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiBjYXNlIFZ4IGFuZCBWeSBhcmUgYm90aCB6ZXJvLCBgTm9ybWFsaXplJyByZXR1cm5zIFNVQ0NFU1MsIGFuZCAgKi8KLSAgLyogICAgUiBpcyB1bmRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIE5vcm1hbGl6ZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTm9ybXMgYSB2ZWN0b3IuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBWeCA6OgorICAgKiAgICAgVGhlIGhvcml6b250YWwgaW5wdXQgdmVjdG9yIGNvb3JkaW5hdGUuCisgICAqICAgVnkgOjoKKyAgICogICAgIFRoZSB2ZXJ0aWNhbCBpbnB1dCB2ZWN0b3IgY29vcmRpbmF0ZS4KKyAgICoKKyAgICogQE91dHB1dDoKKyAgICogICBSIDo6CisgICAqICAgICBUaGUgbm9ybWVkIHVuaXQgdmVjdG9yLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIFJldHVybnMgRkFJTFVSRSBpZiBhIHZlY3RvciBwYXJhbWV0ZXIgaXMgemVyby4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgSW4gY2FzZSBWeCBhbmQgVnkgYXJlIGJvdGggemVybywgYE5vcm1hbGl6ZScgcmV0dXJucyBTVUNDRVNTLCBhbmQKKyAgICogICBSIGlzIHVuZGVmaW5lZC4KKyAgICovCiAgIHN0YXRpYyBGVF9Cb29sCiAgIE5vcm1hbGl6ZSggRlRfRjI2RG90NiAgICAgIFZ4LAogICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBWeSwKQEAgLTI1NzcsMTEgKzI2NzksMTEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIZXJlIHdlIHN0YXJ0IHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2YXJpb3VzIG9wY29kZXMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSGVyZSB3ZSBzdGFydCB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBvcGNvZGVzLgorICAgKgorICAgKi8KIAogCiAjZGVmaW5lIEFSUkFZX0JPVU5EX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI1OTIsMTIgKzI2OTQsMTIgQEAKICAgICB9IHdoaWxlICgwKQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNUFBFTVtdOiAgICAgIE1lYXN1cmUgUGl4ZWwgUGVyIEVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1QUEVNW106ICAgICAgTWVhc3VyZSBQaXhlbCBQZXIgRU0KKyAgICogT3Bjb2RlIHJhbmdlOiAweDRCCisgICAqIFN0YWNrOiAgICAgICAgLS0+IEV1aW50MTYKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19NUFBFTSggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0yNjA2LDEyICsyNzA4LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTVBTW106ICAgICAgICBNZWFzdXJlIFBvaW50IFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiBFdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBNUFNbXTogICAgICAgIE1lYXN1cmUgUG9pbnQgU2l6ZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NEMKKyAgICogU3RhY2s6ICAgICAgICAtLT4gRXVpbnQxNgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX01QUyggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMjYzMywxMiArMjczNSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERVUFtdOiAgICAgICAgRFVQbGljYXRlIHRoZSBzdGFjaydzIHRvcCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+IFN0a0VsdCBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRFVQW106ICAgICAgICBEVVBsaWNhdGUgdGhlIHN0YWNrJ3MgdG9wIGVsZW1lbnQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDIwCisgICAqIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiBTdGtFbHQgU3RrRWx0CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfRFVQKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI2NDYsMTIgKzI3NDgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQT1BbXTogICAgICAgIFBPUCB0aGUgc3RhY2sncyB0b3AgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFBPUFtdOiAgICAgICAgUE9QIHRoZSBzdGFjaydzIHRvcCBlbGVtZW50CisgICAqIE9wY29kZSByYW5nZTogMHgyMQorICAgKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19QT1AoIHZvaWQgKQogICB7CkBAIC0yNjU5LDEyICsyNzYxLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0xFQVJbXTogICAgICBDTEVBUiB0aGUgZW50aXJlIHN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdC4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBDTEVBUltdOiAgICAgIENMRUFSIHRoZSBlbnRpcmUgc3RhY2sKKyAgICogT3Bjb2RlIHJhbmdlOiAweDIyCisgICAqIFN0YWNrOiAgICAgICAgU3RrRWx0Li4uIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0NMRUFSKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtMjY3MiwxMiArMjc3NCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNXQVBbXTogICAgICAgU1dBUCB0aGUgc3RhY2sncyB0b3AgdHdvIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAyICogU3RrRWx0IC0tPiAyICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1dBUFtdOiAgICAgICBTV0FQIHRoZSBzdGFjaydzIHRvcCB0d28gZWxlbWVudHMKKyAgICogT3Bjb2RlIHJhbmdlOiAweDIzCisgICAqIFN0YWNrOiAgICAgICAgMiAqIFN0a0VsdCAtLT4gMiAqIFN0a0VsdAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NXQVAoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjY5MCwxMiArMjc5MiwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFUFRIW106ICAgICAgcmV0dXJuIHRoZSBzdGFjayBERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogREVQVEhbXTogICAgICByZXR1cm4gdGhlIHN0YWNrIERFUFRICisgICAqIE9wY29kZSByYW5nZTogMHgyNAorICAgKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ERVBUSCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0yNzA0LDEyICsyODA2LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFRbXTogICAgICAgICBMZXNzIFRoYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBMVFtdOiAgICAgICAgIExlc3MgVGhhbgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NTAKKyAgICogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sCisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTFQoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjcxNywxMiArMjgxOSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExURVFbXTogICAgICAgTGVzcyBUaGFuIG9yIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTFRFUVtdOiAgICAgICBMZXNzIFRoYW4gb3IgRVF1YWwKKyAgICogT3Bjb2RlIHJhbmdlOiAweDUxCisgICAqIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0xURVEoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjczMCwxMiArMjgzMiwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdUW106ICAgICAgICAgR3JlYXRlciBUaGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogR1RbXTogICAgICAgICBHcmVhdGVyIFRoYW4KKyAgICogT3Bjb2RlIHJhbmdlOiAweDUyCisgICAqIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0dUKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI3NDMsMTIgKzI4NDUsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHVEVRW106ICAgICAgIEdyZWF0ZXIgVGhhbiBvciBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEdURVFbXTogICAgICAgR3JlYXRlciBUaGFuIG9yIEVRdWFsCisgICAqIE9wY29kZSByYW5nZTogMHg1MworICAgKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19HVEVRKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI3NTYsMTIgKzI4NTgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFUVtdOiAgICAgICAgIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEVRW106ICAgICAgICAgRVF1YWwKKyAgICogT3Bjb2RlIHJhbmdlOiAweDU0CisgICAqIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0VRKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI3NjksMTIgKzI4NzEsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBORVFbXTogICAgICAgIE5vdCBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IFN0a0VsdCAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE5FUVtdOiAgICAgICAgTm90IEVRdWFsCisgICAqIE9wY29kZSByYW5nZTogMHg1NQorICAgKiBTdGFjazogICAgICAgIFN0a0VsdCBTdGtFbHQgLS0+IGJvb2wKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ORVEoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjc4Miw0MCArMjg4NCw0MCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9ERFtdOiAgICAgICAgSXMgT0REICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogT0REW106ICAgICAgICBJcyBPREQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDU2CisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGJvb2wKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19PREQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewotICAgIGFyZ3NbMF0gPSAoICggZXhjLT5mdW5jX3JvdW5kKCBleGMsIGFyZ3NbMF0sIDAgKSAmIDEyNyApID09IDY0ICk7CisgICAgYXJnc1swXSA9ICggKCBleGMtPmZ1bmNfcm91bmQoIGV4YywgYXJnc1swXSwgMyApICYgMTI3ICkgPT0gNjQgKTsKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFVkVOW106ICAgICAgIElzIEVWRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEVWRU5bXTogICAgICAgSXMgRVZFTgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NTcKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0VWRU4oIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBhcmdzWzBdID0gKCAoIGV4Yy0+ZnVuY19yb3VuZCggZXhjLCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSAwICk7CisgICAgYXJnc1swXSA9ICggKCBleGMtPmZ1bmNfcm91bmQoIGV4YywgYXJnc1swXSwgMyApICYgMTI3ICkgPT0gMCApOwogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFORFtdOiAgICAgICAgbG9naWNhbCBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQU5EW106ICAgICAgICBsb2dpY2FsIEFORAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NUEKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiB1aW50MzIKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19BTkQoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjgyMywxMiArMjkyNSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9SW106ICAgICAgICAgbG9naWNhbCBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogT1JbXTogICAgICAgICBsb2dpY2FsIE9SCisgICAqIE9wY29kZSByYW5nZTogMHg1QgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IHVpbnQzMgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX09SKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI4MzYsMTIgKzI5MzgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOT1RbXTogICAgICAgIGxvZ2ljYWwgTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE5PVFtdOiAgICAgICAgbG9naWNhbCBOT1QKKyAgICogT3Bjb2RlIHJhbmdlOiAweDVDCisgICAqIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiB1aW50MzIKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19OT1QoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjg0OSwxMiArMjk1MSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFERFtdOiAgICAgICAgQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQUREW106ICAgICAgICBBREQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDYwCisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfQUREKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI4NjIsMTIgKzI5NjQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTVUJbXTogICAgICAgIFNVQnRyYWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNVQltdOiAgICAgICAgU1VCdHJhY3QKKyAgICogT3Bjb2RlIHJhbmdlOiAweDYxCisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU1VCKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI4NzUsMTIgKzI5NzcsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBESVZbXTogICAgICAgIERJVmlkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERJVltdOiAgICAgICAgRElWaWRlCisgICAqIE9wY29kZSByYW5nZTogMHg2MgorICAgKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0RJViggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMjg5MiwxMiArMjk5NCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1VTFtdOiAgICAgICAgTVVMdGlwbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTVVMW106ICAgICAgICBNVUx0aXBseQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NjMKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19NVUwoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjkwNSwxMiArMzAwNywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFCU1tdOiAgICAgICAgQUJTb2x1dGUgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQUJTW106ICAgICAgICBBQlNvbHV0ZSB2YWx1ZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NjQKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19BQlMoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjkxOSwxMiArMzAyMSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5FR1tdOiAgICAgICAgTkVHYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTkVHW106ICAgICAgICBORUdhdGUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDY1CisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTkVHKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTI5MzIsMTIgKzMwMzQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTE9PUltdOiAgICAgIEZMT09SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEZMT09SW106ICAgICAgRkxPT1IKKyAgICogT3Bjb2RlIHJhbmdlOiAweDY2CisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfRkxPT1IoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjk0NSwxMiArMzA0NywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENFSUxJTkdbXTogICAgQ0VJTElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQ0VJTElOR1tdOiAgICBDRUlMSU5HCisgICAqIE9wY29kZSByYW5nZTogMHg2NworICAgKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0NFSUxJTkcoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMjk1OCwxMiArMzA2MCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJTW106ICAgICAgICAgUmVhZCBTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUlNbXTogICAgICAgICBSZWFkIFN0b3JlCisgICAqIE9wY29kZSByYW5nZTogMHg0MworICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gdWludDMyCisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfUlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzAwNCwxMiArMzEwNiwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdTW106ICAgICAgICAgV3JpdGUgU3RvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogV1NbXTogICAgICAgICBXcml0ZSBTdG9yZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NDIKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1dTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTMwMjcsMTIgKzMxMjksMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXQ1ZUUFtdOiAgICAgIFdyaXRlIENWVCBpbiBQaXhlbCB1bml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFdDVlRQW106ICAgICAgV3JpdGUgQ1ZUIGluIFBpeGVsIHVuaXRzCisgICAqIE9wY29kZSByYW5nZTogMHg0NAorICAgKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19XQ1ZUUCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0zMDUwLDEyICszMTUyLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV0NWVEZbXTogICAgICBXcml0ZSBDVlQgaW4gRnVuaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBXQ1ZURltdOiAgICAgIFdyaXRlIENWVCBpbiBGdW5pdHMKKyAgICogT3Bjb2RlIHJhbmdlOiAweDcwCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19XQ1ZURiggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0zMDczLDEyICszMTc1LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUkNWVFtdOiAgICAgICBSZWFkIENWVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBSQ1ZUW106ICAgICAgIFJlYWQgQ1ZUCisgICAqIE9wY29kZSByYW5nZTogMHg0NQorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19SQ1ZUKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzA5OCwxMiArMzIwMCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFBW106ICAgICAgICAgQWRqdXN0IEFuZ2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQUFbXTogICAgICAgICBBZGp1c3QgQW5nbGUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDdGCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0FBKCB2b2lkICkKICAgewpAQCAtMzExMSwxNCArMzIxMywxNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFQlVHW106ICAgICAgREVCVUcuICBVbnN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlOiBUaGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gcG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBERUJVR1tdOiAgICAgIERFQlVHLiAgVW5zdXBwb3J0ZWQuCisgICAqIE9wY29kZSByYW5nZTogMHg0RgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICoKKyAgICogTm90ZTogVGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ERUJVRyggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTMxMjYsNDYgKzMyMjgsNDAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST1VORFthYl06ICAgIFJPVU5EIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY4LTB4NkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJPVU5EW2FiXTogICAgUk9VTkQgdmFsdWUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDY4LTB4NkIKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCiAgIHsKLSAgICBhcmdzWzBdID0gZXhjLT5mdW5jX3JvdW5kKAotICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICBhcmdzWzBdLAotICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlIC0gMHg2OF0gKTsKKyAgICBhcmdzWzBdID0gZXhjLT5mdW5jX3JvdW5kKCBleGMsIGFyZ3NbMF0sIGV4Yy0+b3Bjb2RlICYgMyApOwogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5ST1VORFthYl06ICAgTm8gUk9VTkRpbmcgb2YgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NkMtMHg2RiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTlJPVU5EW2FiXTogICBObyBST1VORGluZyBvZiB2YWx1ZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NkMtMHg2RgorICAgKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX05ST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7Ci0gICAgYXJnc1swXSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgIGFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgLSAweDZDXSApOworICAgIGFyZ3NbMF0gPSBSb3VuZF9Ob25lKCBleGMsIGFyZ3NbMF0sIGV4Yy0+b3Bjb2RlICYgMyApOwogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1BWFtdOiAgICAgICAgTUFYaW11bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTUFYW106ICAgICAgICBNQVhpbXVtCisgICAqIE9wY29kZSByYW5nZTogMHg4QgorICAgKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGludDMyCisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTUFYKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTMxNzQsMTIgKzMyNzAsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSU5bXTogICAgICAgIE1JTmltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDhDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1JTltdOiAgICAgICAgTUlOaW11bQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4OEMKKyAgICogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBpbnQzMgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX01JTiggRlRfTG9uZyogIGFyZ3MgKQogICB7CkBAIC0zMTg4LDEyICszMjg0LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUlOREVYW106ICAgICBNb3ZlIElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBNSU5ERVhbXTogICAgIE1vdmUgSU5ERVhlZCBlbGVtZW50CisgICAqIE9wY29kZSByYW5nZTogMHgyNgorICAgKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gU3RrRWx0CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTUlOREVYKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0zMjIxLDEyICszMzE3LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0lOREVYW106ICAgICBDb3B5IElOREVYZWQgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBDSU5ERVhbXTogICAgIENvcHkgSU5ERVhlZCBlbGVtZW50CisgICAqIE9wY29kZSByYW5nZTogMHgyNQorICAgKiBTdGFjazogICAgICAgIGludDMyIC0tPiBTdGtFbHQKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19DSU5ERVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTMyNDcsMTIgKzMzNDMsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST0xMW106ICAgICAgIFJPTEwgdG9wIHRocmVlIGVsZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgMyAqIFN0a0VsdCAtLT4gMyAqIFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJPTExbXTogICAgICAgUk9MTCB0b3AgdGhyZWUgZWxlbWVudHMKKyAgICogT3Bjb2RlIHJhbmdlOiAweDhBCisgICAqIFN0YWNrOiAgICAgICAgMyAqIFN0a0VsdCAtLT4gMyAqIFN0a0VsdAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1JPTEwoIEZUX0xvbmcqICBhcmdzICkKICAgewpAQCAtMzI2OSwxOSArMzM2NSwxOSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1BTkFHSU5HIFRIRSBGTE9XIE9GIENPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBNQU5BR0lORyBUSEUgRkxPVyBPRiBDT05UUk9MCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTTE9PUFtdOiAgICAgIFNldCBMT09QIHZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNMT09QW106ICAgICAgU2V0IExPT1AgdmFyaWFibGUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDE3CisgICAqIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NMT09QKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTMzMjMsMTIgKzM0MTksMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJRltdOiAgICAgICAgIElGIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIElGW106ICAgICAgICAgSUYgdGVzdAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NTgKKyAgICogU3RhY2s6ICAgICAgICBTdGtFbHQgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfSUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzM2NywxMiArMzQ2MywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVMU0VbXTogICAgICAgRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRUxTRVtdOiAgICAgICBFTFNFCisgICAqIE9wY29kZSByYW5nZTogMHgxQgorICAgKiBTdGFjazogICAgICAgIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0VMU0UoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC0zNDAwLDEyICszNDk2LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRUlGW106ICAgICAgICBFbmQgSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBFSUZbXTogICAgICAgIEVuZCBJRgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4NTkKKyAgICogU3RhY2s6ICAgICAgICAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19FSUYoIHZvaWQgKQogICB7CkBAIC0zNDEzLDEyICszNTA5LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSk1QUltdOiAgICAgICBKdU1QIFJlbGF0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBKTVBSW106ICAgICAgIEp1TVAgUmVsYXRpdmUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDFDCisgICAqIFN0YWNrOiAgICAgICAgaW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfSk1QUiggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTM0NDgsMTIgKzM1NDQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKUk9UW106ICAgICAgIEp1bXAgUmVsYXRpdmUgT24gVHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEpST1RbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBUcnVlCisgICAqIE9wY29kZSByYW5nZTogMHg3OAorICAgKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19KUk9UKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzQ2MywxMiArMzU1OSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpST0ZbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBGYWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSlJPRltdOiAgICAgICBKdW1wIFJlbGF0aXZlIE9uIEZhbHNlCisgICAqIE9wY29kZSByYW5nZTogMHg3OQorICAgKiBTdGFjazogICAgICAgIFN0a0VsdCBpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19KUk9GKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzQ3OCwxOSArMzU3NCwxOSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFRklOSU5HIEFORCBVU0lORyBGVU5DVElPTlMgQU5EIElOU1RSVUNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBERUZJTklORyBBTkQgVVNJTkcgRlVOQ1RJT05TIEFORCBJTlNUUlVDVElPTlMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZERUZbXTogICAgICAgRnVuY3Rpb24gREVGaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRkRFRltdOiAgICAgICBGdW5jdGlvbiBERUZpbml0aW9uCisgICAqIE9wY29kZSByYW5nZTogMHgyQworICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19GREVGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtMzYxMSw3ICszNzA3LDcgQEAKICAgICAvKiBXZSB3aWxsIHRoZW4gcGFyc2UgdGhlIGN1cnJlbnQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwogCiAgICAgcmVjICAgPSBleGMtPkZEZWZzOwotICAgIGxpbWl0ID0gcmVjICsgZXhjLT5udW1GRGVmczsKKyAgICBsaW1pdCA9IEZUX09GRlNFVCggcmVjLCBleGMtPm51bUZEZWZzICk7CiAgICAgbiAgICAgPSAoRlRfVUxvbmcpYXJnc1swXTsKIAogICAgIGZvciAoIDsgcmVjIDwgbGltaXQ7IHJlYysrICkKQEAgLTM3ODgsMTIgKzM4ODQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFTkRGW106ICAgICAgIEVORCBGdW5jdGlvbiBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEVOREZbXTogICAgICAgRU5EIEZ1bmN0aW9uIGRlZmluaXRpb24KKyAgICogT3Bjb2RlIHJhbmdlOiAweDJECisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfRU5ERiggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTM4MzcsMTIgKzM5MzMsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDQUxMW106ICAgICAgIENBTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIENBTExbXTogICAgICAgQ0FMTCBmdW5jdGlvbgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MkIKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzI/IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0NBTEwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC0zODU4LDYgKzM5NTQsOSBAQAogICAgIGlmICggQk9VTkRTTCggRiwgZXhjLT5tYXhGdW5jICsgMSApICkKICAgICAgIGdvdG8gRmFpbDsKIAorICAgIGlmICggIWV4Yy0+RkRlZnMgKQorICAgICAgZ290byBGYWlsOworCiAgICAgLyogRXhjZXB0IGZvciBzb21lIG9sZCBBcHBsZSBmb250cywgYWxsIGZ1bmN0aW9ucyBpbiBhIFRydWVUeXBlICovCiAgICAgLyogZm9udCBhcmUgZGVmaW5lZCBpbiBpbmNyZWFzaW5nIG9yZGVyLCBzdGFydGluZyBmcm9tIDAuICBUaGlzICovCiAgICAgLyogbWVhbnMgdGhhdCB3ZSBub3JtYWxseSBoYXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTI2LDEyICs0MDI1LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTE9PUENBTExbXTogICBMT09QIGFuZCBDQUxMIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMj8gRWludDE2PyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBMT09QQ0FMTFtdOiAgIExPT1AgYW5kIENBTEwgZnVuY3Rpb24KKyAgICogT3Bjb2RlIHJhbmdlOiAweDJBCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyPyBFaW50MTY/IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0xPT1BDQUxMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTM5NTUsNyArNDA1NCw3IEBACiAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgLyogSWYgdGhpcyBpc24ndCB0cnVlLCB3ZSBuZWVkIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRhYmxlLiAgICovCiAKLSAgICBkZWYgPSBleGMtPkZEZWZzICsgRjsKKyAgICBkZWYgPSBGVF9PRkZTRVQoIGV4Yy0+RkRlZnMsIEYgKTsKICAgICBpZiAoIGV4Yy0+bWF4RnVuYyArIDEgIT0gZXhjLT5udW1GRGVmcyB8fCBkZWYtPm9wYyAhPSBGICkKICAgICB7CiAgICAgICAvKiBsb29rIHVwIHRoZSBGRGVmcyB0YWJsZSAqLwpAQCAtMzk2Myw3ICs0MDYyLDcgQEAKIAogCiAgICAgICBkZWYgICA9IGV4Yy0+RkRlZnM7Ci0gICAgICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtRkRlZnM7CisgICAgICBsaW1pdCA9IEZUX09GRlNFVCggZGVmLCBleGMtPm51bUZEZWZzICk7CiAKICAgICAgIHdoaWxlICggZGVmIDwgbGltaXQgJiYgZGVmLT5vcGMgIT0gRiApCiAgICAgICAgIGRlZisrOwpAQCAtNDAxOSwxMiArNDExOCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElERUZbXTogICAgICAgSW5zdHJ1Y3Rpb24gREVGaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBFaW50OCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSURFRltdOiAgICAgICBJbnN0cnVjdGlvbiBERUZpbml0aW9uCisgICAqIE9wY29kZSByYW5nZTogMHg4OQorICAgKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0lERUYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00MDQzLDcgKzQxNDIsNyBAQAogICAgIC8qICBGaXJzdCBvZiBhbGwsIGxvb2sgZm9yIHRoZSBzYW1lIGZ1bmN0aW9uIGluIG91ciB0YWJsZSAqLwogCiAgICAgZGVmICAgPSBleGMtPklEZWZzOwotICAgIGxpbWl0ID0gZGVmICsgZXhjLT5udW1JRGVmczsKKyAgICBsaW1pdCA9IEZUX09GRlNFVCggZGVmLCBleGMtPm51bUlEZWZzICk7CiAKICAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCiAgICAgICBpZiAoIGRlZi0+b3BjID09IChGVF9VTG9uZylhcmdzWzBdICkKQEAgLTQwOTQsMTkgKzQxOTMsMTkgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNISU5HIERBVEEgT05UTyBUSEUgSU5URVJQUkVURVIgU1RBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUFVTSElORyBEQVRBIE9OVE8gVEhFIElOVEVSUFJFVEVSIFNUQUNLCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOUFVTSEJbXTogICAgIFBVU0ggTiBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IHVpbnQzMi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE5QVVNIQltdOiAgICAgUFVTSCBOIEJ5dGVzCisgICAqIE9wY29kZSByYW5nZTogMHg0MAorICAgKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIuLi4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19OUFVTSEIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQxMjksMTIgKzQyMjgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOUFVTSFdbXTogICAgIFBVU0ggTiBXb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE5QVVNIV1tdOiAgICAgUFVTSCBOIFdvcmRzCisgICAqIE9wY29kZSByYW5nZTogMHg0MQorICAgKiBTdGFjazogICAgICAgIC0tPiBpbnQzMi4uLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX05QVVNIVyggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDE2MCwxMiArNDI1OSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBVU0hCW2FiY106ICAgUFVTSCBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QjAtMHhCNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUFVTSEJbYWJjXTogICBQVVNIIEJ5dGVzCisgICAqIE9wY29kZSByYW5nZTogMHhCMC0weEI3CisgICAqIFN0YWNrOiAgICAgICAgLS0+IHVpbnQzMi4uLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1BVU0hCKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQxODYsMTIgKzQyODUsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNIV1thYmNdOiAgIFBVU0ggV29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweEI4LTB4QkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IGludDMyLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFBVU0hXW2FiY106ICAgUFVTSCBXb3JkcworICAgKiBPcGNvZGUgcmFuZ2U6IDB4QjgtMHhCRgorICAgKiBTdGFjazogICAgICAgIC0tPiBpbnQzMi4uLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1BVU0hXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQyMTYsMTEgKzQzMTUsMTEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQU5BR0lORyBUSEUgR1JBUEhJQ1MgU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTUFOQUdJTkcgVEhFIEdSQVBISUNTIFNUQVRFCisgICAqCisgICAqLwogCiAKICAgc3RhdGljIEZUX0Jvb2wKQEAgLTQyNzQsMjAgKzQzNzMsMjAgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTVlRDQVthXTogICAgIFNldCAoRiBhbmQgUCkgVmVjdG9ycyB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDAwLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1B2VENBW2FdOiAgICBTZXQgUFZlY3RvciB0byBDb29yZGluYXRlIEF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwMi0weDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGdlRDQVthXTogICAgU2V0IEZWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDQtMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1ZUQ0FbYV06ICAgICBTZXQgKEYgYW5kIFApIFZlY3RvcnMgdG8gQ29vcmRpbmF0ZSBBeGlzCisgICAqIE9wY29kZSByYW5nZTogMHgwMC0weDAxCisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqCisgICAqIFNQdlRDQVthXTogICAgU2V0IFBWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzCisgICAqIE9wY29kZSByYW5nZTogMHgwMi0weDAzCisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqCisgICAqIFNGdlRDQVthXTogICAgU2V0IEZWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzCisgICAqIE9wY29kZSByYW5nZTogMHgwNC0weDA1CisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU3h5VENBKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtNDMxOCwxMiArNDQxNywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQdlRMW2FdOiAgICAgU2V0IFBWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDYtMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1B2VExbYV06ICAgICBTZXQgUFZlY3RvciBUbyBMaW5lCisgICAqIE9wY29kZSByYW5nZTogMHgwNi0weDA3CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TUFZUTCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00MzM5LDEyICs0NDM4LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0Z2VExbYV06ICAgICBTZXQgRlZlY3RvciBUbyBMaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwOC0weDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTRnZUTFthXTogICAgIFNldCBGVmVjdG9yIFRvIExpbmUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDA4LTB4MDkKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NGVlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQzNTksMTIgKzQ0NTgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRnZUUHZbXTogICAgIFNldCBGVmVjdG9yIFRvIFBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNGdlRQdltdOiAgICAgU2V0IEZWZWN0b3IgVG8gUFZlY3RvcgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MEUKKyAgICogU3RhY2s6ICAgICAgICAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TRlZUUFYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC00MzczLDEyICs0NDcyLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1B2RlNbXTogICAgICBTZXQgUFZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTUHZGU1tdOiAgICAgIFNldCBQVmVjdG9yIEZyb20gU3RhY2sKKyAgICogT3Bjb2RlIHJhbmdlOiAweDBBCisgICAqIFN0YWNrOiAgICAgICAgZjIuMTQgZjIuMTQgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU1BWRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDQwMCwxMiArNDQ5OSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNGdkZTW106ICAgICAgU2V0IEZWZWN0b3IgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMi4xNCBmMi4xNCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU0Z2RlNbXTogICAgICBTZXQgRlZlY3RvciBGcm9tIFN0YWNrCisgICAqIE9wY29kZSByYW5nZTogMHgwQgorICAgKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NGVkZTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ0MjUsMTIgKzQ1MjQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHUHZbXTogICAgICAgIEdldCBQcm9qZWN0aW9uIFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZWYyLjE0IC0tPiBlZjIuMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEdQdltdOiAgICAgICAgR2V0IFByb2plY3Rpb24gVmVjdG9yCisgICAqIE9wY29kZSByYW5nZTogMHgwQworICAgKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfR1BWKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00NDQwLDEyICs0NTM5LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0Z2W106ICAgICAgICBHZXQgRnJlZWRvbSBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBHRnZbXTogICAgICAgIEdldCBGcmVlZG9tIFZlY3RvcgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MEQKKyAgICogU3RhY2s6ICAgICAgICBlZjIuMTQgLS0+IGVmMi4xNAorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0dGViggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDQ1NSwxMiArNDU1NCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDBbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1JQMFtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDAKKyAgICogT3Bjb2RlIHJhbmdlOiAweDEwCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NSUDAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00NDY5LDEyICs0NTY4LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JQMVtdOiAgICAgICBTZXQgUmVmZXJlbmNlIFBvaW50IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTUlAxW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MTEKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU1JQMSggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ0ODMsMTIgKzQ1ODIsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTUlAyW106ICAgICAgIFNldCBSZWZlcmVuY2UgUG9pbnQgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNSUDJbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAyCisgICAqIE9wY29kZSByYW5nZTogMHgxMgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TUlAyKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDQ5NywxMiArNDU5NiwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNNRFtdOiAgICAgICAgU2V0IE1pbmltdW0gRGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU01EW106ICAgICAgICBTZXQgTWluaW11bSBEaXN0YW5jZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MUEKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TTUQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ1MTEsMTIgKzQ2MTAsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ1ZUQ0lbXTogICAgIFNldCBDb250cm9sIFZhbHVlIFRhYmxlIEN1dCBJbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNDVlRDSVtdOiAgICAgU2V0IENvbnRyb2wgVmFsdWUgVGFibGUgQ3V0IEluCisgICAqIE9wY29kZSByYW5nZTogMHgxRAorICAgKiBTdGFjazogICAgICAgIGYyNi42IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NDVlRDSSggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDUyNSwxMiArNDYyNCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNTV0NJW106ICAgICAgU2V0IFNpbmdsZSBXaWR0aCBDdXQgSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1NXQ0lbXTogICAgICBTZXQgU2luZ2xlIFdpZHRoIEN1dCBJbgorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MUUKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TU1dDSSggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00NTM5LDEyICs0NjM4LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1NXW106ICAgICAgICBTZXQgU2luZ2xlIFdpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTU1dbXTogICAgICAgIFNldCBTaW5nbGUgV2lkdGgKKyAgICogT3Bjb2RlIHJhbmdlOiAweDFGCisgICAqIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NTVyggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDU1NCwxMiArNDY1MywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBPTltdOiAgICAgU2V0IGF1dG8tRkxJUCB0byBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRkxJUE9OW106ICAgICBTZXQgYXV0by1GTElQIHRvIE9OCisgICAqIE9wY29kZSByYW5nZTogMHg0RAorICAgKiBTdGFjazogICAgICAgIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0ZMSVBPTiggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTQ1NjcsMTIgKzQ2NjYsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGTElQT0ZGW106ICAgIFNldCBhdXRvLUZMSVAgdG8gT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEZMSVBPRkZbXTogICAgU2V0IGF1dG8tRkxJUCB0byBPRkYKKyAgICogT3Bjb2RlIHJhbmdlOiAweDRFCisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfRkxJUE9GRiggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTQ1ODAsMTIgKzQ2NzksMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQU5HV1tdOiAgICAgIFNldCBBTkdsZSBXZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNBTkdXW106ICAgICAgU2V0IEFOR2xlIFdlaWdodAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4N0UKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU0FOR1coIHZvaWQgKQogICB7CkBAIC00NTkzLDEyICs0NjkyLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RCW106ICAgICAgICBTZXQgRGVsdGEgQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTREJbXTogICAgICAgIFNldCBEZWx0YSBCYXNlCisgICAqIE9wY29kZSByYW5nZTogMHg1RQorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TREIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ2MDcsMTIgKzQ3MDYsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRFNbXTogICAgICAgIFNldCBEZWx0YSBTaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNEU1tdOiAgICAgICAgU2V0IERlbHRhIFNoaWZ0CisgICAqIE9wY29kZSByYW5nZTogMHg1RgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TRFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ2MjQsMTIgKzQ3MjMsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSVEhHW106ICAgICAgIFJvdW5kIFRvIEhhbGYgR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJUSEdbXTogICAgICAgUm91bmQgVG8gSGFsZiBHcmlkCisgICAqIE9wY29kZSByYW5nZTogMHgxOQorICAgKiBTdGFjazogICAgICAgIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1JUSEcoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC00NjM4LDEyICs0NzM3LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlRHW106ICAgICAgICBSb3VuZCBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBSVEdbXTogICAgICAgIFJvdW5kIFRvIEdyaWQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDE4CisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfUlRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtNDY1MiwxMSArNDc1MSwxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogUlRER1tdOiAgICAgICBSb3VuZCBUbyBEb3VibGUgR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKiBSVERHW106ICAgICAgIFJvdW5kIFRvIERvdWJsZSBHcmlkCisgICAqIE9wY29kZSByYW5nZTogMHgzRAorICAgKiBTdGFjazogICAgICAgIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1JUREcoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC00NjY1LDExICs0NzY0LDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiBSVVRHW106ICAgICAgIFJvdW5kIFVwIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqIFJVVEdbXTogICAgICAgUm91bmQgVXAgVG8gR3JpZAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4N0MKKyAgICogU3RhY2s6ICAgICAgICAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19SVVRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtNDY3OCwxMiArNDc3NywxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJEVEdbXTogICAgICAgUm91bmQgRG93biBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUkRUR1tdOiAgICAgICBSb3VuZCBEb3duIFRvIEdyaWQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDdECisgICAqIFN0YWNrOiAgICAgICAgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfUkRURyggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTQ2OTIsMTIgKzQ3OTEsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBST0ZGW106ICAgICAgIFJvdW5kIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJPRkZbXTogICAgICAgUm91bmQgT0ZGCisgICAqIE9wY29kZSByYW5nZTogMHg3QQorICAgKiBTdGFjazogICAgICAgIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1JPRkYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC00NzA2LDEyICs0ODA1LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JPVU5EW106ICAgICBTdXBlciBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTUk9VTkRbXTogICAgIFN1cGVyIFJPVU5ECisgICAqIE9wY29kZSByYW5nZTogMHg3NgorICAgKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNDcyMywxMiArNDgyMiwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFM0NVJPVU5EW106ICAgU3VwZXIgUk9VTkQgNDUgZGVncmVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUzQ1Uk9VTkRbXTogICBTdXBlciBST1VORCA0NSBkZWdyZWVzCisgICAqIE9wY29kZSByYW5nZTogMHg3NworICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TNDVST1VORCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00NzQwLDE1ICs0ODM5LDE1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0NbYV06ICAgICAgICBHZXQgQ29vcmRpbmF0ZSBwcm9qZWN0ZWQgb250byAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0Ni0weDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBNZWFzdXJlcyBmcm9tIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIHRha2VuICAgICAqLwotICAvKiAgICAgIGFsb25nIHRoZSBkdWFsIHByb2plY3Rpb24gdmVjdG9yISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBHQ1thXTogICAgICAgIEdldCBDb29yZGluYXRlIHByb2plY3RlZCBvbnRvCisgICAqIE9wY29kZSByYW5nZTogMHg0Ni0weDQ3CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiBmMjYuNgorICAgKgorICAgKiBYWFg6IFVORE9DVU1FTlRFRDogTWVhc3VyZXMgZnJvbSB0aGUgb3JpZ2luYWwgZ2x5cGggbXVzdCBiZSB0YWtlbgorICAgKiAgICAgIGFsb25nIHRoZSBkdWFsIHByb2plY3Rpb24gdmVjdG9yIQorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0dDKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTQ3NzcsMTYgKzQ4NzYsMTYgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ0ZTW106ICAgICAgIFNldCBDb29yZGluYXRlIEZyb20gU3RhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9ybXVsYTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9BIDo9IE9BICsgKCB2YWx1ZSAtIE9BLnAgKS8oIGYucCApICogZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTQ0ZTW106ICAgICAgIFNldCBDb29yZGluYXRlIEZyb20gU3RhY2sKKyAgICogT3Bjb2RlIHJhbmdlOiAweDQ4CisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPgorICAgKgorICAgKiBGb3JtdWxhOgorICAgKgorICAgKiAgIE9BIDo9IE9BICsgKCB2YWx1ZSAtIE9BLnAgKS8oIGYucCApICogZgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NDRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00ODE1LDIxICs0OTE0LDIxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURbYV06ICAgICAgICBNZWFzdXJlIERpc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0OS0weDRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBNZWFzdXJlIHRha2VuIGluIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIGFsb25nICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIGR1YWwgcHJvamVjdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBGbGFnIGF0dHJpYnV0ZXMgYXJlIGludmVydGVkISAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAwID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gb3JpZ2luYWwgb3V0bGluZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgMSA9PiBtZWFzdXJlIGRpc3RhbmNlIGluIGdyaWQtZml0dGVkIG91dGxpbmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBYWFg6IFVORE9DVU1FTlRFRDogYHpwMCAtIHpwMScsIGFuZCBub3QgYHpwMiAtIHpwMSEgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBNRFthXTogICAgICAgIE1lYXN1cmUgRGlzdGFuY2UKKyAgICogT3Bjb2RlIHJhbmdlOiAweDQ5LTB4NEEKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiBmMjYuNgorICAgKgorICAgKiBYWFg6IFVORE9DVU1FTlRFRDogTWVhc3VyZSB0YWtlbiBpbiB0aGUgb3JpZ2luYWwgZ2x5cGggbXVzdCBiZSBhbG9uZworICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGR1YWwgcHJvamVjdGlvbiB2ZWN0b3IuCisgICAqCisgICAqIFhYWDogVU5ET0NVTUVOVEVEOiBGbGFnIGF0dHJpYnV0ZXMgYXJlIGludmVydGVkIQorICAgKiAgICAgICAgICAgICAgICAgICAgICAwID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gb3JpZ2luYWwgb3V0bGluZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAxID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gZ3JpZC1maXR0ZWQgb3V0bGluZQorICAgKgorICAgKiBYWFg6IFVORE9DVU1FTlRFRDogYHpwMCAtIHpwMScsIGFuZCBub3QgYHpwMiAtIHpwMSEKKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19NRCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00OTAyLDEyICs1MDAxLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RQdlRMW2FdOiAgICBTZXQgRHVhbCBQVmVjdG9yIHRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4Ni0weDg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTRFB2VExbYV06ICAgIFNldCBEdWFsIFBWZWN0b3IgdG8gTGluZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4ODYtMHg4NworICAgKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU0RQVlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC00OTg1LDEyICs1MDg0LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1pQMFtdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTWlAwW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MTMKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU1pQMCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTUwMTUsMTIgKzUxMTQsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlAxW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNaUDFbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAxCisgICAqIE9wY29kZSByYW5nZTogMHgxNAorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TWlAxKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNTA0NSwxMiArNTE0NCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNaUDJbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU1pQMltdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDIKKyAgICogT3Bjb2RlIHJhbmdlOiAweDE1CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NaUDIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC01MDc1LDEyICs1MTc0LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1pQU1tdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTWlBTW106ICAgICAgIFNldCBab25lIFBvaW50ZXJTCisgICAqIE9wY29kZSByYW5nZTogMHgxNgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TWlBTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNTExMCwxMiArNTIwOSwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElOU1RDVFJMW106ICAgSU5TVHJ1Y3Rpb24gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMiBpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSU5TVENUUkxbXTogICBJTlNUcnVjdGlvbiBDb25UUm9MCisgICAqIE9wY29kZSByYW5nZTogMHg4RQorICAgKiBTdGFjazogICAgICAgIGludDMyIGludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0lOU1RDVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTUxNzIsMTIgKzUyNzEsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ0FOQ1RSTFtdOiAgIFNDQU4gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNDQU5DVFJMW106ICAgU0NBTiBDb25UUm9MCisgICAqIE9wY29kZSByYW5nZTogMHg4NQorICAgKiBTdGFjazogICAgICAgIHVpbnQzMj8gLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU0NBTkNUUkwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQpAQCAtNTIxOSwxMiArNTMxOCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDQU5UWVBFW106ICAgU0NBTiBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MTYgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogU0NBTlRZUEVbXTogICBTQ0FOIFRZUEUKKyAgICogT3Bjb2RlIHJhbmdlOiAweDhECisgICAqIFN0YWNrOiAgICAgICAgdWludDE2IC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NDQU5UWVBFKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTUyMzQsMTkgKzUzMzMsMTkgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQU5BR0lORyBPVVRMSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTUFOQUdJTkcgT1VUTElORVMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBQVFtdOiAgICAgRkxJUCBQb2luVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogRkxJUFBUW106ICAgICBGTElQIFBvaW5UCisgICAqIE9wY29kZSByYW5nZTogMHg4MAorICAgKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19GTElQUFQoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC01Mjk1LDEyICs1Mzk0LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFJHT05bXTogICBGTElQIFJhbkdlIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGTElQUkdPTltdOiAgIEZMSVAgUmFuR2UgT04KKyAgICogT3Bjb2RlIHJhbmdlOiAweDgxCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19GTElQUkdPTiggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC01MzMzLDEyICs1NDMyLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFJHT0ZGOiAgICBGTElQIFJhbkdlIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGTElQUkdPRkY6ICAgIEZMSVAgUmFuR2UgT0ZGCisgICAqIE9wY29kZSByYW5nZTogMHg4MgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfRkxJUFJHT0ZGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC01NDUwLDEyICs1NTQ5LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hQW2FdOiAgICAgICBTSGlmdCBQb2ludCBieSB0aGUgbGFzdCBwb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzMi0weDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTSFBbYV06ICAgICAgIFNIaWZ0IFBvaW50IGJ5IHRoZSBsYXN0IHBvaW50CisgICAqIE9wY29kZSByYW5nZTogMHgzMi0weDMzCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyLi4uIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX1NIUCggVFRfRXhlY0NvbnRleHQgIGV4YyApCiAgIHsKQEAgLTU1MDcsMTYgKzU2MDYsMTYgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTSENbYV06ICAgICAgIFNIaWZ0IENvbnRvdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM0LTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVU5ET0NVTUVOVEVEOiBBY2NvcmRpbmcgdG8gR3JlZyBIaXRjaGNvY2ssIHRoZXJlIGlzIG9uZSAodmlydHVhbCkgICAgICovCi0gIC8qICAgICAgICAgICAgICAgY29udG91ciBpbiB0aGUgdHdpbGlnaHQgem9uZSwgbmFtZWx5IGNvbnRvdXIgbnVtYmVyICAgICAqLwotICAvKiAgICAgICAgICAgICAgIHplcm8gd2hpY2ggaW5jbHVkZXMgYWxsIHBvaW50cyBvZiBpdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTSENbYV06ICAgICAgIFNIaWZ0IENvbnRvdXIKKyAgICogT3Bjb2RlIHJhbmdlOiAweDM0LTM1CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPgorICAgKgorICAgKiBVTkRPQ1VNRU5URUQ6IEFjY29yZGluZyB0byBHcmVnIEhpdGNoY29jaywgdGhlcmUgaXMgb25lICh2aXJ0dWFsKQorICAgKiAgICAgICAgICAgICAgIGNvbnRvdXIgaW4gdGhlIHR3aWxpZ2h0IHpvbmUsIG5hbWVseSBjb250b3VyIG51bWJlcgorICAgKiAgICAgICAgICAgICAgIHplcm8gd2hpY2ggaW5jbHVkZXMgYWxsIHBvaW50cyBvZiBpdC4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19TSEMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTU1NjMsMTIgKzU2NjIsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTSFpbYV06ICAgICAgIFNIaWZ0IFpvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM2LTM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNIWlthXTogICAgICAgU0hpZnQgWm9uZQorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MzYtMzcKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU0haKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC01NjExLDIxICs1NzEwLDE4IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hQSVhbXTogICAgICBTSGlmdCBwb2ludHMgYnkgYSBQSVhlbCBhbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTSFBJWFtdOiAgICAgIFNIaWZ0IHBvaW50cyBieSBhIFBJWGVsIGFtb3VudAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MzgKKyAgICogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIuLi4gLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfU0hQSVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfRjI2RG90NiAgZHgsIGR5OwogICAgIEZUX1VTaG9ydCAgIHBvaW50OwotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgRlRfSW50ICAgICAgQjEsIEIyOwotI2VuZGlmCiAjaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX01JTklNQUwKICAgICBGVF9Cb29sICAgICBpbl90d2lsaWdodCA9IEZUX0JPT0woIGV4Yy0+R1MuZ2VwMCA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmdlcDEgPT0gMCB8fApAQCAtNTY2MCw4ICs1NzU2LDEyIEBACiAgICAgICB9CiAgICAgICBlbHNlCiAjaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKKyAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCisgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICApCiAgICAgICB7CisgICAgICAgIEZUX0ludCAgQjEsIEIyOworCisKICAgICAgICAgLyogIElmIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIG1vdmUuICAgICAgICAqLwogICAgICAgICAvKiAgSWYgaW5saW5lIGRlbHRhcyBhcmVuJ3QgYWxsb3dlZCwgc2tpcCBaUDIgbW92ZS4gICAgICAgICAgICAgICovCiAgICAgICAgIC8qICBJZiB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywgYWxsb3cgWlAyIHBvaW50IG1vdmUgaWY6ICAgKi8KQEAgLTU2NzAsNzIgKzU3NzAsNTcgQEAKICAgICAgICAgLyogICAtIHRoZSBnbHlwaCBpcyBzcGVjaWZpY2FsbHkgc2V0IHRvIGFsbG93IFNIUElYIG1vdmVzICAgICAgICAqLwogICAgICAgICAvKiAgIC0gdGhlIG1vdmUgaXMgb24gYSBwcmV2aW91c2x5IFktdG91Y2hlZCBwb2ludCAgICAgICAgICAgICAgICovCiAKLSAgICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgKQorICAgICAgICAvKiBzYXZlIHBvaW50IGZvciBsYXRlciBjb21wYXJpc29uICovCisgICAgICAgIEIxID0gZXhjLT56cDIuY3VyW3BvaW50XS55OworCisgICAgICAgIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICkKICAgICAgICAgewotICAgICAgICAgIC8qIHNhdmUgcG9pbnQgZm9yIGxhdGVyIGNvbXBhcmlzb24gKi8KKyAgICAgICAgICBpZiAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgKQorICAgICAgICAgICAgZHkgPSBGVF9QSVhfUk9VTkQoIEIxICsgZHkgKSAtIEIxOworCisgICAgICAgICAgLyogc2tpcCBwb3N0LWl1cCBkZWx0YXMgKi8KKyAgICAgICAgICBpZiAoIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAoICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICkgfHwKKyAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzIgKSApICkKKyAgICAgICAgICAgIGdvdG8gU2tpcDsKKworICAgICAgICAgIGlmICggISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX1NLSVBfREVMVEFQICkgJiYKKyAgICAgICAgICAgICAgICAoICggZXhjLT5pc19jb21wb3NpdGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApIHx8CisgICAgICAgICAgICAgICAgICAoIGV4Yy0+enAyLnRhZ3NbcG9pbnRdICYgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKSAgICB8fAorICAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ET19TSFBJWCApICAgICAgKSAgKQorICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIDAsIGR5LCBUUlVFICk7CisKKyAgICAgICAgICAvKiBzYXZlIG5ldyBwb2ludCAqLwogICAgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCi0gICAgICAgICAgICBCMSA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBCMSA9IGV4Yy0+enAyLmN1cltwb2ludF0ueDsKLQotICAgICAgICAgIGlmICggIWV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAmJgotICAgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICApCiAgICAgICAgICAgewotICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIGR4LCBkeSwgVFJVRSApOworICAgICAgICAgICAgQjIgPSBleGMtPnpwMi5jdXJbcG9pbnRdLnk7CiAKLSAgICAgICAgICAgIC8qIHNhdmUgbmV3IHBvaW50ICovCi0gICAgICAgICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCMiA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKLQotICAgICAgICAgICAgICAvKiByZXZlcnNlIGFueSBkaXNhbGxvd2VkIG1vdmVzICovCi0gICAgICAgICAgICAgIGlmICggKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVMgKSAmJgotICAgICAgICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgQjEgIT0gQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FR19MT05HKCBkeCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORUdfTE9ORyggZHkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmV2ZXJzZSBhbnkgZGlzYWxsb3dlZCBtb3ZlcyAqLworICAgICAgICAgICAgaWYgKCAoIEIxICYgNjMgKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgQjEgIT0gQjIgICAgICAgICApCisgICAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCBORUdfTE9ORyggZHkgKSwgVFJVRSApOwogICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkeCA9IEZUX1BJWF9ST1VORCggQjEgKyBkeCApIC0gQjE7Ci0gICAgICAgICAgICAgIGR5ID0gRlRfUElYX1JPVU5EKCBCMSArIGR5ICkgLSBCMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogc2tpcCBwb3N0LWl1cCBkZWx0YXMgKi8KLSAgICAgICAgICAgIGlmICggZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgKCAoIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgJiBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMSApIHx8Ci0gICAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzIgKSApICkKLSAgICAgICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICAgICAgICBpZiAoICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCApICYmCi0gICAgICAgICAgICAgICAgICAoICggZXhjLT5pc19jb21wb3NpdGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApIHx8Ci0gICAgICAgICAgICAgICAgICAgICggZXhjLT56cDIudGFnc1twb2ludF0gJiBGVF9DVVJWRV9UQUdfVE9VQ0hfWSApICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfRE9fU0hQSVggKSAgICAgICkgICkKLSAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIDAsIGR5LCBUUlVFICk7Ci0KLSAgICAgICAgICAgIC8qIHNhdmUgbmV3IHBvaW50ICovCi0gICAgICAgICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCMiA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKLQotICAgICAgICAgICAgICAvKiByZXZlcnNlIGFueSBkaXNhbGxvd2VkIG1vdmVzICovCi0gICAgICAgICAgICAgIGlmICggKCBCMSAmIDYzICkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICBCMSAhPSBCMiAgICAgICAgICkKLSAgICAgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgMCwgTkVHX0xPTkcoIGR5ICksIFRSVUUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgJiBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMICkKLSAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKICAgICAgICAgfQotICAgICAgICBlbHNlCisgICAgICAgIGVsc2UgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKKworICAgICAgICAgIC8qIHNhdmUgbmV3IHBvaW50ICovCisgICAgICAgICAgQjIgPSBleGMtPnpwMi5jdXJbcG9pbnRdLnk7CisKKyAgICAgICAgICAvKiByZXZlcnNlIGFueSBkaXNhbGxvd2VkIG1vdmVzICovCisgICAgICAgICAgaWYgKCAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCisgICAgICAgICAgICAgICAoIEIxICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICBCMSAhPSBCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVHX0xPTkcoIGR4ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVHX0xPTkcoIGR5ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzICYgU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTCApCiAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIGR4LCBkeSwgVFJVRSApOwogICAgICAgfQogICAgICAgZWxzZQpAQCAtNTc3MSwzNCArNTg1NiwyMCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1TSVJQW2FdOiAgICAgTW92ZSBTdGFjayBJbmRpcmVjdCBSZWxhdGl2ZSBQb3NpdGlvbiAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0EtMHgzQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTVNJUlBbYV06ICAgICBNb3ZlIFN0YWNrIEluZGlyZWN0IFJlbGF0aXZlIFBvc2l0aW9uCisgICAqIE9wY29kZSByYW5nZTogMHgzQS0weDNCCisgICAqIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX01TSVJQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKICAgewogICAgIEZUX1VTaG9ydCAgIHBvaW50ID0gMDsKICAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIEZUX0YyNkRvdDYgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSAwOwotICAgIEZUX0YyNkRvdDYgIGRlbHRhOwogCiAKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSApCi0gICAgewotICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbjsKLQotICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSAwOwotICAgIH0KLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwotCiAgICAgcG9pbnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAKICAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICAgIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKQEAgLTU4MjEsMTYgKzU4OTIsMjUgQEAKICAgICBkaXN0YW5jZSA9IFBST0pFQ1QoIGV4Yy0+enAxLmN1ciArIHBvaW50LCBleGMtPnpwMC5jdXIgKyBleGMtPkdTLnJwMCApOwogCiAjaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBkZWx0YSA9IFNVQl9MT05HKCBkaXN0YW5jZSwgYXJnc1sxXSApOwotICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgIGRlbHRhID0gTkVHX0xPTkcoIGRlbHRhICk7Ci0KICAgICAvKiBzdWJwaXhlbCBoaW50aW5nIC0gbWFrZSBNU0lSUCByZXNwZWN0IENWVCBjdXQtaW47ICovCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICYmCi0gICAgICAgICBkZWx0YSA+PSBjb250cm9sX3ZhbHVlX2N1dGluICkKLSAgICAgIGRpc3RhbmNlID0gYXJnc1sxXTsKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICYmCisgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgKQorICAgIHsKKyAgICAgIEZUX0YyNkRvdDYgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47CisgICAgICBGVF9GMjZEb3Q2ICBkZWx0YTsKKworCisgICAgICBpZiAoICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX05PUk1BTF9ST1VORCApICkKKyAgICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IDA7CisKKyAgICAgIGRlbHRhID0gU1VCX0xPTkcoIGRpc3RhbmNlLCBhcmdzWzFdICk7CisgICAgICBpZiAoIGRlbHRhIDwgMCApCisgICAgICAgIGRlbHRhID0gTkVHX0xPTkcoIGRlbHRhICk7CisKKyAgICAgIGlmICggZGVsdGEgPj0gY29udHJvbF92YWx1ZV9jdXRpbiApCisgICAgICAgIGRpc3RhbmNlID0gYXJnc1sxXTsKKyAgICB9CiAjZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KIAogICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsCkBAIC01ODQ2LDEyICs1OTI2LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURBUFthXTogICAgICBNb3ZlIERpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyRS0weDJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBNREFQW2FdOiAgICAgIE1vdmUgRGlyZWN0IEFic29sdXRlIFBvaW50CisgICAqIE9wY29kZSByYW5nZTogMHgyRS0weDJGCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX01EQVAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC01ODc3LDE4ICs1OTU3LDEwIEBACiAgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgogICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgJiYKICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICkKLSAgICAgICAgZGlzdGFuY2UgPSBTVUJfTE9ORygKLSAgICAgICAgICAgICAgICAgICAgIFJvdW5kX05vbmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbMF0gKSwKLSAgICAgICAgICAgICAgICAgICAgIGN1cl9kaXN0ICk7CisgICAgICAgIGRpc3RhbmNlID0gU1VCX0xPTkcoIFJvdW5kX05vbmUoIGV4YywgY3VyX2Rpc3QsIDMgKSwgY3VyX2Rpc3QgKTsKICAgICAgIGVsc2UKICNlbmRpZgotICAgICAgICBkaXN0YW5jZSA9IFNVQl9MT05HKAotICAgICAgICAgICAgICAgICAgICAgZXhjLT5mdW5jX3JvdW5kKCBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApLAotICAgICAgICAgICAgICAgICAgICAgY3VyX2Rpc3QgKTsKKyAgICAgICAgZGlzdGFuY2UgPSBTVUJfTE9ORyggZXhjLT5mdW5jX3JvdW5kKCBleGMsIGN1cl9kaXN0LCAzICksIGN1cl9kaXN0ICk7CiAgICAgfQogICAgIGVsc2UKICAgICAgIGRpc3RhbmNlID0gMDsKQEAgLTU5MDAsMTIgKzU5NzIsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSUFQW2FdOiAgICAgIE1vdmUgSW5kaXJlY3QgQWJzb2x1dGUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDNFLTB4M0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1JQVBbYV06ICAgICAgTW92ZSBJbmRpcmVjdCBBYnNvbHV0ZSBQb2ludAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4M0UtMHgzRgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTUlBUCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTU5MTQsMjEgKzU5ODYsMTAgQEAKICAgICBGVF9VU2hvcnQgICBwb2ludDsKICAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKICAgICBGVF9GMjZEb3Q2ICBvcmdfZGlzdDsKLSAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluOwogCiAKLSAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluOwotICAgIGN2dEVudHJ5ICAgICAgICAgICAgPSAoRlRfVUxvbmcpYXJnc1sxXTsKLSAgICBwb2ludCAgICAgICAgICAgICAgID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsKLSNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLworICAgIGN2dEVudHJ5ID0gKEZUX1VMb25nKWFyZ3NbMV07CisgICAgcG9pbnQgICAgPSAoRlRfVVNob3J0KWFyZ3NbMF07CiAKICAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICBleGMtPnpwMC5uX3BvaW50cyApIHx8CiAgICAgICAgICBCT1VORFNMKCBjdnRFbnRyeSwgZXhjLT5jdnRTaXplICkgICAgICApCkBAIC01OTcyLDcgKzYwMzMsNyBAQAogICAgICAgICBleGMtPnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggZGlzdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApOwogICAgICAgZXhjLT56cDAub3JnW3BvaW50XS55ID0gVFRfTXVsRml4MTQoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgKTsKICAgICAgIGV4Yy0+enAwLmN1cltwb2ludF0gICA9IGV4Yy0+enAwLm9yZ1twb2ludF07CiAgICAgfQogI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCkBAIC01OTg4LDkgKzYwNDksMTkgQEAKIAogICAgIGlmICggKCBleGMtPm9wY29kZSAmIDEgKSAhPSAwICkgICAvKiByb3VuZGluZyBhbmQgY29udHJvbCBjdXQtaW4gZmxhZyAqLwogICAgIHsKKyAgICAgIEZUX0YyNkRvdDYgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW47CiAgICAgICBGVF9GMjZEb3Q2ICBkZWx0YTsKIAogCisjaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKKyAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQorICAgICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsKKyNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLworCiAgICAgICBkZWx0YSA9IFNVQl9MT05HKCBkaXN0YW5jZSwgb3JnX2Rpc3QgKTsKICAgICAgIGlmICggZGVsdGEgPCAwICkKICAgICAgICAgZGVsdGEgPSBORUdfTE9ORyggZGVsdGEgKTsKQEAgLTYwMDIsMTQgKzYwNzMsMTAgQEAKICAgICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCiAgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAmJgogICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgKQotICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOworICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoIGV4YywgZGlzdGFuY2UsIDMgKTsKICAgICAgIGVsc2UKICNlbmRpZgotICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCggZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOworICAgICAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yb3VuZCggZXhjLCBkaXN0YW5jZSwgMyApOwogICAgIH0KIAogICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgcG9pbnQsIFNVQl9MT05HKCBkaXN0YW5jZSwgb3JnX2Rpc3QgKSApOwpAQCAtNjAyMCwzMCArNjA4NywyMCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1EUlBbYWJjZGVdOiAgTW92ZSBEaXJlY3QgUmVsYXRpdmUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QzAtMHhERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTURSUFthYmNkZV06ICBNb3ZlIERpcmVjdCBSZWxhdGl2ZSBQb2ludAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4QzAtMHhERgorICAgKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19NRFJQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQogICB7CiAgICAgRlRfVVNob3J0ICAgcG9pbnQgPSAwOwotICAgIEZUX0YyNkRvdDYgIG9yZ19kaXN0LCBkaXN0YW5jZSwgbWluaW11bV9kaXN0YW5jZTsKKyAgICBGVF9GMjZEb3Q2ICBvcmdfZGlzdCwgZGlzdGFuY2U7CiAKIAotICAgIG1pbmltdW1fZGlzdGFuY2UgPSBleGMtPkdTLm1pbmltdW1fZGlzdGFuY2U7Ci0KLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQotICAgICAgbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KLQogICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwogCiAgICAgaWYgKCBCT1VORFMoIHBvaW50LCAgICAgICBleGMtPnpwMS5uX3BvaW50cyApIHx8CkBAIC02MTE2LDI3ICs2MTczLDI5IEBACiAgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgogICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgJiYKICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICkKLSAgICAgICAgZGlzdGFuY2UgPSBSb3VuZF9Ob25lKAotICAgICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAmIDNdICk7CisgICAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSggZXhjLCBvcmdfZGlzdCwgZXhjLT5vcGNvZGUgJiAzICk7CiAgICAgICBlbHNlCiAjZW5kaWYKLSAgICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgICBvcmdfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKKyAgICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoIGV4Yywgb3JnX2Rpc3QsIGV4Yy0+b3Bjb2RlICYgMyApOwogICAgIH0KICAgICBlbHNlCi0gICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKKyAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSggZXhjLCBvcmdfZGlzdCwgZXhjLT5vcGNvZGUgJiAzICk7CiAKICAgICAvKiBtaW5pbXVtIGRpc3RhbmNlIGZsYWcgKi8KIAogICAgIGlmICggKCBleGMtPm9wY29kZSAmIDggKSAhPSAwICkKICAgICB7CisgICAgICBGVF9GMjZEb3Q2ICBtaW5pbXVtX2Rpc3RhbmNlID0gZXhjLT5HUy5taW5pbXVtX2Rpc3RhbmNlOworCisKKyNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQorICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgICAgIG1pbmltdW1fZGlzdGFuY2UgPSAwOworI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCisKICAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCiAgICAgICB7CiAgICAgICAgIGlmICggZGlzdGFuY2UgPCBtaW5pbXVtX2Rpc3RhbmNlICkKQEAgLTYxNjQsMTIgKzYyMjMsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSVJQW2FiY2RlXTogIE1vdmUgSW5kaXJlY3QgUmVsYXRpdmUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweEUwLTB4RkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1JUlBbYWJjZGVdOiAgTW92ZSBJbmRpcmVjdCBSZWxhdGl2ZSBQb2ludAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4RTAtMHhGRgorICAgKiBTdGFjazogICAgICAgIGludDMyPyB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfTUlSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTYxODAsMjggKzYyMzksMTMgQEAKICAgICBGVF9GMjZEb3Q2ICBjdnRfZGlzdCwKICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKICAgICAgICAgICAgICAgICBjdXJfZGlzdCwKLSAgICAgICAgICAgICAgICBvcmdfZGlzdCwKLSAgICAgICAgICAgICAgICBjb250cm9sX3ZhbHVlX2N1dGluLAotICAgICAgICAgICAgICAgIG1pbmltdW1fZGlzdGFuY2U7Ci0jaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKLSAgICBGVF9JbnQgICAgICBCMSAgICAgICAgICAgPSAwOyAvKiBwYWNpZnkgY29tcGlsZXIgKi8KLSAgICBGVF9JbnQgICAgICBCMiAgICAgICAgICAgPSAwOwotICAgIEZUX0Jvb2wgICAgIHJldmVyc2VfbW92ZSA9IEZBTFNFOwotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCisgICAgICAgICAgICAgICAgb3JnX2Rpc3Q7CisKKyAgICBGVF9GMjZEb3Q2ICBkZWx0YTsKIAogCi0gICAgbWluaW11bV9kaXN0YW5jZSAgICA9IGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZTsKLSAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluOwotICAgIHBvaW50ICAgICAgICAgICAgICAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgY3Z0RW50cnkgICAgICAgICAgICA9IChGVF9VTG9uZykoIEFERF9MT05HKCBhcmdzWzFdLCAxICkgKTsKLQotI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KKyAgICBwb2ludCAgICA9IChGVF9VU2hvcnQpYXJnc1swXTsKKyAgICBjdnRFbnRyeSA9IChGVF9VTG9uZykoIEFERF9MT05HKCBhcmdzWzFdLCAxICkgKTsKIAogICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBjdnRbLTFdID0gMCBhbHdheXMgKi8KIApAQCAtNjIyMSw4ICs2MjY1LDExIEBACiAKICAgICAvKiBzaW5nbGUgd2lkdGggdGVzdCAqLwogCi0gICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gZXhjLT5HUy5zaW5nbGVfd2lkdGhfdmFsdWUgKSA8Ci0gICAgICAgICBleGMtPkdTLnNpbmdsZV93aWR0aF9jdXRpbiApCisgICAgZGVsdGEgPSBTVUJfTE9ORyggY3Z0X2Rpc3QsIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlICk7CisgICAgaWYgKCBkZWx0YSA8IDAgKQorICAgICAgZGVsdGEgPSBORUdfTE9ORyggZGVsdGEgKTsKKworICAgIGlmICggZGVsdGEgPCBleGMtPkdTLnNpbmdsZV93aWR0aF9jdXRpbiApCiAgICAgewogICAgICAgaWYgKCBjdnRfZGlzdCA+PSAwICkKICAgICAgICAgY3Z0X2Rpc3QgPSAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7CkBAIC02MjM0LDEyICs2MjgxLDE0IEBACiAgICAgLyogdHdpbGlnaHQgcG9pbnRzIChjb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2spICAgKi8KICAgICBpZiAoIGV4Yy0+R1MuZ2VwMSA9PSAwICkKICAgICB7Ci0gICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnggPSBleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdLnggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTXVsRml4MTQoIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICk7Ci0gICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnkgPSBleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdLnkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfTXVsRml4MTQoIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICk7CisgICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnggPSBBRERfTE9ORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAub3JnW2V4Yy0+R1MucnAwXS54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NdWxGaXgxNCggY3Z0X2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApICk7CisgICAgICBleGMtPnpwMS5vcmdbcG9pbnRdLnkgPSBBRERfTE9ORygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAub3JnW2V4Yy0+R1MucnAwXS55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NdWxGaXgxNCggY3Z0X2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSApICk7CiAgICAgICBleGMtPnpwMS5jdXJbcG9pbnRdICAgPSBleGMtPnpwMS5vcmdbcG9pbnRdOwogICAgIH0KIApAQCAtNjI1MSwyMiArNjMwMCw5IEBACiAgICAgaWYgKCBleGMtPkdTLmF1dG9fZmxpcCApCiAgICAgewogICAgICAgaWYgKCAoIG9yZ19kaXN0IF4gY3Z0X2Rpc3QgKSA8IDAgKQotICAgICAgICBjdnRfZGlzdCA9IC1jdnRfZGlzdDsKKyAgICAgICAgY3Z0X2Rpc3QgPSBORUdfTE9ORyggY3Z0X2Rpc3QgKTsKICAgICB9CiAKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19USU1FU19ORVdfUk9NQU5fSEFDSyApICkKLSAgICB7Ci0gICAgICBpZiAoIGN1cl9kaXN0IDwgLTY0ICkKLSAgICAgICAgY3Z0X2Rpc3QgLT0gMTY7Ci0gICAgICBlbHNlIGlmICggY3VyX2Rpc3QgPiA2NCAmJiBjdXJfZGlzdCA8IDg0ICkKLSAgICAgICAgY3Z0X2Rpc3QgKz0gMzI7Ci0gICAgfQotI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCi0KICAgICAvKiBjb250cm9sIHZhbHVlIGN1dC1pbiBhbmQgcm91bmQgKi8KIAogICAgIGlmICggKCBleGMtPm9wY29kZSAmIDQgKSAhPSAwICkKQEAgLTYyNzYsNyArNjMxMiw3IEBACiAKICAgICAgIGlmICggZXhjLT5HUy5nZXAwID09IGV4Yy0+R1MuZ2VwMSApCiAgICAgICB7Ci0gICAgICAgIEZUX0YyNkRvdDYgIGRlbHRhOworICAgICAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluID0gZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluOwogCiAKICAgICAgICAgLyogWFhYOiBBY2NvcmRpbmcgdG8gR3JlZyBIaXRjaGNvY2ssIHRoZSBmb2xsb3dpbmcgd29yZGluZyBpcyAqLwpAQCAtNjI5OSwxMCArNjMzNSw3IEBACiAgICAgICAgICAgY3Z0X2Rpc3QgPSBvcmdfZGlzdDsKICAgICAgIH0KIAotICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoCi0gICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKKyAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKCBleGMsIGN2dF9kaXN0LCBleGMtPm9wY29kZSAmIDMgKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKQEAgLTYzMTMsOSArNjM0NiwyMiBAQAogICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICYmCiAgICAgICAgICAgIGV4Yy0+R1MuZ2VwMCA9PSBleGMtPkdTLmdlcDEgKQogICAgICAgewotICAgICAgICBGVF9GMjZEb3Q2ICBkZWx0YTsKKyAgICAgICAgRlRfRjI2RG90NiAgY29udHJvbF92YWx1ZV9jdXRpbiA9IGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbjsKIAogCisgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IDA7CisKKyAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgICAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1RJTUVTX05FV19ST01BTl9IQUNLICkgKQorICAgICAgICB7CisgICAgICAgICAgaWYgKCBjdXJfZGlzdCA8IC02NCApCisgICAgICAgICAgICBjdnRfZGlzdCAtPSAxNjsKKyAgICAgICAgICBlbHNlIGlmICggY3VyX2Rpc3QgPiA2NCAmJiBjdXJfZGlzdCA8IDg0ICkKKyAgICAgICAgICAgIGN2dF9kaXN0ICs9IDMyOworICAgICAgICB9CisKICAgICAgICAgZGVsdGEgPSBTVUJfTE9ORyggY3Z0X2Rpc3QsIG9yZ19kaXN0ICk7CiAgICAgICAgIGlmICggZGVsdGEgPCAwICkKICAgICAgICAgICBkZWx0YSA9IE5FR19MT05HKCBkZWx0YSApOwpAQCAtNjMyNSwxNiArNjM3MSwyNCBAQAogICAgICAgfQogI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCiAKLSAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSgKLSAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOworICAgICAgZGlzdGFuY2UgPSBSb3VuZF9Ob25lKCBleGMsIGN2dF9kaXN0LCBleGMtPm9wY29kZSAmIDMgKTsKICAgICB9CiAKICAgICAvKiBtaW5pbXVtIGRpc3RhbmNlIHRlc3QgKi8KIAogICAgIGlmICggKCBleGMtPm9wY29kZSAmIDggKSAhPSAwICkKICAgICB7CisgICAgICBGVF9GMjZEb3Q2ICBtaW5pbXVtX2Rpc3RhbmNlICAgID0gZXhjLT5HUy5taW5pbXVtX2Rpc3RhbmNlOworCisKKyNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQorICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCisgICAgICAgIG1pbmltdW1fZGlzdGFuY2UgPSAwOworI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCisKICAgICAgIGlmICggb3JnX2Rpc3QgPj0gMCApCiAgICAgICB7CiAgICAgICAgIGlmICggZGlzdGFuY2UgPCBtaW5pbXVtX2Rpc3RhbmNlICkKQEAgLTYzNDgsNjAgKzY0MDIsNTEgQEAKICAgICB9CiAKICNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKKyAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAmJgorICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICYmCisgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgKQogICAgIHsKKyAgICAgIEZUX0ludCAgIEIxLCBCMjsKKworCiAgICAgICBCMSA9IGV4Yy0+enAxLmN1cltwb2ludF0ueTsKIAogICAgICAgLyogUm91bmQgbW92ZXMgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApICkKKyAgICAgIGlmICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApCiAgICAgICAgIGRpc3RhbmNlID0gRlRfUElYX1JPVU5EKCBCMSArIGRpc3RhbmNlIC0gY3VyX2Rpc3QgKSAtIEIxICsgY3VyX2Rpc3Q7CiAKLSAgICAgIGlmICggZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggZXhjLT5vcGNvZGUgJiAxNiApID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgIGlmICggKCBleGMtPm9wY29kZSAmIDE2ICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAoIGV4Yy0+b3Bjb2RlICYgOCApID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQ09VUklFUl9ORVdfMl9IQUNLICkgKQogICAgICAgICBkaXN0YW5jZSArPSA2NDsKLSAgICB9Ci0jZW5kaWYgLyogVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkgKi8KIAotICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsCi0gICAgICAgICAgICAgICAgICAgICZleGMtPnpwMSwKLSAgICAgICAgICAgICAgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCBkaXN0YW5jZSwgY3VyX2Rpc3QgKSApOworICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywKKyAgICAgICAgICAgICAgICAgICAgICAmZXhjLT56cDEsCisgICAgICAgICAgICAgICAgICAgICAgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgU1VCX0xPTkcoIGRpc3RhbmNlLCBjdXJfZGlzdCApICk7CiAKLSNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKLSAgICB7CiAgICAgICBCMiA9IGV4Yy0+enAxLmN1cltwb2ludF0ueTsKIAogICAgICAgLyogUmV2ZXJzZSBtb3ZlIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAmJgotICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAmJgorICAgICAgaWYgKCAoIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAmJgogICAgICAgICAgICAgICggQjEgJiA2MyApID09IDAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgcmV2ZXJzZV9tb3ZlID0gVFJVRTsKLQotICAgICAgICBpZiAoICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfU0tJUF9OT05QSVhFTF9ZX01PVkVTICkgJiYKLSAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIHJldmVyc2VfbW92ZSA9IFRSVUU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcmV2ZXJzZV9tb3ZlICkKKyAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgKCAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyApICYmCisgICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgorICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAmZXhjLT56cDEsCiAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNVQl9MT05HKCBjdXJfZGlzdCwgZGlzdGFuY2UgKSApOwogICAgIH0KLQorICAgIGVsc2UKICNlbmRpZiAvKiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAqLwogCisgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLAorICAgICAgICAgICAgICAgICAgICAgICZleGMtPnpwMSwKKyAgICAgICAgICAgICAgICAgICAgICBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICBTVUJfTE9ORyggZGlzdGFuY2UsIGN1cl9kaXN0ICkgKTsKKwogICBGYWlsOgogICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7CiAKQEAgLTY0MTIsMTIgKzY0NTcsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBTElHTlJQW106ICAgIEFMSUdOIFJlbGF0aXZlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEFMSUdOUlBbXTogICAgQUxJR04gUmVsYXRpdmUgUG9pbnQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDNDCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMi4uLiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19BTElHTlJQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewpAQCAtNjQ3NSwxMiArNjUyMCwxMiBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElTRUNUW106ICAgICAgbW92ZXMgcG9pbnQgdG8gSW50ZXJTRUNUaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICA1ICogdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogSVNFQ1RbXTogICAgICBtb3ZlcyBwb2ludCB0byBJbnRlclNFQ1Rpb24KKyAgICogT3Bjb2RlIHJhbmdlOiAweDBGCisgICAqIFN0YWNrOiAgICAgICAgNSAqIHVpbnQzMiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19JU0VDVCggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC02NTcxLDEyICs2NjE2LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUxJR05QVFNbXTogICBBTElHTiBQb2luVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBBTElHTlBUU1tdOiAgIEFMSUdOIFBvaW5UUworICAgKiBPcGNvZGUgcmFuZ2U6IDB4MjcKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgSW5zX0FMSUdOUFRTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTY2MDMsMTIgKzY2NDgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJUFtdOiAgICAgICAgIEludGVycG9sYXRlIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyLi4uIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIElQW106ICAgICAgICAgSW50ZXJwb2xhdGUgUG9pbnQKKyAgICogT3Bjb2RlIHJhbmdlOiAweDM5CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyLi4uIC0tPgorICAgKi8KIAogICAvKiBTT01FVElNRVMsIERVTUJFUiBDT0RFIElTIEJFVFRFUiBDT0RFICovCiAKQEAgLTY3NjMsMTIgKzY4MDgsMTIgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVVFBbYV06ICAgICAgIFVuVG91Y2ggUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFVUUFthXTogICAgICAgVW5Ub3VjaCBQb2ludAorICAgKiBPcGNvZGUgcmFuZ2U6IDB4MjkKKyAgICogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+CisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfVVRQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCkBAIC02OTMyLDEyICs2OTc3LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSVVQW2FdOiAgICAgICBJbnRlcnBvbGF0ZSBVbnRvdWNoZWQgUG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzMC0weDMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJVVBbYV06ICAgICAgIEludGVycG9sYXRlIFVudG91Y2hlZCBQb2ludHMKKyAgICogT3Bjb2RlIHJhbmdlOiAweDMwLTB4MzEKKyAgICogU3RhY2s6ICAgICAgICAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19JVVAoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQogICB7CkBAIC03MDYwLDEyICs3MTA1LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVMVEFQbltdOiAgICBERUxUQSBleGNlcHRpb25zIFAxLCBQMiwgUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1RCwweDcxLDB4NzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAoMiAqIHVpbnQzMikuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBERUxUQVBuW106ICAgIERFTFRBIGV4Y2VwdGlvbnMgUDEsIFAyLCBQMworICAgKiBPcGNvZGUgcmFuZ2U6IDB4NUQsMHg3MSwweDcyCisgICAqIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ERUxUQVAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTcwNzQsMTAgKzcxMTksOSBAQAogICAgIEZUX1VTaG9ydCAgQTsKICAgICBGVF9VTG9uZyAgIEMsIFA7CiAgICAgRlRfTG9uZyAgICBCOworCisKICNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQotICAgIEZUX1VTaG9ydCAgQjEsIEIyOwotCi0KICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKQEAgLTcxNDIsMTIgKzcxODYsMTIgQEAKICAgICAgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWSApCiAgICAgICAgICAgewogICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBBbGxvdyBkZWx0YSBtb3ZlIGlmCisgICAgICAgICAgICAgKiBBbGxvdyBkZWx0YSBtb3ZlIGlmCiAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICogIC0gbm90IHVzaW5nIGlnbm9yZV94X21vZGUgcmVuZGVyaW5nLAotICAgICAgICAgICAgICogIC0gZ2x5cGggaXMgc3BlY2lmaWNhbGx5IHNldCB0byBhbGxvdyBpdCwgb3IKLSAgICAgICAgICAgICAqICAtIGdseXBoIGlzIGNvbXBvc2l0ZSBhbmQgZnJlZWRvbSB2ZWN0b3IgaXMgbm90IGluIHN1YnBpeGVsCi0gICAgICAgICAgICAgKiAgICBkaXJlY3Rpb24uCisgICAgICAgICAgICAgKiAtIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywKKyAgICAgICAgICAgICAqIC0gZ2x5cGggaXMgc3BlY2lmaWNhbGx5IHNldCB0byBhbGxvdyBpdCwgb3IKKyAgICAgICAgICAgICAqIC0gZ2x5cGggaXMgY29tcG9zaXRlIGFuZCBmcmVlZG9tIHZlY3RvciBpcyBub3QgaW4gc3VicGl4ZWwKKyAgICAgICAgICAgICAqICAgZGlyZWN0aW9uLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoICFleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX0RPX0RFTFRBUCApIHx8CkBAIC03MTU4LDYgKzcyMDIsOSBAQAogICAgICAgICAgICAgLyogcnVsZXMsIGFsd2F5cyBza2lwcGluZyBkZWx0YXMgaW4gc3VicGl4ZWwgZGlyZWN0aW9uLiAgICAgKi8KICAgICAgICAgICAgIGVsc2UgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIEZUX1VTaG9ydCAgQjEsIEIyOworCisKICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgeSB2YWx1ZSBvZiB0aGUgcG9pbnQgbm93OyBjb21wYXJlIGFmdGVyIG1vdmUgKi8KICAgICAgICAgICAgICAgQjEgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwogCkBAIC03MjI3LDEyICs3Mjc0LDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVMVEFDbltdOiAgICBERUxUQSBleGNlcHRpb25zIEMxLCBDMiwgQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3MywweDc0LDB4NzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAoMiAqIHVpbnQzMikuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBERUxUQUNuW106ICAgIERFTFRBIGV4Y2VwdGlvbnMgQzEsIEMyLCBDMworICAgKiBPcGNvZGUgcmFuZ2U6IDB4NzMsMHg3NCwweDc1CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19ERUxUQUMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTczMDUsMjcgKzczNTIsMjcgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSVNDLiBJTlNUUlVDVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogTUlTQy4gSU5TVFJVQ1RJT05TCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHRVRJTkZPW106ICAgIEdFVCBJTkZPcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiB1aW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IFNlbGVjdG9yIGJpdHMgaGlnaGVyIHRoYW4gOSBhcmUgY3VycmVudGx5IChNYXkgICAgICovCi0gIC8qICAgICAgMjAxNSkgbm90IGRvY3VtZW50ZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTZWxlY3RvciBiaXQgMTEgaXMgaW5jb3JyZWN0bHkgZGVzY3JpYmVkIGFzIGJpdCA4LCB3aGlsZSB0aGUgICAgICovCi0gIC8qICAgICAgcmVhbCBtZWFuaW5nIG9mIGJpdCA4ICh2ZXJ0aWNhbCBMQ0Qgc3VicGl4ZWxzKSBzdGF5cyAgICAgICAgICAgICAqLwotICAvKiAgICAgIHVuZG9jdW1lbnRlZC4gIFRoZSBzYW1lIG1pc3Rha2UgY2FuIGJlIGZvdW5kIGluIEdyZWcgSGl0Y2hjb2NrJ3MgKi8KLSAgLyogICAgICB3aGl0ZXBhcGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogR0VUSU5GT1tdOiAgICBHRVQgSU5GT3JtYXRpb24KKyAgICogT3Bjb2RlIHJhbmdlOiAweDg4CisgICAqIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiB1aW50MzIKKyAgICoKKyAgICogWFhYOiBVTkRPQ1VNRU5URUQ6IFNlbGVjdG9yIGJpdHMgaGlnaGVyIHRoYW4gOSBhcmUgY3VycmVudGx5IChNYXkKKyAgICogICAgICAyMDE1KSBub3QgZG9jdW1lbnRlZCBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbi4KKyAgICoKKyAgICogICAgICBTZWxlY3RvciBiaXQgMTEgaXMgaW5jb3JyZWN0bHkgZGVzY3JpYmVkIGFzIGJpdCA4LCB3aGlsZSB0aGUKKyAgICogICAgICByZWFsIG1lYW5pbmcgb2YgYml0IDggKHZlcnRpY2FsIExDRCBzdWJwaXhlbHMpIHN0YXlzCisgICAqICAgICAgdW5kb2N1bWVudGVkLiAgVGhlIHNhbWUgbWlzdGFrZSBjYW4gYmUgZm91bmQgaW4gR3JlZyBIaXRjaGNvY2sncworICAgKiAgICAgIHdoaXRlcGFwZXIuCisgICAqLwogICBzdGF0aWMgdm9pZAogICBJbnNfR0VUSU5GTyggVFRfRXhlY0NvbnRleHQgIGV4YywKICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTczMzcsMTEgKzczODQsMTEgQEAKICAgICBLID0gMDsKIAogI2lmZGVmIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFJBU1RFUklaRVIgVkVSU0lPTiAgICAgICAgICAgKi8KLSAgICAvKiBTZWxlY3RvciBCaXQ6ICAwICAgICAgICAgICAgICovCi0gICAgLyogUmV0dXJuIEJpdChzKTogMC03ICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogUkFTVEVSSVpFUiBWRVJTSU9OCisgICAgICogU2VsZWN0b3IgQml0OiAgMAorICAgICAqIFJldHVybiBCaXQocyk6IDAtNworICAgICAqLwogICAgIGlmICggU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICYmCiAgICAgICAgICAoIGFyZ3NbMF0gJiAxICkgIT0gMCAgICAgICAgJiYKICAgICAgICAgIGV4Yy0+c3VicGl4ZWxfaGludGluZyAgICAgICApCkBAIC03MzYyLDM5ICs3NDA5LDQwIEBACiAgICAgICBpZiAoICggYXJnc1swXSAmIDEgKSAhPSAwICkKICAgICAgICAgSyA9IGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbjsKIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBHTFlQSCBST1RBVEVEICAgICAgICAgICAgICAgICovCi0gICAgLyogU2VsZWN0b3IgQml0OiAgMSAgICAgICAgICAgICAqLwotICAgIC8qIFJldHVybiBCaXQocyk6IDggICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIEdMWVBIIFJPVEFURUQKKyAgICAgKiBTZWxlY3RvciBCaXQ6ICAxCisgICAgICogUmV0dXJuIEJpdChzKTogOAorICAgICAqLwogICAgIGlmICggKCBhcmdzWzBdICYgMiApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnJvdGF0ZWQgKQogICAgICAgSyB8PSAxIDw8IDg7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogR0xZUEggU1RSRVRDSEVEICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDIgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiA5ICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBHTFlQSCBTVFJFVENIRUQKKyAgICAgKiBTZWxlY3RvciBCaXQ6ICAyCisgICAgICogUmV0dXJuIEJpdChzKTogOQorICAgICAqLwogICAgIGlmICggKCBhcmdzWzBdICYgNCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCiAgICAgICBLIHw9IDEgPDwgOTsKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogVkFSSUFUSU9OIEdMWVBIICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDMgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiAxMCAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogVkFSSUFUSU9OIEdMWVBICisgICAgICogU2VsZWN0b3IgQml0OiAgMworICAgICAqIFJldHVybiBCaXQocyk6IDEwCisgICAgICoKKyAgICAgKiBYWFg6IFVORE9DVU1FTlRFRCEKKyAgICAgKi8KICAgICBpZiAoIChhcmdzWzBdICYgOCApICE9IDAgJiYgZXhjLT5mYWNlLT5ibGVuZCApCiAgICAgICBLIHw9IDEgPDwgMTA7CiAjZW5kaWYKIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBCSS1MRVZFTCBISU5USU5HIEFORCAgICAgICAgICovCi0gICAgLyogR1JBWVNDQUxFIFJFTkRFUklORyAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDUgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiAxMiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBCSS1MRVZFTCBISU5USU5HIEFORAorICAgICAqIEdSQVlTQ0FMRSBSRU5ERVJJTkcKKyAgICAgKiBTZWxlY3RvciBCaXQ6ICA1CisgICAgICogUmV0dXJuIEJpdChzKTogMTIKKyAgICAgKi8KICAgICBpZiAoICggYXJnc1swXSAmIDMyICkgIT0gMCAmJiBleGMtPmdyYXlzY2FsZSApCiAgICAgICBLIHw9IDEgPDwgMTI7CiAKQEAgLTc0MDUsNTAgKzc0NTMsNTQgQEAKICAgICAvKiBCb2xkIEl0YWxpYycuICovCiAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HX01JTklNQUwgJiYgZXhjLT5zdWJwaXhlbF9oaW50aW5nX2xlYW4gKQogICAgIHsKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIEhJTlRJTkcgRk9SIFNVQlBJWEVMICAgICAgICAgKi8KLSAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDYgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFJldHVybiBCaXQocyk6IDEzICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIHY0MCBkb2VzIHN1YnBpeGVsIGhpbnRpbmcgYnkgZGVmYXVsdC4gKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqIEhJTlRJTkcgRk9SIFNVQlBJWEVMCisgICAgICAgKiBTZWxlY3RvciBCaXQ6ICA2CisgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxMworICAgICAgICoKKyAgICAgICAqIHY0MCBkb2VzIHN1YnBpeGVsIGhpbnRpbmcgYnkgZGVmYXVsdC4KKyAgICAgICAqLwogICAgICAgaWYgKCAoIGFyZ3NbMF0gJiA2NCApICE9IDAgKQogICAgICAgICBLIHw9IDEgPDwgMTM7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIFZFUlRJQ0FMIExDRCBTVUJQSVhFTFM/ICAgICAgKi8KLSAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDggICAgICAgICAgICAgKi8KLSAgICAgIC8qIFJldHVybiBCaXQocyk6IDE1ICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqIFZFUlRJQ0FMIExDRCBTVUJQSVhFTFM/CisgICAgICAgKiBTZWxlY3RvciBCaXQ6ICA4CisgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxNQorICAgICAgICovCiAgICAgICBpZiAoICggYXJnc1swXSAmIDI1NiApICE9IDAgJiYgZXhjLT52ZXJ0aWNhbF9sY2RfbGVhbiApCiAgICAgICAgIEsgfD0gMSA8PCAxNTsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogU1VCUElYRUwgUE9TSVRJT05FRD8gICAgICAgICAqLwotICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTAgICAgICAgICAgICAqLwotICAgICAgLyogUmV0dXJuIEJpdChzKTogMTcgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogWFhYOiBGcmVlVHlwZSBzdXBwb3J0cyBpdCwgZGVwZW5kZW50IG9uIHdoYXQgY2xpZW50IGRvZXM/ICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgKiBTVUJQSVhFTCBQT1NJVElPTkVEPworICAgICAgICogU2VsZWN0b3IgQml0OiAgMTAKKyAgICAgICAqIFJldHVybiBCaXQocyk6IDE3CisgICAgICAgKgorICAgICAgICogWFhYOiBGcmVlVHlwZSBzdXBwb3J0cyBpdCwgZGVwZW5kZW50IG9uIHdoYXQgY2xpZW50IGRvZXM/CisgICAgICAgKi8KICAgICAgIGlmICggKCBhcmdzWzBdICYgMTAyNCApICE9IDAgKQogICAgICAgICBLIHw9IDEgPDwgMTc7CiAKLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qIFNZTU1FVFJJQ0FMIFNNT09USElORyAgICAgICAgKi8KLSAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDExICAgICAgICAgICAgKi8KLSAgICAgIC8qIFJldHVybiBCaXQocyk6IDE4ICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRoZSBvbmx5IHNtb290aGluZyBtZXRob2QgRnJlZVR5cGUgc3VwcG9ydHMgdW5sZXNzIHNvbWVvbmUgc2V0cyAqLwotICAgICAgLyogRlRfTE9BRF9UQVJHRVRfTU9OTy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgKiBTWU1NRVRSSUNBTCBTTU9PVEhJTkcKKyAgICAgICAqIFNlbGVjdG9yIEJpdDogIDExCisgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxOAorICAgICAgICoKKyAgICAgICAqIFRoZSBvbmx5IHNtb290aGluZyBtZXRob2QgRnJlZVR5cGUgc3VwcG9ydHMgdW5sZXNzIHNvbWVvbmUgc2V0cworICAgICAgICogRlRfTE9BRF9UQVJHRVRfTU9OTy4KKyAgICAgICAqLwogICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAyMDQ4ICkgIT0gMCAmJiBleGMtPnN1YnBpeGVsX2hpbnRpbmdfbGVhbiApCiAgICAgICAgIEsgfD0gMSA8PCAxODsKIAotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogQ0xFQVJUWVBFIEhJTlRJTkcgQU5EICAgICAgICAqLwotICAgICAgLyogR1JBWVNDQUxFIFJFTkRFUklORyAgICAgICAgICAqLwotICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTIgICAgICAgICAgICAqLwotICAgICAgLyogUmV0dXJuIEJpdChzKTogMTkgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogR3JheXNjYWxlIHJlbmRlcmluZyBpcyB3aGF0IEZyZWVUeXBlIGRvZXMgYW55d2F5IHVubGVzcyBzb21lb25lICovCi0gICAgICAvKiBzZXRzIEZUX0xPQURfVEFSR0VUX01PTk8gb3IgRlRfTE9BRF9UQVJHRVRfTENEKF9WKSAgICAgICAgICAgICAgKi8KKyAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAqIENMRUFSVFlQRSBISU5USU5HIEFORAorICAgICAgICogR1JBWVNDQUxFIFJFTkRFUklORworICAgICAgICogU2VsZWN0b3IgQml0OiAgMTIKKyAgICAgICAqIFJldHVybiBCaXQocyk6IDE5CisgICAgICAgKgorICAgICAgICogR3JheXNjYWxlIHJlbmRlcmluZyBpcyB3aGF0IEZyZWVUeXBlIGRvZXMgYW55d2F5IHVubGVzcyBzb21lb25lCisgICAgICAgKiBzZXRzIEZUX0xPQURfVEFSR0VUX01PTk8gb3IgRlRfTE9BRF9UQVJHRVRfTENEKF9WKQorICAgICAgICovCiAgICAgICBpZiAoICggYXJnc1swXSAmIDQwOTYgKSAhPSAwICYmIGV4Yy0+Z3JheXNjYWxlX2NsZWFydHlwZSApCiAgICAgICAgIEsgfD0gMSA8PCAxOTsKICAgICB9CkBAIC03NDYyLDY3ICs3NTE0LDczIEBACiAKICAgICAgIGlmICggZXhjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPj0gMzcgKQogICAgICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEhJTlRJTkcgRk9SIFNVQlBJWEVMICAgICAgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgNiAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxMyAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgKiBISU5USU5HIEZPUiBTVUJQSVhFTAorICAgICAgICAgKiBTZWxlY3RvciBCaXQ6ICA2CisgICAgICAgICAqIFJldHVybiBCaXQocyk6IDEzCisgICAgICAgICAqLwogICAgICAgICBpZiAoICggYXJnc1swXSAmIDY0ICkgIT0gMCAmJiBleGMtPnN1YnBpeGVsX2hpbnRpbmcgKQogICAgICAgICAgIEsgfD0gMSA8PCAxMzsKIAotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIENPTVBBVElCTEUgV0lEVEhTIEVOQUJMRUQgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgNyAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNCAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIENPTVBBVElCTEUgV0lEVEhTIEVOQUJMRUQKKyAgICAgICAgICogU2VsZWN0b3IgQml0OiAgNworICAgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxNAorICAgICAgICAgKgorICAgICAgICAgKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkCisgICAgICAgICAqLwogICAgICAgICBpZiAoICggYXJnc1swXSAmIDEyOCApICE9IDAgJiYgZXhjLT5jb21wYXRpYmxlX3dpZHRocyApCiAgICAgICAgICAgSyB8PSAxIDw8IDE0OwogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogVkVSVElDQUwgTENEIFNVQlBJWEVMUz8gICAgICAqLwotICAgICAgICAvKiBTZWxlY3RvciBCaXQ6ICA4ICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE1ICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICogVkVSVElDQUwgTENEIFNVQlBJWEVMUz8KKyAgICAgICAgICogU2VsZWN0b3IgQml0OiAgOAorICAgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxNQorICAgICAgICAgKgorICAgICAgICAgKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkCisgICAgICAgICAqLwogICAgICAgICBpZiAoICggYXJnc1swXSAmIDI1NiApICE9IDAgJiYgZXhjLT52ZXJ0aWNhbF9sY2QgKQogICAgICAgICAgIEsgfD0gMSA8PCAxNTsKIAotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEhJTlRJTkcgRk9SIEJHUj8gICAgICAgICAgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgOSAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNiAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAqIEhJTlRJTkcgRk9SIEJHUj8KKyAgICAgICAgICogU2VsZWN0b3IgQml0OiAgOQorICAgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxNgorICAgICAgICAgKgorICAgICAgICAgKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkCisgICAgICAgICAqLwogICAgICAgICBpZiAoICggYXJnc1swXSAmIDUxMiApICE9IDAgJiYgZXhjLT5iZ3IgKQogICAgICAgICAgIEsgfD0gMSA8PCAxNjsKIAogICAgICAgICBpZiAoIGV4Yy0+cmFzdGVyaXplcl92ZXJzaW9uID49IDM4ICkKICAgICAgICAgewotICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAvKiBTVUJQSVhFTCBQT1NJVElPTkVEPyAgICAgICAgICovCi0gICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE3ICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLworICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgKiBTVUJQSVhFTCBQT1NJVElPTkVEPworICAgICAgICAgICAqIFNlbGVjdG9yIEJpdDogIDEwCisgICAgICAgICAgICogUmV0dXJuIEJpdChzKTogMTcKKyAgICAgICAgICAgKgorICAgICAgICAgICAqIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQKKyAgICAgICAgICAgKi8KICAgICAgICAgICBpZiAoICggYXJnc1swXSAmIDEwMjQgKSAhPSAwICYmIGV4Yy0+c3VicGl4ZWxfcG9zaXRpb25lZCApCiAgICAgICAgICAgICBLIHw9IDEgPDwgMTc7CiAKLSAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgLyogU1lNTUVUUklDQUwgU01PT1RISU5HICAgICAgICAqLwotICAgICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDExICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxOCAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KKyAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICogU1lNTUVUUklDQUwgU01PT1RISU5HCisgICAgICAgICAgICogU2VsZWN0b3IgQml0OiAgMTEKKyAgICAgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxOAorICAgICAgICAgICAqCisgICAgICAgICAgICogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZAorICAgICAgICAgICAqLwogICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgMjA0OCApICE9IDAgJiYgZXhjLT5zeW1tZXRyaWNhbF9zbW9vdGhpbmcgKQogICAgICAgICAgICAgSyB8PSAxIDw8IDE4OwogCi0gICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgIC8qIEdSQVkgQ0xFQVJUWVBFICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBTZWxlY3RvciBCaXQ6ICAxMiAgICAgICAgICAgICovCi0gICAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTkgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkICovCisgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAqIEdSQVkgQ0xFQVJUWVBFCisgICAgICAgICAgICogU2VsZWN0b3IgQml0OiAgMTIKKyAgICAgICAgICAgKiBSZXR1cm4gQml0KHMpOiAxOQorICAgICAgICAgICAqCisgICAgICAgICAgICogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZAorICAgICAgICAgICAqLwogICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgNDA5NiApICE9IDAgJiYgZXhjLT5ncmF5X2NsZWFydHlwZSApCiAgICAgICAgICAgICBLIHw9IDEgPDwgMTk7CiAgICAgICAgIH0KQEAgLTc1MzcsMTYgKzc1OTUsMTYgQEAKIAogI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdFVFZBUklBVElPTltdOiBnZXQgbm9ybWFsaXplZCB2YXJpYXRpb24gKGJsZW5kKSBjb29yZGluYXRlcyAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gZjIuMTQuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgIFRoZXJlIGlzIG5vIG9mZmljaWFsIGRvY3VtZW50YXRpb24gZnJvbSBBcHBsZSBmb3IgKi8KLSAgLyogICAgICB0aGlzIGJ5dGVjb2RlIGluc3RydWN0aW9uLiAgQWN0aXZlIG9ubHkgaWYgYSBmb250IGhhcyBHWCAgICAgICAgICovCi0gIC8qICAgICAgdmFyaWF0aW9uIGF4ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEdFVFZBUklBVElPTltdOiBnZXQgbm9ybWFsaXplZCB2YXJpYXRpb24gKGJsZW5kKSBjb29yZGluYXRlcworICAgKiBPcGNvZGUgcmFuZ2U6IDB4OTEKKyAgICogU3RhY2s6ICAgICAgICAtLT4gZjIuMTQuLi4KKyAgICoKKyAgICogWFhYOiBVTkRPQ1VNRU5URUQhICBUaGVyZSBpcyBubyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGZyb20gQXBwbGUgZm9yCisgICAqICAgICAgdGhpcyBieXRlY29kZSBpbnN0cnVjdGlvbi4gIEFjdGl2ZSBvbmx5IGlmIGEgZm9udCBoYXMgR1gKKyAgICogICAgICB2YXJpYXRpb24gYXhlcy4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19HRVRWQVJJQVRJT04oIFRUX0V4ZWNDb250ZXh0ICBleGMsCiAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKQEAgLTc1NzYsMTUgKzc2MzQsMTUgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHRVREQVRBW106ICAgIG5vIGlkZWEgd2hhdCB0aGlzIGlzIGdvb2QgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQhICBUaGVyZSBpcyBubyBkb2N1bWVudGF0aW9uIGZyb20gQXBwbGUgZm9yIHRoaXMgICAgICovCi0gIC8qICAgICAgdmVyeSB3ZWlyZCBieXRlY29kZSBpbnN0cnVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEdFVERBVEFbXTogICAgbm8gaWRlYSB3aGF0IHRoaXMgaXMgZ29vZCBmb3IKKyAgICogT3Bjb2RlIHJhbmdlOiAweDkyCisgICAqIFN0YWNrOiAgICAgICAgLS0+IDE3CisgICAqCisgICAqIFhYWDogVU5ET0NVTUVOVEVEISAgVGhlcmUgaXMgbm8gZG9jdW1lbnRhdGlvbiBmcm9tIEFwcGxlIGZvciB0aGlzCisgICAqICAgICAgdmVyeSB3ZWlyZCBieXRlY29kZSBpbnN0cnVjdGlvbi4KKyAgICovCiAgIHN0YXRpYyB2b2lkCiAgIEluc19HRVREQVRBKCBGVF9Mb25nKiAgYXJncyApCiAgIHsKQEAgLTc1OTgsNyArNzY1Niw3IEBACiAgIEluc19VTktOT1dOKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKICAgewogICAgIFRUX0RlZlJlY29yZCogIGRlZiAgID0gZXhjLT5JRGVmczsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7CisgICAgVFRfRGVmUmVjb3JkKiAgbGltaXQgPSBGVF9PRkZTRVQoIGRlZiwgZXhjLT5udW1JRGVmcyApOwogCiAKICAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCkBAIC03NjMyLDM0ICs3NjkwLDM0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBhIHJ1biBvZiBvcGNvZGVzLiAgSXQgd2lsbCBleGl0IGluIHRoZSAgICAgICAgKi8KLSAgLyogIGZvbGxvd2luZyBjYXNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBFcnJvcnMgKGluIHdoaWNoIGNhc2UgaXQgcmV0dXJucyBGQUxTRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIG1haW4gY29kZSByYW5nZSAocmV0dXJucyBUUlVFKS4gICAgICAgICAgICAqLwotICAvKiAgICBSZWFjaGluZyB0aGUgZW5kIG9mIGEgY29kZSByYW5nZSB3aXRoaW4gYSBmdW5jdGlvbiBjYWxsIGlzIGFuICAgICAgKi8KLSAgLyogICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBBZnRlciBleGVjdXRpbmcgb25lIHNpbmdsZSBvcGNvZGUsIGlmIHRoZSBmbGFnIGBJbnN0cnVjdGlvbl9UcmFwJyAgKi8KLSAgLyogICAgaXMgc2V0IHRvIFRSVUUgKHJldHVybnMgVFJVRSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgT24gZXhpdCB3aXRoIFRSVUUsIHRlc3QgSVAgPCBDb2RlU2l6ZSB0byBrbm93IHdoZXRoZXIgaXQgY29tZXMgZnJvbSAgKi8KLSAgLyogIGFuIGluc3RydWN0aW9uIHRyYXAgb3IgYSBub3JtYWwgdGVybWluYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGU6IFRoZSBkb2N1bWVudGVkIERFQlVHIG9wY29kZSBwb3BzIGEgdmFsdWUgZnJvbSB0aGUgc3RhY2suICBUaGlzICovCi0gIC8qICAgICAgICBiZWhhdmlvdXIgaXMgdW5zdXBwb3J0ZWQ7IGhlcmUgYSBERUJVRyBvcGNvZGUgaXMgYWx3YXlzIGFuICAgICAqLwotICAvKiAgICAgICAgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUSElTIElTIFRIRSBJTlRFUlBSRVRFUidTIE1BSU4gTE9PUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogUlVOCisgICAqCisgICAqIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgYSBydW4gb2Ygb3Bjb2Rlcy4gIEl0IHdpbGwgZXhpdCBpbiB0aGUKKyAgICogZm9sbG93aW5nIGNhc2VzOgorICAgKgorICAgKiAtIEVycm9ycyAoaW4gd2hpY2ggY2FzZSBpdCByZXR1cm5zIEZBTFNFKS4KKyAgICoKKyAgICogLSBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBtYWluIGNvZGUgcmFuZ2UgKHJldHVybnMgVFJVRSkuCisgICAqICAgUmVhY2hpbmcgdGhlIGVuZCBvZiBhIGNvZGUgcmFuZ2Ugd2l0aGluIGEgZnVuY3Rpb24gY2FsbCBpcyBhbgorICAgKiAgIGVycm9yLgorICAgKgorICAgKiAtIEFmdGVyIGV4ZWN1dGluZyBvbmUgc2luZ2xlIG9wY29kZSwgaWYgdGhlIGZsYWcgYEluc3RydWN0aW9uX1RyYXAnCisgICAqICAgaXMgc2V0IHRvIFRSVUUgKHJldHVybnMgVFJVRSkuCisgICAqCisgICAqIE9uIGV4aXQgd2l0aCBUUlVFLCB0ZXN0IElQIDwgQ29kZVNpemUgdG8ga25vdyB3aGV0aGVyIGl0IGNvbWVzIGZyb20KKyAgICogYW4gaW5zdHJ1Y3Rpb24gdHJhcCBvciBhIG5vcm1hbCB0ZXJtaW5hdGlvbi4KKyAgICoKKyAgICoKKyAgICogTm90ZTogVGhlIGRvY3VtZW50ZWQgREVCVUcgb3Bjb2RlIHBvcHMgYSB2YWx1ZSBmcm9tIHRoZSBzdGFjay4gIFRoaXMKKyAgICogICAgICAgYmVoYXZpb3VyIGlzIHVuc3VwcG9ydGVkOyBoZXJlIGEgREVCVUcgb3Bjb2RlIGlzIGFsd2F5cyBhbgorICAgKiAgICAgICBlcnJvci4KKyAgICoKKyAgICoKKyAgICogVEhJUyBJUyBUSEUgSU5URVJQUkVURVInUyBNQUlOIExPT1AuCisgICAqCisgICAqLwogCiAKICAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiB0dGludGVycC5oICovCkBAIC03NjkxLDE2ICs3NzQ5LDE2IEBACiAKICNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAogICAgIC8qCi0gICAgICogIFRvZ2dsZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFjY29yZGluZyB0byB3aGF0IGZvbnQgd2FudHMsIGV4Y2VwdAotICAgICAqICB3aGVuCisgICAgICogVG9nZ2xlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYWNjb3JkaW5nIHRvIHdoYXQgZm9udCB3YW50cywgZXhjZXB0CisgICAgICogd2hlbgogICAgICAqCi0gICAgICogIDEpIHdlIGhhdmUgYSBgdHJpY2t5JyBmb250IHRoYXQgaGVhdmlseSByZWxpZXMgb24gdGhlIGludGVycHJldGVyIHRvCi0gICAgICogICAgIHJlbmRlciBnbHlwaHMgY29ycmVjdGx5LCBmb3IgZXhhbXBsZSBERkthaS1TQiwgb3IKLSAgICAgKiAgMikgRlRfUkVOREVSX01PREVfTU9OTyAoaS5lLCBtb25vY2hvbWUgcmVuZGVyaW5nKSBpcyByZXF1ZXN0ZWQuCisgICAgICogMSkgd2UgaGF2ZSBhIGB0cmlja3knIGZvbnQgdGhhdCBoZWF2aWx5IHJlbGllcyBvbiB0aGUgaW50ZXJwcmV0ZXIgdG8KKyAgICAgKiAgICByZW5kZXIgZ2x5cGhzIGNvcnJlY3RseSwgZm9yIGV4YW1wbGUgREZLYWktU0IsIG9yCisgICAgICogMikgRlRfUkVOREVSX01PREVfTU9OTyAoaS5lLCBtb25vY2hvbWUgcmVuZGVyaW5nKSBpcyByZXF1ZXN0ZWQuCiAgICAgICoKLSAgICAgKiAgSW4gdGhvc2UgY2FzZXMsIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbmVlZHMgdG8gYmUgdHVybmVkIG9mZiB0byBnZXQKLSAgICAgKiAgY29ycmVjdCByZW5kZXJpbmcuICBUaGUgcmVuZGVyaW5nIGlzIHRoZW4gY29tcGxldGVseSB1cCB0byB0aGUKLSAgICAgKiAgZm9udCdzIHByb2dyYW1taW5nLgorICAgICAqIEluIHRob3NlIGNhc2VzLCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG5lZWRzIHRvIGJlIHR1cm5lZCBvZmYgdG8gZ2V0CisgICAgICogY29ycmVjdCByZW5kZXJpbmcuICBUaGUgcmVuZGVyaW5nIGlzIHRoZW4gY29tcGxldGVseSB1cCB0byB0aGUKKyAgICAgKiBmb250J3MgcHJvZ3JhbW1pbmcuCiAgICAgICoKICAgICAgKi8KICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTCAgICAgICAgICAmJgpAQCAtNzcyNCw3ICs3NzgyLDcgQEAKICAgICAgICAgbnVtX3R3aWxpZ2h0X3BvaW50cyA9IDB4RkZGRlU7CiAKICAgICAgIEZUX1RSQUNFNSgoICJUVF9SdW5JbnM6IFJlc2V0dGluZyBudW1iZXIgb2YgdHdpbGlnaHQgcG9pbnRzXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgICAgICBmcm9tICVkIHRvIHRoZSBtb3JlIHJlYXNvbmFibGUgdmFsdWUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBmcm9tICVkIHRvIHRoZSBtb3JlIHJlYXNvbmFibGUgdmFsdWUgJWxkXG4iLAogICAgICAgICAgICAgICAgICAgZXhjLT50d2lsaWdodC5uX3BvaW50cywKICAgICAgICAgICAgICAgICAgIG51bV90d2lsaWdodF9wb2ludHMgKSk7CiAgICAgICBleGMtPnR3aWxpZ2h0Lm5fcG9pbnRzID0gKEZUX1VTaG9ydCludW1fdHdpbGlnaHRfcG9pbnRzOwpAQCAtNzc1MCw3ICs3ODA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NQVgoIDUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5jdnRTaXplIC8gMTAgKTsKICAgICBlbHNlCi0gICAgICBleGMtPmxvb3BjYWxsX2NvdW50ZXJfbWF4ID0gMzAwICsgOCAqIGV4Yy0+Y3Z0U2l6ZTsKKyAgICAgIGV4Yy0+bG9vcGNhbGxfY291bnRlcl9tYXggPSAzMDAgKyAyMiAqIGV4Yy0+Y3Z0U2l6ZTsKIAogICAgIC8qIGFzIGEgcHJvdGVjdGlvbiBhZ2FpbnN0IGFuIHVucmVhc29uYWJsZSBudW1iZXIgb2YgQ1ZUIGVudHJpZXMgICovCiAgICAgLyogd2UgYXNzdW1lIGF0IG1vc3QgMTAwIGNvbnRyb2wgdmFsdWVzIHBlciBnbHlwaCBmb3IgdGhlIGNvdW50ZXIgKi8KQEAgLTc3NTksMTEgKzc4MTcsMTEgQEAKICAgICAgIGV4Yy0+bG9vcGNhbGxfY291bnRlcl9tYXggPSAxMDAgKiAoRlRfVUxvbmcpZXhjLT5mYWNlLT5yb290Lm51bV9nbHlwaHM7CiAKICAgICBGVF9UUkFDRTUoKCAiVFRfUnVuSW5zOiBMaW1pdGluZyB0b3RhbCBudW1iZXIgb2YgbG9vcHMgaW4gTE9PUENBTEwiCi0gICAgICAgICAgICAgICAgIiB0byAlZFxuIiwgZXhjLT5sb29wY2FsbF9jb3VudGVyX21heCApKTsKKyAgICAgICAgICAgICAgICAiIHRvICVsZFxuIiwgZXhjLT5sb29wY2FsbF9jb3VudGVyX21heCApKTsKIAogICAgIGV4Yy0+bmVnX2p1bXBfY291bnRlcl9tYXggPSBleGMtPmxvb3BjYWxsX2NvdW50ZXJfbWF4OwogICAgIEZUX1RSQUNFNSgoICJUVF9SdW5JbnM6IExpbWl0aW5nIHRvdGFsIG51bWJlciBvZiBiYWNrd2FyZCBqdW1wcyIKLSAgICAgICAgICAgICAgICAiIHRvICVkXG4iLCBleGMtPm5lZ19qdW1wX2NvdW50ZXJfbWF4ICkpOworICAgICAgICAgICAgICAgICIgdG8gJWxkXG4iLCBleGMtPm5lZ19qdW1wX2NvdW50ZXJfbWF4ICkpOwogCiAgICAgLyogc2V0IFBQRU0gYW5kIENWVCBmdW5jdGlvbnMgKi8KICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwpAQCAtNzgwMCwxNCArNzg1OCwxNCBAQAogICAgICAgICAvKiBpZiB0cmFjaW5nIGxldmVsIGlzIDcsIHNob3cgY3VycmVudCBjb2RlIHBvc2l0aW9uICovCiAgICAgICAgIC8qIGFuZCB0aGUgZmlyc3QgZmV3IHN0YWNrIGVsZW1lbnRzIGFsc28gICAgICAgICAgICAgKi8KICAgICAgICAgRlRfVFJBQ0U2KCggIiAgIiApKTsKLSAgICAgICAgRlRfVFJBQ0U3KCggIiUwNmQgIiwgZXhjLT5JUCApKTsKLSAgICAgICAgRlRfVFJBQ0U2KCggb3Bjb2RlX25hbWVbZXhjLT5vcGNvZGVdICsgMiApKTsKKyAgICAgICAgRlRfVFJBQ0U3KCggIiUwNmxkICIsIGV4Yy0+SVAgKSk7CisgICAgICAgIEZUX1RSQUNFNigoICIlcyIsIG9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSArIDIgKSk7CiAgICAgICAgIEZUX1RSQUNFNygoICIlKnMiLCAqb3Bjb2RlX25hbWVbZXhjLT5vcGNvZGVdID09ICdBJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDEyIC0gKCAqb3Bjb2RlX25hbWVbZXhjLT5vcGNvZGVdIC0gJzAnICksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyIgKSk7CiAgICAgICAgIGZvciAoIG4gPSAxOyBuIDw9IGNudDsgbisrICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICVkIiwgZXhjLT5zdGFja1tleGMtPnRvcCAtIG5dICkpOworICAgICAgICAgIEZUX1RSQUNFNygoICIgJWxkIiwgZXhjLT5zdGFja1tleGMtPnRvcCAtIG5dICkpOwogICAgICAgICBGVF9UUkFDRTYoKCAiXG4iICkpOwogICAgICAgfQogI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCkBAIC04NDUwLDcgKzg1MDgsNyBAQAogICAgICAgICBjYXNlIEZUX0VSUiggSW52YWxpZF9PcGNvZGUgKToKICAgICAgICAgICB7CiAgICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IGV4Yy0+SURlZnM7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7CisgICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IEZUX09GRlNFVCggZGVmLCBleGMtPm51bUlEZWZzICk7CiAKIAogICAgICAgICAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQpAQCAtODUyNSw3ICs4NTgzLDcgQEAKICAgICB9IHdoaWxlICggIWV4Yy0+aW5zdHJ1Y3Rpb25fdHJhcCApOwogCiAgIExOb19FcnJvcl86Ci0gICAgRlRfVFJBQ0U0KCggIiAgJWQgaW5zdHJ1Y3Rpb24lcyBleGVjdXRlZFxuIiwKKyAgICBGVF9UUkFDRTQoKCAiICAlbGQgaW5zdHJ1Y3Rpb24lcyBleGVjdXRlZFxuIiwKICAgICAgICAgICAgICAgICBpbnNfY291bnRlciwKICAgICAgICAgICAgICAgICBpbnNfY291bnRlciA9PSAxID8gIiIgOiAicyIgKSk7CiAgICAgcmV0dXJuIEZUX0Vycl9PazsKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dGludGVycC5oIGIvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKaW5kZXggMjk2NjQzOS4uNmE4MzcwNSAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKKysrIGIvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKQEAgLTEsMzUgKzEsMzQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0aW50ZXJwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0aW50ZXJwLmgKKyAqCisgKiAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVFRJTlRFUlBfSF8KICNkZWZpbmUgVFRJTlRFUlBfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAidHRvYmpzLmgiCiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJvdW5kaW5nIG1vZGUgY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJvdW5kaW5nIG1vZGUgY29uc3RhbnRzLgorICAgKi8KICNkZWZpbmUgVFRfUm91bmRfT2ZmICAgICAgICAgICAgIDUKICNkZWZpbmUgVFRfUm91bmRfVG9fSGFsZl9HcmlkICAgIDAKICNkZWZpbmUgVFRfUm91bmRfVG9fR3JpZCAgICAgICAgIDEKQEAgLTQwLDE5ICszOSwxOSBAQAogI2RlZmluZSBUVF9Sb3VuZF9TdXBlcl80NSAgICAgICAgNwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGdW5jdGlvbiB0eXBlcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlciwgZGVwZW5kaW5nIG9uIHZhcmlvdXMgbW9kZXMgICAgKi8KLSAgLyogKGUuZy4gdGhlIHJvdW5kaW5nIG1vZGUsIHdoZXRoZXIgdG8gcmVuZGVyIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbCAgICovCi0gIC8qIGxpbmUgZXRjKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBGdW5jdGlvbiB0eXBlcyB1c2VkIGJ5IHRoZSBpbnRlcnByZXRlciwgZGVwZW5kaW5nIG9uIHZhcmlvdXMgbW9kZXMKKyAgICogKGUuZy4gdGhlIHJvdW5kaW5nIG1vZGUsIHdoZXRoZXIgdG8gcmVuZGVyIGEgdmVydGljYWwgb3IgaG9yaXpvbnRhbAorICAgKiBsaW5lIGV0YykuCisgICAqCisgICAqLwogCiAgIC8qIFJvdW5kaW5nIGZ1bmN0aW9uICovCiAgIHR5cGVkZWYgRlRfRjI2RG90NgogICAoKlRUX1JvdW5kX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAogICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGNvbG9yICk7CiAKICAgLyogUG9pbnQgZGlzcGxhY2VtZW50IGFsb25nIHRoZSBmcmVlZG9tIHZlY3RvciByb3V0aW5lICovCiAgIHR5cGVkZWYgdm9pZApAQCAtODQsMTAgKzgzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIHZhbHVlICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjYWxsIHJlY29yZCwgdXNlZCB0byBtYW5hZ2UgZnVuY3Rpb24gY2FsbHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjYWxsIHJlY29yZCwgdXNlZCB0byBtYW5hZ2UgZnVuY3Rpb24gY2FsbHMuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfQ2FsbFJlY18KICAgewogICAgIEZUX0ludCAgIENhbGxlcl9SYW5nZTsKQEAgLTEwMSwxMSArMTAwLDExIEBACiAKICNpZmRlZiBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2Ugc3RydWN0dXJlcyBkZWZpbmUgcnVsZXMgdXNlZCB0byB0d2VhayBzdWJwaXhlbCBoaW50aW5nIGZvciAgICAgICovCi0gIC8qIHZhcmlvdXMgZm9udHMuICAiIiwgMCwgIiIsIE5VTEwgdmFsdWUgaW5kaWNhdGVzIHRvIG1hdGNoIGFueSB2YWx1ZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZXNlIHN0cnVjdHVyZXMgZGVmaW5lIHJ1bGVzIHVzZWQgdG8gdHdlYWsgc3VicGl4ZWwgaGludGluZyBmb3IKKyAgICogdmFyaW91cyBmb250cy4gICIiLCAwLCAiIiwgTlVMTCB2YWx1ZSBpbmRpY2F0ZXMgdG8gbWF0Y2ggYW55IHZhbHVlLgorICAgKi8KIAogI2RlZmluZSBTUEhfTUFYX05BTUVfU0laRSAgICAgIDMyCiAjZGVmaW5lIFNQSF9NQVhfQ0xBU1NfTUVNQkVSUyAgMTAwCkBAIC0xNDEsMTEgKzE0MCwxMSBAQAogI2VuZGlmIC8qIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWluIHN0cnVjdHVyZSBmb3IgdGhlIGludGVycHJldGVyIHdoaWNoIGNvbGxlY3RzIGFsbCBuZWNlc3NhcnkgICAqLwotICAvKiB2YXJpYWJsZXMgYW5kIHN0YXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFpbiBzdHJ1Y3R1cmUgZm9yIHRoZSBpbnRlcnByZXRlciB3aGljaCBjb2xsZWN0cyBhbGwgbmVjZXNzYXJ5CisgICAqIHZhcmlhYmxlcyBhbmQgc3RhdGVzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0V4ZWNDb250ZXh0UmVjXwogICB7CiAgICAgVFRfRmFjZSAgICAgICAgICAgIGZhY2U7CkBAIC0zNTIsNyArMzUxLDcgQEAKICAgICAgKiAgICAgaHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L2NsZWFydHlwZS90cnVldHlwZWNsZWFydHlwZS5hc3B4CiAgICAgICoKICAgICAgKiBbM10gQmVhdCBTdGFtbSBkZXNjcmliZXMgaXQgaW4gbW9yZSBkZXRhaWw6Ci0gICAgICogICAgIGh0dHA6Ly93d3cuYmVhdHN0YW1tLmNvbS90eXBvZ3JhcGh5L1JUUkNoNC5odG0jU2VjMTIKKyAgICAgKiAgICAgaHR0cDovL3Jhc3RlcnRyYWdlZHkuY29tL1JUUkNoNC5odG0jU2VjMTIuCiAgICAgICoKICAgICAgKiBbNF0gVGhlIGxpc3Qgb2YgYG5hdGl2ZSBDbGVhclR5cGUnIGZvbnRzIGlzIHNtYWxsIGF0IHRoZSB0aW1lIG9mIHRoaXMKICAgICAgKiAgICAgd3JpdGluZzsgSSBmb3VuZCB0aGUgZm9sbG93aW5nIG9uIGEgV2luZG93cyAxMCBVcGRhdGUgMTUxMQpAQCAtNDY0LDI2ICs0NjMsMjcgQEAKICNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX05ld19Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFF1ZXJpZXMgdGhlIGZhY2UgY29udGV4dCBmb3IgYSBnaXZlbiBmb250LiAgTm90ZSB0aGF0IHRoZXJlIGlzICAgICAqLwotICAvKiAgICBub3cgYSBfc2luZ2xlXyBleGVjdXRpb24gY29udGV4dCBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyIHdoaWNoIGlzICAgKi8KLSAgLyogICAgc2hhcmVkIGFtb25nIGZhY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgSW5pdGlhbGl6ZWQgZm9yIGBmYWNlJy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB0aGUgZ2x5cGggbG9hZGVyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAgICovCi0gIC8qICAgIChBbmQgcmlnaHQgbm93IG9ubHkgdGhlIGdseXBoIGxvYWRlciB1c2VzIGl0LikgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9OZXdfQ29udGV4dAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUXVlcmllcyB0aGUgZmFjZSBjb250ZXh0IGZvciBhIGdpdmVuIGZvbnQuICBOb3RlIHRoYXQgdGhlcmUgaXMKKyAgICogICBub3cgYSBfc2luZ2xlXyBleGVjdXRpb24gY29udGV4dCBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyIHdoaWNoIGlzCisgICAqICAgc2hhcmVkIGFtb25nIGZhY2VzLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBBIGhhbmRsZSB0byB0aGUgZXhlY3V0aW9uIGNvbnRleHQuICBJbml0aWFsaXplZCBmb3IgYGZhY2UnLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uCisgICAqICAgKEFuZCByaWdodCBub3cgb25seSB0aGUgZ2x5cGggbG9hZGVyIHVzZXMgaXQuKQorICAgKi8KICAgRlRfRVhQT1JUKCBUVF9FeGVjQ29udGV4dCApCiAgIFRUX05ld19Db250ZXh0KCBUVF9Ecml2ZXIgIGRyaXZlciApOwogCkBAIC01MDYsMjcgKzUwNiwyOCBAQAogI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuSW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgVGhpcyAgICovCi0gIC8qICAgIGlzIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBUcnVlVHlwZSBvcGNvZGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIG9iamVjdCBtYW5hZ2VyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwdWJsaWNseSBleHBvcnRlZCBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5ICAgICAgICAgICovCi0gIC8qICAgIGludm9rZWQgYnkgdGhlIFRydWVUeXBlIGRlYnVnZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUVF9SdW5JbnMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEV4ZWN1dGVzIG9uZSBvciBtb3JlIGluc3RydWN0aW9uIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gIFRoaXMKKyAgICogICBpcyB0aGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgVHJ1ZVR5cGUgb3Bjb2RlIGludGVycHJldGVyLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZXhlYyA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKgorICAgKiBATm90ZToKKyAgICogICBPbmx5IHRoZSBvYmplY3QgbWFuYWdlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAgICoKKyAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHB1YmxpY2x5IGV4cG9ydGVkIGJlY2F1c2UgaXQgaXMgZGlyZWN0bHkKKyAgICogICBpbnZva2VkIGJ5IHRoZSBUcnVlVHlwZSBkZWJ1Z2dlci4KKyAgICovCiAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKQogICBUVF9SdW5JbnMoIFRUX0V4ZWNDb250ZXh0ICBleGVjICk7CiAKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dG9ianMuYyBiL3NyYy90cnVldHlwZS90dG9ianMuYwppbmRleCA2Njg1ZGM4Li4wNmQ0NTY5IDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmMKKysrIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dG9ianMuYworICoKKyAqICAgT2JqZWN0cyBtYW5hZ2VyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgogCiAjaW5jbHVkZSAidHRnbG9hZC5oIgogI2luY2x1ZGUgInR0cGxvYWQuaCIKQEAgLTM2LDM2ICszNSwzNyBAQAogI2luY2x1ZGUgInR0Z3h2YXIuaCIKICNlbmRpZgogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dG9ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0dG9ianMKIAogCiAjaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgR0xZUEggWk9ORSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgR0xZUEggWk9ORSBGVU5DVElPTlMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaHpvbmVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZWFsbG9jYXRlIGEgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZ2x5cGh6b25lX2RvbmUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIERlYWxsb2NhdGUgYSBnbHlwaCB6b25lLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgem9uZSA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZS4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHR0X2dseXBoem9uZV9kb25lKCBUVF9HbHlwaFpvbmUgIHpvbmUgKQogICB7CkBAIC04NywyNyArODcsMzEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZ2x5cGh6b25lX25ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWxsb2NhdGUgYSBuZXcgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhQb2ludHMgICA6OiBUaGUgY2FwYWNpdHkgb2YgZ2x5cGggem9uZSBpbiBwb2ludHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heENvbnRvdXJzIDo6IFRoZSBjYXBhY2l0eSBvZiBnbHlwaCB6b25lIGluIGNvbnRvdXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHpvbmUgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGdseXBoIHpvbmUgcmVjb3JkLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9nbHlwaHpvbmVfbmV3CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBBbGxvY2F0ZSBhIG5ldyBnbHlwaCB6b25lLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgbWVtb3J5IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LgorICAgKgorICAgKiAgIG1heFBvaW50cyA6OgorICAgKiAgICAgVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gcG9pbnRzLgorICAgKgorICAgKiAgIG1heENvbnRvdXJzIDo6CisgICAqICAgICBUaGUgY2FwYWNpdHkgb2YgZ2x5cGggem9uZSBpbiBjb250b3Vycy4KKyAgICoKKyAgICogQE91dHB1dDoKKyAgICogICB6b25lIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBnbHlwaCB6b25lIHJlY29yZC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIHR0X2dseXBoem9uZV9uZXcoIEZUX01lbW9yeSAgICAgbWVtb3J5LAogICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgIG1heFBvaW50cywKQEAgLTE0Myw3ICsxNDcsNyBAQAogICAvKiBUaGlzIGxpc3Qgc2hhbGwgYmUgZXhwYW5kZWQgYXMgd2UgZmluZCBtb3JlIG9mIHRoZW0uICAgICAgICovCiAKICAgc3RhdGljIEZUX0Jvb2wKLSAgdHRfY2hlY2tfdHJpY2t5bmVzc19mYW1pbHkoIEZUX1N0cmluZyogIG5hbWUgKQorICB0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSggY29uc3QgRlRfU3RyaW5nKiAgbmFtZSApCiAgIHsKIAogI2RlZmluZSBUUklDS19OQU1FU19NQVhfQ0hBUkFDVEVSUyAgMTkKQEAgLTU2NiwzMiArNTcwLDM3IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBnaXZlbiBUcnVlVHlwZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIHNvdXJjZSBmb250IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbiwgaW4gYml0cyAwLTE1LiAgVGhlIG51bWJlcmVkIGluc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGluZGV4fit+MSBvZiBhIEdYIChzdWIpZm9udCwgaWYgYXBwbGljYWJsZSwgaW4gYml0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAxNi0zMC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IE51bWJlciBvZiBhZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIG5ld2x5IGJ1aWx0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemUgYSBnaXZlbiBUcnVlVHlwZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgVGhlIHNvdXJjZSBmb250IHN0cmVhbS4KKyAgICoKKyAgICogICBmYWNlX2luZGV4IDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIFRydWVUeXBlIGZvbnQsIGlmIHdlIGFyZSBvcGVuaW5nIGEKKyAgICogICAgIGNvbGxlY3Rpb24sIGluIGJpdHMgMC0xNS4gIFRoZSBudW1iZXJlZCBpbnN0YW5jZQorICAgKiAgICAgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZiBhcHBsaWNhYmxlLCBpbiBiaXRzCisgICAqICAgICAxNi0zMC4KKyAgICoKKyAgICogICBudW1fcGFyYW1zIDo6CisgICAqICAgICBOdW1iZXIgb2YgYWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLgorICAgKgorICAgKiAgIHBhcmFtcyA6OgorICAgKiAgICAgQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIG5ld2x5IGJ1aWx0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KQEAgLTc0MywxNyArNzUyLDE4IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBwb2ludGVyIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2RvbmUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZpbmFsaXplIGEgZ2l2ZW4gZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGZhY2Ugb2JqZWN0IHRvIGRlc3Ryb3kuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICB0dF9mYWNlX2RvbmUoIEZUX0ZhY2UgIHR0ZmFjZSApICAgICAgICAgICAvKiBUVF9GYWNlICovCiAgIHsKQEAgLTc5OSwzMCArODA5LDMyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFICBGVU5DVElPTlMKKyAgICoKKyAgICovCiAKICNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9zaXplX3J1bl9mcGdtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSdW4gdGhlIGZvbnQgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBlZGFudGljIDo6IFNldCBpZiBieXRlY29kZSBleGVjdXRpb24gc2hvdWxkIGJlIHBlZGFudGljLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9zaXplX3J1bl9mcGdtCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBSdW4gdGhlIGZvbnQgcHJvZ3JhbS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4KKyAgICoKKyAgICogICBwZWRhbnRpYyA6OgorICAgKiAgICAgU2V0IGlmIGJ5dGVjb2RlIGV4ZWN1dGlvbiBzaG91bGQgYmUgcGVkYW50aWMuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9zaXplX3J1bl9mcGdtKCBUVF9TaXplICBzaXplLAogICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApCkBAIC04OTksMjIgKzkxMSwyNCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9zaXplX3J1bl9wcmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSdW4gdGhlIGNvbnRyb2wgdmFsdWUgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBlZGFudGljIDo6IFNldCBpZiBieXRlY29kZSBleGVjdXRpb24gc2hvdWxkIGJlIHBlZGFudGljLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9zaXplX3J1bl9wcmVwCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBSdW4gdGhlIGNvbnRyb2wgdmFsdWUgcHJvZ3JhbS4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzaXplIG9iamVjdC4KKyAgICoKKyAgICogICBwZWRhbnRpYyA6OgorICAgKiAgICAgU2V0IGlmIGJ5dGVjb2RlIGV4ZWN1dGlvbiBzaG91bGQgYmUgcGVkYW50aWMuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9zaXplX3J1bl9wcmVwKCBUVF9TaXplICBzaXplLAogICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApCkBAIC05MjIsNyArOTM2LDIyIEBACiAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UgPSAoVFRfRmFjZSlzaXplLT5yb290LmZhY2U7CiAgICAgVFRfRXhlY0NvbnRleHQgIGV4ZWM7CiAgICAgRlRfRXJyb3IgICAgICAgIGVycm9yOworICAgIEZUX1VJbnQgICAgICAgICBpOwogCisgICAgLyogdW5zY2FsZWQgQ1ZUIHZhbHVlcyBhcmUgYWxyZWFkeSBzdG9yZWQgaW4gMjYuNiBmb3JtYXQgKi8KKyAgICBGVF9GaXhlZCAgc2NhbGUgPSBzaXplLT50dG1ldHJpY3Muc2NhbGUgPj4gNjsKKworCisgICAgLyogU2NhbGUgdGhlIGN2dCB2YWx1ZXMgdG8gdGhlIG5ldyBwcGVtLiAgICAgICAgICAgICovCisgICAgLyogQnkgZGVmYXVsdCwgd2UgdXNlIHRoZSB5IHBwZW0gdmFsdWUgZm9yIHNjYWxpbmcuICovCisgICAgRlRfVFJBQ0U2KCggIkNWVCB2YWx1ZXM6XG4iICkpOworICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZS0+Y3Z0X3NpemU7IGkrKyApCisgICAgeworICAgICAgc2l6ZS0+Y3Z0W2ldID0gRlRfTXVsRml4KCBmYWNlLT5jdnRbaV0sIHNjYWxlICk7CisgICAgICBGVF9UUkFDRTYoKCAiICAlM2Q6ICVmICglZilcbiIsCisgICAgICAgICAgICAgICAgICBpLCBmYWNlLT5jdnRbaV0gLyA2NC4wLCBzaXplLT5jdnRbaV0gLyA2NC4wICkpOworICAgIH0KKyAgICBGVF9UUkFDRTYoKCAiXG4iICkpOwogCiAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7CiAKQEAgLTEwNzksMTEgKzExMDgsMTcgQEAKICAgICAgIHR0X21ldHJpY3MtPnJvdGF0ZWQgICA9IEZBTFNFOwogICAgICAgdHRfbWV0cmljcy0+c3RyZXRjaGVkID0gRkFMU0U7CiAKLSAgICAgIC8qIHNldCBkZWZhdWx0IGVuZ2luZSBjb21wZW5zYXRpb24gKi8KLSAgICAgIHR0X21ldHJpY3MtPmNvbXBlbnNhdGlvbnNbMF0gPSAwOyAgIC8qIGdyYXkgICAgICovCi0gICAgICB0dF9tZXRyaWNzLT5jb21wZW5zYXRpb25zWzFdID0gMDsgICAvKiBibGFjayAgICAqLwotICAgICAgdHRfbWV0cmljcy0+Y29tcGVuc2F0aW9uc1syXSA9IDA7ICAgLyogd2hpdGUgICAgKi8KLSAgICAgIHR0X21ldHJpY3MtPmNvbXBlbnNhdGlvbnNbM10gPSAwOyAgIC8qIHJlc2VydmVkICovCisgICAgICAvKiBTZXQgZGVmYXVsdCBlbmdpbmUgY29tcGVuc2F0aW9uLiAgVmFsdWUgMyBpcyBub3QgZGVzY3JpYmVkICovCisgICAgICAvKiBpbiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAoYXMgb2YgTWFpIDIwMTkpLCBidXQgR3JlZyAgICovCisgICAgICAvKiBzYXlzIHRoYXQgTVMgaGFuZGxlcyBpdCB0aGUgc2FtZSBhcyBgZ3JheScuICAgICAgICAgICAgICAgICovCisgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAvKiBUaGUgQXBwbGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgdGhlIGNvbXBlbnNhdGlvbiBmb3IgICAgICovCisgICAgICAvKiBgZ3JheScgaXMgYWx3YXlzIHplcm8uICBGcmVlVHlwZSBkb2Vzbid0IGRvIGFueSAgICAgICAgICAgICovCisgICAgICAvKiBjb21wZW5zYXRpb24gYXQgYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICB0dF9tZXRyaWNzLT5jb21wZW5zYXRpb25zWzBdID0gMDsgICAvKiBncmF5ICAqLworICAgICAgdHRfbWV0cmljcy0+Y29tcGVuc2F0aW9uc1sxXSA9IDA7ICAgLyogYmxhY2sgKi8KKyAgICAgIHR0X21ldHJpY3MtPmNvbXBlbnNhdGlvbnNbMl0gPSAwOyAgIC8qIHdoaXRlICovCisgICAgICB0dF9tZXRyaWNzLT5jb21wZW5zYXRpb25zWzNdID0gMDsgICAvKiB6ZXJvICAqLwogICAgIH0KIAogICAgIC8qIGFsbG9jYXRlIGZ1bmN0aW9uIGRlZnMsIGluc3RydWN0aW9uIGRlZnMsIGN2dCwgYW5kIHN0b3JhZ2UgYXJlYSAqLwpAQCAtMTE1NiwxNCArMTE5MSw4IEBACiAgICAgaWYgKCBzaXplLT5jdnRfcmVhZHkgPCAwICkKICAgICB7CiAgICAgICBGVF9VSW50ICBpOwotICAgICAgVFRfRmFjZSAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKIAogCi0gICAgICAvKiBTY2FsZSB0aGUgY3Z0IHZhbHVlcyB0byB0aGUgbmV3IHBwZW0uICAgICAgICAgICovCi0gICAgICAvKiBXZSB1c2UgYnkgZGVmYXVsdCB0aGUgeSBwcGVtIHRvIHNjYWxlIHRoZSBDVlQuICovCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHNpemUtPmN2dF9zaXplOyBpKysgKQotICAgICAgICBzaXplLT5jdnRbaV0gPSBGVF9NdWxGaXgoIGZhY2UtPmN2dFtpXSwgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICk7Ci0KICAgICAgIC8qIGFsbCB0d2lsaWdodCBwb2ludHMgYXJlIG9yaWdpbmFsbHkgemVybyAqLwogICAgICAgZm9yICggaSA9IDA7IGkgPCAoRlRfVUludClzaXplLT50d2lsaWdodC5uX3BvaW50czsgaSsrICkKICAgICAgIHsKQEAgLTExOTEsMjAgKzEyMjAsMjEgQEAKICNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBuZXcgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9zaXplX2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemUgYSBuZXcgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBzaXplIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9zaXplX2luaXQoIEZUX1NpemUgIHR0c2l6ZSApICAgICAgICAgICAvKiBUVF9TaXplICovCiAgIHsKQEAgLTEyMjQsMTcgKzEyNTQsMTggQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNpemUgb2JqZWN0IGZpbmFsaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X3NpemVfZG9uZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgVGhlIFRydWVUeXBlIHNpemUgb2JqZWN0IGZpbmFsaXplci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHNpemUgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIHZvaWQgKQogICB0dF9zaXplX2RvbmUoIEZUX1NpemUgIHR0c2l6ZSApICAgICAgICAgICAvKiBUVF9TaXplICovCiAgIHsKQEAgLTEyNDksMjIgKzEyODAsMjQgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9yZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzZXQgYSBUcnVlVHlwZSBzaXplIHdoZW4gcmVzb2x1dGlvbnMgYW5kIGNoYXJhY3RlciBkaW1lbnNpb25zICAgICovCi0gIC8qICAgIGhhdmUgYmVlbiBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb25seV9oZWlnaHQgOjogT25seSByZWNvbXB1dGUgYXNjZW5kZXIsIGRlc2NlbmRlciwgYW5kIGhlaWdodDsgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoaXMgZmxhZyBpcyB1c2VkIGZvciB2YXJpYXRpb24gZm9udHMgd2hlcmUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBgdHRfc2l6ZV9yZXNldCcgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciBmdW5jdGlvbi4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfc2l6ZV9yZXNldAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgUmVzZXQgYSBUcnVlVHlwZSBzaXplIHdoZW4gcmVzb2x1dGlvbnMgYW5kIGNoYXJhY3RlciBkaW1lbnNpb25zCisgICAqICAgaGF2ZSBiZWVuIGNoYW5nZWQuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBzaXplIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNpemUgb2JqZWN0LgorICAgKgorICAgKiAgIG9ubHlfaGVpZ2h0IDo6CisgICAqICAgICBPbmx5IHJlY29tcHV0ZSBhc2NlbmRlciwgZGVzY2VuZGVyLCBhbmQgaGVpZ2h0OworICAgKiAgICAgdGhpcyBmbGFnIGlzIHVzZWQgZm9yIHZhcmlhdGlvbiBmb250cyB3aGVyZQorICAgKiAgICAgYHR0X3NpemVfcmVzZXQnIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IgZnVuY3Rpb24uCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfc2l6ZV9yZXNldCggVFRfU2l6ZSAgc2l6ZSwKICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgb25seV9oZWlnaHQgKQpAQCAtMTM1OCwyMCArMTM5MSwyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kcml2ZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZHJpdmVyX2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemUgYSBnaXZlbiBUcnVlVHlwZSBkcml2ZXIgb2JqZWN0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZHJpdmVyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICB0dGRyaXZlciApICAgICAvKiBUVF9Ecml2ZXIgKi8KICAgewpAQCAtMTM5OCwxNyArMTQzMiwxOCBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kcml2ZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBUcnVlVHlwZSBkcml2ZXIuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZHJpdmVyX2RvbmUKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEZpbmFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZHJpdmVyIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFRydWVUeXBlIGRyaXZlci4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIHR0X2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIHR0ZHJpdmVyICkgICAgIC8qIFRUX0RyaXZlciAqLwogICB7CkBAIC0xNDE2LDIwICsxNDUxLDIxIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3Nsb3RfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBuZXcgc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogQSBoYW5kbGUgdG8gdGhlIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9zbG90X2luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemUgYSBuZXcgc2xvdCBvYmplY3QuCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBzbG90IDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgc2xvdCBvYmplY3QuCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCiAgIHsKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dG9ianMuaCBiL3NyYy90cnVldHlwZS90dG9ianMuaAppbmRleCAzOGZhMzBlLi5kOTg2ZGVhIDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmgKKysrIGIvc3JjL3RydWV0eXBlL3R0b2Jqcy5oCkBAIC0xLDY3ICsxLDY2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0dG9ianMuaAorICoKKyAqICAgT2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVFRPQkpTX0hfCiAjZGVmaW5lIFRUT0JKU19IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRHJpdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFR5cGU6CisgICAqICAgVFRfRHJpdmVyCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGRyaXZlciBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBUVF9Ecml2ZXJSZWNfKiAgVFRfRHJpdmVyOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhIGRpcmVjdCB0eXBlZGVmIG9mIEZUX0dseXBoU2xvdCwgYXMgdGhlcmUgaXMgbm90aGluZyAgICAgICovCi0gIC8qICAgIHNwZWNpZmljIGFib3V0IHRoZSBUcnVlVHlwZSBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBUeXBlOgorICAgKiAgIFRUX0dseXBoU2xvdAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBUcnVlVHlwZSBnbHlwaCBzbG90IG9iamVjdC4KKyAgICoKKyAgICogQE5vdGU6CisgICAqICAgVGhpcyBpcyBhIGRpcmVjdCB0eXBlZGVmIG9mIEZUX0dseXBoU2xvdCwgYXMgdGhlcmUgaXMgbm90aGluZworICAgKiAgIHNwZWNpZmljIGFib3V0IHRoZSBUcnVlVHlwZSBnbHlwaCBzbG90LgorICAgKi8KICAgdHlwZWRlZiBGVF9HbHlwaFNsb3QgIFRUX0dseXBoU2xvdDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dyYXBoaWNzU3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBncmFwaGljcyBzdGF0ZSB1c2VkIGR1cmluZyBieXRlY29kZSBpbnRlcnByZXRhdGlvbi4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBTdHJ1Y3Q6CisgICAqICAgVFRfR3JhcGhpY3NTdGF0ZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgVGhlIFRydWVUeXBlIGdyYXBoaWNzIHN0YXRlIHVzZWQgZHVyaW5nIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dyYXBoaWNzU3RhdGVfCiAgIHsKICAgICBGVF9VU2hvcnQgICAgICBycDA7CkBAIC0xMTMsMjUgKzExMiwyNSBAQAogCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBFWEVDVVRJT04gU1VCVEFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZXNlIHN1Yi10YWJsZXMgcmVsYXRlIHRvIGluc3RydWN0aW9uIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEVYRUNVVElPTiBTVUJUQUJMRVMKKyAgICoKKyAgICogVGhlc2Ugc3ViLXRhYmxlcyByZWxhdGUgdG8gaW5zdHJ1Y3Rpb24gZXhlY3V0aW9uLgorICAgKgorICAgKi8KIAogCiAjZGVmaW5lIFRUX01BWF9DT0RFX1JBTkdFUyAgMwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBjYW4gb25seSBiZSAzIGFjdGl2ZSBjb2RlIHJhbmdlcyBhdCBvbmNlOiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIHRoZSBGb250IFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSB0aGUgQ1ZUIFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gYSBnbHlwaCdzIGluc3RydWN0aW9ucyBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGVyZSBjYW4gb25seSBiZSAzIGFjdGl2ZSBjb2RlIHJhbmdlcyBhdCBvbmNlOgorICAgKiAgIC0gdGhlIEZvbnQgUHJvZ3JhbQorICAgKiAgIC0gdGhlIENWVCBQcm9ncmFtCisgICAqICAgLSBhIGdseXBoJ3MgaW5zdHJ1Y3Rpb25zIHNldAorICAgKi8KICAgdHlwZWRlZiBlbnVtICBUVF9Db2RlUmFuZ2VfVGFnXwogICB7CiAgICAgdHRfY29kZXJhbmdlX25vbmUgPSAwLApAQCAtMTUyLDEwICsxNTEsMTAgQEAKICAgdHlwZWRlZiBUVF9Db2RlUmFuZ2UgIFRUX0NvZGVSYW5nZVRhYmxlW1RUX01BWF9DT0RFX1JBTkdFU107CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZXMgYSBmdW5jdGlvbi9pbnN0cnVjdGlvbiBkZWZpbml0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIERlZmluZXMgYSBmdW5jdGlvbi9pbnN0cnVjdGlvbiBkZWZpbml0aW9uIHJlY29yZC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUVF9EZWZSZWNvcmRfCiAgIHsKICAgICBGVF9JbnQgICAgcmFuZ2U7ICAgICAgICAgIC8qIGluIHdoaWNoIGNvZGUgcmFuZ2UgaXMgaXQgbG9jYXRlZD8gICAgICovCkBAIC0xNjksMTAgKzE2OCwxMCBAQAogICB9IFRUX0RlZlJlY29yZCwgKlRUX0RlZkFycmF5OwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTdWJnbHlwaCB0cmFuc2Zvcm1hdGlvbiByZWNvcmQuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfVHJhbnNmb3JtXwogICB7CiAgICAgRlRfRml4ZWQgICAgeHgsIHh5OyAgICAgLyogdHJhbnNmb3JtYXRpb24gbWF0cml4IGNvZWZmaWNpZW50cyAqLwpAQCAtMTgyLDcyICsxODEsNzIgQEAKICAgfSBUVF9UcmFuc2Zvcm07CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgbm90ZSByZWdhcmRpbmcgbm9uLXNxdWFyZWQgcGl4ZWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKFRoaXMgdGV4dCB3aWxsIHByb2JhYmx5IGdvIGludG8gc29tZSBkb2NzIGF0IHNvbWUgdGltZTsgZm9yIG5vdywgaXQgICovCi0gIC8qIGlzIGtlcHQgaGVyZSB0byBleHBsYWluIHNvbWUgZGVmaW5pdGlvbnMgaW4gdGhlIFRUX1NpemVfTWV0cmljcyAgICAgICAqLwotICAvKiByZWNvcmQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBDVlQgaXMgYSBvbmUtZGltZW5zaW9uYWwgYXJyYXkgY29udGFpbmluZyB2YWx1ZXMgdGhhdCBjb250cm9sICAgICAqLwotICAvKiBjZXJ0YWluIGltcG9ydGFudCBjaGFyYWN0ZXJpc3RpY3MgaW4gYSBmb250LCBsaWtlIHRoZSBoZWlnaHQgb2YgYWxsICAgKi8KLSAgLyogY2FwaXRhbHMsIGFsbCBsb3dlcmNhc2UgbGV0dGVyLCBkZWZhdWx0IHNwYWNpbmcgb3Igc3RlbSB3aWR0aC9oZWlnaHQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSB2YWx1ZXMgYXJlIGZvdW5kIGluIEZVbml0cyBpbiB0aGUgZm9udCBmaWxlLCBhbmQgbXVzdCBiZSBzY2FsZWQgKi8KLSAgLyogdG8gcGl4ZWwgY29vcmRpbmF0ZXMgYmVmb3JlIGJlaW5nIHVzZWQgYnkgdGhlIENWVCBhbmQgZ2x5cGggcHJvZ3JhbXMuICovCi0gIC8qIFVuZm9ydHVuYXRlbHksIHdoZW4gdXNpbmcgZGlzdGluY3QgeCBhbmQgeSByZXNvbHV0aW9ucyAob3IgZGlzdGluY3QgeCAqLwotICAvKiBhbmQgeSBwb2ludHNpemVzKSwgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzY2FsaW5ncy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgZmlyc3QgdHJ5IHdhcyB0byBpbXBsZW1lbnQgYSBgbGF6eScgc2NoZW1lIHdoZXJlIGFsbCB2YWx1ZXMgd2VyZSAgICAqLwotICAvKiBzY2FsZWQgd2hlbiBmaXJzdCB1c2VkLiAgSG93ZXZlciwgd2hpbGUgc29tZSB2YWx1ZXMgYXJlIGFsd2F5cyB1c2VkICAgKi8KLSAgLyogaW4gdGhlIHNhbWUgZGlyZWN0aW9uLCBzb21lIG90aGVycyBhcmUgdXNlZCB1bmRlciBtYW55IGRpZmZlcmVudCAgICAgICovCi0gIC8qIGNpcmN1bXN0YW5jZXMgYW5kIG9yaWVudGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSSBoYXZlIGZvdW5kIGEgc2ltcGxlciB3YXkgdG8gZG8gdGhlIHNhbWUsIGFuZCBpdCBldmVuIHNlZW1zIHRvIHdvcmsgICovCi0gIC8qIGluIG1vc3Qgb2YgdGhlIGNhc2VzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBBbGwgQ1ZUIHZhbHVlcyBhcmUgc2NhbGVkIHRvIHRoZSBtYXhpbXVtIHBwZW0gc2l6ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIFdoZW4gcGVyZm9ybWluZyBhIHJlYWQgb3Igd3JpdGUgaW4gdGhlIENWVCwgYSByYXRpbyBmYWN0b3IgaXMgdXNlZCAgKi8KLSAgLyogICB0byBwZXJmb3JtIGFkZXF1YXRlIHNjYWxpbmcuICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeF9wcGVtID0gMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHlfcHBlbSA9IDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdlIGNob29zZSBwcGVtID0geF9wcGVtID0gMTQgYXMgdGhlIENWVCBzY2FsaW5nIHNpemUuICBBbGwgY3Z0ICAgICAgKi8KLSAgLyogICBlbnRyaWVzIGFyZSBzY2FsZWQgdG8gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgeF9yYXRpbyA9IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHlfcmF0aW8gPSB5X3BwZW0vcHBlbSAoPCAxLjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdlIGNvbXB1dGUgdGhlIGN1cnJlbnQgcmF0aW8gbGlrZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBJZiBwcm9qVmVjdG9yIGlzIGhvcml6b250YWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICByYXRpbyA9IHhfcmF0aW8gPSAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBpZiBwcm9qVmVjdG9yIGlzIHZlcnRpY2FsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICByYXRpbyA9IHlfcmF0aW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBlbHNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICByYXRpbyA9IHNxcnQoIChwcm9qLnggKiB4X3JhdGlvKSBeIDIgKyAocHJvai55ICogeV9yYXRpbykgXiAyICkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmVhZGluZyBhIGN2dCB2YWx1ZSByZXR1cm5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcmF0aW8gKiBjdnRbaW5kZXhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgV3JpdGluZyBhIGN2dCB2YWx1ZSBpbiBwaXhlbHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY3Z0W2luZGV4XSAvIHJhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGN1cnJlbnQgcHBlbSBpcyBzaW1wbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcmF0aW8gKiBwcGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQSBub3RlIHJlZ2FyZGluZyBub24tc3F1YXJlZCBwaXhlbHM6CisgICAqCisgICAqIChUaGlzIHRleHQgd2lsbCBwcm9iYWJseSBnbyBpbnRvIHNvbWUgZG9jcyBhdCBzb21lIHRpbWU7IGZvciBub3csIGl0CisgICAqIGlzIGtlcHQgaGVyZSB0byBleHBsYWluIHNvbWUgZGVmaW5pdGlvbnMgaW4gdGhlIFRUX1NpemVfTWV0cmljcworICAgKiByZWNvcmQpLgorICAgKgorICAgKiBUaGUgQ1ZUIGlzIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgY29udHJvbAorICAgKiBjZXJ0YWluIGltcG9ydGFudCBjaGFyYWN0ZXJpc3RpY3MgaW4gYSBmb250LCBsaWtlIHRoZSBoZWlnaHQgb2YgYWxsCisgICAqIGNhcGl0YWxzLCBhbGwgbG93ZXJjYXNlIGxldHRlciwgZGVmYXVsdCBzcGFjaW5nIG9yIHN0ZW0gd2lkdGgvaGVpZ2h0LgorICAgKgorICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGZvdW5kIGluIEZVbml0cyBpbiB0aGUgZm9udCBmaWxlLCBhbmQgbXVzdCBiZSBzY2FsZWQKKyAgICogdG8gcGl4ZWwgY29vcmRpbmF0ZXMgYmVmb3JlIGJlaW5nIHVzZWQgYnkgdGhlIENWVCBhbmQgZ2x5cGggcHJvZ3JhbXMuCisgICAqIFVuZm9ydHVuYXRlbHksIHdoZW4gdXNpbmcgZGlzdGluY3QgeCBhbmQgeSByZXNvbHV0aW9ucyAob3IgZGlzdGluY3QgeAorICAgKiBhbmQgeSBwb2ludHNpemVzKSwgdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzY2FsaW5ncy4KKyAgICoKKyAgICogQSBmaXJzdCB0cnkgd2FzIHRvIGltcGxlbWVudCBhIGBsYXp5JyBzY2hlbWUgd2hlcmUgYWxsIHZhbHVlcyB3ZXJlCisgICAqIHNjYWxlZCB3aGVuIGZpcnN0IHVzZWQuICBIb3dldmVyLCB3aGlsZSBzb21lIHZhbHVlcyBhcmUgYWx3YXlzIHVzZWQKKyAgICogaW4gdGhlIHNhbWUgZGlyZWN0aW9uLCBzb21lIG90aGVycyBhcmUgdXNlZCB1bmRlciBtYW55IGRpZmZlcmVudAorICAgKiBjaXJjdW1zdGFuY2VzIGFuZCBvcmllbnRhdGlvbnMuCisgICAqCisgICAqIEkgaGF2ZSBmb3VuZCBhIHNpbXBsZXIgd2F5IHRvIGRvIHRoZSBzYW1lLCBhbmQgaXQgZXZlbiBzZWVtcyB0byB3b3JrCisgICAqIGluIG1vc3Qgb2YgdGhlIGNhc2VzOgorICAgKgorICAgKiAtIEFsbCBDVlQgdmFsdWVzIGFyZSBzY2FsZWQgdG8gdGhlIG1heGltdW0gcHBlbSBzaXplLgorICAgKgorICAgKiAtIFdoZW4gcGVyZm9ybWluZyBhIHJlYWQgb3Igd3JpdGUgaW4gdGhlIENWVCwgYSByYXRpbyBmYWN0b3IgaXMgdXNlZAorICAgKiAgIHRvIHBlcmZvcm0gYWRlcXVhdGUgc2NhbGluZy4gIEV4YW1wbGU6CisgICAqCisgICAqICAgICB4X3BwZW0gPSAxNAorICAgKiAgICAgeV9wcGVtID0gMTAKKyAgICoKKyAgICogICBXZSBjaG9vc2UgcHBlbSA9IHhfcHBlbSA9IDE0IGFzIHRoZSBDVlQgc2NhbGluZyBzaXplLiAgQWxsIGN2dAorICAgKiAgIGVudHJpZXMgYXJlIHNjYWxlZCB0byBpdC4KKyAgICoKKyAgICogICAgIHhfcmF0aW8gPSAxLjAKKyAgICogICAgIHlfcmF0aW8gPSB5X3BwZW0vcHBlbSAoPCAxLjApCisgICAqCisgICAqICAgV2UgY29tcHV0ZSB0aGUgY3VycmVudCByYXRpbyBsaWtlOgorICAgKgorICAgKiAgIC0gSWYgcHJvalZlY3RvciBpcyBob3Jpem9udGFsLAorICAgKiAgICAgICByYXRpbyA9IHhfcmF0aW8gPSAxLjAKKyAgICoKKyAgICogICAtIGlmIHByb2pWZWN0b3IgaXMgdmVydGljYWwsCisgICAqICAgICAgIHJhdGlvID0geV9yYXRpbworICAgKgorICAgKiAgIC0gZWxzZSwKKyAgICogICAgICAgcmF0aW8gPSBzcXJ0KCAocHJvai54ICogeF9yYXRpbykgXiAyICsgKHByb2oueSAqIHlfcmF0aW8pIF4gMiApCisgICAqCisgICAqICAgUmVhZGluZyBhIGN2dCB2YWx1ZSByZXR1cm5zCisgICAqICAgICByYXRpbyAqIGN2dFtpbmRleF0KKyAgICoKKyAgICogICBXcml0aW5nIGEgY3Z0IHZhbHVlIGluIHBpeGVsczoKKyAgICogICAgIGN2dFtpbmRleF0gLyByYXRpbworICAgKgorICAgKiAgIFRoZSBjdXJyZW50IHBwZW0gaXMgc2ltcGx5CisgICAqICAgICByYXRpbyAqIHBwZW0KKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1ldHJpY3MgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgc2l6ZSBhbmQgY29udGV4dCBvYmplY3RzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIE1ldHJpY3MgdXNlZCBieSB0aGUgVHJ1ZVR5cGUgc2l6ZSBhbmQgY29udGV4dCBvYmplY3RzLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NpemVfTWV0cmljc18KICAgewogICAgIC8qIGZvciBub24tc3F1YXJlIHBpeGVscyAqLwpAQCAtMjY4LDEwICsyNjcsMTAgQEAKICAgfSBUVF9TaXplX01ldHJpY3M7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRydWVUeXBlIHNpemUgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRydWVUeXBlIHNpemUgY2xhc3MuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZVJlY18KICAgewogICAgIEZUX1NpemVSZWMgICAgICAgICByb290OwpAQCAtMzI0LDEwICszMjMsMTAgQEAKICAgfSBUVF9TaXplUmVjOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBkcml2ZXIgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUcnVlVHlwZSBkcml2ZXIgY2xhc3MuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCAgVFRfRHJpdmVyUmVjXwogICB7CiAgICAgRlRfRHJpdmVyUmVjICByb290OwpAQCAtMzQ4LDEwICszNDcsMTAgQEAKICAgLyogd2lsbCBhbHdheXMgdXNlIHRoZSBUVCBkcml2ZXIgdG8gY3JlYXRlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEZhY2UgZnVuY3Rpb25zCisgICAqLwogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICB0dF9mYWNlX2luaXQoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICB0dGZhY2UsICAgICAgLyogVFRfRmFjZSAqLwpAQCAtMzYzLDEwICszNjIsMTAgQEAKICAgdHRfZmFjZV9kb25lKCBGVF9GYWNlICB0dGZhY2UgKTsgICAgICAgICAgLyogVFRfRmFjZSAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTaXplIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBTaXplIGZ1bmN0aW9ucworICAgKi8KICAgRlRfTE9DQUwoIEZUX0Vycm9yICkKICAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwogCkBAIC0zOTQsMTAgKzM5MywxMCBAQAogICAgICAgICAgICAgICAgICBGVF9Cb29sICBvbmx5X2hlaWdodCApOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEcml2ZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEcml2ZXIgZnVuY3Rpb25zCisgICAqLwogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICB0dF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICB0dGRyaXZlciApOyAgICAvKiBUVF9Ecml2ZXIgKi8KIApAQCAtNDA1LDEwICs0MDQsMTAgQEAKICAgdHRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgdHRkcml2ZXIgKTsgICAgLyogVFRfRHJpdmVyICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNsb3QgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFNsb3QgZnVuY3Rpb25zCisgICAqLwogICBGVF9MT0NBTCggRlRfRXJyb3IgKQogICB0dF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwogCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRwaWMuYyBiL3NyYy90cnVldHlwZS90dHBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJiODA2Li4wMDAwMDAwCi0tLSBhL3NyYy90cnVldHlwZS90dHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgdHJ1ZXR5cGUgbW9kdWxlLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJ0dHBpYy5oIgotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSB0dGRyaXZlci5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3R0X3NlcnZpY2VzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3R0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycygKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyogIHN2X21tICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYoCi0gICAgRlRfU2VydmljZV9UVEdseWZSZWMqICBzdl90dGdseWYgKTsKLQotCi0gIHZvaWQKLSAgdHRfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgKQotICAgIHsKLSAgICAgIFRUTW9kdWxlUElDKiAgY29udGFpbmVyID0gKFRUTW9kdWxlUElDKilwaWNfY29udGFpbmVyLT50cnVldHlwZTsKLQotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+dHRfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3R0X3NlcnZpY2VzKCBsaWJyYXJ5LCBjb250YWluZXItPnR0X3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnR0X3NlcnZpY2VzID0gTlVMTDsKLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgdHRfZHJpdmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgVFRNb2R1bGVQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgPSBjb250YWluZXI7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgKi8KLSAgICAvKiBleHBlY3RzIHRoaXMgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc190dF9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lci0+dHRfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMoCi0gICAgICAmY29udGFpbmVyLT50dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMgKTsKLSNlbmRpZgotICAgIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV90cnVldHlwZV9nbHlmKAotICAgICAgJmNvbnRhaW5lci0+dHRfc2VydmljZV90cnVldHlwZV9nbHlmICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHR0X2RyaXZlcl9jbGFzc19waWNfZnJlZSggbGlicmFyeSApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHBpYy5oIGIvc3JjL3RydWV0eXBlL3R0cGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODc4YWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RydWV0eXBlL3R0cGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHRydWV0eXBlIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgVFRQSUNfSF8KLSNkZWZpbmUgVFRQSUNfSF8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBUVF9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgIHR0X3NlcnZpY2VzCi0jZGVmaW5lIFRUX1NFUlZJQ0VfR1hfTVVMVElfTUFTVEVSU19HRVQgICAgdHRfc2VydmljZV9neF9tdWx0aV9tYXN0ZXJzCi0jZGVmaW5lIFRUX1NFUlZJQ0VfTUVUUklDU19WQVJJQVRJT05TX0dFVCAgdHRfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnMKLSNkZWZpbmUgVFRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0dFVCAgICAgICB0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYKLSNkZWZpbmUgVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICAgICB0dF9zZXJ2aWNlX3Byb3BlcnRpZXMKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NRVRSSUNTX1ZBUklBVElPTlNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICAgICAgICAgICAgdHRfc2VydmljZXM7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjICAgICAgIHR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVyczsKLSAgICBGVF9TZXJ2aWNlX01ldHJpY3NWYXJpYXRpb25zUmVjICB0dF9zZXJ2aWNlX21ldHJpY3NfdmFyaWF0aW9uczsKLSNlbmRpZgotICAgIEZUX1NlcnZpY2VfVFRHbHlmUmVjICAgICAgICAgICAgIHR0X3NlcnZpY2VfdHJ1ZXR5cGVfZ2x5ZjsKLSAgICBGVF9TZXJ2aWNlX1Byb3BlcnRpZXNSZWMgICAgICAgICB0dF9zZXJ2aWNlX3Byb3BlcnRpZXM7Ci0KLSAgfSBUVE1vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoVFRNb2R1bGVQSUMqKSgobGliKS0+cGljX2NvbnRhaW5lci50cnVldHlwZSkgKQotI2RlZmluZSBUVF9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZXMgKQotI2RlZmluZSBUVF9TRVJWSUNFX01FVFJJQ1NfVkFSSUFUSU9OU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZV9tZXRyaWNzX3ZhcmlhdGlvbnMgKQotI2RlZmluZSBUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyApCi0jZGVmaW5lIFRUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZV90cnVldHlwZV9nbHlmICkKLSNkZWZpbmUgVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9zZXJ2aWNlX3Byb3BlcnRpZXMgKQotCi0KLSAgLyogc2VlIHR0cGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIFRUUElDX0hfICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jIGIvc3JjL3RydWV0eXBlL3R0cGxvYWQuYwppbmRleCBkOTUyNmFkLi5iMTI1NWI4IDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jCisrKyBiL3NyYy90cnVldHlwZS90dHBsb2FkLmMKQEAgLTEsMjYgKzEsMjUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGxvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0cGxvYWQuYworICoKKyAqICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0dGFncy5oPgogCiAjaW5jbHVkZSAidHRwbG9hZC5oIgogCkBAIC0zMSwzMyArMzAsMzUgQEAKICNpbmNsdWRlICJ0dGVycm9ycy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0cGxvYWQKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0dHBsb2FkCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbG9jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBsb2NhdGlvbnMgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgdHRfZmFjZV9sb2FkX2xvY2EKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIExvYWQgdGhlIGxvY2F0aW9ucyB0YWJsZS4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfbG9jYSggVFRfRmFjZSAgICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQpAQCAtMTIyLDcgKzEyMyw3IEBACiAKICAgICBpZiAoIGZhY2UtPm51bV9sb2NhdGlvbnMgIT0gKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2dseXBocyArIDEgKQogICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJnbHlwaCBjb3VudCBtaXNtYXRjaCEgIGxvY2E6ICVkLCBtYXhwOiAlZFxuIiwKKyAgICAgIEZUX1RSQUNFMigoICJnbHlwaCBjb3VudCBtaXNtYXRjaCEgIGxvY2E6ICVsZCwgbWF4cDogJWxkXG4iLAogICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyAtIDEsIGZhY2UtPnJvb3QubnVtX2dseXBocyApKTsKIAogICAgICAgLyogd2Ugb25seSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYG1heHAnIGdpdmVzIGEgbGFyZ2VyIHZhbHVlICovCkBAIC0xNjMsNyArMTY0LDcgQEAKICAgICAgICAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2dseXBocyArIDE7CiAgICAgICAgICAgdGFibGVfbGVuICAgICAgICAgICA9IG5ld19sb2NhX2xlbjsKIAotICAgICAgICAgIEZUX1RSQUNFMigoICJhZGp1c3RpbmcgbnVtX2xvY2F0aW9ucyB0byAlZFxuIiwKKyAgICAgICAgICBGVF9UUkFDRTIoKCAiYWRqdXN0aW5nIG51bV9sb2NhdGlvbnMgdG8gJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtMTcxLDcgKzE3Miw3IEBACiAgICAgICAgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gZmFjZS0+bnVtX2xvY2F0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlRfTG9uZylmYWNlLT5udW1fbG9jYXRpb25zIC0gMSA6IDA7CiAKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiYWRqdXN0aW5nIG51bV9nbHlwaHMgdG8gJWRcbiIsCisgICAgICAgICAgRlRfVFJBQ0UyKCggImFkanVzdGluZyBudW1fZ2x5cGhzIHRvICVsZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290Lm51bV9nbHlwaHMgKSk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTIzNiw3ICsyMzcsNyBAQAogICAgIGlmICggcG9zMSA+IGZhY2UtPmdseWZfbGVuICkKICAgICB7CiAgICAgICBGVF9UUkFDRTEoKCAidHRfZmFjZV9nZXRfbG9jYXRpb246IgotICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2Ugb2Zmc2V0ICgweCUwOGx4KSBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWxkLFxuIgorICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2Ugb2Zmc2V0ICgweCUwOGx4KSBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWQsXG4iCiAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIgogICAgICAgICAgICAgICAgICAgIiBleGNlZWRpbmcgdGhlIGVuZCBvZiBgZ2x5ZicgdGFibGUgKDB4JTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgcG9zMSwgZ2luZGV4LCBmYWNlLT5nbHlmX2xlbiApKTsKQEAgLTI1MCw3ICsyNTEsNyBAQAogICAgICAgaWYgKCBnaW5kZXggPT0gZmFjZS0+bnVtX2xvY2F0aW9ucyAtIDIgKQogICAgICAgewogICAgICAgICBGVF9UUkFDRTEoKCAidHRfZmFjZV9nZXRfbG9jYXRpb246IgotICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBzaXplICglbGQgYnl0ZXMpIGZvdW5kIGZvciBnbHlwaCBpbmRleCAlbGQsXG4iCisgICAgICAgICAgICAgICAgICAgICIgdG9vIGxhcmdlIHNpemUgKCVsZCBieXRlcykgZm91bmQgZm9yIGdseXBoIGluZGV4ICVkLFxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgIgogICAgICAgICAgICAgICAgICAgICAiIHRydW5jYXRpbmcgYXQgdGhlIGVuZCBvZiBgZ2x5ZicgdGFibGUgdG8gJWxkIGJ5dGVzXG4iLAogICAgICAgICAgICAgICAgICAgICBwb3MyIC0gcG9zMSwgZ2luZGV4LCBmYWNlLT5nbHlmX2xlbiAtIHBvczEgKSk7CkBAIC0yNTksNyArMjYwLDcgQEAKICAgICAgIGVsc2UKICAgICAgIHsKICAgICAgICAgRlRfVFJBQ0UxKCggInR0X2ZhY2VfZ2V0X2xvY2F0aW9uOiIKLSAgICAgICAgICAgICAgICAgICAgIiB0b28gbGFyZ2Ugb2Zmc2V0ICgweCUwOGx4KSBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWxkLFxuIgorICAgICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBvZmZzZXQgKDB4JTA4bHgpIGZvdW5kIGZvciBnbHlwaCBpbmRleCAlZCxcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKICAgICAgICAgICAgICAgICAgICAgIiBleGNlZWRpbmcgdGhlIGVuZCBvZiBgZ2x5ZicgdGFibGUgKDB4JTA4bHgpXG4iLAogICAgICAgICAgICAgICAgICAgICBwb3MyLCBnaW5kZXggKyAxLCBmYWNlLT5nbHlmX2xlbiApKTsKQEAgLTI5NywyMyArMjk4LDI1IEBACiAKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9jdnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGNvbnRyb2wgdmFsdWUgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfY3Z0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBjb250cm9sIHZhbHVlIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogQEluT3V0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uCisgICAqCisgICAqIEBSZXR1cm46CisgICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQogICB0dF9mYWNlX2xvYWRfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTM0OCwxMiArMzUxLDEyIEBACiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICB7Ci0gICAgICBGVF9TaG9ydCogIGN1ciAgID0gZmFjZS0+Y3Z0OwotICAgICAgRlRfU2hvcnQqICBsaW1pdCA9IGN1ciArIGZhY2UtPmN2dF9zaXplOworICAgICAgRlRfSW50MzIqICBjdXIgICA9IGZhY2UtPmN2dDsKKyAgICAgIEZUX0ludDMyKiAgbGltaXQgPSBjdXIgKyBmYWNlLT5jdnRfc2l6ZTsKIAogCiAgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICAgICpjdXIgPSBGVF9HRVRfU0hPUlQoKTsKKyAgICAgICAgKmN1ciA9IEZUX0dFVF9TSE9SVCgpICogNjQ7CiAgICAgfQogCiAgICAgRlRfRlJBTUVfRVhJVCgpOwpAQCAtMzc4LDIzICszODEsMjUgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2ZwZ20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgZm9udCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9mcGdtCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBmb250IHByb2dyYW0uCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9sb2FkX2ZwZ20oIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTQyMyw3ICs0MjgsNyBAQAogICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9sZW4sIGZhY2UtPmZvbnRfcHJvZ3JhbSApICkKICAgICAgICAgZ290byBFeGl0OwogCi0gICAgICBGVF9UUkFDRTIoKCAibG9hZGVkLCAlMTJkIGJ5dGVzXG4iLCBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSApKTsKKyAgICAgIEZUX1RSQUNFMigoICJsb2FkZWQsICUxMmxkIGJ5dGVzXG4iLCBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSApKTsKICAgICB9CiAKICAgRXhpdDoKQEAgLTQ0MCwyMyArNDQ1LDI1IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wcmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGN2dCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICB0dF9mYWNlX2xvYWRfcHJlcAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgTG9hZCB0aGUgY3Z0IHByb2dyYW0uCisgICAqCisgICAqIEBJbk91dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgc3RyZWFtIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9sb2FkX3ByZXAoIFRUX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKQEAgLTQ4NCw3ICs0OTEsNyBAQAogICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9sZW4sIGZhY2UtPmN2dF9wcm9ncmFtICkgKQogICAgICAgICBnb3RvIEV4aXQ7CiAKLSAgICAgIEZUX1RSQUNFMigoICJsb2FkZWQsICUxMmQgYnl0ZXNcbiIsIGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgKSk7CisgICAgICBGVF9UUkFDRTIoKCAibG9hZGVkLCAlMTJsZCBieXRlc1xuIiwgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApKTsKICAgICB9CiAKICAgRXhpdDoKQEAgLTUwMSwyMiArNTA4LDI0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9oZG14ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGBoZG14JyB0YWJsZSBpbnRvIHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQEZ1bmN0aW9uOgorICAgKiAgIHR0X2ZhY2VfbG9hZF9oZG14CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBMb2FkIHRoZSBgaGRteCcgdGFibGUgaW50byB0aGUgZmFjZSBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBmYWNlIDo6CisgICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LgorICAgKgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KIAogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgdHRfZmFjZV9sb2FkX2hkbXgoIFRUX0ZhY2UgICAgZmFjZSwKQEAgLTYxMCwxMSArNjE5LDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJuIHRoZSBhZHZhbmNlIHdpZHRoIHRhYmxlIGZvciBhIGdpdmVuIHBpeGVsIHNpemUgaWYgaXQgaXMgZm91bmQgICovCi0gIC8qIGluIHRoZSBmb250J3MgYGhkbXgnIHRhYmxlIChpZiBhbnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFJldHVybiB0aGUgYWR2YW5jZSB3aWR0aCB0YWJsZSBmb3IgYSBnaXZlbiBwaXhlbCBzaXplIGlmIGl0IGlzIGZvdW5kCisgICAqIGluIHRoZSBmb250J3MgYGhkbXgnIHRhYmxlIChpZiBhbnkpLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9CeXRlKiApCiAgIHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKCBUVF9GYWNlICBmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcHBlbSwKQEAgLTYyMyw3ICs2MzIsNyBAQAogICAgIEZUX1VJbnQgICBubjsKICAgICBGVF9CeXRlKiAgcmVzdWx0ICAgICAgPSBOVUxMOwogICAgIEZUX1VMb25nICByZWNvcmRfc2l6ZSA9IGZhY2UtPmhkbXhfcmVjb3JkX3NpemU7Ci0gICAgRlRfQnl0ZSogIHJlY29yZCAgICAgID0gZmFjZS0+aGRteF90YWJsZSArIDg7CisgICAgRlRfQnl0ZSogIHJlY29yZCAgICAgID0gRlRfT0ZGU0VUKCBmYWNlLT5oZG14X3RhYmxlLCA4ICk7CiAKIAogICAgIGZvciAoIG5uID0gMDsgbm4gPCBmYWNlLT5oZG14X3JlY29yZF9jb3VudDsgbm4rKyApCmRpZmYgLS1naXQgYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oIGIvc3JjL3RydWV0eXBlL3R0cGxvYWQuaAppbmRleCBmYTEyNTI3Li5iYjY2OWUwIDEwMDY0NAotLS0gYS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCisrKyBiL3NyYy90cnVldHlwZS90dHBsb2FkLmgKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgbG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0cGxvYWQuaAorICoKKyAqICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFRUUExPQURfSF8KICNkZWZpbmUgVFRQTE9BRF9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHN1YnBpeC5jIGIvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMKaW5kZXggZDk0YmNjOC4uNTY2NjdkZSAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMKKysrIGIvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMKQEAgLTEsMjggKzEsMjcgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c3VicGl4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBTdWJwaXhlbCBIaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0c3VicGl4LmMKKyAqCisgKiAgIFRydWVUeXBlIFN1YnBpeGVsIEhpbnRpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS90dHRhZ3MuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdG91dGxuLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KIAogI2luY2x1ZGUgInR0c3VicGl4LmgiCiAKQEAgLTMwLDM1ICsyOSwzNSBAQAogI2lmIGRlZmluZWQoIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiApICAgICAgICAgICAgJiYgXAogICAgIGRlZmluZWQoIFRUX1NVUFBPUlRfU1VCUElYRUxfSElOVElOR19JTkZJTkFMSVRZICkKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIHJ1bGVzIGFmZmVjdCBob3cgdGhlIFRUIEludGVycHJldGVyIGRvZXMgaGludGluZywgd2l0aCB0aGUgICAgICAqLwotICAvKiBnb2FsIG9mIGRvaW5nIHN1YnBpeGVsIGhpbnRpbmcgYnkgKGluIGdlbmVyYWwpIGlnbm9yaW5nIHggbW92ZXMuICAgICAgKi8KLSAgLyogU29tZSBvZiB0aGVzZSBydWxlcyBhcmUgZml4ZXMgdGhhdCBnbyBhYm92ZSBhbmQgYmV5b25kIHRoZSAgICAgICAgICAgICovCi0gIC8qIHN0YXRlZCB0ZWNobmlxdWVzIGluIHRoZSBNUyB3aGl0ZXBhcGVyIG9uIENsZWFydHlwZSwgZHVlIHRvICAgICAgICAgICAqLwotICAvKiBhcnRpZmFjdHMgaW4gbWFueSBnbHlwaHMuICBTbywgdGhlc2UgcnVsZXMgbWFrZSBzb21lIGdseXBocyByZW5kZXIgICAgKi8KLSAgLyogYmV0dGVyIHRoYW4gdGhleSBkbyBpbiB0aGUgTVMgcmFzdGVyaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAiIiBzdHJpbmcgb3IgMCBpbnQvY2hhciBpbmRpY2F0ZXMgdG8gYXBwbHkgdG8gYWxsIGdseXBocy4gICAgICAgICAgICAgKi8KLSAgLyogIi0iIHVzZWQgYXMgZHVtbXkgcGxhY2Vob2xkZXJzLCBidXQgYW55IG5vbi1tYXRjaGluZyBzdHJpbmcgd29ya3MuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTb21lIG9mIHRoaXMgY291bGQgYXJndWFibHkgYmUgaW1wbGVtZW50ZWQgaW4gZm9udGNvbmZpZywgaG93ZXZlcjogICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIEZvbnRjb25maWcgY2FuJ3Qgc2V0IHRoaW5ncyBvbiBhIGdseXBoLWJ5LWdseXBoIGJhc2lzLiAgICAgICAgICAgICAqLwotICAvKiAgLSBUaGUgdHdlYWtzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHZlcnkgbG93LWxldmVsLCBmcm9tIGFuIGF2ZXJhZ2UgICAgKi8KLSAgLyogICAgdXNlcidzIHBvaW50IG9mIHZpZXcgYW5kIGFyZSBiZXN0IGltcGxlbWVudGVkIGluIHRoZSBoaW50ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZ29hbCBpcyB0byBtYWtlIHRoZSBzdWJwaXhlbCBoaW50aW5nIHRlY2huaXF1ZXMgYXMgZ2VuZXJhbGl6ZWQgICAgKi8KLSAgLyogYXMgcG9zc2libGUgYWNyb3NzIGFsbCBmb250cyB0byBwcmV2ZW50IHRoZSBuZWVkIGZvciBleHRyYSBydWxlcyBzdWNoICovCi0gIC8qIGFzIHRoZXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJ1bGUgc3RydWN0dXJlIGlzIGRlc2lnbmVkIHNvIHRoYXQgZW50aXJlbHkgbmV3IHJ1bGVzIGNhbiBlYXNpbHkgICovCi0gIC8qIGJlIGFkZGVkIHdoZW4gYSBuZXcgY29tcGF0aWJpbGl0eSBmZWF0dXJlIGlzIGRpc2NvdmVyZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJ1bGUgc3RydWN0dXJlcyBjb3VsZCBhbHNvIHVzZSBzb21lIGVuaGFuY2VtZW50IHRvIGhhbmRsZSByYW5nZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgKioqKioqKioqKioqKioqKioqIFdPUksgSU4gUFJPR1JFU1MgKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGVzZSBydWxlcyBhZmZlY3QgaG93IHRoZSBUVCBJbnRlcnByZXRlciBkb2VzIGhpbnRpbmcsIHdpdGggdGhlCisgICAqIGdvYWwgb2YgZG9pbmcgc3VicGl4ZWwgaGludGluZyBieSAoaW4gZ2VuZXJhbCkgaWdub3JpbmcgeCBtb3Zlcy4KKyAgICogU29tZSBvZiB0aGVzZSBydWxlcyBhcmUgZml4ZXMgdGhhdCBnbyBhYm92ZSBhbmQgYmV5b25kIHRoZQorICAgKiBzdGF0ZWQgdGVjaG5pcXVlcyBpbiB0aGUgTVMgd2hpdGVwYXBlciBvbiBDbGVhcnR5cGUsIGR1ZSB0bworICAgKiBhcnRpZmFjdHMgaW4gbWFueSBnbHlwaHMuICBTbywgdGhlc2UgcnVsZXMgbWFrZSBzb21lIGdseXBocyByZW5kZXIKKyAgICogYmV0dGVyIHRoYW4gdGhleSBkbyBpbiB0aGUgTVMgcmFzdGVyaXplci4KKyAgICoKKyAgICogIiIgc3RyaW5nIG9yIDAgaW50L2NoYXIgaW5kaWNhdGVzIHRvIGFwcGx5IHRvIGFsbCBnbHlwaHMuCisgICAqICItIiB1c2VkIGFzIGR1bW15IHBsYWNlaG9sZGVycywgYnV0IGFueSBub24tbWF0Y2hpbmcgc3RyaW5nIHdvcmtzLgorICAgKgorICAgKiBTb21lIG9mIHRoaXMgY291bGQgYXJndWFibHkgYmUgaW1wbGVtZW50ZWQgaW4gZm9udGNvbmZpZywgaG93ZXZlcjoKKyAgICoKKyAgICogLSBGb250Y29uZmlnIGNhbid0IHNldCB0aGluZ3Mgb24gYSBnbHlwaC1ieS1nbHlwaCBiYXNpcy4KKyAgICogLSBUaGUgdHdlYWtzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHZlcnkgbG93LWxldmVsLCBmcm9tIGFuIGF2ZXJhZ2UKKyAgICogICB1c2VyJ3MgcG9pbnQgb2YgdmlldyBhbmQgYXJlIGJlc3QgaW1wbGVtZW50ZWQgaW4gdGhlIGhpbnRlci4KKyAgICoKKyAgICogVGhlIGdvYWwgaXMgdG8gbWFrZSB0aGUgc3VicGl4ZWwgaGludGluZyB0ZWNobmlxdWVzIGFzIGdlbmVyYWxpemVkCisgICAqIGFzIHBvc3NpYmxlIGFjcm9zcyBhbGwgZm9udHMgdG8gcHJldmVudCB0aGUgbmVlZCBmb3IgZXh0cmEgcnVsZXMgc3VjaAorICAgKiBhcyB0aGVzZS4KKyAgICoKKyAgICogVGhlIHJ1bGUgc3RydWN0dXJlIGlzIGRlc2lnbmVkIHNvIHRoYXQgZW50aXJlbHkgbmV3IHJ1bGVzIGNhbiBlYXNpbHkKKyAgICogYmUgYWRkZWQgd2hlbiBhIG5ldyBjb21wYXRpYmlsaXR5IGZlYXR1cmUgaXMgZGlzY292ZXJlZC4KKyAgICoKKyAgICogVGhlIHJ1bGUgc3RydWN0dXJlcyBjb3VsZCBhbHNvIHVzZSBzb21lIGVuaGFuY2VtZW50IHRvIGhhbmRsZSByYW5nZXMuCisgICAqCisgICAqICAgICAqKioqKioqKioqKioqKioqKiogV09SSyBJTiBQUk9HUkVTUyAqKioqKioqKioqKioqKioqKioqCisgICAqLwogCiAgIC8qIFRoZXNlIGFyZSBgY2xhc3Nlcycgb2YgZm9udHMgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBhbmQgdXNlZCBpbiAqLwogICAvKiBydWxlcyBiZWxvdy4gIEEgYmxhbmsgZW50cnkgIiIgaXMgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiB0aGVzZSEgICAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy90cnVldHlwZS90dHN1YnBpeC5oIGIvc3JjL3RydWV0eXBlL3R0c3VicGl4LmgKaW5kZXggMTA3MGJiMC4uMjI5YTZjZiAxMDA2NDQKLS0tIGEvc3JjL3RydWV0eXBlL3R0c3VicGl4LmgKKysrIGIvc3JjL3RydWV0eXBlL3R0c3VicGl4LmgKQEAgLTEsMjUgKzEsMjQgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c3VicGl4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBTdWJwaXhlbCBIaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMC0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR0c3VicGl4LmgKKyAqCisgKiAgIFRydWVUeXBlIFN1YnBpeGVsIEhpbnRpbmcuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFRUU1VCUElYX0hfCiAjZGVmaW5lIFRUU1VCUElYX0hfCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgInR0b2Jqcy5oIgogI2luY2x1ZGUgInR0aW50ZXJwLmgiCiAKQEAgLTI5LDExICsyOCwxMSBAQAogCiAjaWZkZWYgVFRfU1VQUE9SVF9TVUJQSVhFTF9ISU5USU5HX0lORklOQUxJVFkKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElEIGZsYWdzIHRvIGlkZW50aWZ5IHNwZWNpYWwgZnVuY3Rpb25zIGF0IEZERUYgYW5kIHJ1bnRpbWUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBJRCBmbGFncyB0byBpZGVudGlmeSBzcGVjaWFsIGZ1bmN0aW9ucyBhdCBGREVGIGFuZCBydW50aW1lLgorICAgKgorICAgKi8KICNkZWZpbmUgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzEgICAgICAgMHgwMDAwMDAxCiAjZGVmaW5lIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICAgICAgIDB4MDAwMDAwMgogI2RlZmluZSBTUEhfRkRFRl9ESUFHT05BTF9TVFJPS0UgICAgICAweDAwMDAwMDQKQEAgLTQ1LDExICs0NCwxMSBAQAogI2RlZmluZSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMICAweDAwMDAxMDAKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHdlYWsgZmxhZ3MgdGhhdCBhcmUgc2V0IGZvciBlYWNoIGdseXBoIGJ5IHRoZSBiZWxvdyBydWxlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFR3ZWFrIGZsYWdzIHRoYXQgYXJlIHNldCBmb3IgZWFjaCBnbHlwaCBieSB0aGUgYmVsb3cgcnVsZXMuCisgICAqCisgICAqLwogI2RlZmluZSBTUEhfVFdFQUtfQUxMT1dfWF9ETU9WRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFVTAogI2RlZmluZSBTUEhfVFdFQUtfQUxXQVlTX0RPX0RFTFRBUCAgICAgICAgICAgICAgICAweDAwMDAwMDJVTAogI2RlZmluZSBTUEhfVFdFQUtfQUxXQVlTX1NLSVBfREVMVEFQICAgICAgICAgICAgICAweDAwMDAwMDRVTApkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL0phbWZpbGUgYi9zcmMvdHlwZTEvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk0YjdkMC4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTEvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvdHlwZTEgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHR5cGUxIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSB0MWFmbQotICAgICAgICAgICAgICAgdDFkcml2ZXIKLSAgICAgICAgICAgICAgIHQxZ2xvYWQKLSAgICAgICAgICAgICAgIHQxbG9hZAotICAgICAgICAgICAgICAgdDFvYmpzCi0gICAgICAgICAgICAgICB0MXBhcnNlCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSB0eXBlMSA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy90eXBlMSBKYW1maWxlCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvbW9kdWxlLm1rIGIvc3JjL3R5cGUxL21vZHVsZS5tawppbmRleCAzZmVhNWNjLi5jZmZiNzc0IDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvbW9kdWxlLm1rCisrKyBiL3NyYy90eXBlMS9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS9ydWxlcy5tayBiL3NyYy90eXBlMS9ydWxlcy5tawppbmRleCBjYjFhMTQyLi4yMTNlNjE5IDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvcnVsZXMubWsKKysrIGIvc3JjL3R5cGUxL3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFhZm0uYyBiL3NyYy90eXBlMS90MWFmbS5jCmluZGV4IDYxMDUzZDkuLmI5Y2Q2NmIgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MWFmbS5jCisrKyBiL3NyYy90eXBlMS90MWFmbS5jCkBAIC0xLDM5ICsxLDM4IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWFmbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHN1cHBvcnQgZm9yIFR5cGUgMSBmb250cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWFmbS5jCisgKgorICogICBBRk0gc3VwcG9ydCBmb3IgVHlwZSAxIGZvbnRzIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgogI2luY2x1ZGUgInQxYWZtLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CiAjaW5jbHVkZSAidDFlcnJvcnMuaCIKIAogCiAjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxYWZtCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdDFhZm0KIAogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFhZm0uaCBiL3NyYy90eXBlMS90MWFmbS5oCmluZGV4IGNiOGQzMDIuLmVkZjkxOWMgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MWFmbS5oCisrKyBiL3NyYy90eXBlMS90MWFmbS5oCkBAIC0xLDI3ICsxLDI2IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWFmbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUZNIHN1cHBvcnQgZm9yIFR5cGUgMSBmb250cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWFmbS5oCisgKgorICogICBBRk0gc3VwcG9ydCBmb3IgVHlwZSAxIGZvbnRzIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVDFBRk1fSF8KICNkZWZpbmUgVDFBRk1fSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAidDFvYmpzLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgogCiBGVF9CRUdJTl9IRUFERVIKIApkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxZHJpdmVyLmMgYi9zcmMvdHlwZTEvdDFkcml2ZXIuYwppbmRleCAwMjliNDEwLi5iNzg2YTg3IDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvdDFkcml2ZXIuYworKysgYi9zcmMvdHlwZTEvdDFkcml2ZXIuYwpAQCAtMSwyMiArMSwyMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkcml2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDFkcml2ZXIuYworICoKKyAqICAgVHlwZSAxIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiAjaW5jbHVkZSAidDFkcml2ZXIuaCIKICNpbmNsdWRlICJ0MWdsb2FkLmgiCiAjaW5jbHVkZSAidDFsb2FkLmgiCkBAIC0yNywzNSArMjYsMzUgQEAKICNpbmNsdWRlICJ0MWFmbS5oIgogI2VuZGlmCiAKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9IQVNIX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfUFJPUFNfSAotI2luY2x1ZGUgRlRfRFJJVkVSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGhhc2guaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHBzcHJvcC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZHJpdmVyLmg+CiAKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfS0VSTklOR19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBvc3RubS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmtlcm4uaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MWRyaXZlcgorI2RlZmluZSBGVF9DT01QT05FTlQgIHQxZHJpdmVyCiAKLSAvKgotICAqICBHTFlQSCBESUNUIFNFUlZJQ0UKLSAgKgotICAqLworICAvKgorICAgKiBHTFlQSCBESUNUIFNFUlZJQ0UKKyAgICoKKyAgICovCiAKICAgc3RhdGljIEZUX0Vycm9yCiAgIHQxX2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICAgICBmYWNlLApAQCAtNzAsOCArNjksOCBAQAogCiAKICAgc3RhdGljIEZUX1VJbnQKLSAgdDFfZ2V0X25hbWVfaW5kZXgoIFQxX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKKyAgdDFfZ2V0X25hbWVfaW5kZXgoIFQxX0ZhY2UgICAgICAgICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKICAgewogICAgIEZUX0ludCAgaTsKIApAQCAtOTcsNyArOTYsNyBAQAogCiAKICAgLyoKLSAgICogIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCisgICAqIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCiAgICAqCiAgICAqLwogCkBAIC0xMTUsMzAgKzExNCwzMiBAQAogCiAKICAgLyoKLSAgICogIE1VTFRJUExFIE1BU1RFUlMgU0VSVklDRQorICAgKiBNVUxUSVBMRSBNQVNURVJTIFNFUlZJQ0UKICAgICoKICAgICovCiAKICNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCiAgIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgdDFfc2VydmljZV9tdWx0aV9tYXN0ZXJzID0KICAgewotICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgIFQxX0dldF9NdWx0aV9NYXN0ZXIsICAgLyogZ2V0X21tICAgICAgICAgKi8KLSAgICAoRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSBUMV9TZXRfTU1fRGVzaWduLCAgICAgIC8qIHNldF9tbV9kZXNpZ24gICovCi0gICAgKEZUX1NldF9NTV9CbGVuZF9GdW5jKSAgVDFfU2V0X01NX0JsZW5kLCAgICAgICAvKiBzZXRfbW1fYmxlbmQgICAqLwotICAgIChGVF9HZXRfTU1fQmxlbmRfRnVuYykgIFQxX0dldF9NTV9CbGVuZCwgICAgICAgLyogZ2V0X21tX2JsZW5kICAgKi8KLSAgICAoRlRfR2V0X01NX1Zhcl9GdW5jKSAgICBUMV9HZXRfTU1fVmFyLCAgICAgICAgIC8qIGdldF9tbV92YXIgICAgICovCi0gICAgKEZUX1NldF9WYXJfRGVzaWduX0Z1bmMpVDFfU2V0X1Zhcl9EZXNpZ24sICAgICAvKiBzZXRfdmFyX2Rlc2lnbiAqLwotICAgIChGVF9HZXRfVmFyX0Rlc2lnbl9GdW5jKVQxX0dldF9WYXJfRGVzaWduLCAgICAgLyogZ2V0X3Zhcl9kZXNpZ24gKi8KLSAgICAoRlRfU2V0X0luc3RhbmNlX0Z1bmMpICBUMV9SZXNldF9NTV9CbGVuZCwgICAgIC8qIHNldF9pbnN0YW5jZSAgICovCisgICAgKEZUX0dldF9NTV9GdW5jKSAgICAgICAgICAgICBUMV9HZXRfTXVsdGlfTWFzdGVyLCAgICAvKiBnZXRfbW0gICAgICAgICAgICAgICovCisgICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgICAgICBUMV9TZXRfTU1fRGVzaWduLCAgICAgICAvKiBzZXRfbW1fZGVzaWduICAgICAgICovCisgICAgKEZUX1NldF9NTV9CbGVuZF9GdW5jKSAgICAgICBUMV9TZXRfTU1fQmxlbmQsICAgICAgICAvKiBzZXRfbW1fYmxlbmQgICAgICAgICovCisgICAgKEZUX0dldF9NTV9CbGVuZF9GdW5jKSAgICAgICBUMV9HZXRfTU1fQmxlbmQsICAgICAgICAvKiBnZXRfbW1fYmxlbmQgICAgICAgICovCisgICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgICAgICBUMV9HZXRfTU1fVmFyLCAgICAgICAgICAvKiBnZXRfbW1fdmFyICAgICAgICAgICovCisgICAgKEZUX1NldF9WYXJfRGVzaWduX0Z1bmMpICAgICBUMV9TZXRfVmFyX0Rlc2lnbiwgICAgICAvKiBzZXRfdmFyX2Rlc2lnbiAgICAgICovCisgICAgKEZUX0dldF9WYXJfRGVzaWduX0Z1bmMpICAgICBUMV9HZXRfVmFyX0Rlc2lnbiwgICAgICAvKiBnZXRfdmFyX2Rlc2lnbiAgICAgICovCisgICAgKEZUX1NldF9JbnN0YW5jZV9GdW5jKSAgICAgICBUMV9SZXNldF9NTV9CbGVuZCwgICAgICAvKiBzZXRfaW5zdGFuY2UgICAgICAgICovCisgICAgKEZUX1NldF9NTV9XZWlnaHRWZWN0b3JfRnVuYylUMV9TZXRfTU1fV2VpZ2h0VmVjdG9yLCAvKiBzZXRfbW1fd2VpZ2h0dmVjdG9yICovCisgICAgKEZUX0dldF9NTV9XZWlnaHRWZWN0b3JfRnVuYylUMV9HZXRfTU1fV2VpZ2h0VmVjdG9yLCAvKiBnZXRfbW1fd2VpZ2h0dmVjdG9yICovCiAKLSAgICAoRlRfR2V0X1Zhcl9CbGVuZF9GdW5jKSBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIGdldF92YXJfYmxlbmQgICovCi0gICAgKEZUX0RvbmVfQmxlbmRfRnVuYykgICAgVDFfRG9uZV9CbGVuZCAgICAgICAgICAvKiBkb25lX2JsZW5kICAgICAqLworICAgIChGVF9HZXRfVmFyX0JsZW5kX0Z1bmMpICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgLyogZ2V0X3Zhcl9ibGVuZCAgICAgICAqLworICAgIChGVF9Eb25lX0JsZW5kX0Z1bmMpICAgICAgICAgVDFfRG9uZV9CbGVuZCAgICAgICAgICAgLyogZG9uZV9ibGVuZCAgICAgICAgICAqLwogICB9OwogI2VuZGlmCiAKIAogICAvKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKKyAgICogUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTI3MCw5ICsyNzEsMTIgQEAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX0ZPTlRfTkFNRToKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfbmFtZSApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9uYW1lICksIHJldHZhbCApOworICAgICAgaWYgKCB0eXBlMS0+Zm9udF9uYW1lICkKKyAgICAgIHsKKyAgICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9uYW1lICkgKyAxOworICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQorICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9uYW1lICksIHJldHZhbCApOworICAgICAgfQogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBTX0RJQ1RfVU5JUVVFX0lEOgpAQCAtMzYyLDcgKzM2Niw3IEBACiAgICAgICAgICAgICBvayA9IDE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIG9rICkKKyAgICAgICAgaWYgKCBvayAmJiB0eXBlMS0+c3VicnMgKQogICAgICAgICB7CiAgICAgICAgICAgcmV0dmFsID0gdHlwZTEtPnN1YnJzX2xlbltpZHhdICsgMTsKICAgICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQpAQCAtNTU5LDMzICs1NjMsNDkgQEAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX1ZFUlNJT046Ci0gICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8udmVyc2lvbiApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLnZlcnNpb24gKSwgcmV0dmFsICk7CisgICAgICBpZiAoIHR5cGUxLT5mb250X2luZm8udmVyc2lvbiApCisgICAgICB7CisgICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby52ZXJzaW9uICkgKyAxOworICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQorICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLnZlcnNpb24gKSwgcmV0dmFsICk7CisgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgUFNfRElDVF9OT1RJQ0U6Ci0gICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8ubm90aWNlICkgKyAxOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8ubm90aWNlICksIHJldHZhbCApOworICAgICAgaWYgKCB0eXBlMS0+Zm9udF9pbmZvLm5vdGljZSApCisgICAgICB7CisgICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby5ub3RpY2UgKSArIDE7CisgICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCisgICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8ubm90aWNlICksIHJldHZhbCApOworICAgICAgfQogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBTX0RJQ1RfRlVMTF9OQU1FOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApLCByZXR2YWwgKTsKKyAgICAgIGlmICggdHlwZTEtPmZvbnRfaW5mby5mdWxsX25hbWUgKQorICAgICAgeworICAgICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8uZnVsbF9uYW1lICkgKyAxOworICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQorICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLmZ1bGxfbmFtZSApLCByZXR2YWwgKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX0ZBTUlMWV9OQU1FOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLmZhbWlseV9uYW1lICkgKyAxOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKSwgcmV0dmFsICk7CisgICAgICBpZiAoIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKQorICAgICAgeworICAgICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKSArIDE7CisgICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCisgICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgIHJldHZhbCApOworICAgICAgfQogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIFBTX0RJQ1RfV0VJR0hUOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9pbmZvLndlaWdodCApICsgMTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLndlaWdodCApLCByZXR2YWwgKTsKKyAgICAgIGlmICggdHlwZTEtPmZvbnRfaW5mby53ZWlnaHQgKQorICAgICAgeworICAgICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8ud2VpZ2h0ICkgKyAxOworICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQorICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Zm9udF9pbmZvLndlaWdodCApLCByZXR2YWwgKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBQU19ESUNUX0lUQUxJQ19BTkdMRToKQEAgLTYxOCw3ICs2MzgsNyBAQAogCiAKICAgLyoKLSAgICogIFBST1BFUlRZIFNFUlZJQ0UKKyAgICogUFJPUEVSVFkgU0VSVklDRQogICAgKgogICAgKi8KIApAQCAtNjMwLDcgKzY1MCw3IEBACiAKIAogICAvKgotICAgKiAgU0VSVklDRSBMSVNUCisgICAqIFNFUlZJQ0UgTElTVAogICAgKgogICAgKi8KIApAQCAtNjY1LDM4ICs2ODUsNDIgQEAKIAogI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzIGFyZSBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBtZXRob2QgKHRoZSBiYXNpYyBkcml2ZXIgICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBHZXRfS2VybmluZworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBkcml2ZXIgbWV0aG9kIHVzZWQgdG8gcmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBiZXR3ZWVuIHR3bworICAgKiAgIGdseXBocyBvZiB0aGUgc2FtZSBmYWNlLgorICAgKgorICAgKiBASW5wdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4KKyAgICoKKyAgICogICBsZWZ0X2dseXBoIDo6CisgICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4KKyAgICoKKyAgICogICByaWdodF9nbHlwaCA6OgorICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLgorICAgKgorICAgKiBAT3V0cHV0OgorICAgKiAgIGtlcm5pbmcgOjoKKyAgICogICAgIFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgaW4gZm9udCB1bml0cyBmb3IKKyAgICogICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzCisgICAqICAgICBmb3JtYXRzLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqCisgICAqIEBOb3RlOgorICAgKiAgIE9ubHkgaG9yaXpvbnRhbCBsYXlvdXRzIChsZWZ0LXRvLXJpZ2h0ICYgcmlnaHQtdG8tbGVmdCkgYXJlCisgICAqICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQKKyAgICogICBrZXJuaW5ncyBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyCisgICAqICAgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHNpbXBsZSkuCisgICAqCisgICAqICAgVGhleSBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgZm9ybWF0LXNwZWNpZmljIGludGVyZmFjZXMuCisgICAqLwogICBzdGF0aWMgRlRfRXJyb3IKICAgR2V0X0tlcm5pbmcoIEZUX0ZhY2UgICAgIHQxZmFjZSwgICAgICAgIC8qIFQxX0ZhY2UgKi8KICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFkcml2ZXIuaCBiL3NyYy90eXBlMS90MWRyaXZlci5oCmluZGV4IDJiMTUwNzIuLmU3ZWFlMGIgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MWRyaXZlci5oCisrKyBiL3NyYy90eXBlMS90MWRyaXZlci5oCkBAIC0xLDM5ICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBUeXBlIDEgZHJpdmVyIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWRyaXZlci5oCisgKgorICogICBIaWdoLWxldmVsIFR5cGUgMSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVDFEUklWRVJfSF8KICNkZWZpbmUgVDFEUklWRVJfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkcnYuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKIAotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0KICAgRlRfRVhQT1JUX1ZBUiggY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICkgIHQxX2RyaXZlcl9jbGFzczsKIAotCiBGVF9FTkRfSEVBREVSCiAKICNlbmRpZiAvKiBUMURSSVZFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxZXJyb3JzLmggYi9zcmMvdHlwZTEvdDFlcnJvcnMuaAppbmRleCA5ZTAxNTFiLi5hZDAzYTNkIDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvdDFlcnJvcnMuaAorKysgYi9zcmMvdHlwZTEvdDFlcnJvcnMuaApAQCAtMSwzMSArMSwzMSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDFlcnJvcnMuaAorICoKKyAqICAgVHlwZSAxIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgVHlwZSAxIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFR5cGUgMSBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIFQxRVJST1JTX0hfCiAjZGVmaW5lIFQxRVJST1JTX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zMyw3ICszMyw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIFQxX0Vycl8KICNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9UeXBlMQogCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+CiAKICNlbmRpZiAvKiBUMUVSUk9SU19IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFnbG9hZC5jIGIvc3JjL3R5cGUxL3QxZ2xvYWQuYwppbmRleCA4N2Q0MGU3Li5kMTZiODFmIDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvdDFnbG9hZC5jCisrKyBiL3NyYy90eXBlMS90MWdsb2FkLmMKQEAgLTEsNDIgKzEsNDEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxZ2xvYWQuYworICoKKyAqICAgVHlwZSAxIEdseXBoIExvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJ0MWdsb2FkLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NGRl9UWVBFU19ICi0jaW5jbHVkZSBGVF9EUklWRVJfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0b3V0bG4uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2NmZnR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRkcml2ZXIuaD4KIAogI2luY2x1ZGUgInQxZXJyb3JzLmgiCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFnbG9hZAorI2RlZmluZSBGVF9DT01QT05FTlQgIHQxZ2xvYWQKIAogCiAgIHN0YXRpYyBGVF9FcnJvcgpAQCAtNjIsNiArNjEsNyBAQAogICAgIFBTX0RyaXZlciAgZHJpdmVyID0gKFBTX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApOwogI2VuZGlmCiAKKwogICAgIGRlY29kZXItPmZvbnRfbWF0cml4ID0gdHlwZTEtPmZvbnRfbWF0cml4OwogICAgIGRlY29kZXItPmZvbnRfb2Zmc2V0ID0gdHlwZTEtPmZvbnRfb2Zmc2V0OwogCkBAIC0yNDksNiArMjQ5LDggQEAKIAogICAgICptYXhfYWR2YW5jZSA9IDA7CiAKKyAgICBGVF9UUkFDRTYoKCAiVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZTpcbiIgKSk7CisKICAgICAvKiBmb3IgZWFjaCBnbHlwaCwgcGFyc2UgdGhlIGdseXBoIGNoYXJzdHJpbmcgYW5kIGV4dHJhY3QgKi8KICAgICAvKiB0aGUgYWR2YW5jZSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBmb3IgKCBnbHlwaF9pbmRleCA9IDA7IGdseXBoX2luZGV4IDwgdHlwZTEtPm51bV9nbHlwaHM7IGdseXBoX2luZGV4KysgKQpAQCAtMjYxLDYgKzI2Myw5IEBACiAgICAgICAvKiBpZ25vcmUgdGhlIGVycm9yIGlmIG9uZSBvY2N1cnJlZCAtIHNraXAgdG8gbmV4dCBnbHlwaCAqLwogICAgIH0KIAorICAgIEZUX1RSQUNFNigoICJUMV9Db21wdXRlX01heF9BZHZhbmNlOiBtYXggYWR2YW5jZTogJWZcbiIsCisgICAgICAgICAgICAgICAgKm1heF9hZHZhbmNlIC8gNjU1MzYuMCApKTsKKwogICAgIHBzYXV4LT50MV9kZWNvZGVyX2Z1bmNzLT5kb25lKCAmZGVjb2RlciApOwogCiAgICAgcmV0dXJuIEZUX0Vycl9PazsKQEAgLTI4MiwxMSArMjg3LDE4IEBACiAgICAgRlRfRXJyb3IgICAgICAgZXJyb3I7CiAKIAorICAgIEZUX1RSQUNFNSgoICJUMV9HZXRfQWR2YW5jZXM6XG4iICkpOworCiAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQogICAgIHsKICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCisgICAgICB7CiAgICAgICAgIGFkdmFuY2VzW25uXSA9IDA7CiAKKyAgICAgICAgRlRfVFJBQ0U1KCggIiAgaWR4ICVkOiBhZHZhbmNlIGhlaWdodCAwIGZvbnQgdW5pdHNcbiIsCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ICsgbm4gKSk7CisgICAgICB9CisKICAgICAgIHJldHVybiBGVF9FcnJfT2s7CiAgICAgfQogCkBAIC0zMjAsNiArMzMyLDExIEBACiAgICAgICAgIGFkdmFuY2VzW25uXSA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwogICAgICAgZWxzZQogICAgICAgICBhZHZhbmNlc1tubl0gPSAwOworCisgICAgICBGVF9UUkFDRTUoKCAiICBpZHggJWQ6IGFkdmFuY2Ugd2lkdGggJWxkIGZvbnQgdW5pdCVzXG4iLAorICAgICAgICAgICAgICAgICAgZmlyc3QgKyBubiwKKyAgICAgICAgICAgICAgICAgIGFkdmFuY2VzW25uXSwKKyAgICAgICAgICAgICAgICAgIGFkdmFuY2VzW25uXSA9PSAxID8gIiIgOiAicyIgKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIEZUX0Vycl9PazsKQEAgLTM4NCw5ICs0MDEsOSBAQAogICAgIHQxZ2x5cGgtPm91dGxpbmUubl9wb2ludHMgICA9IDA7CiAgICAgdDFnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzID0gMDsKIAotICAgIGhpbnRpbmcgPSBGVF9CT09MKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICAgKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApID09IDAgKTsKLSAgICBzY2FsZWQgID0gRlRfQk9PTCggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSAgICkgPT0gMCApOworICAgIGhpbnRpbmcgPSBGVF9CT09MKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSAgICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApICk7CisgICAgc2NhbGVkICA9IEZUX0JPT0woICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICAgKSApOwogCiAgICAgZ2x5cGgtPmhpbnQgICAgID0gaGludGluZzsKICAgICBnbHlwaC0+c2NhbGVkICAgPSBzY2FsZWQ7CkBAIC0zOTgsNyArNDE1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxZ2x5cGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKXR5cGUxLT5nbHlwaF9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQk9PTCggaGludGluZyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BhcnNlX0dseXBoICk7CiAgICAgaWYgKCBlcnJvciApCkBAIC00MDYsOCArNDIzLDcgQEAKIAogICAgIG11c3RfZmluaXNoX2RlY29kZXIgPSBUUlVFOwogCi0gICAgZGVjb2Rlci5idWlsZGVyLm5vX3JlY3Vyc2UgPSBGVF9CT09MKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKSAhPSAwICk7CisgICAgZGVjb2Rlci5idWlsZGVyLm5vX3JlY3Vyc2UgPSBGVF9CT09MKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICk7CiAKICAgICBkZWNvZGVyLm51bV9zdWJycyAgICAgPSB0eXBlMS0+bnVtX3N1YnJzOwogICAgIGRlY29kZXIuc3VicnMgICAgICAgICA9IHR5cGUxLT5zdWJyczsKQEAgLTUyOCw3ICs1NDQsNyBAQAogCiAKICAgICAgICAgICAvKiBGaXJzdCBvZiBhbGwsIHNjYWxlIHRoZSBwb2ludHMsIGlmIHdlIGFyZSBub3QgaGludGluZyAqLwotICAgICAgICAgIGlmICggIWhpbnRpbmcgfHwgISBkZWNvZGVyLmJ1aWxkZXIuaGludHNfZnVuY3MgKQorICAgICAgICAgIGlmICggIWhpbnRpbmcgfHwgIWRlY29kZXIuYnVpbGRlci5oaW50c19mdW5jcyApCiAgICAgICAgICAgICBmb3IgKCBuID0gY3VyLT5uX3BvaW50czsgbiA+IDA7IG4tLSwgdmVjKysgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxZ2xvYWQuaCBiL3NyYy90eXBlMS90MWdsb2FkLmgKaW5kZXggNzJlZjc2Zi4uOTk0NzUwNyAxMDA2NDQKLS0tIGEvc3JjL3R5cGUxL3QxZ2xvYWQuaAorKysgYi9zcmMvdHlwZTEvdDFnbG9hZC5oCkBAIC0xLDI2ICsxLDI1IEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIEdseXBoIExvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MWdsb2FkLmgKKyAqCisgKiAgIFR5cGUgMSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUMUdMT0FEX0hfCiAjZGVmaW5lIFQxR0xPQURfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KICNpbmNsdWRlICJ0MW9ianMuaCIKIAogCmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFsb2FkLmMgYi9zcmMvdHlwZTEvdDFsb2FkLmMKaW5kZXggOWRmYTYzNy4uODQ5ODYwMCAxMDA2NDQKLS0tIGEvc3JjL3R5cGUxL3QxbG9hZC5jCisrKyBiL3NyYy90eXBlMS90MWxvYWQuYwpAQCAtMSw5MiArMSw5MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBmb250IGxvYWRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDFsb2FkLmMKKyAqCisgKiAgIFR5cGUgMSBmb250IGxvYWRlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyB0aGUgbmV3IGFuZCBpbXByb3ZlZCBUeXBlIDEgZGF0YSBsb2FkZXIgZm9yIEZyZWVUeXBlIDIuICBUaGUgICovCi0gIC8qIG9sZCBsb2FkZXIgaGFzIHNldmVyYWwgcHJvYmxlbXM6IGl0IGlzIHNsb3csIGNvbXBsZXgsIGRpZmZpY3VsdCB0byAgICAqLwotICAvKiBtYWludGFpbiwgYW5kIGNvbnRhaW5zIGluY3JlZGlibGUgaGFja3MgdG8gbWFrZSBpdCBhY2NlcHQgc29tZSAgICAgICAgKi8KLSAgLyogaWxsLWZvcm1lZCBUeXBlIDEgZm9udHMgd2l0aG91dCBoaWNjdXAtaW5nLiAgTW9yZW92ZXIsIGFib3V0IDUlIG9mICAgICovCi0gIC8qIHRoZSBUeXBlIDEgZm9udHMgb24gbXkgbWFjaGluZSBzdGlsbCBhcmVuJ3QgbG9hZGVkIGNvcnJlY3RseSBieSBpdC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyB2ZXJzaW9uIGlzIG11Y2ggc2ltcGxlciwgbXVjaCBmYXN0ZXIgYW5kIGFsc28gZWFzaWVyIHRvIHJlYWQgYW5kICovCi0gIC8qIG1haW50YWluIGJ5IGEgZ3JlYXQgb3JkZXIgb2YgbWFnbml0dWRlLiAgVGhlIGlkZWEgYmVoaW5kIGl0IGlzIHRvICAgICAqLwotICAvKiBfbm90XyB0cnkgdG8gcmVhZCB0aGUgVHlwZSAxIHRva2VuIHN0cmVhbSB3aXRoIGEgc3RhdGUgbWFjaGluZSAoaS5lLiAgKi8KLSAgLyogYSBQb3N0c2NyaXB0LWxpa2UgaW50ZXJwcmV0ZXIpIGJ1dCByYXRoZXIgdG8gcGVyZm9ybSBzaW1wbGUgcGF0dGVybiAgICovCi0gIC8qIG1hdGNoaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW5kZWVkLCBuZWFybHkgYWxsIGRhdGEgZGVmaW5pdGlvbnMgZm9sbG93IGEgc2ltcGxlIHBhdHRlcm4gbGlrZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLi4uIC9GaWVsZCA8ZGF0YT4gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIHdoZXJlIDxkYXRhPiBjYW4gYmUgYSBudW1iZXIsIGEgYm9vbGVhbiwgYSBzdHJpbmcsIG9yIGFuIGFycmF5IG9mICAgICAqLwotICAvKiBudW1iZXJzLiAgVGhlcmUgYXJlIGEgZmV3IGV4Y2VwdGlvbnMsIG5hbWVseSB0aGUgZW5jb2RpbmcsIGZvbnQgbmFtZSwgKi8KLSAgLyogY2hhcnN0cmluZ3MsIGFuZCBzdWJyczsgdGhleSBhcmUgaGFuZGxlZCB3aXRoIGEgc3BlY2lhbCBwYXR0ZXJuICAgICAgICovCi0gIC8qIG1hdGNoaW5nIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxsIG90aGVyIGNvbW1vbiBjYXNlcyBhcmUgaGFuZGxlZCB2ZXJ5IHNpbXBseS4gIFRoZSBtYXRjaGluZyBydWxlcyAgICovCi0gIC8qIGFyZSBkZWZpbmVkIGluIHRoZSBmaWxlIGB0MXRva2Vucy5oJyB0aHJvdWdoIHRoZSB1c2Ugb2Ygc2V2ZXJhbCAgICAgICAqLwotICAvKiBtYWNyb3MgY2FsbHMgUEFSU0VfWFhYLiAgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIHR3aWNlIGhlcmU7IHRoZSBmaXJzdCAgKi8KLSAgLyogdGltZSB0byBnZW5lcmF0ZSBwYXJzaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucywgdGhlIHNlY29uZCB0aW1lIHRvICAgICAgICovCi0gIC8qIGdlbmVyYXRlIGEgdGFibGUgb2Yga2V5d29yZHMgKHdpdGggcG9pbnRlcnMgdG8gdGhlIGFzc29jaWF0ZWQgICAgICAgICAqLwotICAvKiBjYWxsYmFjayBmdW5jdGlvbnMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBmdW5jdGlvbiBgcGFyc2VfZGljdCcgc2ltcGx5IHNjYW5zICpsaW5lYXJseSogYSBnaXZlbiBkaWN0aW9uYXJ5ICAqLwotICAvKiAoZWl0aGVyIHRoZSB0b3AtbGV2ZWwgb3IgcHJpdmF0ZSBvbmUpIGFuZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgICAgICAgKi8KLSAgLyogY2FsbGJhY2sgd2hlbiBpdCBlbmNvdW50ZXJzIGFuIGltbWVkaWF0ZSBrZXl3b3JkLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGJ5IGZhciB0aGUgZmFzdGVzdCB3YXkgb25lIGNhbiBmaW5kIHRvIHBhcnNlIGFuZCByZWFkIGFsbCAgICAgKi8KLSAgLyogZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGxlZCB0byB0cmVtZW5kb3VzIGNvZGUgc2l6ZSByZWR1Y3Rpb24uICBOb3RlIHRoYXQgbGF0ZXIsIHRoZSAgICAgKi8KLSAgLyogZ2x5cGggbG9hZGVyIHdpbGwgYWxzbyBiZSBfZ3JlYXRseV8gc2ltcGxpZmllZCwgYW5kIHRoZSBhdXRvbWF0aWMgICAgICovCi0gIC8qIGhpbnRlciB3aWxsIHJlcGxhY2UgdGhlIGNsdW1zeSBgdDFoaW50ZXInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGlzIGlzIHRoZSBuZXcgYW5kIGltcHJvdmVkIFR5cGUgMSBkYXRhIGxvYWRlciBmb3IgRnJlZVR5cGUgMi4gIFRoZQorICAgKiBvbGQgbG9hZGVyIGhhcyBzZXZlcmFsIHByb2JsZW1zOiBpdCBpcyBzbG93LCBjb21wbGV4LCBkaWZmaWN1bHQgdG8KKyAgICogbWFpbnRhaW4sIGFuZCBjb250YWlucyBpbmNyZWRpYmxlIGhhY2tzIHRvIG1ha2UgaXQgYWNjZXB0IHNvbWUKKyAgICogaWxsLWZvcm1lZCBUeXBlIDEgZm9udHMgd2l0aG91dCBoaWNjdXAtaW5nLiAgTW9yZW92ZXIsIGFib3V0IDUlIG9mCisgICAqIHRoZSBUeXBlIDEgZm9udHMgb24gbXkgbWFjaGluZSBzdGlsbCBhcmVuJ3QgbG9hZGVkIGNvcnJlY3RseSBieSBpdC4KKyAgICoKKyAgICogVGhpcyB2ZXJzaW9uIGlzIG11Y2ggc2ltcGxlciwgbXVjaCBmYXN0ZXIgYW5kIGFsc28gZWFzaWVyIHRvIHJlYWQgYW5kCisgICAqIG1haW50YWluIGJ5IGEgZ3JlYXQgb3JkZXIgb2YgbWFnbml0dWRlLiAgVGhlIGlkZWEgYmVoaW5kIGl0IGlzIHRvCisgICAqIF9ub3RfIHRyeSB0byByZWFkIHRoZSBUeXBlIDEgdG9rZW4gc3RyZWFtIHdpdGggYSBzdGF0ZSBtYWNoaW5lIChpLmUuCisgICAqIGEgUG9zdHNjcmlwdC1saWtlIGludGVycHJldGVyKSBidXQgcmF0aGVyIHRvIHBlcmZvcm0gc2ltcGxlIHBhdHRlcm4KKyAgICogbWF0Y2hpbmcuCisgICAqCisgICAqIEluZGVlZCwgbmVhcmx5IGFsbCBkYXRhIGRlZmluaXRpb25zIGZvbGxvdyBhIHNpbXBsZSBwYXR0ZXJuIGxpa2UKKyAgICoKKyAgICogLi4uIC9GaWVsZCA8ZGF0YT4gLi4uCisgICAqCisgICAqIHdoZXJlIDxkYXRhPiBjYW4gYmUgYSBudW1iZXIsIGEgYm9vbGVhbiwgYSBzdHJpbmcsIG9yIGFuIGFycmF5IG9mCisgICAqIG51bWJlcnMuICBUaGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucywgbmFtZWx5IHRoZSBlbmNvZGluZywgZm9udCBuYW1lLAorICAgKiBjaGFyc3RyaW5ncywgYW5kIHN1YnJzOyB0aGV5IGFyZSBoYW5kbGVkIHdpdGggYSBzcGVjaWFsIHBhdHRlcm4KKyAgICogbWF0Y2hpbmcgcm91dGluZS4KKyAgICoKKyAgICogQWxsIG90aGVyIGNvbW1vbiBjYXNlcyBhcmUgaGFuZGxlZCB2ZXJ5IHNpbXBseS4gIFRoZSBtYXRjaGluZyBydWxlcworICAgKiBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBgdDF0b2tlbnMuaCcgdGhyb3VnaCB0aGUgdXNlIG9mIHNldmVyYWwKKyAgICogbWFjcm9zIGNhbGxzIFBBUlNFX1hYWC4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB0d2ljZSBoZXJlOyB0aGUgZmlyc3QKKyAgICogdGltZSB0byBnZW5lcmF0ZSBwYXJzaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucywgdGhlIHNlY29uZCB0aW1lIHRvCisgICAqIGdlbmVyYXRlIGEgdGFibGUgb2Yga2V5d29yZHMgKHdpdGggcG9pbnRlcnMgdG8gdGhlIGFzc29jaWF0ZWQKKyAgICogY2FsbGJhY2sgZnVuY3Rpb25zKS4KKyAgICoKKyAgICogVGhlIGZ1bmN0aW9uIGBwYXJzZV9kaWN0JyBzaW1wbHkgc2NhbnMgKmxpbmVhcmx5KiBhIGdpdmVuIGRpY3Rpb25hcnkKKyAgICogKGVpdGhlciB0aGUgdG9wLWxldmVsIG9yIHByaXZhdGUgb25lKSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlCisgICAqIGNhbGxiYWNrIHdoZW4gaXQgZW5jb3VudGVycyBhbiBpbW1lZGlhdGUga2V5d29yZC4KKyAgICoKKyAgICogVGhpcyBpcyBieSBmYXIgdGhlIGZhc3Rlc3Qgd2F5IG9uZSBjYW4gZmluZCB0byBwYXJzZSBhbmQgcmVhZCBhbGwKKyAgICogZGF0YS4KKyAgICoKKyAgICogVGhpcyBsZWQgdG8gdHJlbWVuZG91cyBjb2RlIHNpemUgcmVkdWN0aW9uLiAgTm90ZSB0aGF0IGxhdGVyLCB0aGUKKyAgICogZ2x5cGggbG9hZGVyIHdpbGwgYWxzbyBiZSBfZ3JlYXRseV8gc2ltcGxpZmllZCwgYW5kIHRoZSBhdXRvbWF0aWMKKyAgICogaGludGVyIHdpbGwgcmVwbGFjZSB0aGUgY2x1bXN5IGB0MWhpbnRlcicuCisgICAqCisgICAqLwogCiAKICNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0hBU0hfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmg+CiAKICNpbmNsdWRlICJ0MWxvYWQuaCIKICNpbmNsdWRlICJ0MWVycm9ycy5oIgogCiAKICNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0jZGVmaW5lIElTX0lOQ1JFTUVOVEFMICAoRlRfQm9vbCkoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAhPSAwICkKKyNkZWZpbmUgSVNfSU5DUkVNRU5UQUwgIEZUX0JPT0woIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCiAjZWxzZQogI2RlZmluZSBJU19JTkNSRU1FTlRBTCAgMAogI2VuZGlmCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFsb2FkCisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgdDFsb2FkCiAKIAogI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKQEAgLTIyMiwxMSArMjIyLDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR2l2ZW4gYSBub3JtYWxpemVkIChibGVuZCkgY29vcmRpbmF0ZSwgZmlndXJlIG91dCB0aGUgZGVzaWduICAgICAgICAgICovCi0gIC8qIGNvb3JkaW5hdGUgYXBwcm9wcmlhdGUgZm9yIHRoYXQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEdpdmVuIGEgbm9ybWFsaXplZCAoYmxlbmQpIGNvb3JkaW5hdGUsIGZpZ3VyZSBvdXQgdGhlIGRlc2lnbgorICAgKiBjb29yZGluYXRlIGFwcHJvcHJpYXRlIGZvciB0aGF0IHZhbHVlLgorICAgKi8KICAgc3RhdGljIEZUX0ZpeGVkCiAgIG1tX2F4aXNfdW5tYXAoIFBTX0Rlc2lnbk1hcCAgYXhpc21hcCwKICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICBuY3YgKQpAQCAtMjUxLDExICsyNTEsMTEgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHaXZlbiBhIHZlY3RvciBvZiB3ZWlnaHRzLCBvbmUgZm9yIGVhY2ggZGVzaWduLCBmaWd1cmUgb3V0IHRoZSAgICAgICAgKi8KLSAgLyogbm9ybWFsaXplZCBheGlzIGNvb3JkaW5hdGVzIHdoaWNoIGdhdmUgcmlzZSB0byB0aG9zZSB3ZWlnaHRzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogR2l2ZW4gYSB2ZWN0b3Igb2Ygd2VpZ2h0cywgb25lIGZvciBlYWNoIGRlc2lnbiwgZmlndXJlIG91dCB0aGUKKyAgICogbm9ybWFsaXplZCBheGlzIGNvb3JkaW5hdGVzIHdoaWNoIGdhdmUgcmlzZSB0byB0aG9zZSB3ZWlnaHRzLgorICAgKi8KICAgc3RhdGljIHZvaWQKICAgbW1fd2VpZ2h0c191bm1hcCggRlRfRml4ZWQqICB3ZWlnaHRzLAogICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGF4aXNjb29yZHMsCkBAIC0yOTMsMTEgKzI5MywxMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEp1c3QgYSB3cmFwcGVyIGFyb3VuZCBUMV9HZXRfTXVsdGlfTWFzdGVyIHRvIHN1cHBvcnQgdGhlIGRpZmZlcmVudCAgICAqLwotICAvKiAgYXJndW1lbnRzIG5lZWRlZCBieSB0aGUgR1ggdmFyIGRpc3RvcnRhYmxlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBKdXN0IGEgd3JhcHBlciBhcm91bmQgVDFfR2V0X011bHRpX01hc3RlciB0byBzdXBwb3J0IHRoZSBkaWZmZXJlbnQKKyAgICogYXJndW1lbnRzIG5lZWRlZCBieSB0aGUgR1ggdmFyIGRpc3RvcnRhYmxlIGZvbnRzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFQxX0dldF9NTV9WYXIoIFQxX0ZhY2UgICAgICBmYWNlLAogICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICkKQEAgLTMwOSwzMSArMzA5LDU1IEBACiAgICAgRlRfVUludCAgICAgICAgICBpOwogICAgIEZUX0ZpeGVkICAgICAgICAgYXhpc2Nvb3Jkc1tUMV9NQVhfTU1fQVhJU107CiAgICAgUFNfQmxlbmQgICAgICAgICBibGVuZCA9IGZhY2UtPmJsZW5kOworICAgIEZUX1VTaG9ydCogICAgICAgYXhpc19mbGFnczsKKworICAgIEZUX09mZnNldCAgbW12YXJfc2l6ZTsKKyAgICBGVF9PZmZzZXQgIGF4aXNfZmxhZ3Nfc2l6ZTsKKyAgICBGVF9PZmZzZXQgIGF4aXNfc2l6ZTsKIAogCiAgICAgZXJyb3IgPSBUMV9HZXRfTXVsdGlfTWFzdGVyKCBmYWNlLCAmbW1hc3RlciApOwogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwotICAgIGlmICggRlRfQUxMT0MoIG1tdmFyLAotICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEZUX01NX1ZhciApICsKLSAgICAgICAgICAgICAgICAgICAgIG1tYXN0ZXIubnVtX2F4aXMgKiBzaXplb2YgKCBGVF9WYXJfQXhpcyApICkgKQorCisgICAgLyogdGhlIHZhcmlvdXMgYCpfc2l6ZScgdmFyaWFibGVzLCB3aGljaCB3ZSBhbHNvIHVzZSBhcyAgICAgKi8KKyAgICAvKiBvZmZzZXRzIGludG8gdGhlIGBtbXZhcicgYXJyYXksIG11c3QgYmUgbXVsdGlwbGVzIG9mIHRoZSAqLworICAgIC8qIHBvaW50ZXIgc2l6ZSAoZXhjZXB0IHRoZSBsYXN0IG9uZSk7IHdpdGhvdXQgc3VjaCBhbiAgICAgICovCisgICAgLyogYWxpZ25tZW50IHRoZXJlIG1pZ2h0IGJlIHJ1bnRpbWUgZXJyb3JzIGR1ZSB0byAgICAgICAgICAgKi8KKyAgICAvKiBtaXNhbGlnbmVkIGFkZHJlc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmICBBTElHTl9TSVpFCisjZGVmaW5lIEFMSUdOX1NJWkUoIG4gKSBcCisgICAgICAgICAgKCAoIChuKSArIHNpemVvZiAodm9pZCopIC0gMSApICYgfiggc2l6ZW9mICh2b2lkKikgLSAxICkgKQorCisgICAgbW12YXJfc2l6ZSAgICAgID0gQUxJR05fU0laRSggc2l6ZW9mICggRlRfTU1fVmFyICkgKTsKKyAgICBheGlzX2ZsYWdzX3NpemUgPSBBTElHTl9TSVpFKCBtbWFzdGVyLm51bV9heGlzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9VU2hvcnQgKSApOworICAgIGF4aXNfc2l6ZSAgICAgICA9IG1tYXN0ZXIubnVtX2F4aXMgKiBzaXplb2YgKCBGVF9WYXJfQXhpcyApOworCisgICAgaWYgKCBGVF9BTExPQyggbW12YXIsIG1tdmFyX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzX2ZsYWdzX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzX3NpemUgKSApCiAgICAgICBnb3RvIEV4aXQ7CiAKICAgICBtbXZhci0+bnVtX2F4aXMgICAgICAgID0gbW1hc3Rlci5udW1fYXhpczsKICAgICBtbXZhci0+bnVtX2Rlc2lnbnMgICAgID0gbW1hc3Rlci5udW1fZGVzaWduczsKICAgICBtbXZhci0+bnVtX25hbWVkc3R5bGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3Qgc3VwcG9ydGVkICovCi0gICAgbW12YXItPmF4aXMgICAgICAgICAgICA9IChGVF9WYXJfQXhpcyopJm1tdmFyWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBheGVzIGFmdGVyIE1NX1ZhciBzdHJ1Y3QgKi8KLSAgICBtbXZhci0+bmFtZWRzdHlsZSAgICAgID0gTlVMTDsKKworICAgIC8qIHdoaWxlIGF4aXMgZmxhZ3MgYXJlIG1lYW5pbmdsZXNzIGhlcmUsIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGUgYXJyYXkgKi8KKyAgICAvKiB0byBtYWtlIGBGVF9HZXRfVmFyX0F4aXNfRmxhZ3MnIHdvcms6IHRoZSBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlICovCisgICAgLyogdmFsdWVzIGRpcmVjdGx5IGZvbGxvdyB0aGUgZGF0YSBvZiBgRlRfTU1fVmFyJyAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGF4aXNfZmxhZ3MgPSAoRlRfVVNob3J0KikoIChjaGFyKiltbXZhciArIG1tdmFyX3NpemUgKTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG1tYXN0ZXIubnVtX2F4aXM7IGkrKyApCisgICAgICBheGlzX2ZsYWdzW2ldID0gMDsKKworICAgIG1tdmFyLT5heGlzICAgICAgID0gKEZUX1Zhcl9BeGlzKikoIChjaGFyKilheGlzX2ZsYWdzICsgYXhpc19mbGFnc19zaXplICk7CisgICAgbW12YXItPm5hbWVkc3R5bGUgPSBOVUxMOwogCiAgICAgZm9yICggaSA9IDA7IGkgPCBtbWFzdGVyLm51bV9heGlzOyBpKysgKQogICAgIHsKICAgICAgIG1tdmFyLT5heGlzW2ldLm5hbWUgICAgPSBtbWFzdGVyLmF4aXNbaV0ubmFtZTsKICAgICAgIG1tdmFyLT5heGlzW2ldLm1pbmltdW0gPSBJTlRfVE9fRklYRUQoIG1tYXN0ZXIuYXhpc1tpXS5taW5pbXVtICk7CiAgICAgICBtbXZhci0+YXhpc1tpXS5tYXhpbXVtID0gSU5UX1RPX0ZJWEVEKCBtbWFzdGVyLmF4aXNbaV0ubWF4aW11bSApOwotICAgICAgbW12YXItPmF4aXNbaV0uZGVmICAgICA9ICggbW12YXItPmF4aXNbaV0ubWluaW11bSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tdmFyLT5heGlzW2ldLm1heGltdW0gKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkuICBCdXQgdGhpcyB2YWx1ZSBpcyBpbiByYW5nZSAqLwogICAgICAgbW12YXItPmF4aXNbaV0uc3RyaWQgICA9IH4wVTsgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkgKi8KICAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyAgICAgPSB+MFU7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IGFwcGx5ICovCiAKQEAgLTM0OCwxNiArMzcyLDEzIEBACiAgICAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyA9IEZUX01BS0VfVEFHKCAnbycsICdwJywgJ3MnLCAneicgKTsKICAgICB9CiAKLSAgICBpZiAoIGJsZW5kLT5udW1fZGVzaWducyA9PSAoIDFVIDw8IGJsZW5kLT5udW1fYXhpcyApICkKLSAgICB7Ci0gICAgICBtbV93ZWlnaHRzX3VubWFwKCBibGVuZC0+ZGVmYXVsdF93ZWlnaHRfdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgYXhpc2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fYXhpcyApOworICAgIG1tX3dlaWdodHNfdW5tYXAoIGJsZW5kLT5kZWZhdWx0X3dlaWdodF92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgYXhpc2Nvb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+bnVtX2F4aXMgKTsKIAotICAgICAgZm9yICggaSA9IDA7IGkgPCBtbWFzdGVyLm51bV9heGlzOyBpKysgKQotICAgICAgICBtbXZhci0+YXhpc1tpXS5kZWYgPSBtbV9heGlzX3VubWFwKCAmYmxlbmQtPmRlc2lnbl9tYXBbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNjb29yZHNbaV0gKTsKLSAgICB9CisgICAgZm9yICggaSA9IDA7IGkgPCBtbWFzdGVyLm51bV9heGlzOyBpKysgKQorICAgICAgbW12YXItPmF4aXNbaV0uZGVmID0gbW1fYXhpc191bm1hcCggJmJsZW5kLT5kZXNpZ25fbWFwW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpc2Nvb3Jkc1tpXSApOwogCiAgICAgKm1hc3RlciA9IG1tdmFyOwogCkBAIC0zODcsMjQgKzQwOCwzMSBAQAogICAgIGZvciAoIG4gPSAwOyBuIDwgYmxlbmQtPm51bV9kZXNpZ25zOyBuKysgKQogICAgIHsKICAgICAgIEZUX0ZpeGVkICByZXN1bHQgPSAweDEwMDAwTDsgIC8qIDEuMCBmaXhlZCAqLworICAgICAgRlRfRml4ZWQgIGZhY3RvcjsKIAogCiAgICAgICBmb3IgKCBtID0gMDsgbSA8IGJsZW5kLT5udW1fYXhpczsgbSsrICkKICAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgIGZhY3RvcjsKLQotCi0gICAgICAgIC8qIGdldCBjdXJyZW50IGJsZW5kIGF4aXMgcG9zaXRpb247ICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgLyogdXNlIGEgZGVmYXVsdCB2YWx1ZSBpZiB3ZSBkb24ndCBoYXZlIGEgY29vcmRpbmF0ZSAqLwotICAgICAgICBmYWN0b3IgPSBtIDwgbnVtX2Nvb3JkcyA/IGNvb3Jkc1ttXSA6IDB4ODAwMDsKLSAgICAgICAgaWYgKCBmYWN0b3IgPCAwICkKLSAgICAgICAgICBmYWN0b3IgPSAwOwotICAgICAgICBpZiAoIGZhY3RvciA+IDB4MTAwMDBMICkKLSAgICAgICAgICBmYWN0b3IgPSAweDEwMDAwTDsKKyAgICAgICAgaWYgKCBtID49IG51bV9jb29yZHMgKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ID4+PSAxOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKKyAgICAgICAgLyogZ2V0IGN1cnJlbnQgYmxlbmQgYXhpcyBwb3NpdGlvbiAqLworICAgICAgICBmYWN0b3IgPSBjb29yZHNbbV07CiAgICAgICAgIGlmICggKCBuICYgKCAxIDw8IG0gKSApID09IDAgKQogICAgICAgICAgIGZhY3RvciA9IDB4MTAwMDBMIC0gZmFjdG9yOwogCisgICAgICAgIGlmICggZmFjdG9yIDw9IDAgKQorICAgICAgICB7CisgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggZmFjdG9yID49IDB4MTAwMDBMICkKKyAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICByZXN1bHQgPSBGVF9NdWxGaXgoIHJlc3VsdCwgZmFjdG9yICk7CiAgICAgICB9CiAKQEAgLTQ3Nyw2ICs1MDUsNzUgQEAKIAogCiAgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQorICBUMV9TZXRfTU1fV2VpZ2h0VmVjdG9yKCBUMV9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHdlaWdodHZlY3RvciApCisgIHsKKyAgICBQU19CbGVuZCAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKKyAgICBGVF9VSW50ICAgaSwgbjsKKworCisgICAgaWYgKCAhYmxlbmQgKQorICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKworICAgIGlmICggIWxlbiAmJiAhd2VpZ2h0dmVjdG9yICkKKyAgICB7CisgICAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT5udW1fZGVzaWduczsgaSsrICkKKyAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3JbaV0gPSBibGVuZC0+ZGVmYXVsdF93ZWlnaHRfdmVjdG9yW2ldOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgaWYgKCAhd2VpZ2h0dmVjdG9yICkKKyAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisKKyAgICAgIG4gPSBsZW4gPCBibGVuZC0+bnVtX2Rlc2lnbnMgPyBsZW4gOiBibGVuZC0+bnVtX2Rlc2lnbnM7CisKKyAgICAgIGZvciAoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3JbaV0gPSB3ZWlnaHR2ZWN0b3JbaV07CisKKyAgICAgIGZvciAoIDsgaSA8IGJsZW5kLT5udW1fZGVzaWduczsgaSsrICkKKyAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3JbaV0gPSAoRlRfRml4ZWQpMDsKKworICAgICAgaWYgKCBsZW4gKQorICAgICAgICBmYWNlLT5yb290LmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1ZBUklBVElPTjsKKyAgICAgIGVsc2UKKyAgICAgICAgZmFjZS0+cm9vdC5mYWNlX2ZsYWdzICY9IH5GVF9GQUNFX0ZMQUdfVkFSSUFUSU9OOworICAgIH0KKworICAgIHJldHVybiBGVF9FcnJfT2s7CisgIH0KKworCisgIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQorICBUMV9HZXRfTU1fV2VpZ2h0VmVjdG9yKCBUMV9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQqICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHdlaWdodHZlY3RvciApCisgIHsKKyAgICBQU19CbGVuZCAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKKyAgICBGVF9VSW50ICAgaTsKKworCisgICAgaWYgKCAhYmxlbmQgKQorICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7CisKKyAgICBpZiAoICpsZW4gPCBibGVuZC0+bnVtX2Rlc2lnbnMgKQorICAgIHsKKyAgICAgICpsZW4gPSBibGVuZC0+bnVtX2Rlc2lnbnM7CisgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKKyAgICB9CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IGJsZW5kLT5udW1fZGVzaWduczsgaSsrICkKKyAgICAgIHdlaWdodHZlY3RvcltpXSA9IGJsZW5kLT53ZWlnaHRfdmVjdG9yW2ldOworICAgIGZvciAoIDsgaSA8ICpsZW47IGkrKyApCisgICAgICB3ZWlnaHR2ZWN0b3JbaV0gPSAoRlRfRml4ZWQpMDsKKworICAgICpsZW4gPSBibGVuZC0+bnVtX2Rlc2lnbnM7CisKKyAgICByZXR1cm4gRlRfRXJyX09rOworICB9CisKKworICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVDFfU2V0X01NX0Rlc2lnbiggVDFfRmFjZSAgIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAogICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICkKQEAgLTU3MywxMSArNjcwLDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSnVzdCBhIHdyYXBwZXIgYXJvdW5kIFQxX1NldF9NTV9EZXNpZ24gdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW50ICAgICAgICovCi0gIC8qIGFyZ3VtZW50cyBuZWVkZWQgYnkgdGhlIEdYIHZhciBkaXN0b3J0YWJsZSBmb250cy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEp1c3QgYSB3cmFwcGVyIGFyb3VuZCBUMV9TZXRfTU1fRGVzaWduIHRvIHN1cHBvcnQgdGhlIGRpZmZlcmVudAorICAgKiBhcmd1bWVudHMgbmVlZGVkIGJ5IHRoZSBHWCB2YXIgZGlzdG9ydGFibGUgZm9udHMuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVDFfU2V0X1Zhcl9EZXNpZ24oIFQxX0ZhY2UgICAgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKQEAgLTcxOSw2ICs4MTYsOCBAQAogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwogCisgICAgRlRfVFJBQ0U0KCggIiBbIiApKTsKKwogICAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOwogICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwogCkBAIC03NDEsMTEgKzg0MCwxMyBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICB9CiAKKyAgICAgIEZUX1RSQUNFNCgoICIgLyUuKnMiLCBsZW4sIHRva2VuLT5zdGFydCApKTsKKwogICAgICAgbmFtZSA9IChGVF9CeXRlKilibGVuZC0+YXhpc19uYW1lc1tuXTsKICAgICAgIGlmICggbmFtZSApCiAgICAgICB7CiAgICAgICAgIEZUX1RSQUNFMCgoICJwYXJzZV9ibGVuZF9heGlzX3R5cGVzOiIKLSAgICAgICAgICAgICAgICAgICAgIiBvdmVyd3JpdGluZyBheGlzIG5hbWUgYCVzJyB3aXRoIGAlKi5zJ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIiBvdmVyd3JpdGluZyBheGlzIG5hbWUgYCVzJyB3aXRoIGAlLipzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbGVuLCB0b2tlbi0+c3RhcnQgKSk7CiAgICAgICAgIEZUX0ZSRUUoIG5hbWUgKTsKICAgICAgIH0KQEAgLTc1OCw2ICs4NTksOCBAQAogICAgICAgbmFtZVtsZW5dID0gJ1wwJzsKICAgICB9CiAKKyAgICBGVF9UUkFDRTQoKCAiXVxuIiApKTsKKwogICBFeGl0OgogICAgIGxvYWRlci0+cGFyc2VyLnJvb3QuZXJyb3IgPSBlcnJvcjsKICAgfQpAQCAtODAyLDYgKzkwNSw4IEBACiAgICAgICBibGVuZCAgICA9IGZhY2UtPmJsZW5kOwogICAgICAgbnVtX2F4aXMgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwogCisgICAgICBGVF9UUkFDRTQoKCAiIFsiICkpOworCiAgICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9kZXNpZ25zOyBuKysgKQogICAgICAgewogICAgICAgICBUMV9Ub2tlblJlYyAgYXhpc190b2tlbnNbVDFfTUFYX01NX0FYSVNdOwpAQCAtODQyLDYgKzk0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKiBub3cgcmVhZCBlYWNoIGF4aXMgdG9rZW4gaW50byB0aGUgZGVzaWduIHBvc2l0aW9uICovCisgICAgICAgIEZUX1RSQUNFNCgoICIgWyIgKSkgOwogICAgICAgICBmb3IgKCBheGlzID0gMDsgYXhpcyA8IG5fYXhpczsgYXhpcysrICkKICAgICAgICAgewogICAgICAgICAgIFQxX1Rva2VuICB0b2tlbjIgPSBheGlzX3Rva2VucyArIGF4aXM7CkBAIC04NTAsOSArOTU2LDEzIEBACiAgICAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHRva2VuMi0+c3RhcnQ7CiAgICAgICAgICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IHRva2VuMi0+bGltaXQ7CiAgICAgICAgICAgYmxlbmQtPmRlc2lnbl9wb3Nbbl1bYXhpc10gPSBUMV9Ub0ZpeGVkKCBwYXJzZXIsIDAgKTsKKyAgICAgICAgICBGVF9UUkFDRTQoKCAiICVmIiwgKGRvdWJsZSlibGVuZC0+ZGVzaWduX3Bvc1tuXVtheGlzXSAvIDY1NTM2ICkpOwogICAgICAgICB9CisgICAgICAgIEZUX1RSQUNFNCgoICJdIiApKSA7CiAgICAgICB9CiAKKyAgICAgIEZUX1RSQUNFNCgoICJdXG4iICkpOworCiAgICAgICBsb2FkZXItPnBhcnNlci5yb290LmN1cnNvciA9IG9sZF9jdXJzb3I7CiAgICAgICBsb2FkZXItPnBhcnNlci5yb290LmxpbWl0ICA9IG9sZF9saW1pdDsKICAgICB9CkBAIC04OTksNiArMTAwOSw4IEBACiAgICAgICBnb3RvIEV4aXQ7CiAgICAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKIAorICAgIEZUX1RSQUNFNCgoICIgWyIgKSk7CisKICAgICAvKiBub3cgcmVhZCBlYWNoIGF4aXMgZGVzaWduIG1hcCAqLwogICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2F4aXM7IG4rKyApCiAgICAgewpAQCAtOTE1LDYgKzEwMjcsOCBAQAogICAgICAgVDFfVG9Ub2tlbkFycmF5KCBwYXJzZXIsIHBvaW50X3Rva2VucywKICAgICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX01BUF9QT0lOVFMsICZudW1fcG9pbnRzICk7CiAKKyAgICAgIEZUX1RSQUNFNCgoICIgWyIgKSk7CisKICAgICAgIGlmICggbnVtX3BvaW50cyA8PSAwIHx8IG51bV9wb2ludHMgPiBUMV9NQVhfTU1fTUFQX1BPSU5UUyApCiAgICAgICB7CiAgICAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2Rlc2lnbl9tYXA6IGluY29ycmVjdCB0YWJsZVxuIiApKTsKQEAgLTk0OCw5ICsxMDYyLDE3IEBACiAKICAgICAgICAgbWFwLT5kZXNpZ25fcG9pbnRzW3BdID0gVDFfVG9JbnQoIHBhcnNlciApOwogICAgICAgICBtYXAtPmJsZW5kX3BvaW50cyBbcF0gPSBUMV9Ub0ZpeGVkKCBwYXJzZXIsIDAgKTsKKworICAgICAgICBGVF9UUkFDRTQoKCAiIFslbGQgJWZdIiwKKyAgICAgICAgICAgICAgICAgICAgbWFwLT5kZXNpZ25fcG9pbnRzW3BdLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1hcC0+YmxlbmRfcG9pbnRzW3BdIC8gNjU1MzYgKSk7CiAgICAgICB9CisKKyAgICAgIEZUX1RSQUNFNCgoICJdIiApKTsKICAgICB9CiAKKyAgICBGVF9UUkFDRTQoKCAiXVxuIiApKTsKKwogICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBvbGRfY3Vyc29yOwogICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBvbGRfbGltaXQ7CiAKQEAgLTEwMTAsNiArMTEzMiw4IEBACiAgICAgb2xkX2N1cnNvciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7CiAgICAgb2xkX2xpbWl0ICA9IHBhcnNlci0+cm9vdC5saW1pdDsKIAorICAgIEZUX1RSQUNFNCgoICJbIiApKTsKKwogICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2Rlc2lnbnM7IG4rKyApCiAgICAgewogICAgICAgdG9rZW4gPSBkZXNpZ25fdG9rZW5zICsgbjsKQEAgLTEwMTgsOCArMTE0MiwxMiBAQAogCiAgICAgICBibGVuZC0+ZGVmYXVsdF93ZWlnaHRfdmVjdG9yW25dID0KICAgICAgIGJsZW5kLT53ZWlnaHRfdmVjdG9yW25dICAgICAgICAgPSBUMV9Ub0ZpeGVkKCBwYXJzZXIsIDAgKTsKKworICAgICAgRlRfVFJBQ0U0KCggIiAlZiIsIChkb3VibGUpYmxlbmQtPndlaWdodF92ZWN0b3Jbbl0gLyA2NTUzNiApKTsKICAgICB9CiAKKyAgICBGVF9UUkFDRTQoKCAiXVxuIiApKTsKKwogICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBvbGRfY3Vyc29yOwogICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBvbGRfbGltaXQ7CiAKQEAgLTEwMzYsNiArMTE2NCwyMCBAQAogICB7CiAgICAgZmFjZS0+bGVuX2J1aWxkY2hhciA9IChGVF9VSW50KVQxX1RvRml4ZWRBcnJheSggJmxvYWRlci0+cGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIDAgKTsKKworI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgeworICAgICAgRlRfVUludCAgaTsKKworCisgICAgICBGVF9UUkFDRTQoKCAiIFsiICkpOworICAgICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT5sZW5fYnVpbGRjaGFyOyBpKysgKQorICAgICAgICBGVF9UUkFDRTQoKCAiIDAiICkpOworCisgICAgICBGVF9UUkFDRTQoKCAiXVxuIiApKTsKKyAgICB9CisjZW5kaWYKKwogICAgIHJldHVybjsKICAgfQogCkBAIC0xMDcxLDYgKzEyMTMsOCBAQAogICAgIC8qIGlmIHRoZSBrZXl3b3JkIGhhcyBhIGRlZGljYXRlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwogICAgIGlmICggZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9DQUxMQkFDSyApCiAgICAgeworICAgICAgRlRfVFJBQ0U0KCggIiAgJXMiLCBmaWVsZC0+aWRlbnQgKSk7CisKICAgICAgIGZpZWxkLT5yZWFkZXIoIChGVF9GYWNlKWZhY2UsIGxvYWRlciApOwogICAgICAgZXJyb3IgPSBsb2FkZXItPnBhcnNlci5yb290LmVycm9yOwogICAgICAgZ290byBFeGl0OwpAQCAtMTE0OCw2ICsxMjkyLDggQEAKICAgICAgIG1heF9vYmplY3RzICA9IDA7CiAgICAgfQogCisgICAgRlRfVFJBQ0U0KCggIiAgJXMiLCBmaWVsZC0+aWRlbnQgKSk7CisKICAgICBpZiAoICpvYmplY3RzICkKICAgICB7CiAgICAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSB8fApAQCAtMTE2Nyw2ICsxMzEzLDggQEAKICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogICAgIH0KIAorICAgIEZUX1RSQUNFNCgoICJcbiIgKSk7CisKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KQEAgLTExNzksNiArMTMyNyw4IEBACiAgICAgRlRfVU5VU0VEKCBmYWNlICk7CiAKICAgICBsb2FkZXItPmtleXdvcmRzX2VuY291bnRlcmVkIHw9IFQxX1BSSVZBVEU7CisKKyAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwogICB9CiAKIApAQCAtMTI1OCw2ICsxNDA4LDE0IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgRlRfVFJBQ0U0KCggIiBbJWYgJWYgJWYgJWYgJWYgJWZdXG4iLAorICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFswXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKXRlbXBbMV0gLyA2NTUzNiAvIDEwMDAsCisgICAgICAgICAgICAgICAgKGRvdWJsZSl0ZW1wWzJdIC8gNjU1MzYgLyAxMDAwLAorICAgICAgICAgICAgICAgIChkb3VibGUpdGVtcFszXSAvIDY1NTM2IC8gMTAwMCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKXRlbXBbNF0gLyA2NTUzNiAvIDEwMDAsCisgICAgICAgICAgICAgICAgKGRvdWJsZSl0ZW1wWzVdIC8gNjU1MzYgLyAxMDAwICkpOworCiAgICAgdGVtcF9zY2FsZSA9IEZUX0FCUyggdGVtcFszXSApOwogCiAgICAgaWYgKCB0ZW1wX3NjYWxlID09IDAgKQpAQCAtMTI4MCwxMiArMTQzOCwxOCBAQAogICAgICAgdGVtcFs1XSA9IEZUX0RpdkZpeCggdGVtcFs1XSwgdGVtcF9zY2FsZSApOwogICAgICAgdGVtcFszXSA9IHRlbXBbM10gPCAwID8gLTB4MTAwMDBMIDogMHgxMDAwMEw7CiAgICAgfQotCiAgICAgbWF0cml4LT54eCA9IHRlbXBbMF07CiAgICAgbWF0cml4LT55eCA9IHRlbXBbMV07CiAgICAgbWF0cml4LT54eSA9IHRlbXBbMl07CiAgICAgbWF0cml4LT55eSA9IHRlbXBbM107CiAKKyAgICBpZiAoICFGVF9NYXRyaXhfQ2hlY2soIG1hdHJpeCApICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJ0MV9wYXJzZV9mb250X21hdHJpeDogaW52YWxpZCBmb250IG1hdHJpeFxuIiApKTsKKyAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLyogbm90ZSB0aGF0IHRoZSBvZmZzZXRzIG11c3QgYmUgZXhwcmVzc2VkIGluIGludGVnZXIgZm9udCB1bml0cyAqLwogICAgIG9mZnNldC0+eCA9IHRlbXBbNF0gPj4gMTY7CiAgICAgb2Zmc2V0LT55ID0gdGVtcFs1XSA+PiAxNjsKQEAgLTEzNjcsMTIgKzE1MzEsNyBAQAogCiAgICAgICAvKiBXZSBuZWVkIHRvIGB6ZXJvJyBvdXQgZW5jb2RpbmdfdGFibGUuZWxlbWVudHMgKi8KICAgICAgIGZvciAoIG4gPSAwOyBuIDwgYXJyYXlfc2l6ZTsgbisrICkKLSAgICAgIHsKLSAgICAgICAgY2hhciogIG5vdGRlZiA9IChjaGFyICopIi5ub3RkZWYiOwotCi0KLSAgICAgICAgKHZvaWQpVDFfQWRkX1RhYmxlKCBjaGFyX3RhYmxlLCBuLCBub3RkZWYsIDggKTsKLSAgICAgIH0KKyAgICAgICAgKHZvaWQpVDFfQWRkX1RhYmxlKCBjaGFyX3RhYmxlLCBuLCAiLm5vdGRlZiIsIDggKTsKIAogICAgICAgLyogTm93IHdlIG5lZWQgdG8gcmVhZCByZWNvcmRzIG9mIHRoZSBmb3JtICAgICAgICAgICAgICAgICovCiAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0OTQsNiArMTY1MywxNSBAQAogICAgICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7CiAgICAgICB9CiAKKyNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQorICAgICAgRlRfVFJBQ0U0KCggIiBbIiApKTsKKworICAgICAgLyogWFhYIHNob3cgZW5jb2RpbmcgdmVjdG9yICovCisgICAgICBGVF9UUkFDRTQoKCAiLi4uIiApKTsKKworICAgICAgRlRfVFJBQ0U0KCggIl1cbiIgKSk7CisjZW5kaWYKKwogICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfQVJSQVk7CiAgICAgICBwYXJzZXItPnJvb3QuY3Vyc29yICAgICAgID0gY3VyOwogICAgIH0KQEAgLTE1MDQsMTggKzE2NzIsMzAgQEAKICAgICB7CiAgICAgICBpZiAoIGN1ciArIDE3IDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjb25zdCBjaGFyKiljdXIsICJTdGFuZGFyZEVuY29kaW5nIiwgMTYgKSA9PSAwICkKKyAgICAgIHsKICAgICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfU1RBTkRBUkQ7CisgICAgICAgIEZUX1RSQUNFNCgoICIgU3RhbmRhcmRFbmNvZGluZ1xuIiApKTsKKyAgICAgIH0KIAogICAgICAgZWxzZSBpZiAoIGN1ciArIDE1IDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjb25zdCBjaGFyKiljdXIsICJFeHBlcnRFbmNvZGluZyIsIDE0ICkgPT0gMCApCisgICAgICB7CiAgICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX0VYUEVSVDsKKyAgICAgICAgRlRfVFJBQ0U0KCggIiBFeHBlcnRFbmNvZGluZ1xuIiApKTsKKyAgICAgIH0KIAogICAgICAgZWxzZSBpZiAoIGN1ciArIDE4IDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjb25zdCBjaGFyKiljdXIsICJJU09MYXRpbjFFbmNvZGluZyIsIDE3ICkgPT0gMCApCisgICAgICB7CiAgICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMTsKKyAgICAgICAgRlRfVFJBQ0U0KCggIiBJU09MYXRpbjFFbmNvZGluZ1xuIiApKTsKKyAgICAgIH0KIAogICAgICAgZWxzZQorICAgICAgewogICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9FUlIoIElnbm9yZSApOworICAgICAgICBGVF9UUkFDRTQoKCAiPHVua25vd24+XG4iICkpOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xNTc1LDcgKzE3NTUsNyBAQAogICAgICAgICovCiAKICAgICAgIEZUX1RSQUNFMCgoICJwYXJzZV9zdWJyczogYWRqdXN0aW5nIG51bWJlciBvZiBzdWJyb3V0aW5lcyIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIiAoZnJvbSAlZCB0byAlbGQpXG4iLAogICAgICAgICAgICAgICAgICAgbnVtX3N1YnJzLAogICAgICAgICAgICAgICAgICAgKCBwYXJzZXItPnJvb3QubGltaXQgLSBwYXJzZXItPnJvb3QuY3Vyc29yICkgPj4gMyApKTsKICAgICAgIG51bV9zdWJycyA9ICggcGFyc2VyLT5yb290LmxpbWl0IC0gcGFyc2VyLT5yb290LmN1cnNvciApID4+IDM7CkBAIC0xNjk2LDYgKzE4NzYsMTUgQEAKICAgICBpZiAoICFsb2FkZXItPm51bV9zdWJycyApCiAgICAgICBsb2FkZXItPm51bV9zdWJycyA9IG51bV9zdWJyczsKIAorI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCisgICAgICBGVF9UUkFDRTQoKCAiIDwiICkpOworCisgICAgICAvKiBYWFggc2hvdyBzdWJycz8gKi8KKyAgICAgIEZUX1RSQUNFNCgoICIlZCBlbGVtZW50cyIsIG51bV9zdWJycyApKTsKKworICAgICAgRlRfVFJBQ0U0KCggIj5cbiIgKSk7CisjZW5kaWYKKwogICAgIHJldHVybjsKIAogICBGYWlsOgpAQCAtMTczNyw3ICsxOTI2LDcgQEAKICAgICBpZiAoIG51bV9nbHlwaHMgPiAoIGxpbWl0IC0gY3VyICkgPj4gMyApCiAgICAgewogICAgICAgRlRfVFJBQ0UwKCggInBhcnNlX2NoYXJzdHJpbmdzOiBhZGp1c3RpbmcgbnVtYmVyIG9mIGdseXBocyIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIiAoZnJvbSAlZCB0byAlbGQpXG4iLAogICAgICAgICAgICAgICAgICAgbnVtX2dseXBocywgKCBsaW1pdCAtIGN1ciApID4+IDMgKSk7CiAgICAgICBudW1fZ2x5cGhzID0gKCBsaW1pdCAtIGN1ciApID4+IDM7CiAgICAgfQpAQCAtMTk3Nyw3ICsyMTY2LDYgQEAKIAogICAgICAgLyogMCAzMzMgaHNidyBlbmRjaGFyICovCiAgICAgICBGVF9CeXRlICBub3RkZWZfZ2x5cGhbXSA9IHsgMHg4QiwgMHhGNywgMHhFMSwgMHgwRCwgMHgwRSB9OwotICAgICAgY2hhciogICAgbm90ZGVmX25hbWUgICAgPSAoY2hhciAqKSIubm90ZGVmIjsKIAogCiAgICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMCwKQEAgLTE5OTIsNyArMjE4MCw3IEBACiAgICAgICBpZiAoIGVycm9yICkKICAgICAgICAgZ290byBGYWlsOwogCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggbmFtZV90YWJsZSwgMCwgbm90ZGVmX25hbWUsIDggKTsKKyAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCAwLCAiLm5vdGRlZiIsIDggKTsKICAgICAgIGlmICggZXJyb3IgKQogICAgICAgICBnb3RvIEZhaWw7CiAKQEAgLTIwMTcsNiArMjIwNSwxNSBAQAogICAgICAgbG9hZGVyLT5udW1fZ2x5cGhzICs9IDE7CiAgICAgfQogCisjaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKKyAgICAgIEZUX1RSQUNFNCgoICIgPCIgKSk7CisKKyAgICAgIC8qIFhYWCBzaG93IGNoYXJzdHJpbmdzPyAqLworICAgICAgRlRfVFJBQ0U0KCggIiVkIGVsZW1lbnRzIiwgbG9hZGVyLT5udW1fZ2x5cGhzICkpOworCisgICAgICBGVF9UUkFDRTQoKCAiPlxuIiApKTsKKyNlbmRpZgorCiAgICAgcmV0dXJuOwogCiAgIEZhaWw6CkBAIC0yMDI0LDEyICsyMjIxLDEyIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSB0b2tlbiBmaWVsZCBzdGF0aWMgdmFyaWFibGVzLiAgVGhpcyBpcyBhIHNldCBvZiAgICAgICAgICAgICovCi0gIC8qIFQxX0ZpZWxkUmVjIHZhcmlhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBEZWZpbmUgdGhlIHRva2VuIGZpZWxkIHN0YXRpYyB2YXJpYWJsZXMuICBUaGlzIGlzIGEgc2V0IG9mCisgICAqIFQxX0ZpZWxkUmVjIHZhcmlhYmxlcy4KKyAgICoKKyAgICovCiAKIAogICBzdGF0aWMKQEAgLTIyMTYsNiArMjQxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgID8gVDFfRklFTERfRElDVF9QUklWQVRFCiAgICAgICAgICAgICAgICAgICAgIDogVDFfRklFTERfRElDVF9GT05URElDVDsKIAorCiAgICAgICAgICAgICAgIGlmICggISggZGljdCAmIGtleXdvcmQtPmRpY3QgKSApCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBGVF9UUkFDRTEoKCAicGFyc2VfZGljdDogZm91bmQgYCVzJyBidXQgaWdub3JpbmcgaXQiCkBAIC0yMzMwLDYgKzI1MjgsNyBAQAogICAgIGlmICggZXJyb3IgKQogICAgICAgZ290byBFeGl0OwogCisgICAgRlRfVFJBQ0U0KCggIiB0b3AgZGljdGlvbmFyeTpcbiIgKSk7CiAgICAgZXJyb3IgPSBwYXJzZV9kaWN0KCBmYWNlLCAmbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5iYXNlX2RpY3QsIHBhcnNlci0+YmFzZV9sZW4gKTsKICAgICBpZiAoIGVycm9yICkKQEAgLTIzMzksNiArMjUzOCw3IEBACiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEV4aXQ7CiAKKyAgICBGVF9UUkFDRTQoKCAiIHByaXZhdGUgZGljdGlvbmFyeTpcbiIgKSk7CiAgICAgZXJyb3IgPSBwYXJzZV9kaWN0KCBmYWNlLCAmbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5wcml2YXRlX2RpY3QsIHBhcnNlci0+cHJpdmF0ZV9sZW4gKTsKICAgICBpZiAoIGVycm9yICkKQEAgLTIzNDksNiArMjU0OSwxNiBAQAogCiAjaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAogCisgICAgLyogd2UgZG9uJ3Qgc3VwcG9ydCBNdWx0aXBsZSBNYXN0ZXIgZm9udHMgd2l0aCBpbnRlcm1lZGlhdGUgZGVzaWduczsgKi8KKyAgICAvKiB0aGlzIGltcGxpZXMgdGhhdCBgbnVtX2Rlc2lnbnMnIG11c3QgYmUgZXF1YWwgdG8gYDJeXm51bV9heGlzJyAgICAqLworICAgIGlmICggZmFjZS0+YmxlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgIGZhY2UtPmJsZW5kLT5udW1fZGVzaWducyAhPSAoIDFVIDw8IGZhY2UtPmJsZW5kLT5udW1fYXhpcyApICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJUMV9PcGVuX0ZhY2U6IgorICAgICAgICAgICAgICAgICAiIG51bWJlci1vZi1kZXNpZ25zICE9IDIgXl4gbnVtYmVyLW9mLWF4ZXNcbiIgKSk7CisgICAgICBUMV9Eb25lX0JsZW5kKCBmYWNlICk7CisgICAgfQorCiAgICAgaWYgKCBmYWNlLT5ibGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKICAgICAgICAgIGZhY2UtPmJsZW5kLT5udW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yICE9IDAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgZmFjZS0+YmxlbmQtPm51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgIT0gZmFjZS0+YmxlbmQtPm51bV9heGlzICkKQEAgLTI0NDEsOCArMjY1MSw3IEBACiAgICAgLyogd2UgbXVzdCBub3cgYnVpbGQgdHlwZTEuZW5jb2Rpbmcgd2hlbiB3ZSBoYXZlIGEgY3VzdG9tIGFycmF5ICovCiAgICAgaWYgKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSA9PSBUMV9FTkNPRElOR19UWVBFX0FSUkFZICkKICAgICB7Ci0gICAgICBGVF9JbnQgICAgY2hhcmNvZGUsIGlkeCwgbWluX2NoYXIsIG1heF9jaGFyOwotICAgICAgRlRfQnl0ZSogIGdseXBoX25hbWU7CisgICAgICBGVF9JbnQgIGNoYXJjb2RlLCBpZHgsIG1pbl9jaGFyLCBtYXhfY2hhcjsKIAogCiAgICAgICAvKiBPSywgd2UgZG8gdGhlIGZvbGxvd2luZzogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgZW5jb2RpbmcgICovCkBAIC0yNDU2LDI3ICsyNjY1LDI3IEBACiAgICAgICBjaGFyY29kZSA9IDA7CiAgICAgICBmb3IgKCA7IGNoYXJjb2RlIDwgbG9hZGVyLmVuY29kaW5nX3RhYmxlLm1heF9lbGVtczsgY2hhcmNvZGUrKyApCiAgICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjaGFyX25hbWU7CisgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGNoYXJfbmFtZSA9CisgICAgICAgICAgICAgIChjb25zdCBGVF9TdHJpbmcqKWxvYWRlci5lbmNvZGluZ190YWJsZS5lbGVtZW50c1tjaGFyY29kZV07CiAKIAogICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9pbmRleFtjaGFyY29kZV0gPSAwOwotICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSAoY2hhciAqKSIubm90ZGVmIjsKKyAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZSBbY2hhcmNvZGVdID0gIi5ub3RkZWYiOwogCi0gICAgICAgIGNoYXJfbmFtZSA9IGxvYWRlci5lbmNvZGluZ190YWJsZS5lbGVtZW50c1tjaGFyY29kZV07CiAgICAgICAgIGlmICggY2hhcl9uYW1lICkKICAgICAgICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCB0eXBlMS0+bnVtX2dseXBoczsgaWR4KysgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoX25hbWUgPSAoRlRfQnl0ZSopdHlwZTEtPmdseXBoX25hbWVzW2lkeF07Ci0gICAgICAgICAgICBpZiAoIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKWNoYXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZ2x5cGhfbmFtZSApID09IDAgKQorICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSA9IHR5cGUxLT5nbHlwaF9uYW1lc1tpZHhdOworCisKKyAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCBjaGFyX25hbWUsIGdseXBoX25hbWUgKSA9PSAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXhbY2hhcmNvZGVdID0gKEZUX1VTaG9ydClpZHg7Ci0gICAgICAgICAgICAgIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWUgW2NoYXJjb2RlXSA9IChjaGFyKilnbHlwaF9uYW1lOworICAgICAgICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSBnbHlwaF9uYW1lOwogCiAgICAgICAgICAgICAgIC8qIENoYW5nZSBtaW4vbWF4IGVuY29kZWQgY2hhciBvbmx5IGlmIGdseXBoIG5hbWUgaXMgKi8KICAgICAgICAgICAgICAgLyogbm90IC8ubm90ZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKSIubm90ZGVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilnbHlwaF9uYW1lICkgIT0gMCApCisgICAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCAiLm5vdGRlZiIsIGdseXBoX25hbWUgKSAhPSAwICkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICggY2hhcmNvZGUgPCBtaW5fY2hhciApCiAgICAgICAgICAgICAgICAgICBtaW5fY2hhciA9IGNoYXJjb2RlOwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxbG9hZC5oIGIvc3JjL3R5cGUxL3QxbG9hZC5oCmluZGV4IDAzYmUzZjcuLjQzOTY0MTUgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MWxvYWQuaAorKysgYi9zcmMvdHlwZTEvdDFsb2FkLmgKQEAgLTEsMjkgKzEsMjggQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxbG9hZC5oCisgKgorICogICBUeXBlIDEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUMUxPQURfSF8KICNkZWZpbmUgVDFMT0FEX0hfCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW0uaD4KIAogI2luY2x1ZGUgInQxcGFyc2UuaCIKIApAQCAtMTA2LDYgKzEwNSwxNiBAQAogICBGVF9MT0NBTCggdm9pZCApCiAgIFQxX0RvbmVfQmxlbmQoIFQxX0ZhY2UgIGZhY2UgKTsKIAorICBGVF9MT0NBTCggRlRfRXJyb3IgKQorICBUMV9TZXRfTU1fV2VpZ2h0VmVjdG9yKCBUMV9GYWNlICAgIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHdlaWdodHZlY3RvciApOworCisgIEZUX0xPQ0FMKCBGVF9FcnJvciApCisgIFQxX0dldF9NTV9XZWlnaHRWZWN0b3IoIFQxX0ZhY2UgICAgZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgd2VpZ2h0dmVjdG9yICk7CisKICNlbmRpZiAvKiAhVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUICovCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3Qxb2Jqcy5jIGIvc3JjL3R5cGUxL3Qxb2Jqcy5jCmluZGV4IDczMzNjNGMuLjNiOTE4YjcgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MW9ianMuYworKysgYi9zcmMvdHlwZTEvdDFvYmpzLmMKQEAgLTEsMjcgKzEsMjYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxb2Jqcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxb2Jqcy5jCisgKgorICogICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfSURTX0gKLSNpbmNsdWRlIEZUX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9mdGRyaXZlci5oPgogCiAjaW5jbHVkZSAidDFnbG9hZC5oIgogI2luY2x1ZGUgInQxbG9hZC5oIgpAQCAtMzIsMjUgKzMxLDI1IEBACiAjaW5jbHVkZSAidDFhZm0uaCIKICNlbmRpZgogCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MW9ianMKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0MW9ianMKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSBGVU5DVElPTlMKKyAgICoKKyAgICovCiAKIAogICBzdGF0aWMgUFNIX0dsb2JhbHNfRnVuY3MKQEAgLTEzMywxMSArMTMyLDExIEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TCisgICAqCisgICAqLwogCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIFQxX0dseXBoU2xvdF9Eb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQpAQCAtMTc3LDI0ICsxNzYsMjUgQEAKICAgfQogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNFICBGVU5DVElPTlMKKyAgICoKKyAgICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9GYWNlX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmFjZSBvYmplY3QgZGVzdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVDFfRmFjZV9Eb25lCisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBUaGUgZmFjZSBvYmplY3QgZGVzdHJ1Y3Rvci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGZhY2UgOjoKKyAgICogICAgIEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgZmFjZSBvYmplY3QgdG8gZGVzdHJveS4KKyAgICovCiAgIEZUX0xPQ0FMX0RFRiggdm9pZCApCiAgIFQxX0ZhY2VfRG9uZSggRlRfRmFjZSAgdDFmYWNlICkgICAgICAgICAvKiBUMV9GYWNlICovCiAgIHsKQEAgLTI3NCwyOSArMjc0LDM0IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZhY2VfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmYWNlIG9iamVjdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogIGlucHV0IHN0cmVhbSB3aGVyZSB0byBsb2FkIGZvbnQgZGF0YS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IE51bWJlciBvZiBhZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIGZhY2UgcmVjb3JkIHRvIGJ1aWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUMV9GYWNlX0luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFRoZSBmYWNlIG9iamVjdCBjb25zdHJ1Y3Rvci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIHN0cmVhbSA6OgorICAgKiAgICAgaW5wdXQgc3RyZWFtIHdoZXJlIHRvIGxvYWQgZm9udCBkYXRhLgorICAgKgorICAgKiAgIGZhY2VfaW5kZXggOjoKKyAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgZm9udCBmYWNlIGluIHRoZSByZXNvdXJjZS4KKyAgICoKKyAgICogICBudW1fcGFyYW1zIDo6CisgICAqICAgICBOdW1iZXIgb2YgYWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLgorICAgKgorICAgKiAgIHBhcmFtcyA6OgorICAgKiAgICAgQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLgorICAgKgorICAgKiBASW5PdXQ6CisgICAqICAgZmFjZSA6OgorICAgKiAgICAgVGhlIGZhY2UgcmVjb3JkIHRvIGJ1aWxkLgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVDFfRmFjZV9Jbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCiAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdDFmYWNlLCAgICAgICAgICAvKiBUMV9GYWNlICovCkBAIC0zNDEsNiArMzQ2LDEwIEBACiAgICAgaWYgKCBlcnJvciApCiAgICAgICBnb3RvIEV4aXQ7CiAKKyAgICBGVF9UUkFDRTIoKCAiVDFfRmFjZV9Jbml0OiAlcCAoaW5kZXggJWQpXG4iLAorICAgICAgICAgICAgICAgICh2b2lkICopZmFjZSwKKyAgICAgICAgICAgICAgICBmYWNlX2luZGV4ICkpOworCiAgICAgLyogaWYgd2UganVzdCB3YW50ZWQgdG8gY2hlY2sgdGhlIGZvcm1hdCwgbGVhdmUgc3VjY2Vzc2Z1bGx5IG5vdyAqLwogICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQogICAgICAgZ290byBFeGl0OwpAQCAtNTE2LDcgKzUyNSw4IEBACiAKICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY21hcF9jbGFzc2VzLT51bmljb2RlLCBOVUxMLCAmY2hhcm1hcCwgTlVMTCApOwogICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSApCisgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICYmCisgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogCkBAIC01NjQsMjAgKzU3NCwyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9Ecml2ZXJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIFR5cGUgMSBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVDFfRHJpdmVyX0luaXQKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gVHlwZSAxIGRyaXZlciBvYmplY3QuCisgICAqCisgICAqIEBJbnB1dDoKKyAgICogICBkcml2ZXIgOjoKKyAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZHJpdmVyIG9iamVjdC4KKyAgICoKKyAgICogQFJldHVybjoKKyAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCiAgIFQxX0RyaXZlcl9Jbml0KCBGVF9Nb2R1bGUgIG1vZHVsZSApCiAgIHsKQEAgLTYyMCwxNyArNjMxLDE4IEBACiAgIH0KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0RyaXZlcl9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIFR5cGUgMSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFR5cGUgMSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIEBGdW5jdGlvbjoKKyAgICogICBUMV9Ecml2ZXJfRG9uZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgRmluYWxpemVzIGEgZ2l2ZW4gVHlwZSAxIGRyaXZlci4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRyaXZlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBUeXBlIDEgZHJpdmVyLgorICAgKi8KICAgRlRfTE9DQUxfREVGKCB2b2lkICkKICAgVDFfRHJpdmVyX0RvbmUoIEZUX01vZHVsZSAgZHJpdmVyICkKICAgewpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3Qxb2Jqcy5oIGIvc3JjL3R5cGUxL3Qxb2Jqcy5oCmluZGV4IDgyOThlMDMuLjUzNmJlOGIgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlMS90MW9ianMuaAorKysgYi9zcmMvdHlwZTEvdDFvYmpzLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxb2Jqcy5oCisgKgorICogICBUeXBlIDEgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKICNpZm5kZWYgVDFPQkpTX0hfCkBAIC0yMSw5ICsyMSw5IEBACiAKIAogI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KICNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KIAogCiBGVF9CRUdJTl9IRUFERVIKQEAgLTM0LDU5ICszNCw1OSBAQAogICB0eXBlZGVmIHN0cnVjdCBUMV9HbHlwaF9IaW50c18gIFQxX0dseXBoX0hpbnRzOwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFR5cGU6CisgICAqICAgVDFfU2l6ZQorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgc2l6ZSBvYmplY3QuCisgICAqLwogICB0eXBlZGVmIHN0cnVjdCBUMV9TaXplUmVjXyogIFQxX1NpemU7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFR5cGUgMSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAVHlwZToKKyAgICogICBUMV9HbHlwaFNsb3QKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGdseXBoIHNsb3Qgb2JqZWN0LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgVDFfR2x5cGhTbG90UmVjXyogIFQxX0dseXBoU2xvdDsKIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGNoYXJhY3RlciBtYXBwaW5nIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUeXBlIDEgZm9ybWF0IGRvZXNuJ3QgdXNlIGEgY2hhcm1hcCBidXQgYW4gZW5jb2RpbmcgdGFibGUuICAgICAqLwotICAvKiAgICBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdXAgY2hhcm1hcCBvYmplY3RzICAgICAgICAgICAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFR5cGU6CisgICAqICAgVDFfQ2hhck1hcAorICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LgorICAgKgorICAgKiBATm90ZToKKyAgICogICBUaGUgVHlwZSAxIGZvcm1hdCBkb2Vzbid0IHVzZSBhIGNoYXJtYXAgYnV0IGFuIGVuY29kaW5nIHRhYmxlLgorICAgKiAgIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB1cCBjaGFybWFwIG9iamVjdHMKKyAgICogICBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHRhYmxlcy4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0IFQxX0NoYXJNYXBSZWNfKiAgIFQxX0NoYXJNYXA7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgSEVSRSBCRUdJTlMgVEhFIFRZUEUxIFNQRUNJRklDIFNUVUZGICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiAgICAgICAgICAgICAgICAgSEVSRSBCRUdJTlMgVEhFIFRZUEUxIFNQRUNJRklDIFNUVUZGCisgICAqCisgICAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfU2l6ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwZSAxIHNpemUgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFR5cGU6CisgICAqICAgVDFfU2l6ZVJlYworICAgKgorICAgKiBARGVzY3JpcHRpb246CisgICAqICAgVHlwZSAxIHNpemUgcmVjb3JkLgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFQxX1NpemVSZWNfCiAgIHsKICAgICBGVF9TaXplUmVjICByb290OwpAQCAtMTA1LDE0ICsxMDUsMTQgQEAKICAgVDFfU2l6ZV9Jbml0KCBGVF9TaXplICBzaXplICk7CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUeXBlIDEgZ2x5cGggc2xvdCByZWNvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBAVHlwZToKKyAgICogICBUMV9HbHlwaFNsb3RSZWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIFR5cGUgMSBnbHlwaCBzbG90IHJlY29yZC4KKyAgICovCiAgIHR5cGVkZWYgc3RydWN0ICBUMV9HbHlwaFNsb3RSZWNfCiAgIHsKICAgICBGVF9HbHlwaFNsb3RSZWMgIHJvb3Q7CmRpZmYgLS1naXQgYS9zcmMvdHlwZTEvdDFwYXJzZS5jIGIvc3JjL3R5cGUxL3QxcGFyc2UuYwppbmRleCA4ZTIwMWU1Li43NGNmMzhiIDEwMDY0NAotLS0gYS9zcmMvdHlwZTEvdDFwYXJzZS5jCisrKyBiL3NyYy90eXBlMS90MXBhcnNlLmMKQEAgLTEsNTYgKzEsNTUgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxcGFyc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxcGFyc2UuYworICoKKyAqICAgVHlwZSAxIHBhcnNlciAoYm9keSkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIFR5cGUgMSBwYXJzZXIgaXMgaW4gY2hhcmdlIG9mIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgZ3Jvd2luZyBzZXF1ZW5jZSBvZiBvYmplY3RzIGNhbGxlZCAgKi8KLSAgLyogICAgYSBgVDFfVGFibGUnICh1c2VkIHRvIGJ1aWxkIHZhcmlvdXMgdGFibGVzIG5lZWRlZCBieSB0aGUgbG9hZGVyKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBvcGVuaW5nIC5wZmIgYW5kIC5wZmEgZmlsZXMgdG8gZXh0cmFjdCB0aGVpciB0b3AtbGV2ZWwgYW5kIHByaXZhdGUgKi8KLSAgLyogICAgZGljdGlvbmFyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSByZWFkIG51bWJlcnMsIGFycmF5cyAmIHN0cmluZ3MgZnJvbSBhbnkgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSBgdDFsb2FkLmMnIHRvIHNlZSBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZm9udCBmaWxlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgVHlwZSAxIHBhcnNlciBpcyBpbiBjaGFyZ2Ugb2YgdGhlIGZvbGxvd2luZzoKKyAgICoKKyAgICogLSBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgZ3Jvd2luZyBzZXF1ZW5jZSBvZiBvYmplY3RzIGNhbGxlZAorICAgKiAgIGEgYFQxX1RhYmxlJyAodXNlZCB0byBidWlsZCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgYnkgdGhlIGxvYWRlcikuCisgICAqCisgICAqIC0gb3BlbmluZyAucGZiIGFuZCAucGZhIGZpbGVzIHRvIGV4dHJhY3QgdGhlaXIgdG9wLWxldmVsIGFuZCBwcml2YXRlCisgICAqICAgZGljdGlvbmFyaWVzLgorICAgKgorICAgKiAtIHJlYWQgbnVtYmVycywgYXJyYXlzICYgc3RyaW5ncyBmcm9tIGFueSBkaWN0aW9uYXJ5LgorICAgKgorICAgKiBTZWUgYHQxbG9hZC5jJyB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGZvbnQgZmlsZS4KKyAgICoKKyAgICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+CiAKICNpbmNsdWRlICJ0MXBhcnNlLmgiCiAKICNpbmNsdWRlICJ0MWVycm9ycy5oIgogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQKKyAgICogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cKKyAgICogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKyAgICovCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3QxcGFyc2UKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0MXBhcnNlCiAKIAogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE2OSwyMSArMTY4LDIxIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEhlcmUgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgaXMgZ29pbmcgb246ICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgVHlwZSAxIHBhcnNlciwgd2UgdHJ5IHRvIGxvY2F0ZSBhbmQgbG9hZCAqLwotICAgIC8qICAgdGhlIGJhc2UgZGljdGlvbmFyeSBpZiB0aGlzIGlzIHBvc3NpYmxlIChpLmUuLCBmb3IgUEZCICAgICAgICovCi0gICAgLyogICBmaWxlcykuICBPdGhlcndpc2UsIHdlIGxvYWQgdGhlIHdob2xlIGZvbnQgaW50byBtZW1vcnkuICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2hlbiBgbG9hZGluZycgdGhlIGJhc2UgZGljdGlvbmFyeSwgd2Ugb25seSBzZXR1cCBwb2ludGVycyAgICovCi0gICAgLyogICBpbiB0aGUgY2FzZSBvZiBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICBPdGhlcndpc2UsIHdlICAgICAgICAgKi8KLSAgICAvKiAgIGFsbG9jYXRlIGFuZCBsb2FkIHRoZSBiYXNlIGRpY3Rpb25hcnkgaW4gaXQuICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBwYXJzZXItPmluX3BmYiBpcyBzZXQgaWYgd2UgYXJlIGluIGEgYmluYXJ5IChgLnBmYicpIGZvbnQuICAgKi8KLSAgICAvKiAgIHBhcnNlci0+aW5fbWVtb3J5IGlzIHNldCBpZiB3ZSBoYXZlIGEgbWVtb3J5IHN0cmVhbS4gICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIEhlcmUgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgaXMgZ29pbmcgb246CisgICAgICoKKyAgICAgKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgVHlwZSAxIHBhcnNlciwgd2UgdHJ5IHRvIGxvY2F0ZSBhbmQgbG9hZAorICAgICAqICAgdGhlIGJhc2UgZGljdGlvbmFyeSBpZiB0aGlzIGlzIHBvc3NpYmxlIChpLmUuLCBmb3IgUEZCCisgICAgICogICBmaWxlcykuICBPdGhlcndpc2UsIHdlIGxvYWQgdGhlIHdob2xlIGZvbnQgaW50byBtZW1vcnkuCisgICAgICoKKyAgICAgKiAgIFdoZW4gYGxvYWRpbmcnIHRoZSBiYXNlIGRpY3Rpb25hcnksIHdlIG9ubHkgc2V0dXAgcG9pbnRlcnMKKyAgICAgKiAgIGluIHRoZSBjYXNlIG9mIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gIE90aGVyd2lzZSwgd2UKKyAgICAgKiAgIGFsbG9jYXRlIGFuZCBsb2FkIHRoZSBiYXNlIGRpY3Rpb25hcnkgaW4gaXQuCisgICAgICoKKyAgICAgKiAgIHBhcnNlci0+aW5fcGZiIGlzIHNldCBpZiB3ZSBhcmUgaW4gYSBiaW5hcnkgKGAucGZiJykgZm9udC4KKyAgICAgKiAgIHBhcnNlci0+aW5fbWVtb3J5IGlzIHNldCBpZiB3ZSBoYXZlIGEgbWVtb3J5IHN0cmVhbS4KKyAgICAgKi8KIAogICAgIC8qIHRyeSB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBiYXNlIGRpY3Rpb25hcnk7ICAgICAqLwogICAgIC8qIGxvb2sgZm9yIGEgUG9zdHNjcmlwdCBiaW5hcnkgZmlsZSB0YWcsIGkuZS4sIDB4ODAwMSAqLwpkaWZmIC0tZ2l0IGEvc3JjL3R5cGUxL3QxcGFyc2UuaCBiL3NyYy90eXBlMS90MXBhcnNlLmgKaW5kZXggNGFjODJhZS4uMWVhMDExMCAxMDA2NDQKLS0tIGEvc3JjL3R5cGUxL3QxcGFyc2UuaAorKysgYi9zcmMvdHlwZTEvdDFwYXJzZS5oCkBAIC0xLDYzICsxLDcxIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MXBhcnNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIHBhcnNlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0MXBhcnNlLmgKKyAqCisgKiAgIFR5cGUgMSBwYXJzZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUMVBBUlNFX0hfCiAjZGVmaW5lIFQxUEFSU0VfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvdDF0eXBlcy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CiAKIAogRlRfQkVHSU5fSEVBREVSCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFBTX1BhcnNlclJlYyBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250cyB2ZXJ5ICAgICAgKi8KLSAgLyogICAgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgIDo6IFRoZSByb290IHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgOjogVGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfZGljdCAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRvcC1sZXZlbCBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9sZW4gICAgIDo6IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHRvcCBkaWN0aW9uYXJ5LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwcml2YXRlX2RpY3QgOjogQSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHByaXZhdGVfbGVuICA6OiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fcGZiICAgICAgIDo6IEEgYm9vbGVhbi4gIEluZGljYXRlcyB0aGF0IHdlIGFyZSBoYW5kbGluZyBhIFBGQiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fbWVtb3J5ICAgIDo6IEEgYm9vbGVhbi4gIEluZGljYXRlcyBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaW5nbGVfYmxvY2sgOjogQSBib29sZWFuLiAgSW5kaWNhdGVzIHRoYXQgdGhlIHByaXZhdGUgZGljdGlvbmFyeSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGlzIHN0b3JlZCBpbiBsaWV1IG9mIHRoZSBiYXNlIGRpY3Rpb25hcnkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogQFN0cnVjdDoKKyAgICogICBUMV9QYXJzZXJSZWMKKyAgICoKKyAgICogQERlc2NyaXB0aW9uOgorICAgKiAgIEEgUFNfUGFyc2VyUmVjIGlzIGFuIG9iamVjdCB1c2VkIHRvIHBhcnNlIGEgVHlwZSAxIGZvbnRzIHZlcnkKKyAgICogICBxdWlja2x5LgorICAgKgorICAgKiBARmllbGRzOgorICAgKiAgIHJvb3QgOjoKKyAgICogICAgIFRoZSByb290IHBhcnNlci4KKyAgICoKKyAgICogICBzdHJlYW0gOjoKKyAgICogICAgIFRoZSBjdXJyZW50IGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogICBiYXNlX2RpY3QgOjoKKyAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdG9wLWxldmVsIGRpY3Rpb25hcnkuCisgICAqCisgICAqICAgYmFzZV9sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHRvcCBkaWN0aW9uYXJ5LgorICAgKgorICAgKiAgIHByaXZhdGVfZGljdCA6OgorICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkuCisgICAqCisgICAqICAgcHJpdmF0ZV9sZW4gOjoKKyAgICogICAgIFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHByaXZhdGUgZGljdGlvbmFyeS4KKyAgICoKKyAgICogICBpbl9wZmIgOjoKKyAgICogICAgIEEgYm9vbGVhbi4gIEluZGljYXRlcyB0aGF0IHdlIGFyZSBoYW5kbGluZyBhIFBGQgorICAgKiAgICAgZmlsZS4KKyAgICoKKyAgICogICBpbl9tZW1vcnkgOjoKKyAgICogICAgIEEgYm9vbGVhbi4gIEluZGljYXRlcyBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uCisgICAqCisgICAqICAgc2luZ2xlX2Jsb2NrIDo6CisgICAqICAgICBBIGJvb2xlYW4uICBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5CisgICAqICAgICBpcyBzdG9yZWQgaW4gbGlldSBvZiB0aGUgYmFzZSBkaWN0aW9uYXJ5LgorICAgKi8KICAgdHlwZWRlZiBzdHJ1Y3QgIFQxX1BhcnNlclJlY18KICAgewogICAgIFBTX1BhcnNlclJlYyAgcm9vdDsKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90MXRva2Vucy5oIGIvc3JjL3R5cGUxL3QxdG9rZW5zLmgKaW5kZXggNDNhNjVkOC4uYzA5NDIwMyAxMDA2NDQKLS0tIGEvc3JjL3R5cGUxL3QxdG9rZW5zLmgKKysrIGIvc3JjL3R5cGUxL3QxdG9rZW5zLmgKQEAgLTEsMTkgKzEsMTkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxdG9rZW5zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgdG9rZW5pemVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQxdG9rZW5zLmgKKyAqCisgKiAgIFR5cGUgMSB0b2tlbml6ZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI3VuZGVmICBGVF9TVFJVQ1RVUkUKZGlmZiAtLWdpdCBhL3NyYy90eXBlMS90eXBlMS5jIGIvc3JjL3R5cGUxL3R5cGUxLmMKaW5kZXggNzJlZmY1OS4uY2FkZWU3OCAxMDA2NDQKLS0tIGEvc3JjL3R5cGUxL3R5cGUxLmMKKysrIGIvc3JjL3R5cGUxL3R5cGUxLmMKQEAgLTEsMjMgKzEsMjIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR5cGUxLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUeXBlIDEgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHR5cGUxLmMKKyAqCisgKiAgIEZyZWVUeXBlIFR5cGUgMSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInQxYWZtLmMiCiAjaW5jbHVkZSAidDFkcml2ZXIuYyIKZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvSmFtZmlsZSBiL3NyYy90eXBlNDIvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4ZGUwNS4uMDAwMDAwMAotLS0gYS9zcmMvdHlwZTQyL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3R5cGU0MiBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgdHlwZTQyIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSB0NDJkcml2cgotICAgICAgICAgICAgICAgdDQyb2JqcwotICAgICAgICAgICAgICAgdDQycGFyc2UKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHR5cGU0MiA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy90eXBlNDIgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi9tb2R1bGUubWsgYi9zcmMvdHlwZTQyL21vZHVsZS5tawppbmRleCAzZDQ3MzJiLi42ZWYzYTk1IDEwMDY0NAotLS0gYS9zcmMvdHlwZTQyL21vZHVsZS5taworKysgYi9zcmMvdHlwZTQyL21vZHVsZS5tawpAQCAtMyw3ICszLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAyLTIwMTggYnkKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi9ydWxlcy5tayBiL3NyYy90eXBlNDIvcnVsZXMubWsKaW5kZXggOTMyNWQzOC4uZjRjZTkxYSAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi9ydWxlcy5taworKysgYi9zcmMvdHlwZTQyL3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDItMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MmRyaXZyLmMgYi9zcmMvdHlwZTQyL3Q0MmRyaXZyLmMKaW5kZXggZjU3OWIyNy4uOTA4OThiNCAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90NDJkcml2ci5jCisrKyBiL3NyYy90eXBlNDIvdDQyZHJpdnIuYwpAQCAtMSw1OCArMSw1OCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDQyZHJpdnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHlwZSA0MiBkcml2ZXIgaW50ZXJmYWNlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSb2JlcnRvIEFsYW1lZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDQyZHJpdnIuYworICoKKyAqICAgSGlnaC1sZXZlbCBUeXBlIDQyIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZHJpdmVyIGltcGxlbWVudHMgVHlwZTQyIGZvbnRzIGFzIGRlc2NyaWJlZCBpbiB0aGUgICAgICAgICAgICAgICAqLwotICAvKiBUZWNobmljYWwgTm90ZSAjNTAxMiBmcm9tIEFkb2JlLCB3aXRoIHRoZXNlIGxpbWl0YXRpb25zOiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDEpIENJRCBGb250cyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAyKSBJbmNyZW1lbnRhbCBmb250cyBtYWtpbmcgdXNlIG9mIHRoZSBHbHlwaERpcmVjdG9yeSBrZXl3b3JkICAgICAgICAgKi8KLSAgLyogICAgd2lsbCBiZSBsb2FkZWQsIGJ1dCB0aGUgcmVuZGVyaW5nIHdpbGwgYmUgdXNpbmcgdGhlIFRydWVUeXBlICAgICAgICovCi0gIC8qICAgIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAzKSBBcyBmb3IgVHlwZTEgZm9udHMsIENEZXZQcm9jIGlzIG5vdCBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogNCkgVGhlIE1ldHJpY3MgZGljdGlvbmFyeSBpcyBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDUpIEFGTSBtZXRyaWNzIGFyZSBub3Qgc3VwcG9ydGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gb3RoZXIgd29yZHMsIHRoaXMgZHJpdmVyIHN1cHBvcnRzIFR5cGU0MiBmb250cyBkZXJpdmVkIGZyb20gICAgICAgICovCi0gIC8qIFRydWVUeXBlIGZvbnRzIGluIGEgbm9uLUNJRCBtYW5uZXIsIGFzIGRvbmUgYnkgdXN1YWwgY29udmVyc2lvbiAgICAgICAqLwotICAvKiBwcm9ncmFtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBUeXBlNDIgZm9udHMgYXMgZGVzY3JpYmVkIGluIHRoZQorICAgKiBUZWNobmljYWwgTm90ZSAjNTAxMiBmcm9tIEFkb2JlLCB3aXRoIHRoZXNlIGxpbWl0YXRpb25zOgorICAgKgorICAgKiAxKSBDSUQgRm9udHMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgKiAyKSBJbmNyZW1lbnRhbCBmb250cyBtYWtpbmcgdXNlIG9mIHRoZSBHbHlwaERpcmVjdG9yeSBrZXl3b3JkCisgICAqICAgIHdpbGwgYmUgbG9hZGVkLCBidXQgdGhlIHJlbmRlcmluZyB3aWxsIGJlIHVzaW5nIHRoZSBUcnVlVHlwZQorICAgKiAgICB0YWJsZXMuCisgICAqIDMpIEFzIGZvciBUeXBlMSBmb250cywgQ0RldlByb2MgaXMgbm90IHN1cHBvcnRlZC4KKyAgICogNCkgVGhlIE1ldHJpY3MgZGljdGlvbmFyeSBpcyBub3Qgc3VwcG9ydGVkLgorICAgKiA1KSBBRk0gbWV0cmljcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICoKKyAgICogSW4gb3RoZXIgd29yZHMsIHRoaXMgZHJpdmVyIHN1cHBvcnRzIFR5cGU0MiBmb250cyBkZXJpdmVkIGZyb20KKyAgICogVHJ1ZVR5cGUgZm9udHMgaW4gYSBub24tQ0lEIG1hbm5lciwgYXMgZG9uZSBieSB1c3VhbCBjb252ZXJzaW9uCisgICAqIHByb2dyYW1zLgorICAgKgorICAgKi8KIAogCiAjaW5jbHVkZSAidDQyZHJpdnIuaCIKICNpbmNsdWRlICJ0NDJvYmpzLmgiCiAjaW5jbHVkZSAidDQyZXJyb3IuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmg+CiAKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9JTkZPX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z2xkaWN0Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oPgogCiAjdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3Q0MgorI2RlZmluZSBGVF9DT01QT05FTlQgIHQ0MgogCiAKICAgLyoKICAgICoKLSAgICogIEdMWVBIIERJQ1QgU0VSVklDRQorICAgKiBHTFlQSCBESUNUIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTY5LDggKzY5LDggQEAKIAogCiAgIHN0YXRpYyBGVF9VSW50Ci0gIHQ0Ml9nZXRfbmFtZV9pbmRleCggVDQyX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKKyAgdDQyX2dldF9uYW1lX2luZGV4KCBUNDJfRmFjZSAgICAgICAgICBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGdseXBoX25hbWUgKQogICB7CiAgICAgRlRfSW50ICBpOwogCkBAIC05OCw3ICs5OCw3IEBACiAKICAgLyoKICAgICoKLSAgICogIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCisgICAqIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCiAgICAqCiAgICAqLwogCkBAIC0xMTcsNyArMTE3LDcgQEAKIAogICAvKgogICAgKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKKyAgICogUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKICAgICoKICAgICovCiAKQEAgLTE3Myw3ICsxNzMsNyBAQAogCiAgIC8qCiAgICAqCi0gICAqICBTRVJWSUNFIExJU1QKKyAgICogU0VSVklDRSBMSVNUCiAgICAqCiAgICAqLwogCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MmRyaXZyLmggYi9zcmMvdHlwZTQyL3Q0MmRyaXZyLmgKaW5kZXggMzY2N2YzZS4uOGJmMmFmYyAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90NDJkcml2ci5oCisrKyBiL3NyYy90eXBlNDIvdDQyZHJpdnIuaApAQCAtMSwzOSArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDQyZHJpdnIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHlwZSA0MiBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSb2JlcnRvIEFsYW1lZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDQyZHJpdnIuaAorICoKKyAqICAgSGlnaC1sZXZlbCBUeXBlIDQyIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUNDJEUklWUl9IXwogI2RlZmluZSBUNDJEUklWUl9IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQogICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgdDQyX2RyaXZlcl9jbGFzczsKIAotCiBGVF9FTkRfSEVBREVSCiAKIApkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90NDJlcnJvci5oIGIvc3JjL3R5cGU0Mi90NDJlcnJvci5oCmluZGV4IGUzOTc4YTcuLmU0ODEzMmUgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlNDIvdDQyZXJyb3IuaAorKysgYi9zcmMvdHlwZTQyL3Q0MmVycm9yLmgKQEAgLTEsMzEgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0MmVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQ0MmVycm9yLmgKKyAqCisgKiAgIFR5cGUgNDIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBUeXBlIDQyIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgVHlwZSA0MiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuCisgICAqCisgICAqLwogCiAjaWZuZGVmIFQ0MkVSUk9SX0hfCiAjZGVmaW5lIFQ0MkVSUk9SX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zMyw3ICszMyw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIFQ0Ml9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfVHlwZTQyCiAKLSNpbmNsdWRlIEZUX0VSUk9SU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnRlcnJvcnMuaD4KIAogI2VuZGlmIC8qIFQ0MkVSUk9SX0hfICovCiAKZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvdDQyb2Jqcy5jIGIvc3JjL3R5cGU0Mi90NDJvYmpzLmMKaW5kZXggNjZlNWM0MC4uNmFjZmNkZiAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90NDJvYmpzLmMKKysrIGIvc3JjL3R5cGU0Mi90NDJvYmpzLmMKQEAgLTEsMzEgKzEsMzEgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0Mm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIG9iamVjdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQ0Mm9ianMuYworICoKKyAqICAgVHlwZSA0MiBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgInQ0Mm9ianMuaCIKICNpbmNsdWRlICJ0NDJwYXJzZS5oIgogI2luY2x1ZGUgInQ0MmVycm9yLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9MSVNUX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bGlzdC5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL3R0bmFtZWlkLmg+CiAKIAogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90NDIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0NDIKIAogCiAgIHN0YXRpYyBGVF9FcnJvcgpAQCAtOTgsOCArOTgsNyBAQAogICAgIC8qIHdlIG11c3Qgbm93IGJ1aWxkIHR5cGUxLmVuY29kaW5nIHdoZW4gd2UgaGF2ZSBhIGN1c3RvbSBhcnJheSAqLwogICAgIGlmICggdHlwZTEtPmVuY29kaW5nX3R5cGUgPT0gVDFfRU5DT0RJTkdfVFlQRV9BUlJBWSApCiAgICAgewotICAgICAgRlRfSW50ICAgIGNoYXJjb2RlLCBpZHgsIG1pbl9jaGFyLCBtYXhfY2hhcjsKLSAgICAgIEZUX0J5dGUqICBnbHlwaF9uYW1lOworICAgICAgRlRfSW50ICBjaGFyY29kZSwgaWR4LCBtaW5fY2hhciwgbWF4X2NoYXI7CiAKIAogICAgICAgLyogT0ssIHdlIGRvIHRoZSBmb2xsb3dpbmc6IGZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIGVuY29kaW5nICAgKi8KQEAgLTExNCwyNyArMTEzLDI3IEBACiAgICAgICBjaGFyY29kZSA9IDA7CiAgICAgICBmb3IgKCA7IGNoYXJjb2RlIDwgbG9hZGVyLmVuY29kaW5nX3RhYmxlLm1heF9lbGVtczsgY2hhcmNvZGUrKyApCiAgICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjaGFyX25hbWU7CisgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGNoYXJfbmFtZSA9CisgICAgICAgICAgICAgIChjb25zdCBGVF9TdHJpbmcqKWxvYWRlci5lbmNvZGluZ190YWJsZS5lbGVtZW50c1tjaGFyY29kZV07CiAKIAogICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9pbmRleFtjaGFyY29kZV0gPSAwOwotICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSAoY2hhciAqKSIubm90ZGVmIjsKKyAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZSBbY2hhcmNvZGVdID0gIi5ub3RkZWYiOwogCi0gICAgICAgIGNoYXJfbmFtZSA9IGxvYWRlci5lbmNvZGluZ190YWJsZS5lbGVtZW50c1tjaGFyY29kZV07CiAgICAgICAgIGlmICggY2hhcl9uYW1lICkKICAgICAgICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCB0eXBlMS0+bnVtX2dseXBoczsgaWR4KysgKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoX25hbWUgPSAoRlRfQnl0ZSopdHlwZTEtPmdseXBoX25hbWVzW2lkeF07Ci0gICAgICAgICAgICBpZiAoIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKWNoYXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZ2x5cGhfbmFtZSApID09IDAgKQorICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSA9IHR5cGUxLT5nbHlwaF9uYW1lc1tpZHhdOworCisKKyAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCBjaGFyX25hbWUsIGdseXBoX25hbWUgKSA9PSAwICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXhbY2hhcmNvZGVdID0gKEZUX1VTaG9ydClpZHg7Ci0gICAgICAgICAgICAgIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWUgW2NoYXJjb2RlXSA9IChjaGFyKilnbHlwaF9uYW1lOworICAgICAgICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSBnbHlwaF9uYW1lOwogCiAgICAgICAgICAgICAgIC8qIENoYW5nZSBtaW4vbWF4IGVuY29kZWQgY2hhciBvbmx5IGlmIGdseXBoIG5hbWUgaXMgKi8KICAgICAgICAgICAgICAgLyogbm90IC8ubm90ZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBpZiAoIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKSIubm90ZGVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilnbHlwaF9uYW1lICkgIT0gMCApCisgICAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCAiLm5vdGRlZiIsIGdseXBoX25hbWUgKSAhPSAwICkKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICggY2hhcmNvZGUgPCBtaW5fY2hhciApCiAgICAgICAgICAgICAgICAgICBtaW5fY2hhciA9IGNoYXJjb2RlOwpAQCAtMzU0LDcgKzM1Myw4IEBACiAKICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY21hcF9jbGFzc2VzLT51bmljb2RlLCBOVUxMLCAmY2hhcm1hcCwgTlVMTCApOwogICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSApCisgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICYmCisgICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApICkKICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwogCkBAIC00NTcsMjAgKzQ1NywyMSBAQAogICB9CiAKIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUNDJfRHJpdmVyX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIFR5cGUgNDIgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBARnVuY3Rpb246CisgICAqICAgVDQyX0RyaXZlcl9Jbml0CisgICAqCisgICAqIEBEZXNjcmlwdGlvbjoKKyAgICogICBJbml0aWFsaXplcyBhIGdpdmVuIFR5cGUgNDIgZHJpdmVyIG9iamVjdC4KKyAgICoKKyAgICogQElucHV0OgorICAgKiAgIGRyaXZlciA6OgorICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LgorICAgKgorICAgKiBAUmV0dXJuOgorICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCisgICAqLwogICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKICAgVDQyX0RyaXZlcl9Jbml0KCBGVF9Nb2R1bGUgIG1vZHVsZSApICAgICAgICAvKiBUNDJfRHJpdmVyICovCiAgIHsKZGlmZiAtLWdpdCBhL3NyYy90eXBlNDIvdDQyb2Jqcy5oIGIvc3JjL3R5cGU0Mi90NDJvYmpzLmgKaW5kZXggM2JhZDUxMy4uNjlmNWNmZiAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90NDJvYmpzLmgKKysrIGIvc3JjL3R5cGU0Mi90NDJvYmpzLmgKQEAgLTEsMzMgKzEsMzIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0Mm9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQ0Mm9ianMuaAorICoKKyAqICAgVHlwZSA0MiBvYmplY3RzIG1hbmFnZXIgKHNwZWNpZmljYXRpb24pLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUNDJPQkpTX0hfCiAjZGVmaW5lIFQ0Mk9CSlNfSF8KIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdDF0YWJsZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CiAjaW5jbHVkZSAidDQydHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHNjbWFwLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90NDJwYXJzZS5jIGIvc3JjL3R5cGU0Mi90NDJwYXJzZS5jCmluZGV4IDQ4MTNkMWYuLjk4NTA3NjkgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlNDIvdDQycGFyc2UuYworKysgYi9zcmMvdHlwZTQyL3Q0MnBhcnNlLmMKQEAgLTEsMzYgKzEsMzYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0MnBhcnNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIGZvbnQgcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQ0MnBhcnNlLmMKKyAqCisgKiAgIFR5cGUgNDIgZm9udCBwYXJzZXIgKGJvZHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2luY2x1ZGUgInQ0MnBhcnNlLmgiCiAjaW5jbHVkZSAidDQyZXJyb3IuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaD4KIAogCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgKgorICAgKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0CisgICAqIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nCisgICAqIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uCisgICAqLwogI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90NDIKKyNkZWZpbmUgRlRfQ09NUE9ORU5UICB0NDIKIAogCiAgIHN0YXRpYyB2b2lkCkBAIC0xNDksMTkgKzE0OSwxOSBAQAogICAgIHBhcnNlci0+YmFzZV9kaWN0ID0gTlVMTDsKICAgICBwYXJzZXItPmluX21lbW9yeSA9IDA7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBIZXJlIGEgc2hvcnQgc3VtbWFyeSBvZiB3aGF0IGlzIGdvaW5nIG9uOiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgVHlwZSA0MiBwYXJzZXIsIHdlIHRyeSB0byBsb2NhdGUgYW5kIGxvYWQgKi8KLSAgICAvKiAgIHRoZSBiYXNlIGRpY3Rpb25hcnksIGxvYWRpbmcgdGhlIHdob2xlIGZvbnQgaW50byBtZW1vcnkuICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFdoZW4gYGxvYWRpbmcnIHRoZSBiYXNlIGRpY3Rpb25hcnksIHdlIG9ubHkgc2V0IHVwIHBvaW50ZXJzICAgKi8KLSAgICAvKiAgIGluIHRoZSBjYXNlIG9mIGEgbWVtb3J5LWJhc2VkIHN0cmVhbS4gIE90aGVyd2lzZSwgd2UgYWxsb2NhdGUgKi8KLSAgICAvKiAgIGFuZCBsb2FkIHRoZSBiYXNlIGRpY3Rpb25hcnkgaW4gaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIHBhcnNlci0+aW5fbWVtb3J5IGlzIHNldCBpZiB3ZSBoYXZlIGEgbWVtb3J5IHN0cmVhbS4gICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKgorICAgICAqIEhlcmUgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgaXMgZ29pbmcgb246CisgICAgICoKKyAgICAgKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgVHlwZSA0MiBwYXJzZXIsIHdlIHRyeSB0byBsb2NhdGUgYW5kIGxvYWQKKyAgICAgKiAgIHRoZSBiYXNlIGRpY3Rpb25hcnksIGxvYWRpbmcgdGhlIHdob2xlIGZvbnQgaW50byBtZW1vcnkuCisgICAgICoKKyAgICAgKiAgIFdoZW4gYGxvYWRpbmcnIHRoZSBiYXNlIGRpY3Rpb25hcnksIHdlIG9ubHkgc2V0IHVwIHBvaW50ZXJzCisgICAgICogICBpbiB0aGUgY2FzZSBvZiBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICBPdGhlcndpc2UsIHdlIGFsbG9jYXRlCisgICAgICogICBhbmQgbG9hZCB0aGUgYmFzZSBkaWN0aW9uYXJ5IGluIGl0LgorICAgICAqCisgICAgICogICBwYXJzZXItPmluX21lbW9yeSBpcyBzZXQgaWYgd2UgaGF2ZSBhIG1lbW9yeSBzdHJlYW0uCisgICAgICovCiAKICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwTCApIHx8CiAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggMTcgKSApCkBAIC0yMjYsNyArMjI2LDggQEAKICAgICBpZiAoICFwYXJzZXItPmluX21lbW9yeSApCiAgICAgICBGVF9GUkVFKCBwYXJzZXItPmJhc2VfZGljdCApOwogCi0gICAgcGFyc2VyLT5yb290LmZ1bmNzLmRvbmUoICZwYXJzZXItPnJvb3QgKTsKKyAgICBpZiAoIHBhcnNlci0+cm9vdC5mdW5jcy5kb25lICkKKyAgICAgIHBhcnNlci0+cm9vdC5mdW5jcy5kb25lKCAmcGFyc2VyLT5yb290ICk7CiAgIH0KIAogCkBAIC0yODQsNiArMjg1LDEzIEBACiAgICAgbWF0cml4LT54eSA9IHRlbXBbMl07CiAgICAgbWF0cml4LT55eSA9IHRlbXBbM107CiAKKyAgICBpZiAoICFGVF9NYXRyaXhfQ2hlY2soIG1hdHJpeCApICkKKyAgICB7CisgICAgICBGVF9FUlJPUigoICJ0NDJfcGFyc2VfZm9udF9tYXRyaXg6IGludmFsaWQgZm9udCBtYXRyaXhcbiIgKSk7CisgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIC8qIG5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBtdXN0IGJlIGV4cHJlc3NlZCBpbiBpbnRlZ2VyIGZvbnQgdW5pdHMgKi8KICAgICBvZmZzZXQtPnggPSB0ZW1wWzRdID4+IDE2OwogICAgIG9mZnNldC0+eSA9IHRlbXBbNV0gPj4gMTY7CkBAIC0zNjYsMTIgKzM3NCw3IEBACiAKICAgICAgIC8qIFdlIG5lZWQgdG8gYHplcm8nIG91dCBlbmNvZGluZ190YWJsZS5lbGVtZW50cyAqLwogICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHsKLSAgICAgICAgY2hhciogIG5vdGRlZiA9IChjaGFyICopIi5ub3RkZWYiOwotCi0KLSAgICAgICAgKHZvaWQpVDFfQWRkX1RhYmxlKCBjaGFyX3RhYmxlLCBuLCBub3RkZWYsIDggKTsKLSAgICAgIH0KKyAgICAgICAgKHZvaWQpVDFfQWRkX1RhYmxlKCBjaGFyX3RhYmxlLCBuLCAiLm5vdGRlZiIsIDggKTsKIAogICAgICAgLyogTm93IHdlIG5lZWQgdG8gcmVhZCByZWNvcmRzIG9mIHRoZSBmb3JtICAgICAgICAgICAgICAgICovCiAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU4OCw2ICs1OTEsMTQgQEAKIAogICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJzwnICkKICAgICAgIHsKKyAgICAgICAgaWYgKCBzdHJpbmdfYnVmICYmICFhbGxvY2F0ZWQgKQorICAgICAgICB7CisgICAgICAgICAgRlRfRVJST1IoKCAidDQyX3BhcnNlX3NmbnRzOiAiCisgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgaGFuZGxlIG1peGVkIGJpbmFyeSBhbmQgaGV4IHN0cmluZ3NcbiIgKSk7CisgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOworICAgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgfQorCiAgICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwogICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCiAgICAgICAgICAgZ290byBFeGl0OwpAQCAtODE1LDcgKzgyNiw3IEBACiAgICAgICBpZiAoIGxvYWRlci0+bnVtX2dseXBocyA+ICggbGltaXQgLSBwYXJzZXItPnJvb3QuY3Vyc29yICkgPj4gMiApCiAgICAgICB7CiAgICAgICAgIEZUX1RSQUNFMCgoICJ0NDJfcGFyc2VfY2hhcnN0cmluZ3M6IGFkanVzdGluZyBudW1iZXIgb2YgZ2x5cGhzIgotICAgICAgICAgICAgICAgICAgICAiIChmcm9tICVkIHRvICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIiAoZnJvbSAlZCB0byAlbGQpXG4iLAogICAgICAgICAgICAgICAgICAgICBsb2FkZXItPm51bV9nbHlwaHMsCiAgICAgICAgICAgICAgICAgICAgICggbGltaXQgLSBwYXJzZXItPnJvb3QuY3Vyc29yICkgPj4gMiApKTsKICAgICAgICAgbG9hZGVyLT5udW1fZ2x5cGhzID0gKCBsaW1pdCAtIHBhcnNlci0+cm9vdC5jdXJzb3IgKSA+PiAyOwpAQCAtMTAwNiw4ICsxMDE3LDcgQEAKICAgICB9CiAKICAgICAvKiBpZiAvLm5vdGRlZiBkb2VzIG5vdCBvY2N1cHkgaW5kZXggMCwgZG8gb3VyIG1hZ2ljLiAqLwotICAgIGlmICggZnRfc3RyY21wKCAoY29uc3QgY2hhciopIi5ub3RkZWYiLAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopbmFtZV90YWJsZS0+ZWxlbWVudHNbMF0gKSApCisgICAgaWYgKCBmdF9zdHJjbXAoICIubm90ZGVmIiwgKGNvbnN0IGNoYXIqKW5hbWVfdGFibGUtPmVsZW1lbnRzWzBdICkgKQogICAgIHsKICAgICAgIC8qIFN3YXAgZ2x5cGggaW4gaW5kZXggMCB3aXRoIC8ubm90ZGVmIGdseXBoLiAgRmlyc3QsIGFkZCBpbmRleCAwICAqLwogICAgICAgLyogbmFtZSBhbmQgY29kZSBlbnRyaWVzIHRvIHN3YXBfdGFibGUuICBUaGVuIHBsYWNlIG5vdGRlZl9pbmRleCAgICovCmRpZmYgLS1naXQgYS9zcmMvdHlwZTQyL3Q0MnBhcnNlLmggYi9zcmMvdHlwZTQyL3Q0MnBhcnNlLmgKaW5kZXggZjM1ZDIzZC4uMmNjZjA1MiAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90NDJwYXJzZS5oCisrKyBiL3NyYy90eXBlNDIvdDQycGFyc2UuaApAQCAtMSwxOSArMSwxOSBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDQycGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgNDIgZm9udCBwYXJzZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSb2JlcnRvIEFsYW1lZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdDQycGFyc2UuaAorICoKKyAqICAgVHlwZSA0MiBmb250IHBhcnNlciAoc3BlY2lmaWNhdGlvbikuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMjAgYnkKKyAqIFJvYmVydG8gQWxhbWVkYS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFQ0MlBBUlNFX0hfCkBAIC0yMSw3ICsyMSw3IEBACiAKIAogI2luY2x1ZGUgInQ0Mm9ianMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9wc2F1eC5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90NDJ0eXBlcy5oIGIvc3JjL3R5cGU0Mi90NDJ0eXBlcy5oCmluZGV4IGQwYWEyZGUuLmJhMGNjMjEgMTAwNjQ0Ci0tLSBhL3NyYy90eXBlNDIvdDQydHlwZXMuaAorKysgYi9zcmMvdHlwZTQyL3Q0MnR5cGVzLmgKQEAgLTEsMzAgKzEsMjkgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQ0MnR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDQyIGZvbnQgZGF0YSB0eXBlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE4IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUm9iZXJ0byBBbGFtZWRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHQ0MnR5cGVzLmgKKyAqCisgKiAgIFR5cGUgNDIgZm9udCBkYXRhIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBSb2JlcnRvIEFsYW1lZGEuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2lmbmRlZiBUNDJUWVBFU19IXwogI2RlZmluZSBUNDJUWVBFU19IXwogCiAKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfVFlQRTFfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdDF0YWJsZXMuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgpkaWZmIC0tZ2l0IGEvc3JjL3R5cGU0Mi90eXBlNDIuYyBiL3NyYy90eXBlNDIvdHlwZTQyLmMKaW5kZXggNmE4OWNmYi4uMDEyNTU5ZSAxMDA2NDQKLS0tIGEvc3JjL3R5cGU0Mi90eXBlNDIuYworKysgYi9zcmMvdHlwZTQyL3R5cGU0Mi5jCkBAIC0xLDIzICsxLDIyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0eXBlNDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgVHlwZSA0MiBkcml2ZXIgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB0eXBlNDIuYworICoKKyAqICAgRnJlZVR5cGUgVHlwZSA0MiBkcml2ZXIgY29tcG9uZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAogI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KIAogI2luY2x1ZGUgInQ0MmRyaXZyLmMiCiAjaW5jbHVkZSAidDQyb2Jqcy5jIgpkaWZmIC0tZ2l0IGEvc3JjL3dpbmZvbnRzL0phbWZpbGUgYi9zcmMvd2luZm9udHMvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4NWUzYi4uMDAwMDAwMAotLS0gYS9zcmMvd2luZm9udHMvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvd2luZm9udHMgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE4IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHdpbmZvbnRzIDsKLQotTGlicmFyeSAgJChGVDJfTElCKSA6IHdpbmZudC5jIDsKLQotIyBlbmQgb2Ygc3JjL3dpbmZvbnRzIEphbWZpbGUKZGlmZiAtLWdpdCBhL3NyYy93aW5mb250cy9mbnRlcnJzLmggYi9zcmMvd2luZm9udHMvZm50ZXJycy5oCmluZGV4IDNhODZhZjUuLjU1MGRlMzggMTAwNjQ0Ci0tLSBhL3NyYy93aW5mb250cy9mbnRlcnJzLmgKKysrIGIvc3JjL3dpbmZvbnRzL2ZudGVycnMuaApAQCAtMSwzMiArMSwzMiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZm50ZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFdpbiBGTlQvRk9OIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZm50ZXJycy5oCisgKgorICogICBXaW4gRk5UL0ZPTiBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwKKyAqIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0CisgKiBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUKKyAqIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZAorICogdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgorICoKKyAqLwogCiAKLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFdpbmRvd3MgRk5UL0ZPTiBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAqCisgICAqIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgV2luZG93cyBGTlQvRk9OIGVycm9yIGVudW1lcmF0aW9uCisgICAqIGNvbnN0YW50cy4KKyAgICoKKyAgICovCiAKICNpZm5kZWYgRk5URVJSU19IXwogI2RlZmluZSBGTlRFUlJTX0hfCiAKLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0bW9kZXJyLmg+CiAKICN1bmRlZiBGVEVSUk9SU19IXwogCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIEZUX0VSUl9QUkVGSVggIEZOVF9FcnJfCiAjZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfV2luZm9udHMKIAotI2luY2x1ZGUgRlRfRVJST1JTX0gKKyNpbmNsdWRlIDxmcmVldHlwZS9mdGVycm9ycy5oPgogCiAjZW5kaWYgLyogRk5URVJSU19IXyAqLwogCmRpZmYgLS1naXQgYS9zcmMvd2luZm9udHMvbW9kdWxlLm1rIGIvc3JjL3dpbmZvbnRzL21vZHVsZS5tawppbmRleCAxM2Y5MDc3Li40NjE0YzU1IDEwMDY0NAotLS0gYS9zcmMvd2luZm9udHMvbW9kdWxlLm1rCisrKyBiL3NyYy93aW5mb250cy9tb2R1bGUubWsKQEAgLTMsNyArMyw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMTk5Ni0yMDE4IGJ5CisjIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKZGlmZiAtLWdpdCBhL3NyYy93aW5mb250cy9ydWxlcy5tayBiL3NyYy93aW5mb250cy9ydWxlcy5tawppbmRleCBkNjk0ZDFhLi5lNzNlZjVlIDEwMDY0NAotLS0gYS9zcmMvd2luZm9udHMvcnVsZXMubWsKKysrIGIvc3JjL3dpbmZvbnRzL3J1bGVzLm1rCkBAIC0zLDcgKzMsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDE5OTYtMjAxOCBieQorIyBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmRpZmYgLS1naXQgYS9zcmMvd2luZm9udHMvd2luZm50LmMgYi9zcmMvd2luZm9udHMvd2luZm50LmMKaW5kZXggMzZiZDMxNC4uZTgzMzEyZCAxMDA2NDQKLS0tIGEvc3JjL3dpbmZvbnRzL3dpbmZudC5jCisrKyBiL3NyYy93aW5mb250cy93aW5mbnQuYwpAQCAtMSw0MyArMSw0MiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgd2luZm50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGZvbnQgZHJpdmVyIGZvciBXaW5kb3dzIEZOVC9GT04gZmlsZXMgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTggYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMgSHV3IEQgTSBEYXZpZXMgZm9yIENvZGV3ZWF2ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3IERtaXRyeSBUaW1vc2hrb3YgZm9yIENvZGV3ZWF2ZXJzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB3aW5mbnQuYworICoKKyAqICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIFdpbmRvd3MgRk5UL0ZPTiBmaWxlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDIwIGJ5CisgKiBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisgKiBDb3B5cmlnaHQgMjAwMyBIdXcgRCBNIERhdmllcyBmb3IgQ29kZXdlYXZlcnMKKyAqIENvcHlyaWdodCAyMDA3IERtaXRyeSBUaW1vc2hrb3YgZm9yIENvZGV3ZWF2ZXJzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLAorICogbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QKKyAqIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQorICogdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kCisgKiB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuCisgKgorICovCiAKIAotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9XSU5GT05UU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2Z0d2luZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRkZWJ1Zy5oPgorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvdHRuYW1laWQuaD4KIAogI2luY2x1ZGUgIndpbmZudC5oIgogI2luY2x1ZGUgImZudGVycnMuaCIKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfV0lORk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSAorI2luY2x1ZGUgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50Lmg+CisjaW5jbHVkZSA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaD4KIAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICoKKyAgICogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdAorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZworICAgKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLgorICAgKi8KICN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfd2luZm50CisjZGVmaW5lIEZUX0NPTVBPTkVOVCAgd2luZm50CiAKIAogICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdpbm16X2hlYWRlcl9maWVsZHNbXSA9CkBAIC0zMzEsNyArMzMwLDcgQEAKICAgICAgICAgewogICAgICAgICAgIEZUX1RSQUNFMigoICJpbnZhbGlkIGFsaWdubWVudCBzaGlmdCBjb3VudCBmb3IgcmVzb3VyY2UgZGF0YVxuIiApKTsKICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OworICAgICAgICAgIGdvdG8gRXhpdDE7CiAgICAgICAgIH0KIAogCkBAIC01OTcsNiArNTk2LDEwIEBACiAKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CisKKyAgRXhpdDE6CisgICAgRlRfRlJBTUVfRVhJVCgpOworICAgIGdvdG8gRXhpdDsKICAgfQogCiAKQEAgLTExMzEsMTAgKzExMzQsMTAgQEAKICAgICB3aW5mbnRfZ2V0X2hlYWRlciAgICAgICAvKiBnZXRfaGVhZGVyICovCiAgIH07CiAKLSAvKgotICAqICBTRVJWSUNFIExJU1QKLSAgKgotICAqLworICAvKgorICAgKiBTRVJWSUNFIExJU1QKKyAgICoKKyAgICovCiAKICAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjICB3aW5mbnRfc2VydmljZXNbXSA9CiAgIHsKZGlmZiAtLWdpdCBhL3NyYy93aW5mb250cy93aW5mbnQuaCBiL3NyYy93aW5mb250cy93aW5mbnQuaAppbmRleCA0ODg1YzlkLi4zMzY3Yzc3IDEwMDY0NAotLS0gYS9zcmMvd2luZm9udHMvd2luZm50LmgKKysrIGIvc3JjL3dpbmZvbnRzL3dpbmZudC5oCkBAIC0xLDM2ICsxLDMyIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB3aW5mbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgZm9yIFdpbmRvd3MgRk5UL0ZPTiBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxOCBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNyBEbWl0cnkgVGltb3Noa292IGZvciBDb2Rld2VhdmVycyAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogd2luZm50LmgKKyAqCisgKiAgIEZyZWVUeXBlIGZvbnQgZHJpdmVyIGZvciBXaW5kb3dzIEZOVC9GT04gZmlsZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAyMCBieQorICogRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgorICogQ29weXJpZ2h0IDIwMDcgRG1pdHJ5IFRpbW9zaGtvdiBmb3IgQ29kZXdlYXZlcnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsCisgKiBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdAorICogbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlCisgKiB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKKyAqIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4KKyAqCisgKi8KIAogCiAjaWZuZGVmIFdJTkZOVF9IXwogI2RlZmluZSBXSU5GTlRfSF8KIAogCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICisjaW5jbHVkZSA8ZnJlZXR5cGUvZnR3aW5mbnQuaD4KKyNpbmNsdWRlIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRydi5oPgogCiAKIEZUX0JFR0lOX0hFQURFUgogCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCiAKICAgdHlwZWRlZiBzdHJ1Y3QgIFdpbk1aX0hlYWRlclJlY18KICAgewpAQCAtMTUzLDkgKzE0OSw2IEBACiAgICAgRlRfRmFjZVJlYyAgICAgcm9vdDsKICAgICBGTlRfRm9udCAgICAgICBmb250OwogCi0gICAgRlRfQ2hhck1hcCAgICAgY2hhcm1hcF9oYW5kbGU7Ci0gICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsgIC8qIGEgc2luZ2xlIGNoYXJtYXAgcGVyIGZhY2UgKi8KLQogICB9IEZOVF9GYWNlUmVjLCAqRk5UX0ZhY2U7CiAKIApkaWZmIC0tZ2l0IGEvdm1zX21ha2UuY29tIGIvdm1zX21ha2UuY29tCmluZGV4IDdiOGE0OWIuLmQwZjQ5MDkgMTAwNjQ0Ci0tLSBhL3Ztc19tYWtlLmNvbQorKysgYi92bXNfbWFrZS5jb20KQEAgLTEsNiArMSw2IEBACiAkISBtYWtlIEZyZWVUeXBlIDIgdW5kZXIgT3BlblZNUwogJCEKLSQhIENvcHlyaWdodCAyMDAzLTIwMTggYnkKKyQhIENvcHlyaWdodCAoQykgMjAwMy0yMDIwIGJ5CiAkISBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAkIQogJCEgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTQ3LDEzICs0NywxMyBAQAogJCEgU2V0dXAgdmFyaWFibGVzIGhvbGRpbmcgImNvbmZpZyIgaW5mb3JtYXRpb24KICQhCiAkIE1ha2UgICAgPSAiIgotJCBjY29wdCAgID0gIi9uYW1lPWFzX2lzL2Zsb2F0PWllZWUiCiskIGNjb3B0ICAgPSAiL25hbWU9KGFzX2lzLHNob3J0KS9mbG9hdD1pZWVlIgogJCBsb3B0cyAgID0gIiIKICQgZG5zcmwgICA9ICIiCiAkIGFjb25mX2luX2ZpbGUgPSAiY29uZmlnLmhpbiIKICQgbmFtZSAgICA9ICJGcmVldHlwZTIiCi0kIG1hcGZpbGUgPSAgbmFtZSArICIubWFwIgotJCBvcHRmaWxlID0gIG5hbWUgKyAiLm9wdCIKKyQgbWFwZmlsZSA9IG5hbWUgKyAiLm1hcCIKKyQgb3B0ZmlsZSA9IG5hbWUgKyAiLm9wdCIKICQgc19jYXNlICA9IGZhbHNlCiAkIGxpYmxpc3QgPSAiIgogJCEKQEAgLTExMyw3ICsxMTMsMTQgQEAKICQgSWYgZiRnZXRzeWkoIkhXX01PREVMIikgLmd0LiAxMDI0CiAkIFRoZW4KICQgICB3cml0ZSBzeXMkb3V0cHV0ICJDcmVhdGluZyBmcmVldHlwZTJzaHIuZXhlIgotJCAgIGNhbGwgYW5hbF9vYmpfYXhwICdvcHRmaWxlJyBfbGluay5vcHQKKyQgICBJZiBmJGdldHN5aSgiSFdfTU9ERUwiKSAubGUuIDIwNDgKKyQgICBUaGVuCiskICAgICBjYWxsIGFuYWxfb2JqX2F4cCAnb3B0ZmlsZScgX2xpbmsub3B0CiskICAgRWxzZQorJCAgICAgY29weSBfbGluay5vcHRfaWE2NCBfbGluay5vcHQKKyQgICAgIGNsb3NlIGxpYnNmCiskICAgICBjb3B5IGxpYnMub3B0X2lhNjQgbGlicy5vcHQKKyQgICBlbmRpZgogJCAgIG9wZW4vYXBwZW5kICBvcHRmICdvcHRmaWxlJwogJCAgIGlmIHNfY2FzZSB0aGVuIFdSSVRFIG9wdGYgImNhc2Vfc2Vuc2l0aXZlPVlFUyIKICQgICBjbG9zZSBvcHRmCkBAIC0xNTcsNyArMTY0LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAxIGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTkgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtMTcyLDE1ICsxNzksMTYgQEAKIAogCiBhbGwgOgotICAgICAgICBkZWZpbmUgZnJlZXR5cGUgWy0tLmluY2x1ZGVdCi0gICAgICAgIGRlZmluZSBwc2F1eCBbLS5wc2F1eF0KKyAgICAgICAgZGVmaW5lIGNvbmZpZyBbLS0uaW5jbHVkZS5mcmVldHlwZS5jb25maWddCisgICAgICAgIGRlZmluZSBpbnRlcm5hbCBbLS0uaW5jbHVkZS5mcmVldHlwZS5pbnRlcm5hbF0KICAgICAgICAgZGVmaW5lIGF1dG9maXQgWy0uYXV0b2ZpdF0KLSAgICAgICAgZGVmaW5lIGF1dG9oaW50IFstLmF1dG9oaW50XQogICAgICAgICBkZWZpbmUgYmFzZSBbLS5iYXNlXQogICAgICAgICBkZWZpbmUgY2FjaGUgWy0uY2FjaGVdCiAgICAgICAgIGRlZmluZSBjZmYgWy0uY2ZmXQogICAgICAgICBkZWZpbmUgY2lkIFstLmNpZF0KKyAgICAgICAgZGVmaW5lIGZyZWV0eXBlIFstLS5pbmNsdWRlLmZyZWV0eXBlXQogICAgICAgICBkZWZpbmUgcGNmIFstLnBjZl0KKyAgICAgICAgZGVmaW5lIHBzYXV4IFstLnBzYXV4XQogICAgICAgICBkZWZpbmUgcHNuYW1lcyBbLS5wc25hbWVzXQogICAgICAgICBkZWZpbmUgcmFzdGVyIFstLnJhc3Rlcl0KICAgICAgICAgZGVmaW5lIHNmbnQgWy0uc2ZudF0KQEAgLTE5MSw5ICsxOTksNyBAQAogICAgICAgICBpZiBmJHNlYXJjaCgibGliLmRpciIpIC5lcXMuICIiIHRoZW4gY3JlYXRlL2RpcmVjdG9yeSBbLmxpYl0KICAgICAgICAgc2V0IGRlZmF1bHQgWy5idWlsZHMudm1zXQogICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0jICAgICAgICBzZXQgZGVmYXVsdCBbLS0uc3JjLmF1dG9maXRdCi0jICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCi0gICAgICAgIHNldCBkZWZhdWx0IFstLS5zcmMuYXV0b2hpbnRdCisgICAgICAgIHNldCBkZWZhdWx0IFstLS5zcmMuYXV0b2ZpdF0KICAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQogICAgICAgICBzZXQgZGVmYXVsdCBbLS5iYXNlXQogICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCkBAIC0yMDUsOCArMjExLDEyIEBACiAgICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKICAgICAgICAgc2V0IGRlZmF1bHQgWy0uY2lkXQogICAgICAgICAkKE1NUykkKE1NU1FVQUxJRklFUlMpCisgICAgICAgIHNldCBkZWZhdWx0IFstLmd4dmFsaWRdCisgICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKICAgICAgICAgc2V0IGRlZmF1bHQgWy0uZ3ppcF0KICAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQorICAgICAgICBzZXQgZGVmYXVsdCBbLS5iemlwMl0KKyAgICAgICAgJChNTVMpJChNTVNRVUFMSUZJRVJTKQogICAgICAgICBzZXQgZGVmYXVsdCBbLS5senddCiAgICAgICAgICQoTU1TKSQoTU1TUVVBTElGSUVSUykKICAgICAgICAgc2V0IGRlZmF1bHQgWy0ub3R2YWxpZF0KQEAgLTI1MCw3ICsyNjAsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0yNjAsNyArMjcwLDcgQEAKICMgZnVsbHkuCiAKIAotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbXSxbLS0uaW5jbHVkZV0sWy0tLnNyYy5iYXNlXSkKK0NGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvbGlzdC9zaG93PWFsbC9pbmNsdWRlPShbXSxbLS0uaW5jbHVkZV0sWy0tLnNyYy5iYXNlXSkKIAogT0JKUz1mdHN5c3RlbS5vYmoKIApAQCAtMjgyLDcgKzI5Miw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMi0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTI5MywzOSArMzAzLDcgQEAKIAogQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5hdXRvZml0XSkKIAotT0JKUz1hZmFuZ2xlcy5vYmosYWZoaW50cy5vYmosYWZsYXRpbi5vYmoKLQotYWxsIDogJChPQkpTKQotICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAotJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMuYXV0b2hpbnRdIGRpcmVjdG9yeSIKLSQgY3JlYXRlIFsuc3JjLmF1dG9oaW50XWRlc2NyaXAubW1zCi0kIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5hdXRvaGludF1kZXNjcmlwLm1tcwotJCBjb3B5IHN5cyRpbnB1dDogb3V0Ci0kIGRlY2sKLSMKLSMgRnJlZVR5cGUgMiBhdXRvLWhpbnRlciBtb2R1bGUgY29tcGlsYXRpb24gcnVsZXMgZm9yIFZNUwotIwotCi0KLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgQ2F0aGFyb24gUHJvZHVjdGlvbnMgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2F0aGFyb24gVHlwb2dyYXBoeSBQcm9qZWN0IGFuZCBzaGFsbCBvbmx5Ci0jIGJlIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDYXRoYXJvbgotIyBPcGVuIFNvdXJjZSBMaWNlbnNlIHRoYXQgc2hvdWxkIGNvbWUgd2l0aCB0aGlzIGZpbGUgdW5kZXIgdGhlIG5hbWUKLSMgYENhdGhhcm9uTGljZW5zZS50eHQnLiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZQotIyB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQKLSMgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LgotIwotIyBOb3RlIHRoYXQgdGhpcyBsaWNlbnNlIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgRnJlZVR5cGUgbGljZW5zZS4KLQotCi1DRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2w9KFstLS5pbmNsdWRlXSxbLS0uc3JjLmF1dG9oaW50XSkKLQotT0JKUz1hdXRvaGludC5vYmoKK09CSlM9YXV0b2ZpdC5vYmoKIAogYWxsIDogJChPQkpTKQogICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKQEAgLTM0Myw3ICszMjEsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDMgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0zNTUsOSArMzMzLDIyIEBACiAKIENGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmJ1aWxkcy52bXNdLFstLS5pbmNsdWRlXSxbLS0uc3JjLmJhc2VdKQogCi1PQkpTPWZ0YmFzZS5vYmosZnRpbml0Lm9iaixmdGdseXBoLm9iaixmdGRlYnVnLm9iaixmdGJkZi5vYmosZnRtbS5vYmosXAotICAgICBmdHR5cGUxLm9iaixmdHBmci5vYmosZnRzdHJva2Uub2JqLGZ0d2luZm50Lm9iaixmdGJib3gub2JqLFwKLSAgICAgZnRiaXRtYXAub2JqLGZ0Z2FzcC5vYmoKK09CSlM9ZnRiYXNlLm9iaixcCisgICAgIGZ0YmJveC5vYmosXAorICAgICBmdGJkZi5vYmosXAorICAgICBmdGJpdG1hcC5vYmosXAorICAgICBmdGNpZC5vYmosXAorICAgICBmdGRlYnVnLm9iaixcCisgICAgIGZ0ZnN0eXBlLm9iaixcCisgICAgIGZ0Z2FzcC5vYmosXAorICAgICBmdGdseXBoLm9iaixcCisgICAgIGZ0aW5pdC5vYmosXAorICAgICBmdG1tLm9iaixcCisgICAgIGZ0cGZyLm9iaixcCisgICAgIGZ0c3Ryb2tlLm9iaixcCisgICAgIGZ0c3ludGgub2JqLFwKKyAgICAgZnR0eXBlMS5vYmosXAorICAgICBmdHdpbmZudC5vYmoKIAogYWxsIDogJChPQkpTKQogICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKQEAgLTM3NSw3ICszNjYsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDIgYnkKKyMgQ29weXJpZ2h0IDIwMDItMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC00MDUsNyArMzk2LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0IGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTkgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtNDE1LDE2ICs0MDYsMTMgQEAKICMgZnVsbHkuCiAKIAotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5jYWNoZV0pCitDRkxBR1M9JChDT01QX0ZMQUdTKSQoREVCVUcpL2luY2x1ZGU9KFstLS5pbmNsdWRlXSxbLS0uc3JjLmNhY2hlXSkvbm93YXJuCiAKIE9CSlM9ZnRjYWNoZS5vYmoKIAogYWxsIDogJChPQkpTKQogICAgICAgICBsaWJyYXJ5IFstLS5saWJdZnJlZXR5cGUub2xiICQoT0JKUykKIAotZnRjYWNoZS5vYmogOiBmdGNhY2hlLmMgZnRjYmFzaWMuYyBmdGNjYWNoZS5jIGZ0Y2NtYXAuYyBmdGNnbHlwaC5jIGZ0Y2ltYWdlLmMgXAotICAgICAgICAgICAgICBmdGNtYW5hZy5jIGZ0Y21ydS5jIGZ0Y3NiaXRzLmMKLQogIyBFT0YKICQgZW9kCiAkIGNsb3NlIG91dApAQCAtNDM4LDcgKzQyNiw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTQ2OCw3ICs0NTYsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC00ODgsNiArNDc2LDM2IEBACiAjIEVPRgogJCBlb2QKICQgY2xvc2Ugb3V0CiskIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5neHZhbGlkXSBkaXJlY3RvcnkiCiskIGNyZWF0ZSBbLnNyYy5neHZhbGlkXWRlc2NyaXAubW1zCiskIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5neHZhbGlkXWRlc2NyaXAubW1zCiskIGNvcHkgc3lzJGlucHV0OiBvdXQKKyQgZGVjaworIworIyBGcmVlVHlwZSAyIFRydWVUeXBlR1gvQUFUIHZhbGlkYXRpb24gZHJpdmVyIGNvbmZpZ3VyYXRpb24gcnVsZXMgZm9yIFZNUworIworCisKKyMgQ29weXJpZ2h0IDIwMDQtMjAxOSBieQorIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCisjIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKKyMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKKyMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKKyMgZnVsbHkuCisKKworQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5neHZhbGlkXSkKKworT0JKUz1neHZhbGlkLm9iagorCithbGwgOiAkKE9CSlMpCisgICAgICAgIGxpYnJhcnkgWy0tLmxpYl1mcmVldHlwZS5vbGIgJChPQkpTKQorCisjIEVPRgorJCBlb2QKKyQgY2xvc2Ugb3V0CiAkIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5nemlwXSBkaXJlY3RvcnkiCiAkIGNyZWF0ZSBbLnNyYy5nemlwXWRlc2NyaXAubW1zCiAkIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5nemlwXWRlc2NyaXAubW1zCkBAIC00OTgsNyArNTE2LDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAyIGJ5CisjIENvcHlyaWdodCAyMDAyLTIwMTkgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtNTIyLDYgKzU0MCw0MiBAQAogIyBFT0YKICQgZW9kCiAkIGNsb3NlIG91dAorJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMuYnppcDJdIGRpcmVjdG9yeSIKKyQgY3JlYXRlIFsuc3JjLmJ6aXAyXWRlc2NyaXAubW1zCiskIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5iemlwMl1kZXNjcmlwLm1tcworJCBjb3B5IHN5cyRpbnB1dDogb3V0CiskIGRlY2sKKyMKKyMgRnJlZVR5cGUgMiBCWklQMiBzdXBwb3J0IGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKKyMKKworCisjIENvcHlyaWdodCAyMDEwLTIwMTkgYnkKKyMgSm9lbCBLbGluZ2hlZC4KKyMKKyMgYmFzZWQgb24gYHNyYy9sencvcnVsZXMubWsnCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCisjIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKKyMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKKyMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKKyMgZnVsbHkuCiskRU9ECiskIGlmIGxpYmluY3MgLm5lcy4gIiIgdGhlbiB3cml0ZSBvdXQgIkxJQklOQ1MgPSAiLCBsaWJpbmNzIC0gIiwiLCAiLCIKKyQgd3JpdGUgb3V0ICJDT01QX0ZMQUdTID0gIiwgY2NvcHQKKyQgY29weSBzeXMkaW5wdXQ6IG91dAorJCBkZWNrCisKK0NGTEFHUz0kKENPTVBfRkxBR1MpJChERUJVRykvaW5jbHVkZT0oWy0tLmluY2x1ZGVdLFstLS5zcmMuYnppcDJdKQorCitPQkpTPWZ0YnppcDIub2JqCisKK2FsbCA6ICQoT0JKUykKKyAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCisKKyMgRU9GCiskIGVvZAorJCBjbG9zZSBvdXQKICQgd3JpdGUgc3lzJG91dHB1dCAiLi4uIFsuc3JjLmx6d10gZGlyZWN0b3J5IgogJCBjcmVhdGUgWy5zcmMubHp3XWRlc2NyaXAubW1zCiAkIG9wZW4vYXBwZW5kIG91dCBbLnNyYy5senddZGVzY3JpcC5tbXMKQEAgLTUzMiw3ICs1ODYsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDQgYnkKKyMgQ29weXJpZ2h0IDIwMDQtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC01NTYsMzggKzYxMCw2IEBACiAjIEVPRgogJCBlb2QKICQgY2xvc2Ugb3V0Ci0kIHdyaXRlIHN5cyRvdXRwdXQgIi4uLiBbLnNyYy5vdGxheW91dF0gZGlyZWN0b3J5IgotJCBjcmVhdGUgWy5zcmMub3RsYXlvdXRdZGVzY3JpcC5tbXMKLSQgb3Blbi9hcHBlbmQgb3V0IFsuc3JjLm90bGF5b3V0XWRlc2NyaXAubW1zCi0kIGNvcHkgc3lzJGlucHV0OiBvdXQKLSQgZGVjawotIwotIyBGcmVlVHlwZSAyIE9UIGxheW91dCBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCi0jCi0KLQotIyBDb3B5cmlnaHQgMjAwNCBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLQotQ0ZMQUdTPSQoQ09NUF9GTEFHUykkKERFQlVHKS9pbmNsdWRlPShbLS0uaW5jbHVkZV0sWy0tLnNyYy5vdGxheW91dF0pCi0KLU9CSlM9b3RsYmFzZS5vYmosb3RsY29tbW4ub2JqLG90bGdkZWYub2JqLG90bGdwb3Mub2JqLG90bGdzdWIub2JqLFwKLSAgICAgb3RsanN0Zi5vYmosb3RscGFyc2Uub2JqCi0KLWFsbCA6ICQoT0JKUykKLSAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCi0KLQotIyBFT0YKLSQgZW9kCi0kIGNsb3NlIG91dAogJCB3cml0ZSBzeXMkb3V0cHV0ICIuLi4gWy5zcmMub3R2YWxpZF0gZGlyZWN0b3J5IgogJCBjcmVhdGUgWy5zcmMub3R2YWxpZF1kZXNjcmlwLm1tcwogJCBvcGVuL2FwcGVuZCBvdXQgWy5zcmMub3R2YWxpZF1kZXNjcmlwLm1tcwpAQCAtNTk4LDcgKzYyMCw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwNCBieQorIyBDb3B5cmlnaHQgMjAwNC0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTY3MCw3ICs2OTIsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDIgYnkKKyMgQ29weXJpZ2h0IDIwMDItMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC03MDAsNyArNzIyLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTkgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtNzMwLDcgKzc1Miw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTc1NiwxMSArNzc4LDExIEBACiAkIGNvcHkgc3lzJGlucHV0OiBvdXQKICQgZGVjawogIwotIyBGcmVlVHlwZSAyIFBTTmFtZXMgZHJpdmVyIGNvbXBpbGF0aW9uIHJ1bGVzIGZvciBWTVMKKyMgRnJlZVR5cGUgMiBwc25hbWVzIGRyaXZlciBjb21waWxhdGlvbiBydWxlcyBmb3IgVk1TCiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMSwgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTc5MCw3ICs4MTIsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC04MjAsNyArODQyLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAyMDAxLCAyMDAyIGJ5CisjIENvcHlyaWdodCAyMDAxLTIwMTkgYnkKICMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgogIwogIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLApAQCAtODUwLDcgKzg3Miw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMSBieQorIyBDb3B5cmlnaHQgMjAwMS0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTg4MCw3ICs5MDIsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC05MTAsNyArOTMyLDcgQEAKICMKIAogCi0jIENvcHlyaWdodCAxOTk2LTIwMDAsIDIwMDIgYnkKKyMgQ29weXJpZ2h0IDE5OTYtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC05MjcsOCArOTQ5LDYgQEAKIGFsbCA6ICQoT0JKUykKICAgICAgICAgbGlicmFyeSBbLS0ubGliXWZyZWV0eXBlLm9sYiAkKE9CSlMpCiAKLXR5cGUxLm9iaiA6IHR5cGUxLmMgdDFwYXJzZS5jIHQxbG9hZC5jIHQxb2Jqcy5jIHQxZHJpdmVyLmMgdDFnbG9hZC5jIHQxYWZtLmMKLQogIyBFT0YKICQgZW9kCiAkIGNsb3NlIG91dApAQCAtOTQyLDcgKzk2Miw3IEBACiAjCiAKIAotIyBDb3B5cmlnaHQgMjAwMiBieQorIyBDb3B5cmlnaHQgMjAwMi0yMDE5IGJ5CiAjIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KICMKICMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKQEAgLTk3Miw3ICs5OTIsNyBAQAogIwogCiAKLSMgQ29weXJpZ2h0IDIwMDEsIDIwMDIgYnkKKyMgQ29weXJpZ2h0IDIwMDEtMjAxOSBieQogIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCiAjCiAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCkBAIC0xMTAzLDcgKzExMjMsNyBAQAogJCEKICQhIEluaXQgc3ltYm9scyB1c2VkIHRvIGhvbGQgQ1BQIGRlZmluaXRpb25zIGFuZCBpbmNsdWRlIHBhdGgKICQhCi0kIGxpYmRlZnMgPSAiIgorJCBsaWJkZWZzID0gIkZUMl9CVUlMRF9MSUJSQVJZLEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUywiCiAkIGxpYmluY3MgPSAiIgogJCEKICQhIE9wZW4gZGF0YSBmaWxlIHdpdGggbG9jYXRpb24gb2YgbGlicmFyaWVzCg==